diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp b/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp index b8ea5e30e6..ccd3af92d5 100644 --- a/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp +++ b/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp @@ -37,8 +37,8 @@ namespace detail template <typename Point1, typename Point2, typename Point3> inline bool collinear_point_is_spike_or_equal(Point1 const& last_point, - Point2 const& segment_a, - Point3 const& segment_b) + Point2 const& segment_a, + Point3 const& segment_b) { // Check if segment is equal int const sgn_x1 = sign_of_difference<0>(last_point, segment_b); @@ -70,10 +70,10 @@ template typename Point1, typename Point2, typename Point3, typename SideStrategy > -static inline bool point_is_spike_or_equal(Point1 const& last_point, // prev | back - Point2 const& segment_a, // next | back - 2 - Point3 const& segment_b, // curr | back - 1 | spike's vertex - SideStrategy const& strategy) +inline bool point_is_spike_or_equal(Point1 const& last_point, // prev | back + Point2 const& segment_a, // next | back - 2 + Point3 const& segment_b, // curr | back - 1 | spike's vertex + SideStrategy const& strategy) { int const side = strategy.apply(segment_a, segment_b, last_point); if (side == 0) @@ -100,7 +100,7 @@ template typename SideStrategy, typename RobustPolicy > -static inline bool point_is_spike_or_equal(Point1 const& last_point, +inline bool point_is_spike_or_equal(Point1 const& last_point, Point2 const& segment_a, Point3 const& segment_b, SideStrategy const& strategy, @@ -137,6 +137,48 @@ static inline bool point_is_spike_or_equal(Point1 const& last_point, ); } +template +< + typename Point1, + typename Point2, + typename Point3, + typename SideStrategy, + typename RobustPolicy +> +inline bool point_is_collinear(Point1 const& last_point, + Point2 const& segment_a, + Point3 const& segment_b, + SideStrategy const& strategy, + RobustPolicy const& robust_policy) +{ + int const side = strategy.apply(segment_a, segment_b, last_point); + if (side == 0) + { + return true; + } + + // This part (or whole method, because it is then trivial) + // will be removed after rescaling + if (BOOST_GEOMETRY_CONDITION(! RobustPolicy::enabled)) + { + return false; + } + + // Redo, using specified robust policy + typedef typename geometry::robust_point_type + < + Point1, + RobustPolicy + >::type robust_point_type; + + robust_point_type last_point_rob, segment_a_rob, segment_b_rob; + geometry::recalculate(last_point_rob, last_point, robust_policy); + geometry::recalculate(segment_a_rob, segment_a, robust_policy); + geometry::recalculate(segment_b_rob, segment_b, robust_policy); + + int const side_rob = strategy.apply(segment_a_rob, segment_b_rob, last_point_rob); + return side_rob == 0; +} } // namespace detail #endif |