point_on_surface.cpp 18 KB

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