@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,87 @@
|
|
|
1
|
+
// Copyright 2005 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
|
+
// There are several notions of the "centroid" of a triangle. First, there
|
|
19
|
+
// is the planar centroid, which is simply the centroid of the ordinary
|
|
20
|
+
// (non-spherical) triangle defined by the three vertices. Second, there is
|
|
21
|
+
// the surface centroid, which is defined as the intersection of the three
|
|
22
|
+
// medians of the spherical triangle. It is possible to show that this
|
|
23
|
+
// point is simply the planar centroid projected to the surface of the
|
|
24
|
+
// sphere. Finally, there is the true centroid (mass centroid), which is
|
|
25
|
+
// defined as the surface integral over the spherical triangle of (x,y,z)
|
|
26
|
+
// divided by the triangle area. This is the point that the triangle would
|
|
27
|
+
// rotate around if it was spinning in empty space.
|
|
28
|
+
//
|
|
29
|
+
// The best centroid for most purposes is the true centroid. Unlike the
|
|
30
|
+
// planar and surface centroids, the true centroid behaves linearly as
|
|
31
|
+
// regions are added or subtracted. That is, if you split a triangle into
|
|
32
|
+
// pieces and compute the average of their centroids (weighted by triangle
|
|
33
|
+
// area), the result equals the centroid of the original triangle. This is
|
|
34
|
+
// not true of the other centroids.
|
|
35
|
+
//
|
|
36
|
+
// Also note that the surface centroid may be nowhere near the intuitive
|
|
37
|
+
// "center" of a spherical triangle. For example, consider the triangle
|
|
38
|
+
// with vertices A=(1,eps,0), B=(0,0,1), C=(-1,eps,0) (a quarter-sphere).
|
|
39
|
+
// The surface centroid of this triangle is at S=(0, 2*eps, 1), which is
|
|
40
|
+
// within a distance of 2*eps of the vertex B. Note that the median from A
|
|
41
|
+
// (the segment connecting A to the midpoint of BC) passes through S, since
|
|
42
|
+
// this is the shortest path connecting the two endpoints. On the other
|
|
43
|
+
// hand, the true centroid is at M=(0, 0.5, 0.5), which when projected onto
|
|
44
|
+
// the surface is a much more reasonable interpretation of the "center" of
|
|
45
|
+
// this triangle.
|
|
46
|
+
|
|
47
|
+
#ifndef S2_S2CENTROIDS_H_
|
|
48
|
+
#define S2_S2CENTROIDS_H_
|
|
49
|
+
|
|
50
|
+
#include "s2/s2point.h"
|
|
51
|
+
|
|
52
|
+
namespace S2 {
|
|
53
|
+
|
|
54
|
+
// Returns the centroid of the planar triangle ABC. This can be normalized to
|
|
55
|
+
// unit length to obtain the "surface centroid" of the corresponding spherical
|
|
56
|
+
// triangle, i.e. the intersection of the three medians. However, note that
|
|
57
|
+
// for large spherical triangles the surface centroid may be nowhere near the
|
|
58
|
+
// intuitive "center" (see example above).
|
|
59
|
+
S2Point PlanarCentroid(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
60
|
+
|
|
61
|
+
// Returns the true centroid of the spherical triangle ABC multiplied by the
|
|
62
|
+
// signed area of spherical triangle ABC. The reasons for multiplying by the
|
|
63
|
+
// signed area are (1) this is the quantity that needs to be summed to compute
|
|
64
|
+
// the centroid of a union or difference of triangles, and (2) it's actually
|
|
65
|
+
// easier to calculate this way. All points must have unit length.
|
|
66
|
+
//
|
|
67
|
+
// Note that the result of this function is defined to be S2Point(0, 0, 0) if
|
|
68
|
+
// the triangle is degenerate (and that this is intended behavior).
|
|
69
|
+
S2Point TrueCentroid(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
70
|
+
|
|
71
|
+
// Returns the true centroid of the spherical geodesic edge AB multiplied by
|
|
72
|
+
// the length of the edge AB. As with triangles, the true centroid of a
|
|
73
|
+
// collection of edges may be computed simply by summing the result of this
|
|
74
|
+
// method for each edge.
|
|
75
|
+
//
|
|
76
|
+
// Note that the planar centroid of a geodesic edge simply 0.5 * (a + b),
|
|
77
|
+
// while the surface centroid is (a + b).Normalize(). However neither of
|
|
78
|
+
// these values is appropriate for computing the centroid of a collection of
|
|
79
|
+
// edges (such as a polyline).
|
|
80
|
+
//
|
|
81
|
+
// Also note that the result of this function is defined to be S2Point(0, 0, 0)
|
|
82
|
+
// if the edge is degenerate (and that this is intended behavior).
|
|
83
|
+
S2Point TrueCentroid(const S2Point& a, const S2Point& b);
|
|
84
|
+
|
|
85
|
+
} // namespace S2
|
|
86
|
+
|
|
87
|
+
#endif // S2_S2CENTROIDS_H_
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Copyright 2005 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/s2centroids.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
#include "s2/s2testing.h"
|
|
22
|
+
|
|
23
|
+
namespace {
|
|
24
|
+
|
|
25
|
+
TEST(TriangleTrueCentroid, SmallTriangles) {
|
|
26
|
+
// Test TrueCentroid() with very small triangles. This test assumes that
|
|
27
|
+
// the triangle is small enough so that it is nearly planar.
|
|
28
|
+
for (int iter = 0; iter < 100; ++iter) {
|
|
29
|
+
Vector3_d p, x, y;
|
|
30
|
+
S2Testing::GetRandomFrame(&p, &x, &y);
|
|
31
|
+
double d = 1e-4 * pow(1e-4, S2Testing::rnd.RandDouble());
|
|
32
|
+
S2Point p0 = (p - d * x).Normalize();
|
|
33
|
+
S2Point p1 = (p + d * x).Normalize();
|
|
34
|
+
S2Point p2 = (p + 3 * d * y).Normalize();
|
|
35
|
+
S2Point centroid = S2::TrueCentroid(p0, p1, p2).Normalize();
|
|
36
|
+
|
|
37
|
+
// The centroid of a planar triangle is at the intersection of its
|
|
38
|
+
// medians, which is two-thirds of the way along each median.
|
|
39
|
+
S2Point expected_centroid = (p + d * y).Normalize();
|
|
40
|
+
EXPECT_LE(centroid.Angle(expected_centroid), 2e-8);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
TEST(EdgeTrueCentroid, SemiEquator) {
|
|
45
|
+
// Test the centroid of polyline ABC that follows the equator and consists
|
|
46
|
+
// of two 90 degree edges (i.e., C = -A). The centroid (multiplied by
|
|
47
|
+
// length) should point toward B and have a norm of 2.0. (The centroid
|
|
48
|
+
// itself has a norm of 2/Pi, and the total edge length is Pi.)
|
|
49
|
+
S2Point a(0, -1, 0), b(1, 0, 0), c(0, 1, 0);
|
|
50
|
+
S2Point centroid = S2::TrueCentroid(a, b) + S2::TrueCentroid(b, c);
|
|
51
|
+
EXPECT_TRUE(S2::ApproxEquals(b, centroid.Normalize()));
|
|
52
|
+
EXPECT_DOUBLE_EQ(2.0, centroid.Norm());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
TEST(EdgeTrueCentroid, GreatCircles) {
|
|
56
|
+
// Construct random great circles and divide them randomly into segments.
|
|
57
|
+
// Then make sure that the centroid is approximately at the center of the
|
|
58
|
+
// sphere. Note that because of the way the centroid is computed, it does
|
|
59
|
+
// not matter how we split the great circle into segments.
|
|
60
|
+
//
|
|
61
|
+
// Note that this is a direct test of the properties that the centroid
|
|
62
|
+
// should have, rather than a test that it matches a particular formula.
|
|
63
|
+
|
|
64
|
+
for (int iter = 0; iter < 100; ++iter) {
|
|
65
|
+
// Choose a coordinate frame for the great circle.
|
|
66
|
+
S2Point x, y, z, centroid;
|
|
67
|
+
S2Testing::GetRandomFrame(&x, &y, &z);
|
|
68
|
+
|
|
69
|
+
S2Point v0 = x;
|
|
70
|
+
for (double theta = 0; theta < 2 * M_PI;
|
|
71
|
+
theta += pow(S2Testing::rnd.RandDouble(), 10)) {
|
|
72
|
+
S2Point v1 = cos(theta) * x + sin(theta) * y;
|
|
73
|
+
centroid += S2::TrueCentroid(v0, v1);
|
|
74
|
+
v0 = v1;
|
|
75
|
+
}
|
|
76
|
+
// Close the circle.
|
|
77
|
+
centroid += S2::TrueCentroid(v0, x);
|
|
78
|
+
EXPECT_LE(centroid.Norm(), 2e-14);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
} // namespace
|
|
@@ -0,0 +1,123 @@
|
|
|
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 "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 S2ClosestCellQuery::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 S2ClosestCellQuery::Options::set_conservative_max_distance(
|
|
38
|
+
S1Angle max_distance) {
|
|
39
|
+
set_conservative_max_distance(S1ChordAngle(max_distance));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The thresholds for using the brute force algorithm are generally tuned to
|
|
43
|
+
// optimize IsDistanceLess (which compares the distance against a threshold)
|
|
44
|
+
// rather than FindClosest (which actually computes the minimum distance).
|
|
45
|
+
// This is because the former operation is (1) more common, (2) inherently
|
|
46
|
+
// faster, and (3) closely related to finding all cells within a given
|
|
47
|
+
// distance, which is also very common.
|
|
48
|
+
|
|
49
|
+
int S2ClosestCellQuery::PointTarget::max_brute_force_index_size() const {
|
|
50
|
+
// Break-even points: Point cloud Cap coverings
|
|
51
|
+
// BM_FindClosest 18 16
|
|
52
|
+
// BM_IsDistanceLess 8 9
|
|
53
|
+
return 9;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
int S2ClosestCellQuery::EdgeTarget::max_brute_force_index_size() const {
|
|
57
|
+
// Break-even points: Point cloud Cap coverings
|
|
58
|
+
// BM_FindClosestToLongEdge 14 16
|
|
59
|
+
// BM_IsDistanceLessToLongEdge 5 5
|
|
60
|
+
return 5;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
int S2ClosestCellQuery::CellTarget::max_brute_force_index_size() const {
|
|
64
|
+
// Break-even points: Point cloud Cap coverings
|
|
65
|
+
// BM_FindClosestToSmallCell 12 13
|
|
66
|
+
// BM_IsDistanceLessToSmallCell 6 6
|
|
67
|
+
//
|
|
68
|
+
// Note that the primary use of CellTarget is to implement CellUnionTarget,
|
|
69
|
+
// and therefore it is very important to optimize for the case where a
|
|
70
|
+
// distance limit has been specified.
|
|
71
|
+
return 6;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
int S2ClosestCellQuery::CellUnionTarget::max_brute_force_index_size() const {
|
|
75
|
+
// Break-even points: Point cloud Cap coverings
|
|
76
|
+
// BM_FindClosestToSmallCoarseCellUnion 12 10
|
|
77
|
+
// BM_IsDistanceLessToSmallCoarseCellUnion 7 6
|
|
78
|
+
return 8;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
int S2ClosestCellQuery::ShapeIndexTarget::max_brute_force_index_size() const {
|
|
82
|
+
// Break-even points: Point cloud Cap coverings
|
|
83
|
+
// BM_FindClosestToSmallCoarseShapeIndex 10 8
|
|
84
|
+
// BM_IsDistanceLessToSmallCoarseShapeIndex 7 6
|
|
85
|
+
return 7;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
S2ClosestCellQuery::S2ClosestCellQuery() {
|
|
89
|
+
// Prevent inline constructor bloat by defining here.
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
S2ClosestCellQuery::~S2ClosestCellQuery() {
|
|
93
|
+
// Prevent inline destructor bloat by defining here.
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
bool S2ClosestCellQuery::IsDistanceLess(Target* target, S1ChordAngle limit) {
|
|
97
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
98
|
+
Options tmp_options = options_;
|
|
99
|
+
tmp_options.set_max_results(1);
|
|
100
|
+
tmp_options.set_max_distance(limit);
|
|
101
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
102
|
+
return !base_.FindClosestCell(target, tmp_options).is_empty();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
bool S2ClosestCellQuery::IsDistanceLessOrEqual(Target* target,
|
|
106
|
+
S1ChordAngle limit) {
|
|
107
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
108
|
+
Options tmp_options = options_;
|
|
109
|
+
tmp_options.set_max_results(1);
|
|
110
|
+
tmp_options.set_inclusive_max_distance(limit);
|
|
111
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
112
|
+
return !base_.FindClosestCell(target, tmp_options).is_empty();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
bool S2ClosestCellQuery::IsConservativeDistanceLessOrEqual(
|
|
116
|
+
Target* target, S1ChordAngle limit) {
|
|
117
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
118
|
+
Options tmp_options = options_;
|
|
119
|
+
tmp_options.set_max_results(1);
|
|
120
|
+
tmp_options.set_conservative_max_distance(limit);
|
|
121
|
+
tmp_options.set_max_error(S1ChordAngle::Straight());
|
|
122
|
+
return !base_.FindClosestCell(target, tmp_options).is_empty();
|
|
123
|
+
}
|
|
@@ -0,0 +1,385 @@
|
|
|
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
|
+
#ifndef S2_S2CLOSEST_CELL_QUERY_H_
|
|
19
|
+
#define S2_S2CLOSEST_CELL_QUERY_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/_fp_contract_off.h"
|
|
25
|
+
#include "s2/s1angle.h"
|
|
26
|
+
#include "s2/s1chord_angle.h"
|
|
27
|
+
#include "s2/s2cell.h"
|
|
28
|
+
#include "s2/s2cell_id.h"
|
|
29
|
+
#include "s2/s2closest_cell_query_base.h"
|
|
30
|
+
#include "s2/s2min_distance_targets.h"
|
|
31
|
+
|
|
32
|
+
// S2ClosestCellQuery is a helper class for finding the closest cell(s) to a
|
|
33
|
+
// given point, edge, S2Cell, S2CellUnion, or geometry collection. A typical
|
|
34
|
+
// use case would be to add a collection of S2Cell coverings to an S2CellIndex
|
|
35
|
+
// (representing a collection of original geometry), and then use
|
|
36
|
+
// S2ClosestCellQuery to find all coverings that are within a given distance
|
|
37
|
+
// of some target geometry (which could be represented exactly, or could also
|
|
38
|
+
// be a covering). The distance to the original geometry corresponding to
|
|
39
|
+
// each covering could then be measured more precisely if desired.
|
|
40
|
+
//
|
|
41
|
+
// For example, here is how to find all cells that are closer than
|
|
42
|
+
// "distance_limit" to a given target point:
|
|
43
|
+
//
|
|
44
|
+
// S2ClosestCellQuery query(&cell_index);
|
|
45
|
+
// query.mutable_options()->set_max_distance(distance_limit);
|
|
46
|
+
// S2ClosestCellQuery::PointTarget target(target_point);
|
|
47
|
+
// for (const auto& result : query.FindClosestCells(&target)) {
|
|
48
|
+
// // result.distance() is the distance to the target.
|
|
49
|
+
// // result.cell_id() is the indexed S2CellId.
|
|
50
|
+
// // result.label() is the integer label associated with the S2CellId.
|
|
51
|
+
// DoSomething(target_point, result);
|
|
52
|
+
// }
|
|
53
|
+
//
|
|
54
|
+
// You can find either the k closest cells, or all cells within a given
|
|
55
|
+
// radius, or both (i.e., the k closest cells up to a given maximum radius).
|
|
56
|
+
// By default *all* cells are returned, so you should always specify either
|
|
57
|
+
// max_results() or max_distance() or both. You can also restrict the results
|
|
58
|
+
// to cells that intersect a given S2Region; for example:
|
|
59
|
+
//
|
|
60
|
+
// S2LatLngRect rect(...);
|
|
61
|
+
// query.mutable_options()->set_region(&rect); // Does *not* take ownership.
|
|
62
|
+
//
|
|
63
|
+
// There is a FindClosestCell() convenience method that returns the closest
|
|
64
|
+
// cell. However, if you only need to test whether the distance is above or
|
|
65
|
+
// below a given threshold (e.g., 10 km), it is typically much faster to use
|
|
66
|
+
// the IsDistanceLess() method instead. Unlike FindClosestCell(), this method
|
|
67
|
+
// stops as soon as it can prove that the minimum distance is either above or
|
|
68
|
+
// below the threshold. Example usage:
|
|
69
|
+
//
|
|
70
|
+
// if (query.IsDistanceLess(&target, limit_distance)) ...
|
|
71
|
+
//
|
|
72
|
+
// To find the closest cells to a query edge rather than a point, use:
|
|
73
|
+
//
|
|
74
|
+
// S2ClosestCellQuery::EdgeTarget target(v0, v1);
|
|
75
|
+
// query.FindClosestCells(&target);
|
|
76
|
+
//
|
|
77
|
+
// Similarly you can find the closest cells to an S2Cell using an
|
|
78
|
+
// S2ClosestCellQuery::CellTarget, you can find the closest cells to an
|
|
79
|
+
// S2CellUnion using an S2ClosestCellQuery::CellUnionTarget, and you can find
|
|
80
|
+
// the closest cells to an arbitrary collection of points, polylines, and
|
|
81
|
+
// polygons by using an S2ClosestCellQuery::ShapeIndexTarget.
|
|
82
|
+
//
|
|
83
|
+
// The implementation is designed to be fast for both simple and complex
|
|
84
|
+
// geometric objects.
|
|
85
|
+
class S2ClosestCellQuery {
|
|
86
|
+
public:
|
|
87
|
+
// See S2ClosestCellQueryBase for full documentation.
|
|
88
|
+
|
|
89
|
+
// S2MinDistance is a thin wrapper around S1ChordAngle that implements the
|
|
90
|
+
// Distance concept required by S2ClosestCellQueryBase.
|
|
91
|
+
using Distance = S2MinDistance;
|
|
92
|
+
using Base = S2ClosestCellQueryBase<Distance>;
|
|
93
|
+
|
|
94
|
+
// Each "Result" object represents a closest (s2cell_id, label) pair. Here
|
|
95
|
+
// are its main methods (see S2ClosestCellQueryBase::Result for details):
|
|
96
|
+
//
|
|
97
|
+
// // The distance from the target to this point.
|
|
98
|
+
// S1ChordAngle distance() const;
|
|
99
|
+
//
|
|
100
|
+
// // The S2CellId itself.
|
|
101
|
+
// S2CellId cell_id() const;
|
|
102
|
+
//
|
|
103
|
+
// // The label associated with this S2CellId.
|
|
104
|
+
// const Label& label() const;
|
|
105
|
+
using Result = Base::Result;
|
|
106
|
+
|
|
107
|
+
// Options that control the set of cells returned. Note that by default
|
|
108
|
+
// *all* cells are returned, so you will always want to set either the
|
|
109
|
+
// max_results() option or the max_distance() option (or both).
|
|
110
|
+
class Options : public Base::Options {
|
|
111
|
+
public:
|
|
112
|
+
// See S2ClosestCellQueryBase::Options for the full set of options.
|
|
113
|
+
|
|
114
|
+
// Specifies that only cells whose distance to the target is less than
|
|
115
|
+
// "max_distance" should be returned.
|
|
116
|
+
//
|
|
117
|
+
// Note that cells whose distance is exactly equal to "max_distance" are
|
|
118
|
+
// not returned. Normally this doesn't matter, because distances are not
|
|
119
|
+
// computed exactly in the first place, but if such cells are needed then
|
|
120
|
+
// see set_inclusive_max_distance() below.
|
|
121
|
+
//
|
|
122
|
+
// DEFAULT: Distance::Infinity()
|
|
123
|
+
void set_max_distance(S1ChordAngle max_distance);
|
|
124
|
+
|
|
125
|
+
// Like set_max_distance(), except that cells whose distance is exactly
|
|
126
|
+
// equal to "max_distance" are also returned. Equivalent to calling
|
|
127
|
+
// set_max_distance(max_distance.Successor()).
|
|
128
|
+
void set_inclusive_max_distance(S1ChordAngle max_distance);
|
|
129
|
+
|
|
130
|
+
// Like set_inclusive_max_distance(), except that "max_distance" is also
|
|
131
|
+
// increased by the maximum error in the distance calculation. This
|
|
132
|
+
// ensures that all cells whose true distance is less than or equal to
|
|
133
|
+
// "max_distance" will be returned (along with some cells whose true
|
|
134
|
+
// distance is slightly greater).
|
|
135
|
+
//
|
|
136
|
+
// Algorithms that need to do exact distance comparisons can use this
|
|
137
|
+
// option to find a set of candidate cells that can then be filtered
|
|
138
|
+
// further (e.g., using s2pred::CompareDistance).
|
|
139
|
+
void set_conservative_max_distance(S1ChordAngle max_distance);
|
|
140
|
+
|
|
141
|
+
// Versions of set_max_distance that take an S1Angle argument. (Note that
|
|
142
|
+
// these functions require a conversion, and that the S1ChordAngle versions
|
|
143
|
+
// are preferred.)
|
|
144
|
+
void set_max_distance(S1Angle max_distance);
|
|
145
|
+
void set_inclusive_max_distance(S1Angle max_distance);
|
|
146
|
+
void set_conservative_max_distance(S1Angle max_distance);
|
|
147
|
+
|
|
148
|
+
// See S2ClosestCellQueryBase::Options for documentation.
|
|
149
|
+
using Base::Options::set_max_error; // S1Chordangle version
|
|
150
|
+
void set_max_error(S1Angle max_error); // S1Angle version
|
|
151
|
+
|
|
152
|
+
// Inherited options (see s2closest_cell_query_base.h for details):
|
|
153
|
+
using Base::Options::set_max_results;
|
|
154
|
+
using Base::Options::set_region;
|
|
155
|
+
using Base::Options::set_use_brute_force;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// "Target" represents the geometry to which the distance is measured.
|
|
159
|
+
// There are subtypes for measuring the distance to a point, an edge, an
|
|
160
|
+
// S2Cell, or an S2ShapeIndex (an arbitrary collection of geometry).
|
|
161
|
+
using Target = S2MinDistanceTarget;
|
|
162
|
+
|
|
163
|
+
// Target subtype that computes the closest distance to a point.
|
|
164
|
+
class PointTarget final : public S2MinDistancePointTarget {
|
|
165
|
+
public:
|
|
166
|
+
explicit PointTarget(const S2Point& point);
|
|
167
|
+
int max_brute_force_index_size() const override;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Target subtype that computes the closest distance to an edge.
|
|
171
|
+
class EdgeTarget final : public S2MinDistanceEdgeTarget {
|
|
172
|
+
public:
|
|
173
|
+
explicit EdgeTarget(const S2Point& a, const S2Point& b);
|
|
174
|
+
int max_brute_force_index_size() const override;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// Target subtype that computes the closest distance to an S2Cell
|
|
178
|
+
// (including the interior of the cell).
|
|
179
|
+
class CellTarget final : public S2MinDistanceCellTarget {
|
|
180
|
+
public:
|
|
181
|
+
explicit CellTarget(const S2Cell& cell);
|
|
182
|
+
int max_brute_force_index_size() const override;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// Target subtype that computes the closest distance to an S2CellUnion.
|
|
186
|
+
class CellUnionTarget final : public S2MinDistanceCellUnionTarget {
|
|
187
|
+
public:
|
|
188
|
+
explicit CellUnionTarget(S2CellUnion cell_union);
|
|
189
|
+
int max_brute_force_index_size() const override;
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// Target subtype that computes the closest distance to an S2ShapeIndex
|
|
193
|
+
// (an arbitrary collection of points, polylines, and/or polygons).
|
|
194
|
+
//
|
|
195
|
+
// By default, distances are measured to the boundary and interior of
|
|
196
|
+
// polygons in the S2ShapeIndex rather than to polygon boundaries only.
|
|
197
|
+
// If you wish to change this behavior, you may call
|
|
198
|
+
//
|
|
199
|
+
// target.set_include_interiors(false);
|
|
200
|
+
//
|
|
201
|
+
// (see S2MinDistanceShapeIndexTarget for details).
|
|
202
|
+
class ShapeIndexTarget final : public S2MinDistanceShapeIndexTarget {
|
|
203
|
+
public:
|
|
204
|
+
explicit ShapeIndexTarget(const S2ShapeIndex* index);
|
|
205
|
+
int max_brute_force_index_size() const override;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// Convenience constructor that calls Init(). Options may be specified here
|
|
209
|
+
// or changed at any time using the mutable_options() accessor method.
|
|
210
|
+
//
|
|
211
|
+
// REQUIRES: "index" must persist for the lifetime of this object.
|
|
212
|
+
// REQUIRES: ReInit() must be called if "index" is modified.
|
|
213
|
+
explicit S2ClosestCellQuery(const S2CellIndex* index,
|
|
214
|
+
const Options& options = Options());
|
|
215
|
+
|
|
216
|
+
// Default constructor; requires Init() to be called.
|
|
217
|
+
S2ClosestCellQuery();
|
|
218
|
+
~S2ClosestCellQuery();
|
|
219
|
+
|
|
220
|
+
// Initializes the query. Options may be specified here or changed at any
|
|
221
|
+
// time using the mutable_options() accessor method.
|
|
222
|
+
//
|
|
223
|
+
// REQUIRES: "index" must persist for the lifetime of this object.
|
|
224
|
+
// REQUIRES: ReInit() must be called if "index" is modified.
|
|
225
|
+
void Init(const S2CellIndex* index, const Options& options = Options());
|
|
226
|
+
|
|
227
|
+
// Reinitializes the query. This method must be called if the underlying
|
|
228
|
+
// S2CellIndex is modified (by calling Clear() and Build() again).
|
|
229
|
+
void ReInit();
|
|
230
|
+
|
|
231
|
+
// Returns a reference to the underlying S2CellIndex.
|
|
232
|
+
const S2CellIndex& index() const;
|
|
233
|
+
|
|
234
|
+
// Returns the query options. Options can be modified between queries.
|
|
235
|
+
const Options& options() const;
|
|
236
|
+
Options* mutable_options();
|
|
237
|
+
|
|
238
|
+
// Returns the closest cells to the given target that satisfy the current
|
|
239
|
+
// options. This method may be called multiple times.
|
|
240
|
+
std::vector<Result> FindClosestCells(Target* target);
|
|
241
|
+
|
|
242
|
+
// This version can be more efficient when this method is called many times,
|
|
243
|
+
// since it does not require allocating a new vector on each call.
|
|
244
|
+
void FindClosestCells(Target* target, std::vector<Result>* results);
|
|
245
|
+
|
|
246
|
+
//////////////////////// Convenience Methods ////////////////////////
|
|
247
|
+
|
|
248
|
+
// Returns the closest cell to the target. If no cell satisfies the search
|
|
249
|
+
// criteria, then the Result object will have distance == Infinity() and
|
|
250
|
+
// is_empty() == true.
|
|
251
|
+
Result FindClosestCell(Target* target);
|
|
252
|
+
|
|
253
|
+
// Returns the minimum distance to the target. If the index or target is
|
|
254
|
+
// empty, returns S1ChordAngle::Infinity().
|
|
255
|
+
//
|
|
256
|
+
// Use IsDistanceLess() if you only want to compare the distance against a
|
|
257
|
+
// threshold value, since it is often much faster.
|
|
258
|
+
S1ChordAngle GetDistance(Target* target);
|
|
259
|
+
|
|
260
|
+
// Returns true if the distance to "target" is less than "limit".
|
|
261
|
+
//
|
|
262
|
+
// This method is usually much faster than GetDistance(), since it is much
|
|
263
|
+
// less work to determine whether the minimum distance is above or below a
|
|
264
|
+
// threshold than it is to calculate the actual minimum distance.
|
|
265
|
+
bool IsDistanceLess(Target* target, S1ChordAngle limit);
|
|
266
|
+
|
|
267
|
+
// Like IsDistanceLess(), but also returns true if the distance to "target"
|
|
268
|
+
// is exactly equal to "limit".
|
|
269
|
+
bool IsDistanceLessOrEqual(Target* target, S1ChordAngle limit);
|
|
270
|
+
|
|
271
|
+
// Like IsDistanceLessOrEqual(), except that "limit" is increased by the
|
|
272
|
+
// maximum error in the distance calculation. This ensures that this
|
|
273
|
+
// function returns true whenever the true, exact distance is less than
|
|
274
|
+
// or equal to "limit".
|
|
275
|
+
bool IsConservativeDistanceLessOrEqual(Target* target, S1ChordAngle limit);
|
|
276
|
+
|
|
277
|
+
private:
|
|
278
|
+
Options options_;
|
|
279
|
+
Base base_;
|
|
280
|
+
|
|
281
|
+
S2ClosestCellQuery(const S2ClosestCellQuery&) = delete;
|
|
282
|
+
void operator=(const S2ClosestCellQuery&) = delete;
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
////////////////// Implementation details follow ////////////////////
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
inline void S2ClosestCellQuery::Options::set_max_distance(
|
|
290
|
+
S1ChordAngle max_distance) {
|
|
291
|
+
Base::Options::set_max_distance(Distance(max_distance));
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
inline void S2ClosestCellQuery::Options::set_max_distance(
|
|
295
|
+
S1Angle max_distance) {
|
|
296
|
+
Base::Options::set_max_distance(Distance(max_distance));
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
inline void S2ClosestCellQuery::Options::set_inclusive_max_distance(
|
|
300
|
+
S1ChordAngle max_distance) {
|
|
301
|
+
set_max_distance(max_distance.Successor());
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
inline void S2ClosestCellQuery::Options::set_inclusive_max_distance(
|
|
305
|
+
S1Angle max_distance) {
|
|
306
|
+
set_inclusive_max_distance(S1ChordAngle(max_distance));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
inline void S2ClosestCellQuery::Options::set_max_error(S1Angle max_error) {
|
|
310
|
+
Base::Options::set_max_error(S1ChordAngle(max_error));
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
inline S2ClosestCellQuery::PointTarget::PointTarget(const S2Point& point)
|
|
314
|
+
: S2MinDistancePointTarget(point) {
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
inline S2ClosestCellQuery::EdgeTarget::EdgeTarget(const S2Point& a,
|
|
318
|
+
const S2Point& b)
|
|
319
|
+
: S2MinDistanceEdgeTarget(a, b) {
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
inline S2ClosestCellQuery::CellTarget::CellTarget(const S2Cell& cell)
|
|
323
|
+
: S2MinDistanceCellTarget(cell) {
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
inline S2ClosestCellQuery::CellUnionTarget::CellUnionTarget(
|
|
327
|
+
S2CellUnion cell_union)
|
|
328
|
+
: S2MinDistanceCellUnionTarget(std::move(cell_union)) {
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
inline S2ClosestCellQuery::ShapeIndexTarget::ShapeIndexTarget(
|
|
332
|
+
const S2ShapeIndex* index)
|
|
333
|
+
: S2MinDistanceShapeIndexTarget(index) {
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
inline S2ClosestCellQuery::S2ClosestCellQuery(const S2CellIndex* index,
|
|
337
|
+
const Options& options) {
|
|
338
|
+
Init(index, options);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
inline void S2ClosestCellQuery::Init(const S2CellIndex* index,
|
|
342
|
+
const Options& options) {
|
|
343
|
+
options_ = options;
|
|
344
|
+
base_.Init(index);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
inline void S2ClosestCellQuery::ReInit() {
|
|
348
|
+
base_.ReInit();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
inline const S2CellIndex& S2ClosestCellQuery::index() const {
|
|
352
|
+
return base_.index();
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
inline const S2ClosestCellQuery::Options& S2ClosestCellQuery::options() const {
|
|
356
|
+
return options_;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
inline S2ClosestCellQuery::Options* S2ClosestCellQuery::mutable_options() {
|
|
360
|
+
return &options_;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
inline std::vector<S2ClosestCellQuery::Result>
|
|
364
|
+
S2ClosestCellQuery::FindClosestCells(Target* target) {
|
|
365
|
+
return base_.FindClosestCells(target, options_);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
inline void S2ClosestCellQuery::FindClosestCells(Target* target,
|
|
369
|
+
std::vector<Result>* results) {
|
|
370
|
+
base_.FindClosestCells(target, options_, results);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
inline S2ClosestCellQuery::Result S2ClosestCellQuery::FindClosestCell(
|
|
374
|
+
Target* target) {
|
|
375
|
+
static_assert(sizeof(Options) <= 32, "Consider not copying Options here");
|
|
376
|
+
Options tmp_options = options_;
|
|
377
|
+
tmp_options.set_max_results(1);
|
|
378
|
+
return base_.FindClosestCell(target, tmp_options);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
inline S1ChordAngle S2ClosestCellQuery::GetDistance(Target* target) {
|
|
382
|
+
return FindClosestCell(target).distance();
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
#endif // S2_S2CLOSEST_CELL_QUERY_H_
|