@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,233 @@
|
|
|
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_s2polyline_vector_layer.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include "s2/base/casts.h"
|
|
23
|
+
#include "s2/base/integral_types.h"
|
|
24
|
+
#include <gtest/gtest.h>
|
|
25
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
26
|
+
#include "s2/third_party/absl/strings/str_join.h"
|
|
27
|
+
#include "s2/mutable_s2shape_index.h"
|
|
28
|
+
#include "s2/s2builderutil_snap_functions.h"
|
|
29
|
+
#include "s2/s2text_format.h"
|
|
30
|
+
|
|
31
|
+
using absl::make_unique;
|
|
32
|
+
using s2builderutil::IndexedS2PolylineVectorLayer;
|
|
33
|
+
using s2builderutil::S2PolylineVectorLayer;
|
|
34
|
+
using s2textformat::MakePolylineOrDie;
|
|
35
|
+
using std::unique_ptr;
|
|
36
|
+
using std::vector;
|
|
37
|
+
|
|
38
|
+
using EdgeType = S2Builder::EdgeType;
|
|
39
|
+
using PolylineType = S2PolylineVectorLayer::Options::PolylineType;
|
|
40
|
+
|
|
41
|
+
namespace {
|
|
42
|
+
|
|
43
|
+
void TestS2PolylineVector(
|
|
44
|
+
const vector<const char*>& input_strs,
|
|
45
|
+
const vector<const char*>& expected_strs,
|
|
46
|
+
EdgeType edge_type,
|
|
47
|
+
S2PolylineVectorLayer::Options layer_options = // by value
|
|
48
|
+
S2PolylineVectorLayer::Options(),
|
|
49
|
+
const S2Builder::Options& builder_options = S2Builder::Options()) {
|
|
50
|
+
layer_options.set_edge_type(edge_type);
|
|
51
|
+
SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
|
|
52
|
+
S2Builder builder(builder_options);
|
|
53
|
+
vector<unique_ptr<S2Polyline>> output;
|
|
54
|
+
builder.StartLayer(
|
|
55
|
+
make_unique<S2PolylineVectorLayer>(&output, layer_options));
|
|
56
|
+
for (auto input_str : input_strs) {
|
|
57
|
+
builder.AddPolyline(*MakePolylineOrDie(input_str));
|
|
58
|
+
}
|
|
59
|
+
S2Error error;
|
|
60
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
61
|
+
vector<string> output_strs;
|
|
62
|
+
for (const auto& polyline : output) {
|
|
63
|
+
output_strs.push_back(s2textformat::ToString(*polyline));
|
|
64
|
+
}
|
|
65
|
+
EXPECT_EQ(absl::StrJoin(expected_strs, "; "),
|
|
66
|
+
absl::StrJoin(output_strs, "; "));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Convenience function that tests both directed and undirected edges.
|
|
70
|
+
void TestS2PolylineVector(
|
|
71
|
+
const vector<const char*>& input_strs,
|
|
72
|
+
const vector<const char*>& expected_strs,
|
|
73
|
+
const S2PolylineVectorLayer::Options& layer_options =
|
|
74
|
+
S2PolylineVectorLayer::Options(),
|
|
75
|
+
const S2Builder::Options& builder_options = S2Builder::Options()) {
|
|
76
|
+
TestS2PolylineVector(input_strs, expected_strs, EdgeType::DIRECTED,
|
|
77
|
+
layer_options, builder_options);
|
|
78
|
+
TestS2PolylineVector(input_strs, expected_strs, EdgeType::UNDIRECTED,
|
|
79
|
+
layer_options, builder_options);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void TestS2PolylineVectorUnchanged(const vector<const char*>& input_strs) {
|
|
83
|
+
TestS2PolylineVector(input_strs, input_strs);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
TEST(S2PolylineVectorLayer, NoEdges) {
|
|
87
|
+
TestS2PolylineVectorUnchanged({});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
TEST(S2PolylineVectorLayer, TwoPolylines) {
|
|
91
|
+
TestS2PolylineVectorUnchanged({"0:0, 1:1, 2:2", "4:4, 3:3"});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
TEST(S2PolylineVectorLayer, JoiningPolylines) {
|
|
95
|
+
// Check that polylines are joined together when possible, even if they were
|
|
96
|
+
// not adjacent in the input. For undirected edges, the polyline direction
|
|
97
|
+
// should be chosen such that the first edge of the polyline was added to
|
|
98
|
+
// S2Builder before the last edge of the polyline.
|
|
99
|
+
TestS2PolylineVector({"1:1, 2:2", "3:3, 2:2", "0:0, 1:1"},
|
|
100
|
+
{"3:3, 2:2", "0:0, 1:1, 2:2"}, EdgeType::DIRECTED);
|
|
101
|
+
TestS2PolylineVector({"1:1, 2:2", "3:3, 2:2", "0:0, 1:1"},
|
|
102
|
+
{"3:3, 2:2, 1:1, 0:0"}, EdgeType::UNDIRECTED);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
TEST(S2PolylineVectorLayer, SegmentNetwork) {
|
|
106
|
+
// Test a complex network of polylines that meet at shared vertices.
|
|
107
|
+
TestS2PolylineVectorUnchanged({
|
|
108
|
+
"0:0, 1:1, 2:2",
|
|
109
|
+
"2:2, 2:3, 2:4",
|
|
110
|
+
"2:4, 3:4, 4:4",
|
|
111
|
+
"2:2, 3:2, 4:2",
|
|
112
|
+
"4:2, 4:3, 4:4",
|
|
113
|
+
"1:0, 2:2",
|
|
114
|
+
"0:1, 2:2",
|
|
115
|
+
"5:4, 4:4",
|
|
116
|
+
"4:5, 4:4",
|
|
117
|
+
"2:4, 2:5, 1:5, 1:4, 2:4",
|
|
118
|
+
"4:2, 6:1, 5:0", // Two nested loops
|
|
119
|
+
"4:2, 7:0, 6:-1",
|
|
120
|
+
"11:1, 11:0, 10:0, 10:1, 11:1" // Isolated loop
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
TEST(S2PolylineVectorLayer, MultipleIntersectingWalks) {
|
|
125
|
+
// This checks idempotency for directed edges in the case of several
|
|
126
|
+
// polylines that share edges (and that even share loops). The test
|
|
127
|
+
// happens to pass for undirected edges as well.
|
|
128
|
+
S2PolylineVectorLayer::Options layer_options;
|
|
129
|
+
layer_options.set_polyline_type(PolylineType::WALK);
|
|
130
|
+
vector<const char*> input = {
|
|
131
|
+
"5:5, 5:6, 6:5, 5:5, 5:4, 5:3",
|
|
132
|
+
"4:4, 5:5, 6:5, 5:6, 5:5, 5:6, 6:5, 5:5, 4:5",
|
|
133
|
+
"3:5, 5:5, 5:6, 6:5, 5:5, 5:6, 6:6, 7:7",
|
|
134
|
+
};
|
|
135
|
+
TestS2PolylineVector(input, input, layer_options);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
TEST(S2PolylineVectorLayer, EarlyWalkTermination) {
|
|
139
|
+
// This checks idempotency for cases where earlier polylines in the input
|
|
140
|
+
// happen to terminate in the middle of later polylines. This requires
|
|
141
|
+
// building non-maximal polylines.
|
|
142
|
+
S2PolylineVectorLayer::Options layer_options;
|
|
143
|
+
layer_options.set_polyline_type(PolylineType::WALK);
|
|
144
|
+
vector<const char*> input = {
|
|
145
|
+
"0:1, 1:1",
|
|
146
|
+
"1:0, 1:1, 1:2",
|
|
147
|
+
"0:2, 1:2, 2:2",
|
|
148
|
+
"2:1, 2:2, 2:3"
|
|
149
|
+
};
|
|
150
|
+
TestS2PolylineVector(input, input, layer_options);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
TEST(S2PolylineVectorLayer, InputEdgeStartsMultipleLoops) {
|
|
154
|
+
// A single input edge is split into several segments by removing portions
|
|
155
|
+
// of it, and then each of those segments becomes one edge of a loop.
|
|
156
|
+
S2PolylineVectorLayer::Options layer_options;
|
|
157
|
+
layer_options.set_polyline_type(PolylineType::WALK);
|
|
158
|
+
layer_options.set_sibling_pairs(
|
|
159
|
+
S2PolylineVectorLayer::Options::SiblingPairs::DISCARD);
|
|
160
|
+
S2Builder::Options builder_options;
|
|
161
|
+
builder_options.set_snap_function(s2builderutil::IntLatLngSnapFunction(7));
|
|
162
|
+
vector<const char*> input = {
|
|
163
|
+
"0:10, 0:0",
|
|
164
|
+
"0:6, 1:6, 1:7, 0:7, 0:8",
|
|
165
|
+
"0:8, 1:8, 1:9, 0:9, 0:10",
|
|
166
|
+
"0:2, 1:2, 1:3, 0:3, 0:4",
|
|
167
|
+
"0:0, 1:0, 1:1, 0:1, 0:2",
|
|
168
|
+
"0:4, 1:4, 1:5, 0:5, 0:6",
|
|
169
|
+
};
|
|
170
|
+
vector<const char*> expected = {
|
|
171
|
+
"0:1, 0:0, 1:0, 1:1, 0:1",
|
|
172
|
+
"0:3, 0:2, 1:2, 1:3, 0:3",
|
|
173
|
+
"0:5, 0:4, 1:4, 1:5, 0:5",
|
|
174
|
+
"0:7, 0:6, 1:6, 1:7, 0:7",
|
|
175
|
+
"0:9, 0:8, 1:8, 1:9, 0:9",
|
|
176
|
+
};
|
|
177
|
+
TestS2PolylineVector(input, expected, layer_options, builder_options);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
TEST(S2PolylineVectorLayer, SimpleEdgeLabels) {
|
|
181
|
+
S2Builder builder{S2Builder::Options()};
|
|
182
|
+
vector<unique_ptr<S2Polyline>> output;
|
|
183
|
+
S2PolylineVectorLayer::LabelSetIds label_set_ids;
|
|
184
|
+
IdSetLexicon label_set_lexicon;
|
|
185
|
+
S2PolylineVectorLayer::Options layer_options;
|
|
186
|
+
layer_options.set_edge_type(EdgeType::UNDIRECTED);
|
|
187
|
+
layer_options.set_duplicate_edges(
|
|
188
|
+
S2PolylineVectorLayer::Options::DuplicateEdges::MERGE);
|
|
189
|
+
builder.StartLayer(make_unique<S2PolylineVectorLayer>(
|
|
190
|
+
&output, &label_set_ids, &label_set_lexicon, layer_options));
|
|
191
|
+
builder.set_label(1);
|
|
192
|
+
builder.AddPolyline(*MakePolylineOrDie("0:0, 0:1, 0:2"));
|
|
193
|
+
builder.set_label(2);
|
|
194
|
+
builder.AddPolyline(*MakePolylineOrDie("0:3, 0:2, 0:1"));
|
|
195
|
+
builder.clear_labels();
|
|
196
|
+
builder.AddPolyline(*MakePolylineOrDie("0:4, 0:5"));
|
|
197
|
+
S2Error error;
|
|
198
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
199
|
+
vector<vector<vector<int32>>> expected = {{{1}, {1, 2}, {2}}, {{}}};
|
|
200
|
+
ASSERT_EQ(expected.size(), label_set_ids.size());
|
|
201
|
+
for (int i = 0; i < expected.size(); ++i) {
|
|
202
|
+
ASSERT_EQ(expected[i].size(), label_set_ids[i].size());
|
|
203
|
+
for (int j = 0; j < expected[i].size(); ++j) {
|
|
204
|
+
ASSERT_EQ(expected[i][j].size(),
|
|
205
|
+
label_set_lexicon.id_set(label_set_ids[i][j]).size());
|
|
206
|
+
int k = 0;
|
|
207
|
+
for (int32 label : label_set_lexicon.id_set(label_set_ids[i][j])) {
|
|
208
|
+
EXPECT_EQ(expected[i][j][k++], label);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
TEST(IndexedS2PolylineVectorLayer, AddsShapes) {
|
|
215
|
+
S2Builder builder{S2Builder::Options()};
|
|
216
|
+
MutableS2ShapeIndex index;
|
|
217
|
+
builder.StartLayer(make_unique<IndexedS2PolylineVectorLayer>(&index));
|
|
218
|
+
string polyline0_str = "0:0, 1:1";
|
|
219
|
+
string polyline1_str = "2:2, 3:3";
|
|
220
|
+
builder.AddPolyline(*s2textformat::MakePolylineOrDie(polyline0_str));
|
|
221
|
+
builder.AddPolyline(*s2textformat::MakePolylineOrDie(polyline1_str));
|
|
222
|
+
S2Error error;
|
|
223
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
224
|
+
EXPECT_EQ(2, index.num_shape_ids());
|
|
225
|
+
const S2Polyline* polyline0 = down_cast<const S2Polyline::Shape*>(
|
|
226
|
+
index.shape(0))->polyline();
|
|
227
|
+
const S2Polyline* polyline1 = down_cast<const S2Polyline::Shape*>(
|
|
228
|
+
index.shape(1))->polyline();
|
|
229
|
+
EXPECT_EQ(polyline0_str, s2textformat::ToString(*polyline0));
|
|
230
|
+
EXPECT_EQ(polyline1_str, s2textformat::ToString(*polyline1));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
} // namespace
|
|
@@ -0,0 +1,354 @@
|
|
|
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_snap_functions.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cfloat>
|
|
22
|
+
#include <cmath>
|
|
23
|
+
#include <memory>
|
|
24
|
+
#include "s2/base/integral_types.h"
|
|
25
|
+
#include "s2/base/logging.h"
|
|
26
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
27
|
+
#include "s2/s2cell_id.h"
|
|
28
|
+
#include "s2/s2latlng.h"
|
|
29
|
+
#include "s2/s2metrics.h"
|
|
30
|
+
|
|
31
|
+
using absl::make_unique;
|
|
32
|
+
using std::max;
|
|
33
|
+
using std::min;
|
|
34
|
+
using std::unique_ptr;
|
|
35
|
+
|
|
36
|
+
namespace s2builderutil {
|
|
37
|
+
|
|
38
|
+
const int IntLatLngSnapFunction::kMinExponent;
|
|
39
|
+
const int IntLatLngSnapFunction::kMaxExponent;
|
|
40
|
+
|
|
41
|
+
IdentitySnapFunction::IdentitySnapFunction()
|
|
42
|
+
: snap_radius_(S1Angle::Zero()) {
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
IdentitySnapFunction::IdentitySnapFunction(S1Angle snap_radius) {
|
|
46
|
+
set_snap_radius(snap_radius);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void IdentitySnapFunction::set_snap_radius(S1Angle snap_radius) {
|
|
50
|
+
S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
|
|
51
|
+
snap_radius_ = snap_radius;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
S1Angle IdentitySnapFunction::snap_radius() const {
|
|
55
|
+
return snap_radius_;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
S1Angle IdentitySnapFunction::min_vertex_separation() const {
|
|
59
|
+
// Since SnapFunction does not move the input point, output vertices are
|
|
60
|
+
// separated by the full snap_radius().
|
|
61
|
+
return snap_radius_;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
S1Angle IdentitySnapFunction::min_edge_vertex_separation() const {
|
|
65
|
+
// In the worst case configuration, the edge separation is half of the
|
|
66
|
+
// vertex separation.
|
|
67
|
+
return 0.5 * snap_radius_;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
S2Point IdentitySnapFunction::SnapPoint(const S2Point& point) const {
|
|
71
|
+
return point;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
unique_ptr<S2Builder::SnapFunction> IdentitySnapFunction::Clone() const {
|
|
75
|
+
return make_unique<IdentitySnapFunction>(*this);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
S2CellIdSnapFunction::S2CellIdSnapFunction() {
|
|
80
|
+
set_level(S2CellId::kMaxLevel);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
S2CellIdSnapFunction::S2CellIdSnapFunction(int level) {
|
|
84
|
+
set_level(level);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
void S2CellIdSnapFunction::set_level(int level) {
|
|
88
|
+
S2_DCHECK_GE(level, 0);
|
|
89
|
+
S2_DCHECK_LE(level, S2CellId::kMaxLevel);
|
|
90
|
+
level_ = level;
|
|
91
|
+
set_snap_radius(MinSnapRadiusForLevel(level));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
int S2CellIdSnapFunction::level() const {
|
|
95
|
+
return level_;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
void S2CellIdSnapFunction::set_snap_radius(S1Angle snap_radius) {
|
|
99
|
+
S2_DCHECK_GE(snap_radius, MinSnapRadiusForLevel(level()));
|
|
100
|
+
S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
|
|
101
|
+
snap_radius_ = snap_radius;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
S1Angle S2CellIdSnapFunction::snap_radius() const {
|
|
105
|
+
return snap_radius_;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
S1Angle S2CellIdSnapFunction::MinSnapRadiusForLevel(int level) {
|
|
109
|
+
// snap_radius() needs to be an upper bound on the true distance that a
|
|
110
|
+
// point can move when snapped, taking into account numerical errors.
|
|
111
|
+
//
|
|
112
|
+
// The maximum error when converting from an S2Point to an S2CellId is
|
|
113
|
+
// S2::kMaxDiag.deriv() * DBL_EPSILON. The maximum error when converting an
|
|
114
|
+
// S2CellId center back to an S2Point is 1.5 * DBL_EPSILON. These add up to
|
|
115
|
+
// just slightly less than 4 * DBL_EPSILON.
|
|
116
|
+
return S1Angle::Radians(0.5 * S2::kMaxDiag.GetValue(level) + 4 * DBL_EPSILON);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
int S2CellIdSnapFunction::LevelForMaxSnapRadius(S1Angle snap_radius) {
|
|
120
|
+
// When choosing a level, we need to acount for the error bound of
|
|
121
|
+
// 4 * DBL_EPSILON that is added by MinSnapRadiusForLevel().
|
|
122
|
+
return S2::kMaxDiag.GetLevelForMaxValue(
|
|
123
|
+
2 * (snap_radius.radians() - 4 * DBL_EPSILON));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
S1Angle S2CellIdSnapFunction::min_vertex_separation() const {
|
|
127
|
+
// We have three different bounds for the minimum vertex separation: one is
|
|
128
|
+
// a constant bound, one is proportional to snap_radius, and one is equal to
|
|
129
|
+
// snap_radius minus a constant. These bounds give the best results for
|
|
130
|
+
// small, medium, and large snap radii respectively. We return the maximum
|
|
131
|
+
// of the three bounds.
|
|
132
|
+
//
|
|
133
|
+
// 1. Constant bound: Vertices are always separated by at least
|
|
134
|
+
// kMinEdge(level), the minimum edge length for the chosen snap level.
|
|
135
|
+
//
|
|
136
|
+
// 2. Proportional bound: It can be shown that in the plane, the worst-case
|
|
137
|
+
// configuration has a vertex separation of 2 / sqrt(13) * snap_radius.
|
|
138
|
+
// This is verified in the unit test, except that on the sphere the ratio
|
|
139
|
+
// is slightly smaller at cell level 2 (0.54849 vs. 0.55470). We reduce
|
|
140
|
+
// that value a bit more below to be conservative.
|
|
141
|
+
//
|
|
142
|
+
// 3. Best asymptotic bound: This bound bound is derived by observing we
|
|
143
|
+
// only select a new site when it is at least snap_radius() away from all
|
|
144
|
+
// existing sites, and the site can move by at most 0.5 * kMaxDiag(level)
|
|
145
|
+
// when snapped.
|
|
146
|
+
S1Angle min_edge = S1Angle::Radians(S2::kMinEdge.GetValue(level_));
|
|
147
|
+
S1Angle max_diag = S1Angle::Radians(S2::kMaxDiag.GetValue(level_));
|
|
148
|
+
return max(min_edge,
|
|
149
|
+
max(0.548 * snap_radius_, // 2 / sqrt(13) in the plane
|
|
150
|
+
snap_radius_ - 0.5 * max_diag));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
S1Angle S2CellIdSnapFunction::min_edge_vertex_separation() const {
|
|
154
|
+
// Similar to min_vertex_separation(), in this case we have four bounds: a
|
|
155
|
+
// constant bound that holds only at the minimum snap radius, a constant
|
|
156
|
+
// bound that holds for any snap radius, a bound that is proportional to
|
|
157
|
+
// snap_radius, and a bound that is equal to snap_radius minus a constant.
|
|
158
|
+
//
|
|
159
|
+
// 1. Constant bounds:
|
|
160
|
+
//
|
|
161
|
+
// (a) At the minimum snap radius for a given level, it can be shown that
|
|
162
|
+
// vertices are separated from edges by at least 0.5 * kMinDiag(level) in
|
|
163
|
+
// the plane. The unit test verifies this, except that on the sphere the
|
|
164
|
+
// worst case is slightly better: 0.5652980068 * kMinDiag(level).
|
|
165
|
+
//
|
|
166
|
+
// (b) Otherwise, for arbitrary snap radii the worst-case configuration
|
|
167
|
+
// in the plane has an edge-vertex separation of sqrt(3/19) *
|
|
168
|
+
// kMinDiag(level), where sqrt(3/19) is about 0.3973597071. The unit
|
|
169
|
+
// test verifies that the bound is slighty better on the sphere:
|
|
170
|
+
// 0.3973595687 * kMinDiag(level).
|
|
171
|
+
//
|
|
172
|
+
// 2. Proportional bound: In the plane, the worst-case configuration has an
|
|
173
|
+
// edge-vertex separation of 2 * sqrt(3/247) * snap_radius, which is
|
|
174
|
+
// about 0.2204155075. The unit test verifies this, except that on the
|
|
175
|
+
// sphere the bound is slightly worse for certain large S2Cells: the
|
|
176
|
+
// minimum ratio occurs at cell level 6, and is about 0.2196666953.
|
|
177
|
+
//
|
|
178
|
+
// 3. Best asymptotic bound: If snap_radius() is large compared to the
|
|
179
|
+
// minimum snap radius, then the best bound is achieved by 3 sites on a
|
|
180
|
+
// circular arc of radius "snap_radius", spaced "min_vertex_separation"
|
|
181
|
+
// apart. An input edge passing just to one side of the center of the
|
|
182
|
+
// circle intersects the Voronoi regions of the two end sites but not the
|
|
183
|
+
// Voronoi region of the center site, and gives an edge separation of
|
|
184
|
+
// (min_vertex_separation ** 2) / (2 * snap_radius). This bound
|
|
185
|
+
// approaches 0.5 * snap_radius for large snap radii, i.e. the minimum
|
|
186
|
+
// edge-vertex separation approaches half of the minimum vertex
|
|
187
|
+
// separation as the snap radius becomes large compared to the cell size.
|
|
188
|
+
|
|
189
|
+
S1Angle min_diag = S1Angle::Radians(S2::kMinDiag.GetValue(level_));
|
|
190
|
+
if (snap_radius() == MinSnapRadiusForLevel(level_)) {
|
|
191
|
+
// This bound only holds when the minimum snap radius is being used.
|
|
192
|
+
return 0.565 * min_diag; // 0.500 in the plane
|
|
193
|
+
}
|
|
194
|
+
// Otherwise, these bounds hold for any snap_radius().
|
|
195
|
+
S1Angle vertex_sep = min_vertex_separation();
|
|
196
|
+
return max(0.397 * min_diag, // sqrt(3 / 19) in the plane
|
|
197
|
+
max(0.219 * snap_radius_, // 2 * sqrt(3 / 247) in the plane
|
|
198
|
+
0.5 * (vertex_sep / snap_radius_) * vertex_sep));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
S2Point S2CellIdSnapFunction::SnapPoint(const S2Point& point) const {
|
|
202
|
+
return S2CellId(point).parent(level_).ToPoint();
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
unique_ptr<S2Builder::SnapFunction> S2CellIdSnapFunction::Clone() const {
|
|
206
|
+
return make_unique<S2CellIdSnapFunction>(*this);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
IntLatLngSnapFunction::IntLatLngSnapFunction()
|
|
210
|
+
: exponent_(-1), snap_radius_(), from_degrees_(0), to_degrees_(0) {
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
IntLatLngSnapFunction::IntLatLngSnapFunction(int exponent) {
|
|
214
|
+
set_exponent(exponent);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
void IntLatLngSnapFunction::set_exponent(int exponent) {
|
|
218
|
+
S2_DCHECK_GE(exponent, kMinExponent);
|
|
219
|
+
S2_DCHECK_LE(exponent, kMaxExponent);
|
|
220
|
+
exponent_ = exponent;
|
|
221
|
+
set_snap_radius(MinSnapRadiusForExponent(exponent));
|
|
222
|
+
|
|
223
|
+
// Precompute the scale factors needed for snapping. Note that these
|
|
224
|
+
// calculations need to exactly match the ones in s1angle.h to ensure
|
|
225
|
+
// that the same S2Points are generated.
|
|
226
|
+
double power = 1;
|
|
227
|
+
for (int i = 0; i < exponent; ++i) power *= 10;
|
|
228
|
+
from_degrees_ = power;
|
|
229
|
+
to_degrees_ = 1 / power;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
int IntLatLngSnapFunction::exponent() const {
|
|
233
|
+
return exponent_;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
void IntLatLngSnapFunction::set_snap_radius(S1Angle snap_radius) {
|
|
237
|
+
S2_DCHECK_GE(snap_radius, MinSnapRadiusForExponent(exponent()));
|
|
238
|
+
S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
|
|
239
|
+
snap_radius_ = snap_radius;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
S1Angle IntLatLngSnapFunction::snap_radius() const {
|
|
243
|
+
return snap_radius_;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
S1Angle IntLatLngSnapFunction::MinSnapRadiusForExponent(int exponent) {
|
|
247
|
+
// snap_radius() needs to be an upper bound on the true distance that a
|
|
248
|
+
// point can move when snapped, taking into account numerical errors.
|
|
249
|
+
//
|
|
250
|
+
// The maximum errors in latitude and longitude can be bounded as
|
|
251
|
+
// follows (as absolute errors in terms of DBL_EPSILON):
|
|
252
|
+
//
|
|
253
|
+
// Latitude Longitude
|
|
254
|
+
// Convert to S2LatLng: 1.000 1.000
|
|
255
|
+
// Convert to degrees: 1.032 2.063
|
|
256
|
+
// Scale by 10**exp: 0.786 1.571
|
|
257
|
+
// Round to integer: 0.5 * S1Angle::Degrees(to_degrees_)
|
|
258
|
+
// Scale by 10**(-exp): 1.375 2.749
|
|
259
|
+
// Convert to radians: 1.252 1.503
|
|
260
|
+
// ------------------------------------------------------------
|
|
261
|
+
// Total (except for rounding) 5.445 8.886
|
|
262
|
+
//
|
|
263
|
+
// The maximum error when converting the S2LatLng back to an S2Point is
|
|
264
|
+
//
|
|
265
|
+
// sqrt(2) * (maximum error in latitude or longitude) + 1.5 * DBL_EPSILON
|
|
266
|
+
//
|
|
267
|
+
// which works out to (9 * sqrt(2) + 1.5) * DBL_EPSILON radians. Finally
|
|
268
|
+
// we need to consider the effect of rounding to integer coordinates
|
|
269
|
+
// (much larger than the errors above), which can change the position by
|
|
270
|
+
// up to (sqrt(2) * 0.5 * to_degrees_) radians.
|
|
271
|
+
double power = 1;
|
|
272
|
+
for (int i = 0; i < exponent; ++i) power *= 10;
|
|
273
|
+
return (S1Angle::Degrees(M_SQRT1_2 / power) +
|
|
274
|
+
S1Angle::Radians((9 * M_SQRT2 + 1.5) * DBL_EPSILON));
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
int IntLatLngSnapFunction::ExponentForMaxSnapRadius(S1Angle snap_radius) {
|
|
278
|
+
// When choosing an exponent, we need to acount for the error bound of
|
|
279
|
+
// (9 * sqrt(2) + 1.5) * DBL_EPSILON added by MinSnapRadiusForExponent().
|
|
280
|
+
snap_radius -= S1Angle::Radians((9 * M_SQRT2 + 1.5) * DBL_EPSILON);
|
|
281
|
+
snap_radius = max(snap_radius, S1Angle::Radians(1e-30));
|
|
282
|
+
double exponent = log10(M_SQRT1_2 / snap_radius.degrees());
|
|
283
|
+
|
|
284
|
+
// There can be small errors in the calculation above, so to ensure that
|
|
285
|
+
// this function is the inverse of MinSnapRadiusForExponent() we subtract a
|
|
286
|
+
// small error tolerance.
|
|
287
|
+
return max(kMinExponent,
|
|
288
|
+
min(kMaxExponent,
|
|
289
|
+
static_cast<int>(std::ceil(exponent - 2 * DBL_EPSILON))));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
S1Angle IntLatLngSnapFunction::min_vertex_separation() const {
|
|
293
|
+
// We have two bounds for the minimum vertex separation: one is proportional
|
|
294
|
+
// to snap_radius, and one is equal to snap_radius minus a constant. These
|
|
295
|
+
// bounds give the best results for small and large snap radii respectively.
|
|
296
|
+
// We return the maximum of the two bounds.
|
|
297
|
+
//
|
|
298
|
+
// 1. Proportional bound: It can be shown that in the plane, the worst-case
|
|
299
|
+
// configuration has a vertex separation of (sqrt(2) / 3) * snap_radius.
|
|
300
|
+
// This is verified in the unit test, except that on the sphere the ratio
|
|
301
|
+
// is slightly smaller (0.471337 vs. 0.471404). We reduce that value a
|
|
302
|
+
// bit more below to be conservative.
|
|
303
|
+
//
|
|
304
|
+
// 2. Best asymptotic bound: This bound bound is derived by observing we
|
|
305
|
+
// only select a new site when it is at least snap_radius() away from all
|
|
306
|
+
// existing sites, and snapping a vertex can move it by up to
|
|
307
|
+
// ((1 / sqrt(2)) * to_degrees_) degrees.
|
|
308
|
+
return max(0.471 * snap_radius_, // sqrt(2) / 3 in the plane
|
|
309
|
+
snap_radius_ - S1Angle::Degrees(M_SQRT1_2 * to_degrees_));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
S1Angle IntLatLngSnapFunction::min_edge_vertex_separation() const {
|
|
313
|
+
// Similar to min_vertex_separation(), in this case we have three bounds:
|
|
314
|
+
// one is a constant bound, one is proportional to snap_radius, and one is
|
|
315
|
+
// equal to snap_radius minus a constant.
|
|
316
|
+
//
|
|
317
|
+
// 1. Constant bound: In the plane, the worst-case configuration has an
|
|
318
|
+
// edge-vertex separation of ((1 / sqrt(13)) * to_degrees_) degrees.
|
|
319
|
+
// The unit test verifies this, except that on the sphere the ratio is
|
|
320
|
+
// slightly lower when small exponents such as E1 are used
|
|
321
|
+
// (0.2772589 vs 0.2773501).
|
|
322
|
+
//
|
|
323
|
+
// 2. Proportional bound: In the plane, the worst-case configuration has an
|
|
324
|
+
// edge-vertex separation of (2 / 9) * snap_radius (0.222222222222). The
|
|
325
|
+
// unit test verifies this, except that on the sphere the bound can be
|
|
326
|
+
// slightly worse with large exponents (e.g., E9) due to small numerical
|
|
327
|
+
// errors (0.222222126756717).
|
|
328
|
+
//
|
|
329
|
+
// 3. Best asymptotic bound: If snap_radius() is large compared to the
|
|
330
|
+
// minimum snap radius, then the best bound is achieved by 3 sites on a
|
|
331
|
+
// circular arc of radius "snap_radius", spaced "min_vertex_separation"
|
|
332
|
+
// apart (see S2CellIdSnapFunction::min_edge_vertex_separation). This
|
|
333
|
+
// bound approaches 0.5 * snap_radius as the snap radius becomes large
|
|
334
|
+
// relative to the grid spacing.
|
|
335
|
+
|
|
336
|
+
S1Angle vertex_sep = min_vertex_separation();
|
|
337
|
+
return max(0.277 * S1Angle::Degrees(to_degrees_), // 1/sqrt(13) in the plane
|
|
338
|
+
max(0.222 * snap_radius_, // 2/9 in the plane
|
|
339
|
+
0.5 * (vertex_sep / snap_radius_) * vertex_sep));
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
S2Point IntLatLngSnapFunction::SnapPoint(const S2Point& point) const {
|
|
343
|
+
S2_DCHECK_GE(exponent_, 0); // Make sure the snap function was initialized.
|
|
344
|
+
S2LatLng input(point);
|
|
345
|
+
int64 lat = MathUtil::FastInt64Round(input.lat().degrees() * from_degrees_);
|
|
346
|
+
int64 lng = MathUtil::FastInt64Round(input.lng().degrees() * from_degrees_);
|
|
347
|
+
return S2LatLng::FromDegrees(lat * to_degrees_, lng * to_degrees_).ToPoint();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
unique_ptr<S2Builder::SnapFunction> IntLatLngSnapFunction::Clone() const {
|
|
351
|
+
return make_unique<IntLatLngSnapFunction>(*this);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
} // namespace s2builderutil
|