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
|
Chris@16
|
5 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@16
|
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_GEOMETRY_ALGORITHMS_DIFFERENCE_HPP
|
Chris@16
|
10 #define BOOST_GEOMETRY_ALGORITHMS_DIFFERENCE_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #include <algorithm>
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/geometry/algorithms/detail/overlay/intersection_insert.hpp>
|
Chris@101
|
15 #include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost { namespace geometry
|
Chris@16
|
18 {
|
Chris@16
|
19
|
Chris@16
|
20 #ifndef DOXYGEN_NO_DETAIL
|
Chris@16
|
21 namespace detail { namespace difference
|
Chris@16
|
22 {
|
Chris@16
|
23
|
Chris@16
|
24 /*!
|
Chris@16
|
25 \brief_calc2{difference} \brief_strategy
|
Chris@16
|
26 \ingroup difference
|
Chris@16
|
27 \details \details_calc2{difference_insert, spatial set theoretic difference}
|
Chris@16
|
28 \brief_strategy. \details_inserter{difference}
|
Chris@16
|
29 \tparam GeometryOut output geometry type, must be specified
|
Chris@16
|
30 \tparam Geometry1 \tparam_geometry
|
Chris@16
|
31 \tparam Geometry2 \tparam_geometry
|
Chris@16
|
32 \tparam OutputIterator output iterator
|
Chris@16
|
33 \tparam Strategy \tparam_strategy_overlay
|
Chris@16
|
34 \param geometry1 \param_geometry
|
Chris@16
|
35 \param geometry2 \param_geometry
|
Chris@16
|
36 \param out \param_out{difference}
|
Chris@16
|
37 \param strategy \param_strategy{difference}
|
Chris@16
|
38 \return \return_out
|
Chris@16
|
39
|
Chris@16
|
40 \qbk{distinguish,with strategy}
|
Chris@16
|
41 */
|
Chris@16
|
42 template
|
Chris@16
|
43 <
|
Chris@16
|
44 typename GeometryOut,
|
Chris@16
|
45 typename Geometry1,
|
Chris@16
|
46 typename Geometry2,
|
Chris@101
|
47 typename RobustPolicy,
|
Chris@16
|
48 typename OutputIterator,
|
Chris@16
|
49 typename Strategy
|
Chris@16
|
50 >
|
Chris@16
|
51 inline OutputIterator difference_insert(Geometry1 const& geometry1,
|
Chris@101
|
52 Geometry2 const& geometry2,
|
Chris@101
|
53 RobustPolicy const& robust_policy,
|
Chris@101
|
54 OutputIterator out,
|
Chris@16
|
55 Strategy const& strategy)
|
Chris@16
|
56 {
|
Chris@16
|
57 concept::check<Geometry1 const>();
|
Chris@16
|
58 concept::check<Geometry2 const>();
|
Chris@16
|
59 concept::check<GeometryOut>();
|
Chris@101
|
60
|
Chris@16
|
61 return geometry::dispatch::intersection_insert
|
Chris@16
|
62 <
|
Chris@16
|
63 Geometry1, Geometry2,
|
Chris@16
|
64 GeometryOut,
|
Chris@16
|
65 overlay_difference,
|
Chris@16
|
66 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value,
|
Chris@16
|
67 geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value, true>::value
|
Chris@101
|
68 >::apply(geometry1, geometry2, robust_policy, out, strategy);
|
Chris@16
|
69 }
|
Chris@16
|
70
|
Chris@16
|
71 /*!
|
Chris@16
|
72 \brief_calc2{difference}
|
Chris@16
|
73 \ingroup difference
|
Chris@16
|
74 \details \details_calc2{difference_insert, spatial set theoretic difference}.
|
Chris@16
|
75 \details_insert{difference}
|
Chris@16
|
76 \tparam GeometryOut output geometry type, must be specified
|
Chris@16
|
77 \tparam Geometry1 \tparam_geometry
|
Chris@16
|
78 \tparam Geometry2 \tparam_geometry
|
Chris@16
|
79 \tparam OutputIterator output iterator
|
Chris@16
|
80 \param geometry1 \param_geometry
|
Chris@16
|
81 \param geometry2 \param_geometry
|
Chris@16
|
82 \param out \param_out{difference}
|
Chris@16
|
83 \return \return_out
|
Chris@16
|
84
|
Chris@16
|
85 \qbk{[include reference/algorithms/difference_insert.qbk]}
|
Chris@16
|
86 */
|
Chris@16
|
87 template
|
Chris@16
|
88 <
|
Chris@16
|
89 typename GeometryOut,
|
Chris@16
|
90 typename Geometry1,
|
Chris@16
|
91 typename Geometry2,
|
Chris@101
|
92 typename RobustPolicy,
|
Chris@16
|
93 typename OutputIterator
|
Chris@16
|
94 >
|
Chris@16
|
95 inline OutputIterator difference_insert(Geometry1 const& geometry1,
|
Chris@101
|
96 Geometry2 const& geometry2,
|
Chris@101
|
97 RobustPolicy const& robust_policy,
|
Chris@101
|
98 OutputIterator out)
|
Chris@16
|
99 {
|
Chris@16
|
100 concept::check<Geometry1 const>();
|
Chris@16
|
101 concept::check<Geometry2 const>();
|
Chris@16
|
102 concept::check<GeometryOut>();
|
Chris@16
|
103
|
Chris@16
|
104 typedef strategy_intersection
|
Chris@16
|
105 <
|
Chris@16
|
106 typename cs_tag<GeometryOut>::type,
|
Chris@16
|
107 Geometry1,
|
Chris@16
|
108 Geometry2,
|
Chris@101
|
109 typename geometry::point_type<GeometryOut>::type,
|
Chris@101
|
110 RobustPolicy
|
Chris@16
|
111 > strategy;
|
Chris@16
|
112
|
Chris@16
|
113 return difference_insert<GeometryOut>(geometry1, geometry2,
|
Chris@101
|
114 robust_policy, out, strategy());
|
Chris@16
|
115 }
|
Chris@16
|
116
|
Chris@16
|
117
|
Chris@16
|
118 }} // namespace detail::difference
|
Chris@16
|
119 #endif // DOXYGEN_NO_DETAIL
|
Chris@16
|
120
|
Chris@16
|
121
|
Chris@16
|
122
|
Chris@16
|
123 /*!
|
Chris@16
|
124 \brief_calc2{difference}
|
Chris@16
|
125 \ingroup difference
|
Chris@16
|
126 \details \details_calc2{difference, spatial set theoretic difference}.
|
Chris@16
|
127 \tparam Geometry1 \tparam_geometry
|
Chris@16
|
128 \tparam Geometry2 \tparam_geometry
|
Chris@16
|
129 \tparam Collection \tparam_output_collection
|
Chris@16
|
130 \param geometry1 \param_geometry
|
Chris@16
|
131 \param geometry2 \param_geometry
|
Chris@16
|
132 \param output_collection the output collection
|
Chris@16
|
133
|
Chris@16
|
134 \qbk{[include reference/algorithms/difference.qbk]}
|
Chris@16
|
135 */
|
Chris@16
|
136 template
|
Chris@16
|
137 <
|
Chris@16
|
138 typename Geometry1,
|
Chris@16
|
139 typename Geometry2,
|
Chris@16
|
140 typename Collection
|
Chris@16
|
141 >
|
Chris@16
|
142 inline void difference(Geometry1 const& geometry1,
|
Chris@16
|
143 Geometry2 const& geometry2, Collection& output_collection)
|
Chris@16
|
144 {
|
Chris@16
|
145 concept::check<Geometry1 const>();
|
Chris@16
|
146 concept::check<Geometry2 const>();
|
Chris@16
|
147
|
Chris@16
|
148 typedef typename boost::range_value<Collection>::type geometry_out;
|
Chris@16
|
149 concept::check<geometry_out>();
|
Chris@16
|
150
|
Chris@101
|
151 typedef typename geometry::rescale_overlay_policy_type
|
Chris@101
|
152 <
|
Chris@101
|
153 Geometry1,
|
Chris@101
|
154 Geometry2
|
Chris@101
|
155 >::type rescale_policy_type;
|
Chris@101
|
156
|
Chris@101
|
157 rescale_policy_type robust_policy
|
Chris@101
|
158 = geometry::get_rescale_policy<rescale_policy_type>(geometry1, geometry2);
|
Chris@101
|
159
|
Chris@16
|
160 detail::difference::difference_insert<geometry_out>(
|
Chris@101
|
161 geometry1, geometry2, robust_policy,
|
Chris@16
|
162 std::back_inserter(output_collection));
|
Chris@16
|
163 }
|
Chris@16
|
164
|
Chris@16
|
165
|
Chris@16
|
166 }} // namespace boost::geometry
|
Chris@16
|
167
|
Chris@16
|
168
|
Chris@16
|
169 #endif // BOOST_GEOMETRY_ALGORITHMS_DIFFERENCE_HPP
|