• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
4 // Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
5 
6 // This file was modified by Oracle on 2013, 2015, 2016.
7 // Modifications copyright (c) 2013-2016, Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9 
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)
13 
14 #include "test_intersects.hpp"
15 
16 
17 #include <boost/geometry/geometries/geometries.hpp>
18 #include <boost/geometry/geometries/point_xy.hpp>
19 
20 #include <boost/geometry/util/rational.hpp>
21 
22 template <typename P1, typename P2>
test_intersects_polygon_polygon()23 void test_intersects_polygon_polygon()
24 {
25     typedef bg::model::polygon<P1, false, false> poly_ccw_o1;
26     typedef bg::model::polygon<P2, false, false> poly_ccw_o2;
27     test_geometry<poly_ccw_o1, poly_ccw_o2>("POLYGON((1 1, 3 3, 2 5))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
28     test_geometry<poly_ccw_o1, poly_ccw_o2>("POLYGON((6 6, 7 6, 7 7, 6 7))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", false);
29     test_geometry<poly_ccw_o1, poly_ccw_o2>("POLYGON((7 7, 9 7, 9 9, 7 9))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
30 }
31 
32 template <typename P1, typename P2>
test_intersects_linestring_segment()33 void test_intersects_linestring_segment()
34 {
35     typedef bg::model::linestring<P1> ls;
36     typedef bg::model::segment<P2> seg;
37 
38     test_geometry<ls, seg>("LINESTRING(1 1, 3 3, 2 5)", "SEGMENT(2 0, 2 6)", true);
39     test_geometry<ls, seg>("LINESTRING(1 1, 3 3)", "SEGMENT(1 0, 1 1)", true);
40     test_geometry<ls, seg>("LINESTRING(1 1, 3 3)", "SEGMENT(2 0, 2 2)", true);
41     test_geometry<ls, seg>("LINESTRING(1 1, 3 3)", "SEGMENT(3 0, 4 1)", false);
42 }
43 
44 template <typename P1, typename P2>
test_intersects_linestring_linestring()45 void test_intersects_linestring_linestring()
46 {
47     typedef bg::model::linestring<P1> ls1;
48     typedef bg::model::linestring<P2> ls2;
49 
50     test_geometry<ls1, ls2>("LINESTRING(0 0,2 0,3 0)", "LINESTRING(0 0,1 1,2 2)", true);
51     test_geometry<ls1, ls2>("LINESTRING(0 0,2 0,3 0)", "LINESTRING(2 2,1 1,0 0)", true);
52     test_geometry<ls1, ls2>("LINESTRING(3 0,2 0,0 0)", "LINESTRING(0 0,1 1,2 2)", true);
53     test_geometry<ls1, ls2>("LINESTRING(3 0,2 0,0 0)", "LINESTRING(2 2,1 1,0 0)", true);
54 
55     test_geometry<ls1, ls2>("LINESTRING(0 0,2 0,3 0)", "LINESTRING(1 0,4 0,5 0)", true);
56     test_geometry<ls1, ls2>("LINESTRING(1 0,2 0)", "LINESTRING(1 0,0 0)", true);
57 }
58 
59 template <typename P1, typename P2>
test_intersects_linestring_polygon()60 void test_intersects_linestring_polygon()
61 {
62     typedef bg::model::linestring<P1> ls;
63     typedef bg::model::multi_linestring<ls> mls;
64     typedef bg::model::polygon<P2> poly_cw_c;
65     typedef bg::model::polygon<P2, false> poly_ccw_c;
66     typedef bg::model::polygon<P2, false, false> poly_ccw_o;
67     typedef bg::model::multi_polygon<poly_ccw_c> mpoly_ccw_c;
68 
69     test_geometry<ls, poly_ccw_c>("LINESTRING(1 1,2 2)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", true);
70     test_geometry<ls, poly_ccw_c>("LINESTRING(1 0,2 2)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", true);
71     test_geometry<ls, poly_ccw_c>("LINESTRING(11 0,12 12)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", false);
72 
73     test_geometry<ls, poly_ccw_o>("LINESTRING(1 1, 3 3, 2 5)", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
74     test_geometry<ls, poly_ccw_o>("LINESTRING(6 6, 7 6, 7 7, 6 7)", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", false);
75     test_geometry<ls, poly_ccw_o>("LINESTRING(7 7, 9 7, 9 9, 7 9)", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
76 
77     test_geometry<poly_cw_c, ls>("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))", "LINESTRING(-2 -2, 12 7)", true);
78     test_geometry<poly_cw_c, ls>("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))", "LINESTRING(5 5, 15 4)", true);
79     test_geometry<poly_cw_c, ls>("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))", "LINESTRING(7 6, 15 4)", true);
80     test_geometry<poly_cw_c, ls>("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))", "LINESTRING(6 2, 12 1)", true);
81 
82     // MULTI
83     test_geometry<ls, mpoly_ccw_c>("LINESTRING(1 1,2 2)", "MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)))", true);
84     test_geometry<mls, mpoly_ccw_c>("MULTILINESTRING((1 1,2 2))", "MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)))", true);
85 }
86 
87 template <typename P1, typename P2>
test_intersects_linestring_ring()88 void test_intersects_linestring_ring()
89 {
90     typedef bg::model::linestring<P1> ls;
91     typedef bg::model::multi_linestring<ls> mls;
92     typedef bg::model::ring<P2, false> ring_ccw_c;
93 
94     test_geometry<ls, ring_ccw_c>("LINESTRING(1 1,2 2)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", true);
95     test_geometry<ls, ring_ccw_c>("LINESTRING(1 0,2 2)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", true);
96     test_geometry<ls, ring_ccw_c>("LINESTRING(11 0,12 12)", "POLYGON((0 0,10 0,10 10,0 10,0 0))", false);
97 
98     // MULTI
99     test_geometry<mls, ring_ccw_c>("MULTILINESTRING((1 1,2 2))", "POLYGON((0 0,10 0,10 10,0 10,0 0))", true);
100 }
101 
102 template <typename P1, typename P2>
test_intersects_ring_polygon()103 void test_intersects_ring_polygon()
104 {
105     typedef bg::model::ring<P1, false, false> ring_ccw_o;
106     typedef bg::model::polygon<P2, false, false> poly_ccw_o;
107 
108     test_geometry<ring_ccw_o, poly_ccw_o>("POLYGON((1 1, 3 3, 2 5))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
109     test_geometry<ring_ccw_o, poly_ccw_o>("POLYGON((6 6, 7 6, 7 7, 6 7))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", false);
110     test_geometry<ring_ccw_o, poly_ccw_o>("POLYGON((7 7, 9 7, 9 9, 7 9))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", true);
111 
112     test_geometry<ring_ccw_o, poly_ccw_o>("POLYGON((6 6,7 6,7 7,6 7))", "POLYGON((0 0, 9 0, 9 9, 0 9),(5 5,5 8,8 8,8 5))", false);
113 }
114 
115 template <typename P1, typename P2>
test_intersects_point_linestring()116 void test_intersects_point_linestring()
117 {
118     typedef bg::model::linestring<P2> ls;
119     typedef bg::model::multi_linestring<ls> mls;
120 
121     test_geometry<P1, ls>("POINT(0 0)", "LINESTRING(0 0,2 2,4 0)", true);
122     test_geometry<P1, ls>("POINT(1 1)", "LINESTRING(0 0,2 2,4 0)", true);
123     test_geometry<P1, ls>("POINT(1 0)", "LINESTRING(0 0,2 2,4 0)", false);
124 
125     // MULTI
126     test_geometry<P1, mls>("POINT(0 0)", "MULTILINESTRING((0 0,2 2,4 0))", true);
127 }
128 
129 template <typename P1, typename P2>
test_intersects_point_segment()130 void test_intersects_point_segment()
131 {
132     typedef bg::model::segment<P2> seg;
133 
134     test_geometry<P1, seg>("POINT(0 0)", "LINESTRING(0 0,2 2)", true);
135     test_geometry<P1, seg>("POINT(1 1)", "LINESTRING(0 0,2 2)", true);
136     test_geometry<P1, seg>("POINT(1 0)", "LINESTRING(0 0,2 2)", false);
137 }
138 
139 template <typename P1, typename P2>
test_multi_linestring_polygon()140 void test_multi_linestring_polygon()
141 {
142     typedef bg::model::linestring<P1> ls;
143     typedef bg::model::multi_linestring<ls> mls;
144     typedef bg::model::polygon<P2> poly;
145 
146     test_geometry<mls, poly>("MULTILINESTRING((11 11, 20 20),(5 7, 4 1))",
147                              "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2))",
148                              true);
149     test_geometry<mls, poly>("MULTILINESTRING((10 0, 18 12),(2 2,2 1))",
150                              "POLYGON((5 0,0 -5,-5 0,0 5,5 0))",
151                              true);
152 }
153 
154 template <typename P1, typename P2>
test_multi_polygon_polygon()155 void test_multi_polygon_polygon()
156 {
157     typedef bg::model::polygon<P1> poly1;
158     typedef bg::model::multi_polygon<poly1> mpoly;
159     typedef bg::model::polygon<P2> poly2;
160 
161     test_geometry<mpoly, poly2>("MULTIPOLYGON(((11 11,11 20,20 20,20 11,11 11)),((5 5,5 6,6 6,6 5,5 5)))",
162                                 "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2))",
163                                 true);
164 }
165 
166 template <typename P1, typename P2>
test_point_polygon()167 void test_point_polygon()
168 {
169     typedef bg::model::ring<P2> ring;
170     typedef bg::model::polygon<P2> poly;
171 
172     test_geometry<P1, ring>(
173         "POINT(0 0)",
174         "POLYGON((0 0,3 3,3 3,4 1))",
175         true);
176     test_geometry<P1, poly>(
177         "POINT(0 0)",
178         "POLYGON((0 0,3 3,3 3,4 1))",
179         true);
180 
181     test_geometry<ring, P1>(
182         "POLYGON((0 0,3 3,3 3,4 1))",
183         "POINT(0 0)",
184         true);
185     test_geometry<poly, P1>(
186         "POLYGON((0 0,3 3,3 3,4 1))",
187         "POINT(0 0)",
188         true);
189 }
190 
191 template <typename P1, typename P2>
test_all()192 void test_all()
193 {
194     test_intersects_point_segment<P1, P2>();
195     test_intersects_point_linestring<P1, P2>();
196     test_intersects_polygon_polygon<P1, P2>();
197     test_intersects_linestring_polygon<P1, P2>();
198     test_intersects_linestring_ring<P1, P2>();
199     test_intersects_linestring_segment<P1, P2>();
200     test_intersects_linestring_linestring<P1, P2>();
201     test_intersects_ring_polygon<P1, P2>();
202     test_multi_linestring_polygon<P1, P2>();
203     test_multi_polygon_polygon<P1, P2>();
204     test_point_polygon<P1, P2>();
205 }
206 
207 template <typename P>
test_all()208 void test_all()
209 {
210     test_all<P, P>();
211 }
212 
test_main(int,char * [])213 int test_main( int , char* [] )
214 {
215     test_all<bg::model::d2::point_xy<double> >();
216     test_all<bg::model::d2::point_xy<double>, bg::model::point<double, 2, bg::cs::cartesian> >();
217 
218 #if ! defined(BOOST_GEOMETRY_RESCALE_TO_ROBUST)
219     test_all<bg::model::d2::point_xy<boost::rational<int> > >();
220 #endif
221 
222 #if defined(HAVE_TTMATH)
223     test_all<bg::model::d2::point_xy<ttmath_big> >();
224 #endif
225 
226     return 0;
227 }
228