@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,501 @@
1
+ // Copyright 2017 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2BOOLEAN_OPERATION_H_
19
+ #define S2_S2BOOLEAN_OPERATION_H_
20
+
21
+ #include <memory>
22
+ #include <utility>
23
+ #include <vector>
24
+ #include "s2/s2builder.h"
25
+ #include "s2/s2builder_graph.h"
26
+ #include "s2/s2builder_layer.h"
27
+ #include "s2/value_lexicon.h"
28
+
29
+ // This class implements boolean operations (intersection, union, difference,
30
+ // and symmetric difference) for regions whose boundaries are defined by
31
+ // geodesic edges.
32
+ //
33
+ // S2BooleanOperation operates on exactly two input regions at a time. Each
34
+ // region is represented as an S2ShapeIndex and may contain any number of
35
+ // points, polylines, and polygons. The region is essentially the union of
36
+ // these objects, except that polygon interiors must be disjoint from all
37
+ // other geometry (including other polygon interiors). If the input geometry
38
+ // for a region does not meet this condition, it can be normalized by
39
+ // computing its union first. Note that points or polylines are allowed to
40
+ // coincide with the boundaries of polygons.
41
+ //
42
+ // Degeneracies are supported. A polygon loop or polyline may consist of a
43
+ // single edge from a vertex to itself, and polygons may contain "sibling
44
+ // pairs" consisting of an edge and its corresponding reverse edge. Polygons
45
+ // must not have any duplicate edges (due to the requirement that polygon
46
+ // interiors are disjoint), but polylines may have duplicate edges or can even
47
+ // be self-intersecting.
48
+ //
49
+ // Points and polyline edges are treated as multisets: if the same point or
50
+ // polyline edge appears multiple times in the input, it will appear multiple
51
+ // times in the output. For example, the union of a point with an identical
52
+ // point consists of two points. This feature is useful for modeling large
53
+ // sets of points or polylines as a single region while maintaining their
54
+ // distinct identities, even when the points or polylines intersect each
55
+ // other. It is also useful for reconstructing polylines that loop back on
56
+ // themselves. If duplicate geometry is not desired, it can be merged by
57
+ // GraphOptions::DuplicateEdges::MERGE in the S2Builder output layer.
58
+ //
59
+ // Polylines are always considered to be directed. Polyline edges between the
60
+ // same pair of vertices are defined to intersect even if the two edges are in
61
+ // opposite directions. (Undirected polylines can be modeled by specifying
62
+ // GraphOptions::EdgeType::UNDIRECTED in the S2Builder output layer.)
63
+ //
64
+ // The output of each operation is sent to an S2Builder::Layer provided by the
65
+ // client. This allows clients to build any representation of the geometry
66
+ // they choose. It also allows the client to do additional postprocessing of
67
+ // the output before building data structures; for example, the client can
68
+ // easily discard degeneracies or convert them to another data type.
69
+ //
70
+ // The boundaries of polygons and polylines can be modeled as open, semi-open,
71
+ // or closed. Polyline boundaries are controlled by the PolylineModel class,
72
+ // whose options are as follows:
73
+ //
74
+ // - In the OPEN model, polylines do not contain their first or last vertex
75
+ // except for one special case: namely, if the polyline forms a loop and
76
+ // the polyline_loops_have_boundaries() option is set to false, then the
77
+ // first/last vertex is contained.
78
+ //
79
+ // - In the SEMI_OPEN model, polylines contain all vertices except the last.
80
+ // Therefore if one polyline starts where another polyline stops, the two
81
+ // polylines do not intersect.
82
+ //
83
+ // - In the CLOSED model, polylines contain all of their vertices.
84
+ //
85
+ // When multiple polylines are present, they are processed independently and
86
+ // have no effect on each other. For example, in the OPEN boundary model the
87
+ // polyline ABC contains the vertex B, while set of polylines {AB, BC} does
88
+ // not. (If you want to treat the polylines as a union instead, with
89
+ // boundaries merged according to the "mod 2" rule, this can be achieved by
90
+ // reassembling the edges into maximal polylines using S2PolylineVectorLayer
91
+ // with EdgeType::UNDIRECTED, DuplicateEdges::MERGE, and PolylineType::WALK.)
92
+ //
93
+ // Polygon boundaries are controlled by the PolygonModel class, which has the
94
+ // following options:
95
+ //
96
+ // - In the OPEN model, polygons do not contain their vertices or edges.
97
+ // This implies that a polyline that follows the boundary of a polygon will
98
+ // not intersect it.
99
+ //
100
+ // - In the SEMI_OPEN model, polygon point containment is defined such that
101
+ // if several polygons tile the region around a vertex, then exactly one of
102
+ // those polygons contains that vertex. Similarly polygons contain all of
103
+ // their edges, but none of their reversed edges. This implies that a
104
+ // polyline and polygon edge with the same endpoints intersect if and only
105
+ // if they are in the same direction. (This rule ensures that if a
106
+ // polyline is intersected with a polygon and its complement, the two
107
+ // resulting polylines do not have any edges in common.)
108
+ //
109
+ // - In the CLOSED model, polygons contain all their vertices, edges, and
110
+ // reversed edges. This implies that a polyline that shares an edge (in
111
+ // either direction) with a polygon is defined to intersect it. Similarly,
112
+ // this is the only model where polygons that touch at a vertex or along an
113
+ // edge intersect.
114
+ //
115
+ // Note that PolylineModel and PolygonModel are defined as separate classes in
116
+ // order to allow for possible future extensions.
117
+ //
118
+ // Operations between geometry of different dimensions are defined as follows:
119
+ //
120
+ // - For UNION, the higher-dimensional shape always wins. For example the
121
+ // union of a closed polygon A with a polyline B that coincides with the
122
+ // boundary of A consists only of the polygon A.
123
+ //
124
+ // - For INTERSECTION, the lower-dimensional shape always wins. For example,
125
+ // the intersection of a closed polygon A with a point B that coincides
126
+ // with a vertex of A consists only of the point B.
127
+ //
128
+ // - For DIFFERENCE, higher-dimensional shapes are not affected by
129
+ // subtracting lower-dimensional shapes. For example, subtracting a point
130
+ // or polyline from a polygon A yields the original polygon A. This rule
131
+ // exists because in general, it is impossible to represent the output
132
+ // using the specified boundary model(s). (Consider subtracting one vertex
133
+ // from a PolylineModel::CLOSED polyline, or subtracting one edge from a
134
+ // PolygonModel::CLOSED polygon.) If you want to perform operations like
135
+ // this, consider representing all boundaries explicitly (topological
136
+ // boundaries) using OPEN boundary models. Another option for polygons is
137
+ // to subtract a degenerate loop, which yields a polygon with a degenerate
138
+ // hole (see S2LaxPolygonShape).
139
+ //
140
+ // Note that in the case of Precision::EXACT operations, the above remarks
141
+ // only apply to the output before snapping. Snapping may cause nearby
142
+ // distinct edges to become coincident, e.g. a polyline may become coincident
143
+ // with a polygon boundary. However also note that S2BooleanOperation is
144
+ // perfectly happy to accept such geometry as input.
145
+ //
146
+ // Note the following differences between S2BooleanOperation and the similar
147
+ // S2MultiBooleanOperation class:
148
+ //
149
+ // - S2BooleanOperation operates on exactly two regions at a time, whereas
150
+ // S2MultiBooleanOperation operates on any number of regions.
151
+ //
152
+ // - S2BooleanOperation is potentially much faster when the input is already
153
+ // represented as S2ShapeIndexes. The algorithm is output sensitive and is
154
+ // often sublinear in the input size. This can be a big advantage if, say,
155
+ //
156
+ // - S2BooleanOperation supports exact predicates and the corresponding
157
+ // exact operations (i.e., operations that are equivalent to computing the
158
+ // exact result and then snap rounding it).
159
+ //
160
+ // - S2MultiBooleanOperation has better error guarantees when there are many
161
+ // regions, since it requires only one snapping operation for any number of
162
+ // input regions.
163
+ //
164
+ // Example usage:
165
+ // S2ShapeIndex a, b; // Input geometry, e.g. containing polygons.
166
+ // S2Polygon polygon; // Output geometry.
167
+ // S2BooleanOperation::Options options;
168
+ // options.set_snap_function(snap_function);
169
+ // S2BooleanOperation op(S2BooleanOperation::OpType::INTERSECTION,
170
+ // absl::make_unique<S2PolygonLayer>(&polygon),
171
+ // options);
172
+ // S2Error error;
173
+ // if (!op.Build(a, b, &error)) {
174
+ // S2_LOG(ERROR) << error;
175
+ // ...
176
+ // }
177
+ //
178
+ // If the output includes objects of different dimensions, they can be
179
+ // assembled into different layers with code like this:
180
+ //
181
+ // vector<S2Point> points;
182
+ // vector<unique_ptr<S2Polyline>> polylines;
183
+ // S2Polygon polygon;
184
+ // S2BooleanOperation op(
185
+ // S2BooleanOperation::OpType::UNION,
186
+ // absl::make_unique<s2builderutil::PointVectorLayer>(&points),
187
+ // absl::make_unique<s2builderutil::S2PolylineVectorLayer>(&polylines),
188
+ // absl::make_unique<S2PolygonLayer>(&polygon));
189
+
190
+ class S2BooleanOperation {
191
+ public:
192
+ // The supported operation types.
193
+ enum class OpType {
194
+ UNION, // Contained by either region.
195
+ INTERSECTION, // Contained by both regions.
196
+ DIFFERENCE, // Contained by the first region but not the second.
197
+ SYMMETRIC_DIFFERENCE // Contained by one region but not the other.
198
+ };
199
+ // Translates OpType to one of the strings above.
200
+ static const char* OpTypeToString(OpType op_type);
201
+
202
+ // Defines whether polygons are considered to contain their vertices and/or
203
+ // edges (see definitions above).
204
+ enum class PolygonModel { OPEN, SEMI_OPEN, CLOSED };
205
+
206
+ // Defines whether polylines are considered to contain their endpoints
207
+ // (see definitions above).
208
+ enum class PolylineModel { OPEN, SEMI_OPEN, CLOSED };
209
+
210
+ // With Precision::EXACT, the operation is evaluated using the exact input
211
+ // geometry. Predicates that use this option will produce exact results;
212
+ // for example, they can distinguish between a polyline that barely
213
+ // intersects a polygon from one that barely misses it. Constructive
214
+ // operations (ones that yield new geometry, as opposed to predicates) are
215
+ // implemented by computing the exact result and then snap rounding it
216
+ // according to the given snap_function() (see below). This is as close as
217
+ // it is possible to get to the exact result while requiring that vertex
218
+ // coordinates have type "double".
219
+ //
220
+ // With Precision::SNAPPED, the input regions are snapped together *before*
221
+ // the operation is evaluated. So for example, two polygons that overlap
222
+ // slightly will be treated as though they share a common boundary, and
223
+ // similarly two polygons that are slightly separated from each other will
224
+ // be treated as though they share a common boundary. Snapped results are
225
+ // useful for dealing with points, since in S2 the only points that lie
226
+ // exactly on a polyline or polygon edge are the endpoints of that edge.
227
+ //
228
+ // Conceptually, the difference between these two options is that with
229
+ // Precision::SNAPPED, the inputs are snap rounded (together), whereas with
230
+ // Precision::EXACT only the result is snap rounded.
231
+ enum class Precision { EXACT, SNAPPED };
232
+
233
+ // SourceId identifies an edge from one of the two input S2ShapeIndexes.
234
+ // It consists of a region id (0 or 1), a shape id within that region's
235
+ // S2ShapeIndex, and an edge id within that shape.
236
+ class SourceId {
237
+ public:
238
+ SourceId();
239
+ SourceId(int region_id, int32 shape_id, int32 edge_id);
240
+ explicit SourceId(int32 special_edge_id);
241
+ int region_id() const { return region_id_; }
242
+ int32 shape_id() const { return shape_id_; }
243
+ int32 edge_id() const { return edge_id_; }
244
+ // TODO(ericv): Convert to functions, define all 6 comparisons.
245
+ bool operator==(SourceId other) const;
246
+ bool operator<(SourceId other) const;
247
+
248
+ private:
249
+ uint32 region_id_ : 1;
250
+ uint32 shape_id_ : 31;
251
+ int32 edge_id_;
252
+ };
253
+
254
+ class Options {
255
+ public:
256
+ Options();
257
+
258
+ // Convenience constructor that calls set_snap_function().
259
+ explicit Options(const S2Builder::SnapFunction& snap_function);
260
+
261
+ // Specifies the function to be used for snap rounding.
262
+ //
263
+ // DEFAULT: s2builderutil::IdentitySnapFunction(S1Angle::Zero())
264
+ // - This does no snapping and preserves all input vertices exactly unless
265
+ // there are crossing edges, in which case the snap radius is increased
266
+ // to the maximum intersection point error (S2::kIntersectionError).
267
+ const S2Builder::SnapFunction& snap_function() const;
268
+ void set_snap_function(const S2Builder::SnapFunction& snap_function);
269
+
270
+ // Defines whether polygons are considered to contain their vertices
271
+ // and/or edges (see comments above).
272
+ //
273
+ // DEFAULT: PolygonModel::SEMI_OPEN
274
+ PolygonModel polygon_model() const;
275
+ void set_polygon_model(PolygonModel model);
276
+
277
+ // Defines whether polylines are considered to contain their vertices (see
278
+ // comments above).
279
+ //
280
+ // DEFAULT: PolylineModel::CLOSED
281
+ PolylineModel polyline_model() const;
282
+ void set_polyline_model(PolylineModel model);
283
+
284
+ // Specifies whether a polyline loop is considered to have a non-empty
285
+ // boundary. By default this option is true, meaning that even if the
286
+ // first and last vertices of a polyline are the same, the polyline is
287
+ // considered to have a well-defined "start" and "end". For example, if
288
+ // the polyline boundary model is OPEN then the polyline loop would not
289
+ // include the start/end vertices. These are the best semantics for most
290
+ // applications, such as GPS tracks or road network segments.
291
+ //
292
+ // If the polyline forms a loop and this option is set to false, then
293
+ // instead the first and last vertices are considered to represent a
294
+ // single vertex in the interior of the polyline. In this case the
295
+ // boundary of the polyline is empty, meaning that the first/last vertex
296
+ // will be contained by the polyline even if the boundary model is OPEN.
297
+ // (Note that this option also has a small effect on the CLOSED boundary
298
+ // model, because the first/last vertices of a polyline loop are
299
+ // considered to represent one vertex rather than two.)
300
+ //
301
+ // The main reason for this option is to implement the "mod 2 union"
302
+ // boundary semantics of the OpenGIS Simple Features spec. This can be
303
+ // achieved by making sure that all polylines are constructed using
304
+ // S2Builder::Graph::PolylineType::WALK (which ensures that all polylines
305
+ // are as long as possible), and then setting this option to false.
306
+ //
307
+ // DEFAULT: true
308
+ bool polyline_loops_have_boundaries() const;
309
+ void set_polyline_loops_have_boundaries(bool value);
310
+
311
+ // Specifies whether the operation should use the exact input geometry
312
+ // (Precision::EXACT), or whether the two input regions should be snapped
313
+ // together first (Precision::SNAPPED).
314
+ //
315
+ // DEFAULT: Precision::EXACT
316
+ Precision precision() const;
317
+ // void set_precision(Precision precision);
318
+
319
+ // If true, the input geometry is interpreted as representing nearby
320
+ // geometry that has been snapped or simplified. It then outputs a
321
+ // conservative result based on the value of polygon_model() and
322
+ // polyline_model(). For the most part, this only affects the handling of
323
+ // degeneracies.
324
+ //
325
+ // - If the model is OPEN, the result is as open as possible. For
326
+ // example, the intersection of two identical degenerate shells is empty
327
+ // under PolygonModel::OPEN because they could have been disjoint before
328
+ // snapping. Similarly, two identical degenerate polylines have an
329
+ // empty intersection under PolylineModel::OPEN.
330
+ //
331
+ // - If the model is CLOSED, the result is as closed as possible. In the
332
+ // case of the DIFFERENCE operation, this is equivalent to evaluating
333
+ // A - B as Closure(A) - Interior(B). For other operations, it affects
334
+ // only the handling of degeneracies. For example, the union of two
335
+ // identical degenerate holes is empty under PolygonModel::CLOSED
336
+ // (i.e., the hole disappears) because the holes could have been
337
+ // disjoint before snapping.
338
+ //
339
+ // - If the model is SEMI_OPEN, the result is as degenerate as possible.
340
+ // New degeneracies will not be created, but all degeneracies that
341
+ // coincide with the opposite region's boundary are retained unless this
342
+ // would cause a duplicate polygon edge to be created. This model is
343
+ // is very useful for working with input data that has both positive and
344
+ // negative degeneracies (i.e., degenerate shells and holes).
345
+ //
346
+ // DEFAULT: false
347
+ bool conservative_output() const;
348
+ // void set_conservative_output(bool conservative);
349
+
350
+ // If specified, then each output edge will be labelled with one or more
351
+ // SourceIds indicating which input edge(s) it corresponds to. This
352
+ // can be useful if your input geometry has additional data that needs to
353
+ // be propagated from the input to the output (e.g., elevations).
354
+ //
355
+ // You can access the labels by using an S2Builder::Layer type that
356
+ // supports labels, such as S2PolygonLayer. The layer outputs a
357
+ // "label_set_lexicon" and an "label_set_id" for each edge. You can then
358
+ // look up the source information for each edge like this:
359
+ //
360
+ // for (int32 label : label_set_lexicon.id_set(label_set_id)) {
361
+ // const SourceId& src = source_id_lexicon.value(label);
362
+ // // region_id() specifies which S2ShapeIndex the edge is from (0 or 1).
363
+ // DoSomething(src.region_id(), src.shape_id(), src.edge_id());
364
+ // }
365
+ //
366
+ // DEFAULT: nullptr
367
+ ValueLexicon<SourceId>* source_id_lexicon() const;
368
+ // void set_source_id_lexicon(ValueLexicon<SourceId>* source_id_lexicon);
369
+
370
+ // Options may be assigned and copied.
371
+ Options(const Options& options);
372
+ Options& operator=(const Options& options);
373
+
374
+ private:
375
+ std::unique_ptr<S2Builder::SnapFunction> snap_function_;
376
+ PolygonModel polygon_model_ = PolygonModel::SEMI_OPEN;;
377
+ PolylineModel polyline_model_ = PolylineModel::CLOSED;
378
+ bool polyline_loops_have_boundaries_ = true;
379
+ Precision precision_ = Precision::EXACT;
380
+ bool conservative_output_ = false;
381
+ ValueLexicon<SourceId>* source_id_lexicon_ = nullptr;
382
+ };
383
+
384
+ S2BooleanOperation(OpType op_type,
385
+ std::unique_ptr<S2Builder::Layer> layer,
386
+ const Options& options = Options());
387
+
388
+ // Specifies that the output boundary edges should be sent to three
389
+ // different layers according to their dimension. Points (represented by
390
+ // degenerate edges) are sent to layer 0, polyline edges are sent to
391
+ // layer 1, and polygon edges are sent to layer 2.
392
+ //
393
+ // The dimension of an edge is defined as the minimum dimension of the two
394
+ // input edges that produced it. For example, the intersection of two
395
+ // crossing polyline edges is a considered to be a degenerate polyline
396
+ // rather than a point, so it is sent to layer 1. Clients can easily
397
+ // reclassify such polylines as points if desired, but this rule makes it
398
+ // easier for clients that want to process point, polyline, and polygon
399
+ // inputs differently.
400
+ //
401
+ // The layers are always built in the order 0, 1, 2, and all arguments to
402
+ // the Build() calls are guaranteed to be valid until the last call returns.
403
+ // All Graph objects have the same set of vertices and the same lexicon
404
+ // objects, in order to make it easier to write classes that process all the
405
+ // edges in parallel.
406
+ S2BooleanOperation(OpType op_type,
407
+ std::vector<std::unique_ptr<S2Builder::Layer>> layers,
408
+ const Options& options = Options());
409
+
410
+ OpType op_type() const { return op_type_; }
411
+
412
+ // Executes the given operation. Returns true on success, and otherwise
413
+ // sets "error" appropriately. (This class does not generate any errors
414
+ // itself, but the S2Builder::Layer might.)
415
+ bool Build(const S2ShapeIndex& a, const S2ShapeIndex& b,
416
+ S2Error* error);
417
+
418
+ // Convenience method that returns true if the result of the given operation
419
+ // is empty.
420
+ static bool IsEmpty(OpType op_type,
421
+ const S2ShapeIndex& a, const S2ShapeIndex& b,
422
+ const Options& options = Options());
423
+
424
+ // Convenience method that returns true if A intersects B.
425
+ static bool Intersects(const S2ShapeIndex& a, const S2ShapeIndex& b,
426
+ const Options& options = Options()) {
427
+ return !IsEmpty(OpType::INTERSECTION, b, a, options);
428
+ }
429
+
430
+ // Convenience method that returns true if A contains B, i.e., if the
431
+ // difference (B - A) is empty.
432
+ static bool Contains(const S2ShapeIndex& a, const S2ShapeIndex& b,
433
+ const Options& options = Options()) {
434
+ return IsEmpty(OpType::DIFFERENCE, b, a, options);
435
+ }
436
+
437
+ // Convenience method that returns true if the symmetric difference of A and
438
+ // B is empty. (Note that A and B may still not be identical, e.g. A may
439
+ // contain two copies of a polyline while B contains one.)
440
+ static bool Equals(const S2ShapeIndex& a, const S2ShapeIndex& b,
441
+ const Options& options = Options()) {
442
+ return IsEmpty(OpType::SYMMETRIC_DIFFERENCE, b, a, options);
443
+ }
444
+
445
+ private:
446
+ class Impl; // The actual implementation.
447
+
448
+ // Internal constructor to reduce code duplication.
449
+ S2BooleanOperation(OpType op_type, const Options& options);
450
+
451
+ // Specifies that "result_empty" should be set to indicate whether the exact
452
+ // result of the operation is empty. This constructor is used to efficiently
453
+ // test boolean relationships (see IsEmpty above).
454
+ S2BooleanOperation(OpType op_type, bool* result_empty,
455
+ const Options& options = Options());
456
+
457
+ OpType op_type_;
458
+ Options options_;
459
+
460
+ // The input regions.
461
+ const S2ShapeIndex* regions_[2];
462
+
463
+ // The output consists either of zero layers, one layer, or three layers.
464
+ std::vector<std::unique_ptr<S2Builder::Layer>> layers_;
465
+
466
+ // The following field is set if and only if there are no output layers.
467
+ bool* result_empty_;
468
+ };
469
+
470
+
471
+ ////////////////// Implementation details follow ////////////////////
472
+
473
+
474
+ inline S2BooleanOperation::SourceId::SourceId()
475
+ : region_id_(0), shape_id_(0), edge_id_(-1) {
476
+ }
477
+
478
+ inline S2BooleanOperation::SourceId::SourceId(
479
+ int region_id, int32 shape_id, int32 edge_id)
480
+ : region_id_(region_id), shape_id_(shape_id), edge_id_(edge_id) {
481
+ }
482
+
483
+ inline S2BooleanOperation::SourceId::SourceId(int special_edge_id)
484
+ : region_id_(0), shape_id_(0), edge_id_(special_edge_id) {
485
+ }
486
+
487
+ inline bool S2BooleanOperation::SourceId::operator==(SourceId other) const {
488
+ return (region_id_ == other.region_id_ &&
489
+ shape_id_ == other.shape_id_ &&
490
+ edge_id_ == other.edge_id_);
491
+ }
492
+
493
+ inline bool S2BooleanOperation::SourceId::operator<(SourceId other) const {
494
+ if (region_id_ < other.region_id_) return true;
495
+ if (region_id_ > other.region_id_) return false;
496
+ if (shape_id_ < other.shape_id_) return true;
497
+ if (shape_id_ > other.shape_id_) return false;
498
+ return edge_id_ < other.edge_id_;
499
+ }
500
+
501
+ #endif // S2_S2BOOLEAN_OPERATION_H_