annotate DEPENDENCIES/generic/include/boost/geometry/algorithms/within.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
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