@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,292 @@
|
|
|
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_S2R2RECT_H_
|
|
19
|
+
#define S2_S2R2RECT_H_
|
|
20
|
+
|
|
21
|
+
#include <iosfwd>
|
|
22
|
+
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/_fp_contract_off.h"
|
|
25
|
+
#include "s2/r1interval.h"
|
|
26
|
+
#include "s2/r2.h"
|
|
27
|
+
#include "s2/r2rect.h"
|
|
28
|
+
#include "s2/s1angle.h"
|
|
29
|
+
#include "s2/s2region.h"
|
|
30
|
+
|
|
31
|
+
class Decoder;
|
|
32
|
+
class Encoder;
|
|
33
|
+
class R1Interval;
|
|
34
|
+
class S2Cap;
|
|
35
|
+
class S2Cell;
|
|
36
|
+
class S2CellId;
|
|
37
|
+
class S2LatLngRect;
|
|
38
|
+
|
|
39
|
+
// This class is a stopgap measure that allows some of the S2 spherical
|
|
40
|
+
// geometry machinery to be applied to planar geometry. An S2R2Rect
|
|
41
|
+
// represents a closed axis-aligned rectangle in the (x,y) plane (an R2Rect),
|
|
42
|
+
// but it also happens to be a subtype of S2Region, which means that you can
|
|
43
|
+
// use an S2RegionCoverer to approximate it as a collection of S2CellIds.
|
|
44
|
+
//
|
|
45
|
+
// With respect to the S2Cell decomposition, an S2R2Rect is interpreted as a
|
|
46
|
+
// region of (s,t)-space on face 0. In particular, the rectangle [0,1]x[0,1]
|
|
47
|
+
// corresponds to the S2CellId that covers all of face 0. This means that
|
|
48
|
+
// only rectangles that are subsets of [0,1]x[0,1] can be approximated using
|
|
49
|
+
// the S2RegionCoverer interface.
|
|
50
|
+
//
|
|
51
|
+
// The S2R2Rect class is also a convenient way to find the (s,t)-region
|
|
52
|
+
// covered by a given S2CellId (see the FromCell and FromCellId methods).
|
|
53
|
+
//
|
|
54
|
+
// TODO(ericv): If the geometry library is extended to have better support
|
|
55
|
+
// for planar geometry, then this class should no longer be necessary.
|
|
56
|
+
//
|
|
57
|
+
// This class is intended to be copied by value as desired. It uses
|
|
58
|
+
// the default copy constructor and assignment operator, however it is
|
|
59
|
+
// not a "plain old datatype" (POD) because it has virtual functions.
|
|
60
|
+
class S2R2Rect final : public S2Region {
|
|
61
|
+
public:
|
|
62
|
+
// Construct a rectangle from an R2Rect.
|
|
63
|
+
explicit S2R2Rect(const R2Rect& rect);
|
|
64
|
+
|
|
65
|
+
// Construct a rectangle from the given lower-left and upper-right points.
|
|
66
|
+
S2R2Rect(const R2Point& lo, const R2Point& hi);
|
|
67
|
+
|
|
68
|
+
// Construct a rectangle from the given intervals in x and y. The two
|
|
69
|
+
// intervals must either be both empty or both non-empty.
|
|
70
|
+
S2R2Rect(const R1Interval& x, const R1Interval& y);
|
|
71
|
+
|
|
72
|
+
// The canonical empty rectangle. Use is_empty() to test for empty
|
|
73
|
+
// rectangles, since they have more than one representation.
|
|
74
|
+
static S2R2Rect Empty();
|
|
75
|
+
|
|
76
|
+
// Construct a rectangle that corresponds to the boundary of the given cell
|
|
77
|
+
// is (s,t)-space. Such rectangles are always a subset of [0,1]x[0,1].
|
|
78
|
+
static S2R2Rect FromCell(const S2Cell& cell);
|
|
79
|
+
static S2R2Rect FromCellId(S2CellId id);
|
|
80
|
+
|
|
81
|
+
// Construct a rectangle from a center point and size in each dimension.
|
|
82
|
+
// Both components of size should be non-negative, i.e. this method cannot
|
|
83
|
+
// be used to create an empty rectangle.
|
|
84
|
+
static S2R2Rect FromCenterSize(const R2Point& center, const R2Point& size);
|
|
85
|
+
|
|
86
|
+
// Convenience method to construct a rectangle containing a single point.
|
|
87
|
+
static S2R2Rect FromPoint(const R2Point& p);
|
|
88
|
+
|
|
89
|
+
// Convenience method to construct the minimal bounding rectangle containing
|
|
90
|
+
// the two given points. This is equivalent to starting with an empty
|
|
91
|
+
// rectangle and calling AddPoint() twice. Note that it is different than
|
|
92
|
+
// the S2R2Rect(lo, hi) constructor, where the first point is always
|
|
93
|
+
// used as the lower-left corner of the resulting rectangle.
|
|
94
|
+
static S2R2Rect FromPointPair(const R2Point& p1, const R2Point& p2);
|
|
95
|
+
|
|
96
|
+
// Accessor methods.
|
|
97
|
+
const R1Interval& x() const;
|
|
98
|
+
const R1Interval& y() const;
|
|
99
|
+
R2Point lo() const;
|
|
100
|
+
R2Point hi() const;
|
|
101
|
+
|
|
102
|
+
// Methods that allow the S2R2Rect to be accessed as a vector.
|
|
103
|
+
const R1Interval& operator[](int i) const;
|
|
104
|
+
R1Interval& operator[](int i);
|
|
105
|
+
|
|
106
|
+
// Return true if the rectangle is valid, which essentially just means
|
|
107
|
+
// that if the bound for either axis is empty then both must be.
|
|
108
|
+
bool is_valid() const;
|
|
109
|
+
|
|
110
|
+
// Return true if the rectangle is empty, i.e. it contains no points at all.
|
|
111
|
+
bool is_empty() const;
|
|
112
|
+
|
|
113
|
+
// Return the k-th vertex of the rectangle (k = 0,1,2,3) in CCW order.
|
|
114
|
+
// Vertex 0 is in the lower-left corner. For convenience, the argument is
|
|
115
|
+
// reduced modulo 4 to the range [0..3].
|
|
116
|
+
R2Point GetVertex(int k) const;
|
|
117
|
+
|
|
118
|
+
// Return the vertex in direction "i" along the x-axis (0=left, 1=right) and
|
|
119
|
+
// direction "j" along the y-axis (0=down, 1=up). Equivalently, return the
|
|
120
|
+
// vertex constructed by selecting endpoint "i" of the x-interval (0=lo,
|
|
121
|
+
// 1=hi) and vertex "j" of the y-interval.
|
|
122
|
+
R2Point GetVertex(int i, int j) const;
|
|
123
|
+
|
|
124
|
+
// Return the center of the rectangle in (x,y)-space
|
|
125
|
+
// (in general this is not the center of the region on the sphere).
|
|
126
|
+
R2Point GetCenter() const;
|
|
127
|
+
|
|
128
|
+
// Return the width and height of this rectangle in (x,y)-space. Empty
|
|
129
|
+
// rectangles have a negative width and height.
|
|
130
|
+
R2Point GetSize() const;
|
|
131
|
+
|
|
132
|
+
// Return true if the rectangle contains the given point. Note that
|
|
133
|
+
// rectangles are closed regions, i.e. they contain their boundary.
|
|
134
|
+
bool Contains(const R2Point& p) const;
|
|
135
|
+
|
|
136
|
+
// Return true if and only if the given point is contained in the interior
|
|
137
|
+
// of the region (i.e. the region excluding its boundary).
|
|
138
|
+
bool InteriorContains(const R2Point& p) const;
|
|
139
|
+
|
|
140
|
+
// Return true if and only if the rectangle contains the given other
|
|
141
|
+
// rectangle.
|
|
142
|
+
bool Contains(const S2R2Rect& other) const;
|
|
143
|
+
|
|
144
|
+
// Return true if and only if the interior of this rectangle contains all
|
|
145
|
+
// points of the given other rectangle (including its boundary).
|
|
146
|
+
bool InteriorContains(const S2R2Rect& other) const;
|
|
147
|
+
|
|
148
|
+
// Return true if this rectangle and the given other rectangle have any
|
|
149
|
+
// points in common.
|
|
150
|
+
bool Intersects(const S2R2Rect& other) const;
|
|
151
|
+
|
|
152
|
+
// Return true if and only if the interior of this rectangle intersects
|
|
153
|
+
// any point (including the boundary) of the given other rectangle.
|
|
154
|
+
bool InteriorIntersects(const S2R2Rect& other) const;
|
|
155
|
+
|
|
156
|
+
// Increase the size of the bounding rectangle to include the given point.
|
|
157
|
+
// The rectangle is expanded by the minimum amount possible.
|
|
158
|
+
void AddPoint(const R2Point& p);
|
|
159
|
+
|
|
160
|
+
// Return the closest point in the rectangle to the given point "p".
|
|
161
|
+
// The rectangle must be non-empty.
|
|
162
|
+
R2Point Project(const R2Point& p) const;
|
|
163
|
+
|
|
164
|
+
// Return a rectangle that has been expanded on each side in the x-direction
|
|
165
|
+
// by margin.x(), and on each side in the y-direction by margin.y(). If
|
|
166
|
+
// either margin is negative, then shrink the interval on the corresponding
|
|
167
|
+
// sides instead. The resulting rectangle may be empty. Any expansion of
|
|
168
|
+
// an empty rectangle remains empty.
|
|
169
|
+
S2R2Rect Expanded(const R2Point& margin) const;
|
|
170
|
+
S2R2Rect Expanded(double margin) const;
|
|
171
|
+
|
|
172
|
+
// Return the smallest rectangle containing the union of this rectangle and
|
|
173
|
+
// the given rectangle.
|
|
174
|
+
S2R2Rect Union(const S2R2Rect& other) const;
|
|
175
|
+
|
|
176
|
+
// Return the smallest rectangle containing the intersection of this
|
|
177
|
+
// rectangle and the given rectangle.
|
|
178
|
+
S2R2Rect Intersection(const S2R2Rect& other) const;
|
|
179
|
+
|
|
180
|
+
// Return true if two rectangles contains the same set of points.
|
|
181
|
+
bool operator==(const S2R2Rect& other) const;
|
|
182
|
+
|
|
183
|
+
// Return true if the x- and y-intervals of the two rectangles are the same
|
|
184
|
+
// up to the given tolerance (see r1interval.h for details).
|
|
185
|
+
bool ApproxEquals(const S2R2Rect& other,
|
|
186
|
+
S1Angle max_error = S1Angle::Radians(1e-15)) const;
|
|
187
|
+
|
|
188
|
+
// Return the unit-length S2Point corresponding to the given point "p" in
|
|
189
|
+
// the (s,t)-plane. "p" need not be restricted to the range [0,1]x[0,1].
|
|
190
|
+
static S2Point ToS2Point(const R2Point& p);
|
|
191
|
+
|
|
192
|
+
////////////////////////////////////////////////////////////////////////
|
|
193
|
+
// S2Region interface (see s2region.h for details):
|
|
194
|
+
|
|
195
|
+
S2R2Rect* Clone() const override;
|
|
196
|
+
S2Cap GetCapBound() const override;
|
|
197
|
+
S2LatLngRect GetRectBound() const override;
|
|
198
|
+
bool Contains(const S2Point& p) const override;
|
|
199
|
+
bool Contains(const S2Cell& cell) const override;
|
|
200
|
+
bool MayIntersect(const S2Cell& cell) const override;
|
|
201
|
+
|
|
202
|
+
private:
|
|
203
|
+
R2Rect rect_;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
std::ostream& operator<<(std::ostream& os, const S2R2Rect& r);
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
////////////////// Implementation details follow ////////////////////
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
inline S2R2Rect::S2R2Rect(const R2Rect& rect) : rect_(rect) {}
|
|
213
|
+
|
|
214
|
+
inline S2R2Rect::S2R2Rect(const R2Point& lo, const R2Point& hi)
|
|
215
|
+
: rect_(lo, hi) {}
|
|
216
|
+
|
|
217
|
+
inline S2R2Rect::S2R2Rect(const R1Interval& x, const R1Interval& y)
|
|
218
|
+
: rect_(x, y) {}
|
|
219
|
+
|
|
220
|
+
inline S2R2Rect S2R2Rect::FromCenterSize(const R2Point& center,
|
|
221
|
+
const R2Point& size) {
|
|
222
|
+
return S2R2Rect(R2Rect::FromCenterSize(center, size));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
inline S2R2Rect S2R2Rect::FromPoint(const R2Point& p) {
|
|
226
|
+
return S2R2Rect(R2Rect::FromPoint(p));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
inline S2R2Rect S2R2Rect::FromPointPair(const R2Point& p1, const R2Point& p2) {
|
|
230
|
+
return S2R2Rect(R2Rect::FromPointPair(p1, p2));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
inline const R1Interval& S2R2Rect::x() const { return rect_.x(); }
|
|
234
|
+
inline const R1Interval& S2R2Rect::y() const { return rect_.y(); }
|
|
235
|
+
inline R2Point S2R2Rect::lo() const { return rect_.lo(); }
|
|
236
|
+
inline R2Point S2R2Rect::hi() const { return rect_.hi(); }
|
|
237
|
+
inline const R1Interval& S2R2Rect::operator[](int i) const { return rect_[i]; }
|
|
238
|
+
inline R1Interval& S2R2Rect::operator[](int i) { return rect_[i]; }
|
|
239
|
+
inline S2R2Rect S2R2Rect::Empty() { return S2R2Rect(R2Rect::Empty()); }
|
|
240
|
+
inline bool S2R2Rect::is_valid() const { return rect_.is_valid(); }
|
|
241
|
+
inline bool S2R2Rect::is_empty() const { return rect_.is_empty(); }
|
|
242
|
+
inline R2Point S2R2Rect::GetVertex(int k) const { return rect_.GetVertex(k); }
|
|
243
|
+
inline R2Point S2R2Rect::GetVertex(int i, int j) const {
|
|
244
|
+
return rect_.GetVertex(i, j);
|
|
245
|
+
}
|
|
246
|
+
inline R2Point S2R2Rect::GetCenter() const { return rect_.GetCenter(); }
|
|
247
|
+
inline R2Point S2R2Rect::GetSize() const { return rect_.GetSize(); }
|
|
248
|
+
inline bool S2R2Rect::Contains(const R2Point& p) const {
|
|
249
|
+
return rect_.Contains(p);
|
|
250
|
+
}
|
|
251
|
+
inline bool S2R2Rect::InteriorContains(const R2Point& p) const {
|
|
252
|
+
return rect_.InteriorContains(p);
|
|
253
|
+
}
|
|
254
|
+
inline bool S2R2Rect::Contains(const S2R2Rect& other) const {
|
|
255
|
+
return rect_.Contains(other.rect_);
|
|
256
|
+
}
|
|
257
|
+
inline bool S2R2Rect::InteriorContains(const S2R2Rect& other) const {
|
|
258
|
+
return rect_.InteriorContains(other.rect_);
|
|
259
|
+
}
|
|
260
|
+
inline bool S2R2Rect::Intersects(const S2R2Rect& other) const {
|
|
261
|
+
return rect_.Intersects(other.rect_);
|
|
262
|
+
}
|
|
263
|
+
inline bool S2R2Rect::InteriorIntersects(const S2R2Rect& other) const {
|
|
264
|
+
return rect_.InteriorIntersects(other.rect_);
|
|
265
|
+
}
|
|
266
|
+
inline void S2R2Rect::AddPoint(const R2Point& p) {
|
|
267
|
+
rect_.AddPoint(p);
|
|
268
|
+
}
|
|
269
|
+
inline R2Point S2R2Rect::Project(const R2Point& p) const {
|
|
270
|
+
return rect_.Project(p);
|
|
271
|
+
}
|
|
272
|
+
inline S2R2Rect S2R2Rect::Expanded(const R2Point& margin) const {
|
|
273
|
+
return S2R2Rect(rect_.Expanded(margin));
|
|
274
|
+
}
|
|
275
|
+
inline S2R2Rect S2R2Rect::Expanded(double margin) const {
|
|
276
|
+
return S2R2Rect(rect_.Expanded(margin));
|
|
277
|
+
}
|
|
278
|
+
inline S2R2Rect S2R2Rect::Union(const S2R2Rect& other) const {
|
|
279
|
+
return S2R2Rect(rect_.Union(other.rect_));
|
|
280
|
+
}
|
|
281
|
+
inline S2R2Rect S2R2Rect::Intersection(const S2R2Rect& other) const {
|
|
282
|
+
return S2R2Rect(rect_.Intersection(other.rect_));
|
|
283
|
+
}
|
|
284
|
+
inline bool S2R2Rect::operator==(const S2R2Rect& other) const {
|
|
285
|
+
return rect_ == other.rect_;
|
|
286
|
+
}
|
|
287
|
+
inline bool S2R2Rect::ApproxEquals(const S2R2Rect& other,
|
|
288
|
+
S1Angle max_error) const {
|
|
289
|
+
return rect_.ApproxEquals(other.rect_, max_error.radians());
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
#endif // S2_S2R2RECT_H_
|
|
@@ -0,0 +1,312 @@
|
|
|
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
|
+
// Most of the S2R2Rect methods have trivial implementations in terms of the
|
|
19
|
+
// R1Interval class, so most of the testing is done in that unit test.
|
|
20
|
+
|
|
21
|
+
#include "s2/s2r2rect.h"
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
|
|
25
|
+
#include "s2/base/integral_types.h"
|
|
26
|
+
#include "s2/r1interval.h"
|
|
27
|
+
#include "s2/s2cap.h"
|
|
28
|
+
#include "s2/s2cell.h"
|
|
29
|
+
#include "s2/s2cell_id.h"
|
|
30
|
+
#include "s2/s2coords.h"
|
|
31
|
+
#include "s2/s2latlng.h"
|
|
32
|
+
#include "s2/s2latlng_rect.h"
|
|
33
|
+
#include "s2/s2pointutil.h"
|
|
34
|
+
#include "s2/s2testing.h"
|
|
35
|
+
#include "s2/third_party/absl/strings/str_cat.h"
|
|
36
|
+
|
|
37
|
+
using absl::StrCat;
|
|
38
|
+
|
|
39
|
+
static void TestIntervalOps(const S2R2Rect& x, const S2R2Rect& y,
|
|
40
|
+
const char* expected_rexion,
|
|
41
|
+
const S2R2Rect& expected_union,
|
|
42
|
+
const S2R2Rect& expected_intersection) {
|
|
43
|
+
// Test all of the interval operations on the given pair of intervals.
|
|
44
|
+
// "expected_rexion" is a sequence of "T" and "F" characters corresponding
|
|
45
|
+
// to the expected results of Contains(), InteriorContains(), Intersects(),
|
|
46
|
+
// and InteriorIntersects() respectively.
|
|
47
|
+
|
|
48
|
+
EXPECT_EQ(expected_rexion[0] == 'T', x.Contains(y));
|
|
49
|
+
EXPECT_EQ(expected_rexion[1] == 'T', x.InteriorContains(y));
|
|
50
|
+
EXPECT_EQ(expected_rexion[2] == 'T', x.Intersects(y));
|
|
51
|
+
EXPECT_EQ(expected_rexion[3] == 'T', x.InteriorIntersects(y));
|
|
52
|
+
|
|
53
|
+
EXPECT_EQ(x.Union(y) == x, x.Contains(y));
|
|
54
|
+
EXPECT_EQ(!x.Intersection(y).is_empty(), x.Intersects(y));
|
|
55
|
+
|
|
56
|
+
EXPECT_EQ(expected_union, x.Union(y));
|
|
57
|
+
EXPECT_EQ(expected_intersection, x.Intersection(y));
|
|
58
|
+
|
|
59
|
+
if (y.GetSize() == R2Point(0, 0)) {
|
|
60
|
+
S2R2Rect r = x;
|
|
61
|
+
r.AddPoint(y.lo());
|
|
62
|
+
EXPECT_EQ(expected_union, r);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static void TestCellOps(const S2R2Rect& r, const S2Cell& cell, int level) {
|
|
67
|
+
// Test the relationship between the given rectangle and cell:
|
|
68
|
+
// 0 == no intersection, 2 == Intersects,
|
|
69
|
+
// 3 == Intersects and one region contains a vertex of the other,
|
|
70
|
+
// 4 == Contains
|
|
71
|
+
|
|
72
|
+
bool vertex_contained = false;
|
|
73
|
+
for (int i = 0; i < 4; ++i) {
|
|
74
|
+
// This would be easier to do by constructing an S2R2Rect from the cell,
|
|
75
|
+
// but that would defeat the purpose of testing this code independently.
|
|
76
|
+
double u, v;
|
|
77
|
+
if (S2::FaceXYZtoUV(0, cell.GetVertexRaw(i), &u, &v)) {
|
|
78
|
+
if (r.Contains(R2Point(S2::UVtoST(u), S2::UVtoST(v))))
|
|
79
|
+
vertex_contained = true;
|
|
80
|
+
}
|
|
81
|
+
if (!r.is_empty() && cell.Contains(S2R2Rect::ToS2Point(r.GetVertex(i))))
|
|
82
|
+
vertex_contained = true;
|
|
83
|
+
}
|
|
84
|
+
EXPECT_EQ(level >= 2, r.MayIntersect(cell));
|
|
85
|
+
EXPECT_EQ(level >= 3, vertex_contained);
|
|
86
|
+
EXPECT_EQ(level >= 4, r.Contains(cell));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
TEST(S2R2Rect, EmptyRectangles) {
|
|
90
|
+
// Test basic properties of empty rectangles.
|
|
91
|
+
S2R2Rect empty = S2R2Rect::Empty();
|
|
92
|
+
EXPECT_TRUE(empty.is_valid());
|
|
93
|
+
EXPECT_TRUE(empty.is_empty());
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
TEST(S2R2Rect, ConstructorsAndAccessors) {
|
|
97
|
+
// Check various constructors and accessor methods.
|
|
98
|
+
S2R2Rect d1 = S2R2Rect(R2Point(0.1, 0), R2Point(0.25, 1));
|
|
99
|
+
EXPECT_EQ(0.1, d1.x().lo());
|
|
100
|
+
EXPECT_EQ(0.25, d1.x().hi());
|
|
101
|
+
EXPECT_EQ(0.0, d1.y().lo());
|
|
102
|
+
EXPECT_EQ(1.0, d1.y().hi());
|
|
103
|
+
EXPECT_EQ(R1Interval(0.1, 0.25), d1.x());
|
|
104
|
+
EXPECT_EQ(R1Interval(0, 1), d1.y());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
TEST(S2R2Rect, FromCell) {
|
|
108
|
+
// FromCell, FromCellId
|
|
109
|
+
EXPECT_EQ(S2R2Rect(R2Point(0, 0), R2Point(0.5, 0.5)),
|
|
110
|
+
S2R2Rect::FromCell(S2Cell::FromFacePosLevel(0, 0, 1)));
|
|
111
|
+
EXPECT_EQ(S2R2Rect(R2Point(0, 0), R2Point(1, 1)),
|
|
112
|
+
S2R2Rect::FromCellId(S2CellId::FromFacePosLevel(0, 0, 0)));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
TEST(S2R2Rect, FromCenterSize) {
|
|
116
|
+
// FromCenterSize()
|
|
117
|
+
EXPECT_TRUE(S2R2Rect::FromCenterSize(R2Point(0.3, 0.5), R2Point(0.2, 0.4)).
|
|
118
|
+
ApproxEquals(S2R2Rect(R2Point(0.2, 0.3), R2Point(0.4, 0.7))));
|
|
119
|
+
EXPECT_TRUE(S2R2Rect::FromCenterSize(R2Point(1, 0.1), R2Point(0, 2)).
|
|
120
|
+
ApproxEquals(S2R2Rect(R2Point(1, -0.9), R2Point(1, 1.1))));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
TEST(S2R2Rect, FromPoint) {
|
|
124
|
+
// FromPoint(), FromPointPair()
|
|
125
|
+
S2R2Rect d1 = S2R2Rect(R2Point(0.1, 0), R2Point(0.25, 1));
|
|
126
|
+
EXPECT_EQ(S2R2Rect(d1.lo(), d1.lo()), S2R2Rect::FromPoint(d1.lo()));
|
|
127
|
+
EXPECT_EQ(S2R2Rect(R2Point(0.15, 0.3), R2Point(0.35, 0.9)),
|
|
128
|
+
S2R2Rect::FromPointPair(R2Point(0.15, 0.9), R2Point(0.35, 0.3)));
|
|
129
|
+
EXPECT_EQ(S2R2Rect(R2Point(0.12, 0), R2Point(0.83, 0.5)),
|
|
130
|
+
S2R2Rect::FromPointPair(R2Point(0.83, 0), R2Point(0.12, 0.5)));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
TEST(S2R2Rect, SimplePredicates) {
|
|
134
|
+
// GetCenter(), GetVertex(), Contains(R2Point), InteriorContains(R2Point).
|
|
135
|
+
R2Point sw1 = R2Point(0, 0.25);
|
|
136
|
+
R2Point ne1 = R2Point(0.5, 0.75);
|
|
137
|
+
S2R2Rect r1(sw1, ne1);
|
|
138
|
+
|
|
139
|
+
EXPECT_EQ(R2Point(0.25, 0.5), r1.GetCenter());
|
|
140
|
+
EXPECT_EQ(R2Point(0, 0.25), r1.GetVertex(0));
|
|
141
|
+
EXPECT_EQ(R2Point(0.5, 0.25), r1.GetVertex(1));
|
|
142
|
+
EXPECT_EQ(R2Point(0.5, 0.75), r1.GetVertex(2));
|
|
143
|
+
EXPECT_EQ(R2Point(0, 0.75), r1.GetVertex(3));
|
|
144
|
+
EXPECT_TRUE(r1.Contains(R2Point(0.2, 0.4)));
|
|
145
|
+
EXPECT_FALSE(r1.Contains(R2Point(0.2, 0.8)));
|
|
146
|
+
EXPECT_FALSE(r1.Contains(R2Point(-0.1, 0.4)));
|
|
147
|
+
EXPECT_FALSE(r1.Contains(R2Point(0.6, 0.1)));
|
|
148
|
+
EXPECT_TRUE(r1.Contains(sw1));
|
|
149
|
+
EXPECT_TRUE(r1.Contains(ne1));
|
|
150
|
+
EXPECT_FALSE(r1.InteriorContains(sw1));
|
|
151
|
+
EXPECT_FALSE(r1.InteriorContains(ne1));
|
|
152
|
+
|
|
153
|
+
// Make sure that GetVertex() returns vertices in CCW order.
|
|
154
|
+
for (int k = 0; k < 4; ++k) {
|
|
155
|
+
SCOPED_TRACE(StrCat("k=", k));
|
|
156
|
+
EXPECT_TRUE(S2::SimpleCCW(S2R2Rect::ToS2Point(r1.GetVertex(k - 1)),
|
|
157
|
+
S2R2Rect::ToS2Point(r1.GetVertex(k)),
|
|
158
|
+
S2R2Rect::ToS2Point(r1.GetVertex(k + 1))));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
TEST(S2R2Rect, IntervalOperations) {
|
|
163
|
+
// Contains(S2R2Rect), InteriorContains(S2R2Rect),
|
|
164
|
+
// Intersects(), InteriorIntersects(), Union(), Intersection().
|
|
165
|
+
//
|
|
166
|
+
// Much more testing of these methods is done in s1interval_test
|
|
167
|
+
// and r1interval_test.
|
|
168
|
+
|
|
169
|
+
S2R2Rect empty = S2R2Rect::Empty();
|
|
170
|
+
R2Point sw1 = R2Point(0, 0.25);
|
|
171
|
+
R2Point ne1 = R2Point(0.5, 0.75);
|
|
172
|
+
S2R2Rect r1(sw1, ne1);
|
|
173
|
+
S2R2Rect r1_mid = S2R2Rect(R2Point(0.25, 0.5), R2Point(0.25, 0.5));
|
|
174
|
+
S2R2Rect r_sw1(sw1, sw1);
|
|
175
|
+
S2R2Rect r_ne1(ne1, ne1);
|
|
176
|
+
|
|
177
|
+
TestIntervalOps(r1, r1_mid, "TTTT", r1, r1_mid);
|
|
178
|
+
TestIntervalOps(r1, r_sw1, "TFTF", r1, r_sw1);
|
|
179
|
+
TestIntervalOps(r1, r_ne1, "TFTF", r1, r_ne1);
|
|
180
|
+
|
|
181
|
+
EXPECT_EQ(S2R2Rect(R2Point(0, 0.25), R2Point(0.5, 0.75)), r1);
|
|
182
|
+
TestIntervalOps(r1, S2R2Rect(R2Point(0.45, 0.1), R2Point(0.75, 0.3)), "FFTT",
|
|
183
|
+
S2R2Rect(R2Point(0, 0.1), R2Point(0.75, 0.75)),
|
|
184
|
+
S2R2Rect(R2Point(0.45, 0.25), R2Point(0.5, 0.3)));
|
|
185
|
+
TestIntervalOps(r1, S2R2Rect(R2Point(0.5, 0.1), R2Point(0.7, 0.3)), "FFTF",
|
|
186
|
+
S2R2Rect(R2Point(0, 0.1), R2Point(0.7, 0.75)),
|
|
187
|
+
S2R2Rect(R2Point(0.5, 0.25), R2Point(0.5, 0.3)));
|
|
188
|
+
TestIntervalOps(r1, S2R2Rect(R2Point(0.45, 0.1), R2Point(0.7, 0.25)), "FFTF",
|
|
189
|
+
S2R2Rect(R2Point(0, 0.1), R2Point(0.7, 0.75)),
|
|
190
|
+
S2R2Rect(R2Point(0.45, 0.25), R2Point(0.5, 0.25)));
|
|
191
|
+
|
|
192
|
+
TestIntervalOps(S2R2Rect(R2Point(0.1, 0.2), R2Point(0.1, 0.3)),
|
|
193
|
+
S2R2Rect(R2Point(0.15, 0.7), R2Point(0.2, 0.8)), "FFFF",
|
|
194
|
+
S2R2Rect(R2Point(0.1, 0.2), R2Point(0.2, 0.8)),
|
|
195
|
+
empty);
|
|
196
|
+
|
|
197
|
+
// Check that the intersection of two rectangles that overlap in x but not y
|
|
198
|
+
// is valid, and vice versa.
|
|
199
|
+
TestIntervalOps(S2R2Rect(R2Point(0.1, 0.2), R2Point(0.4, 0.5)),
|
|
200
|
+
S2R2Rect(R2Point(0, 0), R2Point(0.2, 0.1)), "FFFF",
|
|
201
|
+
S2R2Rect(R2Point(0, 0), R2Point(0.4, 0.5)), empty);
|
|
202
|
+
TestIntervalOps(S2R2Rect(R2Point(0, 0), R2Point(0.1, 0.3)),
|
|
203
|
+
S2R2Rect(R2Point(0.2, 0.1), R2Point(0.3, 0.4)), "FFFF",
|
|
204
|
+
S2R2Rect(R2Point(0, 0), R2Point(0.3, 0.4)), empty);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
TEST(S2R2Rect, AddPoint) {
|
|
208
|
+
// AddPoint()
|
|
209
|
+
R2Point sw1 = R2Point(0, 0.25);
|
|
210
|
+
R2Point ne1 = R2Point(0.5, 0.75);
|
|
211
|
+
S2R2Rect r1(sw1, ne1);
|
|
212
|
+
|
|
213
|
+
S2R2Rect r2 = S2R2Rect::Empty();
|
|
214
|
+
r2.AddPoint(R2Point(0, 0.25));
|
|
215
|
+
r2.AddPoint(R2Point(0.5, 0.25));
|
|
216
|
+
r2.AddPoint(R2Point(0, 0.75));
|
|
217
|
+
r2.AddPoint(R2Point(0.1, 0.4));
|
|
218
|
+
EXPECT_EQ(r1, r2);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
TEST(S2R2Rect, Project) {
|
|
222
|
+
S2R2Rect r1(R1Interval(0, 0.5), R1Interval(0.25, 0.75));
|
|
223
|
+
|
|
224
|
+
EXPECT_EQ(R2Point(0, 0.25), r1.Project(R2Point(-0.01, 0.24)));
|
|
225
|
+
EXPECT_EQ(R2Point(0, 0.48), r1.Project(R2Point(-5.0, 0.48)));
|
|
226
|
+
EXPECT_EQ(R2Point(0, 0.75), r1.Project(R2Point(-5.0, 2.48)));
|
|
227
|
+
EXPECT_EQ(R2Point(0.19, 0.75), r1.Project(R2Point(0.19, 2.48)));
|
|
228
|
+
EXPECT_EQ(R2Point(0.5, 0.75), r1.Project(R2Point(6.19, 2.48)));
|
|
229
|
+
EXPECT_EQ(R2Point(0.5, 0.53), r1.Project(R2Point(6.19, 0.53)));
|
|
230
|
+
EXPECT_EQ(R2Point(0.5, 0.25), r1.Project(R2Point(6.19, -2.53)));
|
|
231
|
+
EXPECT_EQ(R2Point(0.33, 0.25), r1.Project(R2Point(0.33, -2.53)));
|
|
232
|
+
EXPECT_EQ(R2Point(0.33, 0.37), r1.Project(R2Point(0.33, 0.37)));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
TEST(S2R2Rect, Expanded) {
|
|
236
|
+
// Expanded()
|
|
237
|
+
EXPECT_TRUE(S2R2Rect::Empty().Expanded(R2Point(0.1, 0.3)).is_empty());
|
|
238
|
+
EXPECT_TRUE(S2R2Rect::Empty().Expanded(R2Point(-0.1, -0.3)).is_empty());
|
|
239
|
+
EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
|
|
240
|
+
Expanded(R2Point(0.1, 0.3)).
|
|
241
|
+
ApproxEquals(S2R2Rect(R2Point(0.1, 0.1), R2Point(0.4, 1.0))));
|
|
242
|
+
EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
|
|
243
|
+
Expanded(R2Point(-0.1, 0.3)).is_empty());
|
|
244
|
+
EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
|
|
245
|
+
Expanded(R2Point(0.1, -0.2)).is_empty());
|
|
246
|
+
EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
|
|
247
|
+
Expanded(R2Point(0.1, -0.1)).
|
|
248
|
+
ApproxEquals(S2R2Rect(R2Point(0.1, 0.5), R2Point(0.4, 0.6))));
|
|
249
|
+
EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).Expanded(0.1).
|
|
250
|
+
ApproxEquals(S2R2Rect(R2Point(0.1, 0.3), R2Point(0.4, 0.8))));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
TEST(S2R2Rect, Bounds) {
|
|
254
|
+
// GetCapBound(), GetRectBound()
|
|
255
|
+
S2R2Rect empty = S2R2Rect::Empty();
|
|
256
|
+
EXPECT_TRUE(empty.GetCapBound().is_empty());
|
|
257
|
+
EXPECT_TRUE(empty.GetRectBound().is_empty());
|
|
258
|
+
EXPECT_EQ(S2Cap::FromPoint(S2Point(1, 0, 0)),
|
|
259
|
+
S2R2Rect(R2Point(0.5, 0.5), R2Point(0.5, 0.5)).GetCapBound());
|
|
260
|
+
EXPECT_EQ(S2LatLngRect::FromPoint(S2LatLng::FromDegrees(0, 0)),
|
|
261
|
+
S2R2Rect(R2Point(0.5, 0.5), R2Point(0.5, 0.5)).GetRectBound());
|
|
262
|
+
|
|
263
|
+
for (int i = 0; i < 10; ++i) {
|
|
264
|
+
SCOPED_TRACE(StrCat("i=", i));
|
|
265
|
+
S2R2Rect rect = S2R2Rect::FromCellId(S2Testing::GetRandomCellId());
|
|
266
|
+
S2Cap cap = rect.GetCapBound();
|
|
267
|
+
S2LatLngRect llrect = rect.GetRectBound();
|
|
268
|
+
for (int k = 0; k < 4; ++k) {
|
|
269
|
+
S2Point v = S2R2Rect::ToS2Point(rect.GetVertex(k));
|
|
270
|
+
// v2 is a point that is well outside the rectangle.
|
|
271
|
+
S2Point v2 = (cap.center() + 3 * (v - cap.center())).Normalize();
|
|
272
|
+
EXPECT_TRUE(cap.Contains(v));
|
|
273
|
+
EXPECT_FALSE(cap.Contains(v2));
|
|
274
|
+
EXPECT_TRUE(llrect.Contains(v));
|
|
275
|
+
EXPECT_FALSE(llrect.Contains(v2));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
TEST(S2R2Rect, CellOperations) {
|
|
281
|
+
// Contains(S2Cell), MayIntersect(S2Cell)
|
|
282
|
+
|
|
283
|
+
S2R2Rect empty = S2R2Rect::Empty();
|
|
284
|
+
TestCellOps(empty, S2Cell::FromFace(3), 0);
|
|
285
|
+
|
|
286
|
+
// This rectangle includes the first quadrant of face 0. It's expanded
|
|
287
|
+
// slightly because cell bounding rectangles are slightly conservative.
|
|
288
|
+
S2R2Rect r4 = S2R2Rect(R2Point(0, 0), R2Point(0.5, 0.5));
|
|
289
|
+
TestCellOps(r4, S2Cell::FromFacePosLevel(0, 0, 0), 3);
|
|
290
|
+
TestCellOps(r4, S2Cell::FromFacePosLevel(0, 0, 1), 4);
|
|
291
|
+
TestCellOps(r4, S2Cell::FromFacePosLevel(1, 0, 1), 0);
|
|
292
|
+
|
|
293
|
+
// This rectangle intersects the first quadrant of face 0.
|
|
294
|
+
S2R2Rect r5 = S2R2Rect(R2Point(0, 0.45), R2Point(0.5, 0.55));
|
|
295
|
+
TestCellOps(r5, S2Cell::FromFacePosLevel(0, 0, 0), 3);
|
|
296
|
+
TestCellOps(r5, S2Cell::FromFacePosLevel(0, 0, 1), 3);
|
|
297
|
+
TestCellOps(r5, S2Cell::FromFacePosLevel(1, 0, 1), 0);
|
|
298
|
+
|
|
299
|
+
// Rectangle consisting of a single point.
|
|
300
|
+
TestCellOps(S2R2Rect(R2Point(0.51, 0.51), R2Point(0.51, 0.51)),
|
|
301
|
+
S2Cell::FromFace(0), 3);
|
|
302
|
+
|
|
303
|
+
// Rectangle that intersects the bounding rectangle of face 0
|
|
304
|
+
// but not the face itself.
|
|
305
|
+
TestCellOps(S2R2Rect(R2Point(0.01, 1.001), R2Point(0.02, 1.002)),
|
|
306
|
+
S2Cell::FromFace(0), 0);
|
|
307
|
+
|
|
308
|
+
// Rectangle that intersects one corner of face 0.
|
|
309
|
+
TestCellOps(S2R2Rect(R2Point(0.99, -0.01), R2Point(1.01, 0.01)),
|
|
310
|
+
S2Cell::FromFacePosLevel(0, ~uint64{0} >> S2CellId::kFaceBits, 5),
|
|
311
|
+
3);
|
|
312
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
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/s2region.h"
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#include "s2/s2cap.h"
|
|
23
|
+
|
|
24
|
+
void S2Region::GetCellUnionBound(std::vector<S2CellId> *cell_ids) const {
|
|
25
|
+
return GetCapBound().GetCellUnionBound(cell_ids);
|
|
26
|
+
}
|