@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,313 @@
|
|
|
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
|
+
#include "s2/s2builderutil_closed_set_normalizer.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
|
|
22
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
23
|
+
#include "s2/s2builder_layer.h"
|
|
24
|
+
|
|
25
|
+
using absl::make_unique;
|
|
26
|
+
using std::shared_ptr;
|
|
27
|
+
using std::unique_ptr;
|
|
28
|
+
using std::vector;
|
|
29
|
+
|
|
30
|
+
using EdgeType = S2Builder::EdgeType;
|
|
31
|
+
using Graph = S2Builder::Graph;
|
|
32
|
+
using GraphOptions = S2Builder::GraphOptions;
|
|
33
|
+
|
|
34
|
+
using DegenerateEdges = GraphOptions::DegenerateEdges;
|
|
35
|
+
using SiblingPairs = GraphOptions::SiblingPairs;
|
|
36
|
+
|
|
37
|
+
using Edge = Graph::Edge;
|
|
38
|
+
using EdgeId = Graph::EdgeId;
|
|
39
|
+
using VertexId = Graph::VertexId;
|
|
40
|
+
|
|
41
|
+
namespace s2builderutil {
|
|
42
|
+
|
|
43
|
+
ClosedSetNormalizer::ClosedSetNormalizer(
|
|
44
|
+
const Options& options, const vector<GraphOptions>& graph_options_out)
|
|
45
|
+
: options_(options),
|
|
46
|
+
graph_options_out_(graph_options_out),
|
|
47
|
+
graph_options_in_(graph_options_out_),
|
|
48
|
+
sentinel_(std::numeric_limits<VertexId>::max(),
|
|
49
|
+
std::numeric_limits<VertexId>::max()) {
|
|
50
|
+
S2_DCHECK_EQ(graph_options_out_.size(), 3);
|
|
51
|
+
S2_DCHECK(graph_options_out_[0].edge_type() == EdgeType::DIRECTED);
|
|
52
|
+
S2_DCHECK(graph_options_out_[2].edge_type() == EdgeType::DIRECTED);
|
|
53
|
+
|
|
54
|
+
// NOTE(ericv): Supporting these options would require some extra code in
|
|
55
|
+
// order to handle undirected edges, and they are not useful for building
|
|
56
|
+
// polylines anyway (they are intended for polygon meshes).
|
|
57
|
+
S2_DCHECK(graph_options_out_[1].sibling_pairs() != SiblingPairs::CREATE);
|
|
58
|
+
S2_DCHECK(graph_options_out_[1].sibling_pairs() != SiblingPairs::REQUIRE);
|
|
59
|
+
|
|
60
|
+
// Set the GraphOptions for the input graphs to ensure that (1) they share a
|
|
61
|
+
// common set of vertices, (2) degenerate edges are kept only if they are
|
|
62
|
+
// isolated, and (3) multiple copies of siblings pairs are discarded. (Note
|
|
63
|
+
// that there may be multiple copies of isolated degenerate edges; clients
|
|
64
|
+
// can eliminate them if desired using DuplicateEdges::MERGE.)
|
|
65
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
66
|
+
graph_options_in_[dim].set_allow_vertex_filtering(false);
|
|
67
|
+
}
|
|
68
|
+
graph_options_in_[1].set_degenerate_edges(DegenerateEdges::DISCARD_EXCESS);
|
|
69
|
+
graph_options_in_[2].set_degenerate_edges(DegenerateEdges::DISCARD_EXCESS);
|
|
70
|
+
graph_options_in_[2].set_sibling_pairs(SiblingPairs::DISCARD_EXCESS);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const vector<Graph>& ClosedSetNormalizer::Run(
|
|
74
|
+
const vector<Graph>& g, S2Error* error) {
|
|
75
|
+
// Ensure that the input graphs were built with our requested options.
|
|
76
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
77
|
+
S2_DCHECK(g[dim].options() == graph_options_in_[dim]);
|
|
78
|
+
}
|
|
79
|
+
if (options_.suppress_lower_dimensions()) {
|
|
80
|
+
// Build the auxiliary data needed to suppress lower-dimensional edges.
|
|
81
|
+
in_edges2_ = g[2].GetInEdgeIds();
|
|
82
|
+
is_suppressed_.resize(g[0].vertices().size());
|
|
83
|
+
for (int dim = 1; dim <= 2; ++dim) {
|
|
84
|
+
for (int e = 0; e < g[dim].num_edges(); ++e) {
|
|
85
|
+
Edge edge = g[dim].edge(e);
|
|
86
|
+
if (edge.first != edge.second) {
|
|
87
|
+
is_suppressed_[edge.first] = true;
|
|
88
|
+
is_suppressed_[edge.second] = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Compute the edges that belong in the output graphs.
|
|
95
|
+
NormalizeEdges(g, error);
|
|
96
|
+
|
|
97
|
+
// If any edges were added or removed, we need to run Graph::ProcessEdges to
|
|
98
|
+
// ensure that the edges satisfy the requested GraphOptions. Note that
|
|
99
|
+
// since edges are never added to dimension 2, we can use the edge count to
|
|
100
|
+
// test whether any edges were removed. If no edges were removed from
|
|
101
|
+
// dimension 2, then no edges were added to dimension 1, and so we can again
|
|
102
|
+
// use the edge count to test whether any edges were removed, etc.
|
|
103
|
+
bool modified[3];
|
|
104
|
+
bool any_modified = false;
|
|
105
|
+
for (int dim = 2; dim >= 0; --dim) {
|
|
106
|
+
if (new_edges_[dim].size() != g[dim].num_edges()) any_modified = true;
|
|
107
|
+
modified[dim] = any_modified;
|
|
108
|
+
}
|
|
109
|
+
if (!any_modified) {
|
|
110
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
111
|
+
// Copy the graphs to ensure that they have the GraphOptions that were
|
|
112
|
+
// originally requested.
|
|
113
|
+
new_graphs_.push_back(Graph(
|
|
114
|
+
graph_options_out_[dim], &g[dim].vertices(), &g[dim].edges(),
|
|
115
|
+
&g[dim].input_edge_id_set_ids(), &g[dim].input_edge_id_set_lexicon(),
|
|
116
|
+
&g[dim].label_set_ids(), &g[dim].label_set_lexicon(),
|
|
117
|
+
g[dim].is_full_polygon_predicate()));
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
// Make a copy of input_edge_id_set_lexicon() so that ProcessEdges can
|
|
121
|
+
// merge edges if necessary.
|
|
122
|
+
new_input_edge_id_set_lexicon_ = g[0].input_edge_id_set_lexicon();
|
|
123
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
124
|
+
if (modified[dim]) {
|
|
125
|
+
Graph::ProcessEdges(&graph_options_out_[dim], &new_edges_[dim],
|
|
126
|
+
&new_input_edge_ids_[dim],
|
|
127
|
+
&new_input_edge_id_set_lexicon_, error);
|
|
128
|
+
}
|
|
129
|
+
new_graphs_.push_back(Graph(
|
|
130
|
+
graph_options_out_[dim], &g[dim].vertices(), &new_edges_[dim],
|
|
131
|
+
&new_input_edge_ids_[dim], &new_input_edge_id_set_lexicon_,
|
|
132
|
+
&g[dim].label_set_ids(), &g[dim].label_set_lexicon(),
|
|
133
|
+
g[dim].is_full_polygon_predicate()));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return new_graphs_;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Helper function that advances to the next edge in the given graph,
|
|
140
|
+
// returning a sentinel value once all edges are exhausted.
|
|
141
|
+
inline Edge ClosedSetNormalizer::Advance(const Graph& g, EdgeId* e) const {
|
|
142
|
+
return (++*e == g.num_edges()) ? sentinel_ : g.edge(*e);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Helper function that advances to the next incoming edge in the given graph,
|
|
146
|
+
// returning a sentinel value once all edges are exhausted.
|
|
147
|
+
inline Edge ClosedSetNormalizer::AdvanceIncoming(
|
|
148
|
+
const Graph& g, const vector<EdgeId>& in_edges, int* i) const {
|
|
149
|
+
return ((++*i == in_edges.size()) ? sentinel_ :
|
|
150
|
+
Graph::reverse(g.edge(in_edges[*i])));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
void ClosedSetNormalizer::NormalizeEdges(const vector<Graph>& g,
|
|
154
|
+
S2Error* error) {
|
|
155
|
+
// Find the degenerate polygon edges and sibling pairs, and classify each
|
|
156
|
+
// edge as belonging to either a shell or a hole.
|
|
157
|
+
auto degeneracies = FindPolygonDegeneracies(g[2], error);
|
|
158
|
+
auto degeneracy = degeneracies.begin();
|
|
159
|
+
|
|
160
|
+
// Walk through the three edge vectors performing a merge join. We also
|
|
161
|
+
// maintain positions in two other auxiliary vectors: the vector of sorted
|
|
162
|
+
// polygon degeneracies (degeneracies), and the vector of incoming polygon
|
|
163
|
+
// edges (if we are suppressing lower-dimensional duplicate edges).
|
|
164
|
+
EdgeId e0 = -1, e1 = -1, e2 = -1; // Current position in g[dim].edges()
|
|
165
|
+
int in_e2 = -1; // Current position in in_edges2_
|
|
166
|
+
Edge edge0 = Advance(g[0], &e0);
|
|
167
|
+
Edge edge1 = Advance(g[1], &e1);
|
|
168
|
+
Edge edge2 = Advance(g[2], &e2);
|
|
169
|
+
Edge in_edge2 = AdvanceIncoming(g[2], in_edges2_, &in_e2);
|
|
170
|
+
for (;;) {
|
|
171
|
+
if (edge2 <= edge1 && edge2 <= edge0) {
|
|
172
|
+
if (edge2 == sentinel_) break;
|
|
173
|
+
if (degeneracy == degeneracies.end() || degeneracy->edge_id != e2) {
|
|
174
|
+
// Normal polygon edge (not part of a degeneracy).
|
|
175
|
+
AddEdge(2, g[2], e2);
|
|
176
|
+
while (options_.suppress_lower_dimensions() && edge1 == edge2) {
|
|
177
|
+
edge1 = Advance(g[1], &e1);
|
|
178
|
+
}
|
|
179
|
+
} else if (!(degeneracy++)->is_hole) {
|
|
180
|
+
// Edge belongs to a degenerate shell.
|
|
181
|
+
if (edge2.first != edge2.second) {
|
|
182
|
+
AddEdge(1, g[2], e2);
|
|
183
|
+
// Since this edge was demoted, make sure that it does not suppress
|
|
184
|
+
// any coincident polyline edge(s).
|
|
185
|
+
while (edge1 == edge2) {
|
|
186
|
+
AddEdge(1, g[1], e1);
|
|
187
|
+
edge1 = Advance(g[1], &e1);
|
|
188
|
+
}
|
|
189
|
+
} else {
|
|
190
|
+
// The test below is necessary because a single-vertex polygon shell
|
|
191
|
+
// can be discarded by a polyline edge incident to that vertex.
|
|
192
|
+
if (!is_suppressed(edge2.first)) AddEdge(0, g[2], e2);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
edge2 = Advance(g[2], &e2);
|
|
196
|
+
} else if (edge1 <= edge0) {
|
|
197
|
+
if (edge1.first != edge1.second) {
|
|
198
|
+
// Non-degenerate polyline edge. (Note that in_edges2_ is empty
|
|
199
|
+
// whenever "suppress_lower_dimensions" is false.)
|
|
200
|
+
while (in_edge2 < edge1) {
|
|
201
|
+
in_edge2 = AdvanceIncoming(g[2], in_edges2_, &in_e2);
|
|
202
|
+
}
|
|
203
|
+
if (edge1 != in_edge2) AddEdge(1, g[1], e1);
|
|
204
|
+
} else {
|
|
205
|
+
// Degenerate polyline edge.
|
|
206
|
+
if (!is_suppressed(edge1.first)) AddEdge(0, g[1], e1);
|
|
207
|
+
if (g[1].options().edge_type() == EdgeType::UNDIRECTED) ++e1;
|
|
208
|
+
}
|
|
209
|
+
edge1 = Advance(g[1], &e1);
|
|
210
|
+
} else {
|
|
211
|
+
// Input point.
|
|
212
|
+
if (!is_suppressed(edge0.first)) AddEdge(0, g[0], e0);
|
|
213
|
+
edge0 = Advance(g[0], &e0);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
inline void ClosedSetNormalizer::AddEdge(int new_dim, const Graph& g,
|
|
219
|
+
EdgeId e) {
|
|
220
|
+
new_edges_[new_dim].push_back(g.edge(e));
|
|
221
|
+
new_input_edge_ids_[new_dim].push_back(g.input_edge_id_set_id(e));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
inline bool ClosedSetNormalizer::is_suppressed(VertexId v) const {
|
|
225
|
+
return options_.suppress_lower_dimensions() && is_suppressed_[v];
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// This method implements the NormalizeClosedSet function. The Create()
|
|
229
|
+
// method allocates a single object of this class whose ownership is shared
|
|
230
|
+
// (using shared_ptr) among the three returned S2Builder::Layers. Here is how
|
|
231
|
+
// the process works:
|
|
232
|
+
//
|
|
233
|
+
// - The returned layers are passed to a class (such as S2Builder or
|
|
234
|
+
// S2BooleanOperation) that calls their Build methods. We call these the
|
|
235
|
+
// "input layers" because they provide the input to ClosedSetNormalizer.
|
|
236
|
+
//
|
|
237
|
+
// - When Build() is called on the first two layers, pointers to the
|
|
238
|
+
// corresponding Graph arguments are saved.
|
|
239
|
+
//
|
|
240
|
+
// - When Build() is called on the third layer, ClosedSetNormalizer is used
|
|
241
|
+
// to normalize the graphs, and then the Build() method of each of the
|
|
242
|
+
// three output layers is called.
|
|
243
|
+
//
|
|
244
|
+
// TODO(ericv): Consider generalizing this technique as a public class.
|
|
245
|
+
class NormalizeClosedSetImpl {
|
|
246
|
+
public:
|
|
247
|
+
static LayerVector Create(LayerVector output_layers,
|
|
248
|
+
const ClosedSetNormalizer::Options& options) {
|
|
249
|
+
using Impl = NormalizeClosedSetImpl;
|
|
250
|
+
shared_ptr<Impl> impl(new Impl(std::move(output_layers), options));
|
|
251
|
+
LayerVector result;
|
|
252
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
253
|
+
result.push_back(make_unique<DimensionLayer>(
|
|
254
|
+
dim, impl->normalizer_.graph_options()[dim], impl));
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private:
|
|
260
|
+
NormalizeClosedSetImpl(LayerVector output_layers,
|
|
261
|
+
const ClosedSetNormalizer::Options& options)
|
|
262
|
+
: output_layers_(std::move(output_layers)),
|
|
263
|
+
normalizer_(options, vector<GraphOptions>{
|
|
264
|
+
output_layers_[0]->graph_options(),
|
|
265
|
+
output_layers_[1]->graph_options(),
|
|
266
|
+
output_layers_[2]->graph_options()}),
|
|
267
|
+
graphs_(3), graphs_left_(3) {
|
|
268
|
+
S2_DCHECK_EQ(3, output_layers_.size());
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
class DimensionLayer : public S2Builder::Layer {
|
|
272
|
+
public:
|
|
273
|
+
DimensionLayer(int dimension, const GraphOptions& graph_options,
|
|
274
|
+
shared_ptr<NormalizeClosedSetImpl> impl)
|
|
275
|
+
: dimension_(dimension), graph_options_(graph_options),
|
|
276
|
+
impl_(std::move(impl)) {}
|
|
277
|
+
|
|
278
|
+
GraphOptions graph_options() const override { return graph_options_; }
|
|
279
|
+
|
|
280
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
281
|
+
impl_->Build(dimension_, g, error);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
private:
|
|
285
|
+
int dimension_;
|
|
286
|
+
GraphOptions graph_options_;
|
|
287
|
+
shared_ptr<NormalizeClosedSetImpl> impl_;
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
void Build(int dimension, const Graph& g, S2Error* error) {
|
|
291
|
+
// Errors are reported only on the last layer built.
|
|
292
|
+
graphs_[dimension] = g;
|
|
293
|
+
if (--graphs_left_ > 0) return;
|
|
294
|
+
|
|
295
|
+
vector<Graph> output = normalizer_.Run(graphs_, error);
|
|
296
|
+
for (int dim = 0; dim < 3; ++dim) {
|
|
297
|
+
output_layers_[dim]->Build(output[dim], error);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private:
|
|
302
|
+
vector<unique_ptr<S2Builder::Layer>> output_layers_;
|
|
303
|
+
ClosedSetNormalizer normalizer_;
|
|
304
|
+
vector<Graph> graphs_;
|
|
305
|
+
int graphs_left_;
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
LayerVector NormalizeClosedSet(LayerVector output_layers,
|
|
309
|
+
const ClosedSetNormalizer::Options& options) {
|
|
310
|
+
return NormalizeClosedSetImpl::Create(std::move(output_layers), options);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
} // namespace s2builderutil
|
|
@@ -0,0 +1,221 @@
|
|
|
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_S2BUILDERUTIL_CLOSED_SET_NORMALIZER_H_
|
|
19
|
+
#define S2_S2BUILDERUTIL_CLOSED_SET_NORMALIZER_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/id_set_lexicon.h"
|
|
23
|
+
#include "s2/s2builder_graph.h"
|
|
24
|
+
#include "s2/s2builderutil_find_polygon_degeneracies.h"
|
|
25
|
+
|
|
26
|
+
namespace s2builderutil {
|
|
27
|
+
|
|
28
|
+
// The purpose of this class is to allow S2Builder::Layer implementations to
|
|
29
|
+
// remove polygon and polyline degeneracies by converting them to polylines or
|
|
30
|
+
// points. Note that most clients should not use ClosedSetNormalizer itself,
|
|
31
|
+
// but should instead call NormalizeClosedSet defined below.
|
|
32
|
+
//
|
|
33
|
+
// A polyline degeneracy is a polyline consisting of a single degenerate edge.
|
|
34
|
+
// A polygon degeneracy is either a single-vertex loop (a degenerate edge from
|
|
35
|
+
// a vertex to itself) or a sibling edge pair (consisting of an edge and its
|
|
36
|
+
// corresponding reverse edge). Polygon degeneracies are further classified
|
|
37
|
+
// as shells or holes depending on whether they are located in the exterior or
|
|
38
|
+
// interior of the polygon respectively. For example, a single-vertex loop
|
|
39
|
+
// contained within a polygon shell would be classified as a hole.
|
|
40
|
+
//
|
|
41
|
+
// All objects are modeled as closed, i.e. polygons contain their boundaries
|
|
42
|
+
// and polylines contain their endpoints. Note that under this model,
|
|
43
|
+
// degenerate polygon shells and holes need to be handled differently.
|
|
44
|
+
// Degenerate shells are converted to polylines or points, whereas degenerate
|
|
45
|
+
// holes do not affect the set of points contained by the polygon and are
|
|
46
|
+
// simply discarded.
|
|
47
|
+
//
|
|
48
|
+
// Specifically, given three S2Builder::Graphs (corresponding to points,
|
|
49
|
+
// polylines, and polygons), this class makes the following transformations:
|
|
50
|
+
//
|
|
51
|
+
// - Polygon sibling edge pairs are either discarded (for holes) or converted
|
|
52
|
+
// to a pair of polyline edges (for shells).
|
|
53
|
+
// - Degenerate polygon edges are either discarded (for holes) or converted
|
|
54
|
+
// to points (for shells).
|
|
55
|
+
// - Degenerate polyline edges are converted to points.
|
|
56
|
+
//
|
|
57
|
+
// Optionally, this class further normalize the graphs by suppressing edges
|
|
58
|
+
// that are duplicates of higher-dimensional edges. In other words:
|
|
59
|
+
//
|
|
60
|
+
// - Polyline edges that coincide with polygon edges are discarded.
|
|
61
|
+
// - Points that coincide with polyline or polygon vertices are discarded.
|
|
62
|
+
//
|
|
63
|
+
// (When edges are discarded, any labels attached to those edges are discarded
|
|
64
|
+
// as well.)
|
|
65
|
+
//
|
|
66
|
+
// This class takes three graphs as input and yields three graphs as output.
|
|
67
|
+
// However note that the output graphs are *not* independent objects; they may
|
|
68
|
+
// point to data in the input graphs or data owned by the ClosedSetNormalizer
|
|
69
|
+
// itself. For this reason the input graphs and ClosedSetNormalizer must
|
|
70
|
+
// persist until the output graphs are no longer needed.
|
|
71
|
+
//
|
|
72
|
+
// Finally, note that although this class may be necessary in some situations
|
|
73
|
+
// (e.g., to implement the OGC Simple Features Access spec), in general the
|
|
74
|
+
// recommended approach to degeneracies is simply to keep them (by using a
|
|
75
|
+
// representation such as S2LaxPolygonShape or S2LaxPolylineShape).
|
|
76
|
+
// Keeping degeneracies has many advantages, such as not needing to deal with
|
|
77
|
+
// geometry of multiple dimensions, and being able to preserve polygon
|
|
78
|
+
// boundaries accurately (including degenerate holes).
|
|
79
|
+
class ClosedSetNormalizer {
|
|
80
|
+
public:
|
|
81
|
+
class Options {
|
|
82
|
+
public:
|
|
83
|
+
Options();
|
|
84
|
+
|
|
85
|
+
// If "suppress_lower_dimensions" is true, then the graphs are further
|
|
86
|
+
// normalized by discarding lower-dimensional edges that coincide with
|
|
87
|
+
// higher-dimensional edges.
|
|
88
|
+
//
|
|
89
|
+
// DEFAULT: true
|
|
90
|
+
bool suppress_lower_dimensions() const;
|
|
91
|
+
void set_suppress_lower_dimensions(bool suppress_lower_dimensions);
|
|
92
|
+
|
|
93
|
+
private:
|
|
94
|
+
bool suppress_lower_dimensions_;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Constructs a ClosedSetNormalizer whose output will be three
|
|
98
|
+
// S2Builder::Graphs with the given "graph_options_out".
|
|
99
|
+
//
|
|
100
|
+
// REQUIRES: graph_options_out.size() == 3
|
|
101
|
+
// REQUIRES: graph_options_out[0].edge_type() == DIRECTED
|
|
102
|
+
// REQUIRES: graph_options_out[1].sibling_pairs() != {CREATE, REQUIRE}
|
|
103
|
+
// REQUIRES: graph_options_out[2].edge_type() == DIRECTED
|
|
104
|
+
ClosedSetNormalizer(
|
|
105
|
+
const Options& options,
|
|
106
|
+
const std::vector<S2Builder::GraphOptions>& graph_options_out);
|
|
107
|
+
|
|
108
|
+
// Returns the ClosedSetNormalizer options.
|
|
109
|
+
const Options& options() const { return options_; }
|
|
110
|
+
|
|
111
|
+
// Returns the GraphOptions that should be used to construct the input
|
|
112
|
+
// S2Builder::Graph of each dimension.
|
|
113
|
+
inline const std::vector<S2Builder::GraphOptions>& graph_options() const;
|
|
114
|
+
|
|
115
|
+
// Normalizes the input graphs and returns a new set of graphs where
|
|
116
|
+
// degeneracies have been discarded or converted to objects of lower
|
|
117
|
+
// dimension. input[d] is the graph representing edges of dimension "d".
|
|
118
|
+
//
|
|
119
|
+
// Note that the input graphs, their contents, and the ClosedSetNormalizer
|
|
120
|
+
// itself must persist until the output of this class is no longer needed.
|
|
121
|
+
// (To emphasize this requirement, a const reference is returned.)
|
|
122
|
+
const std::vector<S2Builder::Graph>& Run(
|
|
123
|
+
const std::vector<S2Builder::Graph>& input, S2Error* error);
|
|
124
|
+
|
|
125
|
+
private:
|
|
126
|
+
S2Builder::Graph::Edge Advance(
|
|
127
|
+
const S2Builder::Graph& g, S2Builder::Graph::EdgeId* id) const;
|
|
128
|
+
S2Builder::Graph::Edge AdvanceIncoming(
|
|
129
|
+
const S2Builder::Graph& g,
|
|
130
|
+
const std::vector<S2Builder::Graph::EdgeId>& in_edges, int* i) const;
|
|
131
|
+
void NormalizeEdges(const std::vector<S2Builder::Graph>& g, S2Error* error);
|
|
132
|
+
void AddEdge(int new_dim, const S2Builder::Graph& g,
|
|
133
|
+
S2Builder::Graph::EdgeId e);
|
|
134
|
+
bool is_suppressed(S2Builder::Graph::VertexId v) const;
|
|
135
|
+
|
|
136
|
+
Options options_;
|
|
137
|
+
|
|
138
|
+
// Requested options for the output graphs.
|
|
139
|
+
std::vector<S2Builder::GraphOptions> graph_options_out_;
|
|
140
|
+
|
|
141
|
+
// Options to be used to construct the input graphs.
|
|
142
|
+
std::vector<S2Builder::GraphOptions> graph_options_in_;
|
|
143
|
+
|
|
144
|
+
// A sentinel value that compares larger than any valid edge.
|
|
145
|
+
const S2Builder::Graph::Edge sentinel_;
|
|
146
|
+
|
|
147
|
+
// is_suppressed_[i] is true if vertex[i] belongs to a non-degenerate edge,
|
|
148
|
+
// and therefore should be suppressed from the output graph for points.
|
|
149
|
+
std::vector<bool> is_suppressed_;
|
|
150
|
+
|
|
151
|
+
// A vector of incoming polygon edges sorted in lexicographic order. This
|
|
152
|
+
// is used to suppress directed polyline edges that match a polygon edge in
|
|
153
|
+
// the reverse direction.
|
|
154
|
+
std::vector<S2Builder::Graph::EdgeId> in_edges2_;
|
|
155
|
+
|
|
156
|
+
// Output data.
|
|
157
|
+
std::vector<S2Builder::Graph> new_graphs_;
|
|
158
|
+
std::vector<S2Builder::Graph::Edge> new_edges_[3];
|
|
159
|
+
std::vector<S2Builder::Graph::InputEdgeIdSetId> new_input_edge_ids_[3];
|
|
160
|
+
IdSetLexicon new_input_edge_id_set_lexicon_;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// A LayerVector represents a set of layers that comprise a single object.
|
|
164
|
+
// Such objects are typically assembled by gathering the S2Builder::Graphs
|
|
165
|
+
// from all of the individual layers and processing them all at once.
|
|
166
|
+
using LayerVector = std::vector<std::unique_ptr<S2Builder::Layer>>;
|
|
167
|
+
|
|
168
|
+
// Given a set of three output layers (one each for dimensions 0, 1, and 2),
|
|
169
|
+
// returns a new set of layers that preprocess the input graphs using a
|
|
170
|
+
// ClosedSetNormalizer with the given options. This can be used to ensure
|
|
171
|
+
// that the graphs passed to "output_layers" do not contain any polyline or
|
|
172
|
+
// polygon degeneracies.
|
|
173
|
+
//
|
|
174
|
+
// Example showing how to compute the union of two S2ShapeIndexes containing
|
|
175
|
+
// points, polylines, and/or polygons, and save the result as a collection of
|
|
176
|
+
// S2Points, S2Polylines, and S2Polygons in another S2ShapeIndex (where
|
|
177
|
+
// degeneracies have been normalized to objects of lower dimension, and
|
|
178
|
+
// maximal polylines are constructed from undirected edges):
|
|
179
|
+
//
|
|
180
|
+
// bool ComputeUnion(const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
181
|
+
// MutableS2ShapeIndex* index, S2Error* error) {
|
|
182
|
+
// IndexedS2PolylineVectorLayer::Options polyline_options;
|
|
183
|
+
// polyline_options.set_edge_type(EdgeType::UNDIRECTED);
|
|
184
|
+
// polyline_options.set_polyline_type(Graph::PolylineType::WALK);
|
|
185
|
+
// polyline_options.set_duplicate_edges(DuplicateEdges::MERGE);
|
|
186
|
+
// LayerVector layers(3);
|
|
187
|
+
// layers[0] = absl::make_unique<IndexedS2PointVectorLayer>(index);
|
|
188
|
+
// layers[1] = absl::make_unique<IndexedS2PolylineVectorLayer>(
|
|
189
|
+
// index, polyline_options);
|
|
190
|
+
// layers[2] = absl::make_unique<IndexedS2PolygonLayer>(index);
|
|
191
|
+
// S2BooleanOperation op(S2BooleanOperation::OpType::UNION,
|
|
192
|
+
// NormalizeClosedSet(std::move(layers)));
|
|
193
|
+
// return op.Build(a, b, error);
|
|
194
|
+
// }
|
|
195
|
+
LayerVector NormalizeClosedSet(LayerVector output_layers,
|
|
196
|
+
const ClosedSetNormalizer::Options& options =
|
|
197
|
+
ClosedSetNormalizer::Options());
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
////////////////// Implementation details follow ////////////////////
|
|
201
|
+
|
|
202
|
+
inline ClosedSetNormalizer::Options::Options()
|
|
203
|
+
: suppress_lower_dimensions_(true) {}
|
|
204
|
+
|
|
205
|
+
inline bool ClosedSetNormalizer::Options::suppress_lower_dimensions() const {
|
|
206
|
+
return suppress_lower_dimensions_;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
inline void ClosedSetNormalizer::Options::set_suppress_lower_dimensions(
|
|
210
|
+
bool suppress_lower_dimensions) {
|
|
211
|
+
suppress_lower_dimensions_ = suppress_lower_dimensions;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline const std::vector<S2Builder::GraphOptions>&
|
|
215
|
+
ClosedSetNormalizer::graph_options() const {
|
|
216
|
+
return graph_options_in_;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
} // namespace s2builderutil
|
|
220
|
+
|
|
221
|
+
#endif // S2_S2BUILDERUTIL_CLOSED_SET_NORMALIZER_H_
|