@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,63 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// This file contains some basic tests of the templating support. Testing of
|
|
19
|
+
// the actual algorithms is in s2closest_cell_query_test.cc.
|
|
20
|
+
|
|
21
|
+
#include "s2/s2closest_cell_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
|
+
using s2textformat::MakeCellIdOrDie;
|
|
29
|
+
using s2textformat::MakeCellUnionOrDie;
|
|
30
|
+
|
|
31
|
+
namespace {
|
|
32
|
+
|
|
33
|
+
// This is a proof-of-concept prototype of a possible S2FurthestCellQuery
|
|
34
|
+
// class. The purpose of this test is just to make sure that the code
|
|
35
|
+
// compiles and does something reasonable.
|
|
36
|
+
using FurthestCellQuery = S2ClosestCellQueryBase<S2MaxDistance>;
|
|
37
|
+
|
|
38
|
+
class FurthestPointTarget final : public S2MaxDistancePointTarget {
|
|
39
|
+
public:
|
|
40
|
+
explicit FurthestPointTarget(const S2Point& point)
|
|
41
|
+
: S2MaxDistancePointTarget(point) {}
|
|
42
|
+
|
|
43
|
+
int max_brute_force_index_size() const override {
|
|
44
|
+
return 10; // Arbitrary.
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
TEST(S2ClosestCellQueryBase, MaxDistance) {
|
|
49
|
+
S2CellIndex index;
|
|
50
|
+
index.Add(MakeCellUnionOrDie("0/123, 0/22, 0/3"), 1 /*label*/);
|
|
51
|
+
index.Build();
|
|
52
|
+
FurthestCellQuery query(&index);
|
|
53
|
+
FurthestCellQuery::Options options;
|
|
54
|
+
options.set_max_results(1);
|
|
55
|
+
FurthestPointTarget target(MakeCellIdOrDie("3/123").ToPoint());
|
|
56
|
+
auto results = query.FindClosestCells(&target, options);
|
|
57
|
+
ASSERT_EQ(1, results.size());
|
|
58
|
+
EXPECT_EQ("0/123", results[0].cell_id().ToString());
|
|
59
|
+
EXPECT_EQ(1, results[0].label());
|
|
60
|
+
EXPECT_EQ(4.0, S1ChordAngle(results[0].distance()).length2());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
} // namespace
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2closest_cell_query.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <set>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "s2/base/stringprintf.h"
|
|
25
|
+
#include <gtest/gtest.h>
|
|
26
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
27
|
+
#include "s2/mutable_s2shape_index.h"
|
|
28
|
+
#include "s2/s1angle.h"
|
|
29
|
+
#include "s2/s2cap.h"
|
|
30
|
+
#include "s2/s2cell.h"
|
|
31
|
+
#include "s2/s2cell_id.h"
|
|
32
|
+
#include "s2/s2closest_edge_query_testing.h"
|
|
33
|
+
#include "s2/s2loop.h"
|
|
34
|
+
#include "s2/s2testing.h"
|
|
35
|
+
#include "s2/s2text_format.h"
|
|
36
|
+
|
|
37
|
+
namespace {
|
|
38
|
+
|
|
39
|
+
using absl::make_unique;
|
|
40
|
+
using s2testing::FractalLoopShapeIndexFactory;
|
|
41
|
+
using s2textformat::MakeCellIdOrDie;
|
|
42
|
+
using s2textformat::MakePointOrDie;
|
|
43
|
+
using std::min;
|
|
44
|
+
using std::pair;
|
|
45
|
+
using std::unique_ptr;
|
|
46
|
+
using std::vector;
|
|
47
|
+
|
|
48
|
+
using LabelledCell = S2CellIndex::LabelledCell;
|
|
49
|
+
|
|
50
|
+
TEST(S2ClosestCellQuery, NoCells) {
|
|
51
|
+
S2CellIndex index;
|
|
52
|
+
index.Build();
|
|
53
|
+
S2ClosestCellQuery query(&index);
|
|
54
|
+
S2ClosestCellQuery::PointTarget target(S2Point(1, 0, 0));
|
|
55
|
+
const auto result = query.FindClosestCell(&target);
|
|
56
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), result.distance());
|
|
57
|
+
EXPECT_EQ(S2CellId::None(), result.cell_id());
|
|
58
|
+
EXPECT_EQ(-1, result.label());
|
|
59
|
+
EXPECT_TRUE(result.is_empty());
|
|
60
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), query.GetDistance(&target));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
TEST(S2ClosestCellQuery, OptionsNotModified) {
|
|
64
|
+
// Tests that FindClosestCell(), GetDistance(), and IsDistanceLess() do not
|
|
65
|
+
// modify query.options(), even though all of these methods have their own
|
|
66
|
+
// specific options requirements.
|
|
67
|
+
S2ClosestCellQuery::Options options;
|
|
68
|
+
options.set_max_results(3);
|
|
69
|
+
options.set_max_distance(S1ChordAngle::Degrees(3));
|
|
70
|
+
options.set_max_error(S1ChordAngle::Degrees(0.001));
|
|
71
|
+
S2CellIndex index;
|
|
72
|
+
index.Add(S2CellId(MakePointOrDie("1:1")), 1);
|
|
73
|
+
index.Add(S2CellId(MakePointOrDie("1:2")), 2);
|
|
74
|
+
index.Add(S2CellId(MakePointOrDie("1:3")), 3);
|
|
75
|
+
index.Build();
|
|
76
|
+
S2ClosestCellQuery query(&index, options);
|
|
77
|
+
S2ClosestCellQuery::PointTarget target(MakePointOrDie("2:2"));
|
|
78
|
+
EXPECT_EQ(2, query.FindClosestCell(&target).label());
|
|
79
|
+
EXPECT_NEAR(1.0, query.GetDistance(&target).degrees(), 1e-7);
|
|
80
|
+
EXPECT_TRUE(query.IsDistanceLess(&target, S1ChordAngle::Degrees(1.5)));
|
|
81
|
+
|
|
82
|
+
// Verify that none of the options above were modified.
|
|
83
|
+
EXPECT_EQ(options.max_results(), query.options().max_results());
|
|
84
|
+
EXPECT_EQ(options.max_distance(), query.options().max_distance());
|
|
85
|
+
EXPECT_EQ(options.max_error(), query.options().max_error());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
TEST(S2ClosestCellQuery, DistanceEqualToLimit) {
|
|
89
|
+
// Tests the behavior of IsDistanceLess, IsDistanceLessOrEqual, and
|
|
90
|
+
// IsConservativeDistanceLessOrEqual (and the corresponding Options) when
|
|
91
|
+
// the distance to the target exactly equals the chosen limit.
|
|
92
|
+
S2CellId id0(MakePointOrDie("23:12")), id1(MakePointOrDie("47:11"));
|
|
93
|
+
S2CellIndex index;
|
|
94
|
+
index.Add(id0, 0);
|
|
95
|
+
index.Build();
|
|
96
|
+
S2ClosestCellQuery query(&index);
|
|
97
|
+
|
|
98
|
+
// Start with two identical cells and a zero distance.
|
|
99
|
+
S2ClosestCellQuery::CellTarget target0(S2Cell{id0});
|
|
100
|
+
S1ChordAngle dist0 = S1ChordAngle::Zero();
|
|
101
|
+
EXPECT_FALSE(query.IsDistanceLess(&target0, dist0));
|
|
102
|
+
EXPECT_TRUE(query.IsDistanceLessOrEqual(&target0, dist0));
|
|
103
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target0, dist0));
|
|
104
|
+
|
|
105
|
+
// Now try two cells separated by a non-zero distance.
|
|
106
|
+
S2ClosestCellQuery::CellTarget target1(S2Cell{id1});
|
|
107
|
+
S1ChordAngle dist1 = S2Cell(id0).GetDistance(S2Cell(id1));
|
|
108
|
+
EXPECT_FALSE(query.IsDistanceLess(&target1, dist1));
|
|
109
|
+
EXPECT_TRUE(query.IsDistanceLessOrEqual(&target1, dist1));
|
|
110
|
+
EXPECT_TRUE(query.IsConservativeDistanceLessOrEqual(&target1, dist1));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(S2ClosestCellQuery, TargetPointInsideIndexedCell) {
|
|
114
|
+
// Tests a target point in the interior of an indexed cell.
|
|
115
|
+
S2CellId cell_id = MakeCellIdOrDie("4/012");
|
|
116
|
+
S2CellIndex index;
|
|
117
|
+
index.Add(cell_id, 1);
|
|
118
|
+
index.Build();
|
|
119
|
+
S2ClosestCellQuery query(&index);
|
|
120
|
+
S2ClosestCellQuery::PointTarget target(cell_id.ToPoint());
|
|
121
|
+
auto result = query.FindClosestCell(&target);
|
|
122
|
+
EXPECT_EQ(S1ChordAngle::Zero(), result.distance());
|
|
123
|
+
EXPECT_EQ(cell_id, result.cell_id());
|
|
124
|
+
EXPECT_EQ(1, result.label());
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
TEST(S2ClosestCellQuery, EmptyTargetOptimized) {
|
|
128
|
+
// Ensure that the optimized algorithm handles empty targets when a distance
|
|
129
|
+
// limit is specified.
|
|
130
|
+
S2CellIndex index;
|
|
131
|
+
for (int i = 0; i < 1000; ++i) {
|
|
132
|
+
index.Add(S2Testing::GetRandomCellId(), i);
|
|
133
|
+
}
|
|
134
|
+
index.Build();
|
|
135
|
+
S2ClosestCellQuery query(&index);
|
|
136
|
+
query.mutable_options()->set_max_distance(S1Angle::Radians(1e-5));
|
|
137
|
+
MutableS2ShapeIndex target_index;
|
|
138
|
+
S2ClosestCellQuery::ShapeIndexTarget target(&target_index);
|
|
139
|
+
EXPECT_EQ(0, query.FindClosestCells(&target).size());
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
TEST(S2ClosestCellQuery, EmptyCellUnionTarget) {
|
|
143
|
+
// Verifies that distances are measured correctly to empty S2CellUnion
|
|
144
|
+
// targets.
|
|
145
|
+
S2ClosestCellQuery::CellUnionTarget target(S2CellUnion{});
|
|
146
|
+
|
|
147
|
+
S2CellIndex empty_index;
|
|
148
|
+
empty_index.Build();
|
|
149
|
+
S2ClosestCellQuery empty_query(&empty_index);
|
|
150
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), empty_query.GetDistance(&target));
|
|
151
|
+
|
|
152
|
+
S2CellIndex one_cell_index;
|
|
153
|
+
one_cell_index.Add(MakeCellIdOrDie("1/123123"), 1);
|
|
154
|
+
one_cell_index.Build();
|
|
155
|
+
S2ClosestCellQuery one_cell_query(&one_cell_index);
|
|
156
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), one_cell_query.GetDistance(&target));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// An abstract class that adds cells to an S2CellIndex for benchmarking.
|
|
160
|
+
struct CellIndexFactory {
|
|
161
|
+
public:
|
|
162
|
+
virtual ~CellIndexFactory() {}
|
|
163
|
+
|
|
164
|
+
// Requests that approximately "num_cells" cells located within the given
|
|
165
|
+
// S2Cap bound should be added to "index".
|
|
166
|
+
virtual void AddCells(const S2Cap& index_cap, int num_cells,
|
|
167
|
+
S2CellIndex* index) const = 0;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Generates a cloud of points that approximately fills the given S2Cap, and
|
|
171
|
+
// adds a leaf S2CellId for each one.
|
|
172
|
+
class PointCloudCellIndexFactory : public CellIndexFactory {
|
|
173
|
+
public:
|
|
174
|
+
void AddCells(const S2Cap& index_cap, int num_cells,
|
|
175
|
+
S2CellIndex* index) const override {
|
|
176
|
+
for (int i = 0; i < num_cells; ++i) {
|
|
177
|
+
index->Add(S2CellId(S2Testing::SamplePoint(index_cap)), i);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// Generates a collection of S2Caps that are approximately within the given
|
|
183
|
+
// "index_cap", generates a covering with "max_cells_per_cap" for each one,
|
|
184
|
+
// and adds the coverings to the index. The radius of each cap is chosen
|
|
185
|
+
// randomly such that the total area of the coverings is approximately
|
|
186
|
+
// "cap_density" times the area of "index_cap". In other words, a random
|
|
187
|
+
// point inside "index_cap" is likely to intersect about "cap_density"
|
|
188
|
+
// coverings (within a factor of 2 or so).
|
|
189
|
+
class CapsCellIndexFactory : public CellIndexFactory {
|
|
190
|
+
public:
|
|
191
|
+
CapsCellIndexFactory(int max_cells_per_cap, double cap_density)
|
|
192
|
+
: max_cells_per_cap_(max_cells_per_cap),
|
|
193
|
+
cap_density_(cap_density) {}
|
|
194
|
+
|
|
195
|
+
void AddCells(const S2Cap& index_cap, int num_cells,
|
|
196
|
+
S2CellIndex* index) const override {
|
|
197
|
+
// All of this math is fairly approximate, since the coverings don't have
|
|
198
|
+
// exactly the given number of cells, etc.
|
|
199
|
+
int num_caps = (num_cells - 1) / max_cells_per_cap_ + 1;
|
|
200
|
+
double max_area = index_cap.GetArea() * cap_density_ / num_caps;
|
|
201
|
+
for (int i = 0; i < num_caps; ++i) {
|
|
202
|
+
// The coverings are bigger than the caps, so we compensate for this by
|
|
203
|
+
// choosing the cap area randomly up to the limit value.
|
|
204
|
+
auto cap = S2Cap::FromCenterArea(S2Testing::SamplePoint(index_cap),
|
|
205
|
+
S2Testing::rnd.RandDouble() * max_area);
|
|
206
|
+
S2RegionCoverer coverer;
|
|
207
|
+
coverer.mutable_options()->set_max_cells(max_cells_per_cap_);
|
|
208
|
+
index->Add(coverer.GetCovering(cap), i);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
private:
|
|
213
|
+
int max_cells_per_cap_;
|
|
214
|
+
double cap_density_;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// The approximate radius of S2Cap from which query cells are chosen.
|
|
218
|
+
static const S1Angle kTestCapRadius = S2Testing::KmToAngle(10);
|
|
219
|
+
|
|
220
|
+
using TestingResult = pair<S2MinDistance, LabelledCell>;
|
|
221
|
+
|
|
222
|
+
// Converts to the format required by CheckDistanceResults() in s2testing.h.
|
|
223
|
+
vector<TestingResult> ConvertResults(
|
|
224
|
+
const vector<S2ClosestCellQuery::Result>& results) {
|
|
225
|
+
vector<TestingResult> testing_results;
|
|
226
|
+
for (const auto& result : results) {
|
|
227
|
+
testing_results.push_back(
|
|
228
|
+
TestingResult(result.distance(),
|
|
229
|
+
LabelledCell(result.cell_id(), result.label())));
|
|
230
|
+
}
|
|
231
|
+
return testing_results;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Use "query" to find the closest cell(s) to the given target, and extract
|
|
235
|
+
// the query results into the given vector. Also verify that the results
|
|
236
|
+
// satisfy the search criteria.
|
|
237
|
+
static void GetClosestCells(S2ClosestCellQuery::Target* target,
|
|
238
|
+
S2ClosestCellQuery* query,
|
|
239
|
+
vector<TestingResult>* results) {
|
|
240
|
+
const auto query_results = query->FindClosestCells(target);
|
|
241
|
+
EXPECT_LE(query_results.size(), query->options().max_results());
|
|
242
|
+
const S2Region* region = query->options().region();
|
|
243
|
+
if (!region && query->options().max_distance() == S1ChordAngle::Infinity()) {
|
|
244
|
+
// We can predict exactly how many cells should be returned.
|
|
245
|
+
EXPECT_EQ(std::min(query->options().max_results(),
|
|
246
|
+
query->index().num_cells()),
|
|
247
|
+
query_results.size());
|
|
248
|
+
}
|
|
249
|
+
for (const auto& result : query_results) {
|
|
250
|
+
// Check that the cell satisfies the region() condition.
|
|
251
|
+
if (region) EXPECT_TRUE(region->MayIntersect(S2Cell(result.cell_id())));
|
|
252
|
+
|
|
253
|
+
// Check that it satisfies the max_distance() condition.
|
|
254
|
+
EXPECT_LT(result.distance(), query->options().max_distance());
|
|
255
|
+
results->push_back(TestingResult(
|
|
256
|
+
result.distance(), LabelledCell(result.cell_id(), result.label())));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static void TestFindClosestCells(S2ClosestCellQuery::Target* target,
|
|
261
|
+
S2ClosestCellQuery *query) {
|
|
262
|
+
vector<TestingResult> expected, actual;
|
|
263
|
+
query->mutable_options()->set_use_brute_force(true);
|
|
264
|
+
GetClosestCells(target, query, &expected);
|
|
265
|
+
query->mutable_options()->set_use_brute_force(false);
|
|
266
|
+
GetClosestCells(target, query, &actual);
|
|
267
|
+
EXPECT_TRUE(CheckDistanceResults(expected, actual,
|
|
268
|
+
query->options().max_results(),
|
|
269
|
+
query->options().max_distance(),
|
|
270
|
+
query->options().max_error()))
|
|
271
|
+
<< "max_results=" << query->options().max_results()
|
|
272
|
+
<< ", max_distance=" << query->options().max_distance()
|
|
273
|
+
<< ", max_error=" << query->options().max_error();
|
|
274
|
+
|
|
275
|
+
if (expected.empty()) return;
|
|
276
|
+
|
|
277
|
+
// Note that when options.max_error() > 0, expected[0].distance() may not be
|
|
278
|
+
// the minimum distance. It is never larger by more than max_error(), but
|
|
279
|
+
// the actual value also depends on max_results().
|
|
280
|
+
//
|
|
281
|
+
// Here we verify that GetDistance() and IsDistanceLess() return results
|
|
282
|
+
// that are consistent with the max_error() setting.
|
|
283
|
+
S1ChordAngle max_error = query->options().max_error();
|
|
284
|
+
S1ChordAngle min_distance = expected[0].first;
|
|
285
|
+
EXPECT_LE(query->GetDistance(target), min_distance + max_error);
|
|
286
|
+
|
|
287
|
+
// Test IsDistanceLess().
|
|
288
|
+
EXPECT_FALSE(query->IsDistanceLess(target, min_distance - max_error));
|
|
289
|
+
EXPECT_TRUE(query->IsConservativeDistanceLessOrEqual(target, min_distance));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// The running time of this test is proportional to
|
|
293
|
+
// (num_indexes + num_queries) * num_cells.
|
|
294
|
+
// (Note that every query is checked using the brute force algorithm.)
|
|
295
|
+
static void TestWithIndexFactory(const CellIndexFactory& factory,
|
|
296
|
+
int num_indexes, int num_cells,
|
|
297
|
+
int num_queries) {
|
|
298
|
+
// Build a set of S2CellIndexes containing the desired geometry.
|
|
299
|
+
vector<S2Cap> index_caps;
|
|
300
|
+
vector<unique_ptr<S2CellIndex>> indexes;
|
|
301
|
+
for (int i = 0; i < num_indexes; ++i) {
|
|
302
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
|
|
303
|
+
index_caps.push_back(S2Cap(S2Testing::RandomPoint(), kTestCapRadius));
|
|
304
|
+
auto index = make_unique<S2CellIndex>();
|
|
305
|
+
factory.AddCells(index_caps.back(), num_cells, index.get());
|
|
306
|
+
index->Build();
|
|
307
|
+
indexes.push_back(std::move(index));
|
|
308
|
+
}
|
|
309
|
+
for (int i = 0; i < num_queries; ++i) {
|
|
310
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
|
|
311
|
+
int i_index = S2Testing::rnd.Uniform(num_indexes);
|
|
312
|
+
const S2Cap& index_cap = index_caps[i_index];
|
|
313
|
+
|
|
314
|
+
// Choose query points from an area approximately 4x larger than the
|
|
315
|
+
// geometry being tested.
|
|
316
|
+
S1Angle query_radius = 2 * index_cap.GetRadius();
|
|
317
|
+
S2Cap query_cap(index_cap.center(), query_radius);
|
|
318
|
+
S2ClosestCellQuery query(indexes[i_index].get());
|
|
319
|
+
|
|
320
|
+
// Occasionally we don't set any limit on the number of result cells.
|
|
321
|
+
// (This may return all cells if we also don't set a distance limit.)
|
|
322
|
+
if (!S2Testing::rnd.OneIn(10)) {
|
|
323
|
+
query.mutable_options()->set_max_results(1 + S2Testing::rnd.Uniform(10));
|
|
324
|
+
}
|
|
325
|
+
// We set a distance limit 2/3 of the time.
|
|
326
|
+
if (!S2Testing::rnd.OneIn(3)) {
|
|
327
|
+
query.mutable_options()->set_max_distance(
|
|
328
|
+
S2Testing::rnd.RandDouble() * query_radius);
|
|
329
|
+
}
|
|
330
|
+
if (S2Testing::rnd.OneIn(2)) {
|
|
331
|
+
// Choose a maximum error whose logarithm is uniformly distributed over
|
|
332
|
+
// a reasonable range, except that it is sometimes zero.
|
|
333
|
+
query.mutable_options()->set_max_error(S1Angle::Radians(
|
|
334
|
+
pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius.radians()));
|
|
335
|
+
}
|
|
336
|
+
S2LatLngRect filter_rect = S2LatLngRect::FromCenterSize(
|
|
337
|
+
S2LatLng(S2Testing::SamplePoint(query_cap)),
|
|
338
|
+
S2LatLng(S2Testing::rnd.RandDouble() * kTestCapRadius,
|
|
339
|
+
S2Testing::rnd.RandDouble() * kTestCapRadius));
|
|
340
|
+
if (S2Testing::rnd.OneIn(5)) {
|
|
341
|
+
query.mutable_options()->set_region(&filter_rect);
|
|
342
|
+
}
|
|
343
|
+
int target_type = S2Testing::rnd.Uniform(5);
|
|
344
|
+
if (target_type == 0) {
|
|
345
|
+
// Find the cells closest to a given point.
|
|
346
|
+
S2Point point = S2Testing::SamplePoint(query_cap);
|
|
347
|
+
S2ClosestCellQuery::PointTarget target(point);
|
|
348
|
+
TestFindClosestCells(&target, &query);
|
|
349
|
+
} else if (target_type == 1) {
|
|
350
|
+
// Find the cells closest to a given edge.
|
|
351
|
+
S2Point a = S2Testing::SamplePoint(query_cap);
|
|
352
|
+
S2Point b = S2Testing::SamplePoint(
|
|
353
|
+
S2Cap(a, pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius));
|
|
354
|
+
S2ClosestCellQuery::EdgeTarget target(a, b);
|
|
355
|
+
TestFindClosestCells(&target, &query);
|
|
356
|
+
} else if (target_type == 2) {
|
|
357
|
+
// Find the cells closest to a given cell.
|
|
358
|
+
int min_level = S2::kMaxDiag.GetLevelForMaxValue(query_radius.radians());
|
|
359
|
+
int level = min_level + S2Testing::rnd.Uniform(
|
|
360
|
+
S2CellId::kMaxLevel - min_level + 1);
|
|
361
|
+
S2Point a = S2Testing::SamplePoint(query_cap);
|
|
362
|
+
S2Cell cell(S2CellId(a).parent(level));
|
|
363
|
+
S2ClosestCellQuery::CellTarget target(cell);
|
|
364
|
+
TestFindClosestCells(&target, &query);
|
|
365
|
+
} else if (target_type == 3) {
|
|
366
|
+
// Find the cells closest to an S2Cap covering.
|
|
367
|
+
S2Cap cap(S2Testing::SamplePoint(query_cap),
|
|
368
|
+
0.1 * pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius);
|
|
369
|
+
S2RegionCoverer coverer;
|
|
370
|
+
coverer.mutable_options()->set_max_cells(16);
|
|
371
|
+
S2ClosestCellQuery::CellUnionTarget target(coverer.GetCovering(cap));
|
|
372
|
+
TestFindClosestCells(&target, &query);
|
|
373
|
+
} else {
|
|
374
|
+
S2_DCHECK_EQ(4, target_type);
|
|
375
|
+
MutableS2ShapeIndex target_index;
|
|
376
|
+
s2testing::FractalLoopShapeIndexFactory().AddEdges(index_cap, 100,
|
|
377
|
+
&target_index);
|
|
378
|
+
S2ClosestCellQuery::ShapeIndexTarget target(&target_index);
|
|
379
|
+
target.set_include_interiors(S2Testing::rnd.OneIn(2));
|
|
380
|
+
TestFindClosestCells(&target, &query);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
static const int kNumIndexes = 20;
|
|
386
|
+
static const int kNumCells = 100;
|
|
387
|
+
static const int kNumQueries = 100;
|
|
388
|
+
|
|
389
|
+
TEST(S2ClosestCellQuery, PointCloudCells) {
|
|
390
|
+
TestWithIndexFactory(PointCloudCellIndexFactory(),
|
|
391
|
+
kNumIndexes, kNumCells, kNumQueries);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
TEST(S2ClosestCellQuery, CapsCells) {
|
|
395
|
+
TestWithIndexFactory(CapsCellIndexFactory(16 /*max_cells_per_cap*/,
|
|
396
|
+
0.1 /*density*/),
|
|
397
|
+
kNumIndexes, kNumCells, kNumQueries);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
TEST(S2ClosestCellQuery, ConservativeCellDistanceIsUsed) {
|
|
401
|
+
// Don't use google::FlagSaver, so it works in opensource without gflags.
|
|
402
|
+
const int saved_seed = FLAGS_s2_random_seed;
|
|
403
|
+
// These specific test cases happen to fail if max_error() is not properly
|
|
404
|
+
// taken into account when measuring distances to S2ShapeIndex cells.
|
|
405
|
+
for (int seed : {32, 109, 253, 342, 948, 1535, 1884, 1887, 2133}) {
|
|
406
|
+
FLAGS_s2_random_seed = seed;
|
|
407
|
+
TestWithIndexFactory(PointCloudCellIndexFactory(), 5, 100, 10);
|
|
408
|
+
}
|
|
409
|
+
FLAGS_s2_random_seed = saved_seed;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
} // namespace
|
|
@@ -0,0 +1,106 @@
|
|
|
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 "s2/third_party/absl/memory/memory.h"
|
|
22
|
+
#include "s2/s1angle.h"
|
|
23
|
+
#include "s2/s2cap.h"
|
|
24
|
+
#include "s2/s2cell.h"
|
|
25
|
+
#include "s2/s2cell_id.h"
|
|
26
|
+
#include "s2/s2cell_union.h"
|
|
27
|
+
#include "s2/s2edge_distances.h"
|
|
28
|
+
#include "s2/s2region_coverer.h"
|
|
29
|
+
#include "s2/s2shape_index_region.h"
|
|
30
|
+
|
|
31
|
+
void S2ClosestEdgeQuery::Options::set_conservative_max_distance(
|
|
32
|
+
S1ChordAngle max_distance) {
|
|
33
|
+
set_max_distance(Distance(max_distance.PlusError(
|
|
34
|
+
S2::GetUpdateMinDistanceMaxError(max_distance)).Successor()));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void S2ClosestEdgeQuery::Options::set_conservative_max_distance(
|
|
38
|
+
S1Angle max_distance) {
|
|
39
|
+
set_conservative_max_distance(S1ChordAngle(max_distance));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
int S2ClosestEdgeQuery::PointTarget::max_brute_force_index_size() const {
|
|
43
|
+
// Using BM_FindClosest (which finds the single closest edge), the
|
|
44
|
+
// break-even points are approximately 80, 100, and 250 edges for point
|
|
45
|
+
// cloud, fractal, and regular loop geometry respectively.
|
|
46
|
+
return 120;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
int S2ClosestEdgeQuery::EdgeTarget::max_brute_force_index_size() const {
|
|
50
|
+
// Using BM_FindClosestToEdge (which finds the single closest edge), the
|
|
51
|
+
// break-even points are approximately 40, 50, and 100 edges for point
|
|
52
|
+
// cloud, fractal, and regular loop geometry respectively.
|
|
53
|
+
return 60;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
int S2ClosestEdgeQuery::CellTarget::max_brute_force_index_size() const {
|
|
57
|
+
// Using BM_FindClosestToCell (which finds the single closest edge), the
|
|
58
|
+
// break-even points are approximately 20, 25, and 40 edges for point cloud,
|
|
59
|
+
// fractal, and regular loop geometry respectively.
|
|
60
|
+
return 30;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
int S2ClosestEdgeQuery::ShapeIndexTarget::max_brute_force_index_size() const {
|
|
64
|
+
// For BM_FindClosestToSameSizeAbuttingIndex (which uses two nearby indexes
|
|
65
|
+
// with similar edge counts), the break-even points are approximately 20,
|
|
66
|
+
// 30, and 40 edges for point cloud, fractal, and regular loop geometry
|
|
67
|
+
// respectively.
|
|
68
|
+
return 25;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
S2ClosestEdgeQuery::S2ClosestEdgeQuery() {
|
|
72
|
+
// Prevent inline constructor bloat by defining here.
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
S2ClosestEdgeQuery::~S2ClosestEdgeQuery() {
|
|
76
|
+
// Prevent inline destructor bloat by defining here.
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
bool S2ClosestEdgeQuery::IsDistanceLess(Target* target, S1ChordAngle limit) {
|
|
80
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
81
|
+
Options tmp_options = options_;
|
|
82
|
+
tmp_options.set_max_results(1);
|
|
83
|
+
tmp_options.set_max_distance(limit);
|
|
84
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
85
|
+
return !base_.FindClosestEdge(target, tmp_options).is_empty();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
bool S2ClosestEdgeQuery::IsDistanceLessOrEqual(Target* target,
|
|
89
|
+
S1ChordAngle limit) {
|
|
90
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
91
|
+
Options tmp_options = options_;
|
|
92
|
+
tmp_options.set_max_results(1);
|
|
93
|
+
tmp_options.set_inclusive_max_distance(limit);
|
|
94
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
95
|
+
return !base_.FindClosestEdge(target, tmp_options).is_empty();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
bool S2ClosestEdgeQuery::IsConservativeDistanceLessOrEqual(
|
|
99
|
+
Target* target, S1ChordAngle limit) {
|
|
100
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
101
|
+
Options tmp_options = options_;
|
|
102
|
+
tmp_options.set_max_results(1);
|
|
103
|
+
tmp_options.set_conservative_max_distance(limit);
|
|
104
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
105
|
+
return !base_.FindClosestEdge(target, tmp_options).is_empty();
|
|
106
|
+
}
|