summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp')
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp71
1 files changed, 38 insertions, 33 deletions
diff --git a/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp b/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp
index 019c3ba3f9..63011c7d48 100644
--- a/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp
@@ -17,6 +17,7 @@
#include <boost/geometry/geometries/segment.hpp>
+#include <boost/geometry/policies/robustness/robust_point_type.hpp>
namespace boost { namespace geometry
{
@@ -35,32 +36,45 @@ template
>
struct get_turn_without_info
{
- typedef strategy_intersection
- <
- typename cs_tag<typename TurnInfo::point_type>::type,
- Point1,
- Point2,
- typename TurnInfo::point_type
- > si;
-
- typedef typename si::segment_intersection_strategy_type strategy;
-
-
-
- template <typename OutputIterator>
+ template <typename RobustPolicy, typename OutputIterator>
static inline OutputIterator apply(
- Point1 const& pi, Point1 const& pj, Point1 const& pk,
- Point2 const& qi, Point2 const& qj, Point2 const& qk,
+ Point1 const& pi, Point1 const& pj, Point1 const& /*pk*/,
+ Point2 const& qi, Point2 const& qj, Point2 const& /*qk*/,
+ bool /*is_p_first*/, bool /*is_p_last*/,
+ bool /*is_q_first*/, bool /*is_q_last*/,
TurnInfo const& ,
+ RobustPolicy const& robust_policy,
OutputIterator out)
{
+ typedef strategy_intersection
+ <
+ typename cs_tag<typename TurnInfo::point_type>::type,
+ Point1,
+ Point2,
+ typename TurnInfo::point_type,
+ RobustPolicy
+ > si;
+
+ typedef typename si::segment_intersection_strategy_type strategy;
+
typedef model::referring_segment<Point1 const> segment_type1;
typedef model::referring_segment<Point1 const> segment_type2;
- segment_type1 p1(pi, pj), p2(pj, pk);
- segment_type2 q1(qi, qj), q2(qj, qk);
+ segment_type1 p1(pi, pj);
+ segment_type2 q1(qi, qj);
- //
- typename strategy::return_type result = strategy::apply(p1, q1);
+ typedef typename geometry::robust_point_type
+ <
+ Point1, RobustPolicy
+ >::type robust_point_type;
+
+ robust_point_type pi_rob, pj_rob, qi_rob, qj_rob;
+ geometry::recalculate(pi_rob, pi, robust_policy);
+ geometry::recalculate(pj_rob, pj, robust_policy);
+ geometry::recalculate(qi_rob, qi, robust_policy);
+ geometry::recalculate(qj_rob, qj, robust_policy);
+ typename strategy::return_type result
+ = strategy::apply(p1, q1, robust_policy,
+ pi_rob, pj_rob, qi_rob, qj_rob);
for (std::size_t i = 0; i < result.template get<0>().count; i++)
{
@@ -84,10 +98,12 @@ template
<
typename Geometry1,
typename Geometry2,
+ typename RobustPolicy,
typename Turns
>
inline void get_intersection_points(Geometry1 const& geometry1,
Geometry2 const& geometry2,
+ RobustPolicy const& robust_policy,
Turns& turns)
{
concept::check_concepts_and_equal_dimensions<Geometry1 const, Geometry2 const>();
@@ -99,14 +115,6 @@ inline void get_intersection_points(Geometry1 const& geometry1,
typename boost::range_value<Turns>::type
> TurnPolicy;
- typedef typename strategy_intersection
- <
- typename cs_tag<Geometry1>::type,
- Geometry1,
- Geometry2,
- typename boost::range_value<Turns>::type
- >::segment_intersection_strategy_type segment_intersection_strategy_type;
-
detail::get_turns::no_interrupt_policy interrupt_policy;
boost::mpl::if_c
@@ -118,9 +126,7 @@ inline void get_intersection_points(Geometry1 const& geometry1,
typename tag<Geometry2>::type,
Geometry1, Geometry2,
false, false,
- Turns, TurnPolicy,
- //segment_intersection_strategy_type,
- detail::get_turns::no_interrupt_policy
+ TurnPolicy
>,
dispatch::get_turns
<
@@ -128,13 +134,12 @@ inline void get_intersection_points(Geometry1 const& geometry1,
typename tag<Geometry2>::type,
Geometry1, Geometry2,
false, false,
- Turns, TurnPolicy,
- //segment_intersection_strategy_type,
- detail::get_turns::no_interrupt_policy
+ TurnPolicy
>
>::type::apply(
0, geometry1,
1, geometry2,
+ robust_policy,
turns, interrupt_policy);
}