@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,138 @@
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/s2shape_measures.h"
19
+
20
+ #include <cmath>
21
+ #include <vector>
22
+ #include "s2/s2loop_measures.h"
23
+ #include "s2/s2polyline_measures.h"
24
+
25
+ using std::fabs;
26
+ using std::vector;
27
+
28
+ namespace S2 {
29
+
30
+ S1Angle GetLength(const S2Shape& shape) {
31
+ if (shape.dimension() != 1) return S1Angle::Zero();
32
+ S1Angle length;
33
+ vector<S2Point> vertices;
34
+ int num_chains = shape.num_chains();
35
+ for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
36
+ GetChainVertices(shape, chain_id, &vertices);
37
+ length += S2::GetLength(vertices);
38
+ }
39
+ return length;
40
+ }
41
+
42
+ S1Angle GetPerimeter(const S2Shape& shape) {
43
+ if (shape.dimension() != 2) return S1Angle::Zero();
44
+ S1Angle perimeter;
45
+ vector<S2Point> vertices;
46
+ int num_chains = shape.num_chains();
47
+ for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
48
+ GetChainVertices(shape, chain_id, &vertices);
49
+ perimeter += S2::GetPerimeter(S2PointLoopSpan(vertices));
50
+ }
51
+ return perimeter;
52
+ }
53
+
54
+ double GetArea(const S2Shape& shape) {
55
+ if (shape.dimension() != 2) return 0.0;
56
+
57
+ // Since S2Shape uses the convention that the interior of the shape is to
58
+ // the left of all edges, in theory we could compute the area of the polygon
59
+ // by simply adding up all the loop areas modulo 4*Pi. The problem with
60
+ // this approach is that polygons holes typically have areas near 4*Pi,
61
+ // which can create large cancellation errors when computing the area of
62
+ // small polygons with holes. For example, a shell with an area of 4 square
63
+ // meters (1e-13 steradians) surrounding a hole with an area of 3 square
64
+ // meters (7.5e-14 sterians) would lose almost all of its accuracy if the
65
+ // area of the hole was computed as 12.566370614359098.
66
+ //
67
+ // So instead we use S2::GetSignedArea() to ensure that all loops have areas
68
+ // in the range [-2*Pi, 2*Pi].
69
+ double area = 0;
70
+ vector<S2Point> vertices;
71
+ int num_chains = shape.num_chains();
72
+ for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
73
+ GetChainVertices(shape, chain_id, &vertices);
74
+ area += S2::GetSignedArea(S2PointLoopSpan(vertices));
75
+ }
76
+ // Note that S2::GetSignedArea() guarantees that the full loop (containing
77
+ // all points on the sphere) has a very small negative area.
78
+ S2_DCHECK_LE(fabs(area), 4 * M_PI);
79
+ if (area < 0.0) area += 4 * M_PI;
80
+ return area;
81
+ }
82
+
83
+ double GetApproxArea(const S2Shape& shape) {
84
+ if (shape.dimension() != 2) return 0.0;
85
+
86
+ double area = 0;
87
+ vector<S2Point> vertices;
88
+ int num_chains = shape.num_chains();
89
+ for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
90
+ GetChainVertices(shape, chain_id, &vertices);
91
+ area += S2::GetApproxArea(S2PointLoopSpan(vertices));
92
+ }
93
+ // Special case to ensure that full polygons are handled correctly.
94
+ if (area <= 4 * M_PI) return area;
95
+ return fmod(area, 4 * M_PI);
96
+ }
97
+
98
+ S2Point GetCentroid(const S2Shape& shape) {
99
+ S2Point centroid;
100
+ vector<S2Point> vertices;
101
+ int dimension = shape.dimension();
102
+ int num_chains = shape.num_chains();
103
+ for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
104
+ switch (dimension) {
105
+ case 0:
106
+ centroid += shape.edge(chain_id).v0;
107
+ break;
108
+ case 1:
109
+ GetChainVertices(shape, chain_id, &vertices);
110
+ centroid += S2::GetCentroid(S2PointSpan(vertices));
111
+ break;
112
+ default:
113
+ GetChainVertices(shape, chain_id, &vertices);
114
+ centroid += S2::GetCentroid(S2PointLoopSpan(vertices));
115
+ break;
116
+ }
117
+ }
118
+ return centroid;
119
+ }
120
+
121
+ void GetChainVertices(const S2Shape& shape, int chain_id,
122
+ std::vector<S2Point>* vertices) {
123
+ S2Shape::Chain chain = shape.chain(chain_id);
124
+ int num_vertices = chain.length + (shape.dimension() == 1);
125
+ vertices->clear();
126
+ vertices->reserve(num_vertices);
127
+ int e = 0;
128
+ if (num_vertices & 1) {
129
+ vertices->push_back(shape.chain_edge(chain_id, e++).v0);
130
+ }
131
+ for (; e < num_vertices; e += 2) {
132
+ auto edge = shape.chain_edge(chain_id, e);
133
+ vertices->push_back(edge.v0);
134
+ vertices->push_back(edge.v1);
135
+ }
136
+ }
137
+
138
+ } // namespace S2
@@ -0,0 +1,95 @@
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
+ // Defines various angle and area measures for S2Shape objects. Unlike the
19
+ // built-in S2Polygon and S2Polyline methods, these methods allow the
20
+ // underlying data to be represented arbitrarily.
21
+
22
+ #ifndef S2_S2SHAPE_MEASURES_H_
23
+ #define S2_S2SHAPE_MEASURES_H_
24
+
25
+ #include <vector>
26
+
27
+ #include "s2/s1angle.h"
28
+ #include "s2/s2point.h"
29
+ #include "s2/s2shape.h"
30
+
31
+ namespace S2 {
32
+
33
+ // For shapes of dimension 1, returns the sum of all polyline lengths on the
34
+ // unit sphere. Otherwise returns zero. (See GetPerimeter for shapes of
35
+ // dimension 2.)
36
+ //
37
+ // All edges are modeled as spherical geodesics. The result can be converted
38
+ // to a distance on the Earth's surface (with a worst-case error of 0.562%
39
+ // near the equator) using the functions in s2earth.h.
40
+ S1Angle GetLength(const S2Shape& shape);
41
+
42
+ // For shapes of dimension 2, returns the sum of all loop perimeters on the
43
+ // unit sphere. Otherwise returns zero. (See GetLength for shapes of
44
+ // dimension 1.)
45
+ //
46
+ // All edges are modeled as spherical geodesics. The result can be converted
47
+ // to a distance on the Earth's surface (with a worst-case error of 0.562%
48
+ // near the equator) using the functions in s2earth.h.
49
+ S1Angle GetPerimeter(const S2Shape& shape);
50
+
51
+ // For shapes of dimension 2, returns the area of the shape on the unit
52
+ // sphere. The result is between 0 and 4*Pi steradians. Otherwise returns
53
+ // zero. This method has good relative accuracy for both very large and very
54
+ // small regions.
55
+ //
56
+ // All edges are modeled as spherical geodesics. The result can be converted
57
+ // to an area on the Earth's surface (with a worst-case error of 0.900% near
58
+ // the poles) using the functions in s2earth.h.
59
+ double GetArea(const S2Shape& shape);
60
+
61
+ // Like GetArea(), except that this method is faster and has more error. The
62
+ // additional error is at most 2.22e-15 steradians per vertex, which works out
63
+ // to about 0.09 square meters per vertex on the Earth's surface. For
64
+ // example, a loop with 100 vertices has a maximum error of about 9 square
65
+ // meters. (The actual error is typically much smaller than this.)
66
+ double GetApproxArea(const S2Shape& shape);
67
+
68
+ // Returns the centroid of the shape multiplied by the measure of the shape,
69
+ // which is defined as follows:
70
+ //
71
+ // - For dimension 0 shapes, the measure is shape->num_edges().
72
+ // - For dimension 1 shapes, the measure is GetLength(shape).
73
+ // - For dimension 2 shapes, the measure is GetArea(shape).
74
+ //
75
+ // Note that the result is not unit length, so you may need to call
76
+ // Normalize() before passing it to other S2 functions.
77
+ //
78
+ // The result is scaled by the measure defined above for two reasons: (1) it
79
+ // is cheaper to compute this way, and (2) this makes it easier to compute the
80
+ // centroid of a collection of shapes. (This requires simply summing the
81
+ // centroids of all shapes in the collection whose dimension is maximal.)
82
+ S2Point GetCentroid(const S2Shape& shape);
83
+
84
+ // Overwrites "vertices" with the vertices of the given edge chain of "shape".
85
+ // If dimension == 1, the chain will have (chain.length + 1) vertices, and
86
+ // otherwise it will have (chain.length) vertices.
87
+ //
88
+ // This is a low-level helper method used in the implementations of some of
89
+ // the methods above.
90
+ void GetChainVertices(const S2Shape& shape, int chain_id,
91
+ std::vector<S2Point>* vertices);
92
+
93
+ } // namespace S2
94
+
95
+ #endif // S2_S2SHAPE_MEASURES_H_
@@ -0,0 +1,139 @@
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
+ // Note that the "real" testing of these methods is in s2loop_measures_test
19
+ // and s2polyline_measures_test. This file only checks the handling of shapes
20
+ // of different dimensions and shapes with multiple edge chains.
21
+
22
+ #include "s2/s2shape_measures.h"
23
+
24
+ #include <gtest/gtest.h>
25
+ #include "s2/mutable_s2shape_index.h"
26
+ #include "s2/s2edge_vector_shape.h"
27
+ #include "s2/s2lax_polygon_shape.h"
28
+ #include "s2/s2lax_polyline_shape.h"
29
+ #include "s2/s2pointutil.h"
30
+ #include "s2/s2polygon.h"
31
+ #include "s2/s2text_format.h"
32
+
33
+ using s2textformat::MakeIndexOrDie;
34
+ using s2textformat::MakeLaxPolygonOrDie;
35
+ using s2textformat::MakeLaxPolylineOrDie;
36
+ using s2textformat::MakePolygonOrDie;
37
+ using s2textformat::ParsePointsOrDie;
38
+
39
+ namespace {
40
+
41
+ TEST(GetLength, WrongDimension) {
42
+ EXPECT_EQ(S1Angle::Zero(),
43
+ S2::GetLength(*MakeIndexOrDie("0:0 # #")->shape(0)));
44
+ EXPECT_EQ(S1Angle::Zero(),
45
+ S2::GetLength(*MakeLaxPolygonOrDie("0:0, 0:1, 1:0")));
46
+ }
47
+
48
+ TEST(GetLength, NoPolylines) {
49
+ EXPECT_EQ(S1Angle::Zero(), S2::GetLength(*MakeLaxPolylineOrDie("")));
50
+ }
51
+
52
+ TEST(GetLength, ThreePolylinesInOneShape) {
53
+ // S2EdgeVectorShape is the only standard S2Shape that can have more than
54
+ // one edge chain of dimension 1.
55
+ auto p = ParsePointsOrDie("0:0, 1:0, 2:0, 3:0");
56
+ S2EdgeVectorShape shape({{p[0], p[1]}, {p[0], p[2]}, {p[0], p[3]}});
57
+ EXPECT_EQ(S1Angle::Degrees(6), S2::GetLength(shape));
58
+ }
59
+
60
+ TEST(GetPerimeter, WrongDimension) {
61
+ EXPECT_EQ(S1Angle::Zero(),
62
+ S2::GetPerimeter(*MakeIndexOrDie("0:0 # #")->shape(0)));
63
+ EXPECT_EQ(S1Angle::Zero(),
64
+ S2::GetPerimeter(*MakeLaxPolylineOrDie("0:0, 0:1, 1:0")));
65
+ }
66
+
67
+ TEST(GetPerimeter, EmptyPolygon) {
68
+ EXPECT_EQ(S1Angle::Zero(), S2::GetPerimeter(*MakeLaxPolygonOrDie("empty")));
69
+ }
70
+
71
+ TEST(GetPerimeter, FullPolygon) {
72
+ EXPECT_EQ(S1Angle::Zero(), S2::GetPerimeter(*MakeLaxPolygonOrDie("full")));
73
+ }
74
+
75
+ TEST(GetPerimeter, TwoLoopPolygon) {
76
+ // To ensure that all edges are 1 degree long, we use degenerate loops.
77
+ EXPECT_EQ(S1Angle::Degrees(6),
78
+ S2::GetPerimeter(*MakeLaxPolygonOrDie("0:0, 1:0; 0:1, 0:2, 0:3")));
79
+ }
80
+
81
+ TEST(GetArea, WrongDimension) {
82
+ EXPECT_EQ(0.0, S2::GetArea(*MakeIndexOrDie("0:0 # #")->shape(0)));
83
+ EXPECT_EQ(0.0, S2::GetArea(*MakeLaxPolylineOrDie("0:0, 0:1, 1:0")));
84
+ }
85
+
86
+ TEST(GetArea, EmptyPolygon) {
87
+ EXPECT_EQ(0.0, S2::GetArea(*MakeLaxPolygonOrDie("empty")));
88
+ }
89
+
90
+ TEST(GetArea, FullPolygon) {
91
+ EXPECT_EQ(4 * M_PI, S2::GetArea(*MakeLaxPolygonOrDie("full")));
92
+ EXPECT_EQ(4 * M_PI,
93
+ S2::GetArea(S2Polygon::OwningShape(MakePolygonOrDie("full"))));
94
+ }
95
+
96
+ TEST(GetArea, TwoTinyShells) {
97
+ // Two small squares with sides about 10 um (micrometers) long.
98
+ double side = S1Angle::Degrees(1e-10).radians();
99
+ EXPECT_EQ(2 * side * side, S2::GetArea(*MakeLaxPolygonOrDie(
100
+ "0:0, 0:1e-10, 1e-10:1e-10, 1e-10:0; "
101
+ "0:0, 0:-1e-10, -1e-10:-1e-10, -1e-10:0")));
102
+ }
103
+
104
+ TEST(GetArea, TinyShellAndHole) {
105
+ // A square about 20 um on each side with a hole 10 um on each side.
106
+ double side = S1Angle::Degrees(1e-10).radians();
107
+ EXPECT_EQ(3 * side * side, S2::GetArea(*MakeLaxPolygonOrDie(
108
+ "0:0, 0:2e-10, 2e-10:2e-10, 2e-10:0; "
109
+ "0.5e-10:0.5e-10, 1.5e-10:0.5e-10, 1.5e-10:1.5e-10, 0.5e-10:1.5e-10")));
110
+ }
111
+
112
+ TEST(GetApproxArea, LargeShellAndHolePolygon) {
113
+ // Make sure that GetApproxArea works well for large polygons.
114
+ EXPECT_NEAR(S2::GetApproxArea(*MakeLaxPolygonOrDie(
115
+ "0:0, 0:90, 90:0; 0:22.5, 90:0, 0:67.5")),
116
+ M_PI_4, 1e-12);
117
+ }
118
+
119
+ TEST(GetCentroid, Points) {
120
+ // GetCentroid() returns the centroid multiplied by the number of points.
121
+ EXPECT_EQ(S2Point(1, 1, 0),
122
+ S2::GetCentroid(*MakeIndexOrDie("0:0 | 0:90 # #")->shape(0)));
123
+ }
124
+
125
+ TEST(GetCentroid, Polyline) {
126
+ // GetCentroid returns the centroid multiplied by the length of the polyline.
127
+ EXPECT_TRUE(S2::ApproxEquals(
128
+ S2Point(1, 1, 0),
129
+ S2::GetCentroid(*MakeLaxPolylineOrDie("0:0, 0:90"))));
130
+ }
131
+
132
+ TEST(GetCentroid, Polygon) {
133
+ // GetCentroid returns the centroid multiplied by the area of the polygon.
134
+ EXPECT_TRUE(S2::ApproxEquals(
135
+ S2Point(M_PI_4, M_PI_4, M_PI_4),
136
+ S2::GetCentroid(*MakeLaxPolygonOrDie("0:0, 0:90, 90:0"))));
137
+ }
138
+
139
+ } // namespace
@@ -0,0 +1,120 @@
1
+ // Copyright 2013 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s2shapeutil_build_polygon_boundaries.h"
19
+
20
+ #include "s2/util/gtl/btree_map.h"
21
+ #include "s2/third_party/absl/memory/memory.h"
22
+ #include "s2/mutable_s2shape_index.h"
23
+ #include "s2/s2contains_point_query.h"
24
+ #include "s2/s2shape_index.h"
25
+ #include "s2/s2shapeutil_contains_brute_force.h"
26
+
27
+ using absl::WrapUnique;
28
+ using std::vector;
29
+
30
+ namespace s2shapeutil {
31
+
32
+ void BuildPolygonBoundaries(const vector<vector<S2Shape*>>& components,
33
+ vector<vector<S2Shape*>>* polygons) {
34
+ polygons->clear();
35
+ if (components.empty()) return;
36
+
37
+ // Since the loop boundaries do not cross, a loop nesting hierarchy can be
38
+ // defined by choosing any point on the sphere as the "point at infinity".
39
+ // Loop A then contains loop B if (1) A contains the boundary of B and (2)
40
+ // loop A does not contain the point at infinity.
41
+ //
42
+ // We choose S2::Origin() for this purpose. The loop nesting hierarchy then
43
+ // determines the face structure. Here are the details:
44
+ //
45
+ // 1. Build an S2ShapeIndex of all loops that do not contain S2::Origin().
46
+ // This leaves at most one unindexed loop per connected component
47
+ // (the "outer loop").
48
+ //
49
+ // 2. For each component, choose a representative vertex and determine
50
+ // which indexed loops contain it. The "depth" of this component is
51
+ // defined as the number of such loops.
52
+ //
53
+ // 3. Assign the outer loop of each component to the containing loop whose
54
+ // depth is one less. This generates a set of multi-loop polygons.
55
+ //
56
+ // 4. The outer loops of all components at depth 0 become a single face.
57
+
58
+ MutableS2ShapeIndex index;
59
+ // A map from shape.id() to the corresponding component number.
60
+ vector<int> component_ids;
61
+ vector<S2Shape*> outer_loops;
62
+ for (int i = 0; i < components.size(); ++i) {
63
+ const auto& component = components[i];
64
+ for (S2Shape* loop : component) {
65
+ if (component.size() > 1 &&
66
+ !s2shapeutil::ContainsBruteForce(*loop, S2::Origin())) {
67
+ // Ownership is transferred back at the end of this function.
68
+ index.Add(WrapUnique(loop));
69
+ component_ids.push_back(i);
70
+ } else {
71
+ outer_loops.push_back(loop);
72
+ }
73
+ }
74
+ // Check that there is exactly one outer loop in each component.
75
+ S2_DCHECK_EQ(i + 1, outer_loops.size()) << "Component is not a subdivision";
76
+ }
77
+ // Find the loops containing each component.
78
+ vector<vector<S2Shape*>> ancestors(components.size());
79
+ auto contains_query = MakeS2ContainsPointQuery(&index);
80
+ for (int i = 0; i < outer_loops.size(); ++i) {
81
+ auto loop = outer_loops[i];
82
+ S2_DCHECK_GT(loop->num_edges(), 0);
83
+ ancestors[i] = contains_query.GetContainingShapes(loop->edge(0).v0);
84
+ }
85
+ // Assign each outer loop to the component whose depth is one less.
86
+ // Components at depth 0 become a single face.
87
+ gtl::btree_map<S2Shape*, vector<S2Shape*>> children;
88
+ for (int i = 0; i < outer_loops.size(); ++i) {
89
+ S2Shape* ancestor = nullptr;
90
+ int depth = ancestors[i].size();
91
+ if (depth > 0) {
92
+ for (auto candidate : ancestors[i]) {
93
+ if (ancestors[component_ids[candidate->id()]].size() == depth - 1) {
94
+ S2_DCHECK(ancestor == nullptr);
95
+ ancestor = candidate;
96
+ }
97
+ }
98
+ S2_DCHECK(ancestor != nullptr);
99
+ }
100
+ children[ancestor].push_back(outer_loops[i]);
101
+ }
102
+ // There is one face per loop that is not an outer loop, plus one for the
103
+ // outer loops of components at depth 0.
104
+ polygons->resize(index.num_shape_ids() + 1);
105
+ for (int i = 0; i < index.num_shape_ids(); ++i) {
106
+ auto polygon = &(*polygons)[i];
107
+ auto loop = index.shape(i);
108
+ auto itr = children.find(loop);
109
+ if (itr != children.end()) {
110
+ *polygon = itr->second;
111
+ }
112
+ polygon->push_back(loop);
113
+ }
114
+ polygons->back() = children[nullptr];
115
+
116
+ // Explicitly release the shapes from the index so they are not deleted.
117
+ for (auto& ptr : index.ReleaseAll()) ptr.release();
118
+ }
119
+
120
+ } // namespace s2shapeutil
@@ -0,0 +1,66 @@
1
+ // Copyright 2013 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_
19
+ #define S2_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_
20
+
21
+ #include <vector>
22
+
23
+ #include "s2/s2shape_index.h"
24
+
25
+ namespace s2shapeutil {
26
+
27
+ // The purpose of this function is to construct polygons consisting of
28
+ // multiple loops. It takes as input a collection of loops whose boundaries
29
+ // do not cross, and groups them into polygons whose interiors do not
30
+ // intersect (where the boundary of each polygon may consist of multiple
31
+ // loops).
32
+ //
33
+ // some of those islands have lakes, then the input to this function would
34
+ // islands, and their lakes. Each loop would actually be present twice, once
35
+ // in each direction (see below). The output would consist of one polygon
36
+ // representing each lake, one polygon representing each island not including
37
+ // islands or their lakes, and one polygon representing the rest of the world
38
+ //
39
+ // This method is intended for internal use; external clients should use
40
+ // S2Builder, which has more convenient interface.
41
+ //
42
+ // The input consists of a set of connected components, where each component
43
+ // consists of one or more loops. The components must satisfy the following
44
+ // properties:
45
+ //
46
+ // - The loops in each component must form a subdivision of the sphere (i.e.,
47
+ // they must cover the entire sphere without overlap), except that a
48
+ // component may consist of a single loop if and only if that loop is
49
+ // degenerate (i.e., its interior is empty).
50
+ //
51
+ // - The boundaries of different components must be disjoint (i.e. no
52
+ // crossing edges or shared vertices).
53
+ //
54
+ // - No component should be empty, and no loop should have zero edges.
55
+ //
56
+ // The output consists of a set of polygons, where each polygon is defined by
57
+ // the collection of loops that form its boundary. This function does not
58
+ // actually construct any S2Shapes; it simply identifies the loops that belong
59
+ // to each polygon.
60
+ void BuildPolygonBoundaries(
61
+ const std::vector<std::vector<S2Shape*>>& components,
62
+ std::vector<std::vector<S2Shape*>>* polygons);
63
+
64
+ } // namespace s2shapeutil
65
+
66
+ #endif // S2_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_