1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3
4 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
5 // Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
6 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
7 // Copyright (c) 2013-2017 Adam Wulkiewicz, Lodz, Poland.
8
9 // This file was modified by Oracle on 2014, 2015.
10 // Modifications copyright (c) 2014-2015 Oracle and/or its affiliates.
11
12 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
13
14 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
15 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
16
17 // Use, modification and distribution is subject to the Boost Software License,
18 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
19 // http://www.boost.org/LICENSE_1_0.txt)
20
21 // Instead of having a separate (and nearly similar) unit test to test multipolygons,
22 // we now include them here and compile them by default. Only undefining the next line
23 // will avoid testing multi-geometries
24 #define BOOST_GEOMETRY_UNIT_TEST_MULTI
25
26 #include <geometry_test_common.hpp>
27
28 // The include to test
29 #include <boost/geometry/algorithms/point_on_surface.hpp>
30
31 // Helper includes
32 #include <boost/geometry/algorithms/correct.hpp>
33 #include <boost/geometry/algorithms/within.hpp>
34 #include <boost/geometry/io/wkt/wkt.hpp>
35 #include <boost/geometry/strategies/strategies.hpp>
36
37 #include <boost/geometry/geometries/geometries.hpp>
38 #include <boost/geometry/geometries/point_xy.hpp>
39
40 // Include from unit tests
41 #include <algorithms/test_overlay.hpp>
42 #include <algorithms/predef_relop.hpp>
43 #include <algorithms/overlay/overlay_cases.hpp>
44
45 #if defined(BOOST_GEOMETRY_UNIT_TEST_MULTI)
46 # include <boost/geometry/algorithms/detail/extreme_points.hpp>
47 #endif
48
49
50 #if defined(TEST_WITH_SVG)
51 # include <boost/geometry/io/svg/svg_mapper.hpp>
52 #endif
53
54 template <typename Geometry>
test_geometry(std::string const & case_id,Geometry const & geometry,double=0,double=0)55 void test_geometry(std::string const& case_id, Geometry const& geometry, double /*expected_x*/ = 0, double /*expected_y*/ = 0)
56 {
57 //std::cout << case_id << std::endl;
58 typedef typename bg::point_type<Geometry>::type point_type;
59
60 point_type point;
61 bg::point_on_surface(geometry, point);
62
63 BOOST_CHECK_MESSAGE(bg::within(point, geometry),
64 case_id << " generated point_on_surface (dim 1) is not within geometry");
65
66 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
67 // For the algorithm we also check generation in the other dimension
68 point_type right_point;
69 bg::detail::point_on_surface::calculate_point_on_surface<0>(geometry, right_point);
70
71 BOOST_CHECK_MESSAGE(bg::within(right_point, geometry),
72 case_id << " generated point_on_surface (dim 0) is not within geometry");
73
74 point_type returned_point = bg::return_point_on_surface(geometry);
75 #endif
76
77 #if defined(TEST_WITH_SVG)
78 {
79 std::ostringstream filename;
80 filename << "point_on_surface_" << case_id << "_"
81 << string_from_type<typename bg::coordinate_type<Geometry>::type>::name()
82 << ".svg";
83
84 std::ofstream svg(filename.str().c_str());
85
86 // To map the intermediate products:
87 bg::model::linestring<point_type> top_points;
88 typedef bg::model::linestring<point_type> intruder_type;
89 std::vector<intruder_type> top_intruders;
90 bg::extreme_points<1>(geometry, top_points, top_intruders);
91
92 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
93 bg::model::linestring<point_type> right_points;
94 std::vector<bg::model::linestring<point_type> > right_intruders;
95 bg::extreme_points<0>(geometry, right_points, right_intruders);
96 #endif
97
98 bg::svg_mapper<point_type> mapper(svg, 500, 500);
99 mapper.add(geometry);
100 mapper.map(geometry, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:1");
101
102 // Top (red/magenta)
103 mapper.map(top_points, "stroke:rgb(255,0,0);stroke-width:2");
104 BOOST_FOREACH(intruder_type const& intruder, top_intruders)
105 {
106 mapper.map(intruder, "stroke:rgb(255,0,255);stroke-width:2");
107 }
108 mapper.map(point, "opacity:0.8;fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1", 3);
109
110 #ifdef BOOST_GEOMETRY_POINT_ON_SURFACE_COMPLETE
111 //// Right (blue/cyan)
112 // (mostly commented, makes the picture less clear)
113 //mapper.map(right_points, "stroke:rgb(0,0,255);stroke-width:2");
114 //BOOST_FOREACH(intruder_type const& intruder, right_intruders)
115 //{
116 // mapper.map(intruder, "stroke:rgb(0,255,255);stroke-width:2");
117 //}
118 mapper.map(right_point, "opacity:0.8;fill:rgb(0,128,255);stroke:rgb(0,0,100);stroke-width:1", 3);
119 #endif
120 }
121 #endif
122
123 }
124
125 template <typename Geometry>
test_geometry(std::string const & case_id,std::string const & wkt,double expected_x=0,double expected_y=0)126 void test_geometry(std::string const& case_id, std::string const& wkt, double expected_x = 0, double expected_y = 0)
127 {
128 Geometry geometry;
129 bg::read_wkt(wkt, geometry);
130 bg::correct(geometry);
131 test_geometry(case_id, geometry, expected_x, expected_y);
132 }
133
134 template <typename Point>
test_point_order_and_type()135 void test_point_order_and_type()
136 {
137 typedef bg::model::polygon<Point, false, false> ccw_open_polygon;
138 typedef bg::model::polygon<Point, true, false> cw_open_polygon;
139 typedef bg::model::polygon<Point, false, true> ccw_closed_polygon;
140 typedef bg::model::polygon<Point, true, true> cw_closed_polygon;
141
142 test_geometry<ccw_open_polygon>("with_hole_ccw_open", "POLYGON((0 0,9 0,9 9,0 9),(2 2,2 7,7 7,7 2))", 0, 0);
143 test_geometry<cw_open_polygon>("with_hole_cw_open", "POLYGON((0 0,0 9,9 9,9 0),(2 2,7 2,7 7,2 7))", 0, 0);
144 test_geometry<ccw_closed_polygon>("with_hole_ccw_closed", "POLYGON((0 0,9 0,9 9,0 9,0 0),(2 2,2 7,7 7,7 2,2 2))", 0, 0);
145 test_geometry<cw_closed_polygon>("with_hole_cw_closed", "POLYGON((0 0,0 9,9 9,9 0,0 0),(2 2,7 2,7 7,2 7,2 2))", 0, 0);
146
147 test_geometry<cw_closed_polygon>("t1", "POLYGON((0 0,0 10,10 0,0 0))", 0, 0);
148 test_geometry<cw_closed_polygon>("t2", "POLYGON((0 0,10 0,0 -10,0 0))", 0, 0);
149 test_geometry<cw_closed_polygon>("t3", "POLYGON((0 0,0 -10,-10 0,0 0))", 0, 0);
150 test_geometry<cw_closed_polygon>("t4", "POLYGON((0 0,-10 0,0 10,0 0))", 0, 0);
151 }
152
153 template <typename Point>
test_all()154 void test_all()
155 {
156 typedef bg::model::polygon<Point> polygon;
157
158 // Specific test-cases for point-on-surface:
159 test_geometry<polygon>("ice", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0))", 0, 0);
160 test_geometry<polygon>("intruding", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,7 2,4 7,6 1,5 0))", 0, 0);
161 test_geometry<polygon>("intruding2", "polygon((5 0,3 2,4 6,2 3,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,7 2,4 7,6 1,5 0))", 0, 0);
162 test_geometry<polygon>("intruding3", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 7,2 5,4 8,6 5,5 7,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
163 test_geometry<polygon>("intruding4", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 7,2 5,4 8,6 5,5 8,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
164 test_geometry<polygon>("intruding5", "polygon((5 0,3 2,3 6,2 3,0 5,1 6,3 8,2 5,4 8,6 5,5 8,7 6,8 5,9 6,10 5,7 2,5 6,6 1,5 0))", 0, 0);
165 test_geometry<polygon>("ice_int", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 7,3 4))", 0, 0);
166 test_geometry<polygon>("ice_int2", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(4 7,3 4,4 3,5 4,4 7))", 0, 0);
167 test_geometry<polygon>("ice_in3", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,5 4,5 6,3 6,3 4))", 0, 0);
168 test_geometry<polygon>("simplex_normal", simplex_normal[0], 0, 0);
169 test_geometry<polygon>("sqr", "polygon((0 0,0 5,0 10,5 10,10 10,10 5,10 0,5 0,0 0))", 0, 0);
170 test_geometry<polygon>("self_tangent", "polygon((0 0,5 10,10 0,9 0,7 4,8 0,7 0,5 10,3 0,2 0,3 4,1 0,0 0))", 0, 0);
171 test_geometry<polygon>("self_tangent2", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0))", 0, 0);
172 test_geometry<polygon>("self_tangent_int", "polygon((5 0,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
173 test_geometry<polygon>("self_tangent_int2", "polygon((5 0,2 3,3.5 7,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
174 test_geometry<polygon>("self_tangent_int3", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
175
176 test_geometry<polygon>("self_tangent_int3", "polygon((5 0,2 3,4 8,1.5 3.5,0 5,1 6,2 5,4 8,6 5,7 6,8 5,9 6,10 5,5 0),(3 4,4 3,5 4,4 8,3 4))", 0, 0);
177 test_geometry<polygon>("disjoint_simplex0", disjoint_simplex[0], 0, 0);
178 test_geometry<polygon>("disjoint_simplex1", disjoint_simplex[1], 0, 0);
179
180 test_geometry<polygon>("ticket_10643", "POLYGON((1074699.93 703064.65, 1074703.90 703064.58, 1074704.53 703061.40, 1074702.10 703054.62, 1074699.93 703064.65))");
181 test_geometry<polygon>("ticket_10643_2", "POLYGON((699.93 64.65, 703.90 64.58, 704.53 61.40, 702.10 54.62, 699.93 64.65))");
182
183 #if defined(BOOST_GEOMETRY_UNIT_TEST_MULTI)
184 {
185 typedef bg::model::multi_polygon<polygon> multi_polygon;
186 test_geometry<multi_polygon>("mp_simplex", "multipolygon(((0 0,0 5,5 0, 0 0)),((7 1,7 6,10 1,7 1)))", 0, 0);
187 // Wrapped polygon in two orders
188 test_geometry<multi_polygon>("mp_wrapped1",
189 "multipolygon("
190 "((4 10,9 11,10 16,11 11,16 10,11 9,10 4,9 9,4 10))"
191 ","
192 "((0 10,10 20,20 10,10 0,0 10),(10 2,18 10,10 18,2 10,10 2))"
193 ")",
194 0, 0);
195 test_geometry<multi_polygon>("mp_wrapped2",
196 "multipolygon("
197 "((0 10,10 20,20 10,10 0,0 10),(10 2,18 10,10 18,2 10,10 2))"
198 ","
199 "((4 10,9 11,10 16,11 11,16 10,11 9,10 4,9 9,4 10))"
200 ")",
201 0, 0);
202 }
203 #endif
204
205
206 // Overlay testcases
207 test_geometry<polygon>("buffer_mp1", buffer_mp1[0], 0, 0);
208 test_geometry<polygon>("buffer_mp2", buffer_mp2[0], 0, 0);
209 test_geometry<polygon>("buffer_rt_a", buffer_rt_a[0], 0, 0);
210 test_geometry<polygon>("buffer_rt_f", buffer_rt_f[0], 0, 0);
211 test_geometry<polygon>("buffer_rt_g", buffer_rt_g[0], 0, 0);
212 test_geometry<polygon>("buffer_rt_i", buffer_rt_i[0], 0, 0);
213 test_geometry<polygon>("buffer_rt_j", buffer_rt_j[0], 0, 0);
214 test_geometry<polygon>("buffer_rt_l", buffer_rt_l[0], 0, 0);
215 test_geometry<polygon>("buffer_rt_m1", buffer_rt_m1[0], 0, 0);
216 test_geometry<polygon>("buffer_rt_m2", buffer_rt_m2[0], 0, 0);
217 test_geometry<polygon>("buffer_rt_n", buffer_rt_n[0], 0, 0);
218 test_geometry<polygon>("buffer_rt_q", buffer_rt_q[0], 0, 0);
219 test_geometry<polygon>("buffer_rt_r", buffer_rt_r[0], 0, 0);
220 test_geometry<polygon>("buffer_rt_t", buffer_rt_t[0], 0, 0);
221 test_geometry<polygon>("case_10", case_10[0], 0, 0);
222 test_geometry<polygon>("case_11", case_11[0], 0, 0);
223 test_geometry<polygon>("case_12", case_12[0], 0, 0);
224 test_geometry<polygon>("case_13", case_13[0], 0, 0);
225 test_geometry<polygon>("case_14", case_14[0], 0, 0);
226 test_geometry<polygon>("case_15", case_15[0], 0, 0);
227 test_geometry<polygon>("case_16", case_16[0], 0, 0);
228 test_geometry<polygon>("case_17", case_17[0], 0, 0);
229 test_geometry<polygon>("case_18", case_18[0], 0, 0);
230 test_geometry<polygon>("case_19", case_19[0], 0, 0);
231 test_geometry<polygon>("case_1", case_1[0], 0, 0);
232 test_geometry<polygon>("case_20", case_20[0], 0, 0);
233 test_geometry<polygon>("case_21", case_21[0], 0, 0);
234 test_geometry<polygon>("case_22", case_22[0], 0, 0);
235 test_geometry<polygon>("case_23", case_23[0], 0, 0);
236 test_geometry<polygon>("case_24", case_24[0], 0, 0);
237 test_geometry<polygon>("case_25", case_25[0], 0, 0);
238 test_geometry<polygon>("case_26", case_26[0], 0, 0);
239 test_geometry<polygon>("case_27", case_27[0], 0, 0);
240 test_geometry<polygon>("case_28", case_28[0], 0, 0);
241 test_geometry<polygon>("case_29", case_29[0], 0, 0);
242 test_geometry<polygon>("case_2", case_2[0], 0, 0);
243 test_geometry<polygon>("case_30", case_30[0], 0, 0);
244 test_geometry<polygon>("case_31", case_31[0], 0, 0);
245 test_geometry<polygon>("case_32", case_32[0], 0, 0);
246 test_geometry<polygon>("case_33", case_33[0], 0, 0);
247 test_geometry<polygon>("case_34", case_34[0], 0, 0);
248 test_geometry<polygon>("case_35", case_35[0], 0, 0);
249 test_geometry<polygon>("case_36", case_36[0], 0, 0);
250 test_geometry<polygon>("case_37", case_37[0], 0, 0);
251 test_geometry<polygon>("case_38", case_38[0], 0, 0);
252 test_geometry<polygon>("case_39", case_39[0], 0, 0);
253 test_geometry<polygon>("case_3", case_3[0], 0, 0);
254 test_geometry<polygon>("case_40", case_40[0], 0, 0);
255 test_geometry<polygon>("case_41", case_41[0], 0, 0);
256 test_geometry<polygon>("case_42", case_42[0], 0, 0);
257 test_geometry<polygon>("case_43", case_43[0], 0, 0);
258 test_geometry<polygon>("case_44", case_44[0], 0, 0);
259 test_geometry<polygon>("case_45", case_45[0], 0, 0);
260 test_geometry<polygon>("case_46", case_46[0], 0, 0);
261 test_geometry<polygon>("case_47", case_47[0], 0, 0);
262 test_geometry<polygon>("case_49", case_49[0], 0, 0);
263 test_geometry<polygon>("case_4", case_4[0], 0, 0);
264 test_geometry<polygon>("case_50", case_50[0], 0, 0);
265 test_geometry<polygon>("case_51", case_51[0], 0, 0);
266 test_geometry<polygon>("case_52", case_52[0], 0, 0);
267 test_geometry<polygon>("case_53", case_53[0], 0, 0);
268 test_geometry<polygon>("case_54", case_54[0], 0, 0);
269 test_geometry<polygon>("case_55", case_55[0], 0, 0);
270 test_geometry<polygon>("case_56", case_56[0], 0, 0);
271 test_geometry<polygon>("case_57", case_57[0], 0, 0);
272 test_geometry<polygon>("case_58", case_58[0], 0, 0);
273 test_geometry<polygon>("case_59", case_59[0], 0, 0);
274 test_geometry<polygon>("case_5", case_5[0], 0, 0);
275 test_geometry<polygon>("case_60", case_60[0], 0, 0);
276 test_geometry<polygon>("case_61", case_61[0], 0, 0);
277 test_geometry<polygon>("case_6", case_6[0], 0, 0);
278 test_geometry<polygon>("case_70", case_70[0], 0, 0);
279 test_geometry<polygon>("case_71", case_71[0], 0, 0);
280 test_geometry<polygon>("case_72", case_72[0], 0, 0);
281 test_geometry<polygon>("case_79", case_79[0], 0, 0);
282 test_geometry<polygon>("case_7", case_7[0], 0, 0);
283 test_geometry<polygon>("case_8", case_8[0], 0, 0);
284 test_geometry<polygon>("case_9", case_9[0], 0, 0);
285 test_geometry<polygon>("case_many_situations", case_many_situations[0], 0, 0);
286 test_geometry<polygon>("ccw_case_1", ccw_case_1[0], 0, 0);
287 test_geometry<polygon>("ccw_case_9", ccw_case_9[0], 0, 0);
288 test_geometry<polygon>("collinear_opposite_left", collinear_opposite_left[0], 0, 0);
289 test_geometry<polygon>("collinear_opposite_right", collinear_opposite_right[0], 0, 0);
290 test_geometry<polygon>("collinear_opposite_straight", collinear_opposite_straight[0], 0, 0);
291 test_geometry<polygon>("collinear_overlaps", collinear_overlaps[0], 0, 0);
292 test_geometry<polygon>("dz_1", dz_1[0], 0, 0);
293 test_geometry<polygon>("dz_2", dz_2[0], 0, 0);
294 test_geometry<polygon>("dz_3", dz_3[0], 0, 0);
295 test_geometry<polygon>("dz_4", dz_4[0], 0, 0);
296 test_geometry<polygon>("geos_1", geos_1[0], 0, 0);
297 test_geometry<polygon>("geos_2", geos_2[0], 0, 0);
298 test_geometry<polygon>("geos_3", geos_3[0], 0, 0);
299 test_geometry<polygon>("geos_4", geos_4[0], 0, 0);
300 test_geometry<polygon>("ggl_list_20110306_javier", ggl_list_20110306_javier[0], 0, 0);
301 test_geometry<polygon>("ggl_list_20110307_javier", ggl_list_20110307_javier[0], 0, 0);
302 test_geometry<polygon>("ggl_list_20110627_phillip", ggl_list_20110627_phillip[0], 0, 0);
303 test_geometry<polygon>("ggl_list_20110716_enrico", ggl_list_20110716_enrico[0], 0, 0);
304 test_geometry<polygon>("ggl_list_20110820_christophe ", ggl_list_20110820_christophe [0], 0, 0);
305 test_geometry<polygon>("ggl_list_20120717_volker", ggl_list_20120717_volker[0], 0, 0);
306 test_geometry<polygon>("hv_1", hv_1[0], 0, 0);
307 test_geometry<polygon>("hv_2", hv_2[0], 0, 0);
308 test_geometry<polygon>("hv_3", hv_3[0], 0, 0);
309 test_geometry<polygon>("hv_4", hv_4[0], 0, 0);
310 test_geometry<polygon>("hv_5", hv_5[0], 0, 0);
311 test_geometry<polygon>("hv_6", hv_6[0], 0, 0);
312 test_geometry<polygon>("hv_7", hv_7[0], 0, 0);
313 test_geometry<polygon>("isovist", isovist[0], 0, 0);
314 test_geometry<polygon>("open_case_1", open_case_1[0], 0, 0);
315 test_geometry<polygon>("open_case_9", open_case_9[0], 0, 0);
316 test_geometry<polygon>("pie_16_2_15_0", pie_16_2_15_0[0], 0, 0);
317 test_geometry<polygon>("pie_16_4_12", pie_16_4_12[0], 0, 0);
318 test_geometry<polygon>("pie_20_20_7_100", pie_20_20_7_100[0], 0, 0);
319 test_geometry<polygon>("pie_23_16_16", pie_23_16_16[0], 0, 0);
320 test_geometry<polygon>("pie_23_21_12_500", pie_23_21_12_500[0], 0, 0);
321 test_geometry<polygon>("pie_23_23_3_2000", pie_23_23_3_2000[0], 0, 0);
322 test_geometry<polygon>("pie_4_13_15", pie_4_13_15[0], 0, 0);
323 test_geometry<polygon>("pie_5_12_12_0_7s", pie_5_12_12_0_7s[0], 0, 0);
324 test_geometry<polygon>("snl_1", snl_1[0], 0, 0);
325 test_geometry<polygon>("ticket_17", ticket_17[0], 0, 0);
326 test_geometry<polygon>("ticket_5103", ticket_5103[0], 0, 0);
327 test_geometry<polygon>("ticket_7462", ticket_7462[0], 0, 0);
328 test_geometry<polygon>("ticket_8310a", ticket_8310a[0], 0, 0);
329 test_geometry<polygon>("ticket_8310b", ticket_8310b[0], 0, 0);
330 test_geometry<polygon>("ticket_8310c", ticket_8310c[0], 0, 0);
331 test_geometry<polygon>("ticket_8254", ticket_8254[0], 0, 0);
332 }
333
334 template <typename Point>
test_dense(std::string const & case_id,double size)335 void test_dense(std::string const& case_id, double size)
336 {
337 typedef bg::model::polygon<Point> polygon;
338 polygon poly;
339
340 bg::append(poly, Point(-size, 0));
341
342 double thres = 3.14158 / 8;
343 for ( double a = thres ; a > -thres ; a -= 0.01 )
344 {
345 bg::append(poly, Point(size * ::cos(a), size * ::sin(a)));
346 }
347
348 bg::append(poly, Point(-size, 0));
349
350 test_geometry(case_id, poly);
351 }
352
353
test_main(int,char * [])354 int test_main(int, char* [])
355 {
356 test_all<bg::model::d2::point_xy<double> >();
357 test_point_order_and_type<bg::model::d2::point_xy<double> >();
358 test_point_order_and_type<bg::model::d2::point_xy<int> >();
359
360 test_dense<bg::model::d2::point_xy<double> >("dense1", 100);
361 test_dense<bg::model::d2::point_xy<double> >("dense2", 1000000);
362
363 return 0;
364 }
365
366