@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,220 @@
1
+ // Copyright 2013 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_S2CROSSING_EDGE_QUERY_H_
19
+ #define S2_S2CROSSING_EDGE_QUERY_H_
20
+
21
+ #include <type_traits>
22
+ #include <vector>
23
+
24
+ #include "s2/third_party/absl/base/macros.h"
25
+ #include "s2/third_party/absl/container/inlined_vector.h"
26
+ #include "s2/_fp_contract_off.h"
27
+ #include "s2/r2.h"
28
+ #include "s2/r2rect.h"
29
+ #include "s2/s2padded_cell.h"
30
+ #include "s2/s2shape_index.h"
31
+ #include "s2/s2shapeutil_shape_edge.h"
32
+ #include "s2/s2shapeutil_shape_edge_id.h"
33
+
34
+ // A parameter that controls the reporting of edge intersections.
35
+ //
36
+ // - CrossingType::INTERIOR reports intersections that occur at a point
37
+ // interior to both edges (i.e., not at a vertex).
38
+ //
39
+ // - CrossingType::ALL reports all intersections, even those where two edges
40
+ // intersect only because they share a common vertex.
41
+ namespace s2shapeutil {
42
+ enum class CrossingType { INTERIOR, ALL };
43
+ } // namespace s2shapeutil
44
+
45
+ // S2CrossingEdgeQuery is used to find edges or shapes that are crossed by
46
+ // an edge. Here is an example showing how to index a set of polylines,
47
+ // and then find the polylines that are crossed by a given edge AB:
48
+ //
49
+ // void Test(const vector<S2Polyline*>& polylines,`
50
+ // const S2Point& a0, const S2Point &a1) {
51
+ // MutableS2ShapeIndex index;
52
+ // for (S2Polyline* polyline : polylines) {
53
+ // index.Add(absl::make_unique<S2Polyline::Shape>(polyline));
54
+ // }
55
+ // S2CrossingEdgeQuery query(&index);
56
+ // for (const auto& edge : query.GetCrossingEdges(a, b, CrossingType::ALL)) {
57
+ // S2_CHECK_GE(S2::CrossingSign(a0, a1, edge.v0(), edge.v1()), 0);
58
+ // }
59
+ // }
60
+ //
61
+ // Note that if you need to query many edges, it is more efficient to declare
62
+ // a single S2CrossingEdgeQuery object and reuse it so that temporary storage
63
+ // does not need to be reallocated each time.
64
+ //
65
+ // If you want to find *all* pairs of crossing edges, use
66
+ // s2shapeutil::VisitCrossingEdgePairs() instead.
67
+ class S2CrossingEdgeQuery {
68
+ public:
69
+ using CrossingType = s2shapeutil::CrossingType; // Defined above.
70
+
71
+ // Convenience constructor that calls Init().
72
+ explicit S2CrossingEdgeQuery(const S2ShapeIndex* index);
73
+
74
+ // Default constructor; requires Init() to be called.
75
+ S2CrossingEdgeQuery();
76
+ ~S2CrossingEdgeQuery();
77
+
78
+ S2CrossingEdgeQuery(const S2CrossingEdgeQuery&) = delete;
79
+ void operator=(const S2CrossingEdgeQuery&) = delete;
80
+
81
+ const S2ShapeIndex& index() const { return *index_; }
82
+
83
+ // REQUIRES: "index" is not modified after this method is called.
84
+ void Init(const S2ShapeIndex* index);
85
+
86
+ // Returns all edges that intersect the given query edge (a0,a1) and that
87
+ // have the given CrossingType (ALL or INTERIOR). Edges are sorted and
88
+ // unique.
89
+ std::vector<s2shapeutil::ShapeEdge> GetCrossingEdges(
90
+ const S2Point& a0, const S2Point& a1, CrossingType type);
91
+
92
+ // A specialized version of GetCrossingEdges() that only returns the edges
93
+ // that belong to a particular S2Shape.
94
+ std::vector<s2shapeutil::ShapeEdge> GetCrossingEdges(
95
+ const S2Point& a0, const S2Point& a1,
96
+ const S2Shape& shape, CrossingType type);
97
+
98
+ // These versions can be more efficient when they are called many times,
99
+ // since they do not require allocating a new vector on each call.
100
+ void GetCrossingEdges(const S2Point& a0, const S2Point& a1, CrossingType type,
101
+ std::vector<s2shapeutil::ShapeEdge>* edges);
102
+
103
+ void GetCrossingEdges(const S2Point& a0, const S2Point& a1,
104
+ const S2Shape& shape, CrossingType type,
105
+ std::vector<s2shapeutil::ShapeEdge>* edges);
106
+
107
+
108
+ /////////////////////////// Low-Level Methods ////////////////////////////
109
+ //
110
+ // Most clients will not need the following methods. They can be slightly
111
+ // more efficient but are harder to use, since they require the client to do
112
+ // all the actual crossing tests.
113
+
114
+ // Returns a superset of the edges that intersect a query edge (a0, a1).
115
+ // This method is useful for clients that want to test intersections in some
116
+ // other way, e.g. using S2::EdgeOrVertexCrossing().
117
+ std::vector<s2shapeutil::ShapeEdgeId> GetCandidates(const S2Point& a0,
118
+ const S2Point& a1);
119
+
120
+ // A specialized version of GetCandidates() that only returns the edges that
121
+ // belong to a particular S2Shape.
122
+ std::vector<s2shapeutil::ShapeEdgeId> GetCandidates(const S2Point& a0,
123
+ const S2Point& a1,
124
+ const S2Shape& shape);
125
+
126
+ // These versions can be more efficient when they are called many times,
127
+ // since they do not require allocating a new vector on each call.
128
+ void GetCandidates(const S2Point& a0, const S2Point& a1,
129
+ std::vector<s2shapeutil::ShapeEdgeId>* edges);
130
+
131
+ void GetCandidates(const S2Point& a0, const S2Point& a1, const S2Shape& shape,
132
+ std::vector<s2shapeutil::ShapeEdgeId>* edges);
133
+
134
+ // A function that is called with each candidate intersecting edge. The
135
+ // function may return false in order to request that the algorithm should
136
+ // be terminated, i.e. no further crossings are needed.
137
+ using ShapeEdgeIdVisitor =
138
+ std::function<bool (const s2shapeutil::ShapeEdgeId& id)>;
139
+
140
+ // Visits a superset of the edges that intersect the query edge (a0, a1),
141
+ // terminating early if the given ShapeEdgeIdVisitor returns false (in which
142
+ // case this function returns false as well).
143
+ //
144
+ // CAVEAT: Edges may be visited more than once.
145
+ bool VisitRawCandidates(const S2Point& a0, const S2Point& a1,
146
+ const ShapeEdgeIdVisitor& visitor);
147
+
148
+ bool VisitRawCandidates(const S2Point& a0, const S2Point& a1,
149
+ const S2Shape& shape,
150
+ const ShapeEdgeIdVisitor& visitor);
151
+
152
+ // A function that is called with each S2ShapeIndexCell that might contain
153
+ // edges intersecting the given query edge. The function may return false
154
+ // in order to request that the algorithm should be terminated, i.e. no
155
+ // further crossings are needed.
156
+ using CellVisitor = std::function<bool (const S2ShapeIndexCell& cell)>;
157
+
158
+ // Visits all S2ShapeIndexCells that might contain edges intersecting the
159
+ // given query edge (a0, a1), terminating early if the given CellVisitor
160
+ // returns false (in which case this function returns false as well).
161
+ //
162
+ // NOTE: Each candidate cell is visited exactly once.
163
+ bool VisitCells(const S2Point& a0, const S2Point& a1,
164
+ const CellVisitor& visitor);
165
+
166
+ // Visits all S2ShapeIndexCells within "root" that might contain edges
167
+ // intersecting the given query edge (a0, a1), terminating early if the
168
+ // given CellVisitor returns false (in which case this function returns
169
+ // false as well).
170
+ //
171
+ // NOTE: Each candidate cell is visited exactly once.
172
+ //
173
+ // REQUIRES: root.padding() == 0
174
+ // [This low-level method does not support padding; the argument is supplied
175
+ // as an S2PaddedCell in order to avoid constructing it repeatedly when
176
+ // this method is called using different query edges with the same root.]
177
+ bool VisitCells(const S2Point& a0, const S2Point& a1,
178
+ const S2PaddedCell& root, const CellVisitor& visitor);
179
+
180
+
181
+ // Given a query edge AB and a cell "root", returns all S2ShapeIndex cells
182
+ // within "root" that might contain edges intersecting AB.
183
+ //
184
+ // REQUIRES: root.padding() == 0 (see above)
185
+ void GetCells(const S2Point& a0, const S2Point& a1, const S2PaddedCell& root,
186
+ std::vector<const S2ShapeIndexCell*>* cells);
187
+
188
+ private:
189
+ // Internal methods are documented with their definitions.
190
+ bool VisitCells(const S2PaddedCell& pcell, const R2Rect& edge_bound);
191
+ bool ClipVAxis(const R2Rect& edge_bound, double center, int i,
192
+ const S2PaddedCell& pcell);
193
+ void SplitUBound(const R2Rect& edge_bound, double u,
194
+ R2Rect child_bounds[2]) const;
195
+ void SplitVBound(const R2Rect& edge_bound, double v,
196
+ R2Rect child_bounds[2]) const;
197
+ static void SplitBound(const R2Rect& edge_bound, int u_end, double u,
198
+ int v_end, double v, R2Rect child_bounds[2]);
199
+
200
+ const S2ShapeIndex* index_ = nullptr;
201
+
202
+ //////////// Temporary storage used while processing a query ///////////
203
+
204
+ R2Point a0_, a1_;
205
+ S2ShapeIndex::Iterator iter_;
206
+ const CellVisitor* visitor_;
207
+
208
+ // Avoids repeated allocation when methods are called many times.
209
+ std::vector<s2shapeutil::ShapeEdgeId> tmp_candidates_;
210
+ };
211
+
212
+
213
+ ////////////////// Implementation details follow ////////////////////
214
+
215
+
216
+ inline S2CrossingEdgeQuery::S2CrossingEdgeQuery(const S2ShapeIndex* index) {
217
+ Init(index);
218
+ }
219
+
220
+ #endif // S2_S2CROSSING_EDGE_QUERY_H_
@@ -0,0 +1,382 @@
1
+ // Copyright 2013 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/s2crossing_edge_query.h"
19
+
20
+ #include <algorithm>
21
+ #include <utility>
22
+ #include <vector>
23
+
24
+ #include "s2/base/casts.h"
25
+ #include <gtest/gtest.h>
26
+
27
+ #include "s2/mutable_s2shape_index.h"
28
+ #include "s2/s1angle.h"
29
+ #include "s2/s2cap.h"
30
+ #include "s2/s2cell.h"
31
+ #include "s2/s2cell_id.h"
32
+ #include "s2/s2coords.h"
33
+ #include "s2/s2edge_clipping.h"
34
+ #include "s2/s2edge_crossings.h"
35
+ #include "s2/s2edge_distances.h"
36
+ #include "s2/s2edge_vector_shape.h"
37
+ #include "s2/s2metrics.h"
38
+ #include "s2/s2polyline.h"
39
+ #include "s2/s2testing.h"
40
+ #include "s2/s2text_format.h"
41
+ #include "s2/third_party/absl/memory/memory.h"
42
+ #include "s2/third_party/absl/strings/str_cat.h"
43
+
44
+ using absl::make_unique;
45
+ using absl::StrCat;
46
+ using s2shapeutil::ShapeEdge;
47
+ using s2shapeutil::ShapeEdgeId;
48
+ using s2textformat::MakePoint;
49
+ using s2textformat::MakePolyline;
50
+ using std::is_sorted;
51
+ using std::pair;
52
+ using std::vector;
53
+
54
+ namespace {
55
+
56
+ using TestEdge = pair<S2Point, S2Point>;
57
+ using CrossingType = s2shapeutil::CrossingType;
58
+
59
+ S2Point PerturbAtDistance(S1Angle distance, const S2Point& a0,
60
+ const S2Point& b0) {
61
+ S2Point x = S2::InterpolateAtDistance(distance, a0, b0);
62
+ if (S2Testing::rnd.OneIn(2)) {
63
+ for (int i = 0; i < 3; ++i) {
64
+ x[i] = nextafter(x[i], S2Testing::rnd.OneIn(2) ? 1 : -1);
65
+ }
66
+ x = x.Normalize();
67
+ }
68
+ return x;
69
+ }
70
+
71
+ // Generate sub-edges of some given edge (a0,b0). The length of the sub-edges
72
+ // is distributed exponentially over a large range, and the endpoints may be
73
+ // slightly perturbed to one side of (a0,b0) or the other.
74
+ void GetPerturbedSubEdges(S2Point a0, S2Point b0, int count,
75
+ vector<TestEdge>* edges) {
76
+ edges->clear();
77
+ a0 = a0.Normalize();
78
+ b0 = b0.Normalize();
79
+ S1Angle length0(a0, b0);
80
+ for (int i = 0; i < count; ++i) {
81
+ S1Angle length = length0 * pow(1e-15, S2Testing::rnd.RandDouble());
82
+ S1Angle offset = (length0 - length) * S2Testing::rnd.RandDouble();
83
+ edges->push_back(
84
+ std::make_pair(PerturbAtDistance(offset, a0, b0),
85
+ PerturbAtDistance(offset + length, a0, b0)));
86
+ }
87
+ }
88
+
89
+ // Generate edges whose center is randomly chosen from the given S2Cap, and
90
+ // whose length is randomly chosen up to "max_length".
91
+ void GetCapEdges(const S2Cap& center_cap, S1Angle max_length, int count,
92
+ vector<TestEdge>* edges) {
93
+ edges->clear();
94
+ for (int i = 0; i < count; ++i) {
95
+ S2Point center = S2Testing::SamplePoint(center_cap);
96
+ S2Cap edge_cap(center, 0.5 * max_length);
97
+ S2Point p1 = S2Testing::SamplePoint(edge_cap);
98
+ // Compute p1 reflected through "center", and normalize for good measure.
99
+ S2Point p2 = (2 * p1.DotProd(center) * center - p1).Normalize();
100
+ edges->push_back(std::make_pair(p1, p2));
101
+ }
102
+ }
103
+
104
+ // Project ShapeEdges to ShapeEdgeIds. Useful because
105
+ // ShapeEdge does not have operator==, but ShapeEdgeId does.
106
+ static vector<ShapeEdgeId> GetShapeEdgeIds(
107
+ const vector<ShapeEdge>& shape_edges) {
108
+ vector<ShapeEdgeId> shape_edge_ids;
109
+ for (const auto& shape_edge : shape_edges) {
110
+ shape_edge_ids.push_back(shape_edge.id());
111
+ }
112
+ return shape_edge_ids;
113
+ }
114
+
115
+ void TestAllCrossings(const vector<TestEdge>& edges) {
116
+ auto shape = new S2EdgeVectorShape; // raw pointer since "shape" used below
117
+ for (const TestEdge& edge : edges) {
118
+ shape->Add(edge.first, edge.second);
119
+ }
120
+ // Force more subdivision than usual to make the test more challenging.
121
+ MutableS2ShapeIndex::Options options;
122
+ options.set_max_edges_per_cell(1);
123
+ MutableS2ShapeIndex index(options);
124
+ const int shape_id = index.Add(absl::WrapUnique(shape));
125
+ EXPECT_EQ(0, shape_id);
126
+ // To check that candidates are being filtered reasonably, we count the
127
+ // total number of candidates that the total number of edge pairs that
128
+ // either intersect or are very close to intersecting.
129
+ int num_candidates = 0, num_nearby_pairs = 0;
130
+ int i = 0;
131
+ for (const TestEdge& edge : edges) {
132
+ SCOPED_TRACE(StrCat("Iteration ", i++));
133
+ const S2Point& a = edge.first;
134
+ const S2Point& b = edge.second;
135
+ S2CrossingEdgeQuery query(&index);
136
+ const vector<ShapeEdgeId> candidates = query.GetCandidates(a, b, *shape);
137
+
138
+ // Verify that the second version of GetCandidates returns the same result.
139
+ const vector<ShapeEdgeId> edge_candidates = query.GetCandidates(a, b);
140
+ EXPECT_EQ(candidates, edge_candidates);
141
+ EXPECT_TRUE(!candidates.empty());
142
+
143
+ // Now check the actual candidates.
144
+ EXPECT_TRUE(is_sorted(candidates.begin(), candidates.end()));
145
+ EXPECT_EQ(candidates.back().shape_id, 0); // Implies all shape_ids are 0.
146
+ EXPECT_GE(candidates.front().edge_id, 0);
147
+ EXPECT_LT(candidates.back().edge_id, shape->num_edges());
148
+ num_candidates += candidates.size();
149
+ string missing_candidates;
150
+ vector<ShapeEdgeId> expected_crossings, expected_interior_crossings;
151
+ for (int i = 0; i < shape->num_edges(); ++i) {
152
+ auto edge = shape->edge(i);
153
+ const S2Point& c = edge.v0;
154
+ const S2Point& d = edge.v1;
155
+ int sign = S2::CrossingSign(a, b, c, d);
156
+ if (sign >= 0) {
157
+ expected_crossings.push_back({0, i});
158
+ if (sign > 0) {
159
+ expected_interior_crossings.push_back({0, i});
160
+ }
161
+ ++num_nearby_pairs;
162
+ if (!std::binary_search(candidates.begin(), candidates.end(),
163
+ ShapeEdgeId{0, i})) {
164
+ absl::StrAppend(&missing_candidates, " ", i);
165
+ }
166
+ } else {
167
+ const double kMaxDist = S2::kMaxDiag.GetValue(S2::kMaxCellLevel);
168
+ if (S2::GetDistance(a, c, d).radians() < kMaxDist ||
169
+ S2::GetDistance(b, c, d).radians() < kMaxDist ||
170
+ S2::GetDistance(c, a, b).radians() < kMaxDist ||
171
+ S2::GetDistance(d, a, b).radians() < kMaxDist) {
172
+ ++num_nearby_pairs;
173
+ }
174
+ }
175
+ }
176
+ EXPECT_TRUE(missing_candidates.empty()) << missing_candidates;
177
+
178
+ // Test that GetCrossings() returns only the actual crossing edges.
179
+ const vector<ShapeEdge> actual_crossings =
180
+ query.GetCrossingEdges(a, b, *shape, CrossingType::ALL);
181
+ EXPECT_EQ(expected_crossings, GetShapeEdgeIds(actual_crossings));
182
+
183
+ // Verify that the second version of GetCrossings returns the same result.
184
+ const vector<ShapeEdge> actual_edge_crossings =
185
+ query.GetCrossingEdges(a, b, CrossingType::ALL);
186
+ EXPECT_EQ(expected_crossings, GetShapeEdgeIds(actual_edge_crossings));
187
+
188
+ // Verify that CrossingType::INTERIOR returns only the interior crossings.
189
+ const vector<ShapeEdge> actual_interior_crossings =
190
+ query.GetCrossingEdges(a, b, *shape, CrossingType::INTERIOR);
191
+ EXPECT_EQ(expected_interior_crossings,
192
+ GetShapeEdgeIds(actual_interior_crossings));
193
+ }
194
+ // There is nothing magical about this particular ratio; this check exists
195
+ // to catch changes that dramatically increase the number of candidates.
196
+ EXPECT_LE(num_candidates, 3 * num_nearby_pairs);
197
+ }
198
+
199
+ // Test edges that lie in the plane of one of the S2 cube edges. Such edges
200
+ // may lie on the boundary between two cube faces, or pass through a cube
201
+ // vertex, or follow a 45 diagonal across a cube face toward its center.
202
+ //
203
+ // This test is sufficient to demonstrate that padding the cell boundaries is
204
+ // necessary for correctness. (It fails if MutableS2ShapeIndex::kCellPadding
205
+ // is set to zero.)
206
+ TEST(GetCrossingCandidates, PerturbedCubeEdges) {
207
+ S2Testing::Random* rnd = &S2Testing::rnd;
208
+ vector<TestEdge> edges;
209
+ for (int iter = 0; iter < 10; ++iter) {
210
+ int face = rnd->Uniform(6);
211
+ double scale = pow(1e-15, rnd->RandDouble());
212
+ R2Point uv(2 * rnd->Uniform(2) - 1, 2 * rnd->Uniform(2) - 1); // vertex
213
+ S2Point a0 = S2::FaceUVtoXYZ(face, scale * uv);
214
+ S2Point b0 = a0 - 2 * S2::GetNorm(face);
215
+ // TODO(ericv): This test is currently slow because *every* crossing test
216
+ // needs to invoke s2pred::ExpensiveSign().
217
+ GetPerturbedSubEdges(a0, b0, 30, &edges);
218
+ TestAllCrossings(edges);
219
+ }
220
+ }
221
+
222
+ // Test edges that lie in the plane of one of the S2 cube face axes. These
223
+ // edges are special because one coordinate is zero, and they lie on the
224
+ // boundaries between the immediate child cells of the cube face.
225
+ TEST(GetCrossingCandidates, PerturbedCubeFaceAxes) {
226
+ S2Testing::Random* rnd = &S2Testing::rnd;
227
+ vector<TestEdge> edges;
228
+ for (int iter = 0; iter < 5; ++iter) {
229
+ int face = rnd->Uniform(6);
230
+ double scale = pow(1e-15, rnd->RandDouble());
231
+ S2Point axis = S2::GetUVWAxis(face, rnd->Uniform(2));
232
+ S2Point a0 = scale * axis + S2::GetNorm(face);
233
+ S2Point b0 = scale * axis - S2::GetNorm(face);
234
+ GetPerturbedSubEdges(a0, b0, 30, &edges);
235
+ TestAllCrossings(edges);
236
+ }
237
+ }
238
+
239
+ TEST(GetCrossingCandidates, CapEdgesNearCubeVertex) {
240
+ // Test a random collection of edges near the S2 cube vertex where the
241
+ // Hilbert curve starts and ends.
242
+ vector<TestEdge> edges;
243
+ GetCapEdges(S2Cap(S2Point(-1, -1, 1).Normalize(), S1Angle::Radians(1e-3)),
244
+ S1Angle::Radians(1e-4), 1000, &edges);
245
+ TestAllCrossings(edges);
246
+ }
247
+
248
+ TEST(GetCrossingCandidates, DegenerateEdgeOnCellVertexIsItsOwnCandidate) {
249
+ for (int i = 0; i < 100; ++i) {
250
+ vector<TestEdge> edges;
251
+ S2Cell cell(S2Testing::GetRandomCellId());
252
+ edges.push_back(std::make_pair(cell.GetVertex(0), cell.GetVertex(0)));
253
+ TestAllCrossings(edges);
254
+ }
255
+ }
256
+
257
+ TEST(GetCrossingCandidates, CollinearEdgesOnCellBoundaries) {
258
+ const int kNumEdgeIntervals = 8; // 9*8/2 = 36 edges
259
+ for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
260
+ S2Cell cell(S2Testing::GetRandomCellId(level));
261
+ int i = S2Testing::rnd.Uniform(4);
262
+ S2Point p1 = cell.GetVertexRaw(i);
263
+ S2Point p2 = cell.GetVertexRaw(i + 1);
264
+ S2Point delta = (p2 - p1) / kNumEdgeIntervals;
265
+ vector<TestEdge> edges;
266
+ for (int i = 0; i <= kNumEdgeIntervals; ++i) {
267
+ for (int j = 0; j < i; ++j) {
268
+ edges.push_back(std::make_pair((p1 + i * delta).Normalize(),
269
+ (p1 + j * delta).Normalize()));
270
+ }
271
+ }
272
+ TestAllCrossings(edges);
273
+ }
274
+ }
275
+
276
+ // This is the example from the header file, with a few extras.
277
+ void TestPolylineCrossings(const S2ShapeIndex& index,
278
+ const S2Point& a0, const S2Point& a1) {
279
+ S2CrossingEdgeQuery query(&index);
280
+ const vector<ShapeEdge> edges =
281
+ query.GetCrossingEdges(a0, a1, CrossingType::ALL);
282
+ if (edges.empty()) return;
283
+ for (const auto& edge : edges) {
284
+ S2_CHECK_GE(S2::CrossingSign(a0, a1, edge.v0(), edge.v1()), 0);
285
+ }
286
+ // Also test that no edges are missing.
287
+ for (int i = 0; i < index.num_shape_ids(); ++i) {
288
+ const auto* shape = down_cast<S2Polyline::Shape*>(index.shape(i));
289
+ const S2Polyline* polyline = shape->polyline();
290
+ for (int e = 0; e < polyline->num_vertices() - 1; ++e) {
291
+ if (S2::CrossingSign(a0, a1, polyline->vertex(e),
292
+ polyline->vertex(e + 1)) >= 0) {
293
+ EXPECT_EQ(1, std::count_if(edges.begin(), edges.end(),
294
+ [e, i](const ShapeEdge& edge) {
295
+ return edge.id() == ShapeEdgeId{i, e};
296
+ }));
297
+ }
298
+ }
299
+ }
300
+ }
301
+
302
+ TEST(GetCrossings, PolylineCrossings) {
303
+ MutableS2ShapeIndex index;
304
+ // Three zig-zag lines near the equator.
305
+ index.Add(make_unique<S2Polyline::OwningShape>(
306
+ MakePolyline("0:0, 2:1, 0:2, 2:3, 0:4, 2:5, 0:6")));
307
+ index.Add(make_unique<S2Polyline::OwningShape>(
308
+ MakePolyline("1:0, 3:1, 1:2, 3:3, 1:4, 3:5, 1:6")));
309
+ index.Add(make_unique<S2Polyline::OwningShape>(
310
+ MakePolyline("2:0, 4:1, 2:2, 4:3, 2:4, 4:5, 2:6")));
311
+ TestPolylineCrossings(index, MakePoint("1:0"), MakePoint("1:4"));
312
+ TestPolylineCrossings(index, MakePoint("5:5"), MakePoint("6:6"));
313
+ }
314
+
315
+ TEST(GetCrossings, ShapeIdsAreCorrect) {
316
+ // This tests that when some index cells contain only one shape, the
317
+ // intersecting edges are returned with the correct shape id.
318
+ MutableS2ShapeIndex index;
319
+ index.Add(make_unique<S2Polyline::OwningShape>(
320
+ make_unique<S2Polyline>(S2Testing::MakeRegularPoints(
321
+ MakePoint("0:0"), S1Angle::Degrees(5), 100))));
322
+ index.Add(make_unique<S2Polyline::OwningShape>(
323
+ make_unique<S2Polyline>(S2Testing::MakeRegularPoints(
324
+ MakePoint("0:20"), S1Angle::Degrees(5), 100))));
325
+ TestPolylineCrossings(index, MakePoint("1:-10"), MakePoint("1:30"));
326
+ }
327
+
328
+ // Verifies that when VisitCells() is called with a specified root cell and a
329
+ // query edge that barely intersects that cell, that at least one cell is
330
+ // visited. (At one point this was not always true, because when the query edge
331
+ // is clipped to the index cell boundary without using any padding then the
332
+ // result is sometimes empty, i.e., the query edge appears not to intersect the
333
+ // specifed root cell. The code now uses an appropriate amount of padding,
334
+ // i.e. S2::kFaceClipErrorUVCoord.)
335
+ TEST(VisitCells, QueryEdgeOnFaceBoundary) {
336
+ S2Testing::Random* rnd = &S2Testing::rnd;
337
+ const int kIters = 100;
338
+ for (int iter = 0; iter < kIters; ++iter) {
339
+ SCOPED_TRACE(StrCat("Iteration ", iter));
340
+
341
+ // Choose an edge AB such that B is nearly on the edge between two S2 cube
342
+ // faces, and such that the result of clipping AB to the face that nominally
343
+ // contains B (according to S2::GetFace) is empty when no padding is used.
344
+ int a_face, b_face;
345
+ S2Point a, b;
346
+ R2Point a_uv, b_uv;
347
+ do {
348
+ a_face = rnd->Uniform(6);
349
+ a = S2::FaceUVtoXYZ(a_face, rnd->UniformDouble(-1, 1),
350
+ rnd->UniformDouble(-1, 1)).Normalize();
351
+ b_face = S2::GetUVWFace(a_face, 0, 1); // Towards positive u-axis
352
+ b = S2::FaceUVtoXYZ(b_face, 1 - rnd->Uniform(2) * 0.5 * DBL_EPSILON,
353
+ rnd->UniformDouble(-1, 1)).Normalize();
354
+ } while (S2::GetFace(b) != b_face ||
355
+ S2::ClipToFace(a, b, b_face, &a_uv, &b_uv));
356
+
357
+ // Verify that the clipping result is non-empty when a padding of
358
+ // S2::kFaceClipErrorUVCoord is used instead.
359
+ EXPECT_TRUE(S2::ClipToPaddedFace(a, b, b_face, S2::kFaceClipErrorUVCoord,
360
+ &a_uv, &b_uv));
361
+
362
+ // Create an S2ShapeIndex containing a single edge BC, where C is on the
363
+ // same S2 cube face as B (which is different than the face containing A).
364
+ S2Point c = S2::FaceUVtoXYZ(b_face, rnd->UniformDouble(-1, 1),
365
+ rnd->UniformDouble(-1, 1)).Normalize();
366
+ MutableS2ShapeIndex index;
367
+ index.Add(make_unique<S2Polyline::OwningShape>(
368
+ make_unique<S2Polyline>(vector<S2Point>{b, c})));
369
+
370
+ // Check that the intersection between AB and BC is detected when the face
371
+ // containing BC is specified as a root cell. (Note that VisitCells()
372
+ // returns false only if the CellVisitor returns false, and otherwise
373
+ // returns true.)
374
+ S2CrossingEdgeQuery query(&index);
375
+ S2PaddedCell root(S2CellId::FromFace(b_face), 0);
376
+ EXPECT_FALSE(query.VisitCells(a, b, root, [](const S2ShapeIndexCell&) {
377
+ return false;
378
+ }));
379
+ }
380
+ }
381
+
382
+ } // namespace
@@ -0,0 +1,23 @@
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/s2debug.h"
19
+
20
+ #include "s2/base/logging.h"
21
+
22
+ S2_DEFINE_bool(s2debug, !!google::DEBUG_MODE,
23
+ "Enable automatic validity checking in S2 code");