]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/geometry/include/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / geometry / include / boost / geometry / algorithms / detail / overlay / self_turn_points.hpp
CommitLineData
7c673cae
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4
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)
8
9#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_SELF_TURN_POINTS_HPP
10#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_SELF_TURN_POINTS_HPP
11
12
13#include <cstddef>
14
15#include <boost/mpl/vector_c.hpp>
16#include <boost/range.hpp>
17
18#include <boost/geometry/core/access.hpp>
19#include <boost/geometry/core/coordinate_dimension.hpp>
20#include <boost/geometry/core/tags.hpp>
21
22#include <boost/geometry/geometries/concepts/check.hpp>
23
24#include <boost/geometry/algorithms/detail/disjoint/box_box.hpp>
25#include <boost/geometry/algorithms/detail/partition.hpp>
26#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
27#include <boost/geometry/algorithms/detail/sections/section_box_policies.hpp>
28
29#include <boost/geometry/geometries/box.hpp>
30
31#include <boost/geometry/util/condition.hpp>
32
33
34namespace boost { namespace geometry
35{
36
37#ifndef DOXYGEN_NO_DETAIL
38namespace detail { namespace self_get_turn_points
39{
40
41struct no_interrupt_policy
42{
43 static bool const enabled = false;
44 static bool const has_intersections = false;
45
46
47 template <typename Range>
48 static inline bool apply(Range const&)
49 {
50 return false;
51 }
52};
53
54
55
56
57class self_ip_exception : public geometry::exception {};
58
59template
60<
61 typename Geometry,
62 typename Turns,
63 typename TurnPolicy,
64 typename RobustPolicy,
65 typename InterruptPolicy
66>
67struct self_section_visitor
68{
69 Geometry const& m_geometry;
70 RobustPolicy const& m_rescale_policy;
71 Turns& m_turns;
72 InterruptPolicy& m_interrupt_policy;
73
74 inline self_section_visitor(Geometry const& g,
75 RobustPolicy const& rp,
76 Turns& turns, InterruptPolicy& ip)
77 : m_geometry(g)
78 , m_rescale_policy(rp)
79 , m_turns(turns)
80 , m_interrupt_policy(ip)
81 {}
82
83 template <typename Section>
84 inline bool apply(Section const& sec1, Section const& sec2)
85 {
86 if (! detail::disjoint::disjoint_box_box(sec1.bounding_box, sec2.bounding_box)
87 && ! sec1.duplicate
88 && ! sec2.duplicate)
89 {
90 detail::get_turns::get_turns_in_sections
91 <
92 Geometry, Geometry,
93 false, false,
94 Section, Section,
95 TurnPolicy
96 >::apply(
97 0, m_geometry, sec1,
98 0, m_geometry, sec2,
99 false,
100 m_rescale_policy,
101 m_turns, m_interrupt_policy);
102 }
103 if (BOOST_GEOMETRY_CONDITION(m_interrupt_policy.has_intersections))
104 {
105 // TODO: we should give partition an interrupt policy.
106 // Now we throw, and catch below, to stop the partition loop.
107 throw self_ip_exception();
108 }
109 return true;
110 }
111
112};
113
114
115
116template<typename TurnPolicy>
117struct get_turns
118{
119 template <typename Geometry, typename RobustPolicy, typename Turns, typename InterruptPolicy>
120 static inline bool apply(
121 Geometry const& geometry,
122 RobustPolicy const& robust_policy,
123 Turns& turns,
124 InterruptPolicy& interrupt_policy)
125 {
126 typedef model::box
127 <
128 typename geometry::robust_point_type
129 <
130 typename geometry::point_type<Geometry>::type,
131 RobustPolicy
132 >::type
133 > box_type;
134
135 typedef geometry::sections<box_type, 1> sections_type;
136
137 typedef boost::mpl::vector_c<std::size_t, 0> dimensions;
138
139 sections_type sec;
140 geometry::sectionalize<false, dimensions>(geometry, robust_policy, sec);
141
142 self_section_visitor
143 <
144 Geometry,
145 Turns, TurnPolicy, RobustPolicy, InterruptPolicy
146 > visitor(geometry, robust_policy, turns, interrupt_policy);
147
148 try
149 {
150 geometry::partition
151 <
152 box_type,
153 detail::section::get_section_box,
154 detail::section::overlaps_section_box
155 >::apply(sec, visitor);
156 }
157 catch(self_ip_exception const& )
158 {
159 return false;
160 }
161
162 return true;
163 }
164};
165
166
167}} // namespace detail::self_get_turn_points
168#endif // DOXYGEN_NO_DETAIL
169
170
171#ifndef DOXYGEN_NO_DISPATCH
172namespace dispatch
173{
174
175template
176<
177 typename GeometryTag,
178 typename Geometry,
179 typename TurnPolicy
180>
181struct self_get_turn_points
182{
183};
184
185
186template
187<
188 typename Ring,
189 typename TurnPolicy
190>
191struct self_get_turn_points
192 <
193 ring_tag, Ring,
194 TurnPolicy
195 >
196 : detail::self_get_turn_points::get_turns<TurnPolicy>
197{};
198
199
200template
201<
202 typename Box,
203 typename TurnPolicy
204>
205struct self_get_turn_points
206 <
207 box_tag, Box,
208 TurnPolicy
209 >
210{
211 template <typename RobustPolicy, typename Turns, typename InterruptPolicy>
212 static inline bool apply(
213 Box const& ,
214 RobustPolicy const& ,
215 Turns& ,
216 InterruptPolicy& )
217 {
218 return true;
219 }
220};
221
222
223template
224<
225 typename Polygon,
226 typename TurnPolicy
227>
228struct self_get_turn_points
229 <
230 polygon_tag, Polygon,
231 TurnPolicy
232 >
233 : detail::self_get_turn_points::get_turns<TurnPolicy>
234{};
235
236
237template
238<
239 typename MultiPolygon,
240 typename TurnPolicy
241>
242struct self_get_turn_points
243 <
244 multi_polygon_tag, MultiPolygon,
245 TurnPolicy
246 >
247 : detail::self_get_turn_points::get_turns<TurnPolicy>
248{};
249
250
251} // namespace dispatch
252#endif // DOXYGEN_NO_DISPATCH
253
254
255/*!
256 \brief Calculate self intersections of a geometry
257 \ingroup overlay
258 \tparam Geometry geometry type
259 \tparam Turns type of intersection container
260 (e.g. vector of "intersection/turn point"'s)
261 \param geometry geometry
262 \param robust_policy policy to handle robustness issues
263 \param turns container which will contain intersection points
264 \param interrupt_policy policy determining if process is stopped
265 when intersection is found
266 */
267template
268<
269 typename AssignPolicy,
270 typename Geometry,
271 typename RobustPolicy,
272 typename Turns,
273 typename InterruptPolicy
274>
275inline void self_turns(Geometry const& geometry,
276 RobustPolicy const& robust_policy,
277 Turns& turns, InterruptPolicy& interrupt_policy)
278{
279 concepts::check<Geometry const>();
280
281 typedef detail::overlay::get_turn_info<detail::overlay::assign_null_policy> turn_policy;
282
283 dispatch::self_get_turn_points
284 <
285 typename tag<Geometry>::type,
286 Geometry,
287 turn_policy
288 >::apply(geometry, robust_policy, turns, interrupt_policy);
289}
290
291
292
293}} // namespace boost::geometry
294
295#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_SELF_TURN_POINTS_HPP