1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 // Copyright (c) 2017 Adam Wulkiewicz, Lodz, Poland.
6 // This file was modified by Oracle on 2013-2020.
7 // Modifications copyright (c) 2013-2020 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)
15 #include "test_equals.hpp"
17 #include <boost/type_traits/is_floating_point.hpp>
19 #include <boost/geometry/geometries/geometries.hpp>
20 #include <boost/geometry/geometries/point_xy.hpp>
23 namespace bgm
= bg::model
;
28 typedef bgm::multi_point
<P
> mpt
;
30 test_geometry
<P
, P
>("ptpt2d_1", "POINT(0 0)", "POINT(0 0)", true);
31 test_geometry
<P
, P
>("ptpt2d_2", "POINT(0 0)", "POINT(1 1)", false);
33 test_geometry
<P
, mpt
>("ptmpt2d_1", "POINT(0 0)", "MULTIPOINT(0 0)", true);
34 test_geometry
<P
, mpt
>("ptmpt2d_1", "POINT(0 0)", "MULTIPOINT(0 0, 1 1)", false);
36 test_geometry
<mpt
, P
>("mptpt2d_1", "MULTIPOINT(0 0)", "POINT(0 0)", true);
37 test_geometry
<mpt
, P
>("mptpt2d_1", "MULTIPOINT(0 0, 1 1)", "POINT(0 0)", false);
39 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(0 0, 1 1)", true);
40 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(0 0, 2 2)", false);
41 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(2 2, 3 3)", false);
45 void test_segment_segment()
47 typedef bgm::segment
<P
> seg
;
49 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(0 0, 3 3)", true);
50 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(3 3, 0 0)", true);
52 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(0 0, 1 1)", false);
53 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(3 3, 2 2)", false);
55 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(1 1, 4 4)", false);
56 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(1 0, 2 0)", false);
60 void test_linestring_linestring()
62 typedef bgm::linestring
<P
> ls
;
64 test_geometry
<ls
, ls
>("ls2d_1", "LINESTRING(1 1, 3 3)", "LINESTRING(3 3, 1 1)", true);
65 test_geometry
<ls
, ls
>("ls2d_2", "LINESTRING(1 1, 3 3, 2 5)", "LINESTRING(1 1, 2 2, 3 3, 2 5)", true);
66 test_geometry
<ls
, ls
>("ls2d_3", "LINESTRING(1 0, 3 3, 2 5)", "LINESTRING(1 1, 2 2, 3 3, 2 5)", false);
67 test_geometry
<ls
, ls
>("ls2d_4", "LINESTRING(1 0, 3 3, 2 5)", "LINESTRING(1 1, 3 3, 2 5)", false);
68 test_geometry
<ls
, ls
>("ls2d_5", "LINESTRING(0 5,5 5,10 5,10 0,5 0,5 5,5 10,10 10,15 10,15 5,10 5,10 10,10 15)",
69 "LINESTRING(0 5,15 5,15 10,5 10,5 0,10 0,10 15)", true);
70 test_geometry
<ls
, ls
>("ls2d_6", "LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,5 0)", "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", true);
71 test_geometry
<ls
, ls
>("ls2d_7", "LINESTRING(0 5,10 5,10 10,5 10,5 0)", "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", true);
72 test_geometry
<ls
, ls
>("ls2d_8", "LINESTRING(0 0,5 0,5 0,6 0)", "LINESTRING(0 0,6 0)", true);
74 test_geometry
<ls
, ls
>("ls2d_seg", "LINESTRING(1 1,2 2)", "LINESTRING(1 1,2 2)", true);
75 test_geometry
<ls
, ls
>("ls2d_rev", "LINESTRING(1 1,2 2)", "LINESTRING(2 2,1 1)", true);
77 test_geometry
<ls
, ls
>("ls2d_spike", "LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true);
79 test_geometry
<ls
, ls
>("ls2d_ring1", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "LINESTRING(5 5,0 5,0 0,5 0,5 5)", true);
80 test_geometry
<ls
, ls
>("ls2d_ring2", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "LINESTRING(5 5,5 0,0 0,0 5,5 5)", true);
81 test_geometry
<ls
, ls
>("ls2d_overl_ring1", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "LINESTRING(5 5,0 5,0 0,5 0,5 5,0 5)", true);
82 test_geometry
<ls
, ls
>("ls2d_overl_ring2", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "LINESTRING(5 5,5 0,0 0,0 5,5 5,5 0)", true);
84 // https://svn.boost.org/trac/boost/ticket/10904
85 if ( BOOST_GEOMETRY_CONDITION(
86 boost::is_floating_point
<typename
bg::coordinate_type
<ls
>::type
>::value
) )
88 test_geometry
<ls
, ls
>("ls2d_small1",
89 "LINESTRING(5.6956521739130430148634331999347 -0.60869565217391330413931882503675,5.5 -0.50000000000000066613381477509392)",
90 "LINESTRING(5.5 -0.50000000000000066613381477509392,5.5 -0.5)",
93 test_geometry
<ls
, ls
>("ls2d_small2",
94 "LINESTRING(-3.2333333333333333925452279800083 5.5999999999999978683717927196994,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
95 "LINESTRING(-3.2333333333333325043668082798831 5.5999999999999996447286321199499,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
100 template <typename P
>
101 void test_linestring_multilinestring()
103 typedef bgm::linestring
<P
> ls
;
104 typedef bgm::multi_linestring
<ls
> mls
;
106 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,1 0,2 0)", "MULTILINESTRING((0 0,2 0))", true);
107 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,1 0,2 0)", "MULTILINESTRING((0 0,1 0),(1 0,2 0))", true);
108 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,2 0,4 0)", "MULTILINESTRING((0 0,2 0),(2 0,3 0),(3 0,4 0))", true);
109 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,2 0,4 0)", "MULTILINESTRING((0 0,2 0),(2 0,3 0),(2 0,3 0),(3 0,4 0))", true);
110 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,2 0,4 0)", "MULTILINESTRING((0 0,2 0),(3 0,4 0))", false);
112 test_geometry
<ls
, mls
>("ls_mls_spike", "LINESTRING(0 0,2 0,2 2,2 0,4 0)", "MULTILINESTRING((0 0,4 0),(2 2,2 0))", true);
113 test_geometry
<ls
, mls
>("ls_mls_spike", "LINESTRING(0 0,2 0,2 2,2 0,4 0)", "MULTILINESTRING((0 0,4 0),(2 2,2 -1))", false);
115 test_geometry
<ls
, mls
>("ls_mls_ring1", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5))", true);
116 test_geometry
<ls
, mls
>("ls_mls_ring2", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5))", true);
117 test_geometry
<ls
, mls
>("ls_mls_overl_ring1", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5,0 5))", true);
118 test_geometry
<ls
, mls
>("ls_mls_overl_ring2", "LINESTRING(0 0,5 0,5 5,0 5,0 0)", "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5,5 0))", true);
121 template <typename P
>
122 void test_multilinestring_multilinestring()
124 typedef bgm::linestring
<P
> ls
;
125 typedef bgm::multi_linestring
<ls
> mls
;
127 test_geometry
<mls
, mls
>("ls_mls_mls",
128 "MULTILINESTRING((0 5,10 5,10 10,5 10),(5 10,5 0,5 2),(5 2,5 5,0 5))",
129 "MULTILINESTRING((5 5,0 5),(5 5,5 0),(10 10,10 5,5 5,5 10,10 10))",
133 template <typename P
>
136 typedef bg::model::polygon
<P
, true, true> poly_cw_c
;
137 typedef bg::model::polygon
<P
, true, false> poly_cw_o
;
138 typedef bg::model::polygon
<P
, false, true> poly_ccw_c
;
139 typedef bg::model::polygon
<P
, false, false> poly_ccw_o
;
140 typedef bg::model::box
<P
> box
;
142 std::string wkt1
= "POLYGON((-18 1, -23 1, -23 -3, -18 -3))";
143 std::string wkt2
= "POLYGON((-23 1, -23 -3, -18 -3, -18 1))";
145 test_geometry
<poly_cw_c
, poly_cw_c
>("polys_cw_c_cw_c", wkt1
, wkt2
, true, true);
146 test_geometry
<poly_cw_c
, poly_cw_o
>("polys_cw_c_cw_o", wkt1
, wkt2
, true, true);
147 test_geometry
<poly_cw_c
, poly_ccw_c
>("polys_cw_c_ccw_c", wkt1
, wkt2
, true, true);
148 test_geometry
<poly_cw_c
, poly_ccw_o
>("polys_cw_c_ccw_o", wkt1
, wkt2
, true, true);
149 test_geometry
<poly_cw_c
, box
>("polys_cw_c_box", wkt1
, wkt2
, true, true);
151 test_geometry
<poly_cw_o
, poly_cw_c
>("polys_cw_o_cw_c", wkt1
, wkt2
, true, true);
152 test_geometry
<poly_cw_o
, poly_cw_o
>("polys_cw_o_cw_o", wkt1
, wkt2
, true, true);
153 test_geometry
<poly_cw_o
, poly_ccw_c
>("polys_cw_o_ccw_c", wkt1
, wkt2
, true, true);
154 test_geometry
<poly_cw_o
, poly_ccw_o
>("polys_cw_o_ccw_o", wkt1
, wkt2
, true, true);
155 test_geometry
<poly_cw_o
, box
>("polys_cw_o_box", wkt1
, wkt2
, true, true);
157 test_geometry
<poly_ccw_c
, poly_cw_c
>("polys_ccw_c_cw_c", wkt1
, wkt2
, true, true);
158 test_geometry
<poly_ccw_c
, poly_cw_o
>("polys_ccw_c_cw_o", wkt1
, wkt2
, true, true);
159 test_geometry
<poly_ccw_c
, poly_ccw_c
>("polys_ccw_c_ccw_c", wkt1
, wkt2
, true, true);
160 test_geometry
<poly_ccw_c
, poly_ccw_o
>("polys_ccw_c_ccw_o", wkt1
, wkt2
, true, true);
161 test_geometry
<poly_ccw_c
, box
>("polys_cw_o_box", wkt1
, wkt2
, true, true);
163 test_geometry
<poly_ccw_o
, poly_cw_c
>("polys_ccw_o_cw_c", wkt1
, wkt2
, true, true);
164 test_geometry
<poly_ccw_o
, poly_cw_o
>("polys_ccw_o_cw_o", wkt1
, wkt2
, true, true);
165 test_geometry
<poly_ccw_o
, poly_ccw_c
>("polys_ccw_o_ccw_c", wkt1
, wkt2
, true, true);
166 test_geometry
<poly_ccw_o
, poly_ccw_o
>("polys_ccw_o_ccw_o", wkt1
, wkt2
, true, true);
167 test_geometry
<poly_ccw_o
, box
>("polys_ccw_o_box", wkt1
, wkt2
, true, true);
170 template <typename P
>
173 typedef bg::model::box
<P
> box
;
174 typedef bg::model::ring
<P
> ring
;
175 typedef bg::model::polygon
<P
> polygon
;
176 //typedef bg::model::linestring<P> linestring;
178 std::string case_p1
= "POLYGON((0 0,0 2,2 2,0 0))";
180 test_geometry
<P
, P
>("p1", "POINT(1 1)", "POINT(1 1)", true);
181 test_geometry
<P
, P
>("p2", "POINT(1 1)", "POINT(1 2)", false);
182 test_geometry
<box
, box
>("b1", "BOX(1 1,2 2)", "BOX(1 2,2 2)", false);
183 test_geometry
<box
, box
>("b1", "BOX(1 2,3 4)", "BOX(1 2,3 4)", true);
186 test_geometry
<ring
, ring
>("poly_eq", case_p1
, case_p1
, true);
189 test_geometry
<ring
, ring
>("poly_sh", "POLYGON((2 2,0 0,0 2,2 2))", case_p1
, true);
190 test_geometry
<polygon
, polygon
>("poly_sh2", case_p1
, "POLYGON((0 2,2 2,0 0,0 2))", true);
193 test_geometry
<ring
, ring
>("poly_extra", case_p1
, "POLYGON((0 0,0 2,2 2,1 1,0 0))", true);
195 // Shifted + extra (redundant) coordinate
196 test_geometry
<ring
, ring
>("poly_shifted_extra1", "POLYGON((2 2,1 1,0 0,0 2,2 2))", case_p1
, true);
198 // Shifted + extra (redundant) coordinate being first/last point
199 test_geometry
<ring
, ring
>("poly_shifted_extra2", "POLYGON((1 1,0 0,0 2,2 2,1 1))", case_p1
, true);
201 // Degenerate (duplicate) points
202 test_geometry
<ring
, ring
>("poly_degenerate", "POLYGON((0 0,0 2,2 2,2 2,0 0))", "POLYGON((0 0,0 2,0 2,2 2,0 0))", true);
204 // Two different bends, same area, unequal
205 test_geometry
<ring
, ring
>("poly_bends",
206 "POLYGON((4 0,5 3,8 4,7 7,4 8,0 4,4 0))",
207 "POLYGON((4 0,7 1,8 4,5 5,4 8,0 4,4 0))", false);
209 // Unequal (but same area)
210 test_geometry
<ring
, ring
>("poly_uneq", case_p1
, "POLYGON((1 1,1 3,3 3,1 1))", false);
212 // Note that POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))
213 // below is invalid. equals() returns different result than
214 // relate() with equals mask in this case because for areal
215 // geometries different algorithms is used, i.e. collect_vectors.
218 test_geometry
<polygon
, polygon
>("poly_hole",
219 "POLYGON((0 0,0 4,4 4,0 0))",
220 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", false);
223 test_geometry
<polygon
, polygon
>("poly_holes",
224 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
225 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", true);
227 // Both having holes, outer equal, inner not equal
228 test_geometry
<polygon
, polygon
>("poly_uneq_holes",
229 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
230 "POLYGON((0 0,0 4,4 4,0 0),(2 2,3 2,3 3,2 3,2 2))", false);
232 // Both having 2 holes, equal but in different order
233 test_geometry
<polygon
, polygon
>("poly_holes_diff_order",
234 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1),(2 2,3 2,3 3,2 3,2 2))",
235 "POLYGON((0 0,0 4,4 4,0 0),(2 2,3 2,3 3,2 3,2 2),(1 1,2 1,2 2,1 2,1 1))", true);
237 // Both having 3 holes, equal but in different order
238 test_geometry
<polygon
, polygon
>("poly_holes_diff_order_3",
239 "POLYGON((0 0,0 10,10 10,0 0),(1 1,2 1,2 2,1 2,1 1),(4 1,5 1,5 2,4 2,4 1),(2 2,3 2,3 3,2 3,2 2))",
240 "POLYGON((0 0,0 10,10 10,0 0),(4 1,5 1,5 2,4 2,4 1),(2 2,3 2,3 3,2 3,2 2),(1 1,2 1,2 2,1 2,1 1))", true);
243 test_geometry
<polygon
, ring
>("poly_sh2_pr", case_p1
, case_p1
, true);
244 test_geometry
<ring
, polygon
>("poly_sh2_rp", case_p1
, case_p1
, true);
247 test_geometry
<box
, ring
>("boxring1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
248 test_geometry
<ring
, box
>("boxring2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
249 test_geometry
<box
, polygon
>("boxpoly1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
250 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
252 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 3)", false);
254 test_geometry
<polygon
, polygon
>("poly_holes_shifted_points",
255 "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,2 1,2 2,1 2,1 1))",
256 "POLYGON((0 0,0 3,3 3,3 0,0 0),(2 2,1 2,1 1,2 1,2 2))", true);
259 test_segment_segment
<P
>();
260 test_linestring_linestring
<P
>();
261 test_linestring_multilinestring
<P
>();
262 test_multilinestring_multilinestring
<P
>();
267 template <typename T
>
270 T dxn1
, dyn1
, dxn2
, dyn2
;
273 T x1
= "0", y1
= "0", x2
= "3", y2
= "3";
274 T dx
= x2
- x1
, dy
= y2
- y1
;
275 T mag
= sqrt(dx
* dx
+ dy
* dy
);
281 T x1
= "0", y1
= "0", x2
= "1", y2
= "1";
282 T dx
= x2
- x1
, dy
= y2
- y1
;
283 T mag
= sqrt(dx
* dx
+ dy
* dy
);
288 if (dxn1
== dxn2
&& dyn1
== dyn2
)
290 //std::cout << "vectors are equal, using ==" << std::endl;
292 if (boost::geometry::math::equals(dxn1
, dxn2
)
293 && boost::geometry::math::equals(dyn1
, dyn2
))
295 //std::cout << "vectors are equal, using bg::math::equals" << std::endl;
298 bool equals
= boost::geometry::math::equals_with_epsilon(dxn1
, dxn2
)
299 && boost::geometry::math::equals_with_epsilon(dyn1
, dyn2
);
303 //std::cout << "vectors are equal, using bg::math::equals_with_epsilon" << std::endl;
306 BOOST_CHECK_EQUAL(equals
, true);
310 int test_main( int , char* [] )
314 test_all
<bg::model::d2::point_xy
<int> >();
315 test_all
<bg::model::d2::point_xy
<double> >();