@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,218 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// Note that there are two supported output types for polygons: S2Polygon and
|
|
19
|
+
// S2LaxPolygonShape. Use S2Polygon if you need the full range of operations
|
|
20
|
+
// that S2Polygon implements. Use S2LaxPolygonShape if you want to represent
|
|
21
|
+
// polygons with zero-area degenerate regions, or if you need a type that has
|
|
22
|
+
// low memory overhead and fast initialization. However, be aware that to
|
|
23
|
+
// convert from S2LaxPolygonShape to S2Polygon you will need to use S2Builder
|
|
24
|
+
// again.
|
|
25
|
+
//
|
|
26
|
+
// Similarly, there are two supported output formats for polygon meshes:
|
|
27
|
+
// S2PolygonMesh and S2LaxPolygonShapeVector. Use S2PolygonMesh if you need
|
|
28
|
+
// to be able to determine which polygons are adjacent to each edge or vertex;
|
|
29
|
+
// otherwise use S2LaxPolygonShapeVector, which uses less memory and is faster
|
|
30
|
+
// to construct.
|
|
31
|
+
|
|
32
|
+
#ifndef S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
|
|
33
|
+
#define S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
|
|
34
|
+
|
|
35
|
+
#include <memory>
|
|
36
|
+
#include <vector>
|
|
37
|
+
#include "s2/base/logging.h"
|
|
38
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
39
|
+
#include "s2/id_set_lexicon.h"
|
|
40
|
+
#include "s2/mutable_s2shape_index.h"
|
|
41
|
+
#include "s2/s2builder.h"
|
|
42
|
+
#include "s2/s2builder_graph.h"
|
|
43
|
+
#include "s2/s2builder_layer.h"
|
|
44
|
+
#include "s2/s2error.h"
|
|
45
|
+
#include "s2/s2lax_polygon_shape.h"
|
|
46
|
+
|
|
47
|
+
namespace s2builderutil {
|
|
48
|
+
|
|
49
|
+
// A layer type that assembles edges (directed or undirected) into an
|
|
50
|
+
// S2LaxPolygonShape. Returns an error if the edges cannot be assembled into
|
|
51
|
+
// loops.
|
|
52
|
+
//
|
|
53
|
+
// If the input edges are directed, they must be oriented such that the
|
|
54
|
+
// polygon interior is to the left of all edges. Directed edges are always
|
|
55
|
+
// preferred (see S2Builder::EdgeType).
|
|
56
|
+
//
|
|
57
|
+
// LaxPolygonLayer is implemented such that if the input to S2Builder is a
|
|
58
|
+
// polygon and is not modified, then the output has the same cyclic ordering
|
|
59
|
+
// of loop vertices and the same loop ordering as the input polygon.
|
|
60
|
+
//
|
|
61
|
+
// If the given edge graph is degenerate (i.e., it consists entirely of
|
|
62
|
+
// degenerate edges and sibling pairs), then the IsFullPolygonPredicate
|
|
63
|
+
// associated with the edge graph is called to determine whether the output
|
|
64
|
+
// polygon should be empty (possibly with degenerate shells) or full (possibly
|
|
65
|
+
// with degenerate holes). This predicate can be specified as part of the
|
|
66
|
+
// S2Builder input geometry.
|
|
67
|
+
class LaxPolygonLayer : public S2Builder::Layer {
|
|
68
|
+
public:
|
|
69
|
+
class Options {
|
|
70
|
+
public:
|
|
71
|
+
// Constructor that uses the default options (listed below).
|
|
72
|
+
Options();
|
|
73
|
+
|
|
74
|
+
// Constructor that specifies the edge type.
|
|
75
|
+
explicit Options(S2Builder::EdgeType edge_type);
|
|
76
|
+
|
|
77
|
+
// Indicates whether the input edges provided to S2Builder are directed or
|
|
78
|
+
// undirected. Directed edges should be used whenever possible (see
|
|
79
|
+
// S2Builder::EdgeType for details).
|
|
80
|
+
//
|
|
81
|
+
// If the input edges are directed, they should be oriented so that the
|
|
82
|
+
// polygon interior is to the left of all edges. This means that for a
|
|
83
|
+
// polygon with holes, the outer loops ("shells") should be directed
|
|
84
|
+
// counter-clockwise while the inner loops ("holes") should be directed
|
|
85
|
+
// clockwise. Note that S2Builder::AddPolygon() does this automatically.
|
|
86
|
+
//
|
|
87
|
+
// DEFAULT: S2Builder::EdgeType::DIRECTED
|
|
88
|
+
S2Builder::EdgeType edge_type() const;
|
|
89
|
+
void set_edge_type(S2Builder::EdgeType edge_type);
|
|
90
|
+
|
|
91
|
+
// Specifies whether degenerate boundaries should be discarded or kept.
|
|
92
|
+
// (A degenerate boundary consists of either a sibling edge pair or an
|
|
93
|
+
// edge from a vertex to itself.) Optionally, degenerate boundaries may
|
|
94
|
+
// be kept only if they represent shells, or only if they represent holes.
|
|
95
|
+
//
|
|
96
|
+
// This option is useful for normalizing polygons with various boundary
|
|
97
|
+
// conditions. For example, DISCARD_HOLES can be used to normalize closed
|
|
98
|
+
// polygons (those that include their boundary), since degenerate holes do
|
|
99
|
+
// not affect the set of points contained by such polygons. Similarly,
|
|
100
|
+
// DISCARD_SHELLS can be used to normalize polygons with open boundaries.
|
|
101
|
+
// DISCARD is used to normalize polygons with semi-open boundaries (since
|
|
102
|
+
// degenerate loops do not affect point containment in that case), and
|
|
103
|
+
// finally KEEP is useful for working with any type of polygon where
|
|
104
|
+
// degeneracies are assumed to contain an infinitesmal interior. (This
|
|
105
|
+
// last model is the most useful for working with simplified geometry,
|
|
106
|
+
// since it maintains the closest fidelity to the original geometry.)
|
|
107
|
+
//
|
|
108
|
+
// DEFAULT: DegenerateBoundaries::KEEP
|
|
109
|
+
enum class DegenerateBoundaries {
|
|
110
|
+
DISCARD, DISCARD_HOLES, DISCARD_SHELLS, KEEP
|
|
111
|
+
};
|
|
112
|
+
DegenerateBoundaries degenerate_boundaries() const;
|
|
113
|
+
void set_degenerate_boundaries(DegenerateBoundaries degenerate_boundaries);
|
|
114
|
+
|
|
115
|
+
private:
|
|
116
|
+
S2Builder::EdgeType edge_type_;
|
|
117
|
+
DegenerateBoundaries degenerate_boundaries_;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Specifies that a polygon should be constructed using the given options.
|
|
121
|
+
explicit LaxPolygonLayer(S2LaxPolygonShape* polygon,
|
|
122
|
+
const Options& options = Options());
|
|
123
|
+
|
|
124
|
+
// Specifies that a polygon should be constructed using the given options,
|
|
125
|
+
// and that any labels attached to the input edges should be returned in
|
|
126
|
+
// "label_set_ids" and "label_set_lexicion".
|
|
127
|
+
//
|
|
128
|
+
// The labels associated with the edge "polygon.chain_edge(i, j)"
|
|
129
|
+
// can be retrieved as follows:
|
|
130
|
+
//
|
|
131
|
+
// for (int32 label : label_set_lexicon.id_set(label_set_ids[i][j])) {...}
|
|
132
|
+
using LabelSetIds = std::vector<std::vector<LabelSetId>>;
|
|
133
|
+
LaxPolygonLayer(S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
|
|
134
|
+
IdSetLexicon* label_set_lexicon,
|
|
135
|
+
const Options& options = Options());
|
|
136
|
+
|
|
137
|
+
// Layer interface:
|
|
138
|
+
GraphOptions graph_options() const override;
|
|
139
|
+
void Build(const Graph& g, S2Error* error) override;
|
|
140
|
+
|
|
141
|
+
private:
|
|
142
|
+
void Init(S2LaxPolygonShape* polygon, LabelSetIds* label_set_ids,
|
|
143
|
+
IdSetLexicon* label_set_lexicon, const Options& options);
|
|
144
|
+
void AppendPolygonLoops(const Graph& g,
|
|
145
|
+
const std::vector<Graph::EdgeLoop>& edge_loops,
|
|
146
|
+
std::vector<std::vector<S2Point>>* loops) const;
|
|
147
|
+
void AppendEdgeLabels(const Graph& g,
|
|
148
|
+
const std::vector<Graph::EdgeLoop>& edge_loops);
|
|
149
|
+
void BuildDirected(Graph g, S2Error* error);
|
|
150
|
+
|
|
151
|
+
S2LaxPolygonShape* polygon_;
|
|
152
|
+
LabelSetIds* label_set_ids_;
|
|
153
|
+
IdSetLexicon* label_set_lexicon_;
|
|
154
|
+
Options options_;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// Like LaxPolygonLayer, but adds the polygon to a MutableS2ShapeIndex (if the
|
|
158
|
+
// polygon is non-empty).
|
|
159
|
+
class IndexedLaxPolygonLayer : public S2Builder::Layer {
|
|
160
|
+
public:
|
|
161
|
+
using Options = LaxPolygonLayer::Options;
|
|
162
|
+
explicit IndexedLaxPolygonLayer(MutableS2ShapeIndex* index,
|
|
163
|
+
const Options& options = Options())
|
|
164
|
+
: index_(index), polygon_(new S2LaxPolygonShape),
|
|
165
|
+
layer_(polygon_.get(), options) {}
|
|
166
|
+
|
|
167
|
+
GraphOptions graph_options() const override {
|
|
168
|
+
return layer_.graph_options();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
172
|
+
layer_.Build(g, error);
|
|
173
|
+
if (error->ok() && !polygon_->is_empty()) {
|
|
174
|
+
index_->Add(std::move(polygon_));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private:
|
|
179
|
+
MutableS2ShapeIndex* index_;
|
|
180
|
+
std::unique_ptr<S2LaxPolygonShape> polygon_;
|
|
181
|
+
LaxPolygonLayer layer_;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
////////////////// Implementation details follow ////////////////////
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
inline LaxPolygonLayer::Options::Options()
|
|
189
|
+
: Options(S2Builder::EdgeType::DIRECTED) {
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
inline LaxPolygonLayer::Options::Options(S2Builder::EdgeType edge_type)
|
|
193
|
+
: edge_type_(edge_type),
|
|
194
|
+
degenerate_boundaries_(DegenerateBoundaries::KEEP) {
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
inline S2Builder::EdgeType LaxPolygonLayer::Options::edge_type() const {
|
|
198
|
+
return edge_type_;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
inline void LaxPolygonLayer::Options::set_edge_type(
|
|
202
|
+
S2Builder::EdgeType edge_type) {
|
|
203
|
+
edge_type_ = edge_type;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
inline LaxPolygonLayer::Options::DegenerateBoundaries
|
|
207
|
+
LaxPolygonLayer::Options::degenerate_boundaries() const {
|
|
208
|
+
return degenerate_boundaries_;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
inline void LaxPolygonLayer::Options::set_degenerate_boundaries(
|
|
212
|
+
DegenerateBoundaries degenerate_boundaries) {
|
|
213
|
+
degenerate_boundaries_ = degenerate_boundaries;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
} // namespace s2builderutil
|
|
217
|
+
|
|
218
|
+
#endif // S2_S2BUILDERUTIL_LAX_POLYGON_LAYER_H_
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2builderutil_lax_polygon_layer.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <map>
|
|
22
|
+
#include <memory>
|
|
23
|
+
#include <set>
|
|
24
|
+
#include <string>
|
|
25
|
+
#include <gtest/gtest.h>
|
|
26
|
+
#include "s2/base/integral_types.h"
|
|
27
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
28
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
29
|
+
#include "s2/mutable_s2shape_index.h"
|
|
30
|
+
#include "s2/s2debug.h"
|
|
31
|
+
#include "s2/s2text_format.h"
|
|
32
|
+
|
|
33
|
+
using absl::make_unique;
|
|
34
|
+
using absl::string_view;
|
|
35
|
+
using s2builderutil::IndexedLaxPolygonLayer;
|
|
36
|
+
using s2builderutil::LaxPolygonLayer;
|
|
37
|
+
using s2textformat::MakeLaxPolygonOrDie;
|
|
38
|
+
using s2textformat::MakePointOrDie;
|
|
39
|
+
using s2textformat::MakePolylineOrDie;
|
|
40
|
+
using std::map;
|
|
41
|
+
using std::set;
|
|
42
|
+
using std::vector;
|
|
43
|
+
|
|
44
|
+
using EdgeType = S2Builder::EdgeType;
|
|
45
|
+
using DegenerateBoundaries = LaxPolygonLayer::Options::DegenerateBoundaries;
|
|
46
|
+
|
|
47
|
+
namespace {
|
|
48
|
+
|
|
49
|
+
string ToString(DegenerateBoundaries degenerate_boundaries) {
|
|
50
|
+
switch (degenerate_boundaries) {
|
|
51
|
+
case DegenerateBoundaries::DISCARD: return "DISCARD";
|
|
52
|
+
case DegenerateBoundaries::DISCARD_HOLES: return "DISCARD_HOLES";
|
|
53
|
+
case DegenerateBoundaries::DISCARD_SHELLS: return "DISCARD_SHELLS";
|
|
54
|
+
case DegenerateBoundaries::KEEP: return "KEEP";
|
|
55
|
+
}
|
|
56
|
+
// Cases are exhaustive, but some compilers don't know that and emit a
|
|
57
|
+
// warning.
|
|
58
|
+
S2_LOG(FATAL) << "Unknown DegenerateBoundaries value: "
|
|
59
|
+
<< static_cast<int>(degenerate_boundaries);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
void TestLaxPolygon(string_view input_str, string_view expected_str,
|
|
63
|
+
EdgeType edge_type,
|
|
64
|
+
DegenerateBoundaries degenerate_boundaries) {
|
|
65
|
+
SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
|
|
66
|
+
SCOPED_TRACE(ToString(degenerate_boundaries));
|
|
67
|
+
S2Builder builder{S2Builder::Options()};
|
|
68
|
+
S2LaxPolygonShape output;
|
|
69
|
+
LaxPolygonLayer::Options options;
|
|
70
|
+
options.set_edge_type(edge_type);
|
|
71
|
+
options.set_degenerate_boundaries(degenerate_boundaries);
|
|
72
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
|
|
73
|
+
|
|
74
|
+
auto polygon = MakeLaxPolygonOrDie(input_str);
|
|
75
|
+
builder.AddShape(*polygon);
|
|
76
|
+
|
|
77
|
+
// In order to construct polygons that are full except possibly for a
|
|
78
|
+
// collection of degenerate holes, we must supply S2Builder with a predicate
|
|
79
|
+
// that distinguishes empty polygons from full ones (modulo degeneracies).
|
|
80
|
+
bool has_full_loop = false;
|
|
81
|
+
for (int i = 0; i < polygon->num_loops(); ++i) {
|
|
82
|
+
if (polygon->num_loop_vertices(i) == 0) has_full_loop = true;
|
|
83
|
+
}
|
|
84
|
+
builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygon(has_full_loop));
|
|
85
|
+
S2Error error;
|
|
86
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
87
|
+
string actual_str = s2textformat::ToString(output, "; ");
|
|
88
|
+
EXPECT_EQ(expected_str, actual_str);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
void TestLaxPolygon(string_view input_str,
|
|
92
|
+
string_view expected_str,
|
|
93
|
+
DegenerateBoundaries degenerate_boundaries) {
|
|
94
|
+
TestLaxPolygon(input_str, expected_str, EdgeType::DIRECTED,
|
|
95
|
+
degenerate_boundaries);
|
|
96
|
+
#if 0
|
|
97
|
+
// TODO(ericv): Implement.
|
|
98
|
+
TestLaxPolygon(input_str, expected_str, EdgeType::UNDIRECTED,
|
|
99
|
+
degenerate_boundaries);
|
|
100
|
+
#endif
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
void TestLaxPolygonUnchanged(string_view input_str,
|
|
104
|
+
DegenerateBoundaries degenerate_boundaries) {
|
|
105
|
+
TestLaxPolygon(input_str, input_str, degenerate_boundaries);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
vector<DegenerateBoundaries> kAllDegenerateBoundaries() {
|
|
109
|
+
return {DegenerateBoundaries::DISCARD, DegenerateBoundaries::DISCARD_HOLES,
|
|
110
|
+
DegenerateBoundaries::DISCARD_SHELLS, DegenerateBoundaries::KEEP};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(LaxPolygonLayer, Empty) {
|
|
114
|
+
for (auto db : kAllDegenerateBoundaries()) {
|
|
115
|
+
TestLaxPolygonUnchanged("", db);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
TEST(LaxPolygonLayer, Full) {
|
|
120
|
+
for (auto db : kAllDegenerateBoundaries()) {
|
|
121
|
+
TestLaxPolygonUnchanged("full", db);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
TEST(LaxPolygonLayer, OneNormalShell) {
|
|
126
|
+
for (auto db : kAllDegenerateBoundaries()) {
|
|
127
|
+
TestLaxPolygonUnchanged("0:0, 0:1, 1:1", db);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
TEST(LaxPolygonLayer, IsFullPolygonPredicateNotCalled) {
|
|
132
|
+
// Test that the IsFullPolygonPredicate is not called when at least one
|
|
133
|
+
// non-degenerate loop is present.
|
|
134
|
+
for (auto degenerate_boundaries : kAllDegenerateBoundaries()) {
|
|
135
|
+
S2Builder builder{S2Builder::Options()};
|
|
136
|
+
S2LaxPolygonShape output;
|
|
137
|
+
LaxPolygonLayer::Options options;
|
|
138
|
+
options.set_edge_type(EdgeType::DIRECTED);
|
|
139
|
+
options.set_degenerate_boundaries(degenerate_boundaries);
|
|
140
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
|
|
141
|
+
auto polygon = MakeLaxPolygonOrDie("0:0, 0:1, 1:1");
|
|
142
|
+
builder.AddShape(*polygon);
|
|
143
|
+
// If the predicate is called, it will return an error.
|
|
144
|
+
builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygonUnspecified);
|
|
145
|
+
S2Error error;
|
|
146
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
TEST(LaxPolygonLayer, TwoNormalShellsOneNormalHole) {
|
|
151
|
+
// The second two loops are nested. Note that S2LaxPolygon and S2Polygon
|
|
152
|
+
// require opposite vertex orderings for holes.
|
|
153
|
+
for (auto db : kAllDegenerateBoundaries()) {
|
|
154
|
+
TestLaxPolygonUnchanged("0:1, 1:1, 0:0; "
|
|
155
|
+
"3:3, 3:6, 6:6, 6:3; "
|
|
156
|
+
"4:4, 5:4, 5:5, 4:5", db);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
TEST(LaxPolygonLayer, AllDegenerateShells) {
|
|
161
|
+
for (auto db : {DegenerateBoundaries::KEEP,
|
|
162
|
+
DegenerateBoundaries::DISCARD_HOLES}) {
|
|
163
|
+
TestLaxPolygonUnchanged("1:1; 2:2, 3:3", db);
|
|
164
|
+
}
|
|
165
|
+
for (auto db : {DegenerateBoundaries::DISCARD,
|
|
166
|
+
DegenerateBoundaries::DISCARD_SHELLS}) {
|
|
167
|
+
TestLaxPolygon("1:1; 2:2, 3:3", "", db);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
TEST(LaxPolygonLayer, AllDegenerateHoles) {
|
|
172
|
+
for (auto db : {DegenerateBoundaries::KEEP,
|
|
173
|
+
DegenerateBoundaries::DISCARD_SHELLS}) {
|
|
174
|
+
TestLaxPolygonUnchanged("full; 1:1; 2:2, 3:3", db);
|
|
175
|
+
}
|
|
176
|
+
for (auto db : {DegenerateBoundaries::DISCARD,
|
|
177
|
+
DegenerateBoundaries::DISCARD_HOLES}) {
|
|
178
|
+
TestLaxPolygon("full; 1:1; 2:2, 3:3", "full", db);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
TEST(LaxPolygonLayer, SomeDegenerateShells) {
|
|
183
|
+
const string kNormal = "0:0, 0:9, 9:0; 1:1, 7:1, 1:7";
|
|
184
|
+
const string kInput = kNormal + "; 3:2; 2:2, 2:3";
|
|
185
|
+
TestLaxPolygonUnchanged(kInput, DegenerateBoundaries::KEEP);
|
|
186
|
+
TestLaxPolygonUnchanged(kInput, DegenerateBoundaries::DISCARD_HOLES);
|
|
187
|
+
TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD);
|
|
188
|
+
TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD_SHELLS);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
TEST(LaxPolygonLayer, SomeDegenerateHoles) {
|
|
192
|
+
for (auto db : {DegenerateBoundaries::KEEP,
|
|
193
|
+
DegenerateBoundaries::DISCARD_SHELLS}) {
|
|
194
|
+
TestLaxPolygonUnchanged("0:0, 0:9, 9:0; 1:1; 2:2, 3:3", db);
|
|
195
|
+
}
|
|
196
|
+
for (auto db : {DegenerateBoundaries::DISCARD,
|
|
197
|
+
DegenerateBoundaries::DISCARD_HOLES}) {
|
|
198
|
+
TestLaxPolygon("0:0, 0:9, 9:0; 1:1; 2:2, 3:3", "0:0, 0:9, 9:0", db);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
TEST(LaxPolygonLayer, NormalAndDegenerateShellsAndHoles) {
|
|
203
|
+
// We start with two normal shells and one normal hole.
|
|
204
|
+
const string kNormal = "0:0, 0:9, 9:9, 9:0; "
|
|
205
|
+
"0:10, 0:19, 9:19, 9:10; 1:11, 8:11, 8:18, 1:18";
|
|
206
|
+
// These are the same loops augmented with degenerate interior filaments
|
|
207
|
+
// (holes). Note that one filament connects the second shell and hole
|
|
208
|
+
// above, transforming them into a single loop.
|
|
209
|
+
const string kNormalWithDegenHoles =
|
|
210
|
+
"0:0, 0:9, 1:8, 1:7, 1:8, 0:9, 9:9, 9:0; "
|
|
211
|
+
"0:10, 0:19, 9:19, 9:10, 0:10, 1:11, 8:11, 8:18, 1:18, 1:11";
|
|
212
|
+
// Then we add other degenerate shells and holes, including a sibling pair
|
|
213
|
+
// that connects the two shells above.
|
|
214
|
+
const string kDegenShells = "0:9, 0:10; 2:12; 3:13, 3:14; 20:20; 10:0, 10:1";
|
|
215
|
+
const string kDegenHoles = "2:5; 3:6, 3:7; 8:8";
|
|
216
|
+
const string kInput = kNormalWithDegenHoles + "; " +
|
|
217
|
+
kDegenShells + "; " + kDegenHoles;
|
|
218
|
+
TestLaxPolygon(kInput, kNormal, DegenerateBoundaries::DISCARD);
|
|
219
|
+
TestLaxPolygon(kInput, kNormal + "; " + kDegenShells,
|
|
220
|
+
DegenerateBoundaries::DISCARD_HOLES);
|
|
221
|
+
TestLaxPolygon(kInput, kNormalWithDegenHoles + "; " + kDegenHoles,
|
|
222
|
+
DegenerateBoundaries::DISCARD_SHELLS);
|
|
223
|
+
TestLaxPolygon(kInput, kInput, DegenerateBoundaries::KEEP);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
TEST(LaxPolygonLayer, PartialLoop) {
|
|
227
|
+
S2Builder builder{S2Builder::Options()};
|
|
228
|
+
S2LaxPolygonShape output;
|
|
229
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(&output));
|
|
230
|
+
builder.AddPolyline(*MakePolylineOrDie("0:1, 2:3, 4:5"));
|
|
231
|
+
S2Error error;
|
|
232
|
+
EXPECT_FALSE(builder.Build(&error));
|
|
233
|
+
EXPECT_EQ(S2Error::BUILDER_EDGES_DO_NOT_FORM_LOOPS, error.code());
|
|
234
|
+
EXPECT_TRUE(output.is_empty());
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
#if 0
|
|
238
|
+
// TODO(ericv): Implement validation of S2LaxPolygonShape.
|
|
239
|
+
TEST(LaxPolygonLayer, InvalidPolygon) {
|
|
240
|
+
S2Builder builder{S2Builder::Options()};
|
|
241
|
+
S2LaxPolygonShape output;
|
|
242
|
+
LaxPolygonLayer::Options options;
|
|
243
|
+
options.set_validate(true);
|
|
244
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
|
|
245
|
+
builder.AddPolyline(*MakePolylineOrDie("0:0, 0:10, 10:0, 10:10, 0:0"));
|
|
246
|
+
S2Error error;
|
|
247
|
+
EXPECT_FALSE(builder.Build(&error));
|
|
248
|
+
EXPECT_EQ(S2Error::LOOP_SELF_INTERSECTION, error.code());
|
|
249
|
+
}
|
|
250
|
+
#endif
|
|
251
|
+
|
|
252
|
+
TEST(LaxPolygonLayer, DuplicateInputEdges) {
|
|
253
|
+
// Check that LaxPolygonLayer removes duplicate edges in such a way that
|
|
254
|
+
// degeneracies are not lost.
|
|
255
|
+
S2Builder builder{S2Builder::Options()};
|
|
256
|
+
S2LaxPolygonShape output;
|
|
257
|
+
LaxPolygonLayer::Options options;
|
|
258
|
+
options.set_degenerate_boundaries(DegenerateBoundaries::KEEP);
|
|
259
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(&output, options));
|
|
260
|
+
builder.AddShape(*MakeLaxPolygonOrDie("0:0, 0:5, 5:5, 5:0"));
|
|
261
|
+
builder.AddPoint(MakePointOrDie("0:0"));
|
|
262
|
+
builder.AddPoint(MakePointOrDie("1:1"));
|
|
263
|
+
builder.AddPoint(MakePointOrDie("1:1"));
|
|
264
|
+
builder.AddShape(*MakeLaxPolygonOrDie("2:2, 2:3"));
|
|
265
|
+
builder.AddShape(*MakeLaxPolygonOrDie("2:2, 2:3"));
|
|
266
|
+
S2Error error;
|
|
267
|
+
EXPECT_TRUE(builder.Build(&error));
|
|
268
|
+
EXPECT_EQ("0:0, 0:5, 5:5, 5:0; 1:1; 2:2, 2:3",
|
|
269
|
+
s2textformat::ToString(output, "; "));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
using EdgeLabelMap = map<S2Shape::Edge, set<int32>>;
|
|
273
|
+
|
|
274
|
+
inline S2Shape::Edge GetKey(S2Shape::Edge edge, EdgeType edge_type) {
|
|
275
|
+
// For undirected edges, sort the vertices in lexicographic order.
|
|
276
|
+
if (edge_type == EdgeType::UNDIRECTED && edge.v0 > edge.v1) {
|
|
277
|
+
std::swap(edge.v0, edge.v1);
|
|
278
|
+
}
|
|
279
|
+
return edge;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
void AddShapeWithLabels(const S2Shape& shape, EdgeType edge_type,
|
|
283
|
+
S2Builder* builder, EdgeLabelMap *edge_label_map) {
|
|
284
|
+
static int const kLabelBegin = 1234; // Arbitrary.
|
|
285
|
+
for (int e = 0; e < shape.num_edges(); ++e) {
|
|
286
|
+
int32 label = kLabelBegin + e;
|
|
287
|
+
builder->set_label(label);
|
|
288
|
+
// For undirected edges, reverse the direction of every other input edge.
|
|
289
|
+
S2Shape::Edge edge = shape.edge(e);
|
|
290
|
+
if (edge_type == EdgeType::UNDIRECTED && (e & 1)) {
|
|
291
|
+
std::swap(edge.v0, edge.v1);
|
|
292
|
+
}
|
|
293
|
+
builder->AddEdge(edge.v0, edge.v1);
|
|
294
|
+
(*edge_label_map)[GetKey(edge, edge_type)].insert(label);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Converts "input_str" to an S2LaxPolygonShape, assigns labels to its edges,
|
|
299
|
+
// then uses LaxPolygonLayer with the given arguments to build a new
|
|
300
|
+
// S2LaxPolygonShape and verifies that all edges have the expected labels.
|
|
301
|
+
// (This function does not test whether the output edges are correct.)
|
|
302
|
+
static void TestEdgeLabels(string_view input_str, EdgeType edge_type,
|
|
303
|
+
DegenerateBoundaries degenerate_boundaries) {
|
|
304
|
+
S2Builder builder{S2Builder::Options()};
|
|
305
|
+
S2LaxPolygonShape output;
|
|
306
|
+
LaxPolygonLayer::LabelSetIds label_set_ids;
|
|
307
|
+
IdSetLexicon label_set_lexicon;
|
|
308
|
+
LaxPolygonLayer::Options options;
|
|
309
|
+
options.set_edge_type(edge_type);
|
|
310
|
+
options.set_degenerate_boundaries(degenerate_boundaries);
|
|
311
|
+
builder.StartLayer(make_unique<LaxPolygonLayer>(
|
|
312
|
+
&output, &label_set_ids, &label_set_lexicon, options));
|
|
313
|
+
|
|
314
|
+
EdgeLabelMap edge_label_map;
|
|
315
|
+
AddShapeWithLabels(*MakeLaxPolygonOrDie(input_str), edge_type,
|
|
316
|
+
&builder, &edge_label_map);
|
|
317
|
+
S2Error error;
|
|
318
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
319
|
+
for (int i = 0; i < output.num_chains(); ++i) {
|
|
320
|
+
for (int j = 0; j < output.chain(i).length; ++j) {
|
|
321
|
+
S2Shape::Edge edge = output.chain_edge(i, j);
|
|
322
|
+
const auto& expected_labels = edge_label_map[GetKey(edge, edge_type)];
|
|
323
|
+
ASSERT_EQ(expected_labels.size(),
|
|
324
|
+
label_set_lexicon.id_set(label_set_ids[i][j]).size());
|
|
325
|
+
EXPECT_TRUE(std::equal(
|
|
326
|
+
expected_labels.begin(), expected_labels.end(),
|
|
327
|
+
label_set_lexicon.id_set(label_set_ids[i][j]).begin()));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
TEST(LaxPolygonLayer, EdgeLabels) {
|
|
333
|
+
// TODO(ericv): Implement EdgeType::UNDIRECTED.
|
|
334
|
+
for (auto edge_type : {EdgeType::DIRECTED}) {
|
|
335
|
+
for (auto db : kAllDegenerateBoundaries()) {
|
|
336
|
+
// Test a polygon with normal and degenerate shells and holes. Note
|
|
337
|
+
// that this S2LaxPolygonShape has duplicate edges and is therefore not
|
|
338
|
+
// valid in most contexts.
|
|
339
|
+
TestEdgeLabels("1:1, 1:2; 0:0, 0:9, 9:9, 9:0; 1:2, 1:1; "
|
|
340
|
+
"3:3, 8:3, 8:8, 3:8; 4:4; 4:5, 5:5; 4:4", edge_type, db);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
TEST(IndexedLaxPolygonLayer, AddsShape) {
|
|
346
|
+
S2Builder builder{S2Builder::Options()};
|
|
347
|
+
MutableS2ShapeIndex index;
|
|
348
|
+
builder.StartLayer(make_unique<IndexedLaxPolygonLayer>(&index));
|
|
349
|
+
const string& polygon_str = "0:0, 0:10, 10:0";
|
|
350
|
+
builder.AddPolygon(*s2textformat::MakePolygon(polygon_str));
|
|
351
|
+
S2Error error;
|
|
352
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
353
|
+
EXPECT_EQ(1, index.num_shape_ids());
|
|
354
|
+
auto polygon = down_cast<const S2LaxPolygonShape*>(index.shape(0));
|
|
355
|
+
EXPECT_EQ(polygon_str, s2textformat::ToString(*polygon));
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
TEST(IndexedLaxPolygonLayer, IgnoresEmptyShape) {
|
|
359
|
+
S2Builder builder{S2Builder::Options()};
|
|
360
|
+
MutableS2ShapeIndex index;
|
|
361
|
+
builder.StartLayer(make_unique<IndexedLaxPolygonLayer>(&index));
|
|
362
|
+
S2Error error;
|
|
363
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
364
|
+
EXPECT_EQ(0, index.num_shape_ids());
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
} // namespace
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Copyright 2016 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_s2point_vector_layer.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/s2builder_graph.h"
|
|
21
|
+
|
|
22
|
+
using std::vector;
|
|
23
|
+
|
|
24
|
+
using EdgeType = S2Builder::EdgeType;
|
|
25
|
+
using Graph = S2Builder::Graph;
|
|
26
|
+
using GraphOptions = S2Builder::GraphOptions;
|
|
27
|
+
using Label = S2Builder::Label;
|
|
28
|
+
|
|
29
|
+
using DegenerateEdges = GraphOptions::DegenerateEdges;
|
|
30
|
+
using DuplicateEdges = GraphOptions::DuplicateEdges;
|
|
31
|
+
using SiblingPairs = GraphOptions::SiblingPairs;
|
|
32
|
+
|
|
33
|
+
using EdgeId = Graph::EdgeId;
|
|
34
|
+
|
|
35
|
+
namespace s2builderutil {
|
|
36
|
+
|
|
37
|
+
S2PointVectorLayer::S2PointVectorLayer(vector<S2Point>* points,
|
|
38
|
+
const Options& options)
|
|
39
|
+
: S2PointVectorLayer(points, nullptr, nullptr, options) {}
|
|
40
|
+
|
|
41
|
+
S2PointVectorLayer::S2PointVectorLayer(vector<S2Point>* points,
|
|
42
|
+
LabelSetIds* label_set_ids,
|
|
43
|
+
IdSetLexicon* label_set_lexicon,
|
|
44
|
+
const Options& options)
|
|
45
|
+
: points_(points),
|
|
46
|
+
label_set_ids_(label_set_ids),
|
|
47
|
+
label_set_lexicon_(label_set_lexicon),
|
|
48
|
+
options_(options) {}
|
|
49
|
+
|
|
50
|
+
void S2PointVectorLayer::Build(const Graph& g, S2Error* error) {
|
|
51
|
+
Graph::LabelFetcher fetcher(g, EdgeType::DIRECTED);
|
|
52
|
+
|
|
53
|
+
vector<Label> labels; // Temporary storage for labels.
|
|
54
|
+
for (EdgeId edge_id = 0; edge_id < g.edges().size(); edge_id++) {
|
|
55
|
+
auto& edge = g.edge(edge_id);
|
|
56
|
+
if (edge.first != edge.second) {
|
|
57
|
+
error->Init(S2Error::INVALID_ARGUMENT, "Found non-degenerate edges");
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
points_->push_back(g.vertex(edge.first));
|
|
61
|
+
if (label_set_ids_) {
|
|
62
|
+
fetcher.Fetch(edge_id, &labels);
|
|
63
|
+
int set_id = label_set_lexicon_->Add(labels);
|
|
64
|
+
label_set_ids_->push_back(set_id);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
GraphOptions S2PointVectorLayer::graph_options() const {
|
|
70
|
+
return GraphOptions(EdgeType::DIRECTED, DegenerateEdges::KEEP,
|
|
71
|
+
options_.duplicate_edges(), SiblingPairs::KEEP);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
} // namespace s2builderutil
|