@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,59 @@
|
|
|
1
|
+
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// This file contains some basic tests of the templating support. Testing of
|
|
19
|
+
// the actual algorithms is in s2closest_edge_query_test.cc.
|
|
20
|
+
|
|
21
|
+
#include "s2/s2closest_edge_query_base.h"
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/mutable_s2shape_index.h"
|
|
25
|
+
#include "s2/s2max_distance_targets.h"
|
|
26
|
+
#include "s2/s2text_format.h"
|
|
27
|
+
|
|
28
|
+
namespace {
|
|
29
|
+
|
|
30
|
+
// This is a proof-of-concept prototype of a possible S2FurthestEdgeQuery
|
|
31
|
+
// class. The purpose of this test is just to make sure that the code
|
|
32
|
+
// compiles and does something reasonable.
|
|
33
|
+
using FurthestEdgeQuery = S2ClosestEdgeQueryBase<S2MaxDistance>;
|
|
34
|
+
|
|
35
|
+
class FurthestPointTarget final : public S2MaxDistancePointTarget {
|
|
36
|
+
public:
|
|
37
|
+
explicit FurthestPointTarget(const S2Point& point)
|
|
38
|
+
: S2MaxDistancePointTarget(point) {}
|
|
39
|
+
|
|
40
|
+
int max_brute_force_index_size() const override {
|
|
41
|
+
return 10; // Arbitrary.
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
TEST(S2ClosestEdgeQueryBase, MaxDistance) {
|
|
46
|
+
auto index = s2textformat::MakeIndex("0:0 | 1:0 | 2:0 | 3:0 # #");
|
|
47
|
+
FurthestEdgeQuery query(index.get());
|
|
48
|
+
FurthestEdgeQuery::Options options;
|
|
49
|
+
options.set_max_results(1);
|
|
50
|
+
FurthestPointTarget target(s2textformat::MakePoint("4:0"));
|
|
51
|
+
auto results = query.FindClosestEdges(&target, options);
|
|
52
|
+
ASSERT_EQ(1, results.size());
|
|
53
|
+
EXPECT_EQ(0, results[0].shape_id());
|
|
54
|
+
EXPECT_EQ(0, results[0].edge_id());
|
|
55
|
+
EXPECT_NEAR(4, S1ChordAngle(results[0].distance()).ToAngle().degrees(),
|
|
56
|
+
1e-13);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
} // namespace
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2closest_edge_query.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
25
|
+
#include "s2/encoded_s2shape_index.h"
|
|
26
|
+
#include "s2/mutable_s2shape_index.h"
|
|
27
|
+
#include "s2/s1angle.h"
|
|
28
|
+
#include "s2/s2cap.h"
|
|
29
|
+
#include "s2/s2cell.h"
|
|
30
|
+
#include "s2/s2cell_id.h"
|
|
31
|
+
#include "s2/s2closest_edge_query_testing.h"
|
|
32
|
+
#include "s2/s2edge_distances.h"
|
|
33
|
+
#include "s2/s2loop.h"
|
|
34
|
+
#include "s2/s2metrics.h"
|
|
35
|
+
#include "s2/s2point_vector_shape.h"
|
|
36
|
+
#include "s2/s2polygon.h"
|
|
37
|
+
#include "s2/s2predicates.h"
|
|
38
|
+
#include "s2/s2shapeutil_coding.h"
|
|
39
|
+
#include "s2/s2testing.h"
|
|
40
|
+
#include "s2/s2text_format.h"
|
|
41
|
+
|
|
42
|
+
using absl::make_unique;
|
|
43
|
+
using s2shapeutil::ShapeEdgeId;
|
|
44
|
+
using s2textformat::MakeIndexOrDie;
|
|
45
|
+
using s2textformat::MakePointOrDie;
|
|
46
|
+
using s2textformat::MakePolygonOrDie;
|
|
47
|
+
using std::min;
|
|
48
|
+
using std::pair;
|
|
49
|
+
using std::unique_ptr;
|
|
50
|
+
using std::vector;
|
|
51
|
+
|
|
52
|
+
TEST(S2ClosestEdgeQuery, NoEdges) {
|
|
53
|
+
MutableS2ShapeIndex index;
|
|
54
|
+
S2ClosestEdgeQuery query(&index);
|
|
55
|
+
S2ClosestEdgeQuery::PointTarget target(S2Point(1, 0, 0));
|
|
56
|
+
const auto edge = query.FindClosestEdge(&target);
|
|
57
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), edge.distance());
|
|
58
|
+
EXPECT_EQ(-1, edge.shape_id());
|
|
59
|
+
EXPECT_EQ(-1, edge.edge_id());
|
|
60
|
+
EXPECT_FALSE(edge.is_interior());
|
|
61
|
+
EXPECT_TRUE(edge.is_empty());
|
|
62
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), query.GetDistance(&target));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
TEST(S2ClosestEdgeQuery, OptionsNotModified) {
|
|
66
|
+
// Tests that FindClosestEdge(), GetDistance(), and IsDistanceLess() do not
|
|
67
|
+
// modify query.options(), even though all of these methods have their own
|
|
68
|
+
// specific options requirements.
|
|
69
|
+
S2ClosestEdgeQuery::Options options;
|
|
70
|
+
options.set_max_results(3);
|
|
71
|
+
options.set_max_distance(S1ChordAngle::Degrees(3));
|
|
72
|
+
options.set_max_error(S1ChordAngle::Degrees(0.001));
|
|
73
|
+
auto index = MakeIndexOrDie("1:1 | 1:2 | 1:3 # #");
|
|
74
|
+
S2ClosestEdgeQuery query(index.get(), options);
|
|
75
|
+
S2ClosestEdgeQuery::PointTarget target(MakePointOrDie("2:2"));
|
|
76
|
+
EXPECT_EQ(1, query.FindClosestEdge(&target).edge_id());
|
|
77
|
+
EXPECT_NEAR(1.0, query.GetDistance(&target).degrees(), 1e-15);
|
|
78
|
+
EXPECT_TRUE(query.IsDistanceLess(&target, S1ChordAngle::Degrees(1.5)));
|
|
79
|
+
|
|
80
|
+
// Verify that none of the options above were modified.
|
|
81
|
+
EXPECT_EQ(options.max_results(), query.options().max_results());
|
|
82
|
+
EXPECT_EQ(options.max_distance(), query.options().max_distance());
|
|
83
|
+
EXPECT_EQ(options.max_error(), query.options().max_error());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
TEST(S2ClosestEdgeQuery, DistanceEqualToLimit) {
|
|
87
|
+
// Tests the behavior of IsDistanceLess, IsDistanceLessOrEqual, and
|
|
88
|
+
// IsConservativeDistanceLessOrEqual (and the corresponding Options) when
|
|
89
|
+
// the distance to the target exactly equals the chosen limit.
|
|
90
|
+
S2Point p0(MakePointOrDie("23:12")), p1(MakePointOrDie("47:11"));
|
|
91
|
+
vector<S2Point> index_points{p0};
|
|
92
|
+
MutableS2ShapeIndex index;
|
|
93
|
+
index.Add(make_unique<S2PointVectorShape>(index_points));
|
|
94
|
+
S2ClosestEdgeQuery query(&index);
|
|
95
|
+
|
|
96
|
+
// Start with two identical points and a zero distance.
|
|
97
|
+
S2ClosestEdgeQuery::PointTarget target0(p0);
|
|
98
|
+
S1ChordAngle dist0 = S1ChordAngle::Zero();
|
|
99
|
+
EXPECT_FALSE(query.IsDistanceLess(&target0, dist0));
|
|
100
|
+
EXPECT_TRUE(query.IsDistanceLessOrEqual(&target0, dist0));
|
|
101
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target0, dist0));
|
|
102
|
+
|
|
103
|
+
// Now try two points separated by a non-zero distance.
|
|
104
|
+
S2ClosestEdgeQuery::PointTarget target1(p1);
|
|
105
|
+
S1ChordAngle dist1(p0, p1);
|
|
106
|
+
EXPECT_FALSE(query.IsDistanceLess(&target1, dist1));
|
|
107
|
+
EXPECT_TRUE(query.IsDistanceLessOrEqual(&target1, dist1));
|
|
108
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target1, dist1));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
TEST(S2ClosestEdgeQuery, TrueDistanceLessThanS1ChordAngleDistance) {
|
|
112
|
+
// Tests that IsConservativeDistanceLessOrEqual returns points where the
|
|
113
|
+
// true distance is slightly less than the one computed by S1ChordAngle.
|
|
114
|
+
//
|
|
115
|
+
// The points below had the worst error from among 100,000 random pairs.
|
|
116
|
+
S2Point p0(0.78516762584829192, -0.50200400690845970, -0.36263449417782678);
|
|
117
|
+
S2Point p1(0.78563011732429433, -0.50187655940493503, -0.36180828883938054);
|
|
118
|
+
|
|
119
|
+
// The S1ChordAngle distance is ~4 ulps greater than the true distance.
|
|
120
|
+
S1ChordAngle dist1(p0, p1);
|
|
121
|
+
auto limit = dist1.Predecessor().Predecessor().Predecessor().Predecessor();
|
|
122
|
+
ASSERT_LT(s2pred::CompareDistance(p0, p1, limit), 0);
|
|
123
|
+
|
|
124
|
+
// Verify that IsConservativeDistanceLessOrEqual() still returns "p1".
|
|
125
|
+
vector<S2Point> index_points{p0};
|
|
126
|
+
MutableS2ShapeIndex index;
|
|
127
|
+
index.Add(make_unique<S2PointVectorShape>(index_points));
|
|
128
|
+
S2ClosestEdgeQuery query(&index);
|
|
129
|
+
S2ClosestEdgeQuery::PointTarget target1(p1);
|
|
130
|
+
EXPECT_FALSE(query.IsDistanceLess(&target1, limit));
|
|
131
|
+
EXPECT_FALSE(query.IsDistanceLessOrEqual(&target1, limit));
|
|
132
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target1, limit));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
TEST(S2ClosestEdgeQuery, TestReuseOfQuery) {
|
|
136
|
+
// Tests that between queries, the internal mechanism for de-duplicating
|
|
137
|
+
// results is re-set. See b/71646017.
|
|
138
|
+
auto index = MakeIndexOrDie("2:2 # #");
|
|
139
|
+
S2ClosestEdgeQuery query(index.get());
|
|
140
|
+
query.mutable_options()->set_max_error(S1Angle::Degrees(1));
|
|
141
|
+
auto target_index = MakeIndexOrDie("## 0:0, 0:5, 5:5, 5:0");
|
|
142
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(target_index.get());
|
|
143
|
+
auto results1 = query.FindClosestEdges(&target);
|
|
144
|
+
auto results2 = query.FindClosestEdges(&target);
|
|
145
|
+
EXPECT_EQ(results1.size(), results2.size());
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
TEST(S2ClosestEdgeQuery, TargetPointInsideIndexedPolygon) {
|
|
149
|
+
// Tests a target point in the interior of an indexed polygon.
|
|
150
|
+
// (The index also includes a polyline loop with no interior.)
|
|
151
|
+
auto index = MakeIndexOrDie("# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
|
|
152
|
+
S2ClosestEdgeQuery::Options options;
|
|
153
|
+
options.set_include_interiors(true);
|
|
154
|
+
options.set_max_distance(S1Angle::Degrees(1));
|
|
155
|
+
S2ClosestEdgeQuery query(index.get(), options);
|
|
156
|
+
S2ClosestEdgeQuery::PointTarget target(MakePointOrDie("2:12"));
|
|
157
|
+
auto results = query.FindClosestEdges(&target);
|
|
158
|
+
ASSERT_EQ(1, results.size());
|
|
159
|
+
EXPECT_EQ(S1ChordAngle::Zero(), results[0].distance());
|
|
160
|
+
EXPECT_EQ(1, results[0].shape_id());
|
|
161
|
+
EXPECT_EQ(-1, results[0].edge_id());
|
|
162
|
+
EXPECT_TRUE(results[0].is_interior());
|
|
163
|
+
EXPECT_FALSE(results[0].is_empty());
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
TEST(S2ClosestEdgeQuery, TargetPointOutsideIndexedPolygon) {
|
|
167
|
+
// Tests a target point in the interior of a polyline loop with no
|
|
168
|
+
// interior. (The index also includes a nearby polygon.)
|
|
169
|
+
auto index = MakeIndexOrDie("# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
|
|
170
|
+
S2ClosestEdgeQuery::Options options;
|
|
171
|
+
options.set_include_interiors(true);
|
|
172
|
+
options.set_max_distance(S1Angle::Degrees(1));
|
|
173
|
+
S2ClosestEdgeQuery query(index.get(), options);
|
|
174
|
+
S2ClosestEdgeQuery::PointTarget target(MakePointOrDie("2:2"));
|
|
175
|
+
auto results = query.FindClosestEdges(&target);
|
|
176
|
+
EXPECT_EQ(0, results.size());
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
TEST(S2ClosestEdgeQuery, TargetPolygonContainingIndexedPoints) {
|
|
180
|
+
// Two points are contained within a polyline loop (no interior) and two
|
|
181
|
+
// points are contained within a polygon.
|
|
182
|
+
auto index = MakeIndexOrDie("2:2 | 3:3 | 1:11 | 3:13 # #");
|
|
183
|
+
S2ClosestEdgeQuery query(index.get());
|
|
184
|
+
query.mutable_options()->set_max_distance(S1Angle::Degrees(1));
|
|
185
|
+
auto target_index = MakeIndexOrDie(
|
|
186
|
+
"# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
|
|
187
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(target_index.get());
|
|
188
|
+
target.set_include_interiors(true);
|
|
189
|
+
auto results = query.FindClosestEdges(&target);
|
|
190
|
+
ASSERT_EQ(2, results.size());
|
|
191
|
+
EXPECT_EQ(S1ChordAngle::Zero(), results[0].distance());
|
|
192
|
+
EXPECT_EQ(0, results[0].shape_id());
|
|
193
|
+
EXPECT_EQ(2, results[0].edge_id()); // 1:11
|
|
194
|
+
EXPECT_EQ(S1ChordAngle::Zero(), results[1].distance());
|
|
195
|
+
EXPECT_EQ(0, results[1].shape_id());
|
|
196
|
+
EXPECT_EQ(3, results[1].edge_id()); // 3:13
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
TEST(S2ClosestEdgeQuery, EmptyTargetOptimized) {
|
|
200
|
+
// Ensure that the optimized algorithm handles empty targets when a distance
|
|
201
|
+
// limit is specified.
|
|
202
|
+
MutableS2ShapeIndex index;
|
|
203
|
+
index.Add(make_unique<S2Polygon::OwningShape>(make_unique<S2Polygon>(
|
|
204
|
+
S2Loop::MakeRegularLoop(S2Point(1, 0, 0), S1Angle::Radians(0.1), 1000))));
|
|
205
|
+
S2ClosestEdgeQuery query(&index);
|
|
206
|
+
query.mutable_options()->set_max_distance(S1Angle::Radians(1e-5));
|
|
207
|
+
MutableS2ShapeIndex target_index;
|
|
208
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(&target_index);
|
|
209
|
+
EXPECT_EQ(0, query.FindClosestEdges(&target).size());
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
TEST(S2ClosestEdgeQuery, EmptyPolygonTarget) {
|
|
213
|
+
// Verifies that distances are measured correctly to empty polygon targets.
|
|
214
|
+
auto empty_polygon_index = MakeIndexOrDie("# # empty");
|
|
215
|
+
auto point_index = MakeIndexOrDie("1:1 # #");
|
|
216
|
+
auto full_polygon_index = MakeIndexOrDie("# # full");
|
|
217
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(empty_polygon_index.get());
|
|
218
|
+
target.set_include_interiors(true);
|
|
219
|
+
|
|
220
|
+
S2ClosestEdgeQuery empty_query(empty_polygon_index.get());
|
|
221
|
+
empty_query.mutable_options()->set_include_interiors(true);
|
|
222
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), empty_query.GetDistance(&target));
|
|
223
|
+
|
|
224
|
+
S2ClosestEdgeQuery point_query(point_index.get());
|
|
225
|
+
point_query.mutable_options()->set_include_interiors(true);
|
|
226
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), point_query.GetDistance(&target));
|
|
227
|
+
|
|
228
|
+
S2ClosestEdgeQuery full_query(full_polygon_index.get());
|
|
229
|
+
full_query.mutable_options()->set_include_interiors(true);
|
|
230
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), full_query.GetDistance(&target));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
TEST(S2ClosestEdgeQuery, FullLaxPolygonTarget) {
|
|
234
|
+
// Verifies that distances are measured correctly to full LaxPolygon targets.
|
|
235
|
+
auto empty_polygon_index = MakeIndexOrDie("# # empty");
|
|
236
|
+
auto point_index = MakeIndexOrDie("1:1 # #");
|
|
237
|
+
auto full_polygon_index = MakeIndexOrDie("# # full");
|
|
238
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(full_polygon_index.get());
|
|
239
|
+
target.set_include_interiors(true);
|
|
240
|
+
|
|
241
|
+
S2ClosestEdgeQuery empty_query(empty_polygon_index.get());
|
|
242
|
+
empty_query.mutable_options()->set_include_interiors(true);
|
|
243
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), empty_query.GetDistance(&target));
|
|
244
|
+
|
|
245
|
+
S2ClosestEdgeQuery point_query(point_index.get());
|
|
246
|
+
point_query.mutable_options()->set_include_interiors(true);
|
|
247
|
+
EXPECT_EQ(S1ChordAngle::Zero(), point_query.GetDistance(&target));
|
|
248
|
+
|
|
249
|
+
S2ClosestEdgeQuery full_query(full_polygon_index.get());
|
|
250
|
+
full_query.mutable_options()->set_include_interiors(true);
|
|
251
|
+
EXPECT_EQ(S1ChordAngle::Zero(), full_query.GetDistance(&target));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
TEST(S2ClosestEdgeQuery, FullS2PolygonTarget) {
|
|
255
|
+
// Verifies that distances are measured correctly to full S2Polygon targets
|
|
256
|
+
// (which use a different representation of "full" than LaxPolygon does).
|
|
257
|
+
auto empty_polygon_index = MakeIndexOrDie("# # empty");
|
|
258
|
+
auto point_index = MakeIndexOrDie("1:1 # #");
|
|
259
|
+
auto full_polygon_index = MakeIndexOrDie("# #");
|
|
260
|
+
full_polygon_index->Add(make_unique<S2Polygon::OwningShape>(
|
|
261
|
+
s2textformat::MakePolygonOrDie("full")));
|
|
262
|
+
|
|
263
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(full_polygon_index.get());
|
|
264
|
+
target.set_include_interiors(true);
|
|
265
|
+
|
|
266
|
+
S2ClosestEdgeQuery empty_query(empty_polygon_index.get());
|
|
267
|
+
empty_query.mutable_options()->set_include_interiors(true);
|
|
268
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), empty_query.GetDistance(&target));
|
|
269
|
+
|
|
270
|
+
S2ClosestEdgeQuery point_query(point_index.get());
|
|
271
|
+
point_query.mutable_options()->set_include_interiors(true);
|
|
272
|
+
EXPECT_EQ(S1ChordAngle::Zero(), point_query.GetDistance(&target));
|
|
273
|
+
|
|
274
|
+
S2ClosestEdgeQuery full_query(full_polygon_index.get());
|
|
275
|
+
full_query.mutable_options()->set_include_interiors(true);
|
|
276
|
+
EXPECT_EQ(S1ChordAngle::Zero(), full_query.GetDistance(&target));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
TEST(S2ClosestEdgeQuery, IsConservativeDistanceLessOrEqual) {
|
|
280
|
+
// Test
|
|
281
|
+
int num_tested = 0;
|
|
282
|
+
int num_conservative_needed = 0;
|
|
283
|
+
auto& rnd = S2Testing::rnd;
|
|
284
|
+
for (int iter = 0; iter < 1000; ++iter) {
|
|
285
|
+
rnd.Reset(iter + 1); // Easier to reproduce a specific case.
|
|
286
|
+
S2Point x = S2Testing::RandomPoint();
|
|
287
|
+
S2Point dir = S2Testing::RandomPoint();
|
|
288
|
+
S1Angle r = S1Angle::Radians(M_PI * pow(1e-30, rnd.RandDouble()));
|
|
289
|
+
S2Point y = S2::InterpolateAtDistance(r, x, dir);
|
|
290
|
+
S1ChordAngle limit(r);
|
|
291
|
+
if (s2pred::CompareDistance(x, y, limit) <= 0) {
|
|
292
|
+
MutableS2ShapeIndex index;
|
|
293
|
+
index.Add(make_unique<S2PointVectorShape>(vector<S2Point>({x})));
|
|
294
|
+
S2ClosestEdgeQuery query(&index);
|
|
295
|
+
S2ClosestEdgeQuery::PointTarget target(y);
|
|
296
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target, limit));
|
|
297
|
+
++num_tested;
|
|
298
|
+
if (!query.IsDistanceLess(&target, limit)) ++num_conservative_needed;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Verify that in most test cases, the distance between the target points
|
|
302
|
+
// was close to the desired value. Also verify that at least in some test
|
|
303
|
+
// cases, the conservative distance test was actually necessary.
|
|
304
|
+
EXPECT_GE(num_tested, 300);
|
|
305
|
+
EXPECT_LE(num_tested, 700);
|
|
306
|
+
EXPECT_GE(num_conservative_needed, 25);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// The approximate radius of S2Cap from which query edges are chosen.
|
|
310
|
+
static const S1Angle kTestCapRadius = S2Testing::KmToAngle(10);
|
|
311
|
+
|
|
312
|
+
// An approximate bound on the distance measurement error for "reasonable"
|
|
313
|
+
// distances (say, less than Pi/2) due to using S1ChordAngle.
|
|
314
|
+
static const double kTestChordAngleError = 1e-15;
|
|
315
|
+
|
|
316
|
+
using TestingResult = pair<S2MinDistance, ShapeEdgeId>;
|
|
317
|
+
|
|
318
|
+
// Converts to the format required by CheckDistanceResults() in s2testing.h.
|
|
319
|
+
vector<TestingResult> ConvertResults(
|
|
320
|
+
const vector<S2ClosestEdgeQuery::Result>& results) {
|
|
321
|
+
vector<TestingResult> testing_results;
|
|
322
|
+
for (const auto& result : results) {
|
|
323
|
+
testing_results.push_back(
|
|
324
|
+
TestingResult(result.distance(),
|
|
325
|
+
ShapeEdgeId(result.shape_id(), result.edge_id())));
|
|
326
|
+
}
|
|
327
|
+
return testing_results;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Use "query" to find the closest edge(s) to the given target. Verify that
|
|
331
|
+
// the results satisfy the search criteria.
|
|
332
|
+
static void GetClosestEdges(S2ClosestEdgeQuery::Target* target,
|
|
333
|
+
S2ClosestEdgeQuery *query,
|
|
334
|
+
vector<S2ClosestEdgeQuery::Result>* edges) {
|
|
335
|
+
query->FindClosestEdges(target, edges);
|
|
336
|
+
EXPECT_LE(edges->size(), query->options().max_results());
|
|
337
|
+
if (query->options().max_distance() ==
|
|
338
|
+
S2ClosestEdgeQuery::Distance::Infinity()) {
|
|
339
|
+
int min_expected = min(query->options().max_results(),
|
|
340
|
+
s2shapeutil::CountEdges(query->index()));
|
|
341
|
+
if (!query->options().include_interiors()) {
|
|
342
|
+
// We can predict exactly how many edges should be returned.
|
|
343
|
+
EXPECT_EQ(min_expected, edges->size());
|
|
344
|
+
} else {
|
|
345
|
+
// All edges should be returned, and possibly some shape interiors.
|
|
346
|
+
EXPECT_LE(min_expected, edges->size());
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
for (const auto& edge : *edges) {
|
|
350
|
+
// Check that the edge satisfies the max_distance() condition.
|
|
351
|
+
EXPECT_LT(edge.distance(), query->options().max_distance());
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
static S2ClosestEdgeQuery::Result TestFindClosestEdges(
|
|
356
|
+
S2ClosestEdgeQuery::Target* target, S2ClosestEdgeQuery *query) {
|
|
357
|
+
vector<S2ClosestEdgeQuery::Result> expected, actual;
|
|
358
|
+
query->mutable_options()->set_use_brute_force(true);
|
|
359
|
+
GetClosestEdges(target, query, &expected);
|
|
360
|
+
query->mutable_options()->set_use_brute_force(false);
|
|
361
|
+
GetClosestEdges(target, query, &actual);
|
|
362
|
+
EXPECT_TRUE(CheckDistanceResults(ConvertResults(expected),
|
|
363
|
+
ConvertResults(actual),
|
|
364
|
+
query->options().max_results(),
|
|
365
|
+
query->options().max_distance(),
|
|
366
|
+
query->options().max_error()))
|
|
367
|
+
<< "max_results=" << query->options().max_results()
|
|
368
|
+
<< ", max_distance=" << query->options().max_distance()
|
|
369
|
+
<< ", max_error=" << query->options().max_error();
|
|
370
|
+
|
|
371
|
+
if (expected.empty()) return S2ClosestEdgeQuery::Result();
|
|
372
|
+
|
|
373
|
+
// Note that when options.max_error() > 0, expected[0].distance() may not
|
|
374
|
+
// be the minimum distance. It is never larger by more than max_error(),
|
|
375
|
+
// but the actual value also depends on max_results().
|
|
376
|
+
//
|
|
377
|
+
// Here we verify that GetDistance() and IsDistanceLess() return results
|
|
378
|
+
// that are consistent with the max_error() setting.
|
|
379
|
+
S1ChordAngle max_error = query->options().max_error();
|
|
380
|
+
S1ChordAngle min_distance = expected[0].distance();
|
|
381
|
+
EXPECT_LE(query->GetDistance(target), min_distance + max_error);
|
|
382
|
+
|
|
383
|
+
// Test IsDistanceLess().
|
|
384
|
+
EXPECT_FALSE(query->IsDistanceLess(target, min_distance - max_error));
|
|
385
|
+
EXPECT_TRUE(query->IsConservativeDistanceLessOrEqual(target, min_distance));
|
|
386
|
+
|
|
387
|
+
// Return the closest edge result so that we can also test Project.
|
|
388
|
+
return expected[0];
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// The running time of this test is proportional to
|
|
392
|
+
// (num_indexes + num_queries) * num_edges.
|
|
393
|
+
// (Note that every query is checked using the brute force algorithm.)
|
|
394
|
+
static void TestWithIndexFactory(const s2testing::ShapeIndexFactory& factory,
|
|
395
|
+
int num_indexes, int num_edges,
|
|
396
|
+
int num_queries) {
|
|
397
|
+
// Build a set of MutableS2ShapeIndexes containing the desired geometry.
|
|
398
|
+
vector<S2Cap> index_caps;
|
|
399
|
+
vector<unique_ptr<MutableS2ShapeIndex>> indexes;
|
|
400
|
+
for (int i = 0; i < num_indexes; ++i) {
|
|
401
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
|
|
402
|
+
index_caps.push_back(S2Cap(S2Testing::RandomPoint(), kTestCapRadius));
|
|
403
|
+
indexes.push_back(make_unique<MutableS2ShapeIndex>());
|
|
404
|
+
factory.AddEdges(index_caps.back(), num_edges, indexes.back().get());
|
|
405
|
+
}
|
|
406
|
+
for (int i = 0; i < num_queries; ++i) {
|
|
407
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
|
|
408
|
+
int i_index = S2Testing::rnd.Uniform(num_indexes);
|
|
409
|
+
const S2Cap& index_cap = index_caps[i_index];
|
|
410
|
+
|
|
411
|
+
// Choose query points from an area approximately 4x larger than the
|
|
412
|
+
// geometry being tested.
|
|
413
|
+
S1Angle query_radius = 2 * index_cap.GetRadius();
|
|
414
|
+
S2Cap query_cap(index_cap.center(), query_radius);
|
|
415
|
+
S2ClosestEdgeQuery query(indexes[i_index].get());
|
|
416
|
+
|
|
417
|
+
// Occasionally we don't set any limit on the number of result edges.
|
|
418
|
+
// (This may return all edges if we also don't set a distance limit.)
|
|
419
|
+
if (!S2Testing::rnd.OneIn(5)) {
|
|
420
|
+
query.mutable_options()->set_max_results(1 + S2Testing::rnd.Uniform(10));
|
|
421
|
+
}
|
|
422
|
+
// We set a distance limit 2/3 of the time.
|
|
423
|
+
if (!S2Testing::rnd.OneIn(3)) {
|
|
424
|
+
query.mutable_options()->set_max_distance(
|
|
425
|
+
S2Testing::rnd.RandDouble() * query_radius);
|
|
426
|
+
}
|
|
427
|
+
if (S2Testing::rnd.OneIn(2)) {
|
|
428
|
+
// Choose a maximum error whose logarithm is uniformly distributed over
|
|
429
|
+
// a reasonable range, except that it is sometimes zero.
|
|
430
|
+
query.mutable_options()->set_max_error(S1Angle::Radians(
|
|
431
|
+
pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius.radians()));
|
|
432
|
+
}
|
|
433
|
+
query.mutable_options()->set_include_interiors(S2Testing::rnd.OneIn(2));
|
|
434
|
+
int target_type = S2Testing::rnd.Uniform(4);
|
|
435
|
+
if (target_type == 0) {
|
|
436
|
+
// Find the edges closest to a given point.
|
|
437
|
+
S2Point point = S2Testing::SamplePoint(query_cap);
|
|
438
|
+
S2ClosestEdgeQuery::PointTarget target(point);
|
|
439
|
+
auto closest = TestFindClosestEdges(&target, &query);
|
|
440
|
+
if (!closest.distance().is_infinity()) {
|
|
441
|
+
// Also test the Project method.
|
|
442
|
+
EXPECT_NEAR(
|
|
443
|
+
closest.distance().ToAngle().radians(),
|
|
444
|
+
S1Angle(point, query.Project(point, closest)).radians(),
|
|
445
|
+
kTestChordAngleError);
|
|
446
|
+
}
|
|
447
|
+
} else if (target_type == 1) {
|
|
448
|
+
// Find the edges closest to a given edge.
|
|
449
|
+
S2Point a = S2Testing::SamplePoint(query_cap);
|
|
450
|
+
S2Point b = S2Testing::SamplePoint(
|
|
451
|
+
S2Cap(a, pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius));
|
|
452
|
+
S2ClosestEdgeQuery::EdgeTarget target(a, b);
|
|
453
|
+
TestFindClosestEdges(&target, &query);
|
|
454
|
+
} else if (target_type == 2) {
|
|
455
|
+
// Find the edges closest to a given cell.
|
|
456
|
+
int min_level = S2::kMaxDiag.GetLevelForMaxValue(query_radius.radians());
|
|
457
|
+
int level = min_level + S2Testing::rnd.Uniform(
|
|
458
|
+
S2CellId::kMaxLevel - min_level + 1);
|
|
459
|
+
S2Point a = S2Testing::SamplePoint(query_cap);
|
|
460
|
+
S2Cell cell(S2CellId(a).parent(level));
|
|
461
|
+
S2ClosestEdgeQuery::CellTarget target(cell);
|
|
462
|
+
TestFindClosestEdges(&target, &query);
|
|
463
|
+
} else {
|
|
464
|
+
S2_DCHECK_EQ(3, target_type);
|
|
465
|
+
// Use another one of the pre-built indexes as the target.
|
|
466
|
+
int j_index = S2Testing::rnd.Uniform(num_indexes);
|
|
467
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(indexes[j_index].get());
|
|
468
|
+
target.set_include_interiors(S2Testing::rnd.OneIn(2));
|
|
469
|
+
TestFindClosestEdges(&target, &query);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
static const int kNumIndexes = 50;
|
|
475
|
+
static const int kNumEdges = 100;
|
|
476
|
+
static const int kNumQueries = 200;
|
|
477
|
+
|
|
478
|
+
TEST(S2ClosestEdgeQuery, CircleEdges) {
|
|
479
|
+
TestWithIndexFactory(s2testing::RegularLoopShapeIndexFactory(),
|
|
480
|
+
kNumIndexes, kNumEdges, kNumQueries);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
TEST(S2ClosestEdgeQuery, FractalEdges) {
|
|
484
|
+
TestWithIndexFactory(s2testing::FractalLoopShapeIndexFactory(),
|
|
485
|
+
kNumIndexes, kNumEdges, kNumQueries);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
TEST(S2ClosestEdgeQuery, PointCloudEdges) {
|
|
489
|
+
TestWithIndexFactory(s2testing::PointCloudShapeIndexFactory(),
|
|
490
|
+
kNumIndexes, kNumEdges, kNumQueries);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
TEST(S2ClosestEdgeQuery, ConservativeCellDistanceIsUsed) {
|
|
494
|
+
// Don't use google::FlagSaver, so it works in opensource without gflags.
|
|
495
|
+
const int saved_seed = FLAGS_s2_random_seed;
|
|
496
|
+
// These specific test cases happen to fail if max_error() is not properly
|
|
497
|
+
// taken into account when measuring distances to S2ShapeIndex cells.
|
|
498
|
+
for (int seed : {42, 681, 894, 1018, 1750, 1759, 2401}) {
|
|
499
|
+
FLAGS_s2_random_seed = seed;
|
|
500
|
+
TestWithIndexFactory(s2testing::FractalLoopShapeIndexFactory(),
|
|
501
|
+
5, 100, 10);
|
|
502
|
+
}
|
|
503
|
+
FLAGS_s2_random_seed = saved_seed;
|
|
504
|
+
}
|
|
505
|
+
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Copyright 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
|
+
// Common code for testing furthest/closest edge/point queries.
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2CLOSEST_EDGE_QUERY_TESTING_H_
|
|
19
|
+
#define S2_S2CLOSEST_EDGE_QUERY_TESTING_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/mutable_s2shape_index.h"
|
|
24
|
+
#include "s2/s1angle.h"
|
|
25
|
+
#include "s2/s2cap.h"
|
|
26
|
+
#include "s2/s2cell.h"
|
|
27
|
+
#include "s2/s2edge_distances.h"
|
|
28
|
+
#include "s2/s2edge_vector_shape.h"
|
|
29
|
+
#include "s2/s2loop.h"
|
|
30
|
+
#include "s2/s2metrics.h"
|
|
31
|
+
#include "s2/s2point.h"
|
|
32
|
+
#include "s2/s2point_vector_shape.h"
|
|
33
|
+
#include "s2/s2shapeutil_count_edges.h"
|
|
34
|
+
#include "s2/s2shapeutil_shape_edge_id.h"
|
|
35
|
+
#include "s2/s2testing.h"
|
|
36
|
+
|
|
37
|
+
namespace s2testing {
|
|
38
|
+
|
|
39
|
+
// An abstract class that adds edges to a MutableS2ShapeIndex for benchmarking.
|
|
40
|
+
class ShapeIndexFactory {
|
|
41
|
+
public:
|
|
42
|
+
virtual ~ShapeIndexFactory() {}
|
|
43
|
+
|
|
44
|
+
// Requests that approximately "num_edges" edges located within the given
|
|
45
|
+
// S2Cap bound should be added to "index".
|
|
46
|
+
virtual void AddEdges(const S2Cap& index_cap, int num_edges,
|
|
47
|
+
MutableS2ShapeIndex* index) const = 0;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Generates a regular loop that approximately fills the given S2Cap.
|
|
51
|
+
//
|
|
52
|
+
// Regular loops are nearly the worst case for distance calculations, since
|
|
53
|
+
// many edges are nearly equidistant from any query point that is not
|
|
54
|
+
// immediately adjacent to the loop.
|
|
55
|
+
class RegularLoopShapeIndexFactory : public ShapeIndexFactory {
|
|
56
|
+
public:
|
|
57
|
+
void AddEdges(const S2Cap& index_cap, int num_edges,
|
|
58
|
+
MutableS2ShapeIndex* index) const override {
|
|
59
|
+
index->Add(absl::make_unique<S2Loop::OwningShape>(S2Loop::MakeRegularLoop(
|
|
60
|
+
index_cap.center(), index_cap.GetRadius(), num_edges)));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Generates a fractal loop that approximately fills the given S2Cap.
|
|
65
|
+
class FractalLoopShapeIndexFactory : public ShapeIndexFactory {
|
|
66
|
+
public:
|
|
67
|
+
void AddEdges(const S2Cap& index_cap, int num_edges,
|
|
68
|
+
MutableS2ShapeIndex* index) const override {
|
|
69
|
+
S2Testing::Fractal fractal;
|
|
70
|
+
fractal.SetLevelForApproxMaxEdges(num_edges);
|
|
71
|
+
index->Add(absl::make_unique<S2Loop::OwningShape>(
|
|
72
|
+
fractal.MakeLoop(S2Testing::GetRandomFrameAt(index_cap.center()),
|
|
73
|
+
index_cap.GetRadius())));
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Generates a cloud of points that approximately fills the given S2Cap.
|
|
78
|
+
class PointCloudShapeIndexFactory : public ShapeIndexFactory {
|
|
79
|
+
public:
|
|
80
|
+
void AddEdges(const S2Cap& index_cap, int num_edges,
|
|
81
|
+
MutableS2ShapeIndex* index) const override {
|
|
82
|
+
std::vector<S2Point> points;
|
|
83
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
84
|
+
points.push_back(S2Testing::SamplePoint(index_cap));
|
|
85
|
+
}
|
|
86
|
+
index->Add(absl::make_unique<S2PointVectorShape>(std::move(points)));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
} // namespace s2testing
|
|
91
|
+
#endif // S2_S2CLOSEST_EDGE_QUERY_TESTING_H_
|