@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.
- package/.circleci/config.yml +45 -0
- package/.dockerignore +1 -0
- package/.gitmodules +3 -0
- package/CHANGELOG.md +33 -0
- package/LICENSE +201 -0
- package/README.md +147 -0
- package/binding.gyp +170 -0
- package/docker/Dockerfile.node20.test +8 -0
- package/docker/Dockerfile.node22.test +8 -0
- package/docker/Dockerfile.node24.test +8 -0
- package/index.d.ts +117 -0
- package/index.js +6 -0
- package/jest.config.js +184 -0
- package/package.json +43 -0
- package/publish-linux.sh +18 -0
- package/publish-osx.sh +19 -0
- package/src/builder.cc +84 -0
- package/src/builder.h +29 -0
- package/src/cell.cc +71 -0
- package/src/cell.h +26 -0
- package/src/cell_id.cc +210 -0
- package/src/cell_id.h +44 -0
- package/src/cell_union.cc +237 -0
- package/src/cell_union.h +34 -0
- package/src/earth.cc +185 -0
- package/src/earth.h +33 -0
- package/src/latlng.cc +132 -0
- package/src/latlng.h +28 -0
- package/src/loop.cc +51 -0
- package/src/loop.h +21 -0
- package/src/point.cc +69 -0
- package/src/point.h +23 -0
- package/src/polygon.cc +36 -0
- package/src/polygon.h +20 -0
- package/src/polyline.cc +186 -0
- package/src/polyline.h +34 -0
- package/src/region_coverer.cc +450 -0
- package/src/region_coverer.h +56 -0
- package/src/s2.cc +27 -0
- package/test/Cell.test.js +37 -0
- package/test/CellId.test.js +135 -0
- package/test/CellUnion.test.js +150 -0
- package/test/Earth.test.js +62 -0
- package/test/LatLng.test.js +45 -0
- package/test/Point.test.js +14 -0
- package/test/Polyline.test.js +78 -0
- package/test/RegionCoverer.test.js +301 -0
- package/test.sh +16 -0
- package/third_party/s2geometry/.travis.yml +163 -0
- package/third_party/s2geometry/AUTHORS +13 -0
- package/third_party/s2geometry/CONTRIBUTING.md +65 -0
- package/third_party/s2geometry/CONTRIBUTORS +30 -0
- package/third_party/s2geometry/LICENSE +202 -0
- package/third_party/s2geometry/NOTICE +5 -0
- package/third_party/s2geometry/README.md +127 -0
- package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
- package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
- package/third_party/s2geometry/doc/examples/term_index.py +101 -0
- package/third_party/s2geometry/src/python/coder.i +125 -0
- package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
- package/third_party/s2geometry/src/python/s2.i +37 -0
- package/third_party/s2geometry/src/python/s2_common.i +756 -0
- package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
- package/third_party/s2geometry/src/s2/base/casts.h +318 -0
- package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
- package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
- package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
- package/third_party/s2geometry/src/s2/base/logging.h +173 -0
- package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
- package/third_party/s2geometry/src/s2/base/port.h +999 -0
- package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
- package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
- package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
- package/third_party/s2geometry/src/s2/base/timer.h +50 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
- package/third_party/s2geometry/src/s2/r1interval.h +220 -0
- package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
- package/third_party/s2geometry/src/s2/r2.h +26 -0
- package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
- package/third_party/s2geometry/src/s2/r2rect.h +234 -0
- package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
- package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
- package/third_party/s2geometry/src/s2/s1angle.h +336 -0
- package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
- package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
- package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
- package/third_party/s2geometry/src/s2/s1interval.h +266 -0
- package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
- package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
- package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
- package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
- package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
- package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
- package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
- package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
- package/third_party/s2geometry/src/s2/s2cap.h +286 -0
- package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
- package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
- package/third_party/s2geometry/src/s2/s2cell.h +249 -0
- package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
- package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
- package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
- package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
- package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
- package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
- package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
- package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
- package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
- package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
- package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
- package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
- package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
- package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
- package/third_party/s2geometry/src/s2/s2coords.h +459 -0
- package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
- package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
- package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
- package/third_party/s2geometry/src/s2/s2debug.h +69 -0
- package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
- package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
- package/third_party/s2geometry/src/s2/s2earth.h +268 -0
- package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
- package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
- package/third_party/s2geometry/src/s2/s2error.cc +29 -0
- package/third_party/s2geometry/src/s2/s2error.h +147 -0
- package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
- package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
- package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
- package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
- package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
- package/third_party/s2geometry/src/s2/s2loop.h +711 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
- package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
- package/third_party/s2geometry/src/s2/s2measures.h +78 -0
- package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
- package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
- package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
- package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
- package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
- package/third_party/s2geometry/src/s2/s2point.h +38 -0
- package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
- package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
- package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
- package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
- package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
- package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
- package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
- package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
- package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
- package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
- package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
- package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
- package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
- package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
- package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
- package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
- package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
- package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
- package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
- package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
- package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
- package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
- package/third_party/s2geometry/src/s2/s2projections.h +161 -0
- package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
- package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
- package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
- package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2region.cc +26 -0
- package/third_party/s2geometry/src/s2/s2region.h +142 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
- package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
- package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
- package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
- package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
- package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
- package/third_party/s2geometry/src/s2/s2shape.h +283 -0
- package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
- package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
- package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
- package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
- package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
- package/third_party/s2geometry/src/s2/s2testing.h +385 -0
- package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
- package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
- package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
- package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
- package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
- package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
- package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
- package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
- package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
- package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
- package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
- package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
- package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
- package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
- package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
- package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
- package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
- package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
- package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
- package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
- package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
- package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
- package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
- package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
- package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
- package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
- package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
- package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
- package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
- package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
|
@@ -0,0 +1,440 @@
|
|
|
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_visit_crossing_edge_pairs.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/s2crossing_edge_query.h"
|
|
21
|
+
#include "s2/s2edge_crosser.h"
|
|
22
|
+
#include "s2/s2error.h"
|
|
23
|
+
#include "s2/s2shapeutil_range_iterator.h"
|
|
24
|
+
#include "s2/s2wedge_relations.h"
|
|
25
|
+
|
|
26
|
+
using std::vector;
|
|
27
|
+
using ChainPosition = S2Shape::ChainPosition;
|
|
28
|
+
|
|
29
|
+
namespace s2shapeutil {
|
|
30
|
+
|
|
31
|
+
// Ensure that we don't usually need to allocate memory when collecting the
|
|
32
|
+
// edges in an S2ShapeIndex cell (which by default have about 10 edges).
|
|
33
|
+
using ShapeEdgeVector = absl::InlinedVector<ShapeEdge, 16>;
|
|
34
|
+
|
|
35
|
+
// Appends all edges in the given S2ShapeIndexCell to the given vector.
|
|
36
|
+
static void AppendShapeEdges(const S2ShapeIndex& index,
|
|
37
|
+
const S2ShapeIndexCell& cell,
|
|
38
|
+
ShapeEdgeVector* shape_edges) {
|
|
39
|
+
for (int s = 0; s < cell.num_clipped(); ++s) {
|
|
40
|
+
const S2ClippedShape& clipped = cell.clipped(s);
|
|
41
|
+
const S2Shape& shape = *index.shape(clipped.shape_id());
|
|
42
|
+
int num_edges = clipped.num_edges();
|
|
43
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
44
|
+
shape_edges->push_back(ShapeEdge(shape, clipped.edge(i)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Returns a vector containing all edges in the given S2ShapeIndexCell.
|
|
50
|
+
// (The result is returned as an output parameter so that the same storage can
|
|
51
|
+
// be reused, rather than allocating a new temporary vector each time.)
|
|
52
|
+
inline static void GetShapeEdges(const S2ShapeIndex& index,
|
|
53
|
+
const S2ShapeIndexCell& cell,
|
|
54
|
+
ShapeEdgeVector* shape_edges) {
|
|
55
|
+
shape_edges->clear();
|
|
56
|
+
AppendShapeEdges(index, cell, shape_edges);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Returns a vector containing all edges in the given S2ShapeIndexCell vector.
|
|
60
|
+
// (The result is returned as an output parameter so that the same storage can
|
|
61
|
+
// be reused, rather than allocating a new temporary vector each time.)
|
|
62
|
+
inline static void GetShapeEdges(const S2ShapeIndex& index,
|
|
63
|
+
const vector<const S2ShapeIndexCell*>& cells,
|
|
64
|
+
ShapeEdgeVector* shape_edges) {
|
|
65
|
+
shape_edges->clear();
|
|
66
|
+
for (auto cell : cells) {
|
|
67
|
+
AppendShapeEdges(index, *cell, shape_edges);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Given a vector of edges within an S2ShapeIndexCell, visit all pairs of
|
|
72
|
+
// crossing edges (of the given CrossingType).
|
|
73
|
+
static bool VisitCrossings(const ShapeEdgeVector& shape_edges,
|
|
74
|
+
CrossingType type, bool need_adjacent,
|
|
75
|
+
const EdgePairVisitor& visitor) {
|
|
76
|
+
const int min_crossing_sign = (type == CrossingType::INTERIOR) ? 1 : 0;
|
|
77
|
+
int num_edges = shape_edges.size();
|
|
78
|
+
for (int i = 0; i + 1 < num_edges; ++i) {
|
|
79
|
+
const ShapeEdge& a = shape_edges[i];
|
|
80
|
+
int j = i + 1;
|
|
81
|
+
// A common situation is that an edge AB is followed by an edge BC. We
|
|
82
|
+
// only need to visit such crossings if "need_adjacent" is true (even if
|
|
83
|
+
// AB and BC belong to different edge chains).
|
|
84
|
+
if (!need_adjacent && a.v1() == shape_edges[j].v0()) {
|
|
85
|
+
if (++j >= num_edges) break;
|
|
86
|
+
}
|
|
87
|
+
S2EdgeCrosser crosser(&a.v0(), &a.v1());
|
|
88
|
+
for (; j < num_edges; ++j) {
|
|
89
|
+
const ShapeEdge& b = shape_edges[j];
|
|
90
|
+
if (crosser.c() == nullptr || *crosser.c() != b.v0()) {
|
|
91
|
+
crosser.RestartAt(&b.v0());
|
|
92
|
+
}
|
|
93
|
+
int sign = crosser.CrossingSign(&b.v1());
|
|
94
|
+
if (sign >= min_crossing_sign) {
|
|
95
|
+
if (!visitor(a, b, sign == 1)) return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Visits all pairs of crossing edges in the given S2ShapeIndex, terminating
|
|
103
|
+
// early if the given EdgePairVisitor function returns false (in which case
|
|
104
|
+
// VisitCrossings returns false as well). "type" indicates whether all
|
|
105
|
+
// crossings should be visited, or only interior crossings.
|
|
106
|
+
//
|
|
107
|
+
// If "need_adjacent" is false, then edge pairs of the form (AB, BC) may
|
|
108
|
+
// optionally be ignored (even if the two edges belong to different edge
|
|
109
|
+
// chains). This option exists for the benefit of FindSelfIntersection(),
|
|
110
|
+
// which does not need such edge pairs (see below).
|
|
111
|
+
static bool VisitCrossings(
|
|
112
|
+
const S2ShapeIndex& index, CrossingType type, bool need_adjacent,
|
|
113
|
+
const EdgePairVisitor& visitor) {
|
|
114
|
+
// TODO(ericv): Use brute force if the total number of edges is small enough
|
|
115
|
+
// (using a larger threshold if the S2ShapeIndex is not constructed yet).
|
|
116
|
+
ShapeEdgeVector shape_edges;
|
|
117
|
+
for (S2ShapeIndex::Iterator it(&index, S2ShapeIndex::BEGIN);
|
|
118
|
+
!it.done(); it.Next()) {
|
|
119
|
+
GetShapeEdges(index, it.cell(), &shape_edges);
|
|
120
|
+
if (!VisitCrossings(shape_edges, type, need_adjacent, visitor)) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
bool VisitCrossingEdgePairs(const S2ShapeIndex& index, CrossingType type,
|
|
128
|
+
const EdgePairVisitor& visitor) {
|
|
129
|
+
const bool need_adjacent = (type == CrossingType::ALL);
|
|
130
|
+
return VisitCrossings(index, type, need_adjacent, visitor);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//////////////////////////////////////////////////////////////////////
|
|
134
|
+
|
|
135
|
+
// IndexCrosser is a helper class for finding the edge crossings between a
|
|
136
|
+
// pair of S2ShapeIndexes. It is instantiated twice, once for the index pair
|
|
137
|
+
// (A,B) and once for the index pair (B,A), in order to be able to test edge
|
|
138
|
+
// crossings in the most efficient order.
|
|
139
|
+
namespace {
|
|
140
|
+
class IndexCrosser {
|
|
141
|
+
public:
|
|
142
|
+
// If "swapped" is true, the loops A and B have been swapped. This affects
|
|
143
|
+
// how arguments are passed to the given loop relation, since for example
|
|
144
|
+
// A.Contains(B) is not the same as B.Contains(A).
|
|
145
|
+
IndexCrosser(const S2ShapeIndex& a_index, const S2ShapeIndex& b_index,
|
|
146
|
+
CrossingType type, const EdgePairVisitor& visitor, bool swapped)
|
|
147
|
+
: a_index_(a_index), b_index_(b_index), visitor_(visitor),
|
|
148
|
+
min_crossing_sign_(type == CrossingType::INTERIOR ? 1 : 0),
|
|
149
|
+
swapped_(swapped), b_query_(&b_index_) {
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Given two iterators positioned such that ai->id().Contains(bi->id()),
|
|
153
|
+
// visits all crossings between edges of A and B that intersect a->id().
|
|
154
|
+
// Terminates early and returns false if visitor_ returns false.
|
|
155
|
+
// Advances both iterators past ai->id().
|
|
156
|
+
bool VisitCrossings(RangeIterator* ai, RangeIterator* bi);
|
|
157
|
+
|
|
158
|
+
// Given two index cells, visits all crossings between edges of those cells.
|
|
159
|
+
// Terminates early and returns false if visitor_ returns false.
|
|
160
|
+
bool VisitCellCellCrossings(const S2ShapeIndexCell& a_cell,
|
|
161
|
+
const S2ShapeIndexCell& b_cell);
|
|
162
|
+
|
|
163
|
+
private:
|
|
164
|
+
bool VisitEdgePair(const ShapeEdge& a, const ShapeEdge& b, bool is_interior);
|
|
165
|
+
|
|
166
|
+
// Visits all crossings of the current edge with all edges of the given index
|
|
167
|
+
// cell of B. Terminates early and returns false if visitor_ returns false.
|
|
168
|
+
bool VisitEdgeCellCrossings(const ShapeEdge& a,
|
|
169
|
+
const S2ShapeIndexCell& b_cell);
|
|
170
|
+
|
|
171
|
+
// Visits all crossings of any edge in "a_cell" with any index cell of B that
|
|
172
|
+
// is a descendant of "b_id". Terminates early and returns false if
|
|
173
|
+
// visitor_ returns false.
|
|
174
|
+
bool VisitSubcellCrossings(const S2ShapeIndexCell& a_cell, S2CellId b_id);
|
|
175
|
+
|
|
176
|
+
// Visits all crossings of any edge in "a_edges" with any edge in "b_edges".
|
|
177
|
+
bool VisitEdgesEdgesCrossings(const ShapeEdgeVector& a_edges,
|
|
178
|
+
const ShapeEdgeVector& b_edges);
|
|
179
|
+
|
|
180
|
+
const S2ShapeIndex& a_index_;
|
|
181
|
+
const S2ShapeIndex& b_index_;
|
|
182
|
+
const EdgePairVisitor& visitor_;
|
|
183
|
+
const int min_crossing_sign_;
|
|
184
|
+
const bool swapped_;
|
|
185
|
+
|
|
186
|
+
// Temporary data declared here to avoid repeated memory allocations.
|
|
187
|
+
S2CrossingEdgeQuery b_query_;
|
|
188
|
+
vector<const S2ShapeIndexCell*> b_cells_;
|
|
189
|
+
ShapeEdgeVector a_shape_edges_;
|
|
190
|
+
ShapeEdgeVector b_shape_edges_;
|
|
191
|
+
};
|
|
192
|
+
} // namespace
|
|
193
|
+
|
|
194
|
+
inline bool IndexCrosser::VisitEdgePair(const ShapeEdge& a, const ShapeEdge& b,
|
|
195
|
+
bool is_interior) {
|
|
196
|
+
if (swapped_) {
|
|
197
|
+
return visitor_(b, a, is_interior);
|
|
198
|
+
} else {
|
|
199
|
+
return visitor_(a, b, is_interior);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
bool IndexCrosser::VisitEdgeCellCrossings(const ShapeEdge& a,
|
|
204
|
+
const S2ShapeIndexCell& b_cell) {
|
|
205
|
+
// Test the current edge of A against all edges of "b_cell".
|
|
206
|
+
|
|
207
|
+
// Note that we need to use a new S2EdgeCrosser (or call Init) whenever we
|
|
208
|
+
// replace the contents of b_shape_edges_, since S2EdgeCrosser requires that
|
|
209
|
+
// its S2Point arguments point to values that persist between Init() calls.
|
|
210
|
+
GetShapeEdges(b_index_, b_cell, &b_shape_edges_);
|
|
211
|
+
S2EdgeCrosser crosser(&a.v0(), &a.v1());
|
|
212
|
+
for (const ShapeEdge& b : b_shape_edges_) {
|
|
213
|
+
if (crosser.c() == nullptr || *crosser.c() != b.v0()) {
|
|
214
|
+
crosser.RestartAt(&b.v0());
|
|
215
|
+
}
|
|
216
|
+
int sign = crosser.CrossingSign(&b.v1());
|
|
217
|
+
if (sign >= min_crossing_sign_) {
|
|
218
|
+
if (!VisitEdgePair(a, b, sign == 1)) return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
bool IndexCrosser::VisitSubcellCrossings(const S2ShapeIndexCell& a_cell,
|
|
225
|
+
S2CellId b_id) {
|
|
226
|
+
// Test all edges of "a_cell" against the edges contained in B index cells
|
|
227
|
+
// that are descendants of "b_id".
|
|
228
|
+
GetShapeEdges(a_index_, a_cell, &a_shape_edges_);
|
|
229
|
+
S2PaddedCell b_root(b_id, 0);
|
|
230
|
+
for (const ShapeEdge& a : a_shape_edges_) {
|
|
231
|
+
// Use an S2CrossingEdgeQuery starting at "b_root" to find the index cells
|
|
232
|
+
// of B that might contain crossing edges.
|
|
233
|
+
if (!b_query_.VisitCells(
|
|
234
|
+
a.v0(), a.v1(), b_root, [&a, this](const S2ShapeIndexCell& cell) {
|
|
235
|
+
return VisitEdgeCellCrossings(a, cell);
|
|
236
|
+
})) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
bool IndexCrosser::VisitEdgesEdgesCrossings(const ShapeEdgeVector& a_edges,
|
|
244
|
+
const ShapeEdgeVector& b_edges) {
|
|
245
|
+
// Test all edges of "a_edges" against all edges of "b_edges".
|
|
246
|
+
for (const ShapeEdge& a : a_edges) {
|
|
247
|
+
S2EdgeCrosser crosser(&a.v0(), &a.v1());
|
|
248
|
+
for (const ShapeEdge& b : b_edges) {
|
|
249
|
+
if (crosser.c() == nullptr || *crosser.c() != b.v0()) {
|
|
250
|
+
crosser.RestartAt(&b.v0());
|
|
251
|
+
}
|
|
252
|
+
int sign = crosser.CrossingSign(&b.v1());
|
|
253
|
+
if (sign >= min_crossing_sign_) {
|
|
254
|
+
if (!VisitEdgePair(a, b, sign == 1)) return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
inline bool IndexCrosser::VisitCellCellCrossings(
|
|
262
|
+
const S2ShapeIndexCell& a_cell, const S2ShapeIndexCell& b_cell) {
|
|
263
|
+
// Test all edges of "a_cell" against all edges of "b_cell".
|
|
264
|
+
GetShapeEdges(a_index_, a_cell, &a_shape_edges_);
|
|
265
|
+
GetShapeEdges(b_index_, b_cell, &b_shape_edges_);
|
|
266
|
+
return VisitEdgesEdgesCrossings(a_shape_edges_, b_shape_edges_);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
bool IndexCrosser::VisitCrossings(RangeIterator* ai, RangeIterator* bi) {
|
|
270
|
+
S2_DCHECK(ai->id().contains(bi->id()));
|
|
271
|
+
if (ai->cell().num_edges() == 0) {
|
|
272
|
+
// Skip over the cells of B using binary search.
|
|
273
|
+
bi->SeekBeyond(*ai);
|
|
274
|
+
} else {
|
|
275
|
+
// If ai->id() intersects many edges of B, then it is faster to use
|
|
276
|
+
// S2CrossingEdgeQuery to narrow down the candidates. But if it
|
|
277
|
+
// intersects only a few edges, it is faster to check all the crossings
|
|
278
|
+
// directly. We handle this by advancing "bi" and keeping track of how
|
|
279
|
+
// many edges we would need to test.
|
|
280
|
+
static const int kEdgeQueryMinEdges = 23;
|
|
281
|
+
int b_edges = 0;
|
|
282
|
+
b_cells_.clear();
|
|
283
|
+
do {
|
|
284
|
+
int cell_edges = bi->cell().num_edges();
|
|
285
|
+
if (cell_edges > 0) {
|
|
286
|
+
b_edges += cell_edges;
|
|
287
|
+
if (b_edges >= kEdgeQueryMinEdges) {
|
|
288
|
+
// There are too many edges, so use an S2CrossingEdgeQuery.
|
|
289
|
+
if (!VisitSubcellCrossings(ai->cell(), ai->id())) return false;
|
|
290
|
+
bi->SeekBeyond(*ai);
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
b_cells_.push_back(&bi->cell());
|
|
294
|
+
}
|
|
295
|
+
bi->Next();
|
|
296
|
+
} while (bi->id() <= ai->range_max());
|
|
297
|
+
if (!b_cells_.empty()) {
|
|
298
|
+
// Test all the edge crossings directly.
|
|
299
|
+
GetShapeEdges(a_index_, ai->cell(), &a_shape_edges_);
|
|
300
|
+
GetShapeEdges(b_index_, b_cells_, &b_shape_edges_);
|
|
301
|
+
if (!VisitEdgesEdgesCrossings(a_shape_edges_, b_shape_edges_)) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
ai->Next();
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
bool VisitCrossingEdgePairs(const S2ShapeIndex& a_index,
|
|
311
|
+
const S2ShapeIndex& b_index,
|
|
312
|
+
CrossingType type, const EdgePairVisitor& visitor) {
|
|
313
|
+
// We look for S2CellId ranges where the indexes of A and B overlap, and
|
|
314
|
+
// then test those edges for crossings.
|
|
315
|
+
|
|
316
|
+
// TODO(ericv): Use brute force if the total number of edges is small enough
|
|
317
|
+
// (using a larger threshold if the S2ShapeIndex is not constructed yet).
|
|
318
|
+
RangeIterator ai(a_index), bi(b_index);
|
|
319
|
+
IndexCrosser ab(a_index, b_index, type, visitor, false); // Tests A against B
|
|
320
|
+
IndexCrosser ba(b_index, a_index, type, visitor, true); // Tests B against A
|
|
321
|
+
while (!ai.done() || !bi.done()) {
|
|
322
|
+
if (ai.range_max() < bi.range_min()) {
|
|
323
|
+
// The A and B cells don't overlap, and A precedes B.
|
|
324
|
+
ai.SeekTo(bi);
|
|
325
|
+
} else if (bi.range_max() < ai.range_min()) {
|
|
326
|
+
// The A and B cells don't overlap, and B precedes A.
|
|
327
|
+
bi.SeekTo(ai);
|
|
328
|
+
} else {
|
|
329
|
+
// One cell contains the other. Determine which cell is larger.
|
|
330
|
+
int64 ab_relation = ai.id().lsb() - bi.id().lsb();
|
|
331
|
+
if (ab_relation > 0) {
|
|
332
|
+
// A's index cell is larger.
|
|
333
|
+
if (!ab.VisitCrossings(&ai, &bi)) return false;
|
|
334
|
+
} else if (ab_relation < 0) {
|
|
335
|
+
// B's index cell is larger.
|
|
336
|
+
if (!ba.VisitCrossings(&bi, &ai)) return false;
|
|
337
|
+
} else {
|
|
338
|
+
// The A and B cells are the same.
|
|
339
|
+
if (ai.cell().num_edges() > 0 && bi.cell().num_edges() > 0) {
|
|
340
|
+
if (!ab.VisitCellCellCrossings(ai.cell(), bi.cell())) return false;
|
|
341
|
+
}
|
|
342
|
+
ai.Next();
|
|
343
|
+
bi.Next();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
//////////////////////////////////////////////////////////////////////
|
|
351
|
+
|
|
352
|
+
// Helper function that formats a loop error message. If the loop belongs to
|
|
353
|
+
// a multi-loop polygon, adds a prefix indicating which loop is affected.
|
|
354
|
+
static void InitLoopError(S2Error::Code code, const char* format,
|
|
355
|
+
ChainPosition ap, ChainPosition bp,
|
|
356
|
+
bool is_polygon, S2Error* error) {
|
|
357
|
+
error->Init(code, format, ap.offset, bp.offset);
|
|
358
|
+
if (is_polygon) {
|
|
359
|
+
error->Init(code, "Loop %d: %s", ap.chain_id, error->text().c_str());
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Given two loop edges that cross (including at a shared vertex), return true
|
|
364
|
+
// if there is a crossing error and set "error" to a human-readable message.
|
|
365
|
+
static bool FindCrossingError(const S2Shape& shape,
|
|
366
|
+
const ShapeEdge& a, const ShapeEdge& b,
|
|
367
|
+
bool is_interior, S2Error* error) {
|
|
368
|
+
bool is_polygon = shape.num_chains() > 1;
|
|
369
|
+
S2Shape::ChainPosition ap = shape.chain_position(a.id().edge_id);
|
|
370
|
+
S2Shape::ChainPosition bp = shape.chain_position(b.id().edge_id);
|
|
371
|
+
if (is_interior) {
|
|
372
|
+
if (ap.chain_id != bp.chain_id) {
|
|
373
|
+
error->Init(S2Error::POLYGON_LOOPS_CROSS,
|
|
374
|
+
"Loop %d edge %d crosses loop %d edge %d",
|
|
375
|
+
ap.chain_id, ap.offset, bp.chain_id, bp.offset);
|
|
376
|
+
} else {
|
|
377
|
+
InitLoopError(S2Error::LOOP_SELF_INTERSECTION,
|
|
378
|
+
"Edge %d crosses edge %d", ap, bp, is_polygon, error);
|
|
379
|
+
}
|
|
380
|
+
return true;
|
|
381
|
+
}
|
|
382
|
+
// Loops are not allowed to have duplicate vertices, and separate loops
|
|
383
|
+
// are not allowed to share edges or cross at vertices. We only need to
|
|
384
|
+
// check a given vertex once, so we also require that the two edges have
|
|
385
|
+
// the same end vertex.
|
|
386
|
+
if (a.v1() != b.v1()) return false;
|
|
387
|
+
if (ap.chain_id == bp.chain_id) {
|
|
388
|
+
InitLoopError(S2Error::DUPLICATE_VERTICES,
|
|
389
|
+
"Edge %d has duplicate vertex with edge %d",
|
|
390
|
+
ap, bp, is_polygon, error);
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
int a_len = shape.chain(ap.chain_id).length;
|
|
394
|
+
int b_len = shape.chain(bp.chain_id).length;
|
|
395
|
+
int a_next = (ap.offset + 1 == a_len) ? 0 : ap.offset + 1;
|
|
396
|
+
int b_next = (bp.offset + 1 == b_len) ? 0 : bp.offset + 1;
|
|
397
|
+
S2Point a2 = shape.chain_edge(ap.chain_id, a_next).v1;
|
|
398
|
+
S2Point b2 = shape.chain_edge(bp.chain_id, b_next).v1;
|
|
399
|
+
if (a.v0() == b.v0() || a.v0() == b2) {
|
|
400
|
+
// The second edge index is sometimes off by one, hence "near".
|
|
401
|
+
error->Init(S2Error::POLYGON_LOOPS_SHARE_EDGE,
|
|
402
|
+
"Loop %d edge %d has duplicate near loop %d edge %d",
|
|
403
|
+
ap.chain_id, ap.offset, bp.chain_id, bp.offset);
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
// Since S2ShapeIndex loops are oriented such that the polygon interior is
|
|
407
|
+
// always on the left, we need to handle the case where one wedge contains
|
|
408
|
+
// the complement of the other wedge. This is not specifically detected by
|
|
409
|
+
// GetWedgeRelation, so there are two cases to check for.
|
|
410
|
+
//
|
|
411
|
+
// Note that we don't need to maintain any state regarding loop crossings
|
|
412
|
+
// because duplicate edges are detected and rejected above.
|
|
413
|
+
if (S2::GetWedgeRelation(a.v0(), a.v1(), a2, b.v0(), b2) ==
|
|
414
|
+
S2::WEDGE_PROPERLY_OVERLAPS &&
|
|
415
|
+
S2::GetWedgeRelation(a.v0(), a.v1(), a2, b2, b.v0()) ==
|
|
416
|
+
S2::WEDGE_PROPERLY_OVERLAPS) {
|
|
417
|
+
error->Init(S2Error::POLYGON_LOOPS_CROSS,
|
|
418
|
+
"Loop %d edge %d crosses loop %d edge %d",
|
|
419
|
+
ap.chain_id, ap.offset, bp.chain_id, bp.offset);
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
bool FindSelfIntersection(const S2ShapeIndex& index, S2Error* error) {
|
|
426
|
+
if (index.num_shape_ids() == 0) return false;
|
|
427
|
+
S2_DCHECK_EQ(1, index.num_shape_ids());
|
|
428
|
+
const S2Shape& shape = *index.shape(0);
|
|
429
|
+
|
|
430
|
+
// Visit all crossing pairs except possibly for ones of the form (AB, BC),
|
|
431
|
+
// since such pairs are very common and FindCrossingError() only needs pairs
|
|
432
|
+
// of the form (AB, AC).
|
|
433
|
+
return !VisitCrossings(
|
|
434
|
+
index, CrossingType::ALL, false /*need_adjacent*/,
|
|
435
|
+
[&](const ShapeEdge& a, const ShapeEdge& b, bool is_interior) {
|
|
436
|
+
return !FindCrossingError(shape, a, b, is_interior, error);
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
} // namespace s2shapeutil
|
|
@@ -0,0 +1,72 @@
|
|
|
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_VISIT_CROSSING_EDGE_PAIRS_H_
|
|
19
|
+
#define S2_S2SHAPEUTIL_VISIT_CROSSING_EDGE_PAIRS_H_
|
|
20
|
+
|
|
21
|
+
#include <functional>
|
|
22
|
+
#include "s2/s2crossing_edge_query.h"
|
|
23
|
+
#include "s2/s2shape_index.h"
|
|
24
|
+
#include "s2/s2shapeutil_shape_edge.h"
|
|
25
|
+
|
|
26
|
+
class S2Error;
|
|
27
|
+
|
|
28
|
+
namespace s2shapeutil {
|
|
29
|
+
|
|
30
|
+
// A function that is called with pairs of crossing edges. The function may
|
|
31
|
+
// return false in order to request that the algorithm should be terminated,
|
|
32
|
+
// i.e. no further crossings are needed.
|
|
33
|
+
//
|
|
34
|
+
// "is_interior" indicates that the crossing is at a point interior to both
|
|
35
|
+
// edges (i.e., not at a vertex). (The calling function already has this
|
|
36
|
+
// information and it is moderately expensive to recompute.)
|
|
37
|
+
using EdgePairVisitor = std::function<
|
|
38
|
+
bool (const ShapeEdge& a, const ShapeEdge& b, bool is_interior)>;
|
|
39
|
+
|
|
40
|
+
// Visits all pairs of crossing edges in the given S2ShapeIndex, terminating
|
|
41
|
+
// early if the given EdgePairVisitor function returns false (in which case
|
|
42
|
+
// VisitCrossings returns false as well). "type" indicates whether all
|
|
43
|
+
// crossings should be visited, or only interior crossings.
|
|
44
|
+
//
|
|
45
|
+
// CAVEAT: Crossings may be visited more than once.
|
|
46
|
+
bool VisitCrossingEdgePairs(const S2ShapeIndex& index, CrossingType type,
|
|
47
|
+
const EdgePairVisitor& visitor);
|
|
48
|
+
|
|
49
|
+
// Like the above, but visits all pairs of crossing edges where one edge comes
|
|
50
|
+
// from each S2ShapeIndex.
|
|
51
|
+
//
|
|
52
|
+
// CAVEAT: Crossings may be visited more than once.
|
|
53
|
+
bool VisitCrossingEdgePairs(const S2ShapeIndex& a_index,
|
|
54
|
+
const S2ShapeIndex& b_index,
|
|
55
|
+
CrossingType type, const EdgePairVisitor& visitor);
|
|
56
|
+
|
|
57
|
+
// Given an S2ShapeIndex containing a single polygonal shape (e.g., an
|
|
58
|
+
// S2Polygon or S2Loop), return true if any loop has a self-intersection
|
|
59
|
+
// (including duplicate vertices) or crosses any other loop (including vertex
|
|
60
|
+
// crossings and duplicate edges) and set "error" to a human-readable error
|
|
61
|
+
// message. Otherwise return false and leave "error" unchanged.
|
|
62
|
+
//
|
|
63
|
+
// This method is used to implement the FindValidationError methods of S2Loop
|
|
64
|
+
// and S2Polygon.
|
|
65
|
+
//
|
|
66
|
+
// TODO(ericv): Add an option to support S2LaxPolygonShape rules (i.e.,
|
|
67
|
+
// duplicate vertices and edges are allowed, but loop crossings are not).
|
|
68
|
+
bool FindSelfIntersection(const S2ShapeIndex& index, S2Error* error);
|
|
69
|
+
|
|
70
|
+
} // namespace s2shapeutil
|
|
71
|
+
|
|
72
|
+
#endif // S2_S2SHAPEUTIL_VISIT_CROSSING_EDGE_PAIRS_H_
|