@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,295 @@
|
|
|
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/s2min_distance_targets.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/s2closest_cell_query.h"
|
|
26
|
+
#include "s2/s2closest_edge_query.h"
|
|
27
|
+
#include "s2/s2edge_distances.h"
|
|
28
|
+
#include "s2/s2shape_index_region.h"
|
|
29
|
+
|
|
30
|
+
S2Cap S2MinDistancePointTarget::GetCapBound() {
|
|
31
|
+
return S2Cap(point_, S1ChordAngle::Zero());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
bool S2MinDistancePointTarget::UpdateMinDistance(
|
|
35
|
+
const S2Point& p, S2MinDistance* min_dist) {
|
|
36
|
+
return min_dist->UpdateMin(S2MinDistance(S1ChordAngle(p, point_)));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
bool S2MinDistancePointTarget::UpdateMinDistance(
|
|
40
|
+
const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
|
|
41
|
+
return S2::UpdateMinDistance(point_, v0, v1, min_dist);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
bool S2MinDistancePointTarget::UpdateMinDistance(
|
|
45
|
+
const S2Cell& cell, S2MinDistance* min_dist) {
|
|
46
|
+
return min_dist->UpdateMin(S2MinDistance(cell.GetDistance(point_)));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
bool S2MinDistancePointTarget::VisitContainingShapes(
|
|
50
|
+
const S2ShapeIndex& index, const ShapeVisitor& visitor) {
|
|
51
|
+
return MakeS2ContainsPointQuery(&index).VisitContainingShapes(
|
|
52
|
+
point_, [this, &visitor](S2Shape* shape) {
|
|
53
|
+
return visitor(shape, point_);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
S2Cap S2MinDistanceEdgeTarget::GetCapBound() {
|
|
58
|
+
// The following computes a radius equal to half the edge length in an
|
|
59
|
+
// efficient and numerically stable way.
|
|
60
|
+
double d2 = S1ChordAngle(a_, b_).length2();
|
|
61
|
+
double r2 = (0.5 * d2) / (1 + sqrt(1 - 0.25 * d2));
|
|
62
|
+
return S2Cap((a_ + b_).Normalize(), S1ChordAngle::FromLength2(r2));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
bool S2MinDistanceEdgeTarget::UpdateMinDistance(
|
|
66
|
+
const S2Point& p, S2MinDistance* min_dist) {
|
|
67
|
+
return S2::UpdateMinDistance(p, a_, b_, min_dist);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bool S2MinDistanceEdgeTarget::UpdateMinDistance(
|
|
71
|
+
const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
|
|
72
|
+
return S2::UpdateEdgePairMinDistance(a_, b_, v0, v1, min_dist);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
bool S2MinDistanceEdgeTarget::UpdateMinDistance(
|
|
76
|
+
const S2Cell& cell, S2MinDistance* min_dist) {
|
|
77
|
+
return min_dist->UpdateMin(S2MinDistance(cell.GetDistance(a_, b_)));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
bool S2MinDistanceEdgeTarget::VisitContainingShapes(
|
|
81
|
+
const S2ShapeIndex& index, const ShapeVisitor& visitor) {
|
|
82
|
+
// We test the center of the edge in order to ensure that edge targets AB
|
|
83
|
+
// and BA yield identical results (which is not guaranteed by the API but
|
|
84
|
+
// users might expect). Other options would be to test both endpoints, or
|
|
85
|
+
// return different results for AB and BA in some cases.
|
|
86
|
+
S2MinDistancePointTarget target((a_ + b_).Normalize());
|
|
87
|
+
return target.VisitContainingShapes(index, visitor);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
S2MinDistanceCellTarget::S2MinDistanceCellTarget(const S2Cell& cell)
|
|
91
|
+
: cell_(cell) {
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
S2Cap S2MinDistanceCellTarget::GetCapBound() {
|
|
95
|
+
return cell_.GetCapBound();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
bool S2MinDistanceCellTarget::UpdateMinDistance(const S2Point& p,
|
|
99
|
+
S2MinDistance* min_dist) {
|
|
100
|
+
return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(p)));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
bool S2MinDistanceCellTarget::UpdateMinDistance(
|
|
104
|
+
const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
|
|
105
|
+
return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(v0, v1)));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
bool S2MinDistanceCellTarget::UpdateMinDistance(
|
|
109
|
+
const S2Cell& cell, S2MinDistance* min_dist) {
|
|
110
|
+
return min_dist->UpdateMin(S2MinDistance(cell_.GetDistance(cell)));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
bool S2MinDistanceCellTarget::VisitContainingShapes(
|
|
114
|
+
const S2ShapeIndex& index, const ShapeVisitor& visitor) {
|
|
115
|
+
// The simplest approach is simply to return the polygons that contain the
|
|
116
|
+
// cell center. Alternatively, if the index cell is smaller than the target
|
|
117
|
+
// cell then we could return all polygons that are present in the
|
|
118
|
+
// S2ShapeIndexCell, but since the index is built conservatively this may
|
|
119
|
+
// include some polygons that don't quite intersect the cell. So we would
|
|
120
|
+
// either need to recheck for intersection more accurately, or weaken the
|
|
121
|
+
// VisitContainingShapes contract so that it only guarantees approximate
|
|
122
|
+
// intersection, neither of which seems like a good tradeoff.
|
|
123
|
+
S2MinDistancePointTarget target(cell_.GetCenter());
|
|
124
|
+
return target.VisitContainingShapes(index, visitor);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
S2MinDistanceCellUnionTarget::S2MinDistanceCellUnionTarget(
|
|
128
|
+
S2CellUnion cell_union)
|
|
129
|
+
: cell_union_(std::move(cell_union)),
|
|
130
|
+
query_(absl::make_unique<S2ClosestCellQuery>(&index_)) {
|
|
131
|
+
for (S2CellId cell_id : cell_union_) {
|
|
132
|
+
index_.Add(cell_id, 0);
|
|
133
|
+
}
|
|
134
|
+
index_.Build();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
S2MinDistanceCellUnionTarget::~S2MinDistanceCellUnionTarget() {
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
bool S2MinDistanceCellUnionTarget::use_brute_force() const {
|
|
141
|
+
return query_->options().use_brute_force();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void S2MinDistanceCellUnionTarget::set_use_brute_force(
|
|
145
|
+
bool use_brute_force) {
|
|
146
|
+
query_->mutable_options()->set_use_brute_force(use_brute_force);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
bool S2MinDistanceCellUnionTarget::set_max_error(
|
|
150
|
+
const S1ChordAngle& max_error) {
|
|
151
|
+
query_->mutable_options()->set_max_error(max_error);
|
|
152
|
+
return true; // Indicates that we may return suboptimal results.
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
S2Cap S2MinDistanceCellUnionTarget::GetCapBound() {
|
|
156
|
+
return cell_union_.GetCapBound();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
inline bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
|
|
160
|
+
S2MinDistanceTarget* target, S2MinDistance* min_dist) {
|
|
161
|
+
query_->mutable_options()->set_max_distance(*min_dist);
|
|
162
|
+
S2ClosestCellQuery::Result r = query_->FindClosestCell(target);
|
|
163
|
+
if (r.is_empty()) return false;
|
|
164
|
+
*min_dist = r.distance();
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
|
|
169
|
+
const S2Point& p, S2MinDistance* min_dist) {
|
|
170
|
+
S2ClosestCellQuery::PointTarget target(p);
|
|
171
|
+
return UpdateMinDistance(&target, min_dist);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
|
|
175
|
+
const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
|
|
176
|
+
S2ClosestCellQuery::EdgeTarget target(v0, v1);
|
|
177
|
+
return UpdateMinDistance(&target, min_dist);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
bool S2MinDistanceCellUnionTarget::UpdateMinDistance(
|
|
181
|
+
const S2Cell& cell, S2MinDistance* min_dist) {
|
|
182
|
+
S2ClosestCellQuery::CellTarget target(cell);
|
|
183
|
+
return UpdateMinDistance(&target, min_dist);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
bool S2MinDistanceCellUnionTarget::VisitContainingShapes(
|
|
187
|
+
const S2ShapeIndex& query_index, const ShapeVisitor& visitor) {
|
|
188
|
+
for (S2CellId cell_id : cell_union_) {
|
|
189
|
+
S2MinDistancePointTarget target(cell_id.ToPoint());
|
|
190
|
+
if (!target.VisitContainingShapes(query_index, visitor)) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
S2MinDistanceShapeIndexTarget::S2MinDistanceShapeIndexTarget(
|
|
198
|
+
const S2ShapeIndex* index)
|
|
199
|
+
: index_(index), query_(absl::make_unique<S2ClosestEdgeQuery>(index)) {
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
S2MinDistanceShapeIndexTarget::~S2MinDistanceShapeIndexTarget() {
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
bool S2MinDistanceShapeIndexTarget::include_interiors() const {
|
|
206
|
+
return query_->options().include_interiors();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
void S2MinDistanceShapeIndexTarget::set_include_interiors(
|
|
210
|
+
bool include_interiors) {
|
|
211
|
+
query_->mutable_options()->set_include_interiors(include_interiors);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
bool S2MinDistanceShapeIndexTarget::use_brute_force() const {
|
|
215
|
+
return query_->options().use_brute_force();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
void S2MinDistanceShapeIndexTarget::set_use_brute_force(
|
|
219
|
+
bool use_brute_force) {
|
|
220
|
+
query_->mutable_options()->set_use_brute_force(use_brute_force);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
bool S2MinDistanceShapeIndexTarget::set_max_error(
|
|
224
|
+
const S1ChordAngle& max_error) {
|
|
225
|
+
query_->mutable_options()->set_max_error(max_error);
|
|
226
|
+
return true; // Indicates that we may return suboptimal results.
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
S2Cap S2MinDistanceShapeIndexTarget::GetCapBound() {
|
|
230
|
+
return MakeS2ShapeIndexRegion(index_).GetCapBound();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
inline bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
|
|
234
|
+
S2MinDistanceTarget* target, S2MinDistance* min_dist) {
|
|
235
|
+
query_->mutable_options()->set_max_distance(*min_dist);
|
|
236
|
+
S2ClosestEdgeQuery::Result r = query_->FindClosestEdge(target);
|
|
237
|
+
if (r.is_empty()) return false;
|
|
238
|
+
*min_dist = r.distance();
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
|
|
243
|
+
const S2Point& p, S2MinDistance* min_dist) {
|
|
244
|
+
S2ClosestEdgeQuery::PointTarget target(p);
|
|
245
|
+
return UpdateMinDistance(&target, min_dist);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
|
|
249
|
+
const S2Point& v0, const S2Point& v1, S2MinDistance* min_dist) {
|
|
250
|
+
S2ClosestEdgeQuery::EdgeTarget target(v0, v1);
|
|
251
|
+
return UpdateMinDistance(&target, min_dist);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
bool S2MinDistanceShapeIndexTarget::UpdateMinDistance(
|
|
255
|
+
const S2Cell& cell, S2MinDistance* min_dist) {
|
|
256
|
+
S2ClosestEdgeQuery::CellTarget target(cell);
|
|
257
|
+
return UpdateMinDistance(&target, min_dist);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
bool S2MinDistanceShapeIndexTarget::VisitContainingShapes(
|
|
261
|
+
const S2ShapeIndex& query_index, const ShapeVisitor& visitor) {
|
|
262
|
+
// It is sufficient to find the set of chain starts in the target index
|
|
263
|
+
// (i.e., one vertex per connected component of edges) that are contained by
|
|
264
|
+
// the query index, except for one special case to handle full polygons.
|
|
265
|
+
//
|
|
266
|
+
// TODO(ericv): Do this by merge-joining the two S2ShapeIndexes, and share
|
|
267
|
+
// the code with S2BooleanOperation.
|
|
268
|
+
|
|
269
|
+
for (S2Shape* shape : *index_) {
|
|
270
|
+
if (shape == nullptr) continue;
|
|
271
|
+
int num_chains = shape->num_chains();
|
|
272
|
+
// Shapes that don't have any edges require a special case (below).
|
|
273
|
+
bool tested_point = false;
|
|
274
|
+
for (int c = 0; c < num_chains; ++c) {
|
|
275
|
+
S2Shape::Chain chain = shape->chain(c);
|
|
276
|
+
if (chain.length == 0) continue;
|
|
277
|
+
tested_point = true;
|
|
278
|
+
S2Point v0 = shape->chain_edge(c, 0).v0;
|
|
279
|
+
S2MinDistancePointTarget target(v0);
|
|
280
|
+
if (!target.VisitContainingShapes(query_index, visitor)) {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (!tested_point) {
|
|
285
|
+
// Special case to handle full polygons.
|
|
286
|
+
S2Shape::ReferencePoint ref = shape->GetReferencePoint();
|
|
287
|
+
if (!ref.contained) continue;
|
|
288
|
+
S2MinDistancePointTarget target(ref.point);
|
|
289
|
+
if (!target.VisitContainingShapes(query_index, visitor)) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// This file defines a collection of classes that are useful for computing
|
|
19
|
+
// minimum distances on the sphere. Their purpose is to allow code to be
|
|
20
|
+
// shared among the various query classes that find nearby geometry, such as
|
|
21
|
+
// S2ClosestEdgeQuery, S2ClosestPointQuery, and S2ClosestCellQuery.
|
|
22
|
+
|
|
23
|
+
#ifndef S2_S2MIN_DISTANCE_TARGETS_H_
|
|
24
|
+
#define S2_S2MIN_DISTANCE_TARGETS_H_
|
|
25
|
+
|
|
26
|
+
#include <memory>
|
|
27
|
+
|
|
28
|
+
#include "s2/_fp_contract_off.h"
|
|
29
|
+
#include "s2/s1angle.h"
|
|
30
|
+
#include "s2/s1chord_angle.h"
|
|
31
|
+
#include "s2/s2cell.h"
|
|
32
|
+
#include "s2/s2cell_index.h"
|
|
33
|
+
#include "s2/s2distance_target.h"
|
|
34
|
+
#include "s2/s2edge_distances.h"
|
|
35
|
+
#include "s2/s2shape_index.h"
|
|
36
|
+
|
|
37
|
+
// Forward references because these classes depend on the types defined here.
|
|
38
|
+
class S2ClosestCellQuery;
|
|
39
|
+
class S2ClosestEdgeQuery;
|
|
40
|
+
|
|
41
|
+
// S2MinDistance is a thin wrapper around S1ChordAngle that is used by classes
|
|
42
|
+
// such as S2ClosestEdgeQuery to compute minimum distances on the sphere (as
|
|
43
|
+
// opposed to maximum distances, ellipsoidal distances, etc).
|
|
44
|
+
//
|
|
45
|
+
// It implements the Distance concept defined by S2DistanceTarget (see
|
|
46
|
+
// s2distance_target.h for details).
|
|
47
|
+
class S2MinDistance : public S1ChordAngle {
|
|
48
|
+
public:
|
|
49
|
+
using Delta = S1ChordAngle;
|
|
50
|
+
|
|
51
|
+
S2MinDistance() : S1ChordAngle() {}
|
|
52
|
+
explicit S2MinDistance(S1Angle x) : S1ChordAngle(x) {}
|
|
53
|
+
explicit S2MinDistance(S1ChordAngle x) : S1ChordAngle(x) {}
|
|
54
|
+
static S2MinDistance Zero();
|
|
55
|
+
static S2MinDistance Infinity();
|
|
56
|
+
static S2MinDistance Negative();
|
|
57
|
+
friend S2MinDistance operator-(S2MinDistance x, S1ChordAngle delta);
|
|
58
|
+
S1ChordAngle GetChordAngleBound() const;
|
|
59
|
+
|
|
60
|
+
// If (dist < *this), updates *this and returns true (used internally).
|
|
61
|
+
bool UpdateMin(const S2MinDistance& dist);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// S2MinDistanceTarget represents a geometric object to which distances are
|
|
65
|
+
// measured. Specifically, it is used to compute minimum distances on the
|
|
66
|
+
// sphere (as opposed to maximum distances, ellipsoidal distances, etc).
|
|
67
|
+
//
|
|
68
|
+
// Subtypes are defined below for measuring the distance to a point, an edge,
|
|
69
|
+
// an S2Cell, or an S2ShapeIndex (an arbitrary collection of geometry).
|
|
70
|
+
using S2MinDistanceTarget = S2DistanceTarget<S2MinDistance>;
|
|
71
|
+
|
|
72
|
+
// An S2DistanceTarget subtype for computing the minimum distance to a point.
|
|
73
|
+
class S2MinDistancePointTarget : public S2MinDistanceTarget {
|
|
74
|
+
public:
|
|
75
|
+
explicit S2MinDistancePointTarget(const S2Point& point);
|
|
76
|
+
S2Cap GetCapBound() final;
|
|
77
|
+
bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
|
|
78
|
+
bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
|
|
79
|
+
S2MinDistance* min_dist) final;
|
|
80
|
+
bool UpdateMinDistance(const S2Cell& cell,
|
|
81
|
+
S2MinDistance* min_dist) final;
|
|
82
|
+
bool VisitContainingShapes(const S2ShapeIndex& index,
|
|
83
|
+
const ShapeVisitor& visitor) final;
|
|
84
|
+
|
|
85
|
+
private:
|
|
86
|
+
S2Point point_;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// An S2DistanceTarget subtype for computing the minimum distance to a edge.
|
|
90
|
+
class S2MinDistanceEdgeTarget : public S2MinDistanceTarget {
|
|
91
|
+
public:
|
|
92
|
+
S2MinDistanceEdgeTarget(const S2Point& a, const S2Point& b);
|
|
93
|
+
S2Cap GetCapBound() final;
|
|
94
|
+
bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
|
|
95
|
+
bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
|
|
96
|
+
S2MinDistance* min_dist) final;
|
|
97
|
+
bool UpdateMinDistance(const S2Cell& cell,
|
|
98
|
+
S2MinDistance* min_dist) final;
|
|
99
|
+
bool VisitContainingShapes(const S2ShapeIndex& index,
|
|
100
|
+
const ShapeVisitor& visitor) final;
|
|
101
|
+
|
|
102
|
+
private:
|
|
103
|
+
S2Point a_, b_;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// An S2DistanceTarget subtype for computing the minimum distance to an S2Cell
|
|
107
|
+
// (including the interior of the cell).
|
|
108
|
+
class S2MinDistanceCellTarget : public S2MinDistanceTarget {
|
|
109
|
+
public:
|
|
110
|
+
explicit S2MinDistanceCellTarget(const S2Cell& cell);
|
|
111
|
+
S2Cap GetCapBound() final;
|
|
112
|
+
bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
|
|
113
|
+
bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
|
|
114
|
+
S2MinDistance* min_dist) final;
|
|
115
|
+
bool UpdateMinDistance(const S2Cell& cell,
|
|
116
|
+
S2MinDistance* min_dist) final;
|
|
117
|
+
bool VisitContainingShapes(const S2ShapeIndex& index,
|
|
118
|
+
const ShapeVisitor& visitor) final;
|
|
119
|
+
|
|
120
|
+
private:
|
|
121
|
+
S2Cell cell_;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// An S2DistanceTarget subtype for computing the minimum distance to an
|
|
125
|
+
// S2CellUnion (including the interior of all cells).
|
|
126
|
+
class S2MinDistanceCellUnionTarget : public S2MinDistanceTarget {
|
|
127
|
+
public:
|
|
128
|
+
explicit S2MinDistanceCellUnionTarget(S2CellUnion cell_union);
|
|
129
|
+
~S2MinDistanceCellUnionTarget() override;
|
|
130
|
+
|
|
131
|
+
// Specifies that the distances should be computed by examining every cell
|
|
132
|
+
// in the S2CellIndex (for testing and debugging purposes).
|
|
133
|
+
//
|
|
134
|
+
// DEFAULT: false
|
|
135
|
+
bool use_brute_force() const;
|
|
136
|
+
void set_use_brute_force(bool use_brute_force);
|
|
137
|
+
|
|
138
|
+
// Note that set_max_error() should not be called directly by clients; it is
|
|
139
|
+
// used internally by the S2Closest*Query implementations.
|
|
140
|
+
bool set_max_error(const S1ChordAngle& max_error) override;
|
|
141
|
+
|
|
142
|
+
S2Cap GetCapBound() final;
|
|
143
|
+
bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
|
|
144
|
+
bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
|
|
145
|
+
S2MinDistance* min_dist) final;
|
|
146
|
+
bool UpdateMinDistance(const S2Cell& cell,
|
|
147
|
+
S2MinDistance* min_dist) final;
|
|
148
|
+
bool VisitContainingShapes(const S2ShapeIndex& query_index,
|
|
149
|
+
const ShapeVisitor& visitor) final;
|
|
150
|
+
|
|
151
|
+
private:
|
|
152
|
+
bool UpdateMinDistance(S2MinDistanceTarget* target, S2MinDistance* min_dist);
|
|
153
|
+
|
|
154
|
+
S2CellUnion cell_union_;
|
|
155
|
+
S2CellIndex index_;
|
|
156
|
+
std::unique_ptr<S2ClosestCellQuery> query_;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// An S2DistanceTarget subtype for computing the minimum distance to an
|
|
160
|
+
// S2ShapeIndex (a collection of points, polylines, and/or polygons).
|
|
161
|
+
//
|
|
162
|
+
// Note that ShapeIndexTarget has its own options:
|
|
163
|
+
//
|
|
164
|
+
// include_interiors()
|
|
165
|
+
// - specifies that distances are measured to the boundary and interior
|
|
166
|
+
// of polygons in the S2ShapeIndex. (If set to false, distance is
|
|
167
|
+
// measured to the polygon boundary only.)
|
|
168
|
+
// DEFAULT: true.
|
|
169
|
+
//
|
|
170
|
+
// brute_force()
|
|
171
|
+
// - specifies that the distances should be computed by examining every
|
|
172
|
+
// edge in the S2ShapeIndex (for testing and debugging purposes).
|
|
173
|
+
// DEFAULT: false.
|
|
174
|
+
//
|
|
175
|
+
// These options are specified independently of the corresponding
|
|
176
|
+
// S2ClosestEdgeQuery options. For example, if include_interiors is true for
|
|
177
|
+
// a ShapeIndexTarget but false for the S2ClosestEdgeQuery where the target
|
|
178
|
+
// is used, then distances will be measured from the boundary of one
|
|
179
|
+
// S2ShapeIndex to the boundary and interior of the other.
|
|
180
|
+
//
|
|
181
|
+
// Note that when the distance to a ShapeIndexTarget is zero because the
|
|
182
|
+
// target intersects the interior of the query index, you can find a point
|
|
183
|
+
// that achieves this zero distance by calling the VisitContainingShapes()
|
|
184
|
+
// method directly. For example:
|
|
185
|
+
//
|
|
186
|
+
// S2ClosestEdgeQuery::ShapeIndexTarget target(&target_index);
|
|
187
|
+
// target.VisitContainingShapes(
|
|
188
|
+
// query_index, [](S2Shape* containing_shape,
|
|
189
|
+
// const S2Point& target_point) {
|
|
190
|
+
// ... do something with "target_point" ...
|
|
191
|
+
// return false; // Terminate search
|
|
192
|
+
// }));
|
|
193
|
+
class S2MinDistanceShapeIndexTarget : public S2MinDistanceTarget {
|
|
194
|
+
public:
|
|
195
|
+
explicit S2MinDistanceShapeIndexTarget(const S2ShapeIndex* index);
|
|
196
|
+
~S2MinDistanceShapeIndexTarget() override;
|
|
197
|
+
|
|
198
|
+
// Specifies that distance will be measured to the boundary and interior
|
|
199
|
+
// of polygons in the S2ShapeIndex rather than to polygon boundaries only.
|
|
200
|
+
//
|
|
201
|
+
// DEFAULT: true
|
|
202
|
+
bool include_interiors() const;
|
|
203
|
+
void set_include_interiors(bool include_interiors);
|
|
204
|
+
|
|
205
|
+
// Specifies that the distances should be computed by examining every edge
|
|
206
|
+
// in the S2ShapeIndex (for testing and debugging purposes).
|
|
207
|
+
//
|
|
208
|
+
// DEFAULT: false
|
|
209
|
+
bool use_brute_force() const;
|
|
210
|
+
void set_use_brute_force(bool use_brute_force);
|
|
211
|
+
|
|
212
|
+
// Note that set_max_error() should not be called directly by clients; it is
|
|
213
|
+
// used internally by the S2Closest*Query implementations.
|
|
214
|
+
bool set_max_error(const S1ChordAngle& max_error) override;
|
|
215
|
+
|
|
216
|
+
S2Cap GetCapBound() final;
|
|
217
|
+
bool UpdateMinDistance(const S2Point& p, S2MinDistance* min_dist) final;
|
|
218
|
+
bool UpdateMinDistance(const S2Point& v0, const S2Point& v1,
|
|
219
|
+
S2MinDistance* min_dist) final;
|
|
220
|
+
bool UpdateMinDistance(const S2Cell& cell,
|
|
221
|
+
S2MinDistance* min_dist) final;
|
|
222
|
+
bool VisitContainingShapes(const S2ShapeIndex& query_index,
|
|
223
|
+
const ShapeVisitor& visitor) final;
|
|
224
|
+
|
|
225
|
+
private:
|
|
226
|
+
bool UpdateMinDistance(S2MinDistanceTarget* target, S2MinDistance* min_dist);
|
|
227
|
+
|
|
228
|
+
const S2ShapeIndex* index_;
|
|
229
|
+
std::unique_ptr<S2ClosestEdgeQuery> query_;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
////////////////// Implementation details follow ////////////////////
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
inline S2MinDistance S2MinDistance::Zero() {
|
|
237
|
+
return S2MinDistance(S1ChordAngle::Zero());
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
inline S2MinDistance S2MinDistance::Infinity() {
|
|
241
|
+
return S2MinDistance(S1ChordAngle::Infinity());
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
inline S2MinDistance S2MinDistance::Negative() {
|
|
245
|
+
return S2MinDistance(S1ChordAngle::Negative());
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
inline S2MinDistance operator-(S2MinDistance x, S1ChordAngle delta) {
|
|
249
|
+
return S2MinDistance(S1ChordAngle(x) - delta);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
inline S1ChordAngle S2MinDistance::GetChordAngleBound() const {
|
|
253
|
+
return PlusError(GetS1AngleConstructorMaxError());
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
inline bool S2MinDistance::UpdateMin(const S2MinDistance& dist) {
|
|
257
|
+
if (dist < *this) {
|
|
258
|
+
*this = dist;
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
inline S2MinDistancePointTarget::S2MinDistancePointTarget(const S2Point& point)
|
|
265
|
+
: point_(point) {
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
inline S2MinDistanceEdgeTarget::S2MinDistanceEdgeTarget(const S2Point& a,
|
|
269
|
+
const S2Point& b)
|
|
270
|
+
: a_(a), b_(b) {
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
#endif // S2_S2MIN_DISTANCE_TARGETS_H_
|