Chris@16
|
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
|
Chris@16
|
4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
|
Chris@16
|
5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
|
Chris@16
|
6
|
Chris@101
|
7 // This file was modified by Oracle on 2013, 2014.
|
Chris@101
|
8 // Modifications copyright (c) 2013, 2014 Oracle and/or its affiliates.
|
Chris@101
|
9
|
Chris@16
|
10 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
|
Chris@16
|
11 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
|
Chris@16
|
12
|
Chris@16
|
13 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@16
|
14 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
15 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
16
|
Chris@101
|
17 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
|
Chris@101
|
18
|
Chris@16
|
19 #ifndef BOOST_GEOMETRY_ALGORITHMS_WITHIN_HPP
|
Chris@16
|
20 #define BOOST_GEOMETRY_ALGORITHMS_WITHIN_HPP
|
Chris@16
|
21
|
Chris@16
|
22
|
Chris@16
|
23 #include <cstddef>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/concept_check.hpp>
|
Chris@16
|
26 #include <boost/range.hpp>
|
Chris@101
|
27
|
Chris@101
|
28 #include <boost/variant/apply_visitor.hpp>
|
Chris@101
|
29 #include <boost/variant/static_visitor.hpp>
|
Chris@101
|
30 #include <boost/variant/variant_fwd.hpp>
|
Chris@16
|
31
|
Chris@16
|
32 #include <boost/geometry/algorithms/make.hpp>
|
Chris@16
|
33 #include <boost/geometry/algorithms/not_implemented.hpp>
|
Chris@16
|
34
|
Chris@16
|
35 #include <boost/geometry/core/access.hpp>
|
Chris@16
|
36 #include <boost/geometry/core/closure.hpp>
|
Chris@16
|
37 #include <boost/geometry/core/cs.hpp>
|
Chris@16
|
38 #include <boost/geometry/core/exterior_ring.hpp>
|
Chris@16
|
39 #include <boost/geometry/core/interior_rings.hpp>
|
Chris@16
|
40 #include <boost/geometry/core/point_order.hpp>
|
Chris@16
|
41 #include <boost/geometry/core/ring_type.hpp>
|
Chris@16
|
42 #include <boost/geometry/core/interior_rings.hpp>
|
Chris@16
|
43 #include <boost/geometry/core/tags.hpp>
|
Chris@16
|
44
|
Chris@16
|
45 #include <boost/geometry/geometries/concepts/check.hpp>
|
Chris@101
|
46 #include <boost/geometry/strategies/concepts/within_concept.hpp>
|
Chris@101
|
47 #include <boost/geometry/strategies/default_strategy.hpp>
|
Chris@16
|
48 #include <boost/geometry/strategies/within.hpp>
|
Chris@16
|
49 #include <boost/geometry/util/math.hpp>
|
Chris@16
|
50 #include <boost/geometry/util/order_as_direction.hpp>
|
Chris@16
|
51 #include <boost/geometry/views/closeable_view.hpp>
|
Chris@16
|
52 #include <boost/geometry/views/reversible_view.hpp>
|
Chris@16
|
53
|
Chris@101
|
54 #include <boost/geometry/algorithms/detail/within/point_in_geometry.hpp>
|
Chris@101
|
55
|
Chris@101
|
56 #include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
|
Chris@101
|
57 #include <boost/geometry/algorithms/detail/overlay/do_reverse.hpp>
|
Chris@101
|
58 #include <deque>
|
Chris@16
|
59
|
Chris@16
|
60 namespace boost { namespace geometry
|
Chris@16
|
61 {
|
Chris@16
|
62
|
Chris@16
|
63 #ifndef DOXYGEN_NO_DETAIL
|
Chris@101
|
64 namespace detail { namespace within {
|
Chris@101
|
65
|
Chris@101
|
66 struct use_point_in_geometry
|
Chris@16
|
67 {
|
Chris@101
|
68 template <typename Geometry1, typename Geometry2, typename Strategy>
|
Chris@101
|
69 static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
|
Chris@16
|
70 {
|
Chris@101
|
71 return detail::within::point_in_geometry(geometry1, geometry2, strategy) == 1;
|
Chris@16
|
72 }
|
Chris@16
|
73 };
|
Chris@16
|
74
|
Chris@101
|
75 struct use_relate
|
Chris@16
|
76 {
|
Chris@101
|
77 template <typename Geometry1, typename Geometry2, typename Strategy>
|
Chris@101
|
78 static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& /*strategy*/)
|
Chris@16
|
79 {
|
Chris@101
|
80 return Strategy::apply(geometry1, geometry2);
|
Chris@16
|
81 }
|
Chris@16
|
82 };
|
Chris@16
|
83
|
Chris@16
|
84 }} // namespace detail::within
|
Chris@16
|
85 #endif // DOXYGEN_NO_DETAIL
|
Chris@16
|
86
|
Chris@16
|
87 #ifndef DOXYGEN_NO_DISPATCH
|
Chris@16
|
88 namespace dispatch
|
Chris@16
|
89 {
|
Chris@16
|
90
|
Chris@16
|
91 template
|
Chris@16
|
92 <
|
Chris@16
|
93 typename Geometry1,
|
Chris@16
|
94 typename Geometry2,
|
Chris@16
|
95 typename Tag1 = typename tag<Geometry1>::type,
|
Chris@16
|
96 typename Tag2 = typename tag<Geometry2>::type
|
Chris@16
|
97 >
|
Chris@101
|
98 struct within
|
Chris@101
|
99 : not_implemented<Tag1, Tag2>
|
Chris@16
|
100 {};
|
Chris@16
|
101
|
Chris@16
|
102
|
Chris@16
|
103 template <typename Point, typename Box>
|
Chris@16
|
104 struct within<Point, Box, point_tag, box_tag>
|
Chris@16
|
105 {
|
Chris@16
|
106 template <typename Strategy>
|
Chris@16
|
107 static inline bool apply(Point const& point, Box const& box, Strategy const& strategy)
|
Chris@16
|
108 {
|
Chris@16
|
109 boost::ignore_unused_variable_warning(strategy);
|
Chris@16
|
110 return strategy.apply(point, box);
|
Chris@16
|
111 }
|
Chris@16
|
112 };
|
Chris@16
|
113
|
Chris@16
|
114 template <typename Box1, typename Box2>
|
Chris@16
|
115 struct within<Box1, Box2, box_tag, box_tag>
|
Chris@16
|
116 {
|
Chris@16
|
117 template <typename Strategy>
|
Chris@16
|
118 static inline bool apply(Box1 const& box1, Box2 const& box2, Strategy const& strategy)
|
Chris@16
|
119 {
|
Chris@16
|
120 assert_dimension_equal<Box1, Box2>();
|
Chris@16
|
121 boost::ignore_unused_variable_warning(strategy);
|
Chris@16
|
122 return strategy.apply(box1, box2);
|
Chris@16
|
123 }
|
Chris@16
|
124 };
|
Chris@16
|
125
|
Chris@101
|
126 // P/P
|
Chris@16
|
127
|
Chris@101
|
128 template <typename Point1, typename Point2>
|
Chris@101
|
129 struct within<Point1, Point2, point_tag, point_tag>
|
Chris@101
|
130 : public detail::within::use_point_in_geometry
|
Chris@101
|
131 {};
|
Chris@101
|
132
|
Chris@101
|
133 template <typename Point, typename MultiPoint>
|
Chris@101
|
134 struct within<Point, MultiPoint, point_tag, multi_point_tag>
|
Chris@101
|
135 : public detail::within::use_point_in_geometry
|
Chris@101
|
136 {};
|
Chris@101
|
137
|
Chris@101
|
138 // P/L
|
Chris@101
|
139
|
Chris@101
|
140 template <typename Point, typename Segment>
|
Chris@101
|
141 struct within<Point, Segment, point_tag, segment_tag>
|
Chris@101
|
142 : public detail::within::use_point_in_geometry
|
Chris@101
|
143 {};
|
Chris@101
|
144
|
Chris@101
|
145 template <typename Point, typename Linestring>
|
Chris@101
|
146 struct within<Point, Linestring, point_tag, linestring_tag>
|
Chris@101
|
147 : public detail::within::use_point_in_geometry
|
Chris@101
|
148 {};
|
Chris@101
|
149
|
Chris@101
|
150 template <typename Point, typename MultiLinestring>
|
Chris@101
|
151 struct within<Point, MultiLinestring, point_tag, multi_linestring_tag>
|
Chris@101
|
152 : public detail::within::use_point_in_geometry
|
Chris@101
|
153 {};
|
Chris@101
|
154
|
Chris@101
|
155 // P/A
|
Chris@16
|
156
|
Chris@16
|
157 template <typename Point, typename Ring>
|
Chris@16
|
158 struct within<Point, Ring, point_tag, ring_tag>
|
Chris@101
|
159 : public detail::within::use_point_in_geometry
|
Chris@101
|
160 {};
|
Chris@101
|
161
|
Chris@101
|
162 template <typename Point, typename Polygon>
|
Chris@101
|
163 struct within<Point, Polygon, point_tag, polygon_tag>
|
Chris@101
|
164 : public detail::within::use_point_in_geometry
|
Chris@101
|
165 {};
|
Chris@101
|
166
|
Chris@101
|
167 template <typename Point, typename MultiPolygon>
|
Chris@101
|
168 struct within<Point, MultiPolygon, point_tag, multi_polygon_tag>
|
Chris@101
|
169 : public detail::within::use_point_in_geometry
|
Chris@101
|
170 {};
|
Chris@101
|
171
|
Chris@101
|
172 // L/L
|
Chris@101
|
173
|
Chris@101
|
174 template <typename Linestring1, typename Linestring2>
|
Chris@101
|
175 struct within<Linestring1, Linestring2, linestring_tag, linestring_tag>
|
Chris@101
|
176 : public detail::within::use_relate
|
Chris@101
|
177 {};
|
Chris@101
|
178
|
Chris@101
|
179 template <typename Linestring, typename MultiLinestring>
|
Chris@101
|
180 struct within<Linestring, MultiLinestring, linestring_tag, multi_linestring_tag>
|
Chris@101
|
181 : public detail::within::use_relate
|
Chris@101
|
182 {};
|
Chris@101
|
183
|
Chris@101
|
184 template <typename MultiLinestring, typename Linestring>
|
Chris@101
|
185 struct within<MultiLinestring, Linestring, multi_linestring_tag, linestring_tag>
|
Chris@101
|
186 : public detail::within::use_relate
|
Chris@101
|
187 {};
|
Chris@101
|
188
|
Chris@101
|
189 template <typename MultiLinestring1, typename MultiLinestring2>
|
Chris@101
|
190 struct within<MultiLinestring1, MultiLinestring2, multi_linestring_tag, multi_linestring_tag>
|
Chris@101
|
191 : public detail::within::use_relate
|
Chris@101
|
192 {};
|
Chris@101
|
193
|
Chris@101
|
194 // L/A
|
Chris@101
|
195
|
Chris@101
|
196 template <typename Linestring, typename Ring>
|
Chris@101
|
197 struct within<Linestring, Ring, linestring_tag, ring_tag>
|
Chris@101
|
198 : public detail::within::use_relate
|
Chris@101
|
199 {};
|
Chris@101
|
200
|
Chris@101
|
201 template <typename MultiLinestring, typename Ring>
|
Chris@101
|
202 struct within<MultiLinestring, Ring, multi_linestring_tag, ring_tag>
|
Chris@101
|
203 : public detail::within::use_relate
|
Chris@101
|
204 {};
|
Chris@101
|
205
|
Chris@101
|
206 template <typename Linestring, typename Polygon>
|
Chris@101
|
207 struct within<Linestring, Polygon, linestring_tag, polygon_tag>
|
Chris@101
|
208 : public detail::within::use_relate
|
Chris@101
|
209 {};
|
Chris@101
|
210
|
Chris@101
|
211 template <typename MultiLinestring, typename Polygon>
|
Chris@101
|
212 struct within<MultiLinestring, Polygon, multi_linestring_tag, polygon_tag>
|
Chris@101
|
213 : public detail::within::use_relate
|
Chris@101
|
214 {};
|
Chris@101
|
215
|
Chris@101
|
216 template <typename Linestring, typename MultiPolygon>
|
Chris@101
|
217 struct within<Linestring, MultiPolygon, linestring_tag, multi_polygon_tag>
|
Chris@101
|
218 : public detail::within::use_relate
|
Chris@101
|
219 {};
|
Chris@101
|
220
|
Chris@101
|
221 template <typename MultiLinestring, typename MultiPolygon>
|
Chris@101
|
222 struct within<MultiLinestring, MultiPolygon, multi_linestring_tag, multi_polygon_tag>
|
Chris@101
|
223 : public detail::within::use_relate
|
Chris@101
|
224 {};
|
Chris@101
|
225
|
Chris@101
|
226 // A/A
|
Chris@101
|
227
|
Chris@101
|
228 template <typename Ring1, typename Ring2>
|
Chris@101
|
229 struct within<Ring1, Ring2, ring_tag, ring_tag>
|
Chris@101
|
230 : public detail::within::use_relate
|
Chris@101
|
231 {};
|
Chris@101
|
232
|
Chris@101
|
233 template <typename Ring, typename Polygon>
|
Chris@101
|
234 struct within<Ring, Polygon, ring_tag, polygon_tag>
|
Chris@101
|
235 : public detail::within::use_relate
|
Chris@101
|
236 {};
|
Chris@101
|
237
|
Chris@101
|
238 template <typename Polygon, typename Ring>
|
Chris@101
|
239 struct within<Polygon, Ring, polygon_tag, ring_tag>
|
Chris@101
|
240 : public detail::within::use_relate
|
Chris@101
|
241 {};
|
Chris@101
|
242
|
Chris@101
|
243 template <typename Polygon1, typename Polygon2>
|
Chris@101
|
244 struct within<Polygon1, Polygon2, polygon_tag, polygon_tag>
|
Chris@101
|
245 : public detail::within::use_relate
|
Chris@101
|
246 {};
|
Chris@101
|
247
|
Chris@101
|
248 template <typename Ring, typename MultiPolygon>
|
Chris@101
|
249 struct within<Ring, MultiPolygon, ring_tag, multi_polygon_tag>
|
Chris@101
|
250 : public detail::within::use_relate
|
Chris@101
|
251 {};
|
Chris@101
|
252
|
Chris@101
|
253 template <typename MultiPolygon, typename Ring>
|
Chris@101
|
254 struct within<MultiPolygon, Ring, multi_polygon_tag, ring_tag>
|
Chris@101
|
255 : public detail::within::use_relate
|
Chris@101
|
256 {};
|
Chris@101
|
257
|
Chris@101
|
258 template <typename Polygon, typename MultiPolygon>
|
Chris@101
|
259 struct within<Polygon, MultiPolygon, polygon_tag, multi_polygon_tag>
|
Chris@101
|
260 : public detail::within::use_relate
|
Chris@101
|
261 {};
|
Chris@101
|
262
|
Chris@101
|
263 template <typename MultiPolygon, typename Polygon>
|
Chris@101
|
264 struct within<MultiPolygon, Polygon, multi_polygon_tag, polygon_tag>
|
Chris@101
|
265 : public detail::within::use_relate
|
Chris@101
|
266 {};
|
Chris@101
|
267
|
Chris@101
|
268 template <typename MultiPolygon1, typename MultiPolygon2>
|
Chris@101
|
269 struct within<MultiPolygon1, MultiPolygon2, multi_polygon_tag, multi_polygon_tag>
|
Chris@101
|
270 : public detail::within::use_relate
|
Chris@101
|
271 {};
|
Chris@101
|
272
|
Chris@101
|
273 } // namespace dispatch
|
Chris@101
|
274 #endif // DOXYGEN_NO_DISPATCH
|
Chris@101
|
275
|
Chris@101
|
276
|
Chris@101
|
277 namespace resolve_strategy
|
Chris@16
|
278 {
|
Chris@101
|
279
|
Chris@101
|
280 struct within
|
Chris@101
|
281 {
|
Chris@101
|
282 template <typename Geometry1, typename Geometry2, typename Strategy>
|
Chris@101
|
283 static inline bool apply(Geometry1 const& geometry1,
|
Chris@101
|
284 Geometry2 const& geometry2,
|
Chris@101
|
285 Strategy const& strategy)
|
Chris@16
|
286 {
|
Chris@101
|
287 concept::within::check
|
Chris@16
|
288 <
|
Chris@101
|
289 typename tag<Geometry1>::type,
|
Chris@101
|
290 typename tag<Geometry2>::type,
|
Chris@101
|
291 typename tag_cast<typename tag<Geometry2>::type, areal_tag>::type,
|
Chris@16
|
292 Strategy
|
Chris@101
|
293 >();
|
Chris@101
|
294
|
Chris@101
|
295 return dispatch::within<Geometry1, Geometry2>::apply(geometry1, geometry2, strategy);
|
Chris@101
|
296 }
|
Chris@101
|
297
|
Chris@101
|
298 template <typename Geometry1, typename Geometry2>
|
Chris@101
|
299 static inline bool apply(Geometry1 const& geometry1,
|
Chris@101
|
300 Geometry2 const& geometry2,
|
Chris@101
|
301 default_strategy)
|
Chris@101
|
302 {
|
Chris@101
|
303 typedef typename point_type<Geometry1>::type point_type1;
|
Chris@101
|
304 typedef typename point_type<Geometry2>::type point_type2;
|
Chris@101
|
305
|
Chris@101
|
306 typedef typename strategy::within::services::default_strategy
|
Chris@101
|
307 <
|
Chris@101
|
308 typename tag<Geometry1>::type,
|
Chris@101
|
309 typename tag<Geometry2>::type,
|
Chris@101
|
310 typename tag<Geometry1>::type,
|
Chris@101
|
311 typename tag_cast<typename tag<Geometry2>::type, areal_tag>::type,
|
Chris@101
|
312 typename tag_cast
|
Chris@101
|
313 <
|
Chris@101
|
314 typename cs_tag<point_type1>::type, spherical_tag
|
Chris@101
|
315 >::type,
|
Chris@101
|
316 typename tag_cast
|
Chris@101
|
317 <
|
Chris@101
|
318 typename cs_tag<point_type2>::type, spherical_tag
|
Chris@101
|
319 >::type,
|
Chris@101
|
320 Geometry1,
|
Chris@101
|
321 Geometry2
|
Chris@101
|
322 >::type strategy_type;
|
Chris@101
|
323
|
Chris@101
|
324 return apply(geometry1, geometry2, strategy_type());
|
Chris@16
|
325 }
|
Chris@16
|
326 };
|
Chris@16
|
327
|
Chris@101
|
328 } // namespace resolve_strategy
|
Chris@101
|
329
|
Chris@101
|
330
|
Chris@101
|
331 namespace resolve_variant
|
Chris@101
|
332 {
|
Chris@101
|
333
|
Chris@101
|
334 template <typename Geometry1, typename Geometry2>
|
Chris@101
|
335 struct within
|
Chris@16
|
336 {
|
Chris@16
|
337 template <typename Strategy>
|
Chris@101
|
338 static inline bool apply(Geometry1 const& geometry1,
|
Chris@101
|
339 Geometry2 const& geometry2,
|
Chris@101
|
340 Strategy const& strategy)
|
Chris@16
|
341 {
|
Chris@101
|
342 concept::check<Geometry1 const>();
|
Chris@101
|
343 concept::check<Geometry2 const>();
|
Chris@101
|
344 assert_dimension_equal<Geometry1, Geometry2>();
|
Chris@101
|
345
|
Chris@101
|
346 return resolve_strategy::within::apply(geometry1,
|
Chris@101
|
347 geometry2,
|
Chris@101
|
348 strategy);
|
Chris@16
|
349 }
|
Chris@16
|
350 };
|
Chris@16
|
351
|
Chris@101
|
352 template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
|
Chris@101
|
353 struct within<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
|
Chris@101
|
354 {
|
Chris@101
|
355 template <typename Strategy>
|
Chris@101
|
356 struct visitor: boost::static_visitor<bool>
|
Chris@101
|
357 {
|
Chris@101
|
358 Geometry2 const& m_geometry2;
|
Chris@101
|
359 Strategy const& m_strategy;
|
Chris@101
|
360
|
Chris@101
|
361 visitor(Geometry2 const& geometry2, Strategy const& strategy):
|
Chris@101
|
362 m_geometry2(geometry2),
|
Chris@101
|
363 m_strategy(strategy)
|
Chris@101
|
364 {}
|
Chris@101
|
365
|
Chris@101
|
366 template <typename Geometry1>
|
Chris@101
|
367 bool operator()(Geometry1 const& geometry1) const
|
Chris@101
|
368 {
|
Chris@101
|
369 return within<Geometry1, Geometry2>::apply(geometry1,
|
Chris@101
|
370 m_geometry2,
|
Chris@101
|
371 m_strategy);
|
Chris@101
|
372 }
|
Chris@101
|
373 };
|
Chris@101
|
374
|
Chris@101
|
375 template <typename Strategy>
|
Chris@101
|
376 static inline bool
|
Chris@101
|
377 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
|
Chris@101
|
378 Geometry2 const& geometry2,
|
Chris@101
|
379 Strategy const& strategy)
|
Chris@101
|
380 {
|
Chris@101
|
381 return boost::apply_visitor(
|
Chris@101
|
382 visitor<Strategy>(geometry2, strategy),
|
Chris@101
|
383 geometry1
|
Chris@101
|
384 );
|
Chris@101
|
385 }
|
Chris@101
|
386 };
|
Chris@101
|
387
|
Chris@101
|
388 template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
|
Chris@101
|
389 struct within<Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
|
Chris@101
|
390 {
|
Chris@101
|
391 template <typename Strategy>
|
Chris@101
|
392 struct visitor: boost::static_visitor<bool>
|
Chris@101
|
393 {
|
Chris@101
|
394 Geometry1 const& m_geometry1;
|
Chris@101
|
395 Strategy const& m_strategy;
|
Chris@101
|
396
|
Chris@101
|
397 visitor(Geometry1 const& geometry1, Strategy const& strategy):
|
Chris@101
|
398 m_geometry1(geometry1),
|
Chris@101
|
399 m_strategy(strategy)
|
Chris@101
|
400 {}
|
Chris@101
|
401
|
Chris@101
|
402 template <typename Geometry2>
|
Chris@101
|
403 bool operator()(Geometry2 const& geometry2) const
|
Chris@101
|
404 {
|
Chris@101
|
405 return within<Geometry1, Geometry2>::apply(m_geometry1,
|
Chris@101
|
406 geometry2,
|
Chris@101
|
407 m_strategy);
|
Chris@101
|
408 }
|
Chris@101
|
409 };
|
Chris@101
|
410
|
Chris@101
|
411 template <typename Strategy>
|
Chris@101
|
412 static inline bool
|
Chris@101
|
413 apply(Geometry1 const& geometry1,
|
Chris@101
|
414 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,
|
Chris@101
|
415 Strategy const& strategy)
|
Chris@101
|
416 {
|
Chris@101
|
417 return boost::apply_visitor(
|
Chris@101
|
418 visitor<Strategy>(geometry1, strategy),
|
Chris@101
|
419 geometry2
|
Chris@101
|
420 );
|
Chris@101
|
421 }
|
Chris@101
|
422 };
|
Chris@101
|
423
|
Chris@101
|
424 template <
|
Chris@101
|
425 BOOST_VARIANT_ENUM_PARAMS(typename T1),
|
Chris@101
|
426 BOOST_VARIANT_ENUM_PARAMS(typename T2)
|
Chris@101
|
427 >
|
Chris@101
|
428 struct within<
|
Chris@101
|
429 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
|
Chris@101
|
430 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
|
Chris@101
|
431 >
|
Chris@101
|
432 {
|
Chris@101
|
433 template <typename Strategy>
|
Chris@101
|
434 struct visitor: boost::static_visitor<bool>
|
Chris@101
|
435 {
|
Chris@101
|
436 Strategy const& m_strategy;
|
Chris@101
|
437
|
Chris@101
|
438 visitor(Strategy const& strategy): m_strategy(strategy) {}
|
Chris@101
|
439
|
Chris@101
|
440 template <typename Geometry1, typename Geometry2>
|
Chris@101
|
441 bool operator()(Geometry1 const& geometry1,
|
Chris@101
|
442 Geometry2 const& geometry2) const
|
Chris@101
|
443 {
|
Chris@101
|
444 return within<Geometry1, Geometry2>::apply(geometry1,
|
Chris@101
|
445 geometry2,
|
Chris@101
|
446 m_strategy);
|
Chris@101
|
447 }
|
Chris@101
|
448 };
|
Chris@101
|
449
|
Chris@101
|
450 template <typename Strategy>
|
Chris@101
|
451 static inline bool
|
Chris@101
|
452 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
|
Chris@101
|
453 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
|
Chris@101
|
454 Strategy const& strategy)
|
Chris@101
|
455 {
|
Chris@101
|
456 return boost::apply_visitor(
|
Chris@101
|
457 visitor<Strategy>(strategy),
|
Chris@101
|
458 geometry1, geometry2
|
Chris@101
|
459 );
|
Chris@101
|
460 }
|
Chris@101
|
461 };
|
Chris@101
|
462
|
Chris@101
|
463 }
|
Chris@16
|
464
|
Chris@16
|
465
|
Chris@16
|
466 /*!
|
Chris@16
|
467 \brief \brief_check12{is completely inside}
|
Chris@16
|
468 \ingroup within
|
Chris@16
|
469 \details \details_check12{within, is completely inside}.
|
Chris@16
|
470 \tparam Geometry1 \tparam_geometry
|
Chris@16
|
471 \tparam Geometry2 \tparam_geometry
|
Chris@16
|
472 \param geometry1 \param_geometry which might be within the second geometry
|
Chris@16
|
473 \param geometry2 \param_geometry which might contain the first geometry
|
Chris@16
|
474 \return true if geometry1 is completely contained within geometry2,
|
Chris@16
|
475 else false
|
Chris@16
|
476 \note The default strategy is used for within detection
|
Chris@16
|
477
|
Chris@16
|
478
|
Chris@16
|
479 \qbk{[include reference/algorithms/within.qbk]}
|
Chris@16
|
480
|
Chris@16
|
481 \qbk{
|
Chris@16
|
482 [heading Example]
|
Chris@16
|
483 [within]
|
Chris@16
|
484 [within_output]
|
Chris@16
|
485 }
|
Chris@16
|
486 */
|
Chris@16
|
487 template<typename Geometry1, typename Geometry2>
|
Chris@16
|
488 inline bool within(Geometry1 const& geometry1, Geometry2 const& geometry2)
|
Chris@16
|
489 {
|
Chris@101
|
490 return resolve_variant::within
|
Chris@16
|
491 <
|
Chris@16
|
492 Geometry1,
|
Chris@16
|
493 Geometry2
|
Chris@101
|
494 >::apply(geometry1, geometry2, default_strategy());
|
Chris@16
|
495 }
|
Chris@16
|
496
|
Chris@16
|
497 /*!
|
Chris@16
|
498 \brief \brief_check12{is completely inside} \brief_strategy
|
Chris@16
|
499 \ingroup within
|
Chris@16
|
500 \details \details_check12{within, is completely inside}, \brief_strategy. \details_strategy_reasons
|
Chris@16
|
501 \tparam Geometry1 \tparam_geometry
|
Chris@16
|
502 \tparam Geometry2 \tparam_geometry
|
Chris@16
|
503 \param geometry1 \param_geometry which might be within the second geometry
|
Chris@16
|
504 \param geometry2 \param_geometry which might contain the first geometry
|
Chris@16
|
505 \param strategy strategy to be used
|
Chris@16
|
506 \return true if geometry1 is completely contained within geometry2,
|
Chris@16
|
507 else false
|
Chris@16
|
508
|
Chris@16
|
509 \qbk{distinguish,with strategy}
|
Chris@16
|
510 \qbk{[include reference/algorithms/within.qbk]}
|
Chris@16
|
511 \qbk{
|
Chris@16
|
512 [heading Available Strategies]
|
Chris@16
|
513 \* [link geometry.reference.strategies.strategy_within_winding Winding (coordinate system agnostic)]
|
Chris@16
|
514 \* [link geometry.reference.strategies.strategy_within_franklin Franklin (cartesian)]
|
Chris@16
|
515 \* [link geometry.reference.strategies.strategy_within_crossings_multiply Crossings Multiply (cartesian)]
|
Chris@16
|
516
|
Chris@16
|
517 [heading Example]
|
Chris@16
|
518 [within_strategy]
|
Chris@16
|
519 [within_strategy_output]
|
Chris@16
|
520
|
Chris@16
|
521 }
|
Chris@16
|
522 */
|
Chris@16
|
523 template<typename Geometry1, typename Geometry2, typename Strategy>
|
Chris@16
|
524 inline bool within(Geometry1 const& geometry1, Geometry2 const& geometry2,
|
Chris@16
|
525 Strategy const& strategy)
|
Chris@16
|
526 {
|
Chris@101
|
527 return resolve_variant::within
|
Chris@16
|
528 <
|
Chris@16
|
529 Geometry1,
|
Chris@16
|
530 Geometry2
|
Chris@16
|
531 >::apply(geometry1, geometry2, strategy);
|
Chris@16
|
532 }
|
Chris@16
|
533
|
Chris@16
|
534 }} // namespace boost::geometry
|
Chris@16
|
535
|
Chris@16
|
536 #endif // BOOST_GEOMETRY_ALGORITHMS_WITHIN_HPP
|