@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,239 @@
|
|
|
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 <vector>
|
|
21
|
+
|
|
22
|
+
#include <gtest/gtest.h>
|
|
23
|
+
#include "s2/util/gtl/btree_set.h"
|
|
24
|
+
#include "s2/mutable_s2shape_index.h"
|
|
25
|
+
#include "s2/s1angle.h"
|
|
26
|
+
#include "s2/s2cap.h"
|
|
27
|
+
#include "s2/s2cell.h"
|
|
28
|
+
#include "s2/s2edge_distances.h"
|
|
29
|
+
#include "s2/s2shape_index.h"
|
|
30
|
+
#include "s2/s2text_format.h"
|
|
31
|
+
|
|
32
|
+
using s2textformat::MakeIndexOrDie;
|
|
33
|
+
using s2textformat::MakePointOrDie;
|
|
34
|
+
using s2textformat::ParsePointsOrDie;
|
|
35
|
+
using std::vector;
|
|
36
|
+
|
|
37
|
+
TEST(PointTarget, UpdateMinDistanceToEdgeWhenEqual) {
|
|
38
|
+
// Verifies that UpdateMinDistance only returns true when the new distance
|
|
39
|
+
// is less than the old distance (not less than or equal to).
|
|
40
|
+
S2MinDistancePointTarget target(MakePointOrDie("1:0"));
|
|
41
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
42
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
43
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
44
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
TEST(PointTarget, UpdateMinDistanceToCellWhenEqual) {
|
|
48
|
+
// Verifies that UpdateMinDistance only returns true when the new distance
|
|
49
|
+
// is less than the old distance (not less than or equal to).
|
|
50
|
+
S2MinDistancePointTarget target(MakePointOrDie("1:0"));
|
|
51
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
52
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
53
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
54
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
TEST(EdgeTarget, UpdateMinDistanceToEdgeWhenEqual) {
|
|
58
|
+
S2MinDistanceEdgeTarget target(MakePointOrDie("1:0"), MakePointOrDie("1:1"));
|
|
59
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
60
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
61
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
62
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
TEST(EdgeTarget, UpdateMinDistanceToCellWhenEqual) {
|
|
66
|
+
S2MinDistanceEdgeTarget target(MakePointOrDie("1:0"), MakePointOrDie("1:1"));
|
|
67
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
68
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
69
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
70
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
TEST(CellTarget, UpdateMinDistanceToEdgeWhenEqual) {
|
|
74
|
+
S2MinDistanceCellTarget target{S2Cell{S2CellId{MakePointOrDie("0:1")}}};
|
|
75
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
76
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
77
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
78
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
TEST(CellTarget, UpdateMinDistanceToCellWhenEqual) {
|
|
82
|
+
S2MinDistanceCellTarget target{S2Cell{S2CellId{MakePointOrDie("0:1")}}};
|
|
83
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
84
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
85
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
86
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
TEST(CellUnionTarget, UpdateMinDistanceToEdgeWhenEqual) {
|
|
90
|
+
S2MinDistanceCellUnionTarget
|
|
91
|
+
target{S2CellUnion({S2CellId{MakePointOrDie("0:1")}})};
|
|
92
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
93
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
94
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
95
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
TEST(CellUnionTarget, UpdateMinDistanceToCellWhenEqual) {
|
|
99
|
+
S2MinDistanceCellUnionTarget
|
|
100
|
+
target{S2CellUnion({S2CellId{MakePointOrDie("0:1")}})};
|
|
101
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
102
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
103
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
104
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
TEST(ShapeIndexTarget, UpdateMinDistanceToEdgeWhenEqual) {
|
|
108
|
+
auto target_index = MakeIndexOrDie("1:0 # #");
|
|
109
|
+
S2MinDistanceShapeIndexTarget target(target_index.get());
|
|
110
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
111
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
112
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
113
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
TEST(ShapeIndexTarget, UpdateMinDistanceToCellWhenEqual) {
|
|
117
|
+
auto target_index = MakeIndexOrDie("1:0 # #");
|
|
118
|
+
S2MinDistanceShapeIndexTarget target(target_index.get());
|
|
119
|
+
S2MinDistance dist(S1ChordAngle::Infinity());
|
|
120
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
121
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
122
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
vector<int> GetContainingShapes(S2MinDistanceTarget* target,
|
|
126
|
+
const S2ShapeIndex& index, int max_shapes) {
|
|
127
|
+
gtl::btree_set<int32> shape_ids;
|
|
128
|
+
(void) target->VisitContainingShapes(
|
|
129
|
+
index, [&shape_ids, max_shapes](S2Shape* containing_shape,
|
|
130
|
+
const S2Point& target_point) {
|
|
131
|
+
shape_ids.insert(containing_shape->id());
|
|
132
|
+
return shape_ids.size() < max_shapes;
|
|
133
|
+
});
|
|
134
|
+
return vector<int>(shape_ids.begin(), shape_ids.end());
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Given two sorted vectors "x" and "y", returns true if x is a subset of y
|
|
138
|
+
// and x.size() == x_size.
|
|
139
|
+
bool IsSubsetOfSize(const vector<int>& x, const vector<int>& y,
|
|
140
|
+
int x_size) {
|
|
141
|
+
if (x.size() != x_size) return false;
|
|
142
|
+
return std::includes(y.begin(), y.end(), x.begin(), x.end());
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
TEST(PointTarget, VisitContainingShapes) {
|
|
146
|
+
// Only shapes 2 and 4 should contain the target point.
|
|
147
|
+
auto index = MakeIndexOrDie(
|
|
148
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | 0:0, 0:4, 4:0");
|
|
149
|
+
S2MinDistancePointTarget target(MakePointOrDie("1:1"));
|
|
150
|
+
EXPECT_TRUE(IsSubsetOfSize(GetContainingShapes(&target, *index, 1),
|
|
151
|
+
vector<int>{2, 4}, 1));
|
|
152
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target, *index, 5));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
TEST(EdgeTarget, VisitContainingShapes) {
|
|
156
|
+
// Only shapes 2 and 4 should contain the target point.
|
|
157
|
+
auto index = MakeIndexOrDie(
|
|
158
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | 0:0, 0:4, 4:0");
|
|
159
|
+
S2MinDistanceEdgeTarget target(MakePointOrDie("1:2"), MakePointOrDie("2:1"));
|
|
160
|
+
EXPECT_TRUE(IsSubsetOfSize(GetContainingShapes(&target, *index, 1),
|
|
161
|
+
vector<int>{2, 4}, 1));
|
|
162
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target, *index, 5));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
TEST(CellTarget, VisitContainingShapes) {
|
|
166
|
+
auto index = MakeIndexOrDie(
|
|
167
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | -1:-1, -1:5, 5:-1");
|
|
168
|
+
// Only shapes 2 and 4 should contain a very small cell near 1:1.
|
|
169
|
+
S2CellId cellid1(MakePointOrDie("1:1"));
|
|
170
|
+
S2MinDistanceCellTarget target1{S2Cell(cellid1)};
|
|
171
|
+
EXPECT_TRUE(IsSubsetOfSize(GetContainingShapes(&target1, *index, 1),
|
|
172
|
+
vector<int>{2, 4}, 1));
|
|
173
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target1, *index, 5));
|
|
174
|
+
|
|
175
|
+
// For a larger cell that properly contains one or more index cells, all
|
|
176
|
+
// shapes that intersect the first such cell in S2CellId order are returned.
|
|
177
|
+
// In the test below, this happens to again be the 1st and 3rd polygons
|
|
178
|
+
// (whose shape_ids are 2 and 4).
|
|
179
|
+
S2CellId cellid2 = cellid1.parent(5);
|
|
180
|
+
S2MinDistanceCellTarget target2{S2Cell(cellid2)};
|
|
181
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target2, *index, 5));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
TEST(CellUnionTarget, VisitContainingShapes) {
|
|
185
|
+
auto index = MakeIndexOrDie(
|
|
186
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | -1:-1, -1:5, 5:-1");
|
|
187
|
+
// Shapes 2 and 4 contain the leaf cell near 1:1, while shape 3 contains the
|
|
188
|
+
// leaf cell near 7:7.
|
|
189
|
+
S2CellId cellid1(MakePointOrDie("1:1")), cellid2(MakePointOrDie("7:7"));
|
|
190
|
+
S2MinDistanceCellUnionTarget target1{S2CellUnion({cellid1, cellid2})};
|
|
191
|
+
EXPECT_TRUE(IsSubsetOfSize(GetContainingShapes(&target1, *index, 1),
|
|
192
|
+
vector<int>{2, 3, 4}, 1));
|
|
193
|
+
EXPECT_EQ((vector<int>{2, 3, 4}), GetContainingShapes(&target1, *index, 5));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
TEST(ShapeIndexTarget, VisitContainingShapes) {
|
|
197
|
+
// Create an index containing a repeated grouping of one point, one
|
|
198
|
+
// polyline, and one polygon.
|
|
199
|
+
auto index = MakeIndexOrDie(
|
|
200
|
+
"1:1 | 4:4 | 7:7 | 10:10 # "
|
|
201
|
+
"1:1, 1:2 | 4:4, 4:5 | 7:7, 7:8 | 10:10, 10:11 # "
|
|
202
|
+
"0:0, 0:3, 3:0 | 3:3, 3:6, 6:3 | 6:6, 6:9, 9:6 | 9:9, 9:12, 12:9");
|
|
203
|
+
|
|
204
|
+
// Construct a target consisting of one point, one polyline, and one polygon
|
|
205
|
+
// with two loops where only the second loop is contained by a polygon in
|
|
206
|
+
// the index above.
|
|
207
|
+
auto target_index = MakeIndexOrDie(
|
|
208
|
+
"1:1 # 4:5, 5:4 # 20:20, 20:21, 21:20; 10:10, 10:11, 11:10");
|
|
209
|
+
|
|
210
|
+
S2MinDistanceShapeIndexTarget target(target_index.get());
|
|
211
|
+
// These are the shape_ids of the 1st, 2nd, and 4th polygons of "index"
|
|
212
|
+
// (noting that the 4 points are represented by one S2PointVectorShape).
|
|
213
|
+
EXPECT_EQ((vector<int>{5, 6, 8}), GetContainingShapes(&target, *index, 5));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
TEST(ShapeIndexTarget, VisitContainingShapesEmptyAndFull) {
|
|
217
|
+
// Verify that VisitContainingShapes never returns empty polygons and always
|
|
218
|
+
// returns full polygons (i.e., those containing the entire sphere).
|
|
219
|
+
|
|
220
|
+
// Creating an index containing one empty and one full polygon.
|
|
221
|
+
auto index = MakeIndexOrDie("# # empty | full");
|
|
222
|
+
|
|
223
|
+
// Check only the full polygon is returned for a point target.
|
|
224
|
+
auto point_index = MakeIndexOrDie("1:1 # #");
|
|
225
|
+
S2MinDistanceShapeIndexTarget point_target(point_index.get());
|
|
226
|
+
EXPECT_EQ((vector<int>{1}), GetContainingShapes(&point_target, *index, 5));
|
|
227
|
+
|
|
228
|
+
// Check only the full polygon is returned for a full polygon target.
|
|
229
|
+
auto full_polygon_index = MakeIndexOrDie("# # full");
|
|
230
|
+
S2MinDistanceShapeIndexTarget full_target(full_polygon_index.get());
|
|
231
|
+
EXPECT_EQ((vector<int>{1}), GetContainingShapes(&full_target, *index, 5));
|
|
232
|
+
|
|
233
|
+
// Check that nothing is returned for an empty polygon target. (An empty
|
|
234
|
+
// polygon has no connected components and does not intersect anything, so
|
|
235
|
+
// according to the API of GetContainingShapes nothing should be returned.)
|
|
236
|
+
auto empty_polygon_index = MakeIndexOrDie("# # empty");
|
|
237
|
+
S2MinDistanceShapeIndexTarget empty_target(empty_polygon_index.get());
|
|
238
|
+
EXPECT_EQ((vector<int>{}), GetContainingShapes(&empty_target, *index, 5));
|
|
239
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
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/s2padded_cell.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cfloat>
|
|
22
|
+
|
|
23
|
+
#include "s2/util/bits/bits.h"
|
|
24
|
+
#include "s2/r1interval.h"
|
|
25
|
+
#include "s2/s2coords.h"
|
|
26
|
+
|
|
27
|
+
using std::max;
|
|
28
|
+
using std::min;
|
|
29
|
+
using S2::internal::kSwapMask;
|
|
30
|
+
using S2::internal::kInvertMask;
|
|
31
|
+
using S2::internal::kIJtoPos;
|
|
32
|
+
using S2::internal::kPosToOrientation;
|
|
33
|
+
|
|
34
|
+
S2PaddedCell::S2PaddedCell(S2CellId id, double padding)
|
|
35
|
+
: id_(id), padding_(padding) {
|
|
36
|
+
if (id_.is_face()) {
|
|
37
|
+
// Fast path for constructing a top-level face (the most common case).
|
|
38
|
+
double limit = 1 + padding;
|
|
39
|
+
bound_ = R2Rect(R1Interval(-limit, limit), R1Interval(-limit, limit));
|
|
40
|
+
middle_ = R2Rect(R1Interval(-padding, padding),
|
|
41
|
+
R1Interval(-padding, padding));
|
|
42
|
+
ij_lo_[0] = ij_lo_[1] = 0;
|
|
43
|
+
orientation_ = id_.face() & 1;
|
|
44
|
+
level_ = 0;
|
|
45
|
+
} else {
|
|
46
|
+
int ij[2];
|
|
47
|
+
id.ToFaceIJOrientation(&ij[0], &ij[1], &orientation_);
|
|
48
|
+
level_ = id.level();
|
|
49
|
+
bound_ = S2CellId::IJLevelToBoundUV(ij, level_).Expanded(padding);
|
|
50
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
51
|
+
ij_lo_[0] = ij[0] & -ij_size;
|
|
52
|
+
ij_lo_[1] = ij[1] & -ij_size;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
S2PaddedCell::S2PaddedCell(const S2PaddedCell& parent, int i, int j)
|
|
57
|
+
: padding_(parent.padding_),
|
|
58
|
+
bound_(parent.bound_),
|
|
59
|
+
level_(parent.level_ + 1) {
|
|
60
|
+
// Compute the position and orientation of the child incrementally from the
|
|
61
|
+
// orientation of the parent.
|
|
62
|
+
int pos = kIJtoPos[parent.orientation_][2*i+j];
|
|
63
|
+
id_ = parent.id_.child(pos);
|
|
64
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
65
|
+
ij_lo_[0] = parent.ij_lo_[0] + i * ij_size;
|
|
66
|
+
ij_lo_[1] = parent.ij_lo_[1] + j * ij_size;
|
|
67
|
+
orientation_ = parent.orientation_ ^ kPosToOrientation[pos];
|
|
68
|
+
// For each child, one corner of the bound is taken directly from the parent
|
|
69
|
+
// while the diagonally opposite corner is taken from middle().
|
|
70
|
+
const R2Rect& middle = parent.middle();
|
|
71
|
+
bound_[0][1-i] = middle[0][1-i];
|
|
72
|
+
bound_[1][1-j] = middle[1][1-j];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const R2Rect& S2PaddedCell::middle() const {
|
|
76
|
+
// We compute this field lazily because it is not needed the majority of the
|
|
77
|
+
// time (i.e., for cells where the recursion terminates).
|
|
78
|
+
if (middle_.is_empty()) {
|
|
79
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
80
|
+
double u = S2::STtoUV(S2::SiTitoST(2 * ij_lo_[0] + ij_size));
|
|
81
|
+
double v = S2::STtoUV(S2::SiTitoST(2 * ij_lo_[1] + ij_size));
|
|
82
|
+
middle_ = R2Rect(R1Interval(u - padding_, u + padding_),
|
|
83
|
+
R1Interval(v - padding_, v + padding_));
|
|
84
|
+
}
|
|
85
|
+
return middle_;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
S2Point S2PaddedCell::GetCenter() const {
|
|
89
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
90
|
+
unsigned int si = 2 * ij_lo_[0] + ij_size;
|
|
91
|
+
unsigned int ti = 2 * ij_lo_[1] + ij_size;
|
|
92
|
+
return S2::FaceSiTitoXYZ(id_.face(), si, ti).Normalize();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
S2Point S2PaddedCell::GetEntryVertex() const {
|
|
96
|
+
// The curve enters at the (0,0) vertex unless the axis directions are
|
|
97
|
+
// reversed, in which case it enters at the (1,1) vertex.
|
|
98
|
+
unsigned int i = ij_lo_[0];
|
|
99
|
+
unsigned int j = ij_lo_[1];
|
|
100
|
+
if (orientation_ & kInvertMask) {
|
|
101
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
102
|
+
i += ij_size;
|
|
103
|
+
j += ij_size;
|
|
104
|
+
}
|
|
105
|
+
return S2::FaceSiTitoXYZ(id_.face(), 2 * i, 2 * j).Normalize();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
S2Point S2PaddedCell::GetExitVertex() const {
|
|
109
|
+
// The curve exits at the (1,0) vertex unless the axes are swapped or
|
|
110
|
+
// inverted but not both, in which case it exits at the (0,1) vertex.
|
|
111
|
+
unsigned int i = ij_lo_[0];
|
|
112
|
+
unsigned int j = ij_lo_[1];
|
|
113
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
114
|
+
if (orientation_ == 0 || orientation_ == kSwapMask + kInvertMask) {
|
|
115
|
+
i += ij_size;
|
|
116
|
+
} else {
|
|
117
|
+
j += ij_size;
|
|
118
|
+
}
|
|
119
|
+
return S2::FaceSiTitoXYZ(id_.face(), 2 * i, 2 * j).Normalize();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
S2CellId S2PaddedCell::ShrinkToFit(const R2Rect& rect) const {
|
|
123
|
+
S2_DCHECK(bound().Intersects(rect));
|
|
124
|
+
|
|
125
|
+
// Quick rejection test: if "rect" contains the center of this cell along
|
|
126
|
+
// either axis, then no further shrinking is possible.
|
|
127
|
+
int ij_size = S2CellId::GetSizeIJ(level_);
|
|
128
|
+
if (level_ == 0) {
|
|
129
|
+
// Fast path (most calls to this function start with a face cell).
|
|
130
|
+
if (rect[0].Contains(0) || rect[1].Contains(0)) return id();
|
|
131
|
+
} else {
|
|
132
|
+
if (rect[0].Contains(S2::STtoUV(S2::SiTitoST(2 * ij_lo_[0] + ij_size))) ||
|
|
133
|
+
rect[1].Contains(S2::STtoUV(S2::SiTitoST(2 * ij_lo_[1] + ij_size)))) {
|
|
134
|
+
return id();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Otherwise we expand "rect" by the given padding() on all sides and find
|
|
138
|
+
// the range of coordinates that it spans along the i- and j-axes. We then
|
|
139
|
+
// compute the highest bit position at which the min and max coordinates
|
|
140
|
+
// differ. This corresponds to the first cell level at which at least two
|
|
141
|
+
// children intersect "rect".
|
|
142
|
+
|
|
143
|
+
// Increase the padding to compensate for the error in S2::UVtoST().
|
|
144
|
+
// (The constant below is a provable upper bound on the additional error.)
|
|
145
|
+
R2Rect padded = rect.Expanded(padding() + 1.5 * DBL_EPSILON);
|
|
146
|
+
int ij_min[2]; // Min i- or j- coordinate spanned by "padded"
|
|
147
|
+
int ij_xor[2]; // XOR of the min and max i- or j-coordinates
|
|
148
|
+
for (int d = 0; d < 2; ++d) {
|
|
149
|
+
ij_min[d] = max(ij_lo_[d], S2::STtoIJ(S2::UVtoST(padded[d][0])));
|
|
150
|
+
int ij_max = min(ij_lo_[d] + ij_size - 1,
|
|
151
|
+
S2::STtoIJ(S2::UVtoST(padded[d][1])));
|
|
152
|
+
ij_xor[d] = ij_min[d] ^ ij_max;
|
|
153
|
+
}
|
|
154
|
+
// Compute the highest bit position where the two i- or j-endpoints differ,
|
|
155
|
+
// and then choose the cell level that includes both of these endpoints. So
|
|
156
|
+
// if both pairs of endpoints are equal we choose kMaxLevel; if they differ
|
|
157
|
+
// only at bit 0, we choose (kMaxLevel - 1), and so on.
|
|
158
|
+
int level_msb = ((ij_xor[0] | ij_xor[1]) << 1) + 1;
|
|
159
|
+
int level = S2CellId::kMaxLevel - Bits::FindMSBSetNonZero(level_msb);
|
|
160
|
+
if (level <= level_) return id();
|
|
161
|
+
return S2CellId::FromFaceIJ(id().face(), ij_min[0], ij_min[1]).parent(level);
|
|
162
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
#ifndef S2_S2PADDED_CELL_H_
|
|
19
|
+
#define S2_S2PADDED_CELL_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/_fp_contract_off.h"
|
|
22
|
+
#include "s2/r2rect.h"
|
|
23
|
+
#include "s2/s2cell_id.h"
|
|
24
|
+
|
|
25
|
+
// S2PaddedCell represents an S2Cell whose (u,v)-range has been expanded on
|
|
26
|
+
// all sides by a given amount of "padding". Unlike S2Cell, its methods and
|
|
27
|
+
// representation are optimized for clipping edges against S2Cell boundaries
|
|
28
|
+
// to determine which cells are intersected by a given set of edges.
|
|
29
|
+
//
|
|
30
|
+
// This class is intended to be copied by value as desired.
|
|
31
|
+
class S2PaddedCell {
|
|
32
|
+
public:
|
|
33
|
+
// Construct an S2PaddedCell for the given cell id and padding.
|
|
34
|
+
S2PaddedCell(S2CellId id, double padding);
|
|
35
|
+
|
|
36
|
+
// Construct the child of "parent" with the given (i,j) index. The four
|
|
37
|
+
// child cells have indices of (0,0), (0,1), (1,0), (1,1), where the i and j
|
|
38
|
+
// indices correspond to increasing u- and v-values respectively.
|
|
39
|
+
S2PaddedCell(const S2PaddedCell& parent, int i, int j);
|
|
40
|
+
|
|
41
|
+
S2CellId id() const { return id_; }
|
|
42
|
+
double padding() const { return padding_; }
|
|
43
|
+
int level() const { return level_; }
|
|
44
|
+
|
|
45
|
+
// Return the bound for this cell (including padding).
|
|
46
|
+
const R2Rect& bound() const { return bound_; }
|
|
47
|
+
|
|
48
|
+
// Return the "middle" of the padded cell, defined as the rectangle that
|
|
49
|
+
// belongs to all four children.
|
|
50
|
+
//
|
|
51
|
+
// Note that this method is *not* thread-safe, because the return value is
|
|
52
|
+
// computed on demand and cached. (It is expected that this class will be
|
|
53
|
+
// mainly useful in the context of single-threaded recursive algorithms.)
|
|
54
|
+
const R2Rect& middle() const;
|
|
55
|
+
|
|
56
|
+
// Return the (i,j) coordinates for the child cell at the given traversal
|
|
57
|
+
// position. The traversal position corresponds to the order in which child
|
|
58
|
+
// cells are visited by the Hilbert curve.
|
|
59
|
+
void GetChildIJ(int pos, int* i, int* j) const;
|
|
60
|
+
|
|
61
|
+
// Return the smallest cell that contains all descendants of this cell whose
|
|
62
|
+
// bounds intersect "rect". For algorithms that use recursive subdivision
|
|
63
|
+
// to find the cells that intersect a particular object, this method can be
|
|
64
|
+
// used to skip all the initial subdivision steps where only one child needs
|
|
65
|
+
// to be expanded.
|
|
66
|
+
//
|
|
67
|
+
// Note that this method is not the same as returning the smallest cell that
|
|
68
|
+
// contains the intersection of this cell with "rect". Because of the
|
|
69
|
+
// padding, even if one child completely contains "rect" it is still
|
|
70
|
+
// possible that a neighboring child also intersects "rect".
|
|
71
|
+
//
|
|
72
|
+
// REQUIRES: bound().Intersects(rect)
|
|
73
|
+
S2CellId ShrinkToFit(const R2Rect& rect) const;
|
|
74
|
+
|
|
75
|
+
// Return the center of this cell.
|
|
76
|
+
S2Point GetCenter() const;
|
|
77
|
+
|
|
78
|
+
// Return the vertex where the S2 space-filling curve enters this cell.
|
|
79
|
+
S2Point GetEntryVertex() const;
|
|
80
|
+
|
|
81
|
+
// Return the vertex where the S2 space-filling curve exits this cell.
|
|
82
|
+
S2Point GetExitVertex() const;
|
|
83
|
+
|
|
84
|
+
private:
|
|
85
|
+
S2CellId id_;
|
|
86
|
+
double padding_;
|
|
87
|
+
R2Rect bound_; // Bound in (u,v)-space
|
|
88
|
+
|
|
89
|
+
// The rectangle in (u,v)-space that belongs to all four padded children.
|
|
90
|
+
// It is computed on demand by the middle() accessor method.
|
|
91
|
+
mutable R2Rect middle_;
|
|
92
|
+
|
|
93
|
+
int ij_lo_[2]; // Minimum (i,j)-coordinates of this cell, before padding
|
|
94
|
+
int orientation_; // Hilbert curve orientation of this cell (see s2coords.h)
|
|
95
|
+
int level_; // Level of this cell (see s2coords.h)
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
////////////////// Implementation details follow ////////////////////
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
inline void S2PaddedCell::GetChildIJ(int pos, int* i, int* j) const {
|
|
103
|
+
int ij = S2::internal::kPosToIJ[orientation_][pos];
|
|
104
|
+
*i = ij >> 1;
|
|
105
|
+
*j = ij & 1;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#endif // S2_S2PADDED_CELL_H_
|
|
@@ -0,0 +1,138 @@
|
|
|
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/s2padded_cell.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cmath>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/r1interval.h"
|
|
25
|
+
#include "s2/r2.h"
|
|
26
|
+
#include "s2/s2cell.h"
|
|
27
|
+
#include "s2/s2testing.h"
|
|
28
|
+
|
|
29
|
+
using std::min;
|
|
30
|
+
|
|
31
|
+
namespace {
|
|
32
|
+
|
|
33
|
+
void CompareS2CellToPadded(const S2Cell& cell, const S2PaddedCell& pcell,
|
|
34
|
+
double padding) {
|
|
35
|
+
EXPECT_EQ(cell.id(), pcell.id());
|
|
36
|
+
EXPECT_EQ(cell.level(), pcell.level());
|
|
37
|
+
EXPECT_EQ(padding, pcell.padding());
|
|
38
|
+
EXPECT_EQ(cell.GetBoundUV().Expanded(padding), pcell.bound());
|
|
39
|
+
R2Point center_uv = cell.id().GetCenterUV();
|
|
40
|
+
EXPECT_EQ(R2Rect::FromPoint(center_uv).Expanded(padding), pcell.middle());
|
|
41
|
+
EXPECT_EQ(cell.GetCenter(), pcell.GetCenter());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
TEST(S2PaddedCell, S2CellMethods) {
|
|
45
|
+
// Test the S2PaddedCell methods that have approximate S2Cell equivalents.
|
|
46
|
+
const int kIters = 1000;
|
|
47
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
48
|
+
S2CellId id = S2Testing::GetRandomCellId();
|
|
49
|
+
double padding = pow(1e-15, S2Testing::rnd.RandDouble());
|
|
50
|
+
S2Cell cell(id);
|
|
51
|
+
S2PaddedCell pcell(id, padding);
|
|
52
|
+
CompareS2CellToPadded(cell, pcell, padding);
|
|
53
|
+
if (!id.is_leaf()) {
|
|
54
|
+
S2Cell children[4];
|
|
55
|
+
EXPECT_TRUE(cell.Subdivide(children));
|
|
56
|
+
for (int pos = 0; pos < 4; ++pos) {
|
|
57
|
+
int i, j;
|
|
58
|
+
pcell.GetChildIJ(pos, &i, &j);
|
|
59
|
+
CompareS2CellToPadded(children[pos], S2PaddedCell(pcell, i, j),
|
|
60
|
+
padding);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
TEST(S2PaddedCell, GetEntryExitVertices) {
|
|
67
|
+
const int kIters = 1000;
|
|
68
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
69
|
+
S2CellId id = S2Testing::GetRandomCellId();
|
|
70
|
+
// Check that entry/exit vertices do not depend on padding.
|
|
71
|
+
EXPECT_EQ(S2PaddedCell(id, 0).GetEntryVertex(),
|
|
72
|
+
S2PaddedCell(id, 0.5).GetEntryVertex());
|
|
73
|
+
EXPECT_EQ(S2PaddedCell(id, 0).GetExitVertex(),
|
|
74
|
+
S2PaddedCell(id, 0.5).GetExitVertex());
|
|
75
|
+
|
|
76
|
+
// Check that the exit vertex of one cell is the same as the entry vertex
|
|
77
|
+
// of the immediately following cell. (This also tests wrapping from the
|
|
78
|
+
// end to the start of the S2CellId curve with high probability.)
|
|
79
|
+
EXPECT_EQ(S2PaddedCell(id, 0).GetExitVertex(),
|
|
80
|
+
S2PaddedCell(id.next_wrap(), 0).GetEntryVertex());
|
|
81
|
+
|
|
82
|
+
// Check that the entry vertex of a cell is the same as the entry vertex
|
|
83
|
+
// of its first child, and similarly for the exit vertex.
|
|
84
|
+
if (!id.is_leaf()) {
|
|
85
|
+
EXPECT_EQ(S2PaddedCell(id, 0).GetEntryVertex(),
|
|
86
|
+
S2PaddedCell(id.child(0), 0).GetEntryVertex());
|
|
87
|
+
EXPECT_EQ(S2PaddedCell(id, 0).GetExitVertex(),
|
|
88
|
+
S2PaddedCell(id.child(3), 0).GetExitVertex());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static double SampleInterval(const R1Interval& x) {
|
|
94
|
+
return S2Testing::rnd.UniformDouble(x.lo(), x.hi());
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
TEST(S2PaddedCell, ShrinkToFit) {
|
|
98
|
+
const int kIters = 1000;
|
|
99
|
+
S2Testing::Random* rnd = &S2Testing::rnd;
|
|
100
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
101
|
+
// Start with the desired result and work backwards.
|
|
102
|
+
S2CellId result = S2Testing::GetRandomCellId();
|
|
103
|
+
R2Rect result_uv = result.GetBoundUV();
|
|
104
|
+
R2Point size_uv = result_uv.GetSize();
|
|
105
|
+
|
|
106
|
+
// Find the biggest rectangle that fits in "result" after padding.
|
|
107
|
+
// (These calculations ignore numerical errors.)
|
|
108
|
+
double max_padding = 0.5 * min(size_uv[0], size_uv[1]);
|
|
109
|
+
double padding = max_padding * rnd->RandDouble();
|
|
110
|
+
R2Rect max_rect = result_uv.Expanded(-padding);
|
|
111
|
+
|
|
112
|
+
// Start with a random subset of the maximum rectangle.
|
|
113
|
+
R2Point a(SampleInterval(max_rect[0]), SampleInterval(max_rect[1]));
|
|
114
|
+
R2Point b(SampleInterval(max_rect[0]), SampleInterval(max_rect[1]));
|
|
115
|
+
if (!result.is_leaf()) {
|
|
116
|
+
// If the result is not a leaf cell, we must ensure that no child of
|
|
117
|
+
// "result" also satisfies the conditions of ShrinkToFit(). We do this
|
|
118
|
+
// by ensuring that "rect" intersects at least two children of "result"
|
|
119
|
+
// (after padding).
|
|
120
|
+
int axis = rnd->Uniform(2);
|
|
121
|
+
double center = result.GetCenterUV()[axis];
|
|
122
|
+
|
|
123
|
+
// Find the range of coordinates that are shared between child cells
|
|
124
|
+
// along that axis.
|
|
125
|
+
R1Interval shared(center - padding, center + padding);
|
|
126
|
+
double mid = SampleInterval(shared.Intersection(max_rect[axis]));
|
|
127
|
+
a[axis] = SampleInterval(R1Interval(max_rect[axis].lo(), mid));
|
|
128
|
+
b[axis] = SampleInterval(R1Interval(mid, max_rect[axis].hi()));
|
|
129
|
+
}
|
|
130
|
+
R2Rect rect = R2Rect::FromPointPair(a, b);
|
|
131
|
+
|
|
132
|
+
// Choose an arbitrary ancestor as the S2PaddedCell.
|
|
133
|
+
S2CellId initial_id = result.parent(rnd->Uniform(result.level() + 1));
|
|
134
|
+
EXPECT_EQ(result, S2PaddedCell(initial_id, padding).ShrinkToFit(rect));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
} // namespace
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
#ifndef S2_S2POINT_H_
|
|
19
|
+
#define S2_S2POINT_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/_fp_contract_off.h"
|
|
22
|
+
#include "s2/util/math/vector.h" // IWYU pragma: export
|
|
23
|
+
#include "s2/util/math/vector3_hash.h"
|
|
24
|
+
|
|
25
|
+
// An S2Point represents a point on the unit sphere as a 3D vector. Usually
|
|
26
|
+
// points are normalized to be unit length, but some methods do not require
|
|
27
|
+
// this. See util/math/vector.h for the methods available. Among other
|
|
28
|
+
// things, there are overloaded operators that make it convenient to write
|
|
29
|
+
// arithmetic expressions (e.g. (1-x)*p1 + x*p2).
|
|
30
|
+
using S2Point = Vector3_d;
|
|
31
|
+
|
|
32
|
+
// S2PointHash can be used with standard containers (e.g., unordered_set) or
|
|
33
|
+
// nonstandard extensions (e.g., hash_map). It is defined such that if two
|
|
34
|
+
// S2Points compare equal to each other, they have the same hash. (This
|
|
35
|
+
// requires that positive and negative zero hash to the same value.)
|
|
36
|
+
using S2PointHash = GoodFastHash<S2Point>;
|
|
37
|
+
|
|
38
|
+
#endif // S2_S2POINT_H_
|