@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,265 @@
1
+ // Copyright 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
+ #include "s2/s2max_distance_targets.h"
17
+
18
+ #include <memory>
19
+ #include "s2/third_party/absl/memory/memory.h"
20
+ #include "s2/s1angle.h"
21
+ #include "s2/s2cap.h"
22
+ #include "s2/s2cell.h"
23
+ #include "s2/s2edge_distances.h"
24
+ #include "s2/s2furthest_edge_query.h"
25
+ #include "s2/s2shape_index_region.h"
26
+ #include "s2/s2text_format.h"
27
+
28
+ ////////////////// Point Target ////////////////////
29
+
30
+ // This method returns an S2Cap that bounds the antipode of the target. (This
31
+ // is the set of points whose S2MaxDistance to the target is
32
+ // S2MaxDistance::Zero().)
33
+ S2Cap S2MaxDistancePointTarget::GetCapBound() {
34
+ return S2Cap(-point_, S1ChordAngle::Zero());
35
+ }
36
+
37
+ bool S2MaxDistancePointTarget::UpdateMinDistance(
38
+ const S2Point& p, S2MaxDistance* min_dist) {
39
+ return min_dist->UpdateMin(S2MaxDistance(S1ChordAngle(p, point_)));
40
+ }
41
+
42
+ bool S2MaxDistancePointTarget::UpdateMinDistance(
43
+ const S2Point& v0, const S2Point& v1, S2MaxDistance* min_dist) {
44
+ S1ChordAngle dist(*min_dist);
45
+ if (S2::UpdateMaxDistance(point_, v0, v1, &dist)) {
46
+ min_dist->UpdateMin(S2MaxDistance(dist));
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+
52
+ bool S2MaxDistancePointTarget::UpdateMinDistance(
53
+ const S2Cell& cell, S2MaxDistance* min_dist) {
54
+ return min_dist->UpdateMin(S2MaxDistance(cell.GetMaxDistance(point_)));
55
+ }
56
+
57
+ bool S2MaxDistancePointTarget::VisitContainingShapes(
58
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
59
+ // For furthest points, we visit the polygons whose interior contains the
60
+ // antipode of the target point. (These are the polygons whose
61
+ // S2MaxDistance to the target is S2MaxDistance::Zero().)
62
+ return MakeS2ContainsPointQuery(&index).VisitContainingShapes(
63
+ -point_, [this, &visitor](S2Shape* shape) {
64
+ return visitor(shape, point_);
65
+ });
66
+ }
67
+
68
+ ////////////////// Edge Target ////////////////////
69
+
70
+ // This method returns an S2Cap that bounds the antipode of the target. (This
71
+ // is the set of points whose S2MaxDistance to the target is
72
+ // S2MaxDistance::Zero().)
73
+ S2Cap S2MaxDistanceEdgeTarget::GetCapBound() {
74
+ // The following computes a radius equal to half the edge length in an
75
+ // efficient and numerically stable way.
76
+ double d2 = S1ChordAngle(a_, b_).length2();
77
+ double r2 = (0.5 * d2) / (1 + sqrt(1 - 0.25 * d2));
78
+ return S2Cap(-(a_ + b_).Normalize(), S1ChordAngle::FromLength2(r2));
79
+ }
80
+
81
+ bool S2MaxDistanceEdgeTarget::UpdateMinDistance(
82
+ const S2Point& p, S2MaxDistance* min_dist) {
83
+ S1ChordAngle dist(*min_dist);
84
+ if (S2::UpdateMaxDistance(p, a_, b_, &dist)) {
85
+ min_dist->UpdateMin(S2MaxDistance(dist));
86
+ return true;
87
+ }
88
+ return false;
89
+ }
90
+
91
+ bool S2MaxDistanceEdgeTarget::UpdateMinDistance(
92
+ const S2Point& v0, const S2Point& v1, S2MaxDistance* min_dist) {
93
+ S1ChordAngle dist(*min_dist);
94
+ if (S2::UpdateEdgePairMaxDistance(a_, b_, v0, v1, &dist)) {
95
+ min_dist->UpdateMin(S2MaxDistance(dist));
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+
101
+ bool S2MaxDistanceEdgeTarget::UpdateMinDistance(
102
+ const S2Cell& cell, S2MaxDistance* min_dist) {
103
+ return min_dist->UpdateMin(S2MaxDistance(cell.GetMaxDistance(a_, b_)));
104
+ }
105
+
106
+ bool S2MaxDistanceEdgeTarget::VisitContainingShapes(
107
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
108
+ // We only need to test one edge point. That is because the method *must*
109
+ // visit a polygon if it fully contains the target, and *is allowed* to
110
+ // visit a polygon if it intersects the target. If the tested vertex is not
111
+ // contained, we know the full edge is not contained; if the tested vertex is
112
+ // contained, then the edge either is fully contained (must be visited) or it
113
+ // intersects (is allowed to be visited). We visit the center of the edge so
114
+ // that edge AB gives identical results to BA.
115
+ S2MaxDistancePointTarget target((a_ + b_).Normalize());
116
+ return target.VisitContainingShapes(index, visitor);
117
+ }
118
+
119
+ ////////////////// Cell Target ////////////////////
120
+
121
+ // This method returns an S2Cap that bounds the antipode of the target. (This
122
+ // is the set of points whose S2MaxDistance to the target is
123
+ // S2MaxDistance::Zero().)
124
+ S2Cap S2MaxDistanceCellTarget::GetCapBound() {
125
+ S2Cap cap = cell_.GetCapBound();
126
+ return S2Cap(-cap.center(), cap.radius());
127
+ }
128
+
129
+ bool S2MaxDistanceCellTarget::UpdateMinDistance(
130
+ const S2Point& p, S2MaxDistance* min_dist) {
131
+ return min_dist->UpdateMin(S2MaxDistance(cell_.GetMaxDistance(p)));
132
+ }
133
+
134
+ bool S2MaxDistanceCellTarget::UpdateMinDistance(
135
+ const S2Point& v0, const S2Point& v1, S2MaxDistance* min_dist) {
136
+ return min_dist->UpdateMin(S2MaxDistance(cell_.GetMaxDistance(v0, v1)));
137
+ }
138
+
139
+ bool S2MaxDistanceCellTarget::UpdateMinDistance(
140
+ const S2Cell& cell, S2MaxDistance* min_dist) {
141
+ return min_dist->UpdateMin(S2MaxDistance(cell_.GetMaxDistance(cell)));
142
+ }
143
+
144
+ bool S2MaxDistanceCellTarget::VisitContainingShapes(
145
+ const S2ShapeIndex& index, const ShapeVisitor& visitor) {
146
+ // We only need to check one point here - cell center is simplest.
147
+ // See comment at S2MaxDistanceEdgeTarget::VisitContainingShapes.
148
+ S2MaxDistancePointTarget target(cell_.GetCenter());
149
+ return target.VisitContainingShapes(index, visitor);
150
+ }
151
+
152
+ ////////////////// Index Target ////////////////////
153
+
154
+ S2MaxDistanceShapeIndexTarget::S2MaxDistanceShapeIndexTarget(
155
+ const S2ShapeIndex* index)
156
+ : index_(index), query_(absl::make_unique<S2FurthestEdgeQuery>(index)) {
157
+ }
158
+
159
+ S2MaxDistanceShapeIndexTarget::~S2MaxDistanceShapeIndexTarget() {
160
+ }
161
+
162
+ bool S2MaxDistanceShapeIndexTarget::include_interiors() const {
163
+ return query_->options().include_interiors();
164
+ }
165
+
166
+ void S2MaxDistanceShapeIndexTarget::set_include_interiors(
167
+ bool include_interiors) {
168
+ query_->mutable_options()->set_include_interiors(include_interiors);
169
+ }
170
+
171
+ bool S2MaxDistanceShapeIndexTarget::use_brute_force() const {
172
+ return query_->options().use_brute_force();
173
+ }
174
+
175
+ void S2MaxDistanceShapeIndexTarget::set_use_brute_force(
176
+ bool use_brute_force) {
177
+ query_->mutable_options()->set_use_brute_force(use_brute_force);
178
+ }
179
+
180
+ bool S2MaxDistanceShapeIndexTarget::set_max_error(
181
+ const S1ChordAngle& max_error) {
182
+ query_->mutable_options()->set_max_error(max_error);
183
+ return true; // Indicates that we may return suboptimal results.
184
+ }
185
+
186
+ // This method returns an S2Cap that bounds the antipode of the target. (This
187
+ // is the set of points whose S2MaxDistance to the target is
188
+ // S2MaxDistance::Zero().)
189
+ S2Cap S2MaxDistanceShapeIndexTarget::GetCapBound() {
190
+ S2Cap cap = MakeS2ShapeIndexRegion(index_).GetCapBound();
191
+ return S2Cap(-cap.center(), cap.radius());
192
+ }
193
+
194
+ bool S2MaxDistanceShapeIndexTarget::UpdateMinDistance(
195
+ const S2Point& p, S2MaxDistance* min_dist) {
196
+ query_->mutable_options()->set_min_distance(S1ChordAngle(*min_dist));
197
+ S2FurthestEdgeQuery::PointTarget target(p);
198
+ S2FurthestEdgeQuery::Result r = query_->FindFurthestEdge(&target);
199
+ if (r.shape_id() < 0) {
200
+ return false;
201
+ }
202
+ *min_dist = S2MaxDistance(r.distance());
203
+ return true;
204
+ }
205
+
206
+ bool S2MaxDistanceShapeIndexTarget::UpdateMinDistance(
207
+ const S2Point& v0, const S2Point& v1, S2MaxDistance* min_dist) {
208
+ query_->mutable_options()->set_min_distance(S1ChordAngle(*min_dist));
209
+ S2FurthestEdgeQuery::EdgeTarget target(v0, v1);
210
+ S2FurthestEdgeQuery::Result r = query_->FindFurthestEdge(&target);
211
+ if (r.shape_id() < 0) return false;
212
+ *min_dist = S2MaxDistance(r.distance());
213
+ return true;
214
+ }
215
+
216
+ bool S2MaxDistanceShapeIndexTarget::UpdateMinDistance(
217
+ const S2Cell& cell, S2MaxDistance* min_dist) {
218
+ query_->mutable_options()->set_min_distance(S1ChordAngle(*min_dist));
219
+ S2FurthestEdgeQuery::CellTarget target(cell);
220
+ S2FurthestEdgeQuery::Result r = query_->FindFurthestEdge(&target);
221
+ if (r.shape_id() < 0) return false;
222
+ *min_dist = S2MaxDistance(r.distance());
223
+ return true;
224
+ }
225
+
226
+ // For target types consisting of multiple connected components (such as
227
+ // S2MaxDistanceShapeIndexTarget), this method should return the
228
+ // polygons containing the antipodal reflection of *any* connected
229
+ // component. (It is sufficient to test containment of one vertex per
230
+ // connected component, since the API allows us to also return any polygon
231
+ // whose boundary has S2MaxDistance::Zero() to the target.)
232
+ bool S2MaxDistanceShapeIndexTarget::VisitContainingShapes(
233
+ const S2ShapeIndex& query_index, const ShapeVisitor& visitor) {
234
+ // It is sufficient to find the set of chain starts in the target index
235
+ // (i.e., one vertex per connected component of edges) that are contained by
236
+ // the query index, except for one special case to handle full polygons.
237
+ //
238
+ // TODO(ericv): Do this by merge-joining the two S2ShapeIndexes, and share
239
+ // the code with S2BooleanOperation.
240
+ for (S2Shape* shape : *index_) {
241
+ if (shape == nullptr) continue;
242
+ int num_chains = shape->num_chains();
243
+ // Shapes that don't have any edges require a special case (below).
244
+ bool tested_point = false;
245
+ for (int c = 0; c < num_chains; ++c) {
246
+ S2Shape::Chain chain = shape->chain(c);
247
+ if (chain.length == 0) continue;
248
+ tested_point = true;
249
+ S2MaxDistancePointTarget target(shape->chain_edge(c, 0).v0);
250
+ if (!target.VisitContainingShapes(query_index, visitor)) {
251
+ return false;
252
+ }
253
+ }
254
+ if (!tested_point) {
255
+ // Special case to handle full polygons.
256
+ S2Shape::ReferencePoint ref = shape->GetReferencePoint();
257
+ if (!ref.contained) continue;
258
+ S2MaxDistancePointTarget target(ref.point);
259
+ if (!target.VisitContainingShapes(query_index, visitor)) {
260
+ return false;
261
+ }
262
+ }
263
+ }
264
+ return true;
265
+ }
@@ -0,0 +1,241 @@
1
+ // Copyright 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
+ // This file defines a collection of classes that are useful for computing
17
+ // maximum distances on the sphere. Their purpose is to allow code to be
18
+ // shared among the various query classes that find remote geometry, such as
19
+ // S2FurthestPointQuery and S2FurthestEdgeQuery.
20
+
21
+ #ifndef S2_S2MAX_DISTANCE_TARGETS_H_
22
+ #define S2_S2MAX_DISTANCE_TARGETS_H_
23
+
24
+ #include <memory>
25
+
26
+ #include "s2/_fp_contract_off.h"
27
+ #include "s2/s1angle.h"
28
+ #include "s2/s1chord_angle.h"
29
+ #include "s2/s2cell.h"
30
+ #include "s2/s2distance_target.h"
31
+ #include "s2/s2edge_distances.h"
32
+ #include "s2/s2shape_index.h"
33
+
34
+ class S2FurthestEdgeQuery;
35
+
36
+ // S2MaxDistance is a class that allows maximum distances to be computed using
37
+ // a minimum distance algorithm. Specifically, S2MaxDistance(x) represents the
38
+ // supplementary distance (Pi - x). This has the effect of inverting the sort
39
+ // order, i.e.
40
+ //
41
+ // (S2MaxDistance(x) < S2MaxDistance(y)) <=> (Pi - x < Pi - y) <=> (x > y)
42
+ //
43
+ // All other operations are implemented similarly (using the supplementary
44
+ // distance Pi - x). For example, S2MaxDistance(x) - S2MaxDistance(y) ==
45
+ // S2MaxDistance(x + y).
46
+ class S2MaxDistance {
47
+ public:
48
+ using Delta = S1ChordAngle;
49
+
50
+ S2MaxDistance() : distance_() {}
51
+ explicit S2MaxDistance(S1ChordAngle x) : distance_(x) {}
52
+ explicit operator S1ChordAngle() const { return distance_; }
53
+ static S2MaxDistance Zero();
54
+ static S2MaxDistance Infinity();
55
+ static S2MaxDistance Negative();
56
+
57
+ friend bool operator==(S2MaxDistance x, S2MaxDistance y);
58
+ friend bool operator<(S2MaxDistance x, S2MaxDistance y);
59
+
60
+ friend S2MaxDistance operator-(S2MaxDistance x, S1ChordAngle delta);
61
+ S1ChordAngle GetChordAngleBound() const;
62
+
63
+ // If (dist < *this), updates *this and returns true (used internally).
64
+ bool UpdateMin(const S2MaxDistance& dist);
65
+
66
+ private:
67
+ S1ChordAngle distance_;
68
+ };
69
+
70
+ // S2MaxDistanceTarget represents a geometric object to which maximum distances
71
+ // on the sphere are measured.
72
+ //
73
+ // Subtypes are defined below for measuring the distance to a point, an edge,
74
+ // an S2Cell, or an S2ShapeIndex (an arbitrary collection of geometry).
75
+ using S2MaxDistanceTarget = S2DistanceTarget<S2MaxDistance>;
76
+
77
+ // An S2DistanceTarget subtype for computing the maximum distance to a point.
78
+ class S2MaxDistancePointTarget : public S2MaxDistanceTarget {
79
+ public:
80
+ explicit S2MaxDistancePointTarget(const S2Point& point);
81
+
82
+ S2Cap GetCapBound() final;
83
+ bool UpdateMinDistance(const S2Point& p, S2MaxDistance* min_dist) final;
84
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
85
+ S2MaxDistance* min_dist) final;
86
+ bool UpdateMinDistance(const S2Cell& cell,
87
+ S2MaxDistance* min_dist) final;
88
+ bool VisitContainingShapes(const S2ShapeIndex& index,
89
+ const ShapeVisitor& visitor) final;
90
+
91
+ private:
92
+ S2Point point_;
93
+ };
94
+
95
+ // An S2DistanceTarget subtype for computing the maximum distance to an edge.
96
+ class S2MaxDistanceEdgeTarget : public S2MaxDistanceTarget {
97
+ public:
98
+ explicit S2MaxDistanceEdgeTarget(const S2Point& a, const S2Point& b);
99
+
100
+ S2Cap GetCapBound() final;
101
+ bool UpdateMinDistance(const S2Point& p, S2MaxDistance* min_dist) final;
102
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
103
+ S2MaxDistance* min_dist) final;
104
+ bool UpdateMinDistance(const S2Cell& cell,
105
+ S2MaxDistance* min_dist) final;
106
+ bool VisitContainingShapes(const S2ShapeIndex& index,
107
+ const ShapeVisitor& visitor) final;
108
+
109
+ private:
110
+ S2Point a_, b_;
111
+ };
112
+
113
+ // An S2DistanceTarget subtype for computing the maximum distance to an S2Cell
114
+ // (including the interior of the cell).
115
+ class S2MaxDistanceCellTarget : public S2MaxDistanceTarget {
116
+ public:
117
+ explicit S2MaxDistanceCellTarget(const S2Cell& cell);
118
+ S2Cap GetCapBound() final;
119
+ bool UpdateMinDistance(const S2Point& p, S2MaxDistance* min_dist) final;
120
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
121
+ S2MaxDistance* min_dist) final;
122
+ bool UpdateMinDistance(const S2Cell& cell,
123
+ S2MaxDistance* min_dist) final;
124
+ bool VisitContainingShapes(const S2ShapeIndex& index,
125
+ const ShapeVisitor& visitor) final;
126
+
127
+ private:
128
+ S2Cell cell_;
129
+ };
130
+
131
+ // An S2DistanceTarget subtype for computing the maximum distance to an
132
+ // S2ShapeIndex (a collection of points, polylines, and/or polygons).
133
+ //
134
+ // Note that ShapeIndexTarget has its own options:
135
+ //
136
+ // include_interiors()
137
+ // - specifies that distances are measured to the boundary and interior
138
+ // of polygons in the S2ShapeIndex. (If set to false, distance is
139
+ // measured to the polygon boundary only.)
140
+ // DEFAULT: true.
141
+ //
142
+ // brute_force()
143
+ // - specifies that the distances should be computed by examining every
144
+ // edge in the S2ShapeIndex (for testing and debugging purposes).
145
+ // DEFAULT: false.
146
+ //
147
+ // These options are specified independently of the corresponding
148
+ // S2FurthestEdgeQuery options. For example, if include_interiors is true for
149
+ // a ShapeIndexTarget but false for the S2FurthestEdgeQuery where the target
150
+ // is used, then distances will be measured from the boundary of one
151
+ // S2ShapeIndex to the boundary and interior of the other.
152
+ //
153
+ class S2MaxDistanceShapeIndexTarget : public S2MaxDistanceTarget {
154
+ public:
155
+ explicit S2MaxDistanceShapeIndexTarget(const S2ShapeIndex* index);
156
+ ~S2MaxDistanceShapeIndexTarget() override;
157
+
158
+ // Specifies that distance will be measured to the boundary and interior
159
+ // of polygons in the S2ShapeIndex rather than to polygon boundaries only.
160
+ //
161
+ // DEFAULT: true
162
+ bool include_interiors() const;
163
+ void set_include_interiors(bool include_interiors);
164
+
165
+ // Specifies that the distances should be computed by examining every edge
166
+ // in the S2ShapeIndex (for testing and debugging purposes).
167
+ //
168
+ // DEFAULT: false
169
+ bool use_brute_force() const;
170
+ void set_use_brute_force(bool use_brute_force);
171
+
172
+ bool set_max_error(const S1ChordAngle& max_error) override;
173
+ S2Cap GetCapBound() final;
174
+ bool UpdateMinDistance(const S2Point& p, S2MaxDistance* min_dist) final;
175
+ bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
176
+ S2MaxDistance* min_dist) final;
177
+ bool UpdateMinDistance(const S2Cell& cell,
178
+ S2MaxDistance* min_dist) final;
179
+ bool VisitContainingShapes(const S2ShapeIndex& query_index,
180
+ const ShapeVisitor& visitor) final;
181
+
182
+ private:
183
+ const S2ShapeIndex* index_;
184
+ std::unique_ptr<S2FurthestEdgeQuery> query_;
185
+ };
186
+
187
+
188
+ ////////////////// Implementation details follow ////////////////////
189
+
190
+ inline S2MaxDistance S2MaxDistance::Zero() {
191
+ return S2MaxDistance(S1ChordAngle::Straight());
192
+ }
193
+
194
+ inline S2MaxDistance S2MaxDistance::Infinity() {
195
+ return S2MaxDistance(S1ChordAngle::Negative());
196
+ }
197
+
198
+ inline S2MaxDistance S2MaxDistance::Negative() {
199
+ return S2MaxDistance(S1ChordAngle::Infinity());
200
+ }
201
+
202
+ inline bool operator==(S2MaxDistance x, S2MaxDistance y) {
203
+ return x.distance_ == y.distance_;
204
+ }
205
+
206
+ inline bool operator<(S2MaxDistance x, S2MaxDistance y) {
207
+ return x.distance_ > y.distance_;
208
+ }
209
+
210
+ inline S2MaxDistance operator-(S2MaxDistance x, S1ChordAngle delta) {
211
+ return S2MaxDistance(x.distance_ + delta);
212
+ }
213
+
214
+ inline S1ChordAngle S2MaxDistance::GetChordAngleBound() const {
215
+ return S1ChordAngle::Straight() - distance_;
216
+ }
217
+
218
+ inline bool S2MaxDistance::UpdateMin(const S2MaxDistance& dist) {
219
+ if (dist < *this) {
220
+ *this = dist;
221
+ return true;
222
+ }
223
+ return false;
224
+ }
225
+
226
+ inline S2MaxDistancePointTarget::S2MaxDistancePointTarget(const S2Point& point)
227
+ : point_(point) {
228
+ }
229
+
230
+ inline S2MaxDistanceEdgeTarget::S2MaxDistanceEdgeTarget(const S2Point& a,
231
+ const S2Point& b)
232
+ : a_(a), b_(b) {
233
+ a_.Normalize();
234
+ b_.Normalize();
235
+ }
236
+
237
+ inline S2MaxDistanceCellTarget::S2MaxDistanceCellTarget(const S2Cell& cell)
238
+ : cell_(cell) {
239
+ }
240
+
241
+ #endif // S2_S2MAX_DISTANCE_TARGETS_H_