]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/overlay/assemble.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
4 // Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
6 // This file was modified by Oracle on 2019.
7 // Modifications copyright (c) 2019, Oracle and/or its affiliates.
9 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
11 // Use, modification and distribution is subject to the Boost Software License,
12 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
13 // http://www.boost.org/LICENSE_1_0.txt)
20 #include <geometry_test_common.hpp>
22 #include <boost/foreach.hpp>
24 #include <boost/geometry/algorithms/correct.hpp>
25 #include <boost/geometry/algorithms/intersection.hpp>
26 #include <boost/geometry/algorithms/union.hpp>
27 #include <boost/geometry/algorithms/difference.hpp>
28 #include <boost/geometry/algorithms/intersects.hpp>
29 #include <boost/geometry/algorithms/within.hpp>
30 #include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
32 #include <boost/geometry/geometries/geometries.hpp>
33 #include <boost/geometry/geometries/point_xy.hpp>
35 #include <boost/geometry/strategies/strategies.hpp>
37 #include <boost/geometry/io/wkt/read.hpp>
38 #include <boost/geometry/io/wkt/write.hpp>
42 #if defined(TEST_WITH_SVG)
43 # include <boost/geometry/io/svg/svg_mapper.hpp>
46 template <typename Geometry
>
47 inline void test_assemble(std::string
const& id
, Geometry
const& p
, Geometry
const& q
, char operation
= 'i')
49 std::vector
<Geometry
> u
, i
, d1
, d2
;
50 bg::detail::union_::union_insert
<Geometry
>(p
, q
, std::back_inserter(u
));
51 bg::detail::intersection::intersection_insert
<Geometry
>(p
, q
, std::back_inserter(i
));
52 bg::detail::difference::difference_insert
<Geometry
>(p
, q
, std::back_inserter(d1
));
53 bg::detail::difference::difference_insert
<Geometry
>(q
, p
, std::back_inserter(d2
));
57 typedef typename
bg::default_area_result
<Geometry
>::type type
;
58 type area_p
= bg::area(p
);
59 type area_q
= bg::area(q
);
61 type area_i
= 0, area_u
= 0, area_d1
= 0, area_d2
= 0;
63 BOOST_FOREACH(Geometry
const& g
, u
)
65 area_u
+= bg::area(g
);
67 BOOST_FOREACH(Geometry
const& g
, i
)
69 area_i
+= bg::area(g
);
71 BOOST_FOREACH(Geometry
const& g
, d1
)
73 area_d1
+= bg::area(g
);
75 BOOST_FOREACH(Geometry
const& g
, d2
)
77 area_d2
+= bg::area(g
);
80 type diff
= (area_p
+ area_q
) - area_u
- area_i
;
81 type diff_d1
= (area_u
- area_q
) - area_d1
;
82 type diff_d2
= (area_u
- area_p
) - area_d2
;
84 bool ok
= bg::math::abs(diff
) < 0.001
85 && bg::math::abs(diff_d1
) < 0.001
86 && bg::math::abs(diff_d2
) < 0.001;
88 BOOST_CHECK_MESSAGE(ok
,
95 #if defined(TEST_WITH_SVG)
97 std::ostringstream filename
;
98 filename
<< "assemble_" << id
<< "_" << operation
<< ".svg";
99 std::ofstream
svg(filename
.str().c_str());
101 bg::svg_mapper
<typename
bg::point_type
<Geometry
>::type
> mapper(svg
, 500, 500);
104 mapper
.map(p
, "fill-opacity:0.3;fill:rgb(51,51,153);stroke:rgb(51,51,153);stroke-width:3");
105 mapper
.map(q
, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:3");
106 std::string linestyle
= "opacity:0.7;fill:none;stroke-opacity:1;stroke-miterlimit:4;";
108 std::vector
<Geometry
> const& v
= operation
== 'i' ? i
109 : operation
== 'u' ? u
110 : operation
== 'd' ? d1
114 BOOST_FOREACH(Geometry
const& geometry
, v
)
117 linestyle
+ "stroke-width:3;stroke-linejoin:round;stroke-linecap:square;stroke-dasharray:12,12;stroke:rgb(255,0,0);");
123 template <typename Polygon
>
124 inline bool int_ok(Polygon
const& poly
)
127 typename
bg::point_type
<Polygon
>::type
const& pi
=
128 bg::interior_rings(poly
)[0].front();
130 return bg::within(pi
, bg::exterior_ring(poly
));
134 template <typename T
>
138 static std::string exteriors
[4] = {
139 "(0 0,0 10,10 10,10 0,0 0)",
140 "(1 1,1 9,8 9,8 1,1 1)",
141 "(2 0.5, 0.5 2,0.5 8,2 9.5,6 9.5,8.5 8,8.5 2,7 0.5,2 0.5)",
142 "(3 3,3 7,6 7,6 3,3 3)"
144 static std::string interiors
[4] = {
145 "(2 2,2 8,7 8,7 2,2 2)",
146 "(8.5 1,8.5 2,9.5 2,9.5 1,8.5 1)",
147 "(4 4,4 5,5 5,5 4,4 4)",
148 "(6 4,6 5,9 5,9 4,6 4)"
150 for (int pe
= 0; pe
< 4; pe
++)
152 for (int qe
= 0; qe
< 4; qe
++)
154 for (int pi
= 0; pi
< 4; pi
++)
156 for (int qi
= 0; qi
< 4; qi
++)
158 std::string ps
= "POLYGON(" + exteriors
[pe
] + "," + interiors
[pi
] + ")";
159 std::string qs
= "POLYGON(" + exteriors
[qe
] + "," + interiors
[qi
] + ")";
161 typedef bg::model::d2::point_xy
<T
> point_type
;
162 bg::model::polygon
<point_type
> p
, q
;
167 if (! bg::intersects(p
)
168 && ! bg::intersects(q
)
173 std::ostringstream out
;
174 out
<< pe
<< qe
<< pi
<< qi
;
175 test_assemble(out
.str(), p
, q
);
177 #if defined(TEST_WITH_SVG)
178 test_assemble(out
.str(), p
, q
, 'u');
179 test_assemble(out
.str(), p
, q
, 'd');
180 test_assemble(out
.str(), p
, q
, 'r');
190 #if ! defined(GEOMETRY_TEST_MULTI)
191 int test_main(int, char* [])