@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,131 @@
|
|
|
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/s2pointutil.h"
|
|
19
|
+
|
|
20
|
+
#include <cfloat>
|
|
21
|
+
#include <cmath>
|
|
22
|
+
|
|
23
|
+
using std::fabs;
|
|
24
|
+
|
|
25
|
+
namespace S2 {
|
|
26
|
+
|
|
27
|
+
bool IsUnitLength(const S2Point& p) {
|
|
28
|
+
// Normalize() is guaranteed to return a vector whose L2-norm differs from 1
|
|
29
|
+
// by less than 2 * DBL_EPSILON. Thus the squared L2-norm differs by less
|
|
30
|
+
// than 4 * DBL_EPSILON. The actual calculated Norm2() can have up to 1.5 *
|
|
31
|
+
// DBL_EPSILON of additional error. The total error of 5.5 * DBL_EPSILON
|
|
32
|
+
// can then be rounded down since the result must be a representable
|
|
33
|
+
// double-precision value.
|
|
34
|
+
return fabs(p.Norm2() - 1) <= 5 * DBL_EPSILON; // About 1.11e-15
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
bool ApproxEquals(const S2Point& a, const S2Point& b, S1Angle max_error) {
|
|
38
|
+
S2_DCHECK_NE(a, S2Point());
|
|
39
|
+
S2_DCHECK_NE(b, S2Point());
|
|
40
|
+
return S1Angle(a, b) <= max_error;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
S2Point Ortho(const S2Point& a) {
|
|
44
|
+
#ifdef S2_TEST_DEGENERACIES
|
|
45
|
+
// Vector3::Ortho() always returns a point on the X-Y, Y-Z, or X-Z planes.
|
|
46
|
+
// This leads to many more degenerate cases in polygon operations.
|
|
47
|
+
return a.Ortho();
|
|
48
|
+
#else
|
|
49
|
+
int k = a.LargestAbsComponent() - 1;
|
|
50
|
+
if (k < 0) k = 2;
|
|
51
|
+
S2Point temp(0.012, 0.0053, 0.00457);
|
|
52
|
+
temp[k] = 1;
|
|
53
|
+
return a.CrossProd(temp).Normalize();
|
|
54
|
+
#endif
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Vector3_d RobustCrossProd(const S2Point& a, const S2Point& b) {
|
|
58
|
+
// The direction of a.CrossProd(b) becomes unstable as (a + b) or (a - b)
|
|
59
|
+
// approaches zero. This leads to situations where a.CrossProd(b) is not
|
|
60
|
+
// very orthogonal to "a" and/or "b". We could fix this using Gram-Schmidt,
|
|
61
|
+
// but we also want b.RobustCrossProd(a) == -a.RobustCrossProd(b).
|
|
62
|
+
//
|
|
63
|
+
// The easiest fix is to just compute the cross product of (b+a) and (b-a).
|
|
64
|
+
// Mathematically, this cross product is exactly twice the cross product of
|
|
65
|
+
// "a" and "b", but it has the numerical advantage that (b+a) and (b-a)
|
|
66
|
+
// are always perpendicular (since "a" and "b" are unit length). This
|
|
67
|
+
// yields a result that is nearly orthogonal to both "a" and "b" even if
|
|
68
|
+
// these two values differ only in the lowest bit of one component.
|
|
69
|
+
|
|
70
|
+
S2_DCHECK(IsUnitLength(a));
|
|
71
|
+
S2_DCHECK(IsUnitLength(b));
|
|
72
|
+
Vector3_d x = (b + a).CrossProd(b - a);
|
|
73
|
+
if (x != S2Point(0, 0, 0)) return x;
|
|
74
|
+
|
|
75
|
+
// The only result that makes sense mathematically is to return zero, but
|
|
76
|
+
// we find it more convenient to return an arbitrary orthogonal vector.
|
|
77
|
+
return Ortho(a);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
S2Point Rotate(const S2Point& p, const S2Point& axis, S1Angle angle) {
|
|
81
|
+
S2_DCHECK(IsUnitLength(p));
|
|
82
|
+
S2_DCHECK(IsUnitLength(axis));
|
|
83
|
+
// Let M be the plane through P that is perpendicular to "axis", and let
|
|
84
|
+
// "center" be the point where M intersects "axis". We construct a
|
|
85
|
+
// right-handed orthogonal frame (dx, dy, center) such that "dx" is the
|
|
86
|
+
// vector from "center" to P, and "dy" has the same length as "dx". The
|
|
87
|
+
// result can then be expressed as (cos(angle)*dx + sin(angle)*dy + center).
|
|
88
|
+
S2Point center = p.DotProd(axis) * axis;
|
|
89
|
+
S2Point dx = p - center;
|
|
90
|
+
S2Point dy = axis.CrossProd(p);
|
|
91
|
+
// Mathematically the result is unit length, but normalization is necessary
|
|
92
|
+
// to ensure that numerical errors don't accumulate.
|
|
93
|
+
return (cos(angle) * dx + sin(angle) * dy + center).Normalize();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Matrix3x3_d GetFrame(const S2Point& z) {
|
|
97
|
+
Matrix3x3_d m;
|
|
98
|
+
GetFrame(z, &m);
|
|
99
|
+
return m;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void GetFrame(const S2Point& z, Matrix3x3_d* m) {
|
|
103
|
+
S2_DCHECK(IsUnitLength(z));
|
|
104
|
+
m->SetCol(2, z);
|
|
105
|
+
m->SetCol(1, Ortho(z));
|
|
106
|
+
m->SetCol(0, m->Col(1).CrossProd(z)); // Already unit-length.
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
S2Point ToFrame(const Matrix3x3_d& m, const S2Point& p) {
|
|
110
|
+
// The inverse of an orthonormal matrix is its transpose.
|
|
111
|
+
return m.Transpose() * p;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
S2Point FromFrame(const Matrix3x3_d& m, const S2Point& q) {
|
|
115
|
+
return m * q;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
bool SimpleCCW(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
119
|
+
// We compute the signed volume of the parallelepiped ABC. The usual
|
|
120
|
+
// formula for this is (AxB).C, but we compute it here using (CxA).B
|
|
121
|
+
// in order to ensure that ABC and CBA are not both CCW. This follows
|
|
122
|
+
// from the following identities (which are true numerically, not just
|
|
123
|
+
// mathematically):
|
|
124
|
+
//
|
|
125
|
+
// (1) x.CrossProd(y) == -(y.CrossProd(x))
|
|
126
|
+
// (2) (-x).DotProd(y) == -(x.DotProd(y))
|
|
127
|
+
|
|
128
|
+
return c.CrossProd(a).DotProd(b) > 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
} // namespace S2
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
// Defines additional operations for points on the unit sphere (in addition to
|
|
19
|
+
// the standard vector operations defined in "util/math/vector.h").
|
|
20
|
+
|
|
21
|
+
#ifndef S2_S2POINTUTIL_H_
|
|
22
|
+
#define S2_S2POINTUTIL_H_
|
|
23
|
+
|
|
24
|
+
#include "s2/_fp_contract_off.h"
|
|
25
|
+
#include "s2/s1angle.h"
|
|
26
|
+
#include "s2/s2point.h"
|
|
27
|
+
#include "s2/util/math/matrix3x3.h"
|
|
28
|
+
|
|
29
|
+
// S2 is a namespace for constants and simple utility functions that are used
|
|
30
|
+
// throughout the S2 library. The name "S2" is derived from the mathematical
|
|
31
|
+
// symbol for the two-dimensional unit sphere (note that the "2" refers to the
|
|
32
|
+
// dimension of the surface, not the space it is embedded in).
|
|
33
|
+
namespace S2 {
|
|
34
|
+
|
|
35
|
+
// Return a unique "origin" on the sphere for operations that need a fixed
|
|
36
|
+
// reference point. In particular, this is the "point at infinity" used for
|
|
37
|
+
// point-in-polygon testing (by counting the number of edge crossings).
|
|
38
|
+
inline S2Point Origin();
|
|
39
|
+
|
|
40
|
+
// Return true if the given point is approximately unit length
|
|
41
|
+
// (this is mainly useful for assertions).
|
|
42
|
+
bool IsUnitLength(const S2Point& p);
|
|
43
|
+
|
|
44
|
+
// Return true if two points are within the given distance of each other (this
|
|
45
|
+
// is mainly useful for testing). It is an error if either point is a
|
|
46
|
+
// zero-length vector (default S2Point), but this is only checked in debug mode.
|
|
47
|
+
// In non-debug mode it will always return true.
|
|
48
|
+
bool ApproxEquals(const S2Point& a, const S2Point& b,
|
|
49
|
+
S1Angle max_error = S1Angle::Radians(1e-15));
|
|
50
|
+
|
|
51
|
+
// Return a unit-length vector that is orthogonal to "a". Satisfies
|
|
52
|
+
// Ortho(-a) = -Ortho(a) for all a.
|
|
53
|
+
//
|
|
54
|
+
// Note that Vector3_d also defines an "Ortho" method, but this one is
|
|
55
|
+
// preferred for use in S2 code because it explicitly tries to avoid result
|
|
56
|
+
// result coordinates that are zero. (This is a performance optimization that
|
|
57
|
+
// reduces the amount of time spent in functions which handle degeneracies.)
|
|
58
|
+
S2Point Ortho(const S2Point& a);
|
|
59
|
+
|
|
60
|
+
// Return a vector "c" that is orthogonal to the given unit-length vectors
|
|
61
|
+
// "a" and "b". This function is similar to a.CrossProd(b) except that it
|
|
62
|
+
// does a better job of ensuring orthogonality when "a" is nearly parallel
|
|
63
|
+
// to "b", and it returns a non-zero result even when a == b or a == -b.
|
|
64
|
+
//
|
|
65
|
+
// It satisfies the following properties (RCP == RobustCrossProd):
|
|
66
|
+
//
|
|
67
|
+
// (1) RCP(a,b) != 0 for all a, b
|
|
68
|
+
// (2) RCP(b,a) == -RCP(a,b) unless a == b or a == -b
|
|
69
|
+
// (3) RCP(-a,b) == -RCP(a,b) unless a == b or a == -b
|
|
70
|
+
// (4) RCP(a,-b) == -RCP(a,b) unless a == b or a == -b
|
|
71
|
+
//
|
|
72
|
+
// The result is not guaranteed to be unit length.
|
|
73
|
+
S2Point RobustCrossProd(const S2Point& a, const S2Point& b);
|
|
74
|
+
|
|
75
|
+
// Rotate the given point about the given axis by the given angle. "p" and
|
|
76
|
+
// "axis" must be unit length; "angle" has no restrictions (e.g., it can be
|
|
77
|
+
// positive, negative, greater than 360 degrees, etc).
|
|
78
|
+
S2Point Rotate(const S2Point& p, const S2Point& axis, S1Angle angle);
|
|
79
|
+
|
|
80
|
+
// Extend the given point "z" on the unit sphere into a right-handed
|
|
81
|
+
// coordinate frame of unit-length column vectors m = (x,y,z). Note that the
|
|
82
|
+
// vectors (x,y) are an orthonormal frame for the tangent space at "z", while
|
|
83
|
+
// "z" itself is an orthonormal frame for the normal space at "z".
|
|
84
|
+
Matrix3x3_d GetFrame(const S2Point& z);
|
|
85
|
+
void GetFrame(const S2Point& z, Matrix3x3_d* m);
|
|
86
|
+
|
|
87
|
+
// Given an orthonormal basis "m" of column vectors and a point "p", return
|
|
88
|
+
// the coordinates of "p" with respect to the basis "m". The resulting
|
|
89
|
+
// point "q" satisfies the identity (m * q == p).
|
|
90
|
+
S2Point ToFrame(const Matrix3x3_d& m, const S2Point& p);
|
|
91
|
+
|
|
92
|
+
// Given an orthonormal basis "m" of column vectors and a point "q" with
|
|
93
|
+
// respect to that basis, return the equivalent point "p" with respect to
|
|
94
|
+
// the standard axis-aligned basis. The result satisfies (p == m * q).
|
|
95
|
+
S2Point FromFrame(const Matrix3x3_d& m, const S2Point& q);
|
|
96
|
+
|
|
97
|
+
// Return true if the points A, B, C are strictly counterclockwise. Return
|
|
98
|
+
// false if the points are clockwise or collinear (i.e. if they are all
|
|
99
|
+
// contained on some great circle).
|
|
100
|
+
//
|
|
101
|
+
// Due to numerical errors, situations may arise that are mathematically
|
|
102
|
+
// impossible, e.g. ABC may be considered strictly CCW while BCA is not.
|
|
103
|
+
// However, the implementation guarantees the following:
|
|
104
|
+
//
|
|
105
|
+
// If SimpleCCW(a,b,c), then !SimpleCCW(c,b,a) for all a,b,c.
|
|
106
|
+
ABSL_DEPRECATED("Use s2pred::Sign instead.")
|
|
107
|
+
bool SimpleCCW(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
////////////////// Implementation details follow ////////////////////
|
|
111
|
+
|
|
112
|
+
// Uncomment the following line for testing purposes only.
|
|
113
|
+
// #define S2_TEST_DEGENERACIES
|
|
114
|
+
|
|
115
|
+
inline S2Point Origin() {
|
|
116
|
+
#ifdef S2_TEST_DEGENERACIES
|
|
117
|
+
// This value makes polygon operations much slower, because it greatly
|
|
118
|
+
// increases the number of degenerate cases that need to be handled using
|
|
119
|
+
// s2pred::ExpensiveSign().
|
|
120
|
+
return S2Point(0, 0, 1);
|
|
121
|
+
#else
|
|
122
|
+
// The origin should not be a point that is commonly used in edge tests in
|
|
123
|
+
// order to avoid triggering code to handle degenerate cases. (This rules
|
|
124
|
+
// out the north and south poles.) It should also not be on the boundary of
|
|
125
|
+
// any low-level S2Cell for the same reason.
|
|
126
|
+
//
|
|
127
|
+
// The point chosen here is about 66km from the north pole towards the East
|
|
128
|
+
// Siberian Sea. See the unittest for more details. It is written out
|
|
129
|
+
// explicitly using floating-point literals because the optimizer doesn't
|
|
130
|
+
// seem willing to evaluate Normalize() at compile time.
|
|
131
|
+
return S2Point(-0.0099994664350250197, 0.0025924542609324121,
|
|
132
|
+
0.99994664350250195);
|
|
133
|
+
#endif
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
} // namespace S2
|
|
137
|
+
|
|
138
|
+
#endif // S2_S2POINTUTIL_H_
|
|
@@ -0,0 +1,157 @@
|
|
|
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/s2pointutil.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
#include "s2/s2cell.h"
|
|
22
|
+
#include "s2/s2coords.h"
|
|
23
|
+
#include "s2/s2edge_distances.h"
|
|
24
|
+
#include "s2/s2latlng.h"
|
|
25
|
+
#include "s2/s2measures.h"
|
|
26
|
+
#include "s2/s2predicates.h"
|
|
27
|
+
#include "s2/s2testing.h"
|
|
28
|
+
|
|
29
|
+
TEST(S2, Frames) {
|
|
30
|
+
Matrix3x3_d m;
|
|
31
|
+
S2Point z = S2Point(0.2, 0.5, -3.3).Normalize();
|
|
32
|
+
S2::GetFrame(z, &m);
|
|
33
|
+
EXPECT_TRUE(S2::ApproxEquals(m.Col(2), z));
|
|
34
|
+
EXPECT_TRUE(S2::IsUnitLength(m.Col(0)));
|
|
35
|
+
EXPECT_TRUE(S2::IsUnitLength(m.Col(1)));
|
|
36
|
+
EXPECT_DOUBLE_EQ(m.Det(), 1);
|
|
37
|
+
|
|
38
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::ToFrame(m, m.Col(0)), S2Point(1, 0, 0)));
|
|
39
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::ToFrame(m, m.Col(1)), S2Point(0, 1, 0)));
|
|
40
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::ToFrame(m, m.Col(2)), S2Point(0, 0, 1)));
|
|
41
|
+
|
|
42
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::FromFrame(m, S2Point(1, 0, 0)), m.Col(0)));
|
|
43
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::FromFrame(m, S2Point(0, 1, 0)), m.Col(1)));
|
|
44
|
+
EXPECT_TRUE(S2::ApproxEquals(S2::FromFrame(m, S2Point(0, 0, 1)), m.Col(2)));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
static void TestRotate(const S2Point& p, const S2Point& axis, S1Angle angle) {
|
|
48
|
+
S2Point result = S2::Rotate(p, axis, angle);
|
|
49
|
+
|
|
50
|
+
// "result" should be unit length.
|
|
51
|
+
EXPECT_TRUE(S2::IsUnitLength(result));
|
|
52
|
+
|
|
53
|
+
// "result" and "p" should be the same distance from "axis".
|
|
54
|
+
double kMaxPositionError = 1e-15;
|
|
55
|
+
EXPECT_LE((S1Angle(result, axis) - S1Angle(p, axis)).abs().radians(),
|
|
56
|
+
kMaxPositionError);
|
|
57
|
+
|
|
58
|
+
// Check that the rotation angle is correct. We allow a fixed error in the
|
|
59
|
+
// *position* of the result, so we need to convert this into a rotation
|
|
60
|
+
// angle. The allowable error can be very large as "p" approaches "axis".
|
|
61
|
+
double axis_distance = p.CrossProd(axis).Norm();
|
|
62
|
+
double max_rotation_error;
|
|
63
|
+
if (axis_distance < kMaxPositionError) {
|
|
64
|
+
max_rotation_error = 2 * M_PI;
|
|
65
|
+
} else {
|
|
66
|
+
max_rotation_error = asin(kMaxPositionError / axis_distance);
|
|
67
|
+
}
|
|
68
|
+
double actual_rotation = S2::TurnAngle(p, axis, result) + M_PI;
|
|
69
|
+
double rotation_error = remainder(angle.radians() - actual_rotation,
|
|
70
|
+
2 * M_PI);
|
|
71
|
+
EXPECT_LE(rotation_error, max_rotation_error);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
TEST(S2, Rotate) {
|
|
75
|
+
for (int iter = 0; iter < 1000; ++iter) {
|
|
76
|
+
S2Point axis = S2Testing::RandomPoint();
|
|
77
|
+
S2Point target = S2Testing::RandomPoint();
|
|
78
|
+
// Choose a distance whose logarithm is uniformly distributed.
|
|
79
|
+
double distance = M_PI * pow(1e-15, S2Testing::rnd.RandDouble());
|
|
80
|
+
// Sometimes choose points near the far side of the axis.
|
|
81
|
+
if (S2Testing::rnd.OneIn(5)) distance = M_PI - distance;
|
|
82
|
+
S2Point p = S2::InterpolateAtDistance(S1Angle::Radians(distance),
|
|
83
|
+
axis, target);
|
|
84
|
+
// Choose the rotation angle.
|
|
85
|
+
double angle = 2 * M_PI * pow(1e-15, S2Testing::rnd.RandDouble());
|
|
86
|
+
if (S2Testing::rnd.OneIn(3)) angle = -angle;
|
|
87
|
+
if (S2Testing::rnd.OneIn(10)) angle = 0;
|
|
88
|
+
TestRotate(p, axis, S1Angle::Radians(angle));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Given a point P, return the minimum level at which an edge of some S2Cell
|
|
93
|
+
// parent of P is nearly collinear with S2::Origin(). This is the minimum
|
|
94
|
+
// level for which Sign() may need to resort to expensive calculations in
|
|
95
|
+
// order to determine which side of an edge the origin lies on.
|
|
96
|
+
static int GetMinExpensiveLevel(const S2Point& p) {
|
|
97
|
+
S2CellId id(p);
|
|
98
|
+
for (int level = 0; level <= S2CellId::kMaxLevel; ++level) {
|
|
99
|
+
S2Cell cell(id.parent(level));
|
|
100
|
+
for (int k = 0; k < 4; ++k) {
|
|
101
|
+
S2Point a = cell.GetVertex(k);
|
|
102
|
+
S2Point b = cell.GetVertex(k + 1);
|
|
103
|
+
if (s2pred::TriageSign(a, b, S2::Origin(), a.CrossProd(b)) == 0) {
|
|
104
|
+
return level;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return S2CellId::kMaxLevel + 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
TEST(S2, OriginTest) {
|
|
112
|
+
// To minimize the number of expensive Sign() calculations,
|
|
113
|
+
// S2::Origin() should not be nearly collinear with any commonly used edges.
|
|
114
|
+
// Two important categories of such edges are:
|
|
115
|
+
//
|
|
116
|
+
// - edges along a line of longitude (reasonably common geographically)
|
|
117
|
+
// - S2Cell edges (used extensively when computing S2Cell coverings)
|
|
118
|
+
//
|
|
119
|
+
// This implies that the origin:
|
|
120
|
+
//
|
|
121
|
+
// - should not be too close to either pole (since all lines of longitude
|
|
122
|
+
// converge at the poles)
|
|
123
|
+
// - should not be colinear with edges of any S2Cell except for very small
|
|
124
|
+
// ones (which are used less frequently)
|
|
125
|
+
//
|
|
126
|
+
// The point chosen below is about 66km from the north pole towards the East
|
|
127
|
+
// Siberian Sea. The purpose of the STtoUV(2/3) calculation is to keep the
|
|
128
|
+
// origin as far away as possible from the longitudinal edges of large
|
|
129
|
+
// S2Cells. (The line of longitude through the chosen point is always 1/3
|
|
130
|
+
// or 2/3 of the way across any S2Cell with longitudinal edges that it
|
|
131
|
+
// passes through.)
|
|
132
|
+
|
|
133
|
+
EXPECT_EQ(S2Point(-0.01, 0.01 * S2::STtoUV(2./3), 1).Normalize(),
|
|
134
|
+
S2::Origin());
|
|
135
|
+
|
|
136
|
+
// Check that the origin is not too close to either pole. (We don't use
|
|
137
|
+
// S2Earth because we don't want to depend on that package.)
|
|
138
|
+
double distance_km = acos(S2::Origin().z()) * S2Testing::kEarthRadiusKm;
|
|
139
|
+
EXPECT_GE(distance_km, 50.0);
|
|
140
|
+
S2_LOG(INFO) << "\nS2::Origin() coordinates: " << S2LatLng(S2::Origin())
|
|
141
|
+
<< ", distance from pole: " << distance_km << " km";
|
|
142
|
+
|
|
143
|
+
// Check that S2::Origin() is not collinear with the edges of any large
|
|
144
|
+
// S2Cell. We do this is two parts. For S2Cells that belong to either
|
|
145
|
+
// polar face, we simply need to check that S2::Origin() is not nearly
|
|
146
|
+
// collinear with any edge of any cell that contains it (except for small
|
|
147
|
+
// cells < 3 meters across).
|
|
148
|
+
EXPECT_GE(GetMinExpensiveLevel(S2::Origin()), 22);
|
|
149
|
+
|
|
150
|
+
// For S2Cells that belong to the four non-polar faces, only longitudinal
|
|
151
|
+
// edges can possibly be colinear with S2::Origin(). We check these edges
|
|
152
|
+
// by projecting S2::Origin() onto the equator, and then testing all S2Cells
|
|
153
|
+
// that contain this point to make sure that none of their edges are nearly
|
|
154
|
+
// colinear with S2::Origin() (except for small cells < 3 meters across).
|
|
155
|
+
S2Point equator_point(S2::Origin().x(), S2::Origin().y(), 0);
|
|
156
|
+
EXPECT_GE(GetMinExpensiveLevel(equator_point), 22);
|
|
157
|
+
}
|