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