@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,198 @@
1
+ // Copyright 2015 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+ //
18
+ // This implement Andrew's monotone chain algorithm, which is a variant of the
19
+ // Graham scan (see https://en.wikipedia.org/wiki/Graham_scan). The time
20
+ // complexity is O(n log n), and the space required is O(n). In fact only the
21
+ // call to "sort" takes O(n log n) time; the rest of the algorithm is linear.
22
+ //
23
+ // Demonstration of the algorithm and code:
24
+ // en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain
25
+
26
+ #include "s2/s2convex_hull_query.h"
27
+
28
+ #include "s2/third_party/absl/memory/memory.h"
29
+ #include "s2/s2pointutil.h"
30
+ #include "s2/s2predicates.h"
31
+
32
+ using absl::make_unique;
33
+ using std::unique_ptr;
34
+ using std::vector;
35
+
36
+ S2ConvexHullQuery::S2ConvexHullQuery()
37
+ : bound_(S2LatLngRect::Empty()), points_() {
38
+ }
39
+
40
+ void S2ConvexHullQuery::AddPoint(const S2Point& point) {
41
+ bound_.AddPoint(point);
42
+ points_.push_back(point);
43
+ }
44
+
45
+ void S2ConvexHullQuery::AddPolyline(const S2Polyline& polyline) {
46
+ bound_ = bound_.Union(polyline.GetRectBound());
47
+ for (int i = 0; i < polyline.num_vertices(); ++i) {
48
+ points_.push_back(polyline.vertex(i));
49
+ }
50
+ }
51
+
52
+ void S2ConvexHullQuery::AddLoop(const S2Loop& loop) {
53
+ bound_ = bound_.Union(loop.GetRectBound());
54
+ if (loop.is_empty_or_full()) {
55
+ // The empty and full loops consist of a single fake "vertex" that should
56
+ // not be added to our point collection.
57
+ return;
58
+ }
59
+ for (int i = 0; i < loop.num_vertices(); ++i) {
60
+ points_.push_back(loop.vertex(i));
61
+ }
62
+ }
63
+
64
+ void S2ConvexHullQuery::AddPolygon(const S2Polygon& polygon) {
65
+ for (int i = 0; i < polygon.num_loops(); ++i) {
66
+ const S2Loop& loop = *polygon.loop(i);
67
+ // Only loops at depth 0 can contribute to the convex hull.
68
+ if (loop.depth() == 0) {
69
+ AddLoop(loop);
70
+ }
71
+ }
72
+ }
73
+
74
+ S2Cap S2ConvexHullQuery::GetCapBound() {
75
+ // We keep track of a rectangular bound rather than a spherical cap because
76
+ // it is easy to compute a tight bound for a union of rectangles, whereas it
77
+ // is quite difficult to compute a tight bound around a union of caps.
78
+ // Also, polygons and polylines implement GetCapBound() in terms of
79
+ // GetRectBound() for this same reason, so it is much better to keep track
80
+ // of a rectangular bound as we go along and convert it at the end.
81
+ //
82
+ // TODO(ericv): We could compute an optimal bound by implementing Welzl's
83
+ // algorithm. However we would still need to have special handling of loops
84
+ // and polygons, since if a loop spans more than 180 degrees in any
85
+ // direction (i.e., if it contains two antipodal points), then it is not
86
+ // enough just to bound its vertices. In this case the only convex bounding
87
+ // cap is S2Cap::Full(), and the only convex bounding loop is the full loop.
88
+ return bound_.GetCapBound();
89
+ }
90
+
91
+ // A comparator for sorting points in CCW around a central point "center".
92
+ class OrderedCcwAround {
93
+ public:
94
+ explicit OrderedCcwAround(const S2Point& center) : center_(center) {}
95
+ bool operator()(const S2Point& x, const S2Point& y) const {
96
+ // If X and Y are equal, this will return false (as desired).
97
+ return s2pred::Sign(center_, x, y) > 0;
98
+ }
99
+ private:
100
+ S2Point center_;
101
+ };
102
+
103
+ unique_ptr<S2Loop> S2ConvexHullQuery::GetConvexHull() {
104
+ S2Cap cap = GetCapBound();
105
+ if (cap.height() >= 1) {
106
+ // The bounding cap is not convex. The current bounding cap
107
+ // implementation is not optimal, but nevertheless it is likely that the
108
+ // input geometry itself is not contained by any convex polygon. In any
109
+ // case, we need a convex bounding cap to proceed with the algorithm below
110
+ // (in order to construct a point "origin" that is definitely outside the
111
+ // convex hull).
112
+ return make_unique<S2Loop>(S2Loop::kFull());
113
+ }
114
+ // This code implements Andrew's monotone chain algorithm, which is a simple
115
+ // variant of the Graham scan. Rather than sorting by x-coordinate, instead
116
+ // we sort the points in CCW order around an origin O such that all points
117
+ // are guaranteed to be on one side of some geodesic through O. This
118
+ // ensures that as we scan through the points, each new point can only
119
+ // belong at the end of the chain (i.e., the chain is monotone in terms of
120
+ // the angle around O from the starting point).
121
+ S2Point origin = cap.center().Ortho();
122
+ std::sort(points_.begin(), points_.end(), OrderedCcwAround(origin));
123
+
124
+ // Remove duplicates. We need to do this before checking whether there are
125
+ // fewer than 3 points.
126
+ points_.erase(std::unique(points_.begin(), points_.end()), points_.end());
127
+
128
+ // Special cases for fewer than 3 points.
129
+ if (points_.size() < 3) {
130
+ if (points_.empty()) {
131
+ return make_unique<S2Loop>(S2Loop::kEmpty());
132
+ } else if (points_.size() == 1) {
133
+ return GetSinglePointLoop(points_[0]);
134
+ } else {
135
+ return GetSingleEdgeLoop(points_[0], points_[1]);
136
+ }
137
+ }
138
+
139
+ // Verify that all points lie within a 180 degree span around the origin.
140
+ S2_DCHECK_GE(s2pred::Sign(origin, points_.front(), points_.back()), 0);
141
+
142
+ // Generate the lower and upper halves of the convex hull. Each half
143
+ // consists of the maximal subset of vertices such that the edge chain makes
144
+ // only left (CCW) turns.
145
+ vector<S2Point> lower, upper;
146
+ GetMonotoneChain(&lower);
147
+ std::reverse(points_.begin(), points_.end());
148
+ GetMonotoneChain(&upper);
149
+
150
+ // Remove the duplicate vertices and combine the chains.
151
+ S2_DCHECK_EQ(lower.front(), upper.back());
152
+ S2_DCHECK_EQ(lower.back(), upper.front());
153
+ lower.pop_back();
154
+ upper.pop_back();
155
+ lower.insert(lower.end(), upper.begin(), upper.end());
156
+ return make_unique<S2Loop>(lower);
157
+ }
158
+
159
+ // Iterate through the given points, selecting the maximal subset of points
160
+ // such that the edge chain makes only left (CCW) turns.
161
+ void S2ConvexHullQuery::GetMonotoneChain(vector<S2Point>* output) {
162
+ S2_DCHECK(output->empty());
163
+ for (const S2Point& p : points_) {
164
+ // Remove any points that would cause the chain to make a clockwise turn.
165
+ while (output->size() >= 2 &&
166
+ s2pred::Sign(output->end()[-2], output->back(), p) <= 0) {
167
+ output->pop_back();
168
+ }
169
+ output->push_back(p);
170
+ }
171
+ }
172
+
173
+ unique_ptr<S2Loop> S2ConvexHullQuery::GetSinglePointLoop(const S2Point& p) {
174
+ // Construct a 3-vertex polygon consisting of "p" and two nearby vertices.
175
+ // Note that Contains(p) may be false for the resulting loop (see comments
176
+ // in header file).
177
+ static const double kOffset = 1e-15;
178
+ S2Point d0 = S2::Ortho(p);
179
+ S2Point d1 = p.CrossProd(d0);
180
+ vector<S2Point> vertices;
181
+ vertices.push_back(p);
182
+ vertices.push_back((p + kOffset * d0).Normalize());
183
+ vertices.push_back((p + kOffset * d1).Normalize());
184
+ return make_unique<S2Loop>(vertices);
185
+ }
186
+
187
+ unique_ptr<S2Loop> S2ConvexHullQuery::GetSingleEdgeLoop(const S2Point& a,
188
+ const S2Point& b) {
189
+ // Construct a loop consisting of the two vertices and their midpoint.
190
+ vector<S2Point> vertices;
191
+ vertices.push_back(a);
192
+ vertices.push_back(b);
193
+ vertices.push_back((a + b).Normalize());
194
+ auto loop = make_unique<S2Loop>(vertices);
195
+ // The resulting loop may be clockwise, so invert it if necessary.
196
+ loop->Normalize();
197
+ return loop;
198
+ }
@@ -0,0 +1,110 @@
1
+ // Copyright 2015 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_S2CONVEX_HULL_QUERY_H_
19
+ #define S2_S2CONVEX_HULL_QUERY_H_
20
+
21
+ #include <memory>
22
+ #include <vector>
23
+
24
+ #include "s2/_fp_contract_off.h"
25
+ #include "s2/s2cap.h"
26
+ #include "s2/s2latlng_rect.h"
27
+ #include "s2/s2loop.h"
28
+ #include "s2/s2polygon.h"
29
+ #include "s2/s2polyline.h"
30
+
31
+ // S2ConvexHullQuery builds the convex hull of any collection of points,
32
+ // polylines, loops, and polygons. It returns a single convex loop.
33
+ //
34
+ // The convex hull is defined as the smallest convex region on the sphere that
35
+ // contains all of your input geometry. Recall that a region is "convex" if
36
+ // for every pair of points inside the region, the straight edge between them
37
+ // is also inside the region. In our case, a "straight" edge is a geodesic,
38
+ // i.e. the shortest path on the sphere between two points.
39
+ //
40
+ // Containment of input geometry is defined as follows:
41
+ //
42
+ // - Each input loop and polygon is contained by the convex hull exactly
43
+ // (i.e., according to S2Polygon::Contains(S2Polygon)).
44
+ //
45
+ // - Each input point is either contained by the convex hull or is a vertex
46
+ // of the convex hull. (Recall that S2Loops do not necessarily contain their
47
+ // vertices.)
48
+ //
49
+ // - For each input polyline, the convex hull contains all of its vertices
50
+ // according to the rule for points above. (The definition of convexity
51
+ // then ensures that the convex hull also contains the polyline edges.)
52
+ //
53
+ // To use this class, call the Add*() methods to add your input geometry, and
54
+ // then call GetConvexHull(). Note that GetConvexHull() does *not* reset the
55
+ // state; you can continue adding geometry if desired and compute the convex
56
+ // hull again. If you want to start from scratch, simply declare a new
57
+ // S2ConvexHullQuery object (they are cheap to create).
58
+ //
59
+ // This class is not thread-safe. There are no "const" methods.
60
+ class S2ConvexHullQuery {
61
+ public:
62
+ S2ConvexHullQuery();
63
+
64
+ // Add a point to the input geometry.
65
+ void AddPoint(const S2Point& point);
66
+
67
+ // Add a polyline to the input geometry.
68
+ void AddPolyline(const S2Polyline& polyline);
69
+
70
+ // Add a loop to the input geometry.
71
+ void AddLoop(const S2Loop& loop);
72
+
73
+ // Add a polygon to the input geometry.
74
+ void AddPolygon(const S2Polygon& polygon);
75
+
76
+ // Compute a bounding cap for the input geometry provided.
77
+ //
78
+ // Note that this method does not clear the geometry; you can continue
79
+ // adding to it and call this method again if desired.
80
+ S2Cap GetCapBound();
81
+
82
+ // Compute the convex hull of the input geometry provided.
83
+ //
84
+ // If there is no geometry, this method returns an empty loop containing no
85
+ // points (see S2Loop::is_empty()).
86
+ //
87
+ // If the geometry spans more than half of the sphere, this method returns a
88
+ // full loop containing the entire sphere (see S2Loop::is_full()).
89
+ //
90
+ // If the geometry contains 1 or 2 points, or a single edge, this method
91
+ // returns a very small loop consisting of three vertices (which are a
92
+ // superset of the input vertices).
93
+ //
94
+ // Note that this method does not clear the geometry; you can continue
95
+ // adding to it and call this method again if desired.
96
+ std::unique_ptr<S2Loop> GetConvexHull();
97
+
98
+ private:
99
+ void GetMonotoneChain(std::vector<S2Point>* output);
100
+ std::unique_ptr<S2Loop> GetSinglePointLoop(const S2Point& p);
101
+ std::unique_ptr<S2Loop> GetSingleEdgeLoop(const S2Point& a, const S2Point& b);
102
+
103
+ S2LatLngRect bound_;
104
+ std::vector<S2Point> points_;
105
+
106
+ S2ConvexHullQuery(const S2ConvexHullQuery&) = delete;
107
+ void operator=(const S2ConvexHullQuery&) = delete;
108
+ };
109
+
110
+ #endif // S2_S2CONVEX_HULL_QUERY_H_
@@ -0,0 +1,208 @@
1
+ // Copyright 2015 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/s2convex_hull_query.h"
19
+
20
+ #include <cmath>
21
+ #include <memory>
22
+
23
+ #include <gtest/gtest.h>
24
+ #include "s2/s2testing.h"
25
+ #include "s2/s2text_format.h"
26
+
27
+ using std::fabs;
28
+ using std::unique_ptr;
29
+ using std::vector;
30
+
31
+ namespace {
32
+
33
+ TEST(S2ConvexHullQueryTest, NoPoints) {
34
+ S2ConvexHullQuery query;
35
+ unique_ptr<S2Loop> result(query.GetConvexHull());
36
+ EXPECT_TRUE(result->is_empty());
37
+ }
38
+
39
+ static bool LoopHasVertex(const S2Loop& loop, const S2Point& p) {
40
+ for (int i = 0; i < loop.num_vertices(); ++i) {
41
+ if (loop.vertex(i) == p) return true;
42
+ }
43
+ return false;
44
+ }
45
+
46
+ TEST(S2ConvexHullQueryTest, OnePoint) {
47
+ S2ConvexHullQuery query;
48
+ S2Point p(0, 0, 1);
49
+ query.AddPoint(p);
50
+ unique_ptr<S2Loop> result(query.GetConvexHull());
51
+ EXPECT_EQ(3, result->num_vertices());
52
+ EXPECT_TRUE(result->IsNormalized());
53
+ EXPECT_TRUE(LoopHasVertex(*result, p));
54
+ // Add some duplicate points and check that the result is the same.
55
+ query.AddPoint(p);
56
+ query.AddPoint(p);
57
+ unique_ptr<S2Loop> result2(query.GetConvexHull());
58
+ EXPECT_TRUE(result2->Equals(result.get()));
59
+ }
60
+
61
+ TEST(S2ConvexHullQueryTest, TwoPoints) {
62
+ S2ConvexHullQuery query;
63
+ S2Point p(0, 0, 1);
64
+ S2Point q(0, 1, 0);
65
+ query.AddPoint(p);
66
+ query.AddPoint(q);
67
+ unique_ptr<S2Loop> result(query.GetConvexHull());
68
+ EXPECT_EQ(3, result->num_vertices());
69
+ EXPECT_TRUE(result->IsNormalized());
70
+ EXPECT_TRUE(LoopHasVertex(*result, p));
71
+ EXPECT_TRUE(LoopHasVertex(*result, q));
72
+ // Add some duplicate points and check that the result is the same.
73
+ query.AddPoint(q);
74
+ query.AddPoint(p);
75
+ query.AddPoint(p);
76
+ unique_ptr<S2Loop> result2(query.GetConvexHull());
77
+ EXPECT_TRUE(result2->Equals(result.get()));
78
+ }
79
+
80
+ TEST(S2ConvexHullQueryTest, EmptyLoop) {
81
+ S2ConvexHullQuery query;
82
+ S2Loop empty(S2Loop::kEmpty());
83
+ query.AddLoop(empty);
84
+ unique_ptr<S2Loop> result(query.GetConvexHull());
85
+ EXPECT_TRUE(result->is_empty());
86
+ }
87
+
88
+ TEST(S2ConvexHullQueryTest, FullLoop) {
89
+ S2ConvexHullQuery query;
90
+ S2Loop full(S2Loop::kFull());
91
+ query.AddLoop(full);
92
+ unique_ptr<S2Loop> result(query.GetConvexHull());
93
+ EXPECT_TRUE(result->is_full());
94
+ }
95
+
96
+ TEST(S2ConvexHullQueryTest, EmptyPolygon) {
97
+ S2ConvexHullQuery query;
98
+ vector<unique_ptr<S2Loop>> loops;
99
+ S2Polygon empty(std::move(loops));
100
+ query.AddPolygon(empty);
101
+ unique_ptr<S2Loop> result(query.GetConvexHull());
102
+ EXPECT_TRUE(result->is_empty());
103
+ }
104
+
105
+ TEST(S2ConvexHullQueryTest, NonConvexPoints) {
106
+ // Generate a point set such that the only convex region containing them is
107
+ // the entire sphere. In other words, you can generate any point on the
108
+ // sphere by repeatedly linearly interpolating between the points. (The
109
+ // four points of a tetrahedron would also work, but this is easier.)
110
+ S2ConvexHullQuery query;
111
+ for (int face = 0; face < 6; ++face) {
112
+ query.AddPoint(S2CellId::FromFace(face).ToPoint());
113
+ }
114
+ unique_ptr<S2Loop> result(query.GetConvexHull());
115
+ EXPECT_TRUE(result->is_full());
116
+ }
117
+
118
+ TEST(S2ConvexHullQueryTest, SimplePolyline) {
119
+ // A polyline is handling identically to a point set, so there is no need
120
+ // for special testing other than code coverage.
121
+ unique_ptr<S2Polyline> polyline(s2textformat::MakePolyline(
122
+ "0:1, 0:9, 1:6, 2:6, 3:10, 4:10, 5:5, 4:0, 3:0, 2:5, 1:5"));
123
+ S2ConvexHullQuery query;
124
+ query.AddPolyline(*polyline);
125
+ unique_ptr<S2Loop> result(query.GetConvexHull());
126
+ unique_ptr<S2Loop> expected_result(
127
+ s2textformat::MakeLoop("0:1, 0:9, 3:10, 4:10, 5:5, 4:0, 3:0"));
128
+ EXPECT_TRUE(result->BoundaryEquals(expected_result.get()));
129
+ }
130
+
131
+ void TestNorthPoleLoop(S1Angle radius, int num_vertices) {
132
+ // If the radius is very close to 90, then it's hard to predict whether the
133
+ // result will be the full loop or not.
134
+ S2_DCHECK_GE(fabs(radius.radians() - M_PI_2), 1e-15);
135
+
136
+ S2ConvexHullQuery query;
137
+ unique_ptr<S2Loop> loop(
138
+ S2Loop::MakeRegularLoop(S2Point(0, 0, 1), radius, num_vertices));
139
+ query.AddLoop(*loop);
140
+ unique_ptr<S2Loop> result(query.GetConvexHull());
141
+ if (radius > S1Angle::Radians(M_PI_2)) {
142
+ EXPECT_TRUE(result->is_full());
143
+ } else {
144
+ EXPECT_TRUE(result->BoundaryEquals(loop.get()));
145
+ }
146
+ }
147
+
148
+
149
+ TEST(S2ConvexHullQueryTest, LoopsAroundNorthPole) {
150
+ // Test loops of various sizes around the north pole.
151
+ TestNorthPoleLoop(S1Angle::Degrees(1), 3);
152
+ TestNorthPoleLoop(S1Angle::Degrees(89), 3);
153
+
154
+ // The following two loops should yield the full loop.
155
+ TestNorthPoleLoop(S1Angle::Degrees(91), 3);
156
+ TestNorthPoleLoop(S1Angle::Degrees(179), 3);
157
+
158
+ TestNorthPoleLoop(S1Angle::Degrees(10), 100);
159
+ TestNorthPoleLoop(S1Angle::Degrees(89), 1000);
160
+ }
161
+
162
+ TEST(S2ConvexHullQueryTest, PointsInsideHull) {
163
+ // Repeatedly build the convex hull of a set of points, then add more points
164
+ // inside that loop and build the convex hull again. The result should
165
+ // always be the same.
166
+ const int kIters = 1000;
167
+ for (int iter = 0; iter < kIters; ++iter) {
168
+ S2Testing::rnd.Reset(iter + 1); // Easier to reproduce a specific case.
169
+
170
+ // Choose points from within a cap of random size, up to but not including
171
+ // an entire hemisphere.
172
+ S2Cap cap = S2Testing::GetRandomCap(1e-15, 1.999 * M_PI);
173
+ S2ConvexHullQuery query;
174
+ int num_points1 = S2Testing::rnd.Uniform(100) + 3;
175
+ for (int i = 0; i < num_points1; ++i) {
176
+ query.AddPoint(S2Testing::SamplePoint(cap));
177
+ }
178
+ unique_ptr<S2Loop> hull(query.GetConvexHull());
179
+
180
+ // When the convex hull is nearly a hemisphere, the algorithm sometimes
181
+ // returns a full cap instead. This is because it first computes a
182
+ // bounding rectangle for all the input points/edges and then converts it
183
+ // to a bounding cap, which sometimes yields a non-convex cap (radius
184
+ // larger than 90 degrees). This should not be a problem in practice
185
+ // (since most convex hulls are not hemispheres), but in order make this
186
+ // test pass reliably it means that we need to reject convex hulls whose
187
+ // bounding cap (when computed from a bounding rectangle) is not convex.
188
+ //
189
+ // TODO(ericv): This test can still fail (about 1 iteration in 500,000)
190
+ // because the S2LatLngRect::GetCapBound implementation does not guarantee
191
+ // that A.Contains(B) implies A.GetCapBound().Contains(B.GetCapBound()).
192
+ if (hull->GetCapBound().height() >= 1) continue;
193
+
194
+ // Otherwise, add more points inside the convex hull.
195
+ const int num_points2 = 1000;
196
+ for (int i = 0; i < num_points2; ++i) {
197
+ S2Point p = S2Testing::SamplePoint(cap);
198
+ if (hull->Contains(p)) {
199
+ query.AddPoint(p);
200
+ }
201
+ }
202
+ // Finally, build a new convex hull and check that it hasn't changed.
203
+ unique_ptr<S2Loop> hull2(query.GetConvexHull());
204
+ EXPECT_TRUE(hull2->BoundaryEquals(hull.get())) << "Iteration: " << iter;
205
+ }
206
+ }
207
+
208
+ } // namespace
@@ -0,0 +1,146 @@
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/s2coords.h"
19
+
20
+ #include "s2/util/bits/bits.h"
21
+
22
+ namespace S2 {
23
+
24
+ namespace internal {
25
+
26
+ // Define the "extern" constants in s2coords_internal.h.
27
+
28
+ static_assert(kSwapMask == 0x01 && kInvertMask == 0x02, "masks changed");
29
+
30
+ // kIJtoPos[orientation][ij] -> pos
31
+ const int kIJtoPos[4][4] = {
32
+ // (0,0) (0,1) (1,0) (1,1)
33
+ { 0, 1, 3, 2 }, // canonical order
34
+ { 0, 3, 1, 2 }, // axes swapped
35
+ { 2, 3, 1, 0 }, // bits inverted
36
+ { 2, 1, 3, 0 }, // swapped & inverted
37
+ };
38
+
39
+ // kPosToIJ[orientation][pos] -> ij
40
+ const int kPosToIJ[4][4] = {
41
+ // 0 1 2 3
42
+ { 0, 1, 3, 2 }, // canonical order: (0,0), (0,1), (1,1), (1,0)
43
+ { 0, 2, 3, 1 }, // axes swapped: (0,0), (1,0), (1,1), (0,1)
44
+ { 3, 2, 0, 1 }, // bits inverted: (1,1), (1,0), (0,0), (0,1)
45
+ { 3, 1, 0, 2 }, // swapped & inverted: (1,1), (0,1), (0,0), (1,0)
46
+ };
47
+
48
+ // kPosToOrientation[pos] -> orientation_modifier
49
+ const int kPosToOrientation[4] = {
50
+ kSwapMask,
51
+ 0,
52
+ 0,
53
+ kInvertMask + kSwapMask,
54
+ };
55
+
56
+ const int kFaceUVWFaces[6][3][2] = {
57
+ { { 4, 1 }, { 5, 2 }, { 3, 0 } },
58
+ { { 0, 3 }, { 5, 2 }, { 4, 1 } },
59
+ { { 0, 3 }, { 1, 4 }, { 5, 2 } },
60
+ { { 2, 5 }, { 1, 4 }, { 0, 3 } },
61
+ { { 2, 5 }, { 3, 0 }, { 1, 4 } },
62
+ { { 4, 1 }, { 3, 0 }, { 2, 5 } }
63
+ };
64
+
65
+ const double kFaceUVWAxes[6][3][3] = {
66
+ {
67
+ { 0, 1, 0 },
68
+ { 0, 0, 1 },
69
+ { 1, 0, 0 }
70
+ },
71
+ {
72
+ {-1, 0, 0 },
73
+ { 0, 0, 1 },
74
+ { 0, 1, 0 }
75
+ },
76
+ {
77
+ {-1, 0, 0 },
78
+ { 0, -1, 0 },
79
+ { 0, 0, 1 }
80
+ },
81
+ {
82
+ { 0, 0, -1 },
83
+ { 0, -1, 0 },
84
+ {-1, 0, 0 }
85
+ },
86
+ {
87
+ { 0, 0, -1 },
88
+ { 1, 0, 0 },
89
+ { 0, -1, 0 }
90
+ },
91
+ {
92
+ { 0, 1, 0 },
93
+ { 1, 0, 0 },
94
+ { 0, 0, -1 }
95
+ }
96
+ };
97
+
98
+ } // namespace internal
99
+
100
+
101
+
102
+ S2Point FaceXYZtoUVW(int face, const S2Point& p) {
103
+ // The result coordinates are simply the dot products of P with the (u,v,w)
104
+ // axes for the given face (see kFaceUVWAxes).
105
+ switch (face) {
106
+ case 0: return S2Point( p.y(), p.z(), p.x());
107
+ case 1: return S2Point(-p.x(), p.z(), p.y());
108
+ case 2: return S2Point(-p.x(), -p.y(), p.z());
109
+ case 3: return S2Point(-p.z(), -p.y(), -p.x());
110
+ case 4: return S2Point(-p.z(), p.x(), -p.y());
111
+ default: return S2Point( p.y(), p.x(), -p.z());
112
+ }
113
+ }
114
+
115
+ int XYZtoFaceSiTi(const S2Point& p, int* face, unsigned int* si,
116
+ unsigned int* ti) {
117
+ double u, v;
118
+ *face = XYZtoFaceUV(p, &u, &v);
119
+ *si = STtoSiTi(UVtoST(u));
120
+ *ti = STtoSiTi(UVtoST(v));
121
+ // If the levels corresponding to si,ti are not equal, then p is not a cell
122
+ // center. The si,ti values 0 and kMaxSiTi need to be handled specially
123
+ // because they do not correspond to cell centers at any valid level; they
124
+ // are mapped to level -1 by the code below.
125
+ int level = kMaxCellLevel - Bits::FindLSBSetNonZero(*si | kMaxSiTi);
126
+ if (level < 0 ||
127
+ level != kMaxCellLevel - Bits::FindLSBSetNonZero(*ti | kMaxSiTi)) {
128
+ return -1;
129
+ }
130
+ S2_DCHECK_LE(level, kMaxCellLevel);
131
+ // In infinite precision, this test could be changed to ST == SiTi. However,
132
+ // due to rounding errors, UVtoST(XYZtoFaceUV(FaceUVtoXYZ(STtoUV(...)))) is
133
+ // not idempotent. On the other hand, center_raw is computed exactly the same
134
+ // way p was originally computed (if it is indeed the center of an S2Cell):
135
+ // the comparison can be exact.
136
+ S2Point center = FaceSiTitoXYZ(*face, *si, *ti).Normalize();
137
+ return p == center ? level : -1;
138
+ }
139
+
140
+ S2Point FaceSiTitoXYZ(int face, unsigned int si, unsigned int ti) {
141
+ double u = STtoUV(SiTitoST(si));
142
+ double v = STtoUV(SiTitoST(ti));
143
+ return FaceUVtoXYZ(face, u, v);
144
+ }
145
+
146
+ } // namespace S2