@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,87 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+ //
18
+ // There are several notions of the "centroid" of a triangle. First, there
19
+ // is the planar centroid, which is simply the centroid of the ordinary
20
+ // (non-spherical) triangle defined by the three vertices. Second, there is
21
+ // the surface centroid, which is defined as the intersection of the three
22
+ // medians of the spherical triangle. It is possible to show that this
23
+ // point is simply the planar centroid projected to the surface of the
24
+ // sphere. Finally, there is the true centroid (mass centroid), which is
25
+ // defined as the surface integral over the spherical triangle of (x,y,z)
26
+ // divided by the triangle area. This is the point that the triangle would
27
+ // rotate around if it was spinning in empty space.
28
+ //
29
+ // The best centroid for most purposes is the true centroid. Unlike the
30
+ // planar and surface centroids, the true centroid behaves linearly as
31
+ // regions are added or subtracted. That is, if you split a triangle into
32
+ // pieces and compute the average of their centroids (weighted by triangle
33
+ // area), the result equals the centroid of the original triangle. This is
34
+ // not true of the other centroids.
35
+ //
36
+ // Also note that the surface centroid may be nowhere near the intuitive
37
+ // "center" of a spherical triangle. For example, consider the triangle
38
+ // with vertices A=(1,eps,0), B=(0,0,1), C=(-1,eps,0) (a quarter-sphere).
39
+ // The surface centroid of this triangle is at S=(0, 2*eps, 1), which is
40
+ // within a distance of 2*eps of the vertex B. Note that the median from A
41
+ // (the segment connecting A to the midpoint of BC) passes through S, since
42
+ // this is the shortest path connecting the two endpoints. On the other
43
+ // hand, the true centroid is at M=(0, 0.5, 0.5), which when projected onto
44
+ // the surface is a much more reasonable interpretation of the "center" of
45
+ // this triangle.
46
+
47
+ #ifndef S2_S2CENTROIDS_H_
48
+ #define S2_S2CENTROIDS_H_
49
+
50
+ #include "s2/s2point.h"
51
+
52
+ namespace S2 {
53
+
54
+ // Returns the centroid of the planar triangle ABC. This can be normalized to
55
+ // unit length to obtain the "surface centroid" of the corresponding spherical
56
+ // triangle, i.e. the intersection of the three medians. However, note that
57
+ // for large spherical triangles the surface centroid may be nowhere near the
58
+ // intuitive "center" (see example above).
59
+ S2Point PlanarCentroid(const S2Point& a, const S2Point& b, const S2Point& c);
60
+
61
+ // Returns the true centroid of the spherical triangle ABC multiplied by the
62
+ // signed area of spherical triangle ABC. The reasons for multiplying by the
63
+ // signed area are (1) this is the quantity that needs to be summed to compute
64
+ // the centroid of a union or difference of triangles, and (2) it's actually
65
+ // easier to calculate this way. All points must have unit length.
66
+ //
67
+ // Note that the result of this function is defined to be S2Point(0, 0, 0) if
68
+ // the triangle is degenerate (and that this is intended behavior).
69
+ S2Point TrueCentroid(const S2Point& a, const S2Point& b, const S2Point& c);
70
+
71
+ // Returns the true centroid of the spherical geodesic edge AB multiplied by
72
+ // the length of the edge AB. As with triangles, the true centroid of a
73
+ // collection of edges may be computed simply by summing the result of this
74
+ // method for each edge.
75
+ //
76
+ // Note that the planar centroid of a geodesic edge simply 0.5 * (a + b),
77
+ // while the surface centroid is (a + b).Normalize(). However neither of
78
+ // these values is appropriate for computing the centroid of a collection of
79
+ // edges (such as a polyline).
80
+ //
81
+ // Also note that the result of this function is defined to be S2Point(0, 0, 0)
82
+ // if the edge is degenerate (and that this is intended behavior).
83
+ S2Point TrueCentroid(const S2Point& a, const S2Point& b);
84
+
85
+ } // namespace S2
86
+
87
+ #endif // S2_S2CENTROIDS_H_
@@ -0,0 +1,82 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s2centroids.h"
19
+
20
+ #include <gtest/gtest.h>
21
+ #include "s2/s2testing.h"
22
+
23
+ namespace {
24
+
25
+ TEST(TriangleTrueCentroid, SmallTriangles) {
26
+ // Test TrueCentroid() with very small triangles. This test assumes that
27
+ // the triangle is small enough so that it is nearly planar.
28
+ for (int iter = 0; iter < 100; ++iter) {
29
+ Vector3_d p, x, y;
30
+ S2Testing::GetRandomFrame(&p, &x, &y);
31
+ double d = 1e-4 * pow(1e-4, S2Testing::rnd.RandDouble());
32
+ S2Point p0 = (p - d * x).Normalize();
33
+ S2Point p1 = (p + d * x).Normalize();
34
+ S2Point p2 = (p + 3 * d * y).Normalize();
35
+ S2Point centroid = S2::TrueCentroid(p0, p1, p2).Normalize();
36
+
37
+ // The centroid of a planar triangle is at the intersection of its
38
+ // medians, which is two-thirds of the way along each median.
39
+ S2Point expected_centroid = (p + d * y).Normalize();
40
+ EXPECT_LE(centroid.Angle(expected_centroid), 2e-8);
41
+ }
42
+ }
43
+
44
+ TEST(EdgeTrueCentroid, SemiEquator) {
45
+ // Test the centroid of polyline ABC that follows the equator and consists
46
+ // of two 90 degree edges (i.e., C = -A). The centroid (multiplied by
47
+ // length) should point toward B and have a norm of 2.0. (The centroid
48
+ // itself has a norm of 2/Pi, and the total edge length is Pi.)
49
+ S2Point a(0, -1, 0), b(1, 0, 0), c(0, 1, 0);
50
+ S2Point centroid = S2::TrueCentroid(a, b) + S2::TrueCentroid(b, c);
51
+ EXPECT_TRUE(S2::ApproxEquals(b, centroid.Normalize()));
52
+ EXPECT_DOUBLE_EQ(2.0, centroid.Norm());
53
+ }
54
+
55
+ TEST(EdgeTrueCentroid, GreatCircles) {
56
+ // Construct random great circles and divide them randomly into segments.
57
+ // Then make sure that the centroid is approximately at the center of the
58
+ // sphere. Note that because of the way the centroid is computed, it does
59
+ // not matter how we split the great circle into segments.
60
+ //
61
+ // Note that this is a direct test of the properties that the centroid
62
+ // should have, rather than a test that it matches a particular formula.
63
+
64
+ for (int iter = 0; iter < 100; ++iter) {
65
+ // Choose a coordinate frame for the great circle.
66
+ S2Point x, y, z, centroid;
67
+ S2Testing::GetRandomFrame(&x, &y, &z);
68
+
69
+ S2Point v0 = x;
70
+ for (double theta = 0; theta < 2 * M_PI;
71
+ theta += pow(S2Testing::rnd.RandDouble(), 10)) {
72
+ S2Point v1 = cos(theta) * x + sin(theta) * y;
73
+ centroid += S2::TrueCentroid(v0, v1);
74
+ v0 = v1;
75
+ }
76
+ // Close the circle.
77
+ centroid += S2::TrueCentroid(v0, x);
78
+ EXPECT_LE(centroid.Norm(), 2e-14);
79
+ }
80
+ }
81
+
82
+ } // namespace
@@ -0,0 +1,123 @@
1
+ // Copyright 2018 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/s2closest_cell_query.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/s2cell_id.h"
26
+ #include "s2/s2cell_union.h"
27
+ #include "s2/s2edge_distances.h"
28
+ #include "s2/s2region_coverer.h"
29
+ #include "s2/s2shape_index_region.h"
30
+
31
+ void S2ClosestCellQuery::Options::set_conservative_max_distance(
32
+ S1ChordAngle max_distance) {
33
+ set_max_distance(Distance(max_distance.PlusError(
34
+ S2::GetUpdateMinDistanceMaxError(max_distance)).Successor()));
35
+ }
36
+
37
+ void S2ClosestCellQuery::Options::set_conservative_max_distance(
38
+ S1Angle max_distance) {
39
+ set_conservative_max_distance(S1ChordAngle(max_distance));
40
+ }
41
+
42
+ // The thresholds for using the brute force algorithm are generally tuned to
43
+ // optimize IsDistanceLess (which compares the distance against a threshold)
44
+ // rather than FindClosest (which actually computes the minimum distance).
45
+ // This is because the former operation is (1) more common, (2) inherently
46
+ // faster, and (3) closely related to finding all cells within a given
47
+ // distance, which is also very common.
48
+
49
+ int S2ClosestCellQuery::PointTarget::max_brute_force_index_size() const {
50
+ // Break-even points: Point cloud Cap coverings
51
+ // BM_FindClosest 18 16
52
+ // BM_IsDistanceLess 8 9
53
+ return 9;
54
+ }
55
+
56
+ int S2ClosestCellQuery::EdgeTarget::max_brute_force_index_size() const {
57
+ // Break-even points: Point cloud Cap coverings
58
+ // BM_FindClosestToLongEdge 14 16
59
+ // BM_IsDistanceLessToLongEdge 5 5
60
+ return 5;
61
+ }
62
+
63
+ int S2ClosestCellQuery::CellTarget::max_brute_force_index_size() const {
64
+ // Break-even points: Point cloud Cap coverings
65
+ // BM_FindClosestToSmallCell 12 13
66
+ // BM_IsDistanceLessToSmallCell 6 6
67
+ //
68
+ // Note that the primary use of CellTarget is to implement CellUnionTarget,
69
+ // and therefore it is very important to optimize for the case where a
70
+ // distance limit has been specified.
71
+ return 6;
72
+ }
73
+
74
+ int S2ClosestCellQuery::CellUnionTarget::max_brute_force_index_size() const {
75
+ // Break-even points: Point cloud Cap coverings
76
+ // BM_FindClosestToSmallCoarseCellUnion 12 10
77
+ // BM_IsDistanceLessToSmallCoarseCellUnion 7 6
78
+ return 8;
79
+ }
80
+
81
+ int S2ClosestCellQuery::ShapeIndexTarget::max_brute_force_index_size() const {
82
+ // Break-even points: Point cloud Cap coverings
83
+ // BM_FindClosestToSmallCoarseShapeIndex 10 8
84
+ // BM_IsDistanceLessToSmallCoarseShapeIndex 7 6
85
+ return 7;
86
+ }
87
+
88
+ S2ClosestCellQuery::S2ClosestCellQuery() {
89
+ // Prevent inline constructor bloat by defining here.
90
+ }
91
+
92
+ S2ClosestCellQuery::~S2ClosestCellQuery() {
93
+ // Prevent inline destructor bloat by defining here.
94
+ }
95
+
96
+ bool S2ClosestCellQuery::IsDistanceLess(Target* target, S1ChordAngle limit) {
97
+ static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
98
+ Options tmp_options = options_;
99
+ tmp_options.set_max_results(1);
100
+ tmp_options.set_max_distance(limit);
101
+ tmp_options.set_max_error(S1ChordAngle::Straight());
102
+ return !base_.FindClosestCell(target, tmp_options).is_empty();
103
+ }
104
+
105
+ bool S2ClosestCellQuery::IsDistanceLessOrEqual(Target* target,
106
+ S1ChordAngle limit) {
107
+ static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
108
+ Options tmp_options = options_;
109
+ tmp_options.set_max_results(1);
110
+ tmp_options.set_inclusive_max_distance(limit);
111
+ tmp_options.set_max_error(S1ChordAngle::Straight());
112
+ return !base_.FindClosestCell(target, tmp_options).is_empty();
113
+ }
114
+
115
+ bool S2ClosestCellQuery::IsConservativeDistanceLessOrEqual(
116
+ Target* target, S1ChordAngle limit) {
117
+ static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
118
+ Options tmp_options = options_;
119
+ tmp_options.set_max_results(1);
120
+ tmp_options.set_conservative_max_distance(limit);
121
+ tmp_options.set_max_error(S1ChordAngle::Straight());
122
+ return !base_.FindClosestCell(target, tmp_options).is_empty();
123
+ }
@@ -0,0 +1,385 @@
1
+ // Copyright 2018 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2CLOSEST_CELL_QUERY_H_
19
+ #define S2_S2CLOSEST_CELL_QUERY_H_
20
+
21
+ #include <vector>
22
+
23
+ #include "s2/base/logging.h"
24
+ #include "s2/_fp_contract_off.h"
25
+ #include "s2/s1angle.h"
26
+ #include "s2/s1chord_angle.h"
27
+ #include "s2/s2cell.h"
28
+ #include "s2/s2cell_id.h"
29
+ #include "s2/s2closest_cell_query_base.h"
30
+ #include "s2/s2min_distance_targets.h"
31
+
32
+ // S2ClosestCellQuery is a helper class for finding the closest cell(s) to a
33
+ // given point, edge, S2Cell, S2CellUnion, or geometry collection. A typical
34
+ // use case would be to add a collection of S2Cell coverings to an S2CellIndex
35
+ // (representing a collection of original geometry), and then use
36
+ // S2ClosestCellQuery to find all coverings that are within a given distance
37
+ // of some target geometry (which could be represented exactly, or could also
38
+ // be a covering). The distance to the original geometry corresponding to
39
+ // each covering could then be measured more precisely if desired.
40
+ //
41
+ // For example, here is how to find all cells that are closer than
42
+ // "distance_limit" to a given target point:
43
+ //
44
+ // S2ClosestCellQuery query(&cell_index);
45
+ // query.mutable_options()->set_max_distance(distance_limit);
46
+ // S2ClosestCellQuery::PointTarget target(target_point);
47
+ // for (const auto& result : query.FindClosestCells(&target)) {
48
+ // // result.distance() is the distance to the target.
49
+ // // result.cell_id() is the indexed S2CellId.
50
+ // // result.label() is the integer label associated with the S2CellId.
51
+ // DoSomething(target_point, result);
52
+ // }
53
+ //
54
+ // You can find either the k closest cells, or all cells within a given
55
+ // radius, or both (i.e., the k closest cells up to a given maximum radius).
56
+ // By default *all* cells are returned, so you should always specify either
57
+ // max_results() or max_distance() or both. You can also restrict the results
58
+ // to cells that intersect a given S2Region; for example:
59
+ //
60
+ // S2LatLngRect rect(...);
61
+ // query.mutable_options()->set_region(&rect); // Does *not* take ownership.
62
+ //
63
+ // There is a FindClosestCell() convenience method that returns the closest
64
+ // cell. However, if you only need to test whether the distance is above or
65
+ // below a given threshold (e.g., 10 km), it is typically much faster to use
66
+ // the IsDistanceLess() method instead. Unlike FindClosestCell(), this method
67
+ // stops as soon as it can prove that the minimum distance is either above or
68
+ // below the threshold. Example usage:
69
+ //
70
+ // if (query.IsDistanceLess(&target, limit_distance)) ...
71
+ //
72
+ // To find the closest cells to a query edge rather than a point, use:
73
+ //
74
+ // S2ClosestCellQuery::EdgeTarget target(v0, v1);
75
+ // query.FindClosestCells(&target);
76
+ //
77
+ // Similarly you can find the closest cells to an S2Cell using an
78
+ // S2ClosestCellQuery::CellTarget, you can find the closest cells to an
79
+ // S2CellUnion using an S2ClosestCellQuery::CellUnionTarget, and you can find
80
+ // the closest cells to an arbitrary collection of points, polylines, and
81
+ // polygons by using an S2ClosestCellQuery::ShapeIndexTarget.
82
+ //
83
+ // The implementation is designed to be fast for both simple and complex
84
+ // geometric objects.
85
+ class S2ClosestCellQuery {
86
+ public:
87
+ // See S2ClosestCellQueryBase for full documentation.
88
+
89
+ // S2MinDistance is a thin wrapper around S1ChordAngle that implements the
90
+ // Distance concept required by S2ClosestCellQueryBase.
91
+ using Distance = S2MinDistance;
92
+ using Base = S2ClosestCellQueryBase<Distance>;
93
+
94
+ // Each "Result" object represents a closest (s2cell_id, label) pair. Here
95
+ // are its main methods (see S2ClosestCellQueryBase::Result for details):
96
+ //
97
+ // // The distance from the target to this point.
98
+ // S1ChordAngle distance() const;
99
+ //
100
+ // // The S2CellId itself.
101
+ // S2CellId cell_id() const;
102
+ //
103
+ // // The label associated with this S2CellId.
104
+ // const Label& label() const;
105
+ using Result = Base::Result;
106
+
107
+ // Options that control the set of cells returned. Note that by default
108
+ // *all* cells are returned, so you will always want to set either the
109
+ // max_results() option or the max_distance() option (or both).
110
+ class Options : public Base::Options {
111
+ public:
112
+ // See S2ClosestCellQueryBase::Options for the full set of options.
113
+
114
+ // Specifies that only cells whose distance to the target is less than
115
+ // "max_distance" should be returned.
116
+ //
117
+ // Note that cells whose distance is exactly equal to "max_distance" are
118
+ // not returned. Normally this doesn't matter, because distances are not
119
+ // computed exactly in the first place, but if such cells are needed then
120
+ // see set_inclusive_max_distance() below.
121
+ //
122
+ // DEFAULT: Distance::Infinity()
123
+ void set_max_distance(S1ChordAngle max_distance);
124
+
125
+ // Like set_max_distance(), except that cells whose distance is exactly
126
+ // equal to "max_distance" are also returned. Equivalent to calling
127
+ // set_max_distance(max_distance.Successor()).
128
+ void set_inclusive_max_distance(S1ChordAngle max_distance);
129
+
130
+ // Like set_inclusive_max_distance(), except that "max_distance" is also
131
+ // increased by the maximum error in the distance calculation. This
132
+ // ensures that all cells whose true distance is less than or equal to
133
+ // "max_distance" will be returned (along with some cells whose true
134
+ // distance is slightly greater).
135
+ //
136
+ // Algorithms that need to do exact distance comparisons can use this
137
+ // option to find a set of candidate cells that can then be filtered
138
+ // further (e.g., using s2pred::CompareDistance).
139
+ void set_conservative_max_distance(S1ChordAngle max_distance);
140
+
141
+ // Versions of set_max_distance that take an S1Angle argument. (Note that
142
+ // these functions require a conversion, and that the S1ChordAngle versions
143
+ // are preferred.)
144
+ void set_max_distance(S1Angle max_distance);
145
+ void set_inclusive_max_distance(S1Angle max_distance);
146
+ void set_conservative_max_distance(S1Angle max_distance);
147
+
148
+ // See S2ClosestCellQueryBase::Options for documentation.
149
+ using Base::Options::set_max_error; // S1Chordangle version
150
+ void set_max_error(S1Angle max_error); // S1Angle version
151
+
152
+ // Inherited options (see s2closest_cell_query_base.h for details):
153
+ using Base::Options::set_max_results;
154
+ using Base::Options::set_region;
155
+ using Base::Options::set_use_brute_force;
156
+ };
157
+
158
+ // "Target" represents the geometry to which the distance is measured.
159
+ // There are subtypes for measuring the distance to a point, an edge, an
160
+ // S2Cell, or an S2ShapeIndex (an arbitrary collection of geometry).
161
+ using Target = S2MinDistanceTarget;
162
+
163
+ // Target subtype that computes the closest distance to a point.
164
+ class PointTarget final : public S2MinDistancePointTarget {
165
+ public:
166
+ explicit PointTarget(const S2Point& point);
167
+ int max_brute_force_index_size() const override;
168
+ };
169
+
170
+ // Target subtype that computes the closest distance to an edge.
171
+ class EdgeTarget final : public S2MinDistanceEdgeTarget {
172
+ public:
173
+ explicit EdgeTarget(const S2Point& a, const S2Point& b);
174
+ int max_brute_force_index_size() const override;
175
+ };
176
+
177
+ // Target subtype that computes the closest distance to an S2Cell
178
+ // (including the interior of the cell).
179
+ class CellTarget final : public S2MinDistanceCellTarget {
180
+ public:
181
+ explicit CellTarget(const S2Cell& cell);
182
+ int max_brute_force_index_size() const override;
183
+ };
184
+
185
+ // Target subtype that computes the closest distance to an S2CellUnion.
186
+ class CellUnionTarget final : public S2MinDistanceCellUnionTarget {
187
+ public:
188
+ explicit CellUnionTarget(S2CellUnion cell_union);
189
+ int max_brute_force_index_size() const override;
190
+ };
191
+
192
+ // Target subtype that computes the closest distance to an S2ShapeIndex
193
+ // (an arbitrary collection of points, polylines, and/or polygons).
194
+ //
195
+ // By default, distances are measured to the boundary and interior of
196
+ // polygons in the S2ShapeIndex rather than to polygon boundaries only.
197
+ // If you wish to change this behavior, you may call
198
+ //
199
+ // target.set_include_interiors(false);
200
+ //
201
+ // (see S2MinDistanceShapeIndexTarget for details).
202
+ class ShapeIndexTarget final : public S2MinDistanceShapeIndexTarget {
203
+ public:
204
+ explicit ShapeIndexTarget(const S2ShapeIndex* index);
205
+ int max_brute_force_index_size() const override;
206
+ };
207
+
208
+ // Convenience constructor that calls Init(). Options may be specified here
209
+ // or changed at any time using the mutable_options() accessor method.
210
+ //
211
+ // REQUIRES: "index" must persist for the lifetime of this object.
212
+ // REQUIRES: ReInit() must be called if "index" is modified.
213
+ explicit S2ClosestCellQuery(const S2CellIndex* index,
214
+ const Options& options = Options());
215
+
216
+ // Default constructor; requires Init() to be called.
217
+ S2ClosestCellQuery();
218
+ ~S2ClosestCellQuery();
219
+
220
+ // Initializes the query. Options may be specified here or changed at any
221
+ // time using the mutable_options() accessor method.
222
+ //
223
+ // REQUIRES: "index" must persist for the lifetime of this object.
224
+ // REQUIRES: ReInit() must be called if "index" is modified.
225
+ void Init(const S2CellIndex* index, const Options& options = Options());
226
+
227
+ // Reinitializes the query. This method must be called if the underlying
228
+ // S2CellIndex is modified (by calling Clear() and Build() again).
229
+ void ReInit();
230
+
231
+ // Returns a reference to the underlying S2CellIndex.
232
+ const S2CellIndex& index() const;
233
+
234
+ // Returns the query options. Options can be modified between queries.
235
+ const Options& options() const;
236
+ Options* mutable_options();
237
+
238
+ // Returns the closest cells to the given target that satisfy the current
239
+ // options. This method may be called multiple times.
240
+ std::vector<Result> FindClosestCells(Target* target);
241
+
242
+ // This version can be more efficient when this method is called many times,
243
+ // since it does not require allocating a new vector on each call.
244
+ void FindClosestCells(Target* target, std::vector<Result>* results);
245
+
246
+ //////////////////////// Convenience Methods ////////////////////////
247
+
248
+ // Returns the closest cell to the target. If no cell satisfies the search
249
+ // criteria, then the Result object will have distance == Infinity() and
250
+ // is_empty() == true.
251
+ Result FindClosestCell(Target* target);
252
+
253
+ // Returns the minimum distance to the target. If the index or target is
254
+ // empty, returns S1ChordAngle::Infinity().
255
+ //
256
+ // Use IsDistanceLess() if you only want to compare the distance against a
257
+ // threshold value, since it is often much faster.
258
+ S1ChordAngle GetDistance(Target* target);
259
+
260
+ // Returns true if the distance to "target" is less than "limit".
261
+ //
262
+ // This method is usually much faster than GetDistance(), since it is much
263
+ // less work to determine whether the minimum distance is above or below a
264
+ // threshold than it is to calculate the actual minimum distance.
265
+ bool IsDistanceLess(Target* target, S1ChordAngle limit);
266
+
267
+ // Like IsDistanceLess(), but also returns true if the distance to "target"
268
+ // is exactly equal to "limit".
269
+ bool IsDistanceLessOrEqual(Target* target, S1ChordAngle limit);
270
+
271
+ // Like IsDistanceLessOrEqual(), except that "limit" is increased by the
272
+ // maximum error in the distance calculation. This ensures that this
273
+ // function returns true whenever the true, exact distance is less than
274
+ // or equal to "limit".
275
+ bool IsConservativeDistanceLessOrEqual(Target* target, S1ChordAngle limit);
276
+
277
+ private:
278
+ Options options_;
279
+ Base base_;
280
+
281
+ S2ClosestCellQuery(const S2ClosestCellQuery&) = delete;
282
+ void operator=(const S2ClosestCellQuery&) = delete;
283
+ };
284
+
285
+
286
+ ////////////////// Implementation details follow ////////////////////
287
+
288
+
289
+ inline void S2ClosestCellQuery::Options::set_max_distance(
290
+ S1ChordAngle max_distance) {
291
+ Base::Options::set_max_distance(Distance(max_distance));
292
+ }
293
+
294
+ inline void S2ClosestCellQuery::Options::set_max_distance(
295
+ S1Angle max_distance) {
296
+ Base::Options::set_max_distance(Distance(max_distance));
297
+ }
298
+
299
+ inline void S2ClosestCellQuery::Options::set_inclusive_max_distance(
300
+ S1ChordAngle max_distance) {
301
+ set_max_distance(max_distance.Successor());
302
+ }
303
+
304
+ inline void S2ClosestCellQuery::Options::set_inclusive_max_distance(
305
+ S1Angle max_distance) {
306
+ set_inclusive_max_distance(S1ChordAngle(max_distance));
307
+ }
308
+
309
+ inline void S2ClosestCellQuery::Options::set_max_error(S1Angle max_error) {
310
+ Base::Options::set_max_error(S1ChordAngle(max_error));
311
+ }
312
+
313
+ inline S2ClosestCellQuery::PointTarget::PointTarget(const S2Point& point)
314
+ : S2MinDistancePointTarget(point) {
315
+ }
316
+
317
+ inline S2ClosestCellQuery::EdgeTarget::EdgeTarget(const S2Point& a,
318
+ const S2Point& b)
319
+ : S2MinDistanceEdgeTarget(a, b) {
320
+ }
321
+
322
+ inline S2ClosestCellQuery::CellTarget::CellTarget(const S2Cell& cell)
323
+ : S2MinDistanceCellTarget(cell) {
324
+ }
325
+
326
+ inline S2ClosestCellQuery::CellUnionTarget::CellUnionTarget(
327
+ S2CellUnion cell_union)
328
+ : S2MinDistanceCellUnionTarget(std::move(cell_union)) {
329
+ }
330
+
331
+ inline S2ClosestCellQuery::ShapeIndexTarget::ShapeIndexTarget(
332
+ const S2ShapeIndex* index)
333
+ : S2MinDistanceShapeIndexTarget(index) {
334
+ }
335
+
336
+ inline S2ClosestCellQuery::S2ClosestCellQuery(const S2CellIndex* index,
337
+ const Options& options) {
338
+ Init(index, options);
339
+ }
340
+
341
+ inline void S2ClosestCellQuery::Init(const S2CellIndex* index,
342
+ const Options& options) {
343
+ options_ = options;
344
+ base_.Init(index);
345
+ }
346
+
347
+ inline void S2ClosestCellQuery::ReInit() {
348
+ base_.ReInit();
349
+ }
350
+
351
+ inline const S2CellIndex& S2ClosestCellQuery::index() const {
352
+ return base_.index();
353
+ }
354
+
355
+ inline const S2ClosestCellQuery::Options& S2ClosestCellQuery::options() const {
356
+ return options_;
357
+ }
358
+
359
+ inline S2ClosestCellQuery::Options* S2ClosestCellQuery::mutable_options() {
360
+ return &options_;
361
+ }
362
+
363
+ inline std::vector<S2ClosestCellQuery::Result>
364
+ S2ClosestCellQuery::FindClosestCells(Target* target) {
365
+ return base_.FindClosestCells(target, options_);
366
+ }
367
+
368
+ inline void S2ClosestCellQuery::FindClosestCells(Target* target,
369
+ std::vector<Result>* results) {
370
+ base_.FindClosestCells(target, options_, results);
371
+ }
372
+
373
+ inline S2ClosestCellQuery::Result S2ClosestCellQuery::FindClosestCell(
374
+ Target* target) {
375
+ static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
376
+ Options tmp_options = options_;
377
+ tmp_options.set_max_results(1);
378
+ return base_.FindClosestCell(target, tmp_options);
379
+ }
380
+
381
+ inline S1ChordAngle S2ClosestCellQuery::GetDistance(Target* target) {
382
+ return FindClosestCell(target).distance();
383
+ }
384
+
385
+ #endif // S2_S2CLOSEST_CELL_QUERY_H_