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-2021.
7 // Modifications copyright (c) 2013-2021 Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
10 // Use, modification and distribution is subject to the Boost Software License,
11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
14 #include "test_equals.hpp"
16 #include <boost/geometry/geometries/geometries.hpp>
17 #include <boost/geometry/geometries/point_xy.hpp>
20 namespace bgm
= bg::model
;
25 typedef bgm::multi_point
<P
> mpt
;
27 test_geometry
<P
, P
>("ptpt2d_1", "POINT(0 0)", "POINT(0 0)", true);
28 test_geometry
<P
, P
>("ptpt2d_2", "POINT(0 0)", "POINT(1 1)", false);
30 test_geometry
<P
, mpt
>("ptmpt2d_1", "POINT(0 0)", "MULTIPOINT(0 0)", true);
31 test_geometry
<P
, mpt
>("ptmpt2d_1", "POINT(0 0)", "MULTIPOINT(0 0, 1 1)", false);
33 test_geometry
<mpt
, P
>("mptpt2d_1", "MULTIPOINT(0 0)", "POINT(0 0)", true);
34 test_geometry
<mpt
, P
>("mptpt2d_1", "MULTIPOINT(0 0, 1 1)", "POINT(0 0)", false);
36 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(0 0, 1 1)", true);
37 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(0 0, 2 2)", false);
38 test_geometry
<mpt
, mpt
>("mptmpt2d_1", "MULTIPOINT(0 0, 1 1)", "MULTIPOINT(2 2, 3 3)", false);
42 void test_segment_segment()
44 typedef bgm::segment
<P
> seg
;
46 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(0 0, 3 3)", true);
47 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(3 3, 0 0)", true);
49 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(0 0, 1 1)", false);
50 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(3 3, 2 2)", false);
52 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(1 1, 4 4)", false);
53 test_geometry
<seg
, seg
>("seg2d_1", "LINESTRING(0 0, 3 3)", "LINESTRING(1 0, 2 0)", false);
57 void test_linestring_linestring()
59 using coord_t
= typename
bg::coordinate_type
<P
>::type
;
60 using ls
= bgm::linestring
<P
>;
62 test_geometry
<ls
, ls
>("ls2d_1", "LINESTRING(1 1, 3 3)", "LINESTRING(3 3, 1 1)", true);
63 test_geometry
<ls
, ls
>("ls2d_2", "LINESTRING(1 1, 3 3, 2 5)", "LINESTRING(1 1, 2 2, 3 3, 2 5)", true);
64 test_geometry
<ls
, ls
>("ls2d_3", "LINESTRING(1 0, 3 3, 2 5)", "LINESTRING(1 1, 2 2, 3 3, 2 5)", false);
65 test_geometry
<ls
, ls
>("ls2d_4", "LINESTRING(1 0, 3 3, 2 5)", "LINESTRING(1 1, 3 3, 2 5)", false);
66 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)",
67 "LINESTRING(0 5,15 5,15 10,5 10,5 0,10 0,10 15)", true);
68 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);
69 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);
70 test_geometry
<ls
, ls
>("ls2d_8", "LINESTRING(0 0,5 0,5 0,6 0)", "LINESTRING(0 0,6 0)", true);
72 test_geometry
<ls
, ls
>("ls2d_seg", "LINESTRING(1 1,2 2)", "LINESTRING(1 1,2 2)", true);
73 test_geometry
<ls
, ls
>("ls2d_rev", "LINESTRING(1 1,2 2)", "LINESTRING(2 2,1 1)", true);
75 test_geometry
<ls
, ls
>("ls2d_spike", "LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true);
77 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);
78 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);
79 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);
80 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);
82 // https://svn.boost.org/trac/boost/ticket/10904
83 if ( BOOST_GEOMETRY_CONDITION(std::is_floating_point
<coord_t
>::value
) )
85 test_geometry
<ls
, ls
>("ls2d_small1",
86 "LINESTRING(5.6956521739130430148634331999347 -0.60869565217391330413931882503675,5.5 -0.50000000000000066613381477509392)",
87 "LINESTRING(5.5 -0.50000000000000066613381477509392,5.5 -0.5)",
90 test_geometry
<ls
, ls
>("ls2d_small2",
91 "LINESTRING(-3.2333333333333333925452279800083 5.5999999999999978683717927196994,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
92 "LINESTRING(-3.2333333333333325043668082798831 5.5999999999999996447286321199499,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
98 void test_linestring_multilinestring()
100 typedef bgm::linestring
<P
> ls
;
101 typedef bgm::multi_linestring
<ls
> mls
;
103 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,1 0,2 0)", "MULTILINESTRING((0 0,2 0))", true);
104 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,1 0,2 0)", "MULTILINESTRING((0 0,1 0),(1 0,2 0))", true);
105 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);
106 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);
107 test_geometry
<ls
, mls
>("ls_mls_1", "LINESTRING(0 0,2 0,4 0)", "MULTILINESTRING((0 0,2 0),(3 0,4 0))", false);
109 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);
110 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);
112 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);
113 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);
114 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);
115 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);
118 template <typename P
>
119 void test_multilinestring_multilinestring()
121 typedef bgm::linestring
<P
> ls
;
122 typedef bgm::multi_linestring
<ls
> mls
;
124 test_geometry
<mls
, mls
>("ls_mls_mls",
125 "MULTILINESTRING((0 5,10 5,10 10,5 10),(5 10,5 0,5 2),(5 2,5 5,0 5))",
126 "MULTILINESTRING((5 5,0 5),(5 5,5 0),(10 10,10 5,5 5,5 10,10 10))",
130 template <typename P
>
133 typedef bg::model::polygon
<P
, true, true> poly_cw_c
;
134 typedef bg::model::polygon
<P
, true, false> poly_cw_o
;
135 typedef bg::model::polygon
<P
, false, true> poly_ccw_c
;
136 typedef bg::model::polygon
<P
, false, false> poly_ccw_o
;
137 typedef bg::model::box
<P
> box
;
139 std::string wkt1
= "POLYGON((-18 1, -23 1, -23 -3, -18 -3))";
140 std::string wkt2
= "POLYGON((-23 1, -23 -3, -18 -3, -18 1))";
142 test_geometry
<poly_cw_c
, poly_cw_c
>("polys_cw_c_cw_c", wkt1
, wkt2
, true, true);
143 test_geometry
<poly_cw_c
, poly_cw_o
>("polys_cw_c_cw_o", wkt1
, wkt2
, true, true);
144 test_geometry
<poly_cw_c
, poly_ccw_c
>("polys_cw_c_ccw_c", wkt1
, wkt2
, true, true);
145 test_geometry
<poly_cw_c
, poly_ccw_o
>("polys_cw_c_ccw_o", wkt1
, wkt2
, true, true);
146 test_geometry
<poly_cw_c
, box
>("polys_cw_c_box", wkt1
, wkt2
, true, true);
148 test_geometry
<poly_cw_o
, poly_cw_c
>("polys_cw_o_cw_c", wkt1
, wkt2
, true, true);
149 test_geometry
<poly_cw_o
, poly_cw_o
>("polys_cw_o_cw_o", wkt1
, wkt2
, true, true);
150 test_geometry
<poly_cw_o
, poly_ccw_c
>("polys_cw_o_ccw_c", wkt1
, wkt2
, true, true);
151 test_geometry
<poly_cw_o
, poly_ccw_o
>("polys_cw_o_ccw_o", wkt1
, wkt2
, true, true);
152 test_geometry
<poly_cw_o
, box
>("polys_cw_o_box", wkt1
, wkt2
, true, true);
154 test_geometry
<poly_ccw_c
, poly_cw_c
>("polys_ccw_c_cw_c", wkt1
, wkt2
, true, true);
155 test_geometry
<poly_ccw_c
, poly_cw_o
>("polys_ccw_c_cw_o", wkt1
, wkt2
, true, true);
156 test_geometry
<poly_ccw_c
, poly_ccw_c
>("polys_ccw_c_ccw_c", wkt1
, wkt2
, true, true);
157 test_geometry
<poly_ccw_c
, poly_ccw_o
>("polys_ccw_c_ccw_o", wkt1
, wkt2
, true, true);
158 test_geometry
<poly_ccw_c
, box
>("polys_cw_o_box", wkt1
, wkt2
, true, true);
160 test_geometry
<poly_ccw_o
, poly_cw_c
>("polys_ccw_o_cw_c", wkt1
, wkt2
, true, true);
161 test_geometry
<poly_ccw_o
, poly_cw_o
>("polys_ccw_o_cw_o", wkt1
, wkt2
, true, true);
162 test_geometry
<poly_ccw_o
, poly_ccw_c
>("polys_ccw_o_ccw_c", wkt1
, wkt2
, true, true);
163 test_geometry
<poly_ccw_o
, poly_ccw_o
>("polys_ccw_o_ccw_o", wkt1
, wkt2
, true, true);
164 test_geometry
<poly_ccw_o
, box
>("polys_ccw_o_box", wkt1
, wkt2
, true, true);
167 template <typename P
>
170 typedef bg::model::box
<P
> box
;
171 typedef bg::model::ring
<P
> ring
;
172 typedef bg::model::polygon
<P
> polygon
;
173 //typedef bg::model::linestring<P> linestring;
175 std::string case_p1
= "POLYGON((0 0,0 2,2 2,0 0))";
177 test_geometry
<P
, P
>("p1", "POINT(1 1)", "POINT(1 1)", true);
178 test_geometry
<P
, P
>("p2", "POINT(1 1)", "POINT(1 2)", false);
179 test_geometry
<box
, box
>("b1", "BOX(1 1,2 2)", "BOX(1 2,2 2)", false);
180 test_geometry
<box
, box
>("b1", "BOX(1 2,3 4)", "BOX(1 2,3 4)", true);
183 test_geometry
<ring
, ring
>("poly_eq", case_p1
, case_p1
, true);
186 test_geometry
<ring
, ring
>("poly_sh", "POLYGON((2 2,0 0,0 2,2 2))", case_p1
, true);
187 test_geometry
<polygon
, polygon
>("poly_sh2", case_p1
, "POLYGON((0 2,2 2,0 0,0 2))", true);
190 test_geometry
<ring
, ring
>("poly_extra", case_p1
, "POLYGON((0 0,0 2,2 2,1 1,0 0))", true);
192 // Shifted + extra (redundant) coordinate
193 test_geometry
<ring
, ring
>("poly_shifted_extra1", "POLYGON((2 2,1 1,0 0,0 2,2 2))", case_p1
, true);
195 // Shifted + extra (redundant) coordinate being first/last point
196 test_geometry
<ring
, ring
>("poly_shifted_extra2", "POLYGON((1 1,0 0,0 2,2 2,1 1))", case_p1
, true);
198 // Degenerate (duplicate) points
199 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);
201 // Two different bends, same area, unequal
202 test_geometry
<ring
, ring
>("poly_bends",
203 "POLYGON((4 0,5 3,8 4,7 7,4 8,0 4,4 0))",
204 "POLYGON((4 0,7 1,8 4,5 5,4 8,0 4,4 0))", false);
206 // Unequal (but same area)
207 test_geometry
<ring
, ring
>("poly_uneq", case_p1
, "POLYGON((1 1,1 3,3 3,1 1))", false);
209 // Note that POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))
210 // below is invalid. equals() returns different result than
211 // relate() with equals mask in this case because for areal
212 // geometries different algorithms is used, i.e. collect_vectors.
215 test_geometry
<polygon
, polygon
>("poly_hole",
216 "POLYGON((0 0,0 4,4 4,0 0))",
217 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", false);
220 test_geometry
<polygon
, polygon
>("poly_holes",
221 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
222 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", true);
224 // Both having holes, outer equal, inner not equal
225 test_geometry
<polygon
, polygon
>("poly_uneq_holes",
226 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
227 "POLYGON((0 0,0 4,4 4,0 0),(2 2,3 2,3 3,2 3,2 2))", false);
229 // Both having 2 holes, equal but in different order
230 test_geometry
<polygon
, polygon
>("poly_holes_diff_order",
231 "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))",
232 "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);
234 // Both having 3 holes, equal but in different order
235 test_geometry
<polygon
, polygon
>("poly_holes_diff_order_3",
236 "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))",
237 "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);
240 test_geometry
<polygon
, ring
>("poly_sh2_pr", case_p1
, case_p1
, true);
241 test_geometry
<ring
, polygon
>("poly_sh2_rp", case_p1
, case_p1
, true);
244 test_geometry
<box
, ring
>("boxring1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
245 test_geometry
<ring
, box
>("boxring2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
246 test_geometry
<box
, polygon
>("boxpoly1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
247 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
249 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 3)", false);
251 test_geometry
<polygon
, polygon
>("poly_holes_shifted_points",
252 "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,2 1,2 2,1 2,1 1))",
253 "POLYGON((0 0,0 3,3 3,3 0,0 0),(2 2,1 2,1 1,2 1,2 2))", true);
256 test_segment_segment
<P
>();
257 test_linestring_linestring
<P
>();
258 test_linestring_multilinestring
<P
>();
259 test_multilinestring_multilinestring
<P
>();
264 template <typename T
>
267 T dxn1
, dyn1
, dxn2
, dyn2
;
270 T x1
= "0", y1
= "0", x2
= "3", y2
= "3";
271 T dx
= x2
- x1
, dy
= y2
- y1
;
272 T mag
= sqrt(dx
* dx
+ dy
* dy
);
278 T x1
= "0", y1
= "0", x2
= "1", y2
= "1";
279 T dx
= x2
- x1
, dy
= y2
- y1
;
280 T mag
= sqrt(dx
* dx
+ dy
* dy
);
285 if (dxn1
== dxn2
&& dyn1
== dyn2
)
287 //std::cout << "vectors are equal, using ==" << std::endl;
289 if (boost::geometry::math::equals(dxn1
, dxn2
)
290 && boost::geometry::math::equals(dyn1
, dyn2
))
292 //std::cout << "vectors are equal, using bg::math::equals" << std::endl;
295 bool equals
= boost::geometry::math::equals_with_epsilon(dxn1
, dxn2
)
296 && boost::geometry::math::equals_with_epsilon(dyn1
, dyn2
);
300 //std::cout << "vectors are equal, using bg::math::equals_with_epsilon" << std::endl;
303 BOOST_CHECK_EQUAL(equals
, true);
307 int test_main( int , char* [] )
311 test_all
<bg::model::d2::point_xy
<int> >();
312 test_all
<bg::model::d2::point_xy
<double> >();