segment_intersection_geo.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. // Boost.Geometry
  2. // Unit Test
  3. // Copyright (c) 2016-2018, Oracle and/or its affiliates.
  4. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  5. // Use, modification and distribution is subject to the Boost Software License,
  6. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #include "segment_intersection_geo.hpp"
  9. template <typename T>
  10. void test_geographic()
  11. {
  12. typedef bg::model::point<double, 2, bg::cs::geographic<bg::degree> > point_t;
  13. typedef bg::model::segment<point_t> segment_t;
  14. test_all_strategies<segment_t, point_t>(
  15. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -2, -1 -1)", 'a', "POINT(-1 -1)");
  16. test_all_strategies<segment_t, point_t>(
  17. "SEGMENT(-1 -2, 1 1)", "SEGMENT(-1 -2, -1 -1)", 'f', "POINT(-1 -2)");
  18. test_all_strategies<segment_t, point_t>(
  19. "SEGMENT(1 1, -1 -1)", "SEGMENT(-1 -2, -1 -1)", 't', "POINT(-1 -1)");
  20. test_all_strategies<segment_t, point_t>(
  21. "SEGMENT(1 1, -1 -2)", "SEGMENT(-1 -2, -1 -1)", 'a', "POINT(-1 -2)");
  22. test_all_strategies<segment_t, point_t>(
  23. "SEGMENT(-1 -2, -1 -1)", "SEGMENT(-1 -1, 1 1)", 'a', "POINT(-1 -1)");
  24. test_all_strategies<segment_t, point_t>(
  25. "SEGMENT(-1 -2, -1 -1)", "SEGMENT(-1 -2, 1 1)", 'f', "POINT(-1 -2)");
  26. test_all_strategies<segment_t, point_t>(
  27. "SEGMENT(-1 -2, -1 -1)", "SEGMENT(1 1, -1 -1)", 't', "POINT(-1 -1)");
  28. test_all_strategies<segment_t, point_t>(
  29. "SEGMENT(-1 -2, -1 -1)", "SEGMENT(1 1, -1 -2)", 'a', "POINT(-1 -2)");
  30. test_strategies<segment_t, point_t>(
  31. "SEGMENT(-1 -2, -1 2)", "SEGMENT(-2 -2, 2 2)",
  32. great_elliptic('i', "POINT(-1 -1.000457053724121)"),
  33. geodesic_vincenty('i', "POINT(-1 -1.000459099991114)"),
  34. geodesic_andoyer('i', "POINT(-1 -1.000453510849886)"));
  35. test_strategies<segment_t, point_t>(
  36. "SEGMENT(-2 -2, 2 2)", "SEGMENT(-1 -2, -1 2)",
  37. great_elliptic('i', "POINT(-1 -1.000457053724121)"),
  38. geodesic_vincenty('i', "POINT(-1 -1.000459099991114)"),
  39. geodesic_andoyer('i', "POINT(-1 -1.000453510849886)"));
  40. // crossing X
  41. test_strategies<segment_t, point_t>(
  42. "SEGMENT(-45 -45, 45 45)", "SEGMENT(-45 45, 45 -45)",
  43. great_elliptic('i', "POINT(0 0)"),
  44. geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
  45. geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
  46. test_strategies<segment_t, point_t>(
  47. "SEGMENT(-45 -45, 45 45)", "SEGMENT(45 -45, -45 45)",
  48. great_elliptic('i', "POINT(0 0)"),
  49. geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
  50. geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
  51. test_strategies<segment_t, point_t>(
  52. "SEGMENT(45 45, -45 -45)", "SEGMENT(-45 45, 45 -45)",
  53. great_elliptic('i', "POINT(0 0)"),
  54. geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
  55. geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
  56. test_strategies<segment_t, point_t>(
  57. "SEGMENT(45 45, -45 -45)", "SEGMENT(45 -45, -45 45)",
  58. great_elliptic('i', "POINT(0 0)"),
  59. geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
  60. geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
  61. // crossing X
  62. test_strategies<segment_t, point_t>(
  63. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 1, 1 -1)",
  64. great_elliptic('i', "POINT(0 0)"),
  65. geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
  66. geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
  67. test_strategies<segment_t, point_t>(
  68. "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 -1, -1 1)",
  69. great_elliptic('i', "POINT(0 0)"),
  70. geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
  71. geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
  72. test_strategies<segment_t, point_t>(
  73. "SEGMENT(1 1, -1 -1)", "SEGMENT(-1 1, 1 -1)",
  74. great_elliptic('i', "POINT(0 0)"),
  75. geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
  76. geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
  77. test_strategies<segment_t, point_t>(
  78. "SEGMENT(1 1, -1 -1)", "SEGMENT(1 -1, -1 1)",
  79. great_elliptic('i', "POINT(0 0)"),
  80. geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
  81. geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
  82. // equal
  83. // //
  84. test_all_strategies<segment_t, point_t>(
  85. "SEGMENT(-45 -45, 45 45)", "SEGMENT(-45 -45, 45 45)", 'e', "POINT(-45 -45)", "POINT(45 45)", false);
  86. // //
  87. test_all_strategies<segment_t, point_t>(
  88. "SEGMENT(-45 -45, 45 45)", "SEGMENT(45 45, -45 -45)", 'e', "POINT(-45 -45)", "POINT(45 45)", true);
  89. // starting outside s1
  90. // /
  91. // |
  92. test_all_strategies<segment_t, point_t>(
  93. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, -1 -1)", 'a', "POINT(-1 -1)");
  94. // /
  95. // /|
  96. test_all_strategies<segment_t, point_t>(
  97. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 0 0)", 'm', "POINT(0 0)");
  98. // /|
  99. // / |
  100. test_all_strategies<segment_t, point_t>(
  101. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 1 1)", 't', "POINT(1 1)");
  102. // |/
  103. // /|
  104. test_strategies<segment_t, point_t>(
  105. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 2 2)",
  106. great_elliptic('i', "POINT(0 0)"),
  107. geodesic_vincenty('i', "POINT(0.00000013628420059 0.00000013624239008)"),
  108. geodesic_thomas('i', "POINT(-0.00004079969079346 -0.00004078714535240)"),
  109. geodesic_andoyer('i', "POINT(-0.01217344899138908 -0.01216980051876599)"));
  110. // ------
  111. // ------
  112. test_all_strategies<segment_t, point_t>(
  113. "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, -1 0)", 'a', "POINT(-1 0)");
  114. // ------
  115. // ------
  116. test_all_strategies<segment_t, point_t>(
  117. "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 0 0)", 'c', "POINT(-1 0)", "POINT(0 0)", false);
  118. test_all_strategies<segment_t, point_t>(
  119. "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, -2 0)", 'c', "POINT(-1 0)", "POINT(0 0)", true);
  120. test_all_strategies<segment_t, point_t>(
  121. "SEGMENT(1 0, -1 0)", "SEGMENT(-2 0, 0 0)", 'c', "POINT(0 0)", "POINT(-1 0)", true);
  122. test_all_strategies<segment_t, point_t>(
  123. "SEGMENT(1 0, -1 0)", "SEGMENT(0 0, -2 0)", 'c', "POINT(0 0)", "POINT(-1 0)", false);
  124. // ------
  125. // ---------
  126. test_all_strategies<segment_t, point_t>(
  127. "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 1 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
  128. test_all_strategies<segment_t, point_t>(
  129. "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, -2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", true);
  130. test_all_strategies<segment_t, point_t>(
  131. "SEGMENT(1 0, -1 0)", "SEGMENT(-2 0, 1 0)", 'c', "POINT(1 0)", "POINT(-1 0)", true);
  132. test_all_strategies<segment_t, point_t>(
  133. "SEGMENT(1 0, -1 0)", "SEGMENT(1 0, -2 0)", 'c', "POINT(1 0)", "POINT(-1 0)", false);
  134. // ------
  135. // ------------
  136. test_all_strategies<segment_t, point_t>(
  137. "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
  138. // starting at s1
  139. // /
  140. // //
  141. test_all_strategies<segment_t, point_t>(
  142. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 0 0)", 'c', "POINT(-1 -1)", "POINT(0 0)", false);
  143. // //
  144. // //
  145. test_all_strategies<segment_t, point_t>(
  146. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 1 1)", 'e', "POINT(-1 -1)", "POINT(1 1)", false);
  147. // | /
  148. // |/
  149. test_all_strategies<segment_t, point_t>(
  150. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 2 2)", 'f', "POINT(-1 -1)");
  151. // ------
  152. // ---
  153. test_all_strategies<segment_t, point_t>(
  154. "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 0 0)", 'c', "POINT(-1 0)", "POINT(0 0)", false);
  155. // ------
  156. // ------
  157. test_all_strategies<segment_t, point_t>(
  158. "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 1 0)", 'e', "POINT(-1 0)", "POINT(1 0)", false);
  159. // ------
  160. // ---------
  161. test_all_strategies<segment_t, point_t>(
  162. "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
  163. // starting inside
  164. // //
  165. // /
  166. test_all_strategies<segment_t, point_t>(
  167. "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 1 1)", 'c', "POINT(0 0)", "POINT(1 1)", false);
  168. test_all_strategies<segment_t, point_t>(
  169. "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 0 0)", 'c', "POINT(0 0)", "POINT(1 1)", true);
  170. test_all_strategies<segment_t, point_t>(
  171. "SEGMENT(1 1, -1 -1)", "SEGMENT(0 0, 1 1)", 'c', "POINT(1 1)", "POINT(0 0)", true);
  172. test_all_strategies<segment_t, point_t>(
  173. "SEGMENT(1 1, -1 -1)", "SEGMENT(1 1, 0 0)", 'c', "POINT(1 1)", "POINT(0 0)", false);
  174. test_all_strategies<segment_t, point_t>(
  175. "SEGMENT(0 0, 1 1)", "SEGMENT(-1 -1, 1 1)", 'c', "POINT(0 0)", "POINT(1 1)", false);
  176. test_all_strategies<segment_t, point_t>(
  177. "SEGMENT(1 1, 0 0)", "SEGMENT(-1 -1, 1 1)", 'c', "POINT(1 1)", "POINT(0 0)", true);
  178. test_all_strategies<segment_t, point_t>(
  179. "SEGMENT(0 0, 1 1)", "SEGMENT(1 1, -1 -1)", 'c', "POINT(0 0)", "POINT(1 1)", true);
  180. test_all_strategies<segment_t, point_t>(
  181. "SEGMENT(1 1, 0 0)", "SEGMENT(1 1, -1 -1)", 'c', "POINT(1 1)", "POINT(0 0)", false);
  182. // |/
  183. // /
  184. test_all_strategies<segment_t, point_t>(
  185. "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 2 2)", 's', "POINT(0 0)");
  186. // ------
  187. // ---
  188. test_all_strategies<segment_t, point_t>(
  189. "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 1 0)", 'c', "POINT(0 0)", "POINT(1 0)", false);
  190. // ------
  191. // ------
  192. test_all_strategies<segment_t, point_t>(
  193. "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 2 0)", 'c', "POINT(0 0)", "POINT(1 0)", false);
  194. // starting at p2
  195. // |
  196. // /
  197. test_all_strategies<segment_t, point_t>(
  198. "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 2 2)", 'a', "POINT(1 1)");
  199. // ------
  200. // ---
  201. test_all_strategies<segment_t, point_t>(
  202. "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, 2 0)", 'a', "POINT(1 0)");
  203. // disjoint, crossing
  204. // /
  205. // |
  206. test_all_strategies<segment_t, point_t>(
  207. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-3 -3, -2 -2)", 'd');
  208. // |
  209. // /
  210. test_all_strategies<segment_t, point_t>(
  211. "SEGMENT(-1 -1, 1 1)", "SEGMENT(2 2, 3 3)", 'd');
  212. // disjoint, collinear
  213. // ------
  214. // ------
  215. test_all_strategies<segment_t, point_t>(
  216. "SEGMENT(-1 0, 1 0)", "SEGMENT(-3 0, -2 0)", 'd');
  217. // ------
  218. // ------
  219. test_all_strategies<segment_t, point_t>(
  220. "SEGMENT(-1 0, 1 0)", "SEGMENT(2 0, 3 0)", 'd');
  221. // degenerated
  222. // /
  223. // *
  224. test_all_strategies<segment_t, point_t>(
  225. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, -2 -2)", 'd');
  226. // /
  227. // *
  228. test_all_strategies<segment_t, point_t>(
  229. "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, -1 -1)", '0', "POINT(-1 -1)");
  230. // /
  231. // *
  232. // /
  233. test_all_strategies<segment_t, point_t>(
  234. "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 0 0)", '0', "POINT(0 0)");
  235. // *
  236. // /
  237. test_all_strategies<segment_t, point_t>(
  238. "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 1 1)", '0', "POINT(1 1)");
  239. // *
  240. // /
  241. test_all_strategies<segment_t, point_t>(
  242. "SEGMENT(-1 -1, 1 1)", "SEGMENT(2 2, 2 2)", 'd');
  243. // similar to above, collinear
  244. // * ------
  245. test_all_strategies<segment_t, point_t>(
  246. "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, -2 0)", 'd');
  247. // *------
  248. test_all_strategies<segment_t, point_t>(
  249. "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, -1 0)", '0', "POINT(-1 0)");
  250. // ---*---
  251. test_all_strategies<segment_t, point_t>(
  252. "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 0 0)", '0', "POINT(0 0)");
  253. // ------*
  254. test_all_strategies<segment_t, point_t>(
  255. "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, 1 0)", '0', "POINT(1 0)");
  256. // ------ *
  257. test_all_strategies<segment_t, point_t>(
  258. "SEGMENT(-1 0, 1 0)", "SEGMENT(2 0, 2 0)", 'd');
  259. // Northern hemisphere
  260. // --- ------
  261. test_all_strategies<segment_t, point_t>(
  262. "SEGMENT(-1 50, 1 50)", "SEGMENT(-3 50, -2 50)", 'd');
  263. // ------
  264. // ---
  265. test_all_strategies<segment_t, point_t>(
  266. "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, -1 50)", 'a', "POINT(-1 50)");
  267. // \/
  268. // /\ (avoid multi-line comment)
  269. test_strategies<segment_t, point_t>(
  270. "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 0 50)",
  271. great_elliptic('i', "POINT(-0.5 50.0032229484023)"),
  272. geodesic_vincenty('i', "POINT(-0.4999999996073994 50.00323192256208)"),
  273. geodesic_thomas('i', "POINT(-0.4999999963998482 50.00323192258598)"),
  274. geodesic_andoyer('i', "POINT(-0.4999990340391772 50.00323192463806)"));
  275. // ________
  276. // / _____\ (avoid multi-line comment)
  277. test_all_strategies<segment_t, point_t>(
  278. "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 1 50)", 't', "POINT(1 50)");
  279. // _________
  280. // / _____ \ (avoid multi-line comment)
  281. test_all_strategies<segment_t, point_t>(
  282. "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 2 50)", 'd');
  283. // ______
  284. // /___ \ (avoid multi-line comment)
  285. test_all_strategies<segment_t, point_t>(
  286. "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 0 50)", 'f', "POINT(-1 50)");
  287. // ------
  288. // ------
  289. test_all_strategies<segment_t, point_t>(
  290. "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 1 50)", 'e', "POINT(-1 50)", "POINT(1 50)", false);
  291. // ________
  292. // /_____ \ (avoid multi-line comment)
  293. test_all_strategies<segment_t, point_t>(
  294. "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 2 50)", 'f', "POINT(-1 50)");
  295. // ______
  296. // / ___\ (avoid multi-line comment)
  297. test_all_strategies<segment_t, point_t>(
  298. "SEGMENT(-1 50, 1 50)", "SEGMENT(0 50, 1 50)", 't', "POINT(1 50)");
  299. // \/
  300. // /\ (avoid multi-line comment)
  301. test_strategies<segment_t, point_t>(
  302. "SEGMENT(-1 50, 1 50)", "SEGMENT(0 50, 2 50)",
  303. great_elliptic('i', "POINT(0.5 50.0032229484023)"),
  304. geodesic_vincenty('i', "POINT(0.4999999996112415 50.00323192256208)"),
  305. geodesic_thomas('i', "POINT(0.5000000051005989 50.00323192258598)"),
  306. geodesic_andoyer('i', "POINT(0.5000009655139563 50.00323192463806)"));
  307. // ------
  308. // ---
  309. test_all_strategies<segment_t, point_t>(
  310. "SEGMENT(-1 50, 1 50)", "SEGMENT(1 50, 2 50)", 'a', "POINT(1 50)");
  311. // ------ ---
  312. test_all_strategies<segment_t, point_t>(
  313. "SEGMENT(-1 50, 1 50)", "SEGMENT(2 50, 3 50)", 'd');
  314. // ___|
  315. test_all_strategies<segment_t, point_t>(
  316. "SEGMENT(0 0, 1 0)", "SEGMENT(1 0, 1 1)", 'a', "POINT(1 0)");
  317. // ___|
  318. test_all_strategies<segment_t, point_t>(
  319. "SEGMENT(1 0, 1 1)", "SEGMENT(0 0, 1 0)", 'a', "POINT(1 0)");
  320. // |/
  321. // /|
  322. test_strategies<segment_t, point_t>(
  323. "SEGMENT(10 -1, 20 1)", "SEGMENT(12.5 -1, 12.5 1)",
  324. great_elliptic('i', "POINT(12.5 -0.50051443471392)"),
  325. geodesic_vincenty('i', "POINT(12.5 -0.5005177749487734)"),
  326. geodesic_thomas('i', "POINT(12.5 -0.5005177654827411)"),
  327. geodesic_andoyer('i', "POINT(12.5 -0.500525380045163)"));
  328. // |/
  329. // /|
  330. test_strategies<segment_t, point_t>(
  331. "SEGMENT(10 -1, 20 1)", "SEGMENT(17.5 -1, 17.5 1)",
  332. great_elliptic('i', "POINT(17.5 0.50051443471392)"),
  333. geodesic_vincenty('i', "POINT(17.5 0.5005177748229335)"),
  334. geodesic_thomas('i', "POINT(17.5 0.5005178030678186)"),
  335. geodesic_andoyer('i', "POINT(17.5 0.5004949944844279)"));
  336. // vertical, crossing at the pole or disjoint
  337. test_all_strategies<segment_t, point_t>(
  338. "SEGMENT(90 45, -90 60)", "SEGMENT(0 50, 180 70)", 'i', "POINT(0 90)");
  339. test_all_strategies<segment_t, point_t>(
  340. "SEGMENT(90 -45, -90 -60)", "SEGMENT(0 -50, 180 -70)", 'i', "POINT(0 -90)");
  341. test_all_strategies<segment_t, point_t>(
  342. "SEGMENT(90 45, -90 60)", "SEGMENT(0 -50, 180 -70)", 'd');
  343. test_all_strategies<segment_t, point_t>(
  344. "SEGMENT(90 -45, -90 -60)", "SEGMENT(0 50, 180 70)", 'd');
  345. // vertical touching at the pole
  346. test_all_strategies<segment_t, point_t>(
  347. "SEGMENT(90 90, 90 45)", "SEGMENT(0 90, 0 45)", 'f', "POINT(90 90)"); // should probably be (0 90)
  348. test_all_strategies<segment_t, point_t>(
  349. "SEGMENT(90 90, 90 45)", "SEGMENT(0 45, 0 90)", 'a', "POINT(90 90)"); // should probably be (0 90)
  350. test_all_strategies<segment_t, point_t>(
  351. "SEGMENT(90 45, 90 90)", "SEGMENT(0 90, 0 45)", 'a', "POINT(90 90)"); // should probably be (0 90)
  352. test_all_strategies<segment_t, point_t>(
  353. "SEGMENT(90 45, 90 90)", "SEGMENT(0 45, 0 90)", 't', "POINT(90 90)"); // should probably be (0 90)
  354. // one vertical with endpoint at a pole
  355. /*test_strategies<segment_t, point_t>(
  356. "SEGMENT(0 90, 90 0)", "SEGMENT(89 45, 91 45)",
  357. great_elliptic('i', "POINT(90 45.00436354465514)"),
  358. geodesic_vincenty('i', "POINT(90.00000000000112 45.00437824795338)"),
  359. geodesic_thomas('i', "POINT(90.00000000472062 45.00437824797395)"),
  360. geodesic_andoyer('i', "POINT(89.99999993672924 45.00437824794587)"));
  361. test_strategies<segment_t, point_t>(
  362. "SEGMENT(90 0, 0 90)", "SEGMENT(89 45, 91 45)",
  363. great_elliptic('i', "POINT(90 45.00436354465514)"),
  364. geodesic_vincenty('i', "POINT(90.00000000000112 45.00437824795338)"),
  365. geodesic_thomas('i', "POINT(90.00000000472062 45.00437824797395)"),
  366. geodesic_andoyer('i', "POINT(89.99999993672924 45.00437824794587)"));
  367. test_strategies<segment_t, point_t>(
  368. "SEGMENT(0 -90, 90 0)", "SEGMENT(89 -45, 91 -45)",
  369. great_elliptic('i', "POINT(90 -45.00436354465514)"),
  370. geodesic_vincenty('i', "POINT(90.00000000000112 -45.00437824795338)"),
  371. geodesic_thomas('i', "POINT(90.00000000472062 -45.00437824797395)"),
  372. geodesic_andoyer('i', "POINT(89.99999993672924 -45.00437824794587)"));
  373. test_strategies<segment_t, point_t>(
  374. "SEGMENT(90 0, 0 -90)", "SEGMENT(89 -45, 91 -45)",
  375. great_elliptic('i', "POINT(90 -45.00436354465514)"),
  376. geodesic_vincenty('i', "POINT(90.00000000000112 -45.00437824795338)"),
  377. geodesic_thomas('i', "POINT(90.00000000472062 -45.00437824797395)"),
  378. geodesic_andoyer('i', "POINT(89.99999993672924 -45.00437824794587)"));*/
  379. }
  380. template <typename T>
  381. void test_geographic_radian()
  382. {
  383. typedef bg::model::point<T, 2, bg::cs::geographic<bg::radian> > point_t;
  384. typedef bg::model::segment<point_t> segment_t;
  385. bg::strategy::intersection::geographic_segments<bg::strategy::vincenty> strategy;
  386. // https://github.com/boostorg/geometry/issues/470
  387. point_t p0(0.000000001, 0.000000001);
  388. point_t p1(0.000000001, 0.000000005);
  389. point_t p2(0.000000005, 0.000000005);
  390. segment_t s1(p0, p1);
  391. segment_t s2(p1, p2);
  392. test_strategy_one(s1, s1, strategy, 'e', 2, p0, p1);
  393. test_strategy_one(s2, s2, strategy, 'e', 2, p1, p2);
  394. }
  395. int test_main(int, char* [])
  396. {
  397. //test_geographic<float>();
  398. test_geographic<double>();
  399. test_geographic_radian<double>();
  400. return 0;
  401. }