@sentryware/s2-node 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/.circleci/config.yml +45 -0
  2. package/.dockerignore +1 -0
  3. package/.gitmodules +3 -0
  4. package/CHANGELOG.md +33 -0
  5. package/LICENSE +201 -0
  6. package/README.md +147 -0
  7. package/binding.gyp +170 -0
  8. package/docker/Dockerfile.node20.test +8 -0
  9. package/docker/Dockerfile.node22.test +8 -0
  10. package/docker/Dockerfile.node24.test +8 -0
  11. package/index.d.ts +117 -0
  12. package/index.js +6 -0
  13. package/jest.config.js +184 -0
  14. package/package.json +43 -0
  15. package/publish-linux.sh +18 -0
  16. package/publish-osx.sh +19 -0
  17. package/src/builder.cc +84 -0
  18. package/src/builder.h +29 -0
  19. package/src/cell.cc +71 -0
  20. package/src/cell.h +26 -0
  21. package/src/cell_id.cc +210 -0
  22. package/src/cell_id.h +44 -0
  23. package/src/cell_union.cc +237 -0
  24. package/src/cell_union.h +34 -0
  25. package/src/earth.cc +185 -0
  26. package/src/earth.h +33 -0
  27. package/src/latlng.cc +132 -0
  28. package/src/latlng.h +28 -0
  29. package/src/loop.cc +51 -0
  30. package/src/loop.h +21 -0
  31. package/src/point.cc +69 -0
  32. package/src/point.h +23 -0
  33. package/src/polygon.cc +36 -0
  34. package/src/polygon.h +20 -0
  35. package/src/polyline.cc +186 -0
  36. package/src/polyline.h +34 -0
  37. package/src/region_coverer.cc +450 -0
  38. package/src/region_coverer.h +56 -0
  39. package/src/s2.cc +27 -0
  40. package/test/Cell.test.js +37 -0
  41. package/test/CellId.test.js +135 -0
  42. package/test/CellUnion.test.js +150 -0
  43. package/test/Earth.test.js +62 -0
  44. package/test/LatLng.test.js +45 -0
  45. package/test/Point.test.js +14 -0
  46. package/test/Polyline.test.js +78 -0
  47. package/test/RegionCoverer.test.js +301 -0
  48. package/test.sh +16 -0
  49. package/third_party/s2geometry/.travis.yml +163 -0
  50. package/third_party/s2geometry/AUTHORS +13 -0
  51. package/third_party/s2geometry/CONTRIBUTING.md +65 -0
  52. package/third_party/s2geometry/CONTRIBUTORS +30 -0
  53. package/third_party/s2geometry/LICENSE +202 -0
  54. package/third_party/s2geometry/NOTICE +5 -0
  55. package/third_party/s2geometry/README.md +127 -0
  56. package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
  57. package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
  58. package/third_party/s2geometry/doc/examples/term_index.py +101 -0
  59. package/third_party/s2geometry/src/python/coder.i +125 -0
  60. package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
  61. package/third_party/s2geometry/src/python/s2.i +37 -0
  62. package/third_party/s2geometry/src/python/s2_common.i +756 -0
  63. package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
  64. package/third_party/s2geometry/src/s2/base/casts.h +318 -0
  65. package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
  66. package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
  67. package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
  68. package/third_party/s2geometry/src/s2/base/logging.h +173 -0
  69. package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
  70. package/third_party/s2geometry/src/s2/base/port.h +999 -0
  71. package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
  72. package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
  73. package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
  74. package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
  75. package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
  76. package/third_party/s2geometry/src/s2/base/timer.h +50 -0
  77. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
  78. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
  79. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
  80. package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
  81. package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
  82. package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
  83. package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
  84. package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
  85. package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
  86. package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
  87. package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
  88. package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
  89. package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
  90. package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
  91. package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
  92. package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
  93. package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
  94. package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
  95. package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
  96. package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
  97. package/third_party/s2geometry/src/s2/r1interval.h +220 -0
  98. package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
  99. package/third_party/s2geometry/src/s2/r2.h +26 -0
  100. package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
  101. package/third_party/s2geometry/src/s2/r2rect.h +234 -0
  102. package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
  103. package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
  104. package/third_party/s2geometry/src/s2/s1angle.h +336 -0
  105. package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
  106. package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
  107. package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
  108. package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
  109. package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
  110. package/third_party/s2geometry/src/s2/s1interval.h +266 -0
  111. package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
  112. package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
  113. package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
  114. package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
  115. package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
  116. package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
  117. package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
  118. package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
  119. package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
  120. package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
  121. package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
  122. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
  123. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
  124. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
  125. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
  126. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
  127. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
  128. package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
  129. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
  130. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
  131. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
  132. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
  133. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
  134. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
  135. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
  136. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
  137. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
  138. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
  139. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
  140. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
  141. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
  142. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
  143. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
  144. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
  145. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
  146. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
  147. package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
  148. package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
  149. package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
  150. package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
  151. package/third_party/s2geometry/src/s2/s2cap.h +286 -0
  152. package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
  153. package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
  154. package/third_party/s2geometry/src/s2/s2cell.h +249 -0
  155. package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
  156. package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
  157. package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
  158. package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
  159. package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
  160. package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
  161. package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
  162. package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
  163. package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
  164. package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
  165. package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
  166. package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
  167. package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
  168. package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
  169. package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
  170. package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
  171. package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
  172. package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
  173. package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
  174. package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
  175. package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
  176. package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
  177. package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
  178. package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
  179. package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
  180. package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
  181. package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
  182. package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
  183. package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
  184. package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
  185. package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
  186. package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
  187. package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
  188. package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
  189. package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
  190. package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
  191. package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
  192. package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
  193. package/third_party/s2geometry/src/s2/s2coords.h +459 -0
  194. package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
  195. package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
  196. package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
  197. package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
  198. package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
  199. package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
  200. package/third_party/s2geometry/src/s2/s2debug.h +69 -0
  201. package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
  202. package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
  203. package/third_party/s2geometry/src/s2/s2earth.h +268 -0
  204. package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
  205. package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
  206. package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
  207. package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
  208. package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
  209. package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
  210. package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
  211. package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
  212. package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
  213. package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
  214. package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
  215. package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
  216. package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
  217. package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
  218. package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
  219. package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
  220. package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
  221. package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
  222. package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
  223. package/third_party/s2geometry/src/s2/s2error.cc +29 -0
  224. package/third_party/s2geometry/src/s2/s2error.h +147 -0
  225. package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
  226. package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
  227. package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
  228. package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
  229. package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
  230. package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
  231. package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
  232. package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
  233. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
  234. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
  235. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
  236. package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
  237. package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
  238. package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
  239. package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
  240. package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
  241. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
  242. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
  243. package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
  244. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
  245. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
  246. package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
  247. package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
  248. package/third_party/s2geometry/src/s2/s2loop.h +711 -0
  249. package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
  250. package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
  251. package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
  252. package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
  253. package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
  254. package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
  255. package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
  256. package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
  257. package/third_party/s2geometry/src/s2/s2measures.h +78 -0
  258. package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
  259. package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
  260. package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
  261. package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
  262. package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
  263. package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
  264. package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
  265. package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
  266. package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
  267. package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
  268. package/third_party/s2geometry/src/s2/s2point.h +38 -0
  269. package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
  270. package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
  271. package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
  272. package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
  273. package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
  274. package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
  275. package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
  276. package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
  277. package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
  278. package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
  279. package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
  280. package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
  281. package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
  282. package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
  283. package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
  284. package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
  285. package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
  286. package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
  287. package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
  288. package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
  289. package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
  290. package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
  291. package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
  292. package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
  293. package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
  294. package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
  295. package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
  296. package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
  297. package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
  298. package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
  299. package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
  300. package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
  301. package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
  302. package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
  303. package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
  304. package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
  305. package/third_party/s2geometry/src/s2/s2projections.h +161 -0
  306. package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
  307. package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
  308. package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
  309. package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
  310. package/third_party/s2geometry/src/s2/s2region.cc +26 -0
  311. package/third_party/s2geometry/src/s2/s2region.h +142 -0
  312. package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
  313. package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
  314. package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
  315. package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
  316. package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
  317. package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
  318. package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
  319. package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
  320. package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
  321. package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
  322. package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
  323. package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
  324. package/third_party/s2geometry/src/s2/s2shape.h +283 -0
  325. package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
  326. package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
  327. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
  328. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
  329. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
  330. package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
  331. package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
  332. package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
  333. package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
  334. package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
  335. package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
  336. package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
  337. package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
  338. package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
  339. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
  340. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
  341. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
  342. package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
  343. package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
  344. package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
  345. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
  346. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
  347. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
  348. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
  349. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
  350. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
  351. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
  352. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
  353. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
  354. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
  355. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
  356. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
  357. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
  358. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
  359. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
  360. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
  361. package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
  362. package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
  363. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
  364. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
  365. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
  366. package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
  367. package/third_party/s2geometry/src/s2/s2testing.h +385 -0
  368. package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
  369. package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
  370. package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
  371. package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
  372. package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
  373. package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
  374. package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
  375. package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
  376. package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
  377. package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
  378. package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
  379. package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
  380. package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
  381. package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
  382. package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
  383. package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
  384. package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
  385. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
  386. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
  387. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
  388. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
  389. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
  390. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
  391. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
  392. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
  393. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
  394. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
  395. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
  396. package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
  397. package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
  398. package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
  399. package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
  400. package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
  401. package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
  402. package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
  403. package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
  404. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
  405. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
  406. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
  407. package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
  408. package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
  409. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
  410. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
  411. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
  412. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
  413. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
  414. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
  415. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
  416. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
  417. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
  418. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
  419. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
  420. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
  421. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
  422. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
  423. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
  424. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
  425. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
  426. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
  427. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
  428. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
  429. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
  430. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
  431. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
  432. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
  433. package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
  434. package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
  435. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
  436. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
  437. package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
  438. package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
  439. package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
  440. package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
  441. package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
  442. package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
  443. package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
  444. package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
  445. package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
  446. package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
  447. package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
  448. package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
  449. package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
  450. package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
  451. package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
  452. package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
  453. package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
  454. package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
  455. package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
  456. package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
  457. package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
  458. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
  459. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
  460. package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
  461. package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
  462. package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
  463. package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
  464. package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
  465. package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
  466. package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
  467. package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
  468. package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
  469. package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
  470. package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
  471. package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
@@ -0,0 +1,539 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s2edge_distances.h"
19
+
20
+ #include <memory>
21
+ #include <string>
22
+
23
+ #include <gtest/gtest.h>
24
+ #include "s2/s1chord_angle.h"
25
+ #include "s2/s2pointutil.h"
26
+ #include "s2/s2polyline.h"
27
+ #include "s2/s2predicates.h"
28
+ #include "s2/s2testing.h"
29
+ #include "s2/s2text_format.h"
30
+
31
+ using std::unique_ptr;
32
+
33
+ // Checks that the error returned by S2::GetUpdateMinDistanceMaxError() for
34
+ // the distance "input" (measured in radians) corresponds to a distance error
35
+ // of less than "max_error" (measured in radians).
36
+ //
37
+ // The reason for the awkward phraseology above is that the value returned by
38
+ // GetUpdateMinDistanceMaxError() is not a distance; it represents an error in
39
+ // the *squared* distance.
40
+ void CheckUpdateMinDistanceMaxError(double actual, double max_error) {
41
+ S1ChordAngle ca(S1Angle::Radians(actual));
42
+ S1Angle bound = ca.PlusError(S2::GetUpdateMinDistanceMaxError(ca)).ToAngle();
43
+ EXPECT_LE(bound.radians() - actual, max_error) << actual;
44
+ }
45
+
46
+ TEST(S2, GetUpdateMinDistanceMaxError) {
47
+ // Verify that the error is "reasonable" for a sampling of distances.
48
+ CheckUpdateMinDistanceMaxError(0, 1.5e-15);
49
+ CheckUpdateMinDistanceMaxError(1e-8, 1e-15);
50
+ CheckUpdateMinDistanceMaxError(1e-5, 1e-15);
51
+ CheckUpdateMinDistanceMaxError(0.05, 1e-15);
52
+ CheckUpdateMinDistanceMaxError(M_PI_2 - 1e-8, 2e-15);
53
+ CheckUpdateMinDistanceMaxError(M_PI_2, 2e-15);
54
+ CheckUpdateMinDistanceMaxError(M_PI_2 + 1e-8, 2e-15);
55
+ CheckUpdateMinDistanceMaxError(M_PI - 1e-5, 2e-10);
56
+ CheckUpdateMinDistanceMaxError(M_PI, 0);
57
+ }
58
+
59
+ TEST(S2, GetUpdateMinInteriorDistanceMaxError) {
60
+ // Check that the error bound returned by
61
+ // GetUpdateMinInteriorDistanceMaxError() is large enough.
62
+ auto& rnd = S2Testing::rnd;
63
+ for (int iter = 0; iter < 10000; ++iter) {
64
+ S2Point a0 = S2Testing::RandomPoint();
65
+ S1Angle len = S1Angle::Radians(M_PI * pow(1e-20, rnd.RandDouble()));
66
+ S2Point a1 = S2::InterpolateAtDistance(len, a0, S2Testing::RandomPoint());
67
+ // TODO(ericv): If s2pred::RobustCrossProd() is implemented, then we can
68
+ // also test nearly-antipodal points here. In theory the error bound can
69
+ // be exceeded when the edge endpoints are antipodal to within 0.8e-13
70
+ // radians, but the only examples found in testing require the endpoints
71
+ // to be nearly-antipodal to within 1e-16 radians.
72
+ S2Point n = S2::RobustCrossProd(a0, a1).Normalize();
73
+ double f = pow(1e-20, rnd.RandDouble());
74
+ S2Point a = ((1 - f) * a0 + f * a1).Normalize();
75
+ S1Angle r = S1Angle::Radians(M_PI_2 * pow(1e-20, rnd.RandDouble()));
76
+ if (rnd.OneIn(2)) r = S1Angle::Radians(M_PI_2) - r;
77
+ S2Point x = S2::InterpolateAtDistance(r, a, n);
78
+ S1ChordAngle min_dist = S1ChordAngle::Infinity();
79
+ if (!S2::UpdateMinInteriorDistance(x, a0, a1, &min_dist)) {
80
+ --iter; continue;
81
+ }
82
+ double error = S2::GetUpdateMinDistanceMaxError(min_dist);
83
+ EXPECT_LE(s2pred::CompareEdgeDistance(x, a0, a1,
84
+ min_dist.PlusError(error)), 0);
85
+ EXPECT_GE(s2pred::CompareEdgeDistance(x, a0, a1,
86
+ min_dist.PlusError(-error)), 0);
87
+ }
88
+ }
89
+
90
+ // Given a point X and an edge AB, check that the distance from X to AB is
91
+ // "distance_radians" and the closest point on AB is "expected_closest".
92
+ void CheckDistance(S2Point x, S2Point a, S2Point b,
93
+ double distance_radians, S2Point expected_closest) {
94
+ x = x.Normalize();
95
+ a = a.Normalize();
96
+ b = b.Normalize();
97
+ expected_closest = expected_closest.Normalize();
98
+ EXPECT_NEAR(distance_radians, S2::GetDistance(x, a, b).radians(), 1e-15);
99
+ S2Point closest = S2::Project(x, a, b);
100
+ if (expected_closest == S2Point(0, 0, 0)) {
101
+ // This special value says that the result should be A or B.
102
+ EXPECT_TRUE(closest == a || closest == b);
103
+ } else {
104
+ EXPECT_TRUE(S2::ApproxEquals(closest, expected_closest));
105
+ }
106
+ S1ChordAngle min_distance = S1ChordAngle::Zero();
107
+ EXPECT_FALSE(S2::UpdateMinDistance(x, a, b, &min_distance));
108
+ min_distance = S1ChordAngle::Infinity();
109
+ EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
110
+ EXPECT_NEAR(distance_radians, min_distance.ToAngle().radians(), 1e-15);
111
+ }
112
+
113
+ TEST(S2, Distance) {
114
+ CheckDistance(S2Point(1, 0, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
115
+ 0, S2Point(1, 0, 0));
116
+ CheckDistance(S2Point(0, 1, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
117
+ 0, S2Point(0, 1, 0));
118
+ CheckDistance(S2Point(1, 3, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
119
+ 0, S2Point(1, 3, 0));
120
+ CheckDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
121
+ M_PI_2, S2Point(1, 0, 0));
122
+ CheckDistance(S2Point(0, 0, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
123
+ M_PI_2, S2Point(1, 0, 0));
124
+ CheckDistance(S2Point(-1, -1, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
125
+ 0.75 * M_PI, S2Point(0, 0, 0));
126
+
127
+ CheckDistance(S2Point(0, 1, 0), S2Point(1, 0, 0), S2Point(1, 1, 0),
128
+ M_PI_4, S2Point(1, 1, 0));
129
+ CheckDistance(S2Point(0, -1, 0), S2Point(1, 0, 0), S2Point(1, 1, 0),
130
+ M_PI_2, S2Point(1, 0, 0));
131
+
132
+ CheckDistance(S2Point(0, -1, 0), S2Point(1, 0, 0), S2Point(-1, 1, 0),
133
+ M_PI_2, S2Point(1, 0, 0));
134
+ CheckDistance(S2Point(-1, -1, 0), S2Point(1, 0, 0), S2Point(-1, 1, 0),
135
+ M_PI_2, S2Point(-1, 1, 0));
136
+
137
+ CheckDistance(S2Point(1, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
138
+ asin(sqrt(1./3)), S2Point(1, 1, 0));
139
+ CheckDistance(S2Point(1, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
140
+ asin(sqrt(1./3)), S2Point(1, 1, 0));
141
+
142
+ CheckDistance(S2Point(-1, 0, 0), S2Point(1, 1, 0), S2Point(1, 1, 0),
143
+ 0.75 * M_PI, S2Point(1, 1, 0));
144
+ CheckDistance(S2Point(0, 0, -1), S2Point(1, 1, 0), S2Point(1, 1, 0),
145
+ M_PI_2, S2Point(1, 1, 0));
146
+ CheckDistance(S2Point(-1, 0, 0), S2Point(1, 0, 0), S2Point(1, 0, 0),
147
+ M_PI, S2Point(1, 0, 0));
148
+ }
149
+
150
+ TEST(S2, DistanceOptimizationIsConservative) {
151
+ // Verifies that AlwaysUpdateMinInteriorDistance() computes the lower bound
152
+ // on the true distance conservatively. (This test used to fail.)
153
+ S2Point x(-0.017952729194524016, -0.30232422079175203, 0.95303607751077712);
154
+ S2Point a(-0.017894725505830295, -0.30229974986194175, 0.95304493075220664);
155
+ S2Point b(-0.017986591360900289, -0.30233851195954353, 0.95303090543659963);
156
+ S1ChordAngle min_distance = S1ChordAngle::Infinity();
157
+ EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
158
+ min_distance = min_distance.Successor();
159
+ EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
160
+ }
161
+
162
+ void CheckMaxDistance(S2Point x, S2Point a, S2Point b,
163
+ double distance_radians) {
164
+ x = x.Normalize();
165
+ a = a.Normalize();
166
+ b = b.Normalize();
167
+
168
+ S1ChordAngle max_distance = S1ChordAngle::Straight();
169
+ EXPECT_FALSE(S2::UpdateMaxDistance(x, a, b, &max_distance));
170
+ max_distance = S1ChordAngle::Negative();
171
+ EXPECT_TRUE(S2::UpdateMaxDistance(x, a, b, &max_distance));
172
+
173
+ EXPECT_NEAR(distance_radians, max_distance.radians(), 1e-15);
174
+ }
175
+
176
+ TEST(S2, MaxDistance) {
177
+ CheckMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
178
+ M_PI_2);
179
+ CheckMaxDistance(S2Point(1, 0, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
180
+ M_PI_2);
181
+ CheckMaxDistance(S2Point(0, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
182
+ M_PI_2);
183
+ CheckMaxDistance(S2Point(0, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
184
+ M_PI_2);
185
+
186
+ CheckMaxDistance(S2Point(1, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
187
+ asin(sqrt(2./3)));
188
+ CheckMaxDistance(S2Point(1, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
189
+ asin(sqrt(2./3)));
190
+
191
+ CheckMaxDistance(S2Point(1, 0, 0), S2Point(1, 1, 0), S2Point(1, -1, 0),
192
+ M_PI_4);
193
+ CheckMaxDistance(S2Point(0, 1, 0), S2Point(1, 1, 0), S2Point(-1, 1, 0),
194
+ M_PI_4);
195
+ CheckMaxDistance(S2Point(0, 0, 1), S2Point(0, 1, 1), S2Point(0, -1, 1),
196
+ M_PI_4);
197
+
198
+ CheckMaxDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(1, 0, -1),
199
+ 3 * M_PI_4);
200
+ CheckMaxDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(1, 1, -M_SQRT2),
201
+ 3 * M_PI_4);
202
+
203
+ CheckMaxDistance(S2Point(0, 0, 1), S2Point(0, 0, -1), S2Point(0, 0, -1),
204
+ M_PI);
205
+ }
206
+
207
+ void CheckInterpolate(double t, S2Point a, S2Point b, S2Point expected) {
208
+ a = a.Normalize();
209
+ b = b.Normalize();
210
+ expected = expected.Normalize();
211
+ S2Point actual = S2::Interpolate(t, a, b);
212
+
213
+ // We allow a bit more than the usual 1e-15 error tolerance because
214
+ // Interpolate() uses trig functions.
215
+ EXPECT_TRUE(S2::ApproxEquals(expected, actual, S1Angle::Radians(3e-15)))
216
+ << "Expected: " << expected << ", actual: " << actual;
217
+ }
218
+
219
+ TEST(S2, Interpolate) {
220
+ // Choose test points designed to expose floating-point errors.
221
+ S2Point p1 = S2Point(0.1, 1e-30, 0.3).Normalize();
222
+ S2Point p2 = S2Point(-0.7, -0.55, -1e30).Normalize();
223
+
224
+ // A zero-length edge.
225
+ CheckInterpolate(0, p1, p1, p1);
226
+ CheckInterpolate(1, p1, p1, p1);
227
+
228
+ // Start, end, and middle of a medium-length edge.
229
+ CheckInterpolate(0, p1, p2, p1);
230
+ CheckInterpolate(1, p1, p2, p2);
231
+ CheckInterpolate(0.5, p1, p2, 0.5 * (p1 + p2));
232
+
233
+ // Test that interpolation is done using distances on the sphere rather than
234
+ // linear distances.
235
+ CheckInterpolate(1./3, S2Point(1, 0, 0), S2Point(0, 1, 0),
236
+ S2Point(sqrt(3), 1, 0));
237
+ CheckInterpolate(2./3, S2Point(1, 0, 0), S2Point(0, 1, 0),
238
+ S2Point(1, sqrt(3), 0));
239
+
240
+ // Test that interpolation is accurate on a long edge (but not so long that
241
+ // the definition of the edge itself becomes too unstable).
242
+ {
243
+ const double kLng = M_PI - 1e-2;
244
+ S2Point a = S2LatLng::FromRadians(0, 0).ToPoint();
245
+ S2Point b = S2LatLng::FromRadians(0, kLng).ToPoint();
246
+ for (double f = 0.4; f > 1e-15; f *= 0.1) {
247
+ CheckInterpolate(f, a, b,
248
+ S2LatLng::FromRadians(0, f * kLng).ToPoint());
249
+ CheckInterpolate(1 - f, a, b,
250
+ S2LatLng::FromRadians(0, (1 - f) * kLng).ToPoint());
251
+ }
252
+ }
253
+
254
+ // Test that interpolation on a 180 degree edge (antipodal endpoints) yields
255
+ // a result with the correct distance from each endpoint.
256
+ for (double t = 0; t <= 1; t += 0.125) {
257
+ S2Point actual = S2::Interpolate(t, p1, -p1);
258
+ EXPECT_NEAR(S1Angle(actual, p1).radians(), t * M_PI, 3e-15);
259
+ }
260
+ }
261
+
262
+ TEST(S2, InterpolateCanExtrapolate) {
263
+ const S2Point i(1, 0, 0);
264
+ const S2Point j(0, 1, 0);
265
+ // Initial vectors at 90 degrees.
266
+ CheckInterpolate(0, i, j, S2Point(1, 0, 0));
267
+ CheckInterpolate(1, i, j, S2Point(0, 1, 0));
268
+ CheckInterpolate(1.5, i, j, S2Point(-1, 1, 0));
269
+ CheckInterpolate(2, i, j, S2Point(-1, 0, 0));
270
+ CheckInterpolate(3, i, j, S2Point(0, -1, 0));
271
+ CheckInterpolate(4, i, j, S2Point(1, 0, 0));
272
+
273
+ // Negative values of t.
274
+ CheckInterpolate(-1, i, j, S2Point(0, -1, 0));
275
+ CheckInterpolate(-2, i, j, S2Point(-1, 0, 0));
276
+ CheckInterpolate(-3, i, j, S2Point(0, 1, 0));
277
+ CheckInterpolate(-4, i, j, S2Point(1, 0, 0));
278
+
279
+ // Initial vectors at 45 degrees.
280
+ CheckInterpolate(2, i, S2Point(1, 1, 0), S2Point(0, 1, 0));
281
+ CheckInterpolate(3, i, S2Point(1, 1, 0), S2Point(-1, 1, 0));
282
+ CheckInterpolate(4, i, S2Point(1, 1, 0), S2Point(-1, 0, 0));
283
+
284
+ // Initial vectors at 135 degrees.
285
+ CheckInterpolate(2, i, S2Point(-1, 1, 0), S2Point(0, -1, 0));
286
+
287
+ // Take a small fraction along the curve.
288
+ S2Point p(S2::Interpolate(0.001, i, j));
289
+ // We should get back where we started.
290
+ CheckInterpolate(1000, i, p, j);
291
+ }
292
+
293
+
294
+ TEST(S2, RepeatedInterpolation) {
295
+ // Check that points do not drift away from unit length when repeated
296
+ // interpolations are done.
297
+ for (int i = 0; i < 100; ++i) {
298
+ S2Point a = S2Testing::RandomPoint();
299
+ S2Point b = S2Testing::RandomPoint();
300
+ for (int j = 0; j < 1000; ++j) {
301
+ a = S2::Interpolate(0.01, a, b);
302
+ }
303
+ EXPECT_TRUE(S2::IsUnitLength(a));
304
+ }
305
+ }
306
+
307
+ // Given two edges a0a1 and b0b1, check that the minimum distance between them
308
+ // is "distance_radians", and that GetEdgePairClosestPoints() returns
309
+ // "expected_a" and "expected_b" as the points that achieve this distance.
310
+ // S2Point(0, 0, 0) may be passed for "expected_a" or "expected_b" to indicate
311
+ // that both endpoints of the corresponding edge are equally distant, and
312
+ // therefore either one might be returned.
313
+ //
314
+ // Parameters are passed by value so that this function can normalize them.
315
+ void CheckEdgePairMinDistance(S2Point a0, S2Point a1, S2Point b0, S2Point b1,
316
+ double distance_radians,
317
+ S2Point expected_a, S2Point expected_b) {
318
+ a0 = a0.Normalize();
319
+ a1 = a1.Normalize();
320
+ b0 = b0.Normalize();
321
+ b1 = b1.Normalize();
322
+ expected_a = expected_a.Normalize();
323
+ expected_b = expected_b.Normalize();
324
+ const auto& closest = S2::GetEdgePairClosestPoints(a0, a1, b0, b1);
325
+ const S2Point& actual_a = closest.first;
326
+ const S2Point& actual_b = closest.second;
327
+ if (expected_a == S2Point(0, 0, 0)) {
328
+ // This special value says that the result should be a0 or a1.
329
+ EXPECT_TRUE(actual_a == a0 || actual_a == a1);
330
+ } else {
331
+ EXPECT_TRUE(S2::ApproxEquals(expected_a, actual_a));
332
+ }
333
+ if (expected_b == S2Point(0, 0, 0)) {
334
+ // This special value says that the result should be b0 or b1.
335
+ EXPECT_TRUE(actual_b == b0 || actual_b == b1);
336
+ } else {
337
+ EXPECT_TRUE(S2::ApproxEquals(expected_b, actual_b));
338
+ }
339
+ S1ChordAngle min_distance = S1ChordAngle::Zero();
340
+ EXPECT_FALSE(S2::UpdateEdgePairMinDistance(a0, a1, b0, b1, &min_distance));
341
+ min_distance = S1ChordAngle::Infinity();
342
+ EXPECT_TRUE(S2::UpdateEdgePairMinDistance(a0, a1, b0, b1, &min_distance));
343
+ EXPECT_NEAR(distance_radians, min_distance.radians(), 1e-15);
344
+ }
345
+
346
+ TEST(S2, EdgePairMinDistance) {
347
+ // One edge is degenerate.
348
+ CheckEdgePairMinDistance(S2Point(1, 0, 1), S2Point(1, 0, 1),
349
+ S2Point(1, -1, 0), S2Point(1, 1, 0),
350
+ M_PI_4, S2Point(1, 0, 1), S2Point(1, 0, 0));
351
+ CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
352
+ S2Point(1, 0, 1), S2Point(1, 0, 1),
353
+ M_PI_4, S2Point(1, 0, 0), S2Point(1, 0, 1));
354
+
355
+ // Both edges are degenerate.
356
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
357
+ S2Point(0, 1, 0), S2Point(0, 1, 0),
358
+ M_PI_2, S2Point(1, 0, 0), S2Point(0, 1, 0));
359
+
360
+ // Both edges are degenerate and antipodal.
361
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
362
+ S2Point(-1, 0, 0), S2Point(-1, 0, 0),
363
+ M_PI, S2Point(1, 0, 0), S2Point(-1, 0, 0));
364
+
365
+ // Two identical edges.
366
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
367
+ S2Point(1, 0, 0), S2Point(0, 1, 0),
368
+ 0, S2Point(0, 0, 0), S2Point(0, 0, 0));
369
+
370
+ // Both edges are degenerate and identical.
371
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
372
+ S2Point(1, 0, 0), S2Point(1, 0, 0),
373
+ 0, S2Point(1, 0, 0), S2Point(1, 0, 0));
374
+
375
+ // Edges that share exactly one vertex (all 4 possibilities).
376
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
377
+ S2Point(0, 1, 0), S2Point(0, 1, 1),
378
+ 0, S2Point(0, 1, 0), S2Point(0, 1, 0));
379
+ CheckEdgePairMinDistance(S2Point(0, 1, 0), S2Point(1, 0, 0),
380
+ S2Point(0, 1, 0), S2Point(0, 1, 1),
381
+ 0, S2Point(0, 1, 0), S2Point(0, 1, 0));
382
+ CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
383
+ S2Point(0, 1, 1), S2Point(0, 1, 0),
384
+ 0, S2Point(0, 1, 0), S2Point(0, 1, 0));
385
+ CheckEdgePairMinDistance(S2Point(0, 1, 0), S2Point(1, 0, 0),
386
+ S2Point(0, 1, 1), S2Point(0, 1, 0),
387
+ 0, S2Point(0, 1, 0), S2Point(0, 1, 0));
388
+
389
+ // Two edges whose interiors cross.
390
+ CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
391
+ S2Point(1, 0, -1), S2Point(1, 0, 1),
392
+ 0, S2Point(1, 0, 0), S2Point(1, 0, 0));
393
+
394
+ // The closest distance occurs between two edge endpoints, but more than one
395
+ // endpoint pair is equally distant.
396
+ CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
397
+ S2Point(-1, 0, 0), S2Point(-1, 0, 1),
398
+ acos(-0.5), S2Point(0, 0, 0), S2Point(-1, 0, 1));
399
+ CheckEdgePairMinDistance(S2Point(-1, 0, 0), S2Point(-1, 0, 1),
400
+ S2Point(1, -1, 0), S2Point(1, 1, 0),
401
+ acos(-0.5), S2Point(-1, 0, 1), S2Point(0, 0, 0));
402
+ CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
403
+ S2Point(-1, 0, -1), S2Point(-1, 0, 1),
404
+ acos(-0.5), S2Point(0, 0, 0), S2Point(0, 0, 0));
405
+ }
406
+
407
+ // Given two edges a0a1 and b0b1, check that the maximum distance between them
408
+ // is "distance_radians". Parameters are passed by value so that this
409
+ // function can normalize them.
410
+ void CheckEdgePairMaxDistance(S2Point a0, S2Point a1, S2Point b0, S2Point b1,
411
+ double distance_radians) {
412
+ a0 = a0.Normalize();
413
+ a1 = a1.Normalize();
414
+ b0 = b0.Normalize();
415
+ b1 = b1.Normalize();
416
+
417
+ S1ChordAngle max_distance = S1ChordAngle::Straight();
418
+ EXPECT_FALSE(S2::UpdateEdgePairMaxDistance(a0, a1, b0, b1, &max_distance));
419
+ max_distance = S1ChordAngle::Negative();
420
+ EXPECT_TRUE(S2::UpdateEdgePairMaxDistance(a0, a1, b0, b1, &max_distance));
421
+ EXPECT_NEAR(distance_radians, max_distance.radians(), 1e-15);
422
+ }
423
+
424
+ TEST(S2, EdgePairMaxDistance) {
425
+ // Standard situation. Same hemisphere, not degenerate.
426
+ CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
427
+ S2Point(1, 1, 0), S2Point(1, 1, 1),
428
+ acos(1/sqrt(3)));
429
+
430
+ // One edge is degenerate.
431
+ CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 1),
432
+ S2Point(1, -1, 0), S2Point(1, 1, 0),
433
+ acos(0.5));
434
+ CheckEdgePairMaxDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
435
+ S2Point(1, 0, 1), S2Point(1, 0, 1),
436
+ acos(0.5));
437
+
438
+ // Both edges are degenerate.
439
+ CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
440
+ S2Point(0, 1, 0), S2Point(0, 1, 0),
441
+ M_PI_2);
442
+
443
+ // Both edges are degenerate and antipodal.
444
+ CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
445
+ S2Point(-1, 0, 0), S2Point(-1, 0, 0),
446
+ M_PI);
447
+
448
+ // Two identical edges.
449
+ CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
450
+ S2Point(1, 0, 0), S2Point(0, 1, 0),
451
+ M_PI_2);
452
+
453
+ // Both edges are degenerate and identical.
454
+ CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
455
+ S2Point(1, 0, 0), S2Point(1, 0, 0),
456
+ 0);
457
+
458
+ // Antipodal reflection of one edge crosses the other edge.
459
+ CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, -1),
460
+ S2Point(-1, -1, 0), S2Point(-1, 1, 0),
461
+ M_PI);
462
+
463
+ // One vertex of one edge touches the interior of the antipodal reflection
464
+ // of the other edge.
465
+ CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 0),
466
+ S2Point(-1, -1, 0), S2Point(-1, 1, 0),
467
+ M_PI);
468
+ }
469
+
470
+ bool IsEdgeBNearEdgeA(const string& a_str, const string& b_str,
471
+ double max_error_degrees) {
472
+ unique_ptr<S2Polyline> a(s2textformat::MakePolyline(a_str));
473
+ EXPECT_EQ(2, a->num_vertices());
474
+ unique_ptr<S2Polyline> b(s2textformat::MakePolyline(b_str));
475
+ EXPECT_EQ(2, b->num_vertices());
476
+ return S2::IsEdgeBNearEdgeA(a->vertex(0), a->vertex(1),
477
+ b->vertex(0), b->vertex(1),
478
+ S1Angle::Degrees(max_error_degrees));
479
+ }
480
+
481
+ TEST(S2, EdgeBNearEdgeA) {
482
+ // Edge is near itself.
483
+ EXPECT_TRUE(IsEdgeBNearEdgeA("5:5, 10:-5", "5:5, 10:-5", 1e-6));
484
+
485
+ // Edge is near its reverse
486
+ EXPECT_TRUE(IsEdgeBNearEdgeA("5:5, 10:-5", "10:-5, 5:5", 1e-6));
487
+
488
+ // Short edge is near long edge.
489
+ EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "2:1, -2:1", 1.0));
490
+
491
+ // Long edges cannot be near shorter edges.
492
+ EXPECT_FALSE(IsEdgeBNearEdgeA("2:1, -2:1", "10:0, -10:0", 1.0));
493
+
494
+ // Orthogonal crossing edges are not near each other...
495
+ EXPECT_FALSE(IsEdgeBNearEdgeA("10:0, -10:0", "0:1.5, 0:-1.5", 1.0));
496
+
497
+ // ... unless all points on B are within tolerance of A.
498
+ EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "0:1.5, 0:-1.5", 2.0));
499
+
500
+ // Very long edges whose endpoints are close may have interior points that are
501
+ // far apart. An implementation that only considers the vertices of polylines
502
+ // will incorrectly consider such edges as "close" when they are not.
503
+ // Consider, for example, two consecutive lines of longitude. As they
504
+ // approach the poles, they become arbitrarily close together, but along the
505
+ // equator they bow apart.
506
+ EXPECT_FALSE(IsEdgeBNearEdgeA("89:1, -89:1", "89:2, -89:2", 0.5));
507
+ EXPECT_TRUE(IsEdgeBNearEdgeA("89:1, -89:1", "89:2, -89:2", 1.5));
508
+
509
+ // The two arcs here are nearly as long as S2 edges can be (just shy of 180
510
+ // degrees), and their endpoints are less than 1 degree apart. Their
511
+ // midpoints, however, are at opposite ends of the sphere along its equator.
512
+ EXPECT_FALSE(IsEdgeBNearEdgeA(
513
+ "0:-179.75, 0:-0.25", "0:179.75, 0:0.25", 1.0));
514
+
515
+ // At the equator, the second arc here is 9.75 degrees from the first, and
516
+ // closer at all other points. However, the southern point of the second arc
517
+ // (-1, 9.75) is too far from the first arc for the short-circuiting logic in
518
+ // IsEdgeBNearEdgeA to apply.
519
+ EXPECT_TRUE(IsEdgeBNearEdgeA("40:0, -5:0", "39:0.975, -1:0.975", 1.0));
520
+
521
+ // Same as above, but B's orientation is reversed, causing the angle between
522
+ // the normal vectors of circ(B) and circ(A) to be (180-9.75) = 170.5 degrees,
523
+ // not 9.75 degrees. The greatest separation between the planes is still 9.75
524
+ // degrees.
525
+ EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "-.4:0.975, 0.4:0.975", 1.0));
526
+
527
+ // A and B are on the same great circle, A and B partially overlap, but the
528
+ // only part of B that does not overlap A is shorter than tolerance.
529
+ EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "0.9:0, 1.1:0", 0.25));
530
+
531
+ // A and B are on the same great circle, all points on B are close to A at its
532
+ // second endpoint, (1,0).
533
+ EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "1.1:0, 1.2:0", 0.25));
534
+
535
+ // Same as above, but B's orientation is reversed. This case is special
536
+ // because the projection of the normal defining A onto the plane containing B
537
+ // is the null vector, and must be handled by a special case.
538
+ EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "1.2:0, 1.1:0", 0.25));
539
+ }