distance_cross_track_cases.hpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. // Boost.Geometry
  2. // Unit Test
  3. // Copyright (c) 2019 Oracle and/or its affiliates.
  4. // Contributed and/or modified by Vissarion Fysikopoulos, 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. #ifndef BOOST_GEOMETRY_TEST_DISTANCE_CROSS_TRACK_CASES_HPP
  9. #define BOOST_GEOMETRY_TEST_DISTANCE_CROSS_TRACK_CASES_HPP
  10. struct coordinates
  11. {
  12. double lon;
  13. double lat;
  14. };
  15. struct expected_results
  16. {
  17. coordinates p1; //1st point of segment
  18. coordinates p2; //2nd point of segment
  19. coordinates p3; //point to compute distance from segment
  20. double reference; // karney or vincenty
  21. double vincenty_bisection;
  22. double vincenty;
  23. double thomas_bisection;
  24. double thomas;
  25. double andoyer_bisection;
  26. double andoyer;
  27. double spherical;
  28. };
  29. expected_results expected[] =
  30. {
  31. {
  32. { 0, 0 },{ 1, 1 },{ 0, 1 },
  33. 78442.119873761606868,
  34. 78442.119873761606868,
  35. 78442.119873761592316,
  36. 78442.118218914125464,
  37. 78442.118218840550981,
  38. 78440.792929481409374,
  39. 78440.792934224984492,
  40. 78618.810427426869865
  41. } , {
  42. { 0, 0 },{ 1, 1 },{ 1, 0 },
  43. 78453.98942845336569,
  44. 78453.98942845336569,
  45. 78453.98942845336569,
  46. 78453.990728736869642,
  47. 78453.990728682110785,
  48. 78453.54172924211889,
  49. 78453.541733992169611,
  50. 78630.786885094828904
  51. } , {
  52. { 10, 15 },{ 30, 15 },{ 15, 80 },
  53. 7204174.4886689241976,
  54. 7204174.4886689241976,
  55. 7204174.4886689241976,
  56. 7204174.4785777237266,
  57. 7204174.4785777227953,
  58. 7204194.9162934627384,
  59. 7204194.9162937803194,
  60. 7205729.8545973757282
  61. } , {
  62. { 10, 15 },{ 30, 15 },{ 15, 10 },
  63. 571412.78107940487098,
  64. 571412.78107940487098,
  65. 571412.78107940475456,
  66. 571412.77996722259559,
  67. 571412.77996722620446,
  68. 571408.51759251800831,
  69. 571408.51759251928888,
  70. 574226.66911869682372
  71. } , {
  72. { 10, 15 },{ 30, 15 },{ 5, 10 },
  73. 775316.40275838342495,
  74. 775316.40275838342495,
  75. 775316.40275838342495,
  76. 775316.40098149504047,
  77. 775316.40098149504047,
  78. 775309.55307898123283,
  79. 775309.55307898123283,
  80. 776861.2271022957284
  81. } , {
  82. { 10, 15 },{ 30, 15 },{ 35, 10 },
  83. 775316.40275838342495,
  84. 775316.40275838342495,
  85. 775316.40275838342495,
  86. 775316.40098149504047,
  87. 775316.40098149504047,
  88. 775309.55307898123283,
  89. 775309.55307898123283,
  90. 776861.22710229584482
  91. } , {
  92. { 2, 2 },{ 3, 2 },{ 3.5, 3 },
  93. 123770.82713049851009,
  94. 123770.82713049851009,
  95. 123770.82713049851009,
  96. 123770.82682863833907,
  97. 123770.82682863833907,
  98. 123769.27773668900772,
  99. 123769.27773668900772,
  100. 124295.90554402528505
  101. } , {
  102. { 2, 2 },{ 3, 2 },{ 1.5, 3 },
  103. 123770.82713049851009,
  104. 123770.82713049851009,
  105. 123770.82713049851009,
  106. 123770.82682863833907,
  107. 123770.82682863833907,
  108. 123769.27773668900772,
  109. 123769.27773668900772,
  110. 124295.90554402528505
  111. } , {
  112. { 2, 2 },{ 3, 2 },{ 2, 3 },
  113. 110576.41139532231318,
  114. 110576.41139532231318,
  115. 110576.41139532238594,
  116. 110576.41139116862905,
  117. 110576.41139118297724,
  118. 110575.1780244907568,
  119. 110575.17802451056195,
  120. 111195.07457694716868
  121. } , {
  122. { 2, 2 },{ 3, 2 },{ 3, 3 },
  123. 110576.41139532234229,
  124. 110576.41139532234229,
  125. 110576.41139532234229,
  126. 110576.41139242639474,
  127. 110576.41139243228827,
  128. 110575.17802478378871,
  129. 110575.17802474705968,
  130. 111195.07457694721234
  131. } , {
  132. { 2, 2 },{ 3, 2 },{ 3.5, 1 },
  133. 123784.75399867084343,
  134. 123784.75399867084343,
  135. 123784.75399867084343,
  136. 123784.75369734384003,
  137. 123784.75369734384003,
  138. 123783.19294134904339,
  139. 123783.19294134904339,
  140. 124311.043335600305
  141. } , {
  142. { 2, 2 },{ 3, 2 },{ 1.5, 1 },
  143. 123784.75399867084343,
  144. 123784.75399867084343,
  145. 123784.75399867084343,
  146. 123784.75369734384003,
  147. 123784.75369734384003,
  148. 123783.19294134904339,
  149. 123783.19294134904339,
  150. 124311.043335600305
  151. } , {
  152. { 2, 2 },{ 3, 2 },{ 2, 1 },
  153. 110575.06481432798319,
  154. 110575.06481432798319,
  155. 110575.06481432798319,
  156. 110575.06688667042181,
  157. 110575.06688667042181,
  158. 110573.82008001199574,
  159. 110573.82008001199574,
  160. 111195.07973463158123
  161. } , {
  162. { 2, 2 },{ 3, 2 },{ 3, 1 },
  163. 110575.06481432798319,
  164. 110575.06481432798319,
  165. 110575.06481432798319,
  166. 110575.06688667042181,
  167. 110575.06688667042181,
  168. 110573.82008001199574,
  169. 110573.82008001199574,
  170. 111195.07973463158123
  171. } , {
  172. { 2, -2 },{ 3, -2 },{ 3, -1 },
  173. 110575.06481432798319,
  174. 110575.06481432798319,
  175. 110575.06481432798319,
  176. 110575.06688667042181,
  177. 110575.06688667042181,
  178. 110573.82008001199574,
  179. 110573.82008001199574,
  180. 111195.07973463158123
  181. } , {
  182. { 220, 2 },{ 3, 2 },{ 3, 1 },
  183. 110575.06481432798319,
  184. 110575.06481432798319,
  185. 110575.06481432798319,
  186. 110575.06688667042181,
  187. 110575.06688667042181,
  188. 110573.82008001199574,
  189. 110573.82008001199574,
  190. 111195.07973463158123
  191. } , //antimeridian
  192. {
  193. { 220, 2 },{ 3, 2 },{ 220, 1 },
  194. 110575.06481432798319,
  195. 110575.06481432798319,
  196. 110575.06481432798319,
  197. 110575.06688667042181,
  198. 110575.06688667042181,
  199. 110573.82008001199574,
  200. 110573.82008001199574,
  201. 111195.07973463158123
  202. } , //meridian
  203. {
  204. { 2, 2 },{ 2, 4 },{ 2.5, 2 },
  205. 55626.064900081859,
  206. 55626.064900081859,
  207. 55626.064900081867,
  208. 55626.06490013907,
  209. 55626.064900107223,
  210. 55626.065279513903,
  211. 55626.065279463517,
  212. 55563.670489238102
  213. } , {
  214. { 2, 2 },{ 2, 4 },{ 2.5, 5 },
  215. 123722.15822285149,
  216. 123722.15822285149,
  217. 123722.15822285149,
  218. 123722.15791917888,
  219. 123722.15791917888,
  220. 123720.64936755209,
  221. 123720.64936755209,
  222. 124243.00560435352
  223. } , {
  224. { 2, 2 },{ 2, 4 },{ 2.5, 3 },
  225. 55583.973320908837,
  226. 55583.973320908837,
  227. 55583.97332090883,
  228. 55583.973320941128,
  229. 55583.973320900877,
  230. 55583.97416950998,
  231. 55583.974169663285,
  232. 55521.343440931159
  233. } , {
  234. { 0, 40 },{ 180, 80 },{ 0, 20 },
  235. 2217162.7761786841,
  236. 2217162.7761786841,
  237. 2217162.7761786841,
  238. 2217162.7361901053,
  239. 2217162.7361901053,
  240. 2217171.9891410829,
  241. 2217171.9891410829,
  242. 2223901.5946926316
  243. } , {
  244. { 0, 40 },{ 0, 80 },{ 0, 20 },
  245. 2217162.7761786841,
  246. 2217162.7761786841,
  247. 2217162.7761786841,
  248. 2217162.7361901053,
  249. 2217162.7361901053,
  250. 2217171.9891410829,
  251. 2217171.9891410829,
  252. 2223901.5946926316
  253. } , {
  254. { 0, 0 },{ 0, 90 },{ 0, 80 },
  255. 0,
  256. 0,
  257. 0,
  258. 0,
  259. 0,
  260. 0,
  261. 0,
  262. 0
  263. } , {
  264. { 0, 0 },{ 0, 90 },{ 1, 80 },
  265. 19392.530629092114,
  266. 19392.530629092114,
  267. 19392.530629092107,
  268. 19392.53062953979,
  269. 19392.530629094777,
  270. 19392.328788289116,
  271. 19392.328788113067,
  272. 19307.872231041671
  273. } , {
  274. { 1, -1 }, { 1, 0 },{ 2, 0 },
  275. 111319.4907932264,
  276. 111319.4907932264,
  277. 111319.4907932264,
  278. 111319.49079334327,
  279. 111319.49079326246,
  280. 111319.49079326226,
  281. 111319.49079326246,
  282. 111195.07973463158
  283. } , //equator
  284. {
  285. { 2, 0 },{ 3, 0 },{ 0, 0 },
  286. 222638.98158645280637,
  287. 222638.98158645280637,
  288. 222638.98158645280637,
  289. 222638.98158654122381,
  290. 222638.98158654122381,
  291. 222638.98158654125291,
  292. 222638.98158654125291,
  293. 222390.15946926316246
  294. } , {
  295. { 2, 0 },{ 3, 0 },{ 2.5, 3 },
  296. 331725.86989626317518,
  297. 331725.86989626317518,
  298. 331725.86989626317518,
  299. 331725.87608870770782,
  300. 331725.87608870770782,
  301. 331722.14136137196328,
  302. 331722.14136137196328,
  303. 333585.2392038948019
  304. } , {
  305. { 2, 0 },{ 3, 0 },{ 2, 0 },
  306. 0,
  307. 0,
  308. 0,
  309. 0,
  310. 0,
  311. 0,
  312. 0,
  313. 0
  314. } , {
  315. { 2, 0 },{ 3, 0 },{ 3, 0 },
  316. 0,
  317. 0,
  318. 0,
  319. 0,
  320. 0,
  321. 0,
  322. 0,
  323. 0
  324. } , {
  325. { 2, 0 },{ 3, 0 },{ 2.5, 0 },
  326. 0,
  327. 0,
  328. 0,
  329. 0,
  330. 0,
  331. 0,
  332. 0,
  333. 0
  334. } , {
  335. { 2, 0 },{ 3, 0 },{ 3.5, 3 },
  336. 336358.80734967370518,
  337. 336358.80734967370518,
  338. 336358.80734967370518,
  339. 336358.80718013871228,
  340. 336358.80718013871228,
  341. 336354.9292840428534,
  342. 336354.9292840428534,
  343. 338182.45508443051949
  344. } , //segment pass by pole
  345. /* those cases have expected very large reference errors for spherical
  346. * {
  347. { 0, 0 },{ 180, 0 },{ 0, 90 },
  348. 0,
  349. 0,
  350. 0,
  351. 0,
  352. 0,
  353. 0,
  354. 0,
  355. 10007557.176116843
  356. } , {
  357. { 0, 0 },{ 180, 0 },{ 80, 89 },
  358. 109996.81571864839,
  359. 109996.81571864839,
  360. 109996.81571864836,
  361. 109996.81571864968,
  362. 109996.81571858823,
  363. 109995.58014976831,
  364. 109995.58014972134,
  365. 9896362.096382184,
  366. }*/ // short distance to segment
  367. {
  368. { 0.5, 0 },{ 175.5, 0 },{ 90, 1e-3 },
  369. 110.57427582169922,
  370. 110.57427582169922,
  371. 110.57427582169922,
  372. 110.57427792305019,
  373. 110.57427792305019,
  374. 110.57302444153535,
  375. 110.57302444153535,
  376. 111.19507973475258
  377. } , {
  378. { 0.5, 0 },{ 175.5, 0 },{ 90, 1e-8 },
  379. 0.0011057427582158647,
  380. 0.0011057427582158647,
  381. 0.0011057427582158647,
  382. 0.0011057427792293744,
  383. 0.0011057427792293744,
  384. 0.0011057302444142166,
  385. 0.0011057302444142166,
  386. 0.0011119503057618657
  387. } , {
  388. // mysql Bug #29545865
  389. { -16.42203, -7.52882 },{ 4.89998, -6.15568 },{ 3.32696, -6.29345 },
  390. 481.73908764883043,
  391. 481.73908764883043,
  392. 481.73908764873721,
  393. 481.74578258317035,
  394. 481.74576160418479,
  395. 480.34603374821353,
  396. 480.34602624448405,
  397. 508.0731159303939
  398. } , { // same segment but the point is from the other side
  399. { -16.42203, -7.52882 },{ 4.89998, -6.15568 },{ 3.3262, -6.28451},
  400. 510.48273138899611,
  401. 510.48273138899611,
  402. 510.48273138908797,
  403. 510.47605556026537,
  404. 510.47605888246693,
  405. 511.86547773473234,
  406. 511.86548088955459,
  407. 489.55321195417821
  408. } , {
  409. { -16.42203, -7.52882 },{ 4.89998, -6.1556 },{ 3.32696, -6.2889 },
  410. 11.511229576046485,
  411. 11.511229576046485,
  412. 11.51122957617916,
  413. 11.50474785537202,
  414. 11.504394870933424,
  415. 12.898977232559222,
  416. 12.898968261046516,
  417. 12.130727461169611
  418. } , {
  419. { -16.42203, -7.52882 },{ 4.89998, -6.1556 },{ 3.32696, -6.28895 },
  420. 6.0009073659133909,
  421. 6.0009073659133909,
  422. 6.0009073659387502,
  423. 5.9949823734311893,
  424. 5.9941706378723278,
  425. 7.3883629173067344,
  426. 7.3889362323779535,
  427. 17.671122161310702
  428. } , {
  429. // mysql Bug #29545865
  430. //{ 8.65279, -2.71668 },
  431. { -7.13372, 8.35583 },{ -9.09998, -1.22625 },{ -7.35561, 7.2137 },
  432. 1671.2894143458557,
  433. 1671.2894143458557,
  434. 1671.2894143458786,
  435. 1671.2962894596874,
  436. 1671.296284713379,
  437. 1677.2323385335374,
  438. 1677.232338307874,
  439. 1668.697566121507
  440. }
  441. #ifdef GEOMETRY_TEST_INCLUDE_FAILING_TESTS
  442. , {
  443. { 0, 10 }, { 20, 10 }, { 18.00000000000003908, 10.054676080707787733 },
  444. 0.0011398027228318023,
  445. 0.0011398027228318023,
  446. 0.0060057460922939617,
  447. 0,
  448. 0,
  449. 0,
  450. 0.30055333992381872,
  451. 39.88666722147299
  452. } , {
  453. { 0, 10 }, { 20, 10 }, { 18, 10.054678231628329854 },
  454. 0.23669789852514209,
  455. 0.23669789852514209,
  456. 0.23669789883426567,
  457. 0.25069019912476698,
  458. 0.23204712322540744,
  459. 0.26712030782599411,
  460. 0.40206187237490559,
  461. 40.125767043637062
  462. } , {
  463. { 0, 10 }, { 20, 10 },{ 17.999999999999950262, 10.054676091041047314 },
  464. 2.7930744094407741e-06,
  465. 2.7930744094407741e-06,
  466. 0.0058967770186943418,
  467. 0,
  468. 0,
  469. 0,
  470. 0.30055160527904862,
  471. 39.887815883329125
  472. }
  473. #endif
  474. , // large distance to segment
  475. {
  476. { 0.5, 0 }, { 175.5, 0 }, { 90, 90 },
  477. 10001965.729311479,
  478. 10001965.729311479,
  479. 10001965.729311479,
  480. 10001965.729311479,
  481. 10001965.729311479,
  482. 10001958.678477952,
  483. 10001958.678477952,
  484. 10007557.108987356
  485. } , {
  486. { 0.5, -89 }, { 175.5, -89 }, { 90, 90 },
  487. 19892237.59370932,
  488. 19892237.59370932,
  489. 19892237.59370932,
  490. 19892237.570068691,
  491. 19892237.570068691,
  492. 19892224.746673118,
  493. 19892224.746673118,
  494. 19903919.272499084
  495. } , //acos issue solved
  496. {
  497. { 90, 0 }, { 0, 1.000005 }, {0, 90},
  498. 9891389.2448064201,
  499. 9891389.2448064201,
  500. 9891389.2448064163,
  501. 9891370.4775929395,
  502. 9891370.4775932431,
  503. 9891383.4444574378,
  504. 9891383.4444574378,
  505. 9896361.5404068138
  506. }
  507. };
  508. size_t const expected_size = sizeof(expected) / sizeof(expected_results);
  509. #endif // BOOST_GEOMETRY_TEST_DISTANCE_CROSS_TRACK_CASES_HPP