summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/overlay/self_turn_points.hpp')
-rw-r--r--boost/geometry/algorithms/detail/overlay/self_turn_points.hpp117
1 files changed, 48 insertions, 69 deletions
diff --git a/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp b/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
index 9c4c99394e..8dffeae283 100644
--- a/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
+++ b/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
@@ -9,16 +9,18 @@
#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_SELF_TURN_POINTS_HPP
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_SELF_TURN_POINTS_HPP
+
#include <cstddef>
#include <boost/range.hpp>
#include <boost/geometry/core/access.hpp>
#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/geometries/concepts/check.hpp>
-#include <boost/geometry/algorithms/detail/disjoint.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
#include <boost/geometry/algorithms/detail/partition.hpp>
#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
@@ -55,17 +57,21 @@ template
typename Geometry,
typename Turns,
typename TurnPolicy,
+ typename RobustPolicy,
typename InterruptPolicy
>
struct self_section_visitor
{
Geometry const& m_geometry;
+ RobustPolicy const& m_rescale_policy;
Turns& m_turns;
InterruptPolicy& m_interrupt_policy;
inline self_section_visitor(Geometry const& g,
+ RobustPolicy const& rp,
Turns& turns, InterruptPolicy& ip)
: m_geometry(g)
+ , m_rescale_policy(rp)
, m_turns(turns)
, m_interrupt_policy(ip)
{}
@@ -82,12 +88,12 @@ struct self_section_visitor
Geometry, Geometry,
false, false,
Section, Section,
- Turns, TurnPolicy,
- InterruptPolicy
+ TurnPolicy
>::apply(
0, m_geometry, sec1,
0, m_geometry, sec2,
false,
+ m_rescale_policy,
m_turns, m_interrupt_policy);
}
if (m_interrupt_policy.has_intersections)
@@ -103,17 +109,13 @@ struct self_section_visitor
-template
-<
- typename Geometry,
- typename Turns,
- typename TurnPolicy,
- typename InterruptPolicy
->
+template<typename TurnPolicy>
struct get_turns
{
+ template <typename Geometry, typename RobustPolicy, typename Turns, typename InterruptPolicy>
static inline bool apply(
Geometry const& geometry,
+ RobustPolicy const& robust_policy,
Turns& turns,
InterruptPolicy& interrupt_policy)
{
@@ -127,20 +129,20 @@ struct get_turns
> sections_type;
sections_type sec;
- geometry::sectionalize<false>(geometry, sec);
+ geometry::sectionalize<false>(geometry, robust_policy, false, sec);
self_section_visitor
<
Geometry,
- Turns, TurnPolicy, InterruptPolicy
- > visitor(geometry, turns, interrupt_policy);
+ Turns, TurnPolicy, RobustPolicy, InterruptPolicy
+ > visitor(geometry, robust_policy, turns, interrupt_policy);
try
{
geometry::partition
<
- box_type,
- detail::get_turns::get_section_box,
+ box_type,
+ detail::get_turns::get_section_box,
detail::get_turns::ovelaps_section_box
>::apply(sec, visitor);
}
@@ -166,9 +168,7 @@ template
<
typename GeometryTag,
typename Geometry,
- typename Turns,
- typename TurnPolicy,
- typename InterruptPolicy
+ typename TurnPolicy
>
struct self_get_turn_points
{
@@ -178,44 +178,32 @@ struct self_get_turn_points
template
<
typename Ring,
- typename Turns,
- typename TurnPolicy,
- typename InterruptPolicy
+ typename TurnPolicy
>
struct self_get_turn_points
<
ring_tag, Ring,
- Turns,
- TurnPolicy,
- InterruptPolicy
+ TurnPolicy
>
- : detail::self_get_turn_points::get_turns
- <
- Ring,
- Turns,
- TurnPolicy,
- InterruptPolicy
- >
+ : detail::self_get_turn_points::get_turns<TurnPolicy>
{};
template
<
typename Box,
- typename Turns,
- typename TurnPolicy,
- typename InterruptPolicy
+ typename TurnPolicy
>
struct self_get_turn_points
<
box_tag, Box,
- Turns,
- TurnPolicy,
- InterruptPolicy
+ TurnPolicy
>
{
+ template <typename RobustPolicy, typename Turns, typename InterruptPolicy>
static inline bool apply(
Box const& ,
+ RobustPolicy const& ,
Turns& ,
InterruptPolicy& )
{
@@ -227,24 +215,28 @@ struct self_get_turn_points
template
<
typename Polygon,
- typename Turns,
- typename TurnPolicy,
- typename InterruptPolicy
+ typename TurnPolicy
>
struct self_get_turn_points
<
polygon_tag, Polygon,
- Turns,
- TurnPolicy,
- InterruptPolicy
+ TurnPolicy
+ >
+ : detail::self_get_turn_points::get_turns<TurnPolicy>
+{};
+
+
+template
+<
+ typename MultiPolygon,
+ typename TurnPolicy
+>
+struct self_get_turn_points
+ <
+ multi_polygon_tag, MultiPolygon,
+ TurnPolicy
>
- : detail::self_get_turn_points::get_turns
- <
- Polygon,
- Turns,
- TurnPolicy,
- InterruptPolicy
- >
+ : detail::self_get_turn_points::get_turns<TurnPolicy>
{};
@@ -259,6 +251,7 @@ struct self_get_turn_points
\tparam Turns type of intersection container
(e.g. vector of "intersection/turn point"'s)
\param geometry geometry
+ \param robust_policy policy to handle robustness issues
\param turns container which will contain intersection points
\param interrupt_policy policy determining if process is stopped
when intersection is found
@@ -267,38 +260,24 @@ template
<
typename AssignPolicy,
typename Geometry,
+ typename RobustPolicy,
typename Turns,
typename InterruptPolicy
>
inline void self_turns(Geometry const& geometry,
+ RobustPolicy const& robust_policy,
Turns& turns, InterruptPolicy& interrupt_policy)
{
concept::check<Geometry const>();
- typedef typename strategy_intersection
- <
- typename cs_tag<Geometry>::type,
- Geometry,
- Geometry,
- typename boost::range_value<Turns>::type
- >::segment_intersection_strategy_type strategy_type;
-
- typedef detail::overlay::get_turn_info
- <
- typename point_type<Geometry>::type,
- typename point_type<Geometry>::type,
- typename boost::range_value<Turns>::type,
- detail::overlay::assign_null_policy
- > TurnPolicy;
+ typedef detail::overlay::get_turn_info<detail::overlay::assign_null_policy> turn_policy;
dispatch::self_get_turn_points
<
typename tag<Geometry>::type,
Geometry,
- Turns,
- TurnPolicy,
- InterruptPolicy
- >::apply(geometry, turns, interrupt_policy);
+ turn_policy
+ >::apply(geometry, robust_policy, turns, interrupt_policy);
}