@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,343 @@
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
+ #ifndef S2_S2EDGE_CROSSER_H_
19
+ #define S2_S2EDGE_CROSSER_H_
20
+
21
+ #include "s2/base/logging.h"
22
+ #include "s2/_fp_contract_off.h"
23
+ #include "s2/s2edge_crossings.h"
24
+ #include "s2/s2pointutil.h"
25
+ #include "s2/s2predicates.h"
26
+
27
+ class S2CopyingEdgeCrosser; // Forward declaration
28
+
29
+ // This class allows edges to be efficiently tested for intersection with a
30
+ // given fixed edge AB. It is especially efficient when testing for
31
+ // intersection with an edge chain connecting vertices v0, v1, v2, ...
32
+ //
33
+ // Example usage:
34
+ //
35
+ // void CountIntersections(const S2Point& a, const S2Point& b,
36
+ // const vector<pair<S2Point, S2Point>>& edges) {
37
+ // int count = 0;
38
+ // S2EdgeCrosser crosser(&a, &b);
39
+ // for (const auto& edge : edges) {
40
+ // if (crosser.CrossingSign(&edge.first, &edge.second) >= 0) {
41
+ // ++count;
42
+ // }
43
+ // }
44
+ // return count;
45
+ // }
46
+ //
47
+ // This class expects that the client already has all the necessary vertices
48
+ // stored in memory, so that this class can refer to them with pointers and
49
+ // does not need to make its own copies. If this is not the case (e.g., you
50
+ // want to pass temporary objects as vertices), see S2CopyingEdgeCrosser.
51
+ class S2EdgeCrosser {
52
+ public:
53
+ // Default constructor; must be followed by a call to Init().
54
+ S2EdgeCrosser() {}
55
+
56
+ // Convenience constructor that calls Init() with the given fixed edge AB.
57
+ // The arguments "a" and "b" must point to values that persist for the
58
+ // lifetime of the S2EdgeCrosser object (or until the next Init() call).
59
+ S2EdgeCrosser(const S2Point* a, const S2Point* b);
60
+
61
+ // Accessors for the constructor arguments.
62
+ const S2Point* a() { return a_; }
63
+ const S2Point* b() { return b_; }
64
+
65
+ // Initialize the S2EdgeCrosser with the given fixed edge AB. The arguments
66
+ // "a" and "b" must point to values that persist for the lifetime of the
67
+ // S2EdgeCrosser object (or until the next Init() call).
68
+ void Init(const S2Point* a, const S2Point* b);
69
+
70
+ // This function determines whether the edge AB intersects the edge CD.
71
+ // Returns +1 if AB crosses CD at a point that is interior to both edges.
72
+ // Returns 0 if any two vertices from different edges are the same.
73
+ // Returns -1 otherwise.
74
+ //
75
+ // Note that if an edge is degenerate (A == B or C == D), the return value
76
+ // is 0 if two vertices from different edges are the same and -1 otherwise.
77
+ //
78
+ // Properties of CrossingSign:
79
+ //
80
+ // (1) CrossingSign(b,a,c,d) == CrossingSign(a,b,c,d)
81
+ // (2) CrossingSign(c,d,a,b) == CrossingSign(a,b,c,d)
82
+ // (3) CrossingSign(a,b,c,d) == 0 if a==c, a==d, b==c, b==d
83
+ // (3) CrossingSign(a,b,c,d) <= 0 if a==b or c==d (see above)
84
+ //
85
+ // This function implements an exact, consistent perturbation model such
86
+ // that no three points are ever considered to be collinear. This means
87
+ // that even if you have 4 points A, B, C, D that lie exactly in a line
88
+ // (say, around the equator), C and D will be treated as being slightly to
89
+ // one side or the other of AB. This is done in a way such that the
90
+ // results are always consistent (see s2pred::Sign).
91
+ //
92
+ // Note that if you want to check an edge against a chain of other edges,
93
+ // it is slightly more efficient to use the single-argument version of
94
+ // CrossingSign below.
95
+ //
96
+ // The arguments must point to values that persist until the next call.
97
+ int CrossingSign(const S2Point* c, const S2Point* d);
98
+
99
+ // This method extends the concept of a "crossing" to the case where AB
100
+ // and CD have a vertex in common. The two edges may or may not cross,
101
+ // according to the rules defined in VertexCrossing() below. The rules
102
+ // are designed so that point containment tests can be implemented simply
103
+ // by counting edge crossings. Similarly, determining whether one edge
104
+ // chain crosses another edge chain can be implemented by counting.
105
+ //
106
+ // Returns true if CrossingSign(c, d) > 0, or AB and CD share a vertex
107
+ // and VertexCrossing(a, b, c, d) returns true.
108
+ //
109
+ // The arguments must point to values that persist until the next call.
110
+ bool EdgeOrVertexCrossing(const S2Point* c, const S2Point* d);
111
+
112
+ ///////////////////////// Edge Chain Methods ///////////////////////////
113
+ //
114
+ // You don't need to use these unless you're trying to squeeze out every
115
+ // last drop of performance. Essentially all you are saving is a test
116
+ // whether the first vertex of the current edge is the same as the second
117
+ // vertex of the previous edge. Example usage:
118
+ //
119
+ // vector<S2Point> chain;
120
+ // crosser.RestartAt(&chain[0]);
121
+ // for (int i = 1; i < chain.size(); ++i) {
122
+ // if (crosser.EdgeOrVertexCrossing(&chain[i])) { ++count; }
123
+ // }
124
+
125
+ // Convenience constructor that uses AB as the fixed edge, and C as the
126
+ // first vertex of the vertex chain (equivalent to calling RestartAt(c)).
127
+ //
128
+ // The arguments must point to values that persist until the next call.
129
+ S2EdgeCrosser(const S2Point* a, const S2Point* b, const S2Point* c);
130
+
131
+ // Call this method when your chain 'jumps' to a new place.
132
+ // The argument must point to a value that persists until the next call.
133
+ void RestartAt(const S2Point* c);
134
+
135
+ // Like CrossingSign above, but uses the last vertex passed to one of
136
+ // the crossing methods (or RestartAt) as the first vertex of the current
137
+ // edge.
138
+ //
139
+ // The argument must point to a value that persists until the next call.
140
+ int CrossingSign(const S2Point* d);
141
+
142
+ // Like EdgeOrVertexCrossing above, but uses the last vertex passed to one
143
+ // of the crossing methods (or RestartAt) as the first vertex of the
144
+ // current edge.
145
+ //
146
+ // The argument must point to a value that persists until the next call.
147
+ bool EdgeOrVertexCrossing(const S2Point* d);
148
+
149
+ // Returns the last vertex of the current edge chain being tested, i.e. the
150
+ // C vertex that will be used to construct the edge CD when one of the
151
+ // methods above is called.
152
+ const S2Point* c() { return c_; }
153
+
154
+ private:
155
+ friend class S2CopyingEdgeCrosser;
156
+
157
+ // These functions handle the "slow path" of CrossingSign().
158
+ int CrossingSignInternal(const S2Point* d);
159
+ int CrossingSignInternal2(const S2Point& d);
160
+
161
+ // Used internally by S2CopyingEdgeCrosser. Updates "c_" only.
162
+ void set_c(const S2Point* c) { c_ = c; }
163
+
164
+ // The fields below are constant after the call to Init().
165
+ const S2Point* a_;
166
+ const S2Point* b_;
167
+ Vector3_d a_cross_b_;
168
+
169
+ // To reduce the number of calls to s2pred::ExpensiveSign(), we compute an
170
+ // outward-facing tangent at A and B if necessary. If the plane
171
+ // perpendicular to one of these tangents separates AB from CD (i.e., one
172
+ // edge on each side) then there is no intersection.
173
+ bool have_tangents_; // True if the tangents have been computed.
174
+ S2Point a_tangent_; // Outward-facing tangent at A.
175
+ S2Point b_tangent_; // Outward-facing tangent at B.
176
+
177
+ // The fields below are updated for each vertex in the chain.
178
+ const S2Point* c_; // Previous vertex in the vertex chain.
179
+ int acb_; // The orientation of triangle ACB.
180
+
181
+ // The field below is a temporary used by CrossingSignInternal().
182
+ int bda_; // The orientation of triangle BDA.
183
+
184
+ S2EdgeCrosser(const S2EdgeCrosser&) = delete;
185
+ void operator=(const S2EdgeCrosser&) = delete;
186
+ };
187
+
188
+ // S2CopyingEdgeCrosser is exactly like S2EdgeCrosser, except that it makes its
189
+ // own copy of all arguments so that they do not need to persist between
190
+ // calls. This is less efficient, but makes it possible to use points that
191
+ // are generated on demand and cannot conveniently be stored by the client.
192
+ class S2CopyingEdgeCrosser {
193
+ public:
194
+ // These methods are all exactly like S2EdgeCrosser, except that the
195
+ // arguments can be temporaries.
196
+ S2CopyingEdgeCrosser() {}
197
+ S2CopyingEdgeCrosser(const S2Point& a, const S2Point& b);
198
+ const S2Point& a() { return a_; }
199
+ const S2Point& b() { return b_; }
200
+ const S2Point& c() { return c_; }
201
+ void Init(const S2Point& a, const S2Point& b);
202
+ int CrossingSign(const S2Point& c, const S2Point& d);
203
+ bool EdgeOrVertexCrossing(const S2Point& c, const S2Point& d);
204
+ S2CopyingEdgeCrosser(const S2Point& a, const S2Point& b, const S2Point& c);
205
+ void RestartAt(const S2Point& c);
206
+ int CrossingSign(const S2Point& d);
207
+ bool EdgeOrVertexCrossing(const S2Point& d);
208
+
209
+ private:
210
+ S2Point a_, b_, c_;
211
+ // TODO(ericv): It would be more efficient to implement S2CopyingEdgeCrosser
212
+ // directly rather than as a wrapper around S2EdgeCrosser.
213
+ S2EdgeCrosser crosser_;
214
+
215
+ S2CopyingEdgeCrosser(const S2CopyingEdgeCrosser&) = delete;
216
+ void operator=(const S2CopyingEdgeCrosser&) = delete;
217
+ };
218
+
219
+
220
+ ////////////////// Implementation details follow ////////////////////
221
+
222
+
223
+ inline S2EdgeCrosser::S2EdgeCrosser(const S2Point* a, const S2Point* b)
224
+ : a_(a), b_(b), a_cross_b_(a_->CrossProd(*b_)), have_tangents_(false),
225
+ c_(nullptr) {
226
+ S2_DCHECK(S2::IsUnitLength(*a));
227
+ S2_DCHECK(S2::IsUnitLength(*b));
228
+ }
229
+
230
+ inline void S2EdgeCrosser::Init(const S2Point* a, const S2Point* b) {
231
+ a_ = a;
232
+ b_ = b;
233
+ a_cross_b_ = a->CrossProd(*b_);
234
+ have_tangents_ = false;
235
+ c_ = nullptr;
236
+ }
237
+
238
+ inline int S2EdgeCrosser::CrossingSign(const S2Point* c, const S2Point* d) {
239
+ if (c != c_) RestartAt(c);
240
+ return CrossingSign(d);
241
+ }
242
+
243
+ inline bool S2EdgeCrosser::EdgeOrVertexCrossing(const S2Point* c,
244
+ const S2Point* d) {
245
+ if (c != c_) RestartAt(c);
246
+ return EdgeOrVertexCrossing(d);
247
+ }
248
+
249
+ inline S2EdgeCrosser::S2EdgeCrosser(
250
+ const S2Point* a, const S2Point* b, const S2Point* c)
251
+ : a_(a), b_(b), a_cross_b_(a_->CrossProd(*b_)), have_tangents_(false) {
252
+ S2_DCHECK(S2::IsUnitLength(*a));
253
+ S2_DCHECK(S2::IsUnitLength(*b));
254
+ RestartAt(c);
255
+ }
256
+
257
+ inline void S2EdgeCrosser::RestartAt(const S2Point* c) {
258
+ S2_DCHECK(S2::IsUnitLength(*c));
259
+ c_ = c;
260
+ acb_ = -s2pred::TriageSign(*a_, *b_, *c_, a_cross_b_);
261
+ }
262
+
263
+ inline int S2EdgeCrosser::CrossingSign(const S2Point* d) {
264
+ S2_DCHECK(S2::IsUnitLength(*d));
265
+ // For there to be an edge crossing, the triangles ACB, CBD, BDA, DAC must
266
+ // all be oriented the same way (CW or CCW). We keep the orientation of ACB
267
+ // as part of our state. When each new point D arrives, we compute the
268
+ // orientation of BDA and check whether it matches ACB. This checks whether
269
+ // the points C and D are on opposite sides of the great circle through AB.
270
+
271
+ // Recall that TriageSign is invariant with respect to rotating its
272
+ // arguments, i.e. ABD has the same orientation as BDA.
273
+ int bda = s2pred::TriageSign(*a_, *b_, *d, a_cross_b_);
274
+ if (acb_ == -bda && bda != 0) {
275
+ // The most common case -- triangles have opposite orientations. Save the
276
+ // current vertex D as the next vertex C, and also save the orientation of
277
+ // the new triangle ACB (which is opposite to the current triangle BDA).
278
+ c_ = d;
279
+ acb_ = -bda;
280
+ return -1;
281
+ }
282
+ bda_ = bda;
283
+ return CrossingSignInternal(d);
284
+ }
285
+
286
+ inline bool S2EdgeCrosser::EdgeOrVertexCrossing(const S2Point* d) {
287
+ // We need to copy c_ since it is clobbered by CrossingSign().
288
+ const S2Point* c = c_;
289
+ int crossing = CrossingSign(d);
290
+ if (crossing < 0) return false;
291
+ if (crossing > 0) return true;
292
+ return S2::VertexCrossing(*a_, *b_, *c, *d);
293
+ }
294
+
295
+ inline S2CopyingEdgeCrosser::S2CopyingEdgeCrosser(const S2Point& a,
296
+ const S2Point& b)
297
+ : a_(a), b_(b), c_(S2Point()), crosser_(&a_, &b_) {
298
+ }
299
+
300
+ inline void S2CopyingEdgeCrosser::Init(const S2Point& a, const S2Point& b) {
301
+ a_ = a;
302
+ b_ = b;
303
+ c_ = S2Point();
304
+ crosser_.Init(&a_, &b_);
305
+ }
306
+
307
+ inline int S2CopyingEdgeCrosser::CrossingSign(const S2Point& c,
308
+ const S2Point& d) {
309
+ if (c != c_ || crosser_.c_ == nullptr) RestartAt(c);
310
+ return CrossingSign(d);
311
+ }
312
+
313
+ inline bool S2CopyingEdgeCrosser::EdgeOrVertexCrossing(
314
+ const S2Point& c, const S2Point& d) {
315
+ if (c != c_ || crosser_.c_ == nullptr) RestartAt(c);
316
+ return EdgeOrVertexCrossing(d);
317
+ }
318
+
319
+ inline S2CopyingEdgeCrosser::S2CopyingEdgeCrosser(
320
+ const S2Point& a, const S2Point& b, const S2Point& c)
321
+ : a_(a), b_(b), c_(c), crosser_(&a_, &b_, &c) {
322
+ }
323
+
324
+ inline void S2CopyingEdgeCrosser::RestartAt(const S2Point& c) {
325
+ c_ = c;
326
+ crosser_.RestartAt(&c_);
327
+ }
328
+
329
+ inline int S2CopyingEdgeCrosser::CrossingSign(const S2Point& d) {
330
+ int result = crosser_.CrossingSign(&d);
331
+ c_ = d;
332
+ crosser_.set_c(&c_);
333
+ return result;
334
+ }
335
+
336
+ inline bool S2CopyingEdgeCrosser::EdgeOrVertexCrossing(const S2Point& d) {
337
+ bool result = crosser_.EdgeOrVertexCrossing(&d);
338
+ c_ = d;
339
+ crosser_.set_c(&c_);
340
+ return result;
341
+ }
342
+
343
+ #endif // S2_S2EDGE_CROSSER_H_
@@ -0,0 +1,264 @@
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_crosser.h"
19
+
20
+ #include <limits>
21
+ #include <string>
22
+ #include <vector>
23
+
24
+ #include "s2/base/logging.h"
25
+ #include <gtest/gtest.h>
26
+ #include "s2/s2edge_crossings.h"
27
+ #include "s2/s2edge_distances.h"
28
+ #include "s2/s2pointutil.h"
29
+ #include "s2/s2testing.h"
30
+
31
+ using std::vector;
32
+
33
+ #ifdef NDEBUG
34
+
35
+ // In non-debug builds, check that default-constructed and/or NaN S2Point
36
+ // arguments don't cause crashes, especially on the very first method call
37
+ // (since S2CopyingEdgeCrosser checks whether the first vertex of each edge is
38
+ // the same as the last vertex of the previous edged when deciding whether or
39
+ // not to call Restart).
40
+
41
+ void TestCrossingSignInvalid(const S2Point& point, int expected) {
42
+ S2EdgeCrosser crosser(&point, &point);
43
+ EXPECT_EQ(expected, crosser.CrossingSign(&point, &point));
44
+ S2CopyingEdgeCrosser crosser2(point, point);
45
+ EXPECT_EQ(expected, crosser2.CrossingSign(point, point));
46
+ }
47
+
48
+ void TestEdgeOrVertexCrossingInvalid(const S2Point& point, bool expected) {
49
+ S2EdgeCrosser crosser(&point, &point);
50
+ EXPECT_EQ(expected, crosser.EdgeOrVertexCrossing(&point, &point));
51
+ S2CopyingEdgeCrosser crosser2(point, point);
52
+ EXPECT_EQ(expected, crosser2.EdgeOrVertexCrossing(point, point));
53
+ }
54
+
55
+ TEST(S2EdgeUtil, InvalidDefaultPoints) {
56
+ // Check that default-constructed S2Point arguments don't cause crashes.
57
+ S2Point point(0, 0, 0);
58
+ TestCrossingSignInvalid(point, 0);
59
+ TestEdgeOrVertexCrossingInvalid(point, false);
60
+ }
61
+
62
+ TEST(S2EdgeUtil, InvalidNanPoints) {
63
+ // Check that NaN S2Point arguments don't cause crashes.
64
+ const double nan = std::numeric_limits<double>::quiet_NaN();
65
+ S2Point point(nan, nan, nan);
66
+ TestCrossingSignInvalid(point, -1);
67
+ TestEdgeOrVertexCrossingInvalid(point, false);
68
+ }
69
+
70
+ #endif
71
+
72
+ void TestCrossing(const S2Point& a, const S2Point& b,
73
+ const S2Point& c, const S2Point& d,
74
+ int robust, bool edge_or_vertex) {
75
+ // Modify the expected result if two vertices from different edges match.
76
+ if (a == c || a == d || b == c || b == d) robust = 0;
77
+ EXPECT_EQ(robust, S2::CrossingSign(a, b, c, d));
78
+ S2EdgeCrosser crosser(&a, &b, &c);
79
+ EXPECT_EQ(robust, crosser.CrossingSign(&d));
80
+ EXPECT_EQ(robust, crosser.CrossingSign(&c));
81
+ EXPECT_EQ(robust, crosser.CrossingSign(&d, &c));
82
+ EXPECT_EQ(robust, crosser.CrossingSign(&c, &d));
83
+
84
+ EXPECT_EQ(edge_or_vertex, S2::EdgeOrVertexCrossing(a, b, c, d));
85
+ crosser.RestartAt(&c);
86
+ EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&d));
87
+ EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&c));
88
+ EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&d, &c));
89
+ EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&c, &d));
90
+
91
+ // Check that the crosser can be re-used.
92
+ crosser.Init(&c, &d);
93
+ crosser.RestartAt(&a);
94
+ EXPECT_EQ(robust, crosser.CrossingSign(&b));
95
+ EXPECT_EQ(robust, crosser.CrossingSign(&a));
96
+
97
+ // Now try all the same tests with CopyingEdgeCrosser.
98
+ S2CopyingEdgeCrosser crosser2(a, b, c);
99
+ EXPECT_EQ(robust, crosser2.CrossingSign(d));
100
+ EXPECT_EQ(robust, crosser2.CrossingSign(c));
101
+ EXPECT_EQ(robust, crosser2.CrossingSign(d, c));
102
+ EXPECT_EQ(robust, crosser2.CrossingSign(c, d));
103
+
104
+ EXPECT_EQ(edge_or_vertex, S2::EdgeOrVertexCrossing(a, b, c, d));
105
+ crosser2.RestartAt(c);
106
+ EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(d));
107
+ EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(c));
108
+ EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(d, c));
109
+ EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(c, d));
110
+
111
+ // Check that the crosser can be re-used.
112
+ crosser2.Init(c, d);
113
+ crosser2.RestartAt(a);
114
+ EXPECT_EQ(robust, crosser2.CrossingSign(b));
115
+ EXPECT_EQ(robust, crosser2.CrossingSign(a));
116
+ }
117
+
118
+ void TestCrossings(S2Point a, S2Point b, S2Point c, S2Point d,
119
+ int robust, bool edge_or_vertex) {
120
+ a = a.Normalize();
121
+ b = b.Normalize();
122
+ c = c.Normalize();
123
+ d = d.Normalize();
124
+ TestCrossing(a, b, c, d, robust, edge_or_vertex);
125
+ TestCrossing(b, a, c, d, robust, edge_or_vertex);
126
+ TestCrossing(a, b, d, c, robust, edge_or_vertex);
127
+ TestCrossing(b, a, d, c, robust, edge_or_vertex);
128
+ TestCrossing(a, a, c, d, -1, false);
129
+ TestCrossing(a, b, c, c, -1, false);
130
+ TestCrossing(a, a, c, c, -1, false);
131
+ TestCrossing(a, b, a, b, 0, true);
132
+ TestCrossing(c, d, a, b, robust, edge_or_vertex != (robust == 0));
133
+ }
134
+
135
+ TEST(S2EdgeUtil, Crossings) {
136
+ // The real tests of edge crossings are in s2{loop,polygon}_test,
137
+ // but we do a few simple tests here.
138
+
139
+ // Two regular edges that cross.
140
+ TestCrossings(S2Point(1, 2, 1), S2Point(1, -3, 0.5),
141
+ S2Point(1, -0.5, -3), S2Point(0.1, 0.5, 3), 1, true);
142
+
143
+ // Two regular edges that intersect antipodal points.
144
+ TestCrossings(S2Point(1, 2, 1), S2Point(1, -3, 0.5),
145
+ S2Point(-1, 0.5, 3), S2Point(-0.1, -0.5, -3), -1, false);
146
+
147
+ // Two edges on the same great circle that start at antipodal points.
148
+ TestCrossings(S2Point(0, 0, -1), S2Point(0, 1, 0),
149
+ S2Point(0, 0, 1), S2Point(0, 1, 1), -1, false);
150
+
151
+ // Two edges that cross where one vertex is S2::Origin().
152
+ TestCrossings(S2Point(1, 0, 0), S2::Origin(),
153
+ S2Point(1, -0.1, 1), S2Point(1, 1, -0.1), 1, true);
154
+
155
+ // Two edges that intersect antipodal points where one vertex is
156
+ // S2::Origin().
157
+ TestCrossings(S2Point(1, 0, 0), S2::Origin(),
158
+ S2Point(-1, 0.1, -1), S2Point(-1, -1, 0.1), -1, false);
159
+
160
+ // Two edges that share an endpoint. The Ortho() direction is (-4,0,2),
161
+ // and edge CD is further CCW around (2,3,4) than AB.
162
+ TestCrossings(S2Point(2, 3, 4), S2Point(-1, 2, 5),
163
+ S2Point(7, -2, 3), S2Point(2, 3, 4), 0, false);
164
+
165
+ // Two edges that barely cross each other near the middle of one edge. The
166
+ // edge AB is approximately in the x=y plane, while CD is approximately
167
+ // perpendicular to it and ends exactly at the x=y plane.
168
+ TestCrossings(S2Point(1, 1, 1), S2Point(1, nextafter(1, 0), -1),
169
+ S2Point(11, -12, -1), S2Point(10, 10, 1), 1, true);
170
+
171
+ // In this version, the edges are separated by a distance of about 1e-15.
172
+ TestCrossings(S2Point(1, 1, 1), S2Point(1, nextafter(1, 2), -1),
173
+ S2Point(1, -1, 0), S2Point(1, 1, 0), -1, false);
174
+
175
+ // Two edges that barely cross each other near the end of both edges. This
176
+ // example cannot be handled using regular double-precision arithmetic due
177
+ // to floating-point underflow.
178
+ TestCrossings(S2Point(0, 0, 1), S2Point(2, -1e-323, 1),
179
+ S2Point(1, -1, 1), S2Point(1e-323, 0, 1), 1, true);
180
+
181
+ // In this version, the edges are separated by a distance of about 1e-640.
182
+ TestCrossings(S2Point(0, 0, 1), S2Point(2, 1e-323, 1),
183
+ S2Point(1, -1, 1), S2Point(1e-323, 0, 1), -1, false);
184
+
185
+ // Two edges that barely cross each other near the middle of one edge.
186
+ // Computing the exact determinant of some of the triangles in this test
187
+ // requires more than 2000 bits of precision.
188
+ TestCrossings(S2Point(1, -1e-323, -1e-323), S2Point(1e-323, 1, 1e-323),
189
+ S2Point(1, -1, 1e-323), S2Point(1, 1, 0),
190
+ 1, true);
191
+
192
+ // In this version, the edges are separated by a distance of about 1e-640.
193
+ TestCrossings(S2Point(1, 1e-323, -1e-323), S2Point(-1e-323, 1, 1e-323),
194
+ S2Point(1, -1, 1e-323), S2Point(1, 1, 0),
195
+ -1, false);
196
+ }
197
+
198
+ TEST(S2EdgeUtil, CollinearEdgesThatDontTouch) {
199
+ const int kIters = 500;
200
+ for (int iter = 0; iter < kIters; ++iter) {
201
+ S2Point a = S2Testing::RandomPoint();
202
+ S2Point d = S2Testing::RandomPoint();
203
+ S2Point b = S2::Interpolate(0.05, a, d);
204
+ S2Point c = S2::Interpolate(0.95, a, d);
205
+ EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
206
+ EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
207
+ S2EdgeCrosser crosser(&a, &b, &c);
208
+ EXPECT_GT(0, crosser.CrossingSign(&d));
209
+ EXPECT_GT(0, crosser.CrossingSign(&c));
210
+ }
211
+ }
212
+
213
+
214
+ TEST(S2EdgeUtil, CoincidentZeroLengthEdgesThatDontTouch) {
215
+ // It is important that the edge primitives can handle vertices that exactly
216
+ // exactly proportional to each other, i.e. that are not identical but are
217
+ // nevertheless exactly coincident when projected onto the unit sphere.
218
+ // There are various ways that such points can arise. For example,
219
+ // Normalize() itself is not idempotent: there exist distinct points A,B
220
+ // such that Normalize(A) == B and Normalize(B) == A. Another issue is
221
+ // that sometimes calls to Normalize() are skipped when the result of a
222
+ // calculation "should" be unit length mathematically (e.g., when computing
223
+ // the cross product of two orthonormal vectors).
224
+ //
225
+ // This test checks pairs of edges AB and CD where A,B,C,D are exactly
226
+ // coincident on the sphere and the norms of A,B,C,D are monotonically
227
+ // increasing. Such edge pairs should never intersect. (This is not
228
+ // obvious, since it depends on the particular symbolic perturbations used
229
+ // by s2pred::Sign(). It would be better to replace this with a test that
230
+ // says that the CCW results must be consistent with each other.)
231
+ const int kIters = 1000;
232
+ for (int iter = 0; iter < kIters; ++iter) {
233
+ // Construct a point P where every component is zero or a power of 2.
234
+ S2Point p;
235
+ for (int i = 0; i < 3; ++i) {
236
+ int binary_exp = S2Testing::rnd.Skewed(11);
237
+ p[i] = (binary_exp > 1022) ? 0 : pow(2, -binary_exp);
238
+ }
239
+ // If all components were zero, try again. Note that normalization may
240
+ // convert a non-zero point into a zero one due to underflow (!)
241
+ p = p.Normalize();
242
+ if (p == S2Point(0, 0, 0)) { --iter; continue; }
243
+
244
+ // Now every non-zero component should have exactly the same mantissa.
245
+ // This implies that if we scale the point by an arbitrary factor, every
246
+ // non-zero component will still have the same mantissa. Scale the points
247
+ // so that they are all distinct and are still very likely to satisfy
248
+ // S2::IsUnitLength (which allows for a small amount of error in the norm).
249
+ S2Point a = (1-3e-16) * p;
250
+ S2Point b = (1-1e-16) * p;
251
+ S2Point c = p;
252
+ S2Point d = (1+2e-16) * p;
253
+ if (!S2::IsUnitLength(a) || !S2::IsUnitLength(d)) {
254
+ --iter;
255
+ continue;
256
+ }
257
+ // Verify that the expected edges do not cross.
258
+ EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
259
+ S2EdgeCrosser crosser(&a, &b, &c);
260
+ EXPECT_GT(0, crosser.CrossingSign(&d));
261
+ EXPECT_GT(0, crosser.CrossingSign(&c));
262
+ }
263
+ }
264
+