summaryrefslogtreecommitdiff
path: root/boost/geometry/multi/algorithms/intersection.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/multi/algorithms/intersection.hpp')
-rw-r--r--boost/geometry/multi/algorithms/intersection.hpp426
1 files changed, 5 insertions, 421 deletions
diff --git a/boost/geometry/multi/algorithms/intersection.hpp b/boost/geometry/multi/algorithms/intersection.hpp
index 31e74a79ba..f434463253 100644
--- a/boost/geometry/multi/algorithms/intersection.hpp
+++ b/boost/geometry/multi/algorithms/intersection.hpp
@@ -2,6 +2,11 @@
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
+// This file was modified by Oracle on 2014.
+// Modifications copyright (c) 2014, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -10,429 +15,8 @@
#define BOOST_GEOMETRY_MULTI_ALGORITHMS_INTERSECTION_HPP
-#include <boost/geometry/multi/core/closure.hpp>
-#include <boost/geometry/multi/core/geometry_id.hpp>
-#include <boost/geometry/multi/core/is_areal.hpp>
-#include <boost/geometry/multi/core/point_order.hpp>
-#include <boost/geometry/multi/algorithms/covered_by.hpp>
-#include <boost/geometry/multi/algorithms/envelope.hpp>
-#include <boost/geometry/multi/algorithms/num_points.hpp>
-#include <boost/geometry/multi/algorithms/detail/overlay/get_ring.hpp>
-#include <boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp>
-#include <boost/geometry/multi/algorithms/detail/overlay/copy_segments.hpp>
-#include <boost/geometry/multi/algorithms/detail/overlay/copy_segment_point.hpp>
-#include <boost/geometry/multi/algorithms/detail/overlay/select_rings.hpp>
-#include <boost/geometry/multi/algorithms/detail/sections/range_by_section.hpp>
-#include <boost/geometry/multi/algorithms/detail/sections/sectionalize.hpp>
-
#include <boost/geometry/algorithms/intersection.hpp>
-namespace boost { namespace geometry
-{
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace intersection
-{
-
-
-template
-<
- typename MultiLinestring1, typename MultiLinestring2,
- typename OutputIterator, typename PointOut,
- typename Strategy
->
-struct intersection_multi_linestring_multi_linestring_point
-{
- static inline OutputIterator apply(MultiLinestring1 const& ml1,
- MultiLinestring2 const& ml2, OutputIterator out,
- Strategy const& strategy)
- {
- // Note, this loop is quadratic w.r.t. number of linestrings per input.
- // Future Enhancement: first do the sections of each, then intersect.
- for (typename boost::range_iterator
- <
- MultiLinestring1 const
- >::type it1 = boost::begin(ml1);
- it1 != boost::end(ml1);
- ++it1)
- {
- for (typename boost::range_iterator
- <
- MultiLinestring2 const
- >::type it2 = boost::begin(ml2);
- it2 != boost::end(ml2);
- ++it2)
- {
- out = intersection_linestring_linestring_point
- <
- typename boost::range_value<MultiLinestring1>::type,
- typename boost::range_value<MultiLinestring2>::type,
- OutputIterator, PointOut, Strategy
- >::apply(*it1, *it2, out, strategy);
- }
- }
-
- return out;
- }
-};
-
-
-template
-<
- typename Linestring, typename MultiLinestring,
- typename OutputIterator, typename PointOut,
- typename Strategy
->
-struct intersection_linestring_multi_linestring_point
-{
- static inline OutputIterator apply(Linestring const& linestring,
- MultiLinestring const& ml, OutputIterator out,
- Strategy const& strategy)
- {
- for (typename boost::range_iterator
- <
- MultiLinestring const
- >::type it = boost::begin(ml);
- it != boost::end(ml);
- ++it)
- {
- out = intersection_linestring_linestring_point
- <
- Linestring,
- typename boost::range_value<MultiLinestring>::type,
- OutputIterator, PointOut, Strategy
- >::apply(linestring, *it, out, strategy);
- }
-
- return out;
- }
-};
-
-
-// This loop is quite similar to the loop above, but beacuse the iterator
-// is second (above) or first (below) argument, it is not trivial to merge them.
-template
-<
- typename MultiLinestring, typename Areal,
- bool ReverseAreal,
- typename OutputIterator, typename LineStringOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_of_multi_linestring_with_areal
-{
- static inline OutputIterator apply(MultiLinestring const& ml, Areal const& areal,
- OutputIterator out,
- Strategy const& strategy)
- {
- for (typename boost::range_iterator
- <
- MultiLinestring const
- >::type it = boost::begin(ml);
- it != boost::end(ml);
- ++it)
- {
- out = intersection_of_linestring_with_areal
- <
- typename boost::range_value<MultiLinestring>::type,
- Areal, ReverseAreal,
- OutputIterator, LineStringOut, OverlayType, Strategy
- >::apply(*it, areal, out, strategy);
- }
-
- return out;
-
- }
-};
-
-// This one calls the one above with reversed arguments
-template
-<
- typename Areal, typename MultiLinestring,
- bool ReverseAreal,
- typename OutputIterator, typename LineStringOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_of_areal_with_multi_linestring
-{
- static inline OutputIterator apply(Areal const& areal, MultiLinestring const& ml,
- OutputIterator out,
- Strategy const& strategy)
- {
- return intersection_of_multi_linestring_with_areal
- <
- MultiLinestring, Areal, ReverseAreal,
- OutputIterator, LineStringOut,
- OverlayType,
- Strategy
- >::apply(ml, areal, out, strategy);
- }
-};
-
-
-
-template
-<
- typename MultiLinestring, typename Box,
- typename OutputIterator, typename LinestringOut,
- typename Strategy
->
-struct clip_multi_linestring
-{
- static inline OutputIterator apply(MultiLinestring const& multi_linestring,
- Box const& box, OutputIterator out, Strategy const& )
- {
- typedef typename point_type<LinestringOut>::type point_type;
- strategy::intersection::liang_barsky<Box, point_type> lb_strategy;
- for (typename boost::range_iterator<MultiLinestring const>::type it
- = boost::begin(multi_linestring);
- it != boost::end(multi_linestring); ++it)
- {
- out = detail::intersection::clip_range_with_box
- <LinestringOut>(box, *it, out, lb_strategy);
- }
- return out;
- }
-};
-
-
-}} // namespace detail::intersection
-#endif // DOXYGEN_NO_DETAIL
-
-
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
-{
-
-
-// Linear
-template
-<
- typename MultiLinestring1, typename MultiLinestring2,
- bool Reverse1, bool Reverse2, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- multi_linestring_tag, multi_linestring_tag, point_tag,
- false, false, false,
- MultiLinestring1, MultiLinestring2,
- Reverse1, Reverse2, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_multi_linestring_multi_linestring_point
- <
- MultiLinestring1, MultiLinestring2,
- OutputIterator, GeometryOut,
- Strategy
- >
-{};
-
-
-template
-<
- typename Linestring, typename MultiLinestring,
- typename OutputIterator, typename GeometryOut,
- bool Reverse1, bool Reverse2, bool ReverseOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- linestring_tag, multi_linestring_tag, point_tag,
- false, false, false,
- Linestring, MultiLinestring,
- Reverse1, Reverse2, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_linestring_multi_linestring_point
- <
- Linestring, MultiLinestring,
- OutputIterator, GeometryOut,
- Strategy
- >
-{};
-
-
-template
-<
- typename MultiLinestring, typename Box,
- bool Reverse1, bool Reverse2, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- multi_linestring_tag, box_tag, linestring_tag,
- false, true, false,
- MultiLinestring, Box,
- Reverse1, Reverse2, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::clip_multi_linestring
- <
- MultiLinestring, Box,
- OutputIterator, GeometryOut,
- Strategy
- >
-{};
-
-
-template
-<
- typename Linestring, typename MultiPolygon,
- bool ReverseLinestring, bool ReverseMultiPolygon, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- linestring_tag, multi_polygon_tag, linestring_tag,
- false, true, false,
- Linestring, MultiPolygon,
- ReverseLinestring, ReverseMultiPolygon, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_of_linestring_with_areal
- <
- Linestring, MultiPolygon,
- ReverseMultiPolygon,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- >
-{};
-
-
-// Derives from areal/mls because runtime arguments are in that order.
-// areal/mls reverses it itself to mls/areal
-template
-<
- typename Polygon, typename MultiLinestring,
- bool ReversePolygon, bool ReverseMultiLinestring, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- polygon_tag, multi_linestring_tag, linestring_tag,
- true, false, false,
- Polygon, MultiLinestring,
- ReversePolygon, ReverseMultiLinestring, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_of_areal_with_multi_linestring
- <
- Polygon, MultiLinestring,
- ReversePolygon,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- >
-{};
-
-
-template
-<
- typename MultiLinestring, typename Ring,
- bool ReverseMultiLinestring, bool ReverseRing, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- multi_linestring_tag, ring_tag, linestring_tag,
- false, true, false,
- MultiLinestring, Ring,
- ReverseMultiLinestring, ReverseRing, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_of_multi_linestring_with_areal
- <
- MultiLinestring, Ring,
- ReverseRing,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- >
-{};
-
-template
-<
- typename MultiLinestring, typename Polygon,
- bool ReverseMultiLinestring, bool ReverseRing, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- multi_linestring_tag, polygon_tag, linestring_tag,
- false, true, false,
- MultiLinestring, Polygon,
- ReverseMultiLinestring, ReverseRing, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_of_multi_linestring_with_areal
- <
- MultiLinestring, Polygon,
- ReverseRing,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- >
-{};
-
-
-
-template
-<
- typename MultiLinestring, typename MultiPolygon,
- bool ReverseMultiLinestring, bool ReverseMultiPolygon, bool ReverseOut,
- typename OutputIterator, typename GeometryOut,
- overlay_type OverlayType,
- typename Strategy
->
-struct intersection_insert
- <
- multi_linestring_tag, multi_polygon_tag, linestring_tag,
- false, true, false,
- MultiLinestring, MultiPolygon,
- ReverseMultiLinestring, ReverseMultiPolygon, ReverseOut,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- > : detail::intersection::intersection_of_multi_linestring_with_areal
- <
- MultiLinestring, MultiPolygon,
- ReverseMultiPolygon,
- OutputIterator, GeometryOut,
- OverlayType,
- Strategy
- >
-{};
-
-
-} // namespace dispatch
-#endif
-
-}} // namespace boost::geometry
-
-
#endif // BOOST_GEOMETRY_MULTI_ALGORITHMS_INTERSECTION_HPP