summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/overlay/get_turn_info.hpp')
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_turn_info.hpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
index 717f0b47a9..ac36c530bf 100644
--- a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
@@ -585,8 +585,8 @@ struct collinear : public base_turn_handler
typename SidePolicy
>
static inline void apply(
- Point1 const& , Point1 const& , Point1 const& ,
- Point2 const& , Point2 const& , Point2 const& ,
+ Point1 const& , Point1 const& pj, Point1 const& pk,
+ Point2 const& , Point2 const& qj, Point2 const& qk,
TurnInfo& ti,
IntersectionInfo const& info,
DirInfo const& dir_info,
@@ -623,8 +623,30 @@ struct collinear : public base_turn_handler
{
ui_else_iu(product == 1, ti);
}
+
+ // Calculate remaining distance. If it continues collinearly it is
+ // measured until the end of the next segment
+ ti.operations[0].remaining_distance
+ = side_p == 0
+ ? distance_measure(ti.point, pk)
+ : distance_measure(ti.point, pj);
+ ti.operations[1].remaining_distance
+ = side_q == 0
+ ? distance_measure(ti.point, qk)
+ : distance_measure(ti.point, qj);
}
+ template <typename Point1, typename Point2>
+ static inline typename geometry::coordinate_type<Point1>::type
+ distance_measure(Point1 const& a, Point2 const& b)
+ {
+ // TODO: use comparable distance for point-point instead - but that
+ // causes currently cycling include problems
+ typedef typename geometry::coordinate_type<Point1>::type ctype;
+ ctype const dx = get<0>(a) - get<0>(b);
+ ctype const dy = get<1>(b) - get<1>(b);
+ return dx * dx + dy * dy;
+ }
};
template