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, 2014.
7 // Modifications copyright (c) 2013-2014 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);
213 test_geometry
<polygon
, polygon
>("poly_hole", "POLYGON((0 0,0 4,4 4,0 0))", "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", false);
216 test_geometry
<polygon
, polygon
>("poly_holes",
217 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
218 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))", true);
220 // Both having holes, outer equal, inner not equal
221 test_geometry
<polygon
, polygon
>("poly_uneq_holes",
222 "POLYGON((0 0,0 4,4 4,0 0),(1 1,2 1,2 2,1 2,1 1))",
223 "POLYGON((0 0,0 4,4 4,0 0),(2 2,3 2,3 3,2 3,2 2))", false);
225 // Both having 2 holes, equal but in different order
226 test_geometry
<polygon
, polygon
>("poly_holes_diff_order",
227 "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))",
228 "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);
230 // Both having 3 holes, equal but in different order
231 test_geometry
<polygon
, polygon
>("poly_holes_diff_order_3",
232 "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))",
233 "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);
236 test_geometry
<polygon
, ring
>("poly_sh2_pr", case_p1
, case_p1
, true);
237 test_geometry
<ring
, polygon
>("poly_sh2_rp", case_p1
, case_p1
, true);
240 test_geometry
<box
, ring
>("boxring1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
241 test_geometry
<ring
, box
>("boxring2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
242 test_geometry
<box
, polygon
>("boxpoly1", "BOX(1 1,2 2)", "POLYGON((1 1,1 2,2 2,2 1,1 1))", true);
243 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 2)", true);
245 test_geometry
<polygon
, box
>("boxpoly2", "POLYGON((1 1,1 2,2 2,2 1,1 1))", "BOX(1 1,2 3)", false);
247 test_geometry
<polygon
, polygon
>("poly_holes_shifted_points",
248 "POLYGON((0 0,0 3,3 3,3 0,0 0),(1 1,2 1,2 2,1 2,1 1))",
249 "POLYGON((0 0,0 3,3 3,3 0,0 0),(2 2,1 2,1 1,2 1,2 2))", true);
252 test_segment_segment
<P
>();
253 test_linestring_linestring
<P
>();
254 test_linestring_multilinestring
<P
>();
255 test_multilinestring_multilinestring
<P
>();
260 template <typename T
>
263 T dxn1
, dyn1
, dxn2
, dyn2
;
266 T x1
= "0", y1
= "0", x2
= "3", y2
= "3";
267 T dx
= x2
- x1
, dy
= y2
- y1
;
268 T mag
= sqrt(dx
* dx
+ dy
* dy
);
274 T x1
= "0", y1
= "0", x2
= "1", y2
= "1";
275 T dx
= x2
- x1
, dy
= y2
- y1
;
276 T mag
= sqrt(dx
* dx
+ dy
* dy
);
281 if (dxn1
== dxn2
&& dyn1
== dyn2
)
283 //std::cout << "vectors are equal, using ==" << std::endl;
285 if (boost::geometry::math::equals(dxn1
, dxn2
)
286 && boost::geometry::math::equals(dyn1
, dyn2
))
288 //std::cout << "vectors are equal, using bg::math::equals" << std::endl;
291 bool equals
= boost::geometry::math::equals_with_epsilon(dxn1
, dxn2
)
292 && boost::geometry::math::equals_with_epsilon(dyn1
, dyn2
);
296 //std::cout << "vectors are equal, using bg::math::equals_with_epsilon" << std::endl;
299 BOOST_CHECK_EQUAL(equals
, true);
303 int test_main( int , char* [] )
306 #if defined(HAVE_TTMATH)
307 verify
<ttmath_big
>();
310 test_all
<bg::model::d2::point_xy
<int> >();
311 test_all
<bg::model::d2::point_xy
<double> >();
313 #if defined(HAVE_TTMATH)
314 test_all
<bg::model::d2::point_xy
<ttmath_big
> >();