From fb7da1041a2d04abd0bafeeddb7de1cf1a5ab6de Mon Sep 17 00:00:00 2001 From: Vissarion Fysikopoulos Date: Fri, 11 May 2018 12:27:34 +0300 Subject: [PATCH] [algorithms] [strategies] Change azimuth strategy interface --- .../detail/distance/segment_to_box.hpp | 6 +-- .../algorithms/detail/envelope/segment.hpp | 4 +- .../strategies/geographic/azimuth.hpp | 50 +++++++++++++------ .../geometry/strategies/spherical/azimuth.hpp | 46 ++++++++++++----- 4 files changed, 70 insertions(+), 36 deletions(-) diff --git a/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp b/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp index bba0dc189..1600d147c 100644 --- a/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp +++ b/include/boost/geometry/algorithms/detail/distance/segment_to_box.hpp @@ -541,11 +541,7 @@ private: ReturnType diff1 = cast::apply(geometry::get<1>(p1)) - cast::apply(geometry::get<1>(p0)); - int sign = 1; - if (diff1 < 0) - { - sign = -1; - } + int sign = diff1 < 0 ? -1 : 1; if (side::apply(p0, p1, corner1) * sign < 0) { result = cast::apply(ps_strategy.apply(corner1, p0, p1)); diff --git a/include/boost/geometry/algorithms/detail/envelope/segment.hpp b/include/boost/geometry/algorithms/detail/envelope/segment.hpp index e2f21bbd7..751313155 100644 --- a/include/boost/geometry/algorithms/detail/envelope/segment.hpp +++ b/include/boost/geometry/algorithms/detail/envelope/segment.hpp @@ -333,7 +333,7 @@ private: CalculationType lon2_rad = math::as_radian(lon2); CalculationType lat2_rad = math::as_radian(lat2); CalculationType alp1, alp2; - strategy.apply(lon1_rad, lat1_rad, lon2_rad, lat2_rad, alp1, alp2); + strategy.apply(lon1_rad, lat1_rad, lon2_rad, lat2_rad, alp1, alp2); compute_box_corners(lon1, lat1, lon2, lat2, alp1, alp2, strategy); } @@ -353,7 +353,7 @@ private: CalculationType lon2_rad = math::as_radian(lon2); CalculationType lat2_rad = math::as_radian(lat2); CalculationType alp2; - strategy.apply(lon1_rad, lat1_rad, lon2_rad, lat2_rad, alp1, alp2); + strategy.apply_reverse(lon1_rad, lat1_rad, lon2_rad, lat2_rad, alp2); compute_box_corners(lon1, lat1, lon2, lat2, alp1, alp2, strategy); } diff --git a/include/boost/geometry/strategies/geographic/azimuth.hpp b/include/boost/geometry/strategies/geographic/azimuth.hpp index 8a34ea08d..117905020 100644 --- a/include/boost/geometry/strategies/geographic/azimuth.hpp +++ b/include/boost/geometry/strategies/geographic/azimuth.hpp @@ -52,15 +52,44 @@ public : return m_spheroid; } - template - < + template + inline void apply(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1, T& a2) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a1, a2); + } + template + inline void apply(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a1, a1); + } + template + inline void apply_reverse(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a2) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a2, a2); + } + +private : + + template < bool EnableAzimuth, bool EnableReverseAzimuth, typename T > - inline void apply(T const& lon1_rad, T const& lat1_rad, - T const& lon2_rad, T const& lat2_rad, - T& a1, T& a2) const + inline void compute(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1, T& a2) const { typedef typename boost::mpl::if_ < @@ -90,17 +119,6 @@ public : } } - template - inline void apply(T const& lon1_rad, T const& lat1_rad, - T const& lon2_rad, T const& lat2_rad, - T& a1) const - { - apply(lon1_rad, lat1_rad, - lon2_rad, lat2_rad, - a1, a1); - } - -private : Spheroid m_spheroid; }; diff --git a/include/boost/geometry/strategies/spherical/azimuth.hpp b/include/boost/geometry/strategies/spherical/azimuth.hpp index 395927831..bdfc40157 100644 --- a/include/boost/geometry/strategies/spherical/azimuth.hpp +++ b/include/boost/geometry/strategies/spherical/azimuth.hpp @@ -36,15 +36,45 @@ public : inline spherical() {} + template + inline void apply(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1, T& a2) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a1, a2); + } + template + inline void apply(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a1, a1); + } + template + inline void apply_reverse(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a2) const + { + compute(lon1_rad, lat1_rad, + lon2_rad, lat2_rad, + a2, a2); + } + +private : + template < bool EnableAzimuth, bool EnableReverseAzimuth, typename T > - inline void apply(T const& lon1_rad, T const& lat1_rad, - T const& lon2_rad, T const& lat2_rad, - T& a1, T& a2) const + inline void compute(T const& lon1_rad, T const& lat1_rad, + T const& lon2_rad, T const& lat2_rad, + T& a1, T& a2) const { typedef typename boost::mpl::if_ < @@ -68,16 +98,6 @@ public : a2 = result.reverse_azimuth; } } - - template - inline void apply(T const& lon1_rad, T const& lat1_rad, - T const& lon2_rad, T const& lat2_rad, - T& a1) const - { - apply(lon1_rad, lat1_rad, - lon2_rad, lat2_rad, - a1, a1); - } }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS