@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,539 @@
|
|
|
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/s2edge_distances.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <string>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/s1chord_angle.h"
|
|
25
|
+
#include "s2/s2pointutil.h"
|
|
26
|
+
#include "s2/s2polyline.h"
|
|
27
|
+
#include "s2/s2predicates.h"
|
|
28
|
+
#include "s2/s2testing.h"
|
|
29
|
+
#include "s2/s2text_format.h"
|
|
30
|
+
|
|
31
|
+
using std::unique_ptr;
|
|
32
|
+
|
|
33
|
+
// Checks that the error returned by S2::GetUpdateMinDistanceMaxError() for
|
|
34
|
+
// the distance "input" (measured in radians) corresponds to a distance error
|
|
35
|
+
// of less than "max_error" (measured in radians).
|
|
36
|
+
//
|
|
37
|
+
// The reason for the awkward phraseology above is that the value returned by
|
|
38
|
+
// GetUpdateMinDistanceMaxError() is not a distance; it represents an error in
|
|
39
|
+
// the *squared* distance.
|
|
40
|
+
void CheckUpdateMinDistanceMaxError(double actual, double max_error) {
|
|
41
|
+
S1ChordAngle ca(S1Angle::Radians(actual));
|
|
42
|
+
S1Angle bound = ca.PlusError(S2::GetUpdateMinDistanceMaxError(ca)).ToAngle();
|
|
43
|
+
EXPECT_LE(bound.radians() - actual, max_error) << actual;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
TEST(S2, GetUpdateMinDistanceMaxError) {
|
|
47
|
+
// Verify that the error is "reasonable" for a sampling of distances.
|
|
48
|
+
CheckUpdateMinDistanceMaxError(0, 1.5e-15);
|
|
49
|
+
CheckUpdateMinDistanceMaxError(1e-8, 1e-15);
|
|
50
|
+
CheckUpdateMinDistanceMaxError(1e-5, 1e-15);
|
|
51
|
+
CheckUpdateMinDistanceMaxError(0.05, 1e-15);
|
|
52
|
+
CheckUpdateMinDistanceMaxError(M_PI_2 - 1e-8, 2e-15);
|
|
53
|
+
CheckUpdateMinDistanceMaxError(M_PI_2, 2e-15);
|
|
54
|
+
CheckUpdateMinDistanceMaxError(M_PI_2 + 1e-8, 2e-15);
|
|
55
|
+
CheckUpdateMinDistanceMaxError(M_PI - 1e-5, 2e-10);
|
|
56
|
+
CheckUpdateMinDistanceMaxError(M_PI, 0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
TEST(S2, GetUpdateMinInteriorDistanceMaxError) {
|
|
60
|
+
// Check that the error bound returned by
|
|
61
|
+
// GetUpdateMinInteriorDistanceMaxError() is large enough.
|
|
62
|
+
auto& rnd = S2Testing::rnd;
|
|
63
|
+
for (int iter = 0; iter < 10000; ++iter) {
|
|
64
|
+
S2Point a0 = S2Testing::RandomPoint();
|
|
65
|
+
S1Angle len = S1Angle::Radians(M_PI * pow(1e-20, rnd.RandDouble()));
|
|
66
|
+
S2Point a1 = S2::InterpolateAtDistance(len, a0, S2Testing::RandomPoint());
|
|
67
|
+
// TODO(ericv): If s2pred::RobustCrossProd() is implemented, then we can
|
|
68
|
+
// also test nearly-antipodal points here. In theory the error bound can
|
|
69
|
+
// be exceeded when the edge endpoints are antipodal to within 0.8e-13
|
|
70
|
+
// radians, but the only examples found in testing require the endpoints
|
|
71
|
+
// to be nearly-antipodal to within 1e-16 radians.
|
|
72
|
+
S2Point n = S2::RobustCrossProd(a0, a1).Normalize();
|
|
73
|
+
double f = pow(1e-20, rnd.RandDouble());
|
|
74
|
+
S2Point a = ((1 - f) * a0 + f * a1).Normalize();
|
|
75
|
+
S1Angle r = S1Angle::Radians(M_PI_2 * pow(1e-20, rnd.RandDouble()));
|
|
76
|
+
if (rnd.OneIn(2)) r = S1Angle::Radians(M_PI_2) - r;
|
|
77
|
+
S2Point x = S2::InterpolateAtDistance(r, a, n);
|
|
78
|
+
S1ChordAngle min_dist = S1ChordAngle::Infinity();
|
|
79
|
+
if (!S2::UpdateMinInteriorDistance(x, a0, a1, &min_dist)) {
|
|
80
|
+
--iter; continue;
|
|
81
|
+
}
|
|
82
|
+
double error = S2::GetUpdateMinDistanceMaxError(min_dist);
|
|
83
|
+
EXPECT_LE(s2pred::CompareEdgeDistance(x, a0, a1,
|
|
84
|
+
min_dist.PlusError(error)), 0);
|
|
85
|
+
EXPECT_GE(s2pred::CompareEdgeDistance(x, a0, a1,
|
|
86
|
+
min_dist.PlusError(-error)), 0);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Given a point X and an edge AB, check that the distance from X to AB is
|
|
91
|
+
// "distance_radians" and the closest point on AB is "expected_closest".
|
|
92
|
+
void CheckDistance(S2Point x, S2Point a, S2Point b,
|
|
93
|
+
double distance_radians, S2Point expected_closest) {
|
|
94
|
+
x = x.Normalize();
|
|
95
|
+
a = a.Normalize();
|
|
96
|
+
b = b.Normalize();
|
|
97
|
+
expected_closest = expected_closest.Normalize();
|
|
98
|
+
EXPECT_NEAR(distance_radians, S2::GetDistance(x, a, b).radians(), 1e-15);
|
|
99
|
+
S2Point closest = S2::Project(x, a, b);
|
|
100
|
+
if (expected_closest == S2Point(0, 0, 0)) {
|
|
101
|
+
// This special value says that the result should be A or B.
|
|
102
|
+
EXPECT_TRUE(closest == a || closest == b);
|
|
103
|
+
} else {
|
|
104
|
+
EXPECT_TRUE(S2::ApproxEquals(closest, expected_closest));
|
|
105
|
+
}
|
|
106
|
+
S1ChordAngle min_distance = S1ChordAngle::Zero();
|
|
107
|
+
EXPECT_FALSE(S2::UpdateMinDistance(x, a, b, &min_distance));
|
|
108
|
+
min_distance = S1ChordAngle::Infinity();
|
|
109
|
+
EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
|
|
110
|
+
EXPECT_NEAR(distance_radians, min_distance.ToAngle().radians(), 1e-15);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(S2, Distance) {
|
|
114
|
+
CheckDistance(S2Point(1, 0, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
115
|
+
0, S2Point(1, 0, 0));
|
|
116
|
+
CheckDistance(S2Point(0, 1, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
117
|
+
0, S2Point(0, 1, 0));
|
|
118
|
+
CheckDistance(S2Point(1, 3, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
119
|
+
0, S2Point(1, 3, 0));
|
|
120
|
+
CheckDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
121
|
+
M_PI_2, S2Point(1, 0, 0));
|
|
122
|
+
CheckDistance(S2Point(0, 0, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
123
|
+
M_PI_2, S2Point(1, 0, 0));
|
|
124
|
+
CheckDistance(S2Point(-1, -1, 0), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
125
|
+
0.75 * M_PI, S2Point(0, 0, 0));
|
|
126
|
+
|
|
127
|
+
CheckDistance(S2Point(0, 1, 0), S2Point(1, 0, 0), S2Point(1, 1, 0),
|
|
128
|
+
M_PI_4, S2Point(1, 1, 0));
|
|
129
|
+
CheckDistance(S2Point(0, -1, 0), S2Point(1, 0, 0), S2Point(1, 1, 0),
|
|
130
|
+
M_PI_2, S2Point(1, 0, 0));
|
|
131
|
+
|
|
132
|
+
CheckDistance(S2Point(0, -1, 0), S2Point(1, 0, 0), S2Point(-1, 1, 0),
|
|
133
|
+
M_PI_2, S2Point(1, 0, 0));
|
|
134
|
+
CheckDistance(S2Point(-1, -1, 0), S2Point(1, 0, 0), S2Point(-1, 1, 0),
|
|
135
|
+
M_PI_2, S2Point(-1, 1, 0));
|
|
136
|
+
|
|
137
|
+
CheckDistance(S2Point(1, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
138
|
+
asin(sqrt(1./3)), S2Point(1, 1, 0));
|
|
139
|
+
CheckDistance(S2Point(1, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
140
|
+
asin(sqrt(1./3)), S2Point(1, 1, 0));
|
|
141
|
+
|
|
142
|
+
CheckDistance(S2Point(-1, 0, 0), S2Point(1, 1, 0), S2Point(1, 1, 0),
|
|
143
|
+
0.75 * M_PI, S2Point(1, 1, 0));
|
|
144
|
+
CheckDistance(S2Point(0, 0, -1), S2Point(1, 1, 0), S2Point(1, 1, 0),
|
|
145
|
+
M_PI_2, S2Point(1, 1, 0));
|
|
146
|
+
CheckDistance(S2Point(-1, 0, 0), S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
147
|
+
M_PI, S2Point(1, 0, 0));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
TEST(S2, DistanceOptimizationIsConservative) {
|
|
151
|
+
// Verifies that AlwaysUpdateMinInteriorDistance() computes the lower bound
|
|
152
|
+
// on the true distance conservatively. (This test used to fail.)
|
|
153
|
+
S2Point x(-0.017952729194524016, -0.30232422079175203, 0.95303607751077712);
|
|
154
|
+
S2Point a(-0.017894725505830295, -0.30229974986194175, 0.95304493075220664);
|
|
155
|
+
S2Point b(-0.017986591360900289, -0.30233851195954353, 0.95303090543659963);
|
|
156
|
+
S1ChordAngle min_distance = S1ChordAngle::Infinity();
|
|
157
|
+
EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
|
|
158
|
+
min_distance = min_distance.Successor();
|
|
159
|
+
EXPECT_TRUE(S2::UpdateMinDistance(x, a, b, &min_distance));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
void CheckMaxDistance(S2Point x, S2Point a, S2Point b,
|
|
163
|
+
double distance_radians) {
|
|
164
|
+
x = x.Normalize();
|
|
165
|
+
a = a.Normalize();
|
|
166
|
+
b = b.Normalize();
|
|
167
|
+
|
|
168
|
+
S1ChordAngle max_distance = S1ChordAngle::Straight();
|
|
169
|
+
EXPECT_FALSE(S2::UpdateMaxDistance(x, a, b, &max_distance));
|
|
170
|
+
max_distance = S1ChordAngle::Negative();
|
|
171
|
+
EXPECT_TRUE(S2::UpdateMaxDistance(x, a, b, &max_distance));
|
|
172
|
+
|
|
173
|
+
EXPECT_NEAR(distance_radians, max_distance.radians(), 1e-15);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
TEST(S2, MaxDistance) {
|
|
177
|
+
CheckMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
178
|
+
M_PI_2);
|
|
179
|
+
CheckMaxDistance(S2Point(1, 0, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
180
|
+
M_PI_2);
|
|
181
|
+
CheckMaxDistance(S2Point(0, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
182
|
+
M_PI_2);
|
|
183
|
+
CheckMaxDistance(S2Point(0, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
184
|
+
M_PI_2);
|
|
185
|
+
|
|
186
|
+
CheckMaxDistance(S2Point(1, 1, 1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
187
|
+
asin(sqrt(2./3)));
|
|
188
|
+
CheckMaxDistance(S2Point(1, 1, -1), S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
189
|
+
asin(sqrt(2./3)));
|
|
190
|
+
|
|
191
|
+
CheckMaxDistance(S2Point(1, 0, 0), S2Point(1, 1, 0), S2Point(1, -1, 0),
|
|
192
|
+
M_PI_4);
|
|
193
|
+
CheckMaxDistance(S2Point(0, 1, 0), S2Point(1, 1, 0), S2Point(-1, 1, 0),
|
|
194
|
+
M_PI_4);
|
|
195
|
+
CheckMaxDistance(S2Point(0, 0, 1), S2Point(0, 1, 1), S2Point(0, -1, 1),
|
|
196
|
+
M_PI_4);
|
|
197
|
+
|
|
198
|
+
CheckMaxDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(1, 0, -1),
|
|
199
|
+
3 * M_PI_4);
|
|
200
|
+
CheckMaxDistance(S2Point(0, 0, 1), S2Point(1, 0, 0), S2Point(1, 1, -M_SQRT2),
|
|
201
|
+
3 * M_PI_4);
|
|
202
|
+
|
|
203
|
+
CheckMaxDistance(S2Point(0, 0, 1), S2Point(0, 0, -1), S2Point(0, 0, -1),
|
|
204
|
+
M_PI);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
void CheckInterpolate(double t, S2Point a, S2Point b, S2Point expected) {
|
|
208
|
+
a = a.Normalize();
|
|
209
|
+
b = b.Normalize();
|
|
210
|
+
expected = expected.Normalize();
|
|
211
|
+
S2Point actual = S2::Interpolate(t, a, b);
|
|
212
|
+
|
|
213
|
+
// We allow a bit more than the usual 1e-15 error tolerance because
|
|
214
|
+
// Interpolate() uses trig functions.
|
|
215
|
+
EXPECT_TRUE(S2::ApproxEquals(expected, actual, S1Angle::Radians(3e-15)))
|
|
216
|
+
<< "Expected: " << expected << ", actual: " << actual;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
TEST(S2, Interpolate) {
|
|
220
|
+
// Choose test points designed to expose floating-point errors.
|
|
221
|
+
S2Point p1 = S2Point(0.1, 1e-30, 0.3).Normalize();
|
|
222
|
+
S2Point p2 = S2Point(-0.7, -0.55, -1e30).Normalize();
|
|
223
|
+
|
|
224
|
+
// A zero-length edge.
|
|
225
|
+
CheckInterpolate(0, p1, p1, p1);
|
|
226
|
+
CheckInterpolate(1, p1, p1, p1);
|
|
227
|
+
|
|
228
|
+
// Start, end, and middle of a medium-length edge.
|
|
229
|
+
CheckInterpolate(0, p1, p2, p1);
|
|
230
|
+
CheckInterpolate(1, p1, p2, p2);
|
|
231
|
+
CheckInterpolate(0.5, p1, p2, 0.5 * (p1 + p2));
|
|
232
|
+
|
|
233
|
+
// Test that interpolation is done using distances on the sphere rather than
|
|
234
|
+
// linear distances.
|
|
235
|
+
CheckInterpolate(1./3, S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
236
|
+
S2Point(sqrt(3), 1, 0));
|
|
237
|
+
CheckInterpolate(2./3, S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
238
|
+
S2Point(1, sqrt(3), 0));
|
|
239
|
+
|
|
240
|
+
// Test that interpolation is accurate on a long edge (but not so long that
|
|
241
|
+
// the definition of the edge itself becomes too unstable).
|
|
242
|
+
{
|
|
243
|
+
const double kLng = M_PI - 1e-2;
|
|
244
|
+
S2Point a = S2LatLng::FromRadians(0, 0).ToPoint();
|
|
245
|
+
S2Point b = S2LatLng::FromRadians(0, kLng).ToPoint();
|
|
246
|
+
for (double f = 0.4; f > 1e-15; f *= 0.1) {
|
|
247
|
+
CheckInterpolate(f, a, b,
|
|
248
|
+
S2LatLng::FromRadians(0, f * kLng).ToPoint());
|
|
249
|
+
CheckInterpolate(1 - f, a, b,
|
|
250
|
+
S2LatLng::FromRadians(0, (1 - f) * kLng).ToPoint());
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Test that interpolation on a 180 degree edge (antipodal endpoints) yields
|
|
255
|
+
// a result with the correct distance from each endpoint.
|
|
256
|
+
for (double t = 0; t <= 1; t += 0.125) {
|
|
257
|
+
S2Point actual = S2::Interpolate(t, p1, -p1);
|
|
258
|
+
EXPECT_NEAR(S1Angle(actual, p1).radians(), t * M_PI, 3e-15);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
TEST(S2, InterpolateCanExtrapolate) {
|
|
263
|
+
const S2Point i(1, 0, 0);
|
|
264
|
+
const S2Point j(0, 1, 0);
|
|
265
|
+
// Initial vectors at 90 degrees.
|
|
266
|
+
CheckInterpolate(0, i, j, S2Point(1, 0, 0));
|
|
267
|
+
CheckInterpolate(1, i, j, S2Point(0, 1, 0));
|
|
268
|
+
CheckInterpolate(1.5, i, j, S2Point(-1, 1, 0));
|
|
269
|
+
CheckInterpolate(2, i, j, S2Point(-1, 0, 0));
|
|
270
|
+
CheckInterpolate(3, i, j, S2Point(0, -1, 0));
|
|
271
|
+
CheckInterpolate(4, i, j, S2Point(1, 0, 0));
|
|
272
|
+
|
|
273
|
+
// Negative values of t.
|
|
274
|
+
CheckInterpolate(-1, i, j, S2Point(0, -1, 0));
|
|
275
|
+
CheckInterpolate(-2, i, j, S2Point(-1, 0, 0));
|
|
276
|
+
CheckInterpolate(-3, i, j, S2Point(0, 1, 0));
|
|
277
|
+
CheckInterpolate(-4, i, j, S2Point(1, 0, 0));
|
|
278
|
+
|
|
279
|
+
// Initial vectors at 45 degrees.
|
|
280
|
+
CheckInterpolate(2, i, S2Point(1, 1, 0), S2Point(0, 1, 0));
|
|
281
|
+
CheckInterpolate(3, i, S2Point(1, 1, 0), S2Point(-1, 1, 0));
|
|
282
|
+
CheckInterpolate(4, i, S2Point(1, 1, 0), S2Point(-1, 0, 0));
|
|
283
|
+
|
|
284
|
+
// Initial vectors at 135 degrees.
|
|
285
|
+
CheckInterpolate(2, i, S2Point(-1, 1, 0), S2Point(0, -1, 0));
|
|
286
|
+
|
|
287
|
+
// Take a small fraction along the curve.
|
|
288
|
+
S2Point p(S2::Interpolate(0.001, i, j));
|
|
289
|
+
// We should get back where we started.
|
|
290
|
+
CheckInterpolate(1000, i, p, j);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
TEST(S2, RepeatedInterpolation) {
|
|
295
|
+
// Check that points do not drift away from unit length when repeated
|
|
296
|
+
// interpolations are done.
|
|
297
|
+
for (int i = 0; i < 100; ++i) {
|
|
298
|
+
S2Point a = S2Testing::RandomPoint();
|
|
299
|
+
S2Point b = S2Testing::RandomPoint();
|
|
300
|
+
for (int j = 0; j < 1000; ++j) {
|
|
301
|
+
a = S2::Interpolate(0.01, a, b);
|
|
302
|
+
}
|
|
303
|
+
EXPECT_TRUE(S2::IsUnitLength(a));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Given two edges a0a1 and b0b1, check that the minimum distance between them
|
|
308
|
+
// is "distance_radians", and that GetEdgePairClosestPoints() returns
|
|
309
|
+
// "expected_a" and "expected_b" as the points that achieve this distance.
|
|
310
|
+
// S2Point(0, 0, 0) may be passed for "expected_a" or "expected_b" to indicate
|
|
311
|
+
// that both endpoints of the corresponding edge are equally distant, and
|
|
312
|
+
// therefore either one might be returned.
|
|
313
|
+
//
|
|
314
|
+
// Parameters are passed by value so that this function can normalize them.
|
|
315
|
+
void CheckEdgePairMinDistance(S2Point a0, S2Point a1, S2Point b0, S2Point b1,
|
|
316
|
+
double distance_radians,
|
|
317
|
+
S2Point expected_a, S2Point expected_b) {
|
|
318
|
+
a0 = a0.Normalize();
|
|
319
|
+
a1 = a1.Normalize();
|
|
320
|
+
b0 = b0.Normalize();
|
|
321
|
+
b1 = b1.Normalize();
|
|
322
|
+
expected_a = expected_a.Normalize();
|
|
323
|
+
expected_b = expected_b.Normalize();
|
|
324
|
+
const auto& closest = S2::GetEdgePairClosestPoints(a0, a1, b0, b1);
|
|
325
|
+
const S2Point& actual_a = closest.first;
|
|
326
|
+
const S2Point& actual_b = closest.second;
|
|
327
|
+
if (expected_a == S2Point(0, 0, 0)) {
|
|
328
|
+
// This special value says that the result should be a0 or a1.
|
|
329
|
+
EXPECT_TRUE(actual_a == a0 || actual_a == a1);
|
|
330
|
+
} else {
|
|
331
|
+
EXPECT_TRUE(S2::ApproxEquals(expected_a, actual_a));
|
|
332
|
+
}
|
|
333
|
+
if (expected_b == S2Point(0, 0, 0)) {
|
|
334
|
+
// This special value says that the result should be b0 or b1.
|
|
335
|
+
EXPECT_TRUE(actual_b == b0 || actual_b == b1);
|
|
336
|
+
} else {
|
|
337
|
+
EXPECT_TRUE(S2::ApproxEquals(expected_b, actual_b));
|
|
338
|
+
}
|
|
339
|
+
S1ChordAngle min_distance = S1ChordAngle::Zero();
|
|
340
|
+
EXPECT_FALSE(S2::UpdateEdgePairMinDistance(a0, a1, b0, b1, &min_distance));
|
|
341
|
+
min_distance = S1ChordAngle::Infinity();
|
|
342
|
+
EXPECT_TRUE(S2::UpdateEdgePairMinDistance(a0, a1, b0, b1, &min_distance));
|
|
343
|
+
EXPECT_NEAR(distance_radians, min_distance.radians(), 1e-15);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
TEST(S2, EdgePairMinDistance) {
|
|
347
|
+
// One edge is degenerate.
|
|
348
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 1), S2Point(1, 0, 1),
|
|
349
|
+
S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
350
|
+
M_PI_4, S2Point(1, 0, 1), S2Point(1, 0, 0));
|
|
351
|
+
CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
352
|
+
S2Point(1, 0, 1), S2Point(1, 0, 1),
|
|
353
|
+
M_PI_4, S2Point(1, 0, 0), S2Point(1, 0, 1));
|
|
354
|
+
|
|
355
|
+
// Both edges are degenerate.
|
|
356
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
357
|
+
S2Point(0, 1, 0), S2Point(0, 1, 0),
|
|
358
|
+
M_PI_2, S2Point(1, 0, 0), S2Point(0, 1, 0));
|
|
359
|
+
|
|
360
|
+
// Both edges are degenerate and antipodal.
|
|
361
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
362
|
+
S2Point(-1, 0, 0), S2Point(-1, 0, 0),
|
|
363
|
+
M_PI, S2Point(1, 0, 0), S2Point(-1, 0, 0));
|
|
364
|
+
|
|
365
|
+
// Two identical edges.
|
|
366
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
367
|
+
S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
368
|
+
0, S2Point(0, 0, 0), S2Point(0, 0, 0));
|
|
369
|
+
|
|
370
|
+
// Both edges are degenerate and identical.
|
|
371
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
372
|
+
S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
373
|
+
0, S2Point(1, 0, 0), S2Point(1, 0, 0));
|
|
374
|
+
|
|
375
|
+
// Edges that share exactly one vertex (all 4 possibilities).
|
|
376
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
377
|
+
S2Point(0, 1, 0), S2Point(0, 1, 1),
|
|
378
|
+
0, S2Point(0, 1, 0), S2Point(0, 1, 0));
|
|
379
|
+
CheckEdgePairMinDistance(S2Point(0, 1, 0), S2Point(1, 0, 0),
|
|
380
|
+
S2Point(0, 1, 0), S2Point(0, 1, 1),
|
|
381
|
+
0, S2Point(0, 1, 0), S2Point(0, 1, 0));
|
|
382
|
+
CheckEdgePairMinDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
383
|
+
S2Point(0, 1, 1), S2Point(0, 1, 0),
|
|
384
|
+
0, S2Point(0, 1, 0), S2Point(0, 1, 0));
|
|
385
|
+
CheckEdgePairMinDistance(S2Point(0, 1, 0), S2Point(1, 0, 0),
|
|
386
|
+
S2Point(0, 1, 1), S2Point(0, 1, 0),
|
|
387
|
+
0, S2Point(0, 1, 0), S2Point(0, 1, 0));
|
|
388
|
+
|
|
389
|
+
// Two edges whose interiors cross.
|
|
390
|
+
CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
391
|
+
S2Point(1, 0, -1), S2Point(1, 0, 1),
|
|
392
|
+
0, S2Point(1, 0, 0), S2Point(1, 0, 0));
|
|
393
|
+
|
|
394
|
+
// The closest distance occurs between two edge endpoints, but more than one
|
|
395
|
+
// endpoint pair is equally distant.
|
|
396
|
+
CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
397
|
+
S2Point(-1, 0, 0), S2Point(-1, 0, 1),
|
|
398
|
+
acos(-0.5), S2Point(0, 0, 0), S2Point(-1, 0, 1));
|
|
399
|
+
CheckEdgePairMinDistance(S2Point(-1, 0, 0), S2Point(-1, 0, 1),
|
|
400
|
+
S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
401
|
+
acos(-0.5), S2Point(-1, 0, 1), S2Point(0, 0, 0));
|
|
402
|
+
CheckEdgePairMinDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
403
|
+
S2Point(-1, 0, -1), S2Point(-1, 0, 1),
|
|
404
|
+
acos(-0.5), S2Point(0, 0, 0), S2Point(0, 0, 0));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Given two edges a0a1 and b0b1, check that the maximum distance between them
|
|
408
|
+
// is "distance_radians". Parameters are passed by value so that this
|
|
409
|
+
// function can normalize them.
|
|
410
|
+
void CheckEdgePairMaxDistance(S2Point a0, S2Point a1, S2Point b0, S2Point b1,
|
|
411
|
+
double distance_radians) {
|
|
412
|
+
a0 = a0.Normalize();
|
|
413
|
+
a1 = a1.Normalize();
|
|
414
|
+
b0 = b0.Normalize();
|
|
415
|
+
b1 = b1.Normalize();
|
|
416
|
+
|
|
417
|
+
S1ChordAngle max_distance = S1ChordAngle::Straight();
|
|
418
|
+
EXPECT_FALSE(S2::UpdateEdgePairMaxDistance(a0, a1, b0, b1, &max_distance));
|
|
419
|
+
max_distance = S1ChordAngle::Negative();
|
|
420
|
+
EXPECT_TRUE(S2::UpdateEdgePairMaxDistance(a0, a1, b0, b1, &max_distance));
|
|
421
|
+
EXPECT_NEAR(distance_radians, max_distance.radians(), 1e-15);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
TEST(S2, EdgePairMaxDistance) {
|
|
425
|
+
// Standard situation. Same hemisphere, not degenerate.
|
|
426
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
427
|
+
S2Point(1, 1, 0), S2Point(1, 1, 1),
|
|
428
|
+
acos(1/sqrt(3)));
|
|
429
|
+
|
|
430
|
+
// One edge is degenerate.
|
|
431
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 1),
|
|
432
|
+
S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
433
|
+
acos(0.5));
|
|
434
|
+
CheckEdgePairMaxDistance(S2Point(1, -1, 0), S2Point(1, 1, 0),
|
|
435
|
+
S2Point(1, 0, 1), S2Point(1, 0, 1),
|
|
436
|
+
acos(0.5));
|
|
437
|
+
|
|
438
|
+
// Both edges are degenerate.
|
|
439
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
440
|
+
S2Point(0, 1, 0), S2Point(0, 1, 0),
|
|
441
|
+
M_PI_2);
|
|
442
|
+
|
|
443
|
+
// Both edges are degenerate and antipodal.
|
|
444
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
445
|
+
S2Point(-1, 0, 0), S2Point(-1, 0, 0),
|
|
446
|
+
M_PI);
|
|
447
|
+
|
|
448
|
+
// Two identical edges.
|
|
449
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
450
|
+
S2Point(1, 0, 0), S2Point(0, 1, 0),
|
|
451
|
+
M_PI_2);
|
|
452
|
+
|
|
453
|
+
// Both edges are degenerate and identical.
|
|
454
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
455
|
+
S2Point(1, 0, 0), S2Point(1, 0, 0),
|
|
456
|
+
0);
|
|
457
|
+
|
|
458
|
+
// Antipodal reflection of one edge crosses the other edge.
|
|
459
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, -1),
|
|
460
|
+
S2Point(-1, -1, 0), S2Point(-1, 1, 0),
|
|
461
|
+
M_PI);
|
|
462
|
+
|
|
463
|
+
// One vertex of one edge touches the interior of the antipodal reflection
|
|
464
|
+
// of the other edge.
|
|
465
|
+
CheckEdgePairMaxDistance(S2Point(1, 0, 1), S2Point(1, 0, 0),
|
|
466
|
+
S2Point(-1, -1, 0), S2Point(-1, 1, 0),
|
|
467
|
+
M_PI);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
bool IsEdgeBNearEdgeA(const string& a_str, const string& b_str,
|
|
471
|
+
double max_error_degrees) {
|
|
472
|
+
unique_ptr<S2Polyline> a(s2textformat::MakePolyline(a_str));
|
|
473
|
+
EXPECT_EQ(2, a->num_vertices());
|
|
474
|
+
unique_ptr<S2Polyline> b(s2textformat::MakePolyline(b_str));
|
|
475
|
+
EXPECT_EQ(2, b->num_vertices());
|
|
476
|
+
return S2::IsEdgeBNearEdgeA(a->vertex(0), a->vertex(1),
|
|
477
|
+
b->vertex(0), b->vertex(1),
|
|
478
|
+
S1Angle::Degrees(max_error_degrees));
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
TEST(S2, EdgeBNearEdgeA) {
|
|
482
|
+
// Edge is near itself.
|
|
483
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("5:5, 10:-5", "5:5, 10:-5", 1e-6));
|
|
484
|
+
|
|
485
|
+
// Edge is near its reverse
|
|
486
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("5:5, 10:-5", "10:-5, 5:5", 1e-6));
|
|
487
|
+
|
|
488
|
+
// Short edge is near long edge.
|
|
489
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "2:1, -2:1", 1.0));
|
|
490
|
+
|
|
491
|
+
// Long edges cannot be near shorter edges.
|
|
492
|
+
EXPECT_FALSE(IsEdgeBNearEdgeA("2:1, -2:1", "10:0, -10:0", 1.0));
|
|
493
|
+
|
|
494
|
+
// Orthogonal crossing edges are not near each other...
|
|
495
|
+
EXPECT_FALSE(IsEdgeBNearEdgeA("10:0, -10:0", "0:1.5, 0:-1.5", 1.0));
|
|
496
|
+
|
|
497
|
+
// ... unless all points on B are within tolerance of A.
|
|
498
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "0:1.5, 0:-1.5", 2.0));
|
|
499
|
+
|
|
500
|
+
// Very long edges whose endpoints are close may have interior points that are
|
|
501
|
+
// far apart. An implementation that only considers the vertices of polylines
|
|
502
|
+
// will incorrectly consider such edges as "close" when they are not.
|
|
503
|
+
// Consider, for example, two consecutive lines of longitude. As they
|
|
504
|
+
// approach the poles, they become arbitrarily close together, but along the
|
|
505
|
+
// equator they bow apart.
|
|
506
|
+
EXPECT_FALSE(IsEdgeBNearEdgeA("89:1, -89:1", "89:2, -89:2", 0.5));
|
|
507
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("89:1, -89:1", "89:2, -89:2", 1.5));
|
|
508
|
+
|
|
509
|
+
// The two arcs here are nearly as long as S2 edges can be (just shy of 180
|
|
510
|
+
// degrees), and their endpoints are less than 1 degree apart. Their
|
|
511
|
+
// midpoints, however, are at opposite ends of the sphere along its equator.
|
|
512
|
+
EXPECT_FALSE(IsEdgeBNearEdgeA(
|
|
513
|
+
"0:-179.75, 0:-0.25", "0:179.75, 0:0.25", 1.0));
|
|
514
|
+
|
|
515
|
+
// At the equator, the second arc here is 9.75 degrees from the first, and
|
|
516
|
+
// closer at all other points. However, the southern point of the second arc
|
|
517
|
+
// (-1, 9.75) is too far from the first arc for the short-circuiting logic in
|
|
518
|
+
// IsEdgeBNearEdgeA to apply.
|
|
519
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("40:0, -5:0", "39:0.975, -1:0.975", 1.0));
|
|
520
|
+
|
|
521
|
+
// Same as above, but B's orientation is reversed, causing the angle between
|
|
522
|
+
// the normal vectors of circ(B) and circ(A) to be (180-9.75) = 170.5 degrees,
|
|
523
|
+
// not 9.75 degrees. The greatest separation between the planes is still 9.75
|
|
524
|
+
// degrees.
|
|
525
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("10:0, -10:0", "-.4:0.975, 0.4:0.975", 1.0));
|
|
526
|
+
|
|
527
|
+
// A and B are on the same great circle, A and B partially overlap, but the
|
|
528
|
+
// only part of B that does not overlap A is shorter than tolerance.
|
|
529
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "0.9:0, 1.1:0", 0.25));
|
|
530
|
+
|
|
531
|
+
// A and B are on the same great circle, all points on B are close to A at its
|
|
532
|
+
// second endpoint, (1,0).
|
|
533
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "1.1:0, 1.2:0", 0.25));
|
|
534
|
+
|
|
535
|
+
// Same as above, but B's orientation is reversed. This case is special
|
|
536
|
+
// because the projection of the normal defining A onto the plane containing B
|
|
537
|
+
// is the null vector, and must be handled by a special case.
|
|
538
|
+
EXPECT_TRUE(IsEdgeBNearEdgeA("0:0, 1:0", "1.2:0, 1.1:0", 0.25));
|
|
539
|
+
}
|