@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,295 @@
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/s2min_distance_targets.h"
19
+
20
+ #include <memory>
21
+ #include "s2/third_party/absl/memory/memory.h"
22
+ #include "s2/s1angle.h"
23
+ #include "s2/s2cap.h"
24
+ #include "s2/s2cell.h"
25
+ #include "s2/s2closest_cell_query.h"
26
+ #include "s2/s2closest_edge_query.h"
27
+ #include "s2/s2edge_distances.h"
28
+ #include "s2/s2shape_index_region.h"
29
+
30
+ S2Cap S2MinDistancePointTarget::GetCapBound() {
31
+ return S2Cap(point_, S1ChordAngle::Zero());
32
+ }
33
+
34
+ bool S2MinDistancePointTarget::UpdateMinDistance(
35
+ const S2Point& p, S2MinDistance* min_dist) {
36
+ return min_dist->UpdateMin(S2MinDistance(S1ChordAngle(p, point_)));
37
+ }
38
+
39
+ bool S2MinDistancePointTarget::UpdateMinDistance(
40
+ const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
41
+ return S2::UpdateMinDistance(point_, v0, v1, min_dist);
42
+ }
43
+
44
+ bool S2MinDistancePointTarget::UpdateMinDistance(
45
+ const S2Cell& cell, S2MinDistance* min_dist) {
46
+ return min_dist->UpdateMin(S2MinDistance(cell.GetDistance(point_)));
47
+ }
48
+
49
+ bool S2MinDistancePointTarget::VisitContainingShapes(
50
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
51
+ return MakeS2ContainsPointQuery(&index).VisitContainingShapes(
52
+ point_, [this, &visitor](S2Shape* shape) {
53
+ return visitor(shape, point_);
54
+ });
55
+ }
56
+
57
+ S2Cap S2MinDistanceEdgeTarget::GetCapBound() {
58
+ // The following computes a radius equal to half the edge length in an
59
+ // efficient and numerically stable way.
60
+ double d2 = S1ChordAngle(a_, b_).length2();
61
+ double r2 = (0.5 * d2) / (1 + sqrt(1 - 0.25 * d2));
62
+ return S2Cap((a_ + b_).Normalize(), S1ChordAngle::FromLength2(r2));
63
+ }
64
+
65
+ bool S2MinDistanceEdgeTarget::UpdateMinDistance(
66
+ const S2Point& p, S2MinDistance* min_dist) {
67
+ return S2::UpdateMinDistance(p, a_, b_, min_dist);
68
+ }
69
+
70
+ bool S2MinDistanceEdgeTarget::UpdateMinDistance(
71
+ const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
72
+ return S2::UpdateEdgePairMinDistance(a_, b_, v0, v1, min_dist);
73
+ }
74
+
75
+ bool S2MinDistanceEdgeTarget::UpdateMinDistance(
76
+ const S2Cell& cell, S2MinDistance* min_dist) {
77
+ return min_dist->UpdateMin(S2MinDistance(cell.GetDistance(a_, b_)));
78
+ }
79
+
80
+ bool S2MinDistanceEdgeTarget::VisitContainingShapes(
81
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
82
+ // We test the center of the edge in order to ensure that edge targets AB
83
+ // and BA yield identical results (which is not guaranteed by the API but
84
+ // users might expect). Other options would be to test both endpoints, or
85
+ // return different results for AB and BA in some cases.
86
+ S2MinDistancePointTarget target((a_ + b_).Normalize());
87
+ return target.VisitContainingShapes(index, visitor);
88
+ }
89
+
90
+ S2MinDistanceCellTarget::S2MinDistanceCellTarget(const S2Cell& cell)
91
+ : cell_(cell) {
92
+ }
93
+
94
+ S2Cap S2MinDistanceCellTarget::GetCapBound() {
95
+ return cell_.GetCapBound();
96
+ }
97
+
98
+ bool S2MinDistanceCellTarget::UpdateMinDistance(const S2Point& p,
99
+ S2MinDistance* min_dist) {
100
+ return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(p)));
101
+ }
102
+
103
+ bool S2MinDistanceCellTarget::UpdateMinDistance(
104
+ const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
105
+ return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(v0, v1)));
106
+ }
107
+
108
+ bool S2MinDistanceCellTarget::UpdateMinDistance(
109
+ const S2Cell& cell, S2MinDistance* min_dist) {
110
+ return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(cell)));
111
+ }
112
+
113
+ bool S2MinDistanceCellTarget::VisitContainingShapes(
114
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
115
+ // The simplest approach is simply to return the polygons that contain the
116
+ // cell center. Alternatively, if the index cell is smaller than the target
117
+ // cell then we could return all polygons that are present in the
118
+ // S2ShapeIndexCell, but since the index is built conservatively this may
119
+ // include some polygons that don't quite intersect the cell. So we would
120
+ // either need to recheck for intersection more accurately, or weaken the
121
+ // VisitContainingShapes contract so that it only guarantees approximate
122
+ // intersection, neither of which seems like a good tradeoff.
123
+ S2MinDistancePointTarget target(cell_.GetCenter());
124
+ return target.VisitContainingShapes(index, visitor);
125
+ }
126
+
127
+ S2MinDistanceCellUnionTarget::S2MinDistanceCellUnionTarget(
128
+ S2CellUnion cell_union)
129
+ : cell_union_(std::move(cell_union)),
130
+ query_(absl::make_unique<S2ClosestCellQuery>(&index_)) {
131
+ for (S2CellId cell_id : cell_union_) {
132
+ index_.Add(cell_id, 0);
133
+ }
134
+ index_.Build();
135
+ }
136
+
137
+ S2MinDistanceCellUnionTarget::~S2MinDistanceCellUnionTarget() {
138
+ }
139
+
140
+ bool S2MinDistanceCellUnionTarget::use_brute_force() const {
141
+ return query_->options().use_brute_force();
142
+ }
143
+
144
+ void S2MinDistanceCellUnionTarget::set_use_brute_force(
145
+ bool use_brute_force) {
146
+ query_->mutable_options()->set_use_brute_force(use_brute_force);
147
+ }
148
+
149
+ bool S2MinDistanceCellUnionTarget::set_max_error(
150
+ const S1ChordAngle& max_error) {
151
+ query_->mutable_options()->set_max_error(max_error);
152
+ return true; // Indicates that we may return suboptimal results.
153
+ }
154
+
155
+ S2Cap S2MinDistanceCellUnionTarget::GetCapBound() {
156
+ return cell_union_.GetCapBound();
157
+ }
158
+
159
+ inline bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
160
+ S2MinDistanceTarget* target, S2MinDistance* min_dist) {
161
+ query_->mutable_options()->set_max_distance(*min_dist);
162
+ S2ClosestCellQuery::Result r = query_->FindClosestCell(target);
163
+ if (r.is_empty()) return false;
164
+ *min_dist = r.distance();
165
+ return true;
166
+ }
167
+
168
+ bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
169
+ const S2Point& p, S2MinDistance* min_dist) {
170
+ S2ClosestCellQuery::PointTarget target(p);
171
+ return UpdateMinDistance(&target, min_dist);
172
+ }
173
+
174
+ bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
175
+ const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
176
+ S2ClosestCellQuery::EdgeTarget target(v0, v1);
177
+ return UpdateMinDistance(&target, min_dist);
178
+ }
179
+
180
+ bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
181
+ const S2Cell& cell, S2MinDistance* min_dist) {
182
+ S2ClosestCellQuery::CellTarget target(cell);
183
+ return UpdateMinDistance(&target, min_dist);
184
+ }
185
+
186
+ bool S2MinDistanceCellUnionTarget::VisitContainingShapes(
187
+ const S2ShapeIndex& query_index, const ShapeVisitor& visitor) {
188
+ for (S2CellId cell_id : cell_union_) {
189
+ S2MinDistancePointTarget target(cell_id.ToPoint());
190
+ if (!target.VisitContainingShapes(query_index, visitor)) {
191
+ return false;
192
+ }
193
+ }
194
+ return true;
195
+ }
196
+
197
+ S2MinDistanceShapeIndexTarget::S2MinDistanceShapeIndexTarget(
198
+ const S2ShapeIndex* index)
199
+ : index_(index), query_(absl::make_unique<S2ClosestEdgeQuery>(index)) {
200
+ }
201
+
202
+ S2MinDistanceShapeIndexTarget::~S2MinDistanceShapeIndexTarget() {
203
+ }
204
+
205
+ bool S2MinDistanceShapeIndexTarget::include_interiors() const {
206
+ return query_->options().include_interiors();
207
+ }
208
+
209
+ void S2MinDistanceShapeIndexTarget::set_include_interiors(
210
+ bool include_interiors) {
211
+ query_->mutable_options()->set_include_interiors(include_interiors);
212
+ }
213
+
214
+ bool S2MinDistanceShapeIndexTarget::use_brute_force() const {
215
+ return query_->options().use_brute_force();
216
+ }
217
+
218
+ void S2MinDistanceShapeIndexTarget::set_use_brute_force(
219
+ bool use_brute_force) {
220
+ query_->mutable_options()->set_use_brute_force(use_brute_force);
221
+ }
222
+
223
+ bool S2MinDistanceShapeIndexTarget::set_max_error(
224
+ const S1ChordAngle& max_error) {
225
+ query_->mutable_options()->set_max_error(max_error);
226
+ return true; // Indicates that we may return suboptimal results.
227
+ }
228
+
229
+ S2Cap S2MinDistanceShapeIndexTarget::GetCapBound() {
230
+ return MakeS2ShapeIndexRegion(index_).GetCapBound();
231
+ }
232
+
233
+ inline bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
234
+ S2MinDistanceTarget* target, S2MinDistance* min_dist) {
235
+ query_->mutable_options()->set_max_distance(*min_dist);
236
+ S2ClosestEdgeQuery::Result r = query_->FindClosestEdge(target);
237
+ if (r.is_empty()) return false;
238
+ *min_dist = r.distance();
239
+ return true;
240
+ }
241
+
242
+ bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
243
+ const S2Point& p, S2MinDistance* min_dist) {
244
+ S2ClosestEdgeQuery::PointTarget target(p);
245
+ return UpdateMinDistance(&target, min_dist);
246
+ }
247
+
248
+ bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
249
+ const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
250
+ S2ClosestEdgeQuery::EdgeTarget target(v0, v1);
251
+ return UpdateMinDistance(&target, min_dist);
252
+ }
253
+
254
+ bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
255
+ const S2Cell& cell, S2MinDistance* min_dist) {
256
+ S2ClosestEdgeQuery::CellTarget target(cell);
257
+ return UpdateMinDistance(&target, min_dist);
258
+ }
259
+
260
+ bool S2MinDistanceShapeIndexTarget::VisitContainingShapes(
261
+ const S2ShapeIndex& query_index, const ShapeVisitor& visitor) {
262
+ // It is sufficient to find the set of chain starts in the target index
263
+ // (i.e., one vertex per connected component of edges) that are contained by
264
+ // the query index, except for one special case to handle full polygons.
265
+ //
266
+ // TODO(ericv): Do this by merge-joining the two S2ShapeIndexes, and share
267
+ // the code with S2BooleanOperation.
268
+
269
+ for (S2Shape* shape : *index_) {
270
+ if (shape == nullptr) continue;
271
+ int num_chains = shape->num_chains();
272
+ // Shapes that don't have any edges require a special case (below).
273
+ bool tested_point = false;
274
+ for (int c = 0; c < num_chains; ++c) {
275
+ S2Shape::Chain chain = shape->chain(c);
276
+ if (chain.length == 0) continue;
277
+ tested_point = true;
278
+ S2Point v0 = shape->chain_edge(c, 0).v0;
279
+ S2MinDistancePointTarget target(v0);
280
+ if (!target.VisitContainingShapes(query_index, visitor)) {
281
+ return false;
282
+ }
283
+ }
284
+ if (!tested_point) {
285
+ // Special case to handle full polygons.
286
+ S2Shape::ReferencePoint ref = shape->GetReferencePoint();
287
+ if (!ref.contained) continue;
288
+ S2MinDistancePointTarget target(ref.point);
289
+ if (!target.VisitContainingShapes(query_index, visitor)) {
290
+ return false;
291
+ }
292
+ }
293
+ }
294
+ return true;
295
+ }
@@ -0,0 +1,273 @@
1
+ // Copyright 2017 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
+ // This file defines a collection of classes that are useful for computing
19
+ // minimum distances on the sphere. Their purpose is to allow code to be
20
+ // shared among the various query classes that find nearby geometry, such as
21
+ // S2ClosestEdgeQuery, S2ClosestPointQuery, and S2ClosestCellQuery.
22
+
23
+ #ifndef S2_S2MIN_DISTANCE_TARGETS_H_
24
+ #define S2_S2MIN_DISTANCE_TARGETS_H_
25
+
26
+ #include <memory>
27
+
28
+ #include "s2/_fp_contract_off.h"
29
+ #include "s2/s1angle.h"
30
+ #include "s2/s1chord_angle.h"
31
+ #include "s2/s2cell.h"
32
+ #include "s2/s2cell_index.h"
33
+ #include "s2/s2distance_target.h"
34
+ #include "s2/s2edge_distances.h"
35
+ #include "s2/s2shape_index.h"
36
+
37
+ // Forward references because these classes depend on the types defined here.
38
+ class S2ClosestCellQuery;
39
+ class S2ClosestEdgeQuery;
40
+
41
+ // S2MinDistance is a thin wrapper around S1ChordAngle that is used by classes
42
+ // such as S2ClosestEdgeQuery to compute minimum distances on the sphere (as
43
+ // opposed to maximum distances, ellipsoidal distances, etc).
44
+ //
45
+ // It implements the Distance concept defined by S2DistanceTarget (see
46
+ // s2distance_target.h for details).
47
+ class S2MinDistance : public S1ChordAngle {
48
+ public:
49
+ using Delta = S1ChordAngle;
50
+
51
+ S2MinDistance() : S1ChordAngle() {}
52
+ explicit S2MinDistance(S1Angle x) : S1ChordAngle(x) {}
53
+ explicit S2MinDistance(S1ChordAngle x) : S1ChordAngle(x) {}
54
+ static S2MinDistance Zero();
55
+ static S2MinDistance Infinity();
56
+ static S2MinDistance Negative();
57
+ friend S2MinDistance operator-(S2MinDistance x, S1ChordAngle delta);
58
+ S1ChordAngle GetChordAngleBound() const;
59
+
60
+ // If (dist < *this), updates *this and returns true (used internally).
61
+ bool UpdateMin(const S2MinDistance& dist);
62
+ };
63
+
64
+ // S2MinDistanceTarget represents a geometric object to which distances are
65
+ // measured. Specifically, it is used to compute minimum distances on the
66
+ // sphere (as opposed to maximum distances, ellipsoidal distances, etc).
67
+ //
68
+ // Subtypes are defined below for measuring the distance to a point, an edge,
69
+ // an S2Cell, or an S2ShapeIndex (an arbitrary collection of geometry).
70
+ using S2MinDistanceTarget = S2DistanceTarget<S2MinDistance>;
71
+
72
+ // An S2DistanceTarget subtype for computing the minimum distance to a point.
73
+ class S2MinDistancePointTarget : public S2MinDistanceTarget {
74
+ public:
75
+ explicit S2MinDistancePointTarget(const S2Point& point);
76
+ S2Cap GetCapBound() final;
77
+ bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
78
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
79
+ S2MinDistance* min_dist) final;
80
+ bool UpdateMinDistance(const S2Cell& cell,
81
+ S2MinDistance* min_dist) final;
82
+ bool VisitContainingShapes(const S2ShapeIndex& index,
83
+ const ShapeVisitor& visitor) final;
84
+
85
+ private:
86
+ S2Point point_;
87
+ };
88
+
89
+ // An S2DistanceTarget subtype for computing the minimum distance to a edge.
90
+ class S2MinDistanceEdgeTarget : public S2MinDistanceTarget {
91
+ public:
92
+ S2MinDistanceEdgeTarget(const S2Point& a, const S2Point& b);
93
+ S2Cap GetCapBound() final;
94
+ bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
95
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
96
+ S2MinDistance* min_dist) final;
97
+ bool UpdateMinDistance(const S2Cell& cell,
98
+ S2MinDistance* min_dist) final;
99
+ bool VisitContainingShapes(const S2ShapeIndex& index,
100
+ const ShapeVisitor& visitor) final;
101
+
102
+ private:
103
+ S2Point a_, b_;
104
+ };
105
+
106
+ // An S2DistanceTarget subtype for computing the minimum distance to an S2Cell
107
+ // (including the interior of the cell).
108
+ class S2MinDistanceCellTarget : public S2MinDistanceTarget {
109
+ public:
110
+ explicit S2MinDistanceCellTarget(const S2Cell& cell);
111
+ S2Cap GetCapBound() final;
112
+ bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
113
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
114
+ S2MinDistance* min_dist) final;
115
+ bool UpdateMinDistance(const S2Cell& cell,
116
+ S2MinDistance* min_dist) final;
117
+ bool VisitContainingShapes(const S2ShapeIndex& index,
118
+ const ShapeVisitor& visitor) final;
119
+
120
+ private:
121
+ S2Cell cell_;
122
+ };
123
+
124
+ // An S2DistanceTarget subtype for computing the minimum distance to an
125
+ // S2CellUnion (including the interior of all cells).
126
+ class S2MinDistanceCellUnionTarget : public S2MinDistanceTarget {
127
+ public:
128
+ explicit S2MinDistanceCellUnionTarget(S2CellUnion cell_union);
129
+ ~S2MinDistanceCellUnionTarget() override;
130
+
131
+ // Specifies that the distances should be computed by examining every cell
132
+ // in the S2CellIndex (for testing and debugging purposes).
133
+ //
134
+ // DEFAULT: false
135
+ bool use_brute_force() const;
136
+ void set_use_brute_force(bool use_brute_force);
137
+
138
+ // Note that set_max_error() should not be called directly by clients; it is
139
+ // used internally by the S2Closest*Query implementations.
140
+ bool set_max_error(const S1ChordAngle& max_error) override;
141
+
142
+ S2Cap GetCapBound() final;
143
+ bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
144
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
145
+ S2MinDistance* min_dist) final;
146
+ bool UpdateMinDistance(const S2Cell& cell,
147
+ S2MinDistance* min_dist) final;
148
+ bool VisitContainingShapes(const S2ShapeIndex& query_index,
149
+ const ShapeVisitor& visitor) final;
150
+
151
+ private:
152
+ bool UpdateMinDistance(S2MinDistanceTarget* target, S2MinDistance* min_dist);
153
+
154
+ S2CellUnion cell_union_;
155
+ S2CellIndex index_;
156
+ std::unique_ptr<S2ClosestCellQuery> query_;
157
+ };
158
+
159
+ // An S2DistanceTarget subtype for computing the minimum distance to an
160
+ // S2ShapeIndex (a collection of points, polylines, and/or polygons).
161
+ //
162
+ // Note that ShapeIndexTarget has its own options:
163
+ //
164
+ // include_interiors()
165
+ // - specifies that distances are measured to the boundary and interior
166
+ // of polygons in the S2ShapeIndex. (If set to false, distance is
167
+ // measured to the polygon boundary only.)
168
+ // DEFAULT: true.
169
+ //
170
+ // brute_force()
171
+ // - specifies that the distances should be computed by examining every
172
+ // edge in the S2ShapeIndex (for testing and debugging purposes).
173
+ // DEFAULT: false.
174
+ //
175
+ // These options are specified independently of the corresponding
176
+ // S2ClosestEdgeQuery options. For example, if include_interiors is true for
177
+ // a ShapeIndexTarget but false for the S2ClosestEdgeQuery where the target
178
+ // is used, then distances will be measured from the boundary of one
179
+ // S2ShapeIndex to the boundary and interior of the other.
180
+ //
181
+ // Note that when the distance to a ShapeIndexTarget is zero because the
182
+ // target intersects the interior of the query index, you can find a point
183
+ // that achieves this zero distance by calling the VisitContainingShapes()
184
+ // method directly. For example:
185
+ //
186
+ // S2ClosestEdgeQuery::ShapeIndexTarget target(&target_index);
187
+ // target.VisitContainingShapes(
188
+ // query_index, [](S2Shape* containing_shape,
189
+ // const S2Point& target_point) {
190
+ // ... do something with "target_point" ...
191
+ // return false; // Terminate search
192
+ // }));
193
+ class S2MinDistanceShapeIndexTarget : public S2MinDistanceTarget {
194
+ public:
195
+ explicit S2MinDistanceShapeIndexTarget(const S2ShapeIndex* index);
196
+ ~S2MinDistanceShapeIndexTarget() override;
197
+
198
+ // Specifies that distance will be measured to the boundary and interior
199
+ // of polygons in the S2ShapeIndex rather than to polygon boundaries only.
200
+ //
201
+ // DEFAULT: true
202
+ bool include_interiors() const;
203
+ void set_include_interiors(bool include_interiors);
204
+
205
+ // Specifies that the distances should be computed by examining every edge
206
+ // in the S2ShapeIndex (for testing and debugging purposes).
207
+ //
208
+ // DEFAULT: false
209
+ bool use_brute_force() const;
210
+ void set_use_brute_force(bool use_brute_force);
211
+
212
+ // Note that set_max_error() should not be called directly by clients; it is
213
+ // used internally by the S2Closest*Query implementations.
214
+ bool set_max_error(const S1ChordAngle& max_error) override;
215
+
216
+ S2Cap GetCapBound() final;
217
+ bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
218
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
219
+ S2MinDistance* min_dist) final;
220
+ bool UpdateMinDistance(const S2Cell& cell,
221
+ S2MinDistance* min_dist) final;
222
+ bool VisitContainingShapes(const S2ShapeIndex& query_index,
223
+ const ShapeVisitor& visitor) final;
224
+
225
+ private:
226
+ bool UpdateMinDistance(S2MinDistanceTarget* target, S2MinDistance* min_dist);
227
+
228
+ const S2ShapeIndex* index_;
229
+ std::unique_ptr<S2ClosestEdgeQuery> query_;
230
+ };
231
+
232
+
233
+ ////////////////// Implementation details follow ////////////////////
234
+
235
+
236
+ inline S2MinDistance S2MinDistance::Zero() {
237
+ return S2MinDistance(S1ChordAngle::Zero());
238
+ }
239
+
240
+ inline S2MinDistance S2MinDistance::Infinity() {
241
+ return S2MinDistance(S1ChordAngle::Infinity());
242
+ }
243
+
244
+ inline S2MinDistance S2MinDistance::Negative() {
245
+ return S2MinDistance(S1ChordAngle::Negative());
246
+ }
247
+
248
+ inline S2MinDistance operator-(S2MinDistance x, S1ChordAngle delta) {
249
+ return S2MinDistance(S1ChordAngle(x) - delta);
250
+ }
251
+
252
+ inline S1ChordAngle S2MinDistance::GetChordAngleBound() const {
253
+ return PlusError(GetS1AngleConstructorMaxError());
254
+ }
255
+
256
+ inline bool S2MinDistance::UpdateMin(const S2MinDistance& dist) {
257
+ if (dist < *this) {
258
+ *this = dist;
259
+ return true;
260
+ }
261
+ return false;
262
+ }
263
+
264
+ inline S2MinDistancePointTarget::S2MinDistancePointTarget(const S2Point& point)
265
+ : point_(point) {
266
+ }
267
+
268
+ inline S2MinDistanceEdgeTarget::S2MinDistanceEdgeTarget(const S2Point& a,
269
+ const S2Point& b)
270
+ : a_(a), b_(b) {
271
+ }
272
+
273
+ #endif // S2_S2MIN_DISTANCE_TARGETS_H_