@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,343 @@
|
|
|
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_S2EDGE_CROSSER_H_
|
|
19
|
+
#define S2_S2EDGE_CROSSER_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/base/logging.h"
|
|
22
|
+
#include "s2/_fp_contract_off.h"
|
|
23
|
+
#include "s2/s2edge_crossings.h"
|
|
24
|
+
#include "s2/s2pointutil.h"
|
|
25
|
+
#include "s2/s2predicates.h"
|
|
26
|
+
|
|
27
|
+
class S2CopyingEdgeCrosser; // Forward declaration
|
|
28
|
+
|
|
29
|
+
// This class allows edges to be efficiently tested for intersection with a
|
|
30
|
+
// given fixed edge AB. It is especially efficient when testing for
|
|
31
|
+
// intersection with an edge chain connecting vertices v0, v1, v2, ...
|
|
32
|
+
//
|
|
33
|
+
// Example usage:
|
|
34
|
+
//
|
|
35
|
+
// void CountIntersections(const S2Point& a, const S2Point& b,
|
|
36
|
+
// const vector<pair<S2Point, S2Point>>& edges) {
|
|
37
|
+
// int count = 0;
|
|
38
|
+
// S2EdgeCrosser crosser(&a, &b);
|
|
39
|
+
// for (const auto& edge : edges) {
|
|
40
|
+
// if (crosser.CrossingSign(&edge.first, &edge.second) >= 0) {
|
|
41
|
+
// ++count;
|
|
42
|
+
// }
|
|
43
|
+
// }
|
|
44
|
+
// return count;
|
|
45
|
+
// }
|
|
46
|
+
//
|
|
47
|
+
// This class expects that the client already has all the necessary vertices
|
|
48
|
+
// stored in memory, so that this class can refer to them with pointers and
|
|
49
|
+
// does not need to make its own copies. If this is not the case (e.g., you
|
|
50
|
+
// want to pass temporary objects as vertices), see S2CopyingEdgeCrosser.
|
|
51
|
+
class S2EdgeCrosser {
|
|
52
|
+
public:
|
|
53
|
+
// Default constructor; must be followed by a call to Init().
|
|
54
|
+
S2EdgeCrosser() {}
|
|
55
|
+
|
|
56
|
+
// Convenience constructor that calls Init() with the given fixed edge AB.
|
|
57
|
+
// The arguments "a" and "b" must point to values that persist for the
|
|
58
|
+
// lifetime of the S2EdgeCrosser object (or until the next Init() call).
|
|
59
|
+
S2EdgeCrosser(const S2Point* a, const S2Point* b);
|
|
60
|
+
|
|
61
|
+
// Accessors for the constructor arguments.
|
|
62
|
+
const S2Point* a() { return a_; }
|
|
63
|
+
const S2Point* b() { return b_; }
|
|
64
|
+
|
|
65
|
+
// Initialize the S2EdgeCrosser with the given fixed edge AB. The arguments
|
|
66
|
+
// "a" and "b" must point to values that persist for the lifetime of the
|
|
67
|
+
// S2EdgeCrosser object (or until the next Init() call).
|
|
68
|
+
void Init(const S2Point* a, const S2Point* b);
|
|
69
|
+
|
|
70
|
+
// This function determines whether the edge AB intersects the edge CD.
|
|
71
|
+
// Returns +1 if AB crosses CD at a point that is interior to both edges.
|
|
72
|
+
// Returns 0 if any two vertices from different edges are the same.
|
|
73
|
+
// Returns -1 otherwise.
|
|
74
|
+
//
|
|
75
|
+
// Note that if an edge is degenerate (A == B or C == D), the return value
|
|
76
|
+
// is 0 if two vertices from different edges are the same and -1 otherwise.
|
|
77
|
+
//
|
|
78
|
+
// Properties of CrossingSign:
|
|
79
|
+
//
|
|
80
|
+
// (1) CrossingSign(b,a,c,d) == CrossingSign(a,b,c,d)
|
|
81
|
+
// (2) CrossingSign(c,d,a,b) == CrossingSign(a,b,c,d)
|
|
82
|
+
// (3) CrossingSign(a,b,c,d) == 0 if a==c, a==d, b==c, b==d
|
|
83
|
+
// (3) CrossingSign(a,b,c,d) <= 0 if a==b or c==d (see above)
|
|
84
|
+
//
|
|
85
|
+
// This function implements an exact, consistent perturbation model such
|
|
86
|
+
// that no three points are ever considered to be collinear. This means
|
|
87
|
+
// that even if you have 4 points A, B, C, D that lie exactly in a line
|
|
88
|
+
// (say, around the equator), C and D will be treated as being slightly to
|
|
89
|
+
// one side or the other of AB. This is done in a way such that the
|
|
90
|
+
// results are always consistent (see s2pred::Sign).
|
|
91
|
+
//
|
|
92
|
+
// Note that if you want to check an edge against a chain of other edges,
|
|
93
|
+
// it is slightly more efficient to use the single-argument version of
|
|
94
|
+
// CrossingSign below.
|
|
95
|
+
//
|
|
96
|
+
// The arguments must point to values that persist until the next call.
|
|
97
|
+
int CrossingSign(const S2Point* c, const S2Point* d);
|
|
98
|
+
|
|
99
|
+
// This method extends the concept of a "crossing" to the case where AB
|
|
100
|
+
// and CD have a vertex in common. The two edges may or may not cross,
|
|
101
|
+
// according to the rules defined in VertexCrossing() below. The rules
|
|
102
|
+
// are designed so that point containment tests can be implemented simply
|
|
103
|
+
// by counting edge crossings. Similarly, determining whether one edge
|
|
104
|
+
// chain crosses another edge chain can be implemented by counting.
|
|
105
|
+
//
|
|
106
|
+
// Returns true if CrossingSign(c, d) > 0, or AB and CD share a vertex
|
|
107
|
+
// and VertexCrossing(a, b, c, d) returns true.
|
|
108
|
+
//
|
|
109
|
+
// The arguments must point to values that persist until the next call.
|
|
110
|
+
bool EdgeOrVertexCrossing(const S2Point* c, const S2Point* d);
|
|
111
|
+
|
|
112
|
+
///////////////////////// Edge Chain Methods ///////////////////////////
|
|
113
|
+
//
|
|
114
|
+
// You don't need to use these unless you're trying to squeeze out every
|
|
115
|
+
// last drop of performance. Essentially all you are saving is a test
|
|
116
|
+
// whether the first vertex of the current edge is the same as the second
|
|
117
|
+
// vertex of the previous edge. Example usage:
|
|
118
|
+
//
|
|
119
|
+
// vector<S2Point> chain;
|
|
120
|
+
// crosser.RestartAt(&chain[0]);
|
|
121
|
+
// for (int i = 1; i < chain.size(); ++i) {
|
|
122
|
+
// if (crosser.EdgeOrVertexCrossing(&chain[i])) { ++count; }
|
|
123
|
+
// }
|
|
124
|
+
|
|
125
|
+
// Convenience constructor that uses AB as the fixed edge, and C as the
|
|
126
|
+
// first vertex of the vertex chain (equivalent to calling RestartAt(c)).
|
|
127
|
+
//
|
|
128
|
+
// The arguments must point to values that persist until the next call.
|
|
129
|
+
S2EdgeCrosser(const S2Point* a, const S2Point* b, const S2Point* c);
|
|
130
|
+
|
|
131
|
+
// Call this method when your chain 'jumps' to a new place.
|
|
132
|
+
// The argument must point to a value that persists until the next call.
|
|
133
|
+
void RestartAt(const S2Point* c);
|
|
134
|
+
|
|
135
|
+
// Like CrossingSign above, but uses the last vertex passed to one of
|
|
136
|
+
// the crossing methods (or RestartAt) as the first vertex of the current
|
|
137
|
+
// edge.
|
|
138
|
+
//
|
|
139
|
+
// The argument must point to a value that persists until the next call.
|
|
140
|
+
int CrossingSign(const S2Point* d);
|
|
141
|
+
|
|
142
|
+
// Like EdgeOrVertexCrossing above, but uses the last vertex passed to one
|
|
143
|
+
// of the crossing methods (or RestartAt) as the first vertex of the
|
|
144
|
+
// current edge.
|
|
145
|
+
//
|
|
146
|
+
// The argument must point to a value that persists until the next call.
|
|
147
|
+
bool EdgeOrVertexCrossing(const S2Point* d);
|
|
148
|
+
|
|
149
|
+
// Returns the last vertex of the current edge chain being tested, i.e. the
|
|
150
|
+
// C vertex that will be used to construct the edge CD when one of the
|
|
151
|
+
// methods above is called.
|
|
152
|
+
const S2Point* c() { return c_; }
|
|
153
|
+
|
|
154
|
+
private:
|
|
155
|
+
friend class S2CopyingEdgeCrosser;
|
|
156
|
+
|
|
157
|
+
// These functions handle the "slow path" of CrossingSign().
|
|
158
|
+
int CrossingSignInternal(const S2Point* d);
|
|
159
|
+
int CrossingSignInternal2(const S2Point& d);
|
|
160
|
+
|
|
161
|
+
// Used internally by S2CopyingEdgeCrosser. Updates "c_" only.
|
|
162
|
+
void set_c(const S2Point* c) { c_ = c; }
|
|
163
|
+
|
|
164
|
+
// The fields below are constant after the call to Init().
|
|
165
|
+
const S2Point* a_;
|
|
166
|
+
const S2Point* b_;
|
|
167
|
+
Vector3_d a_cross_b_;
|
|
168
|
+
|
|
169
|
+
// To reduce the number of calls to s2pred::ExpensiveSign(), we compute an
|
|
170
|
+
// outward-facing tangent at A and B if necessary. If the plane
|
|
171
|
+
// perpendicular to one of these tangents separates AB from CD (i.e., one
|
|
172
|
+
// edge on each side) then there is no intersection.
|
|
173
|
+
bool have_tangents_; // True if the tangents have been computed.
|
|
174
|
+
S2Point a_tangent_; // Outward-facing tangent at A.
|
|
175
|
+
S2Point b_tangent_; // Outward-facing tangent at B.
|
|
176
|
+
|
|
177
|
+
// The fields below are updated for each vertex in the chain.
|
|
178
|
+
const S2Point* c_; // Previous vertex in the vertex chain.
|
|
179
|
+
int acb_; // The orientation of triangle ACB.
|
|
180
|
+
|
|
181
|
+
// The field below is a temporary used by CrossingSignInternal().
|
|
182
|
+
int bda_; // The orientation of triangle BDA.
|
|
183
|
+
|
|
184
|
+
S2EdgeCrosser(const S2EdgeCrosser&) = delete;
|
|
185
|
+
void operator=(const S2EdgeCrosser&) = delete;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// S2CopyingEdgeCrosser is exactly like S2EdgeCrosser, except that it makes its
|
|
189
|
+
// own copy of all arguments so that they do not need to persist between
|
|
190
|
+
// calls. This is less efficient, but makes it possible to use points that
|
|
191
|
+
// are generated on demand and cannot conveniently be stored by the client.
|
|
192
|
+
class S2CopyingEdgeCrosser {
|
|
193
|
+
public:
|
|
194
|
+
// These methods are all exactly like S2EdgeCrosser, except that the
|
|
195
|
+
// arguments can be temporaries.
|
|
196
|
+
S2CopyingEdgeCrosser() {}
|
|
197
|
+
S2CopyingEdgeCrosser(const S2Point& a, const S2Point& b);
|
|
198
|
+
const S2Point& a() { return a_; }
|
|
199
|
+
const S2Point& b() { return b_; }
|
|
200
|
+
const S2Point& c() { return c_; }
|
|
201
|
+
void Init(const S2Point& a, const S2Point& b);
|
|
202
|
+
int CrossingSign(const S2Point& c, const S2Point& d);
|
|
203
|
+
bool EdgeOrVertexCrossing(const S2Point& c, const S2Point& d);
|
|
204
|
+
S2CopyingEdgeCrosser(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
205
|
+
void RestartAt(const S2Point& c);
|
|
206
|
+
int CrossingSign(const S2Point& d);
|
|
207
|
+
bool EdgeOrVertexCrossing(const S2Point& d);
|
|
208
|
+
|
|
209
|
+
private:
|
|
210
|
+
S2Point a_, b_, c_;
|
|
211
|
+
// TODO(ericv): It would be more efficient to implement S2CopyingEdgeCrosser
|
|
212
|
+
// directly rather than as a wrapper around S2EdgeCrosser.
|
|
213
|
+
S2EdgeCrosser crosser_;
|
|
214
|
+
|
|
215
|
+
S2CopyingEdgeCrosser(const S2CopyingEdgeCrosser&) = delete;
|
|
216
|
+
void operator=(const S2CopyingEdgeCrosser&) = delete;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
////////////////// Implementation details follow ////////////////////
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
inline S2EdgeCrosser::S2EdgeCrosser(const S2Point* a, const S2Point* b)
|
|
224
|
+
: a_(a), b_(b), a_cross_b_(a_->CrossProd(*b_)), have_tangents_(false),
|
|
225
|
+
c_(nullptr) {
|
|
226
|
+
S2_DCHECK(S2::IsUnitLength(*a));
|
|
227
|
+
S2_DCHECK(S2::IsUnitLength(*b));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
inline void S2EdgeCrosser::Init(const S2Point* a, const S2Point* b) {
|
|
231
|
+
a_ = a;
|
|
232
|
+
b_ = b;
|
|
233
|
+
a_cross_b_ = a->CrossProd(*b_);
|
|
234
|
+
have_tangents_ = false;
|
|
235
|
+
c_ = nullptr;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
inline int S2EdgeCrosser::CrossingSign(const S2Point* c, const S2Point* d) {
|
|
239
|
+
if (c != c_) RestartAt(c);
|
|
240
|
+
return CrossingSign(d);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
inline bool S2EdgeCrosser::EdgeOrVertexCrossing(const S2Point* c,
|
|
244
|
+
const S2Point* d) {
|
|
245
|
+
if (c != c_) RestartAt(c);
|
|
246
|
+
return EdgeOrVertexCrossing(d);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
inline S2EdgeCrosser::S2EdgeCrosser(
|
|
250
|
+
const S2Point* a, const S2Point* b, const S2Point* c)
|
|
251
|
+
: a_(a), b_(b), a_cross_b_(a_->CrossProd(*b_)), have_tangents_(false) {
|
|
252
|
+
S2_DCHECK(S2::IsUnitLength(*a));
|
|
253
|
+
S2_DCHECK(S2::IsUnitLength(*b));
|
|
254
|
+
RestartAt(c);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
inline void S2EdgeCrosser::RestartAt(const S2Point* c) {
|
|
258
|
+
S2_DCHECK(S2::IsUnitLength(*c));
|
|
259
|
+
c_ = c;
|
|
260
|
+
acb_ = -s2pred::TriageSign(*a_, *b_, *c_, a_cross_b_);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
inline int S2EdgeCrosser::CrossingSign(const S2Point* d) {
|
|
264
|
+
S2_DCHECK(S2::IsUnitLength(*d));
|
|
265
|
+
// For there to be an edge crossing, the triangles ACB, CBD, BDA, DAC must
|
|
266
|
+
// all be oriented the same way (CW or CCW). We keep the orientation of ACB
|
|
267
|
+
// as part of our state. When each new point D arrives, we compute the
|
|
268
|
+
// orientation of BDA and check whether it matches ACB. This checks whether
|
|
269
|
+
// the points C and D are on opposite sides of the great circle through AB.
|
|
270
|
+
|
|
271
|
+
// Recall that TriageSign is invariant with respect to rotating its
|
|
272
|
+
// arguments, i.e. ABD has the same orientation as BDA.
|
|
273
|
+
int bda = s2pred::TriageSign(*a_, *b_, *d, a_cross_b_);
|
|
274
|
+
if (acb_ == -bda && bda != 0) {
|
|
275
|
+
// The most common case -- triangles have opposite orientations. Save the
|
|
276
|
+
// current vertex D as the next vertex C, and also save the orientation of
|
|
277
|
+
// the new triangle ACB (which is opposite to the current triangle BDA).
|
|
278
|
+
c_ = d;
|
|
279
|
+
acb_ = -bda;
|
|
280
|
+
return -1;
|
|
281
|
+
}
|
|
282
|
+
bda_ = bda;
|
|
283
|
+
return CrossingSignInternal(d);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
inline bool S2EdgeCrosser::EdgeOrVertexCrossing(const S2Point* d) {
|
|
287
|
+
// We need to copy c_ since it is clobbered by CrossingSign().
|
|
288
|
+
const S2Point* c = c_;
|
|
289
|
+
int crossing = CrossingSign(d);
|
|
290
|
+
if (crossing < 0) return false;
|
|
291
|
+
if (crossing > 0) return true;
|
|
292
|
+
return S2::VertexCrossing(*a_, *b_, *c, *d);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
inline S2CopyingEdgeCrosser::S2CopyingEdgeCrosser(const S2Point& a,
|
|
296
|
+
const S2Point& b)
|
|
297
|
+
: a_(a), b_(b), c_(S2Point()), crosser_(&a_, &b_) {
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
inline void S2CopyingEdgeCrosser::Init(const S2Point& a, const S2Point& b) {
|
|
301
|
+
a_ = a;
|
|
302
|
+
b_ = b;
|
|
303
|
+
c_ = S2Point();
|
|
304
|
+
crosser_.Init(&a_, &b_);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
inline int S2CopyingEdgeCrosser::CrossingSign(const S2Point& c,
|
|
308
|
+
const S2Point& d) {
|
|
309
|
+
if (c != c_ || crosser_.c_ == nullptr) RestartAt(c);
|
|
310
|
+
return CrossingSign(d);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
inline bool S2CopyingEdgeCrosser::EdgeOrVertexCrossing(
|
|
314
|
+
const S2Point& c, const S2Point& d) {
|
|
315
|
+
if (c != c_ || crosser_.c_ == nullptr) RestartAt(c);
|
|
316
|
+
return EdgeOrVertexCrossing(d);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
inline S2CopyingEdgeCrosser::S2CopyingEdgeCrosser(
|
|
320
|
+
const S2Point& a, const S2Point& b, const S2Point& c)
|
|
321
|
+
: a_(a), b_(b), c_(c), crosser_(&a_, &b_, &c) {
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
inline void S2CopyingEdgeCrosser::RestartAt(const S2Point& c) {
|
|
325
|
+
c_ = c;
|
|
326
|
+
crosser_.RestartAt(&c_);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
inline int S2CopyingEdgeCrosser::CrossingSign(const S2Point& d) {
|
|
330
|
+
int result = crosser_.CrossingSign(&d);
|
|
331
|
+
c_ = d;
|
|
332
|
+
crosser_.set_c(&c_);
|
|
333
|
+
return result;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
inline bool S2CopyingEdgeCrosser::EdgeOrVertexCrossing(const S2Point& d) {
|
|
337
|
+
bool result = crosser_.EdgeOrVertexCrossing(&d);
|
|
338
|
+
c_ = d;
|
|
339
|
+
crosser_.set_c(&c_);
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
#endif // S2_S2EDGE_CROSSER_H_
|
|
@@ -0,0 +1,264 @@
|
|
|
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_crosser.h"
|
|
19
|
+
|
|
20
|
+
#include <limits>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "s2/base/logging.h"
|
|
25
|
+
#include <gtest/gtest.h>
|
|
26
|
+
#include "s2/s2edge_crossings.h"
|
|
27
|
+
#include "s2/s2edge_distances.h"
|
|
28
|
+
#include "s2/s2pointutil.h"
|
|
29
|
+
#include "s2/s2testing.h"
|
|
30
|
+
|
|
31
|
+
using std::vector;
|
|
32
|
+
|
|
33
|
+
#ifdef NDEBUG
|
|
34
|
+
|
|
35
|
+
// In non-debug builds, check that default-constructed and/or NaN S2Point
|
|
36
|
+
// arguments don't cause crashes, especially on the very first method call
|
|
37
|
+
// (since S2CopyingEdgeCrosser checks whether the first vertex of each edge is
|
|
38
|
+
// the same as the last vertex of the previous edged when deciding whether or
|
|
39
|
+
// not to call Restart).
|
|
40
|
+
|
|
41
|
+
void TestCrossingSignInvalid(const S2Point& point, int expected) {
|
|
42
|
+
S2EdgeCrosser crosser(&point, &point);
|
|
43
|
+
EXPECT_EQ(expected, crosser.CrossingSign(&point, &point));
|
|
44
|
+
S2CopyingEdgeCrosser crosser2(point, point);
|
|
45
|
+
EXPECT_EQ(expected, crosser2.CrossingSign(point, point));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void TestEdgeOrVertexCrossingInvalid(const S2Point& point, bool expected) {
|
|
49
|
+
S2EdgeCrosser crosser(&point, &point);
|
|
50
|
+
EXPECT_EQ(expected, crosser.EdgeOrVertexCrossing(&point, &point));
|
|
51
|
+
S2CopyingEdgeCrosser crosser2(point, point);
|
|
52
|
+
EXPECT_EQ(expected, crosser2.EdgeOrVertexCrossing(point, point));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
TEST(S2EdgeUtil, InvalidDefaultPoints) {
|
|
56
|
+
// Check that default-constructed S2Point arguments don't cause crashes.
|
|
57
|
+
S2Point point(0, 0, 0);
|
|
58
|
+
TestCrossingSignInvalid(point, 0);
|
|
59
|
+
TestEdgeOrVertexCrossingInvalid(point, false);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
TEST(S2EdgeUtil, InvalidNanPoints) {
|
|
63
|
+
// Check that NaN S2Point arguments don't cause crashes.
|
|
64
|
+
const double nan = std::numeric_limits<double>::quiet_NaN();
|
|
65
|
+
S2Point point(nan, nan, nan);
|
|
66
|
+
TestCrossingSignInvalid(point, -1);
|
|
67
|
+
TestEdgeOrVertexCrossingInvalid(point, false);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#endif
|
|
71
|
+
|
|
72
|
+
void TestCrossing(const S2Point& a, const S2Point& b,
|
|
73
|
+
const S2Point& c, const S2Point& d,
|
|
74
|
+
int robust, bool edge_or_vertex) {
|
|
75
|
+
// Modify the expected result if two vertices from different edges match.
|
|
76
|
+
if (a == c || a == d || b == c || b == d) robust = 0;
|
|
77
|
+
EXPECT_EQ(robust, S2::CrossingSign(a, b, c, d));
|
|
78
|
+
S2EdgeCrosser crosser(&a, &b, &c);
|
|
79
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&d));
|
|
80
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&c));
|
|
81
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&d, &c));
|
|
82
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&c, &d));
|
|
83
|
+
|
|
84
|
+
EXPECT_EQ(edge_or_vertex, S2::EdgeOrVertexCrossing(a, b, c, d));
|
|
85
|
+
crosser.RestartAt(&c);
|
|
86
|
+
EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&d));
|
|
87
|
+
EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&c));
|
|
88
|
+
EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&d, &c));
|
|
89
|
+
EXPECT_EQ(edge_or_vertex, crosser.EdgeOrVertexCrossing(&c, &d));
|
|
90
|
+
|
|
91
|
+
// Check that the crosser can be re-used.
|
|
92
|
+
crosser.Init(&c, &d);
|
|
93
|
+
crosser.RestartAt(&a);
|
|
94
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&b));
|
|
95
|
+
EXPECT_EQ(robust, crosser.CrossingSign(&a));
|
|
96
|
+
|
|
97
|
+
// Now try all the same tests with CopyingEdgeCrosser.
|
|
98
|
+
S2CopyingEdgeCrosser crosser2(a, b, c);
|
|
99
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(d));
|
|
100
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(c));
|
|
101
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(d, c));
|
|
102
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(c, d));
|
|
103
|
+
|
|
104
|
+
EXPECT_EQ(edge_or_vertex, S2::EdgeOrVertexCrossing(a, b, c, d));
|
|
105
|
+
crosser2.RestartAt(c);
|
|
106
|
+
EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(d));
|
|
107
|
+
EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(c));
|
|
108
|
+
EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(d, c));
|
|
109
|
+
EXPECT_EQ(edge_or_vertex, crosser2.EdgeOrVertexCrossing(c, d));
|
|
110
|
+
|
|
111
|
+
// Check that the crosser can be re-used.
|
|
112
|
+
crosser2.Init(c, d);
|
|
113
|
+
crosser2.RestartAt(a);
|
|
114
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(b));
|
|
115
|
+
EXPECT_EQ(robust, crosser2.CrossingSign(a));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void TestCrossings(S2Point a, S2Point b, S2Point c, S2Point d,
|
|
119
|
+
int robust, bool edge_or_vertex) {
|
|
120
|
+
a = a.Normalize();
|
|
121
|
+
b = b.Normalize();
|
|
122
|
+
c = c.Normalize();
|
|
123
|
+
d = d.Normalize();
|
|
124
|
+
TestCrossing(a, b, c, d, robust, edge_or_vertex);
|
|
125
|
+
TestCrossing(b, a, c, d, robust, edge_or_vertex);
|
|
126
|
+
TestCrossing(a, b, d, c, robust, edge_or_vertex);
|
|
127
|
+
TestCrossing(b, a, d, c, robust, edge_or_vertex);
|
|
128
|
+
TestCrossing(a, a, c, d, -1, false);
|
|
129
|
+
TestCrossing(a, b, c, c, -1, false);
|
|
130
|
+
TestCrossing(a, a, c, c, -1, false);
|
|
131
|
+
TestCrossing(a, b, a, b, 0, true);
|
|
132
|
+
TestCrossing(c, d, a, b, robust, edge_or_vertex != (robust == 0));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
TEST(S2EdgeUtil, Crossings) {
|
|
136
|
+
// The real tests of edge crossings are in s2{loop,polygon}_test,
|
|
137
|
+
// but we do a few simple tests here.
|
|
138
|
+
|
|
139
|
+
// Two regular edges that cross.
|
|
140
|
+
TestCrossings(S2Point(1, 2, 1), S2Point(1, -3, 0.5),
|
|
141
|
+
S2Point(1, -0.5, -3), S2Point(0.1, 0.5, 3), 1, true);
|
|
142
|
+
|
|
143
|
+
// Two regular edges that intersect antipodal points.
|
|
144
|
+
TestCrossings(S2Point(1, 2, 1), S2Point(1, -3, 0.5),
|
|
145
|
+
S2Point(-1, 0.5, 3), S2Point(-0.1, -0.5, -3), -1, false);
|
|
146
|
+
|
|
147
|
+
// Two edges on the same great circle that start at antipodal points.
|
|
148
|
+
TestCrossings(S2Point(0, 0, -1), S2Point(0, 1, 0),
|
|
149
|
+
S2Point(0, 0, 1), S2Point(0, 1, 1), -1, false);
|
|
150
|
+
|
|
151
|
+
// Two edges that cross where one vertex is S2::Origin().
|
|
152
|
+
TestCrossings(S2Point(1, 0, 0), S2::Origin(),
|
|
153
|
+
S2Point(1, -0.1, 1), S2Point(1, 1, -0.1), 1, true);
|
|
154
|
+
|
|
155
|
+
// Two edges that intersect antipodal points where one vertex is
|
|
156
|
+
// S2::Origin().
|
|
157
|
+
TestCrossings(S2Point(1, 0, 0), S2::Origin(),
|
|
158
|
+
S2Point(-1, 0.1, -1), S2Point(-1, -1, 0.1), -1, false);
|
|
159
|
+
|
|
160
|
+
// Two edges that share an endpoint. The Ortho() direction is (-4,0,2),
|
|
161
|
+
// and edge CD is further CCW around (2,3,4) than AB.
|
|
162
|
+
TestCrossings(S2Point(2, 3, 4), S2Point(-1, 2, 5),
|
|
163
|
+
S2Point(7, -2, 3), S2Point(2, 3, 4), 0, false);
|
|
164
|
+
|
|
165
|
+
// Two edges that barely cross each other near the middle of one edge. The
|
|
166
|
+
// edge AB is approximately in the x=y plane, while CD is approximately
|
|
167
|
+
// perpendicular to it and ends exactly at the x=y plane.
|
|
168
|
+
TestCrossings(S2Point(1, 1, 1), S2Point(1, nextafter(1, 0), -1),
|
|
169
|
+
S2Point(11, -12, -1), S2Point(10, 10, 1), 1, true);
|
|
170
|
+
|
|
171
|
+
// In this version, the edges are separated by a distance of about 1e-15.
|
|
172
|
+
TestCrossings(S2Point(1, 1, 1), S2Point(1, nextafter(1, 2), -1),
|
|
173
|
+
S2Point(1, -1, 0), S2Point(1, 1, 0), -1, false);
|
|
174
|
+
|
|
175
|
+
// Two edges that barely cross each other near the end of both edges. This
|
|
176
|
+
// example cannot be handled using regular double-precision arithmetic due
|
|
177
|
+
// to floating-point underflow.
|
|
178
|
+
TestCrossings(S2Point(0, 0, 1), S2Point(2, -1e-323, 1),
|
|
179
|
+
S2Point(1, -1, 1), S2Point(1e-323, 0, 1), 1, true);
|
|
180
|
+
|
|
181
|
+
// In this version, the edges are separated by a distance of about 1e-640.
|
|
182
|
+
TestCrossings(S2Point(0, 0, 1), S2Point(2, 1e-323, 1),
|
|
183
|
+
S2Point(1, -1, 1), S2Point(1e-323, 0, 1), -1, false);
|
|
184
|
+
|
|
185
|
+
// Two edges that barely cross each other near the middle of one edge.
|
|
186
|
+
// Computing the exact determinant of some of the triangles in this test
|
|
187
|
+
// requires more than 2000 bits of precision.
|
|
188
|
+
TestCrossings(S2Point(1, -1e-323, -1e-323), S2Point(1e-323, 1, 1e-323),
|
|
189
|
+
S2Point(1, -1, 1e-323), S2Point(1, 1, 0),
|
|
190
|
+
1, true);
|
|
191
|
+
|
|
192
|
+
// In this version, the edges are separated by a distance of about 1e-640.
|
|
193
|
+
TestCrossings(S2Point(1, 1e-323, -1e-323), S2Point(-1e-323, 1, 1e-323),
|
|
194
|
+
S2Point(1, -1, 1e-323), S2Point(1, 1, 0),
|
|
195
|
+
-1, false);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
TEST(S2EdgeUtil, CollinearEdgesThatDontTouch) {
|
|
199
|
+
const int kIters = 500;
|
|
200
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
201
|
+
S2Point a = S2Testing::RandomPoint();
|
|
202
|
+
S2Point d = S2Testing::RandomPoint();
|
|
203
|
+
S2Point b = S2::Interpolate(0.05, a, d);
|
|
204
|
+
S2Point c = S2::Interpolate(0.95, a, d);
|
|
205
|
+
EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
|
|
206
|
+
EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
|
|
207
|
+
S2EdgeCrosser crosser(&a, &b, &c);
|
|
208
|
+
EXPECT_GT(0, crosser.CrossingSign(&d));
|
|
209
|
+
EXPECT_GT(0, crosser.CrossingSign(&c));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
TEST(S2EdgeUtil, CoincidentZeroLengthEdgesThatDontTouch) {
|
|
215
|
+
// It is important that the edge primitives can handle vertices that exactly
|
|
216
|
+
// exactly proportional to each other, i.e. that are not identical but are
|
|
217
|
+
// nevertheless exactly coincident when projected onto the unit sphere.
|
|
218
|
+
// There are various ways that such points can arise. For example,
|
|
219
|
+
// Normalize() itself is not idempotent: there exist distinct points A,B
|
|
220
|
+
// such that Normalize(A) == B and Normalize(B) == A. Another issue is
|
|
221
|
+
// that sometimes calls to Normalize() are skipped when the result of a
|
|
222
|
+
// calculation "should" be unit length mathematically (e.g., when computing
|
|
223
|
+
// the cross product of two orthonormal vectors).
|
|
224
|
+
//
|
|
225
|
+
// This test checks pairs of edges AB and CD where A,B,C,D are exactly
|
|
226
|
+
// coincident on the sphere and the norms of A,B,C,D are monotonically
|
|
227
|
+
// increasing. Such edge pairs should never intersect. (This is not
|
|
228
|
+
// obvious, since it depends on the particular symbolic perturbations used
|
|
229
|
+
// by s2pred::Sign(). It would be better to replace this with a test that
|
|
230
|
+
// says that the CCW results must be consistent with each other.)
|
|
231
|
+
const int kIters = 1000;
|
|
232
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
233
|
+
// Construct a point P where every component is zero or a power of 2.
|
|
234
|
+
S2Point p;
|
|
235
|
+
for (int i = 0; i < 3; ++i) {
|
|
236
|
+
int binary_exp = S2Testing::rnd.Skewed(11);
|
|
237
|
+
p[i] = (binary_exp > 1022) ? 0 : pow(2, -binary_exp);
|
|
238
|
+
}
|
|
239
|
+
// If all components were zero, try again. Note that normalization may
|
|
240
|
+
// convert a non-zero point into a zero one due to underflow (!)
|
|
241
|
+
p = p.Normalize();
|
|
242
|
+
if (p == S2Point(0, 0, 0)) { --iter; continue; }
|
|
243
|
+
|
|
244
|
+
// Now every non-zero component should have exactly the same mantissa.
|
|
245
|
+
// This implies that if we scale the point by an arbitrary factor, every
|
|
246
|
+
// non-zero component will still have the same mantissa. Scale the points
|
|
247
|
+
// so that they are all distinct and are still very likely to satisfy
|
|
248
|
+
// S2::IsUnitLength (which allows for a small amount of error in the norm).
|
|
249
|
+
S2Point a = (1-3e-16) * p;
|
|
250
|
+
S2Point b = (1-1e-16) * p;
|
|
251
|
+
S2Point c = p;
|
|
252
|
+
S2Point d = (1+2e-16) * p;
|
|
253
|
+
if (!S2::IsUnitLength(a) || !S2::IsUnitLength(d)) {
|
|
254
|
+
--iter;
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
// Verify that the expected edges do not cross.
|
|
258
|
+
EXPECT_GT(0, S2::CrossingSign(a, b, c, d));
|
|
259
|
+
S2EdgeCrosser crosser(&a, &b, &c);
|
|
260
|
+
EXPECT_GT(0, crosser.CrossingSign(&d));
|
|
261
|
+
EXPECT_GT(0, crosser.CrossingSign(&c));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|