@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,282 @@
|
|
|
1
|
+
// Copyright 2016 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
|
+
// This class contains various predicates that are guaranteed to produce
|
|
19
|
+
// correct, consistent results. They are also relatively efficient. This is
|
|
20
|
+
// achieved by computing conservative error bounds and falling back to high
|
|
21
|
+
// precision or even exact arithmetic when the result is uncertain. Such
|
|
22
|
+
// predicates are useful in implementing robust algorithms.
|
|
23
|
+
//
|
|
24
|
+
// See also S2EdgeCrosser, which implements various exact
|
|
25
|
+
// edge-crossing predicates more efficiently than can be done here.
|
|
26
|
+
//
|
|
27
|
+
// TODO(ericv): Add InCircleSign() (the Voronoi/Delaunay predicate).
|
|
28
|
+
// (This is trickier than the usual textbook implementations because we want
|
|
29
|
+
// to model S2Points as lying exactly on the mathematical unit sphere.)
|
|
30
|
+
|
|
31
|
+
#ifndef S2_S2PREDICATES_H_
|
|
32
|
+
#define S2_S2PREDICATES_H_
|
|
33
|
+
|
|
34
|
+
#include <cfloat>
|
|
35
|
+
#include <iosfwd>
|
|
36
|
+
|
|
37
|
+
#include "s2/_fp_contract_off.h"
|
|
38
|
+
#include "s2/s1chord_angle.h"
|
|
39
|
+
#include "s2/s2debug.h"
|
|
40
|
+
#include "s2/s2pointutil.h"
|
|
41
|
+
|
|
42
|
+
namespace s2pred {
|
|
43
|
+
|
|
44
|
+
// S2EdgeUtil contains the following exact predicates that test for edge
|
|
45
|
+
// crossings. (Usually you will want to use S2EdgeCrosser, which
|
|
46
|
+
// implements them much more efficiently.)
|
|
47
|
+
//
|
|
48
|
+
// int CrossingSign(const S2Point& a0, const S2Point& a1,
|
|
49
|
+
// const S2Point& b0, const S2Point& b1);
|
|
50
|
+
//
|
|
51
|
+
// bool EdgeOrVertexCrossing(const S2Point& a0, const S2Point& a1,
|
|
52
|
+
// const S2Point& b0, const S2Point& b1);
|
|
53
|
+
|
|
54
|
+
// Returns +1 if the points A, B, C are counterclockwise, -1 if the points
|
|
55
|
+
// are clockwise, and 0 if any two points are the same. This function is
|
|
56
|
+
// essentially like taking the sign of the determinant of ABC, except that
|
|
57
|
+
// it has additional logic to make sure that the above properties hold even
|
|
58
|
+
// when the three points are coplanar, and to deal with the limitations of
|
|
59
|
+
// floating-point arithmetic.
|
|
60
|
+
//
|
|
61
|
+
// Sign satisfies the following conditions:
|
|
62
|
+
//
|
|
63
|
+
// (1) Sign(a,b,c) == 0 if and only if a == b, b == c, or c == a
|
|
64
|
+
// (2) Sign(b,c,a) == Sign(a,b,c) for all a,b,c
|
|
65
|
+
// (3) Sign(c,b,a) == -Sign(a,b,c) for all a,b,c
|
|
66
|
+
//
|
|
67
|
+
// In other words:
|
|
68
|
+
//
|
|
69
|
+
// (1) The result is zero if and only if two points are the same.
|
|
70
|
+
// (2) Rotating the order of the arguments does not affect the result.
|
|
71
|
+
// (3) Exchanging any two arguments inverts the result.
|
|
72
|
+
//
|
|
73
|
+
// On the other hand, note that it is not true in general that
|
|
74
|
+
// Sign(-a,b,c) == -Sign(a,b,c), or any similar identities
|
|
75
|
+
// involving antipodal points.
|
|
76
|
+
int Sign(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
77
|
+
|
|
78
|
+
// Given 4 points on the unit sphere, return true if the edges OA, OB, and
|
|
79
|
+
// OC are encountered in that order while sweeping CCW around the point O.
|
|
80
|
+
// You can think of this as testing whether A <= B <= C with respect to the
|
|
81
|
+
// CCW ordering around O that starts at A, or equivalently, whether B is
|
|
82
|
+
// contained in the range of angles (inclusive) that starts at A and extends
|
|
83
|
+
// CCW to C. Properties:
|
|
84
|
+
//
|
|
85
|
+
// (1) If OrderedCCW(a,b,c,o) && OrderedCCW(b,a,c,o), then a == b
|
|
86
|
+
// (2) If OrderedCCW(a,b,c,o) && OrderedCCW(a,c,b,o), then b == c
|
|
87
|
+
// (3) If OrderedCCW(a,b,c,o) && OrderedCCW(c,b,a,o), then a == b == c
|
|
88
|
+
// (4) If a == b or b == c, then OrderedCCW(a,b,c,o) is true
|
|
89
|
+
// (5) Otherwise if a == c, then OrderedCCW(a,b,c,o) is false
|
|
90
|
+
bool OrderedCCW(const S2Point& a, const S2Point& b, const S2Point& c,
|
|
91
|
+
const S2Point& o);
|
|
92
|
+
|
|
93
|
+
// Returns -1, 0, or +1 according to whether AX < BX, A == B, or AX > BX
|
|
94
|
+
// respectively. Distances are measured with respect to the positions of X,
|
|
95
|
+
// A, and B as though they were reprojected to lie exactly on the surface of
|
|
96
|
+
// the unit sphere. Furthermore, this method uses symbolic perturbations to
|
|
97
|
+
// ensure that the result is non-zero whenever A != B, even when AX == BX
|
|
98
|
+
// exactly, or even when A and B project to the same point on the sphere.
|
|
99
|
+
// Such results are guaranteed to be self-consistent, i.e. if AB < BC and
|
|
100
|
+
// BC < AC, then AB < AC.
|
|
101
|
+
int CompareDistances(const S2Point& x, const S2Point& a, const S2Point& b);
|
|
102
|
+
|
|
103
|
+
// Returns -1, 0, or +1 according to whether the distance XY is less than,
|
|
104
|
+
// equal to, or greater than "r" respectively. Distances are measured with
|
|
105
|
+
// respect the positions of all points as though they are projected to lie
|
|
106
|
+
// exactly on the surface of the unit sphere.
|
|
107
|
+
int CompareDistance(const S2Point& x, const S2Point& y, S1ChordAngle r);
|
|
108
|
+
|
|
109
|
+
// Returns -1, 0, or +1 according to whether the distance from the point X to
|
|
110
|
+
// the edge A is less than, equal to, or greater than "r" respectively.
|
|
111
|
+
// Distances are measured with respect the positions of all points as though
|
|
112
|
+
// they were projected to lie exactly on the surface of the unit sphere.
|
|
113
|
+
//
|
|
114
|
+
// REQUIRES: A0 and A1 do not project to antipodal points (e.g., A0 == -A1).
|
|
115
|
+
// This requires that (A0 != C * A1) for any constant C < 0.
|
|
116
|
+
//
|
|
117
|
+
// NOTE(ericv): All of the predicates defined here could be extended to handle
|
|
118
|
+
// edges consisting of antipodal points by implementing additional symbolic
|
|
119
|
+
// perturbation logic (similar to Sign) in order to rigorously define the
|
|
120
|
+
// direction of such edges.
|
|
121
|
+
int CompareEdgeDistance(const S2Point& x, const S2Point& a0, const S2Point& a1,
|
|
122
|
+
S1ChordAngle r);
|
|
123
|
+
|
|
124
|
+
// Returns -1, 0, or +1 according to whether the normal of edge A has
|
|
125
|
+
// negative, zero, or positive dot product with the normal of edge B. This
|
|
126
|
+
// essentially measures whether the edges A and B are closer to proceeding in
|
|
127
|
+
// the same direction or in opposite directions around the sphere.
|
|
128
|
+
//
|
|
129
|
+
// This method returns an exact result, i.e. the result is zero if and only if
|
|
130
|
+
// the two edges are exactly perpendicular or at least one edge is degenerate.
|
|
131
|
+
// (i.e., both edge endpoints project to the same point on the sphere).
|
|
132
|
+
//
|
|
133
|
+
// CAVEAT: This method does not use symbolic perturbations. Therefore it can
|
|
134
|
+
// return zero even when A0 != A1 and B0 != B1, e.g. if (A0 == C * A1) exactly
|
|
135
|
+
// for some constant C > 0 (which is possible even when both points are
|
|
136
|
+
// considered "normalized").
|
|
137
|
+
//
|
|
138
|
+
// REQUIRES: Neither edge can consist of antipodal points (e.g., A0 == -A1)
|
|
139
|
+
// (see comments in CompareEdgeDistance).
|
|
140
|
+
int CompareEdgeDirections(const S2Point& a0, const S2Point& a1,
|
|
141
|
+
const S2Point& b0, const S2Point& b1);
|
|
142
|
+
|
|
143
|
+
// Returns Sign(X0, X1, Z) where Z is the circumcenter of triangle ABC.
|
|
144
|
+
// The return value is +1 if Z is to the left of edge X, and -1 if Z is to the
|
|
145
|
+
// right of edge X. The return value is zero if A == B, B == C, or C == A
|
|
146
|
+
// (exactly), and also if X0 and X1 project to identical points on the sphere
|
|
147
|
+
// (e.g., X0 == X1).
|
|
148
|
+
//
|
|
149
|
+
// The result is determined with respect to the positions of all points as
|
|
150
|
+
// though they were projected to lie exactly on the surface of the unit
|
|
151
|
+
// sphere. Furthermore this method uses symbolic perturbations to compute a
|
|
152
|
+
// consistent non-zero result even when Z lies exactly on edge X.
|
|
153
|
+
//
|
|
154
|
+
// REQUIRES: X0 and X1 do not project to antipodal points (e.g., X0 == -X1)
|
|
155
|
+
// (see comments in CompareEdgeDistance).
|
|
156
|
+
int EdgeCircumcenterSign(const S2Point& x0, const S2Point& x1,
|
|
157
|
+
const S2Point& a, const S2Point& b, const S2Point& c);
|
|
158
|
+
|
|
159
|
+
// This is a specialized method that is used to compute the intersection of an
|
|
160
|
+
// edge X with the Voronoi diagram of a set of points, where each Voronoi
|
|
161
|
+
// region is intersected with a disc of fixed radius "r".
|
|
162
|
+
//
|
|
163
|
+
// Given two sites A and B and an edge (X0, X1) such that d(A,X0) < d(B,X0)
|
|
164
|
+
// and both sites are within the given distance "r" of edge X, this method
|
|
165
|
+
// intersects the Voronoi region of each site with a disc of radius r and
|
|
166
|
+
// determines whether either region has an empty intersection with edge X. It
|
|
167
|
+
// returns FIRST if site A has an empty intersection, SECOND if site B has an
|
|
168
|
+
// empty intersection, NEITHER if neither site has an empty intersection, or
|
|
169
|
+
// UNCERTAIN if A == B exactly. Note that it is not possible for both
|
|
170
|
+
// intersections to be empty because of the requirement that both sites are
|
|
171
|
+
// within distance r of edge X. (For example, the only reason that Voronoi
|
|
172
|
+
// region A can have an empty intersection with X is that site B is closer to
|
|
173
|
+
// all points on X that are within radius r of site A.)
|
|
174
|
+
//
|
|
175
|
+
// The result is determined with respect to the positions of all points as
|
|
176
|
+
// though they were projected to lie exactly on the surface of the unit
|
|
177
|
+
// sphere. Furthermore this method uses symbolic perturbations to compute a
|
|
178
|
+
// consistent non-zero result even when A and B lie on opposite sides of X
|
|
179
|
+
// such that the Voronoi edge between them exactly coincides with edge X, or
|
|
180
|
+
// when A and B are distinct but project to the same point on the sphere
|
|
181
|
+
// (i.e., they are linearly dependent).
|
|
182
|
+
//
|
|
183
|
+
// REQUIRES: r < S1ChordAngle::Right() (90 degrees)
|
|
184
|
+
// REQUIRES: s2pred::CompareDistances(x0, a, b) < 0
|
|
185
|
+
// REQUIRES: s2pred::CompareEdgeDistance(a, x0, x1, r) <= 0
|
|
186
|
+
// REQUIRES: s2pred::CompareEdgeDistance(b, x0, x1, r) <= 0
|
|
187
|
+
// REQUIRES: X0 and X1 do not project to antipodal points (e.g., X0 == -X1)
|
|
188
|
+
// (see comments in CompareEdgeDistance).
|
|
189
|
+
enum class Excluded { FIRST, SECOND, NEITHER, UNCERTAIN };
|
|
190
|
+
std::ostream& operator<<(std::ostream& os, Excluded excluded);
|
|
191
|
+
Excluded GetVoronoiSiteExclusion(const S2Point& a, const S2Point& b,
|
|
192
|
+
const S2Point& x0, const S2Point& x1,
|
|
193
|
+
S1ChordAngle r);
|
|
194
|
+
|
|
195
|
+
/////////////////////////// Low-Level Methods ////////////////////////////
|
|
196
|
+
//
|
|
197
|
+
// Most clients will not need the following methods. They can be slightly
|
|
198
|
+
// more efficient but are harder to use, since they require the client to do
|
|
199
|
+
// all the actual crossing tests.
|
|
200
|
+
|
|
201
|
+
// A more efficient version of Sign that allows the precomputed
|
|
202
|
+
// cross-product of A and B to be specified. (Unlike the 3 argument
|
|
203
|
+
// version this method is also inlined.)
|
|
204
|
+
inline int Sign(const S2Point& a, const S2Point& b, const S2Point& c,
|
|
205
|
+
const Vector3_d& a_cross_b);
|
|
206
|
+
|
|
207
|
+
// This version of Sign returns +1 if the points are definitely CCW, -1 if
|
|
208
|
+
// they are definitely CW, and 0 if two points are identical or the result
|
|
209
|
+
// is uncertain. Uncertain cases can be resolved, if desired, by calling
|
|
210
|
+
// ExpensiveSign.
|
|
211
|
+
//
|
|
212
|
+
// The purpose of this method is to allow additional cheap tests to be done,
|
|
213
|
+
// where possible, in order to avoid calling ExpensiveSign unnecessarily.
|
|
214
|
+
inline int TriageSign(const S2Point& a, const S2Point& b,
|
|
215
|
+
const S2Point& c, const Vector3_d& a_cross_b);
|
|
216
|
+
|
|
217
|
+
// This function is invoked by Sign() if the sign of the determinant is
|
|
218
|
+
// uncertain. It always returns a non-zero result unless two of the input
|
|
219
|
+
// points are the same. It uses a combination of multiple-precision
|
|
220
|
+
// arithmetic and symbolic perturbations to ensure that its results are
|
|
221
|
+
// always self-consistent (cf. Simulation of Simplicity, Edelsbrunner and
|
|
222
|
+
// Muecke). The basic idea is to assign an infinitesimal symbolic
|
|
223
|
+
// perturbation to every possible S2Point such that no three S2Points are
|
|
224
|
+
// collinear and no four S2Points are coplanar. These perturbations are so
|
|
225
|
+
// small that they do not affect the sign of any determinant that was
|
|
226
|
+
// non-zero before the perturbations. If "perturb" is false, then instead
|
|
227
|
+
// the exact sign of the unperturbed input points is returned, which can be
|
|
228
|
+
// zero even when all three points are distinct.
|
|
229
|
+
//
|
|
230
|
+
// Unlike Sign(), this method does not require the input points to be
|
|
231
|
+
// normalized.
|
|
232
|
+
int ExpensiveSign(const S2Point& a, const S2Point& b,
|
|
233
|
+
const S2Point& c, bool perturb = true);
|
|
234
|
+
|
|
235
|
+
////////////////// Implementation details follow ////////////////////
|
|
236
|
+
|
|
237
|
+
inline int Sign(const S2Point& a, const S2Point& b, const S2Point& c,
|
|
238
|
+
const Vector3_d& a_cross_b) {
|
|
239
|
+
int sign = TriageSign(a, b, c, a_cross_b);
|
|
240
|
+
if (sign == 0) sign = ExpensiveSign(a, b, c);
|
|
241
|
+
return sign;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
inline int TriageSign(const S2Point& a, const S2Point& b,
|
|
245
|
+
const S2Point& c, const Vector3_d& a_cross_b) {
|
|
246
|
+
// kMaxDetError is the maximum error in computing (AxB).C where all vectors
|
|
247
|
+
// are unit length. Using standard inequalities, it can be shown that
|
|
248
|
+
//
|
|
249
|
+
// fl(AxB) = AxB + D where |D| <= (|AxB| + (2/sqrt(3))*|A|*|B|) * e
|
|
250
|
+
//
|
|
251
|
+
// where "fl()" denotes a calculation done in floating-point arithmetic,
|
|
252
|
+
// |x| denotes either absolute value or the L2-norm as appropriate, and
|
|
253
|
+
// e = 0.5*DBL_EPSILON. Similarly,
|
|
254
|
+
//
|
|
255
|
+
// fl(B.C) = B.C + d where |d| <= (1.5*|B.C| + 1.5*|B|*|C|) * e .
|
|
256
|
+
//
|
|
257
|
+
// Applying these bounds to the unit-length vectors A,B,C and neglecting
|
|
258
|
+
// relative error (which does not affect the sign of the result), we get
|
|
259
|
+
//
|
|
260
|
+
// fl((AxB).C) = (AxB).C + d where |d| <= (2.5 + 2/sqrt(3)) * e
|
|
261
|
+
//
|
|
262
|
+
// which is about 3.6548 * e, or 1.8274 * DBL_EPSILON.
|
|
263
|
+
const double kMaxDetError = 1.8274 * DBL_EPSILON;
|
|
264
|
+
S2_DCHECK(S2::IsUnitLength(a));
|
|
265
|
+
S2_DCHECK(S2::IsUnitLength(b));
|
|
266
|
+
S2_DCHECK(S2::IsUnitLength(c));
|
|
267
|
+
double det = a_cross_b.DotProd(c);
|
|
268
|
+
|
|
269
|
+
// Double-check borderline cases in debug mode.
|
|
270
|
+
S2_DCHECK(!FLAGS_s2debug ||
|
|
271
|
+
std::fabs(det) <= kMaxDetError ||
|
|
272
|
+
std::fabs(det) >= 100 * kMaxDetError ||
|
|
273
|
+
det * ExpensiveSign(a, b, c) > 0);
|
|
274
|
+
|
|
275
|
+
if (det > kMaxDetError) return 1;
|
|
276
|
+
if (det < -kMaxDetError) return -1;
|
|
277
|
+
return 0;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
} // namespace s2pred
|
|
281
|
+
|
|
282
|
+
#endif // S2_S2PREDICATES_H_
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Copyright 2016 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
|
+
// The following functions are not part of the public API. Currently they are
|
|
19
|
+
// only used internally for testing purposes.
|
|
20
|
+
|
|
21
|
+
#ifndef S2_S2PREDICATES_INTERNAL_H_
|
|
22
|
+
#define S2_S2PREDICATES_INTERNAL_H_
|
|
23
|
+
|
|
24
|
+
#include <limits>
|
|
25
|
+
|
|
26
|
+
#include "s2/third_party/absl/base/casts.h"
|
|
27
|
+
#include "s2/s1chord_angle.h"
|
|
28
|
+
#include "s2/s2predicates.h"
|
|
29
|
+
#include "s2/util/math/exactfloat/exactfloat.h"
|
|
30
|
+
#include "s2/util/math/vector.h"
|
|
31
|
+
|
|
32
|
+
namespace s2pred {
|
|
33
|
+
|
|
34
|
+
// Returns 2 ** (-digits). This could be implemented using "ldexp" except
|
|
35
|
+
// that std::ldexp is not constexpr in C++11.
|
|
36
|
+
constexpr double epsilon_for_digits(int digits) {
|
|
37
|
+
return (digits < 64 ? 1.0 / (1ULL << digits) :
|
|
38
|
+
epsilon_for_digits(digits - 63) / (1ULL << 63));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Returns the maximum rounding error for arithmetic operations in type T.
|
|
42
|
+
// We could simply return 0.5 * numeric_limits<T>::epsilon(), except that some
|
|
43
|
+
// platforms implement "long double" using "double-double" arithmetic, and for
|
|
44
|
+
// those platforms we need to compute the rounding error manually based on
|
|
45
|
+
// numeric_limits<T>::digits (the number of bits of mantissa precision).
|
|
46
|
+
template <typename T> constexpr T rounding_epsilon() {
|
|
47
|
+
return epsilon_for_digits(std::numeric_limits<T>::digits);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
using Vector3_ld = Vector3<long double>;
|
|
51
|
+
using Vector3_xf = Vector3<ExactFloat>;
|
|
52
|
+
|
|
53
|
+
inline static Vector3_ld ToLD(const S2Point& x) {
|
|
54
|
+
return Vector3_ld::Cast(x);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
inline static long double ToLD(double x) {
|
|
58
|
+
return absl::implicit_cast<long double>(x);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
inline static Vector3_xf ToExact(const S2Point& x) {
|
|
62
|
+
return Vector3_xf::Cast(x);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
int StableSign(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
66
|
+
|
|
67
|
+
int ExactSign(const S2Point& a, const S2Point& b, const S2Point& c,
|
|
68
|
+
bool perturb);
|
|
69
|
+
|
|
70
|
+
int SymbolicallyPerturbedSign(
|
|
71
|
+
const Vector3_xf& a, const Vector3_xf& b,
|
|
72
|
+
const Vector3_xf& c, const Vector3_xf& b_cross_c);
|
|
73
|
+
|
|
74
|
+
template <class T>
|
|
75
|
+
int TriageCompareCosDistances(const Vector3<T>& x,
|
|
76
|
+
const Vector3<T>& a, const Vector3<T>& b);
|
|
77
|
+
|
|
78
|
+
template <class T>
|
|
79
|
+
int TriageCompareSin2Distances(const Vector3<T>& x,
|
|
80
|
+
const Vector3<T>& a, const Vector3<T>& b);
|
|
81
|
+
|
|
82
|
+
int ExactCompareDistances(const Vector3_xf& x,
|
|
83
|
+
const Vector3_xf& a, const Vector3_xf& b);
|
|
84
|
+
|
|
85
|
+
int SymbolicCompareDistances(const S2Point& x,
|
|
86
|
+
const S2Point& a, const S2Point& b);
|
|
87
|
+
|
|
88
|
+
template <class T>
|
|
89
|
+
int TriageCompareSin2Distance(const Vector3<T>& x, const Vector3<T>& y, T r2);
|
|
90
|
+
|
|
91
|
+
template <class T>
|
|
92
|
+
int TriageCompareCosDistance(const Vector3<T>& x, const Vector3<T>& y, T r2);
|
|
93
|
+
|
|
94
|
+
int ExactCompareDistance(const Vector3_xf& x, const Vector3_xf& y,
|
|
95
|
+
const ExactFloat& r2);
|
|
96
|
+
|
|
97
|
+
template <class T>
|
|
98
|
+
int TriageCompareEdgeDistance(const Vector3<T>& x, const Vector3<T>& a0,
|
|
99
|
+
const Vector3<T>& a1, T r2);
|
|
100
|
+
|
|
101
|
+
int ExactCompareEdgeDistance(const S2Point& x, const S2Point& a0,
|
|
102
|
+
const S2Point& a1, S1ChordAngle r);
|
|
103
|
+
|
|
104
|
+
template <class T>
|
|
105
|
+
int TriageCompareEdgeDirections(
|
|
106
|
+
const Vector3<T>& a0, const Vector3<T>& a1,
|
|
107
|
+
const Vector3<T>& b0, const Vector3<T>& b1);
|
|
108
|
+
|
|
109
|
+
int ExactCompareEdgeDirections(const Vector3_xf& a0, const Vector3_xf& a1,
|
|
110
|
+
const Vector3_xf& b0, const Vector3_xf& b1);
|
|
111
|
+
|
|
112
|
+
template <class T>
|
|
113
|
+
int TriageEdgeCircumcenterSign(const Vector3<T>& x0, const Vector3<T>& x1,
|
|
114
|
+
const Vector3<T>& a, const Vector3<T>& b,
|
|
115
|
+
const Vector3<T>& c, int abc_sign);
|
|
116
|
+
|
|
117
|
+
int ExactEdgeCircumcenterSign(const Vector3_xf& x0, const Vector3_xf& x1,
|
|
118
|
+
const Vector3_xf& a, const Vector3_xf& b,
|
|
119
|
+
const Vector3_xf& c, int abc_sign);
|
|
120
|
+
|
|
121
|
+
int SymbolicEdgeCircumcenterSign(
|
|
122
|
+
const S2Point& x0, const S2Point& x1,
|
|
123
|
+
const S2Point& a_arg, const S2Point& b_arg, const S2Point& c_arg);
|
|
124
|
+
|
|
125
|
+
template <class T>
|
|
126
|
+
Excluded TriageVoronoiSiteExclusion(const Vector3<T>& a, const Vector3<T>& b,
|
|
127
|
+
const Vector3<T>& x0, const Vector3<T>& x1,
|
|
128
|
+
T r2);
|
|
129
|
+
|
|
130
|
+
Excluded ExactVoronoiSiteExclusion(const Vector3_xf& a, const Vector3_xf& b,
|
|
131
|
+
const Vector3_xf& x0, const Vector3_xf& x1,
|
|
132
|
+
const ExactFloat& r2);
|
|
133
|
+
} // namespace s2pred
|
|
134
|
+
|
|
135
|
+
#endif // S2_S2PREDICATES_INTERNAL_H_
|