1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
5 // Use, modification and distribution is subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TRAVERSE_HPP
10 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TRAVERSE_HPP
14 #include <boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp>
15 #include <boost/geometry/algorithms/detail/overlay/traversal_ring_creator.hpp>
16 #include <boost/geometry/algorithms/detail/overlay/traversal_switch_detector.hpp>
19 namespace boost { namespace geometry
22 #ifndef DOXYGEN_NO_DETAIL
23 namespace detail { namespace overlay
28 \brief Traverses through intersection points / geometries
33 bool Reverse1, bool Reverse2,
36 overlay_type OverlayType,
37 typename Backtrack = backtrack_check_self_intersections<Geometry1, Geometry2>
42 template <typename Turns>
43 static void reset_visits(Turns& turns)
45 for (typename boost::range_iterator<Turns>::type
46 it = boost::begin(turns);
47 it != boost::end(turns);
50 for (int i = 0; i < 2; i++)
52 it->operations[i].visited.reset();
61 typename RobustPolicy,
67 static inline void apply(Geometry1 const& geometry1,
68 Geometry2 const& geometry2,
69 RobustPolicy const& robust_policy,
70 Turns& turns, Rings& rings,
74 traversal_switch_detector
76 Reverse1, Reverse2, OverlayType,
80 > switch_detector(geometry1, geometry2, turns, clusters,
81 robust_policy, visitor);
83 switch_detector.iterate();
86 traversal_ring_creator
88 Reverse1, Reverse2, OverlayType,
91 RobustPolicy, Visitor,
93 > trav(geometry1, geometry2, turns, clusters,
94 robust_policy, visitor);
96 std::size_t finalized_ring_size = boost::size(rings);
98 typename Backtrack::state_type state;
100 for (int pass = 0; pass < 2; pass++)
102 trav.iterate(rings, finalized_ring_size, state, pass);
107 }} // namespace detail::overlay
108 #endif // DOXYGEN_NO_DETAIL
110 }} // namespace boost::geometry
112 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_TRAVERSE_HPP