@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,367 @@
|
|
|
1
|
+
// Copyright 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
|
+
#include "s2/s2max_distance_targets.h"
|
|
17
|
+
|
|
18
|
+
#include <vector>
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
#include "s2/util/gtl/btree_set.h"
|
|
22
|
+
#include "s2/mutable_s2shape_index.h"
|
|
23
|
+
#include "s2/s1angle.h"
|
|
24
|
+
#include "s2/s2cap.h"
|
|
25
|
+
#include "s2/s2cell.h"
|
|
26
|
+
#include "s2/s2edge_distances.h"
|
|
27
|
+
#include "s2/s2lax_polygon_shape.h"
|
|
28
|
+
#include "s2/s2point_vector_shape.h"
|
|
29
|
+
#include "s2/s2polygon.h"
|
|
30
|
+
#include "s2/s2shape_index.h"
|
|
31
|
+
#include "s2/s2testing.h"
|
|
32
|
+
#include "s2/s2text_format.h"
|
|
33
|
+
|
|
34
|
+
using absl::make_unique;
|
|
35
|
+
using s2textformat::MakeIndexOrDie;
|
|
36
|
+
using s2textformat::MakePointOrDie;
|
|
37
|
+
using s2textformat::ParsePointsOrDie;
|
|
38
|
+
using std::vector;
|
|
39
|
+
|
|
40
|
+
TEST(CellTarget, GetCapBound) {
|
|
41
|
+
for (int i = 0; i < 100; i++) {
|
|
42
|
+
S2Cell cell = S2Cell{S2Testing::GetRandomCellId()};
|
|
43
|
+
S2MaxDistanceCellTarget target(cell);
|
|
44
|
+
S2Cap cap = target.GetCapBound();
|
|
45
|
+
|
|
46
|
+
for (int j = 0; j < 100; j++) {
|
|
47
|
+
S2Point p_test = S2Testing::RandomPoint();
|
|
48
|
+
// Check points outside of cap to be away from S2MaxDistance::Zero().
|
|
49
|
+
if (!(cap.Contains(p_test))) {
|
|
50
|
+
S1ChordAngle dist = cell.GetMaxDistance(p_test);
|
|
51
|
+
EXPECT_TRUE(S2MaxDistance::Zero() < S2MaxDistance(dist));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
TEST(IndexTarget, GetCapBound) {
|
|
58
|
+
auto index = make_unique<MutableS2ShapeIndex>();
|
|
59
|
+
|
|
60
|
+
S2Polygon polygon(S2Cell{S2Testing::GetRandomCellId()});
|
|
61
|
+
index->Add(make_unique<S2Polygon::Shape>(&polygon));
|
|
62
|
+
|
|
63
|
+
S2Point p = S2Testing::RandomPoint();
|
|
64
|
+
vector<S2Point> pts = {p};
|
|
65
|
+
index->Add(make_unique<S2PointVectorShape>(pts));
|
|
66
|
+
|
|
67
|
+
S2MaxDistanceShapeIndexTarget target(index.get());
|
|
68
|
+
S2Cap cap = target.GetCapBound();
|
|
69
|
+
|
|
70
|
+
for (int j = 0; j < 100; j++) {
|
|
71
|
+
S2Point p_test = S2Testing::RandomPoint();
|
|
72
|
+
// Check points outside of cap to be away from S2MaxDistance::Zero().
|
|
73
|
+
if (!(cap.Contains(p_test))) {
|
|
74
|
+
S2MaxDistance cur_dist = S2MaxDistance::Infinity();
|
|
75
|
+
EXPECT_TRUE(target.UpdateMinDistance(p_test, &cur_dist));
|
|
76
|
+
EXPECT_TRUE(S2MaxDistance::Zero() < cur_dist);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
TEST(PointTarget, UpdateMaxDistance) {
|
|
82
|
+
S2MaxDistancePointTarget target(MakePointOrDie("0:0"));
|
|
83
|
+
S2MaxDistance dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
84
|
+
S2MaxDistance dist10 = S2MaxDistance(S1ChordAngle::Degrees(10));
|
|
85
|
+
|
|
86
|
+
// Update max distance target to point.
|
|
87
|
+
S2Point p = MakePointOrDie("1:0");
|
|
88
|
+
EXPECT_TRUE(target.UpdateMinDistance(p, &dist0));
|
|
89
|
+
EXPECT_NEAR(1.0, S1ChordAngle(dist0).degrees(), 1e-15);
|
|
90
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
91
|
+
|
|
92
|
+
// Reset dist0 which was updated.
|
|
93
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
94
|
+
// Test for edges.
|
|
95
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
96
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist0));
|
|
97
|
+
EXPECT_NEAR(1.0, S1ChordAngle(dist0).degrees(), 1e-15);
|
|
98
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
99
|
+
|
|
100
|
+
// Reset dist0 which was updated.
|
|
101
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
102
|
+
// Test for cell.
|
|
103
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
104
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist0));
|
|
105
|
+
// Leaf cell will be tiny compared to 10 degrees - expect no update.
|
|
106
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist10));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
TEST(PointTarget, UpdateMaxDistanceToEdgeWhenEqual) {
|
|
110
|
+
// Verifies that UpdateMinDistance only returns true when the new distance
|
|
111
|
+
// is greater than the old distance (not greater than or equal to).
|
|
112
|
+
S2MaxDistancePointTarget target(MakePointOrDie("1:0"));
|
|
113
|
+
auto dist = S2MaxDistance::Infinity();
|
|
114
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
115
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
116
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
TEST(PointTarget, UpdateMaxDistanceToCellWhenEqual) {
|
|
120
|
+
S2MaxDistancePointTarget target(MakePointOrDie("1:0"));
|
|
121
|
+
auto dist = S2MaxDistance::Infinity();
|
|
122
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
123
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
124
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
TEST(EdgeTarget, UpdateMaxDistance) {
|
|
128
|
+
auto target_edge = ParsePointsOrDie("0:-1, 0:1");
|
|
129
|
+
S2MaxDistanceEdgeTarget target(target_edge[0], target_edge[1]);
|
|
130
|
+
S2MaxDistance dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
131
|
+
S2MaxDistance dist10 = S2MaxDistance(S1ChordAngle::Degrees(10));
|
|
132
|
+
|
|
133
|
+
// Update max distance target to point.
|
|
134
|
+
S2Point p = MakePointOrDie("0:2");
|
|
135
|
+
EXPECT_TRUE(target.UpdateMinDistance(p, &dist0));
|
|
136
|
+
EXPECT_NEAR(3.0, S1ChordAngle(dist0).degrees(), 1e-15);
|
|
137
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
138
|
+
|
|
139
|
+
// Reset dist0 which was updated.
|
|
140
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
141
|
+
// Test for edges.
|
|
142
|
+
auto test_edge = ParsePointsOrDie("0:2, 0:3");
|
|
143
|
+
EXPECT_TRUE(target.UpdateMinDistance(test_edge[0], test_edge[1], &dist0));
|
|
144
|
+
EXPECT_NEAR(4.0, S1ChordAngle(dist0).degrees(), 1e-15);
|
|
145
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
146
|
+
|
|
147
|
+
// Reset dist0 which was updated.
|
|
148
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
149
|
+
// Test for cell.
|
|
150
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
151
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist0));
|
|
152
|
+
// Leaf cell will be tiny compared to 10 degrees - expect no update.
|
|
153
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist10));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
TEST(EdgeTarget, UpdateMaxDistanceToEdgeWhenEqual) {
|
|
157
|
+
S2MaxDistanceEdgeTarget target(MakePointOrDie("1:0"), MakePointOrDie("1:1"));
|
|
158
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
159
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
160
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
161
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
TEST(EdgeTarget, UpdateMaxDistanceToEdgeAntipodal) {
|
|
165
|
+
S2MaxDistanceEdgeTarget target(MakePointOrDie("0:89"),
|
|
166
|
+
MakePointOrDie("0:91"));
|
|
167
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
168
|
+
auto edge = ParsePointsOrDie("1:-90, -1:-90");
|
|
169
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
170
|
+
EXPECT_EQ(S1ChordAngle(dist), S1ChordAngle::Straight());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
TEST(EdgeTarget, UpdateMaxDistanceToCellWhenEqual) {
|
|
174
|
+
S2MaxDistanceEdgeTarget target(MakePointOrDie("1:0"), MakePointOrDie("1:1"));
|
|
175
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
176
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
177
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
178
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
TEST(CellTarget, UpdateMaxDistance) {
|
|
182
|
+
S2MaxDistanceCellTarget target{S2Cell{S2CellId{MakePointOrDie("0:1")}}};
|
|
183
|
+
S2MaxDistance dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
184
|
+
S2MaxDistance dist10 = S2MaxDistance(S1ChordAngle::Degrees(10));
|
|
185
|
+
|
|
186
|
+
// Update max distance target to point.
|
|
187
|
+
S2Point p = MakePointOrDie("0:0");
|
|
188
|
+
EXPECT_TRUE(target.UpdateMinDistance(p, &dist0));
|
|
189
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
190
|
+
|
|
191
|
+
// Reset dist0 which was updated.
|
|
192
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
193
|
+
// Test for edges.
|
|
194
|
+
auto test_edge = ParsePointsOrDie("0:2, 0:3");
|
|
195
|
+
EXPECT_TRUE(target.UpdateMinDistance(test_edge[0], test_edge[1], &dist0));
|
|
196
|
+
EXPECT_FALSE(target.UpdateMinDistance(p, &dist10));
|
|
197
|
+
|
|
198
|
+
// Reset dist0 which was updated.
|
|
199
|
+
dist0 = S2MaxDistance(S1ChordAngle::Degrees(0));
|
|
200
|
+
// Test for cell.
|
|
201
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
202
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist0));
|
|
203
|
+
// Leaf cell extent will be tiny compared to 10 degrees - expect no update.
|
|
204
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist10));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
TEST(CellTarget, UpdateMaxDistanceToEdgeWhenEqual) {
|
|
208
|
+
S2MaxDistanceCellTarget target{S2Cell{S2CellId{MakePointOrDie("0:1")}}};
|
|
209
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
210
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
211
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
212
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
TEST(CellTarget, UpdateMaxDistanceToCellWhenEqual) {
|
|
216
|
+
S2MaxDistanceCellTarget target{S2Cell{S2CellId{MakePointOrDie("0:1")}}};
|
|
217
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
218
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
219
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
220
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
TEST(ShapeIndexTarget, UpdateMaxDistanceToEdgeWhenEqual) {
|
|
224
|
+
auto target_index = MakeIndexOrDie("1:0 # #");
|
|
225
|
+
S2MaxDistanceShapeIndexTarget target(target_index.get());
|
|
226
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
227
|
+
auto edge = ParsePointsOrDie("0:-1, 0:1");
|
|
228
|
+
EXPECT_TRUE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
229
|
+
EXPECT_FALSE(target.UpdateMinDistance(edge[0], edge[1], &dist));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
TEST(ShapeIndexTarget, UpdateMaxDistanceToCellWhenEqual) {
|
|
233
|
+
auto target_index = MakeIndexOrDie("1:0 # #");
|
|
234
|
+
S2MaxDistanceShapeIndexTarget target(target_index.get());
|
|
235
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
236
|
+
S2Cell cell{S2CellId(MakePointOrDie("0:0"))};
|
|
237
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
238
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
TEST(CellTarget, UpdateMaxDistanceToCellAntipodal) {
|
|
242
|
+
S2Point p = MakePointOrDie("0:0");
|
|
243
|
+
S2MaxDistanceCellTarget target{S2Cell{p}};
|
|
244
|
+
S2MaxDistance dist = S2MaxDistance::Infinity();
|
|
245
|
+
S2Cell cell{-p};
|
|
246
|
+
EXPECT_TRUE(target.UpdateMinDistance(cell, &dist));
|
|
247
|
+
EXPECT_EQ(S1ChordAngle(dist), S1ChordAngle::Straight());
|
|
248
|
+
// Expect a second update to do nothing.
|
|
249
|
+
EXPECT_FALSE(target.UpdateMinDistance(cell, &dist));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
vector<int> GetContainingShapes(S2MaxDistanceTarget* target,
|
|
253
|
+
const S2ShapeIndex& index, int max_shapes) {
|
|
254
|
+
gtl::btree_set<int32> shape_ids;
|
|
255
|
+
(void) target->VisitContainingShapes(
|
|
256
|
+
index, [&shape_ids, max_shapes](S2Shape* containing_shape,
|
|
257
|
+
const S2Point& target_point) {
|
|
258
|
+
shape_ids.insert(containing_shape->id());
|
|
259
|
+
return shape_ids.size() < max_shapes;
|
|
260
|
+
});
|
|
261
|
+
return vector<int>(shape_ids.begin(), shape_ids.end());
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
TEST(PointTarget, VisitContainingShapes) {
|
|
265
|
+
// Only shapes 2 and 4 should contain the target point.
|
|
266
|
+
auto index = MakeIndexOrDie(
|
|
267
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | 0:0, 0:4, 4:0");
|
|
268
|
+
S2Point p = MakePointOrDie("1:1");
|
|
269
|
+
// Test against antipodal point.
|
|
270
|
+
S2MaxDistancePointTarget target(-p);
|
|
271
|
+
EXPECT_EQ((vector<int>{2}), GetContainingShapes(&target, *index, 1));
|
|
272
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target, *index, 5));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
TEST(EdgeTarget, VisitContainingShapes) {
|
|
276
|
+
// Only shapes 2 and 4 should contain the target point.
|
|
277
|
+
auto index = MakeIndexOrDie(
|
|
278
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | 0:0, 0:4, 4:0");
|
|
279
|
+
// Test against antipodal edge.
|
|
280
|
+
auto edge = ParsePointsOrDie("1:2, 2:1");
|
|
281
|
+
S2MaxDistanceEdgeTarget target(-edge[0], -edge[1]);
|
|
282
|
+
EXPECT_EQ((vector<int>{2}), GetContainingShapes(&target, *index, 1));
|
|
283
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target, *index, 5));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
TEST(CellTarget, VisitContainingShapes) {
|
|
287
|
+
auto index = MakeIndexOrDie(
|
|
288
|
+
"1:1 # 1:1, 2:2 # 0:0, 0:3, 3:0 | 6:6, 6:9, 9:6 | -1:-1, -1:5, 5:-1");
|
|
289
|
+
// Only shapes 2 and 4 should contain a very small cell near
|
|
290
|
+
// the antipode of 1:1.
|
|
291
|
+
S2CellId cellid1(-MakePointOrDie("1:1"));
|
|
292
|
+
S2MaxDistanceCellTarget target1{S2Cell(cellid1)};
|
|
293
|
+
EXPECT_EQ((vector<int>{2}), GetContainingShapes(&target1, *index, 1));
|
|
294
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target1, *index, 5));
|
|
295
|
+
|
|
296
|
+
// For a larger antipodal cell that properly contains one or more index
|
|
297
|
+
// cells, all shapes that intersect the first such cell in S2CellId order are
|
|
298
|
+
// returned. In the test below, this happens to again be the 1st and 3rd
|
|
299
|
+
// polygons (whose shape_ids are 2 and 4).
|
|
300
|
+
S2CellId cellid2 = cellid1.parent(5);
|
|
301
|
+
S2MaxDistanceCellTarget target2{S2Cell(cellid2)};
|
|
302
|
+
EXPECT_EQ((vector<int>{2, 4}), GetContainingShapes(&target2, *index, 5));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Negates S2 points to reflect them through the sphere.
|
|
306
|
+
static vector<S2Point> Reflect(const vector<S2Point>& pts) {
|
|
307
|
+
vector<S2Point> negative_pts;
|
|
308
|
+
for (const auto& p : pts) {
|
|
309
|
+
negative_pts.push_back(-p);
|
|
310
|
+
}
|
|
311
|
+
return negative_pts;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
TEST(ShapeIndexTarget, VisitContainingShapes) {
|
|
315
|
+
// Create an index containing a repeated grouping of one point, one
|
|
316
|
+
// polyline, and one polygon.
|
|
317
|
+
auto index = MakeIndexOrDie(
|
|
318
|
+
"1:1 | 4:4 | 7:7 | 10:10 # "
|
|
319
|
+
"1:1, 1:2 | 4:4, 4:5 | 7:7, 7:8 | 10:10, 10:11 # "
|
|
320
|
+
"0:0, 0:3, 3:0 | 3:3, 3:6, 6:3 | 6:6, 6:9, 9:6 | 9:9, 9:12, 12:9");
|
|
321
|
+
|
|
322
|
+
// Construct a target consisting of one point, one polyline, and one polygon
|
|
323
|
+
// with two loops where only the second loop is contained by a polygon in
|
|
324
|
+
// the index above.
|
|
325
|
+
auto target_index = make_unique<MutableS2ShapeIndex>();
|
|
326
|
+
|
|
327
|
+
auto pts = Reflect(ParsePointsOrDie("1:1"));
|
|
328
|
+
target_index->Add(make_unique<S2PointVectorShape>(pts));
|
|
329
|
+
|
|
330
|
+
S2Polyline line(Reflect(ParsePointsOrDie("4:5, 5:4")));
|
|
331
|
+
target_index->Add(make_unique<S2Polyline::Shape>(&line));
|
|
332
|
+
|
|
333
|
+
vector<S2Point> loop1 = Reflect(ParsePointsOrDie("20:20, 20:21, 21:20"));
|
|
334
|
+
vector<S2Point> loop2 = Reflect(ParsePointsOrDie("10:10, 10:11, 11:10"));
|
|
335
|
+
vector<vector<S2Point>> loops = {loop1, loop2};
|
|
336
|
+
target_index->Add(make_unique<S2LaxPolygonShape>(loops));
|
|
337
|
+
|
|
338
|
+
S2MaxDistanceShapeIndexTarget target(target_index.get());
|
|
339
|
+
// These are the shape_ids of the 1st, 2nd, and 4th polygons of "index"
|
|
340
|
+
// (noting that the 4 points are represented by one S2PointVectorShape).
|
|
341
|
+
EXPECT_EQ((vector<int>{5, 6, 8}), GetContainingShapes(&target, *index, 5));
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
TEST(ShapeIndexTarget, VisitContainingShapesEmptyAndFull) {
|
|
345
|
+
// Verify that VisitContainingShapes never returns empty polygons and always
|
|
346
|
+
// returns full polygons (i.e., those containing the entire sphere).
|
|
347
|
+
|
|
348
|
+
// Creating an index containing one empty and one full polygon.
|
|
349
|
+
auto index = MakeIndexOrDie("# # empty | full");
|
|
350
|
+
|
|
351
|
+
// Check only the full polygon is returned for a point target.
|
|
352
|
+
auto point_index = MakeIndexOrDie("1:1 # #");
|
|
353
|
+
S2MaxDistanceShapeIndexTarget point_target(point_index.get());
|
|
354
|
+
EXPECT_EQ((vector<int>{1}), GetContainingShapes(&point_target, *index, 5));
|
|
355
|
+
|
|
356
|
+
// Check only the full polygon is returned for a full polygon target.
|
|
357
|
+
auto full_polygon_index = MakeIndexOrDie("# # full");
|
|
358
|
+
S2MaxDistanceShapeIndexTarget full_target(full_polygon_index.get());
|
|
359
|
+
EXPECT_EQ((vector<int>{1}), GetContainingShapes(&full_target, *index, 5));
|
|
360
|
+
|
|
361
|
+
// Check that nothing is returned for an empty polygon target. (An empty
|
|
362
|
+
// polygon has no connected components and does not intersect anything, so
|
|
363
|
+
// according to the API of GetContainingShapes nothing should be returned.)
|
|
364
|
+
auto empty_polygon_index = MakeIndexOrDie("# # empty");
|
|
365
|
+
S2MaxDistanceShapeIndexTarget empty_target(empty_polygon_index.get());
|
|
366
|
+
EXPECT_EQ((vector<int>{}), GetContainingShapes(&empty_target, *index, 5));
|
|
367
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
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/s2measures.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cmath>
|
|
22
|
+
|
|
23
|
+
#include "s2/s2pointutil.h"
|
|
24
|
+
#include "s2/s2predicates.h"
|
|
25
|
+
|
|
26
|
+
// TODO(ericv): Convert to using s2pred::Sign().
|
|
27
|
+
//#include "util/geometry/s2predicates.h"
|
|
28
|
+
|
|
29
|
+
using std::atan;
|
|
30
|
+
using std::max;
|
|
31
|
+
using std::sqrt;
|
|
32
|
+
using std::tan;
|
|
33
|
+
|
|
34
|
+
namespace S2 {
|
|
35
|
+
|
|
36
|
+
double Angle(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
37
|
+
// RobustCrossProd() is necessary to get good accuracy when two of the input
|
|
38
|
+
// points are very close together.
|
|
39
|
+
return RobustCrossProd(a, b).Angle(RobustCrossProd(c, b));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
double TurnAngle(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
43
|
+
// We use RobustCrossProd() to get good accuracy when two points are very
|
|
44
|
+
// close together, and Sign() to ensure that the sign is correct for
|
|
45
|
+
// turns that are close to 180 degrees.
|
|
46
|
+
//
|
|
47
|
+
// Unfortunately we can't save RobustCrossProd(a, b) and pass it as the
|
|
48
|
+
// optional 4th argument to Sign(), because Sign() requires a.CrossProd(b)
|
|
49
|
+
// exactly (the robust version differs in magnitude).
|
|
50
|
+
double angle = RobustCrossProd(a, b).Angle(RobustCrossProd(b, c));
|
|
51
|
+
|
|
52
|
+
// Don't return Sign() * angle because it is legal to have (a == c).
|
|
53
|
+
return (s2pred::Sign(a, b, c) > 0) ? angle : -angle;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
double Area(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
57
|
+
S2_DCHECK(IsUnitLength(a));
|
|
58
|
+
S2_DCHECK(IsUnitLength(b));
|
|
59
|
+
S2_DCHECK(IsUnitLength(c));
|
|
60
|
+
// This method is based on l'Huilier's theorem,
|
|
61
|
+
//
|
|
62
|
+
// tan(E/4) = sqrt(tan(s/2) tan((s-a)/2) tan((s-b)/2) tan((s-c)/2))
|
|
63
|
+
//
|
|
64
|
+
// where E is the spherical excess of the triangle (i.e. its area),
|
|
65
|
+
// a, b, c, are the side lengths, and
|
|
66
|
+
// s is the semiperimeter (a + b + c) / 2 .
|
|
67
|
+
//
|
|
68
|
+
// The only significant source of error using l'Huilier's method is the
|
|
69
|
+
// cancellation error of the terms (s-a), (s-b), (s-c). This leads to a
|
|
70
|
+
// *relative* error of about 1e-16 * s / min(s-a, s-b, s-c). This compares
|
|
71
|
+
// to a relative error of about 1e-15 / E using Girard's formula, where E is
|
|
72
|
+
// the true area of the triangle. Girard's formula can be even worse than
|
|
73
|
+
// this for very small triangles, e.g. a triangle with a true area of 1e-30
|
|
74
|
+
// might evaluate to 1e-5.
|
|
75
|
+
//
|
|
76
|
+
// So, we prefer l'Huilier's formula unless dmin < s * (0.1 * E), where
|
|
77
|
+
// dmin = min(s-a, s-b, s-c). This basically includes all triangles
|
|
78
|
+
// except for extremely long and skinny ones.
|
|
79
|
+
//
|
|
80
|
+
// Since we don't know E, we would like a conservative upper bound on
|
|
81
|
+
// the triangle area in terms of s and dmin. It's possible to show that
|
|
82
|
+
// E <= k1 * s * sqrt(s * dmin), where k1 = 2*sqrt(3)/Pi (about 1).
|
|
83
|
+
// Using this, it's easy to show that we should always use l'Huilier's
|
|
84
|
+
// method if dmin >= k2 * s^5, where k2 is about 1e-2. Furthermore,
|
|
85
|
+
// if dmin < k2 * s^5, the triangle area is at most k3 * s^4, where
|
|
86
|
+
// k3 is about 0.1. Since the best case error using Girard's formula
|
|
87
|
+
// is about 1e-15, this means that we shouldn't even consider it unless
|
|
88
|
+
// s >= 3e-4 or so.
|
|
89
|
+
//
|
|
90
|
+
// TODO(ericv): Implement rigorous error bounds (analysis already done).
|
|
91
|
+
double sa = b.Angle(c);
|
|
92
|
+
double sb = c.Angle(a);
|
|
93
|
+
double sc = a.Angle(b);
|
|
94
|
+
double s = 0.5 * (sa + sb + sc);
|
|
95
|
+
if (s >= 3e-4) {
|
|
96
|
+
// Consider whether Girard's formula might be more accurate.
|
|
97
|
+
double s2 = s * s;
|
|
98
|
+
double dmin = s - max(sa, max(sb, sc));
|
|
99
|
+
if (dmin < 1e-2 * s * s2 * s2) {
|
|
100
|
+
// This triangle is skinny enough to consider using Girard's formula.
|
|
101
|
+
// We increase the area by the approximate maximum error in the Girard
|
|
102
|
+
// calculation in order to ensure that this test is conservative.
|
|
103
|
+
double area = GirardArea(a, b, c);
|
|
104
|
+
if (dmin < s * (0.1 * (area + 5e-15))) return area;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Use l'Huilier's formula.
|
|
108
|
+
return 4 * atan(sqrt(max(0.0, tan(0.5 * s) * tan(0.5 * (s - sa)) *
|
|
109
|
+
tan(0.5 * (s - sb)) * tan(0.5 * (s - sc)))));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
double GirardArea(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
113
|
+
// This is equivalent to the usual Girard's formula but is slightly more
|
|
114
|
+
// accurate, faster to compute, and handles a == b == c without a special
|
|
115
|
+
// case. RobustCrossProd() is necessary to get good accuracy when two of
|
|
116
|
+
// the input points are very close together.
|
|
117
|
+
|
|
118
|
+
Vector3_d ab = RobustCrossProd(a, b);
|
|
119
|
+
Vector3_d bc = RobustCrossProd(b, c);
|
|
120
|
+
Vector3_d ac = RobustCrossProd(a, c);
|
|
121
|
+
return max(0.0, ab.Angle(ac) - ab.Angle(bc) + bc.Angle(ac));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
double SignedArea(const S2Point& a, const S2Point& b, const S2Point& c) {
|
|
125
|
+
return s2pred::Sign(a, b, c) * Area(a, b, c);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
} // namespace S2
|
|
@@ -0,0 +1,78 @@
|
|
|
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 various angle and area measures on the sphere. Also see
|
|
19
|
+
// s2edge_distances.h, s2loop_measures.h, and s2polyline_measures.h.
|
|
20
|
+
|
|
21
|
+
#ifndef S2_S2MEASURES_H_
|
|
22
|
+
#define S2_S2MEASURES_H_
|
|
23
|
+
|
|
24
|
+
#include "s2/s2point.h"
|
|
25
|
+
|
|
26
|
+
namespace S2 {
|
|
27
|
+
|
|
28
|
+
// Return the interior angle at the vertex B in the triangle ABC. The
|
|
29
|
+
// return value is always in the range [0, Pi]. All points should be
|
|
30
|
+
// normalized. Ensures that Angle(a,b,c) == Angle(c,b,a) for all a,b,c.
|
|
31
|
+
//
|
|
32
|
+
// The angle is undefined if A or C is diametrically opposite from B, and
|
|
33
|
+
// becomes numerically unstable as the length of edge AB or BC approaches
|
|
34
|
+
// 180 degrees.
|
|
35
|
+
double Angle(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
36
|
+
|
|
37
|
+
// Return the exterior angle at vertex B in the triangle ABC. The return
|
|
38
|
+
// value is positive if ABC is counterclockwise and negative otherwise. If
|
|
39
|
+
// you imagine an ant walking from A to B to C, this is the angle that the
|
|
40
|
+
// ant turns at vertex B (positive = left = CCW, negative = right = CW).
|
|
41
|
+
// This quantity is also known as the "geodesic curvature" at B.
|
|
42
|
+
//
|
|
43
|
+
// Ensures that TurnAngle(a,b,c) == -TurnAngle(c,b,a) for all distinct
|
|
44
|
+
// a,b,c. The result is undefined if (a == b || b == c), but is either
|
|
45
|
+
// -Pi or Pi if (a == c). All points should be normalized.
|
|
46
|
+
double TurnAngle(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
47
|
+
|
|
48
|
+
// Return the area of triangle ABC. This method combines two different
|
|
49
|
+
// algorithms to get accurate results for both large and small triangles.
|
|
50
|
+
// The maximum error is about 5e-15 (about 0.25 square meters on the Earth's
|
|
51
|
+
// surface), the same as GirardArea() below, but unlike that method it is
|
|
52
|
+
// also accurate for small triangles. Example: when the true area is 100
|
|
53
|
+
// square meters, Area() yields an error about 1 trillion times smaller than
|
|
54
|
+
// GirardArea().
|
|
55
|
+
//
|
|
56
|
+
// All points should be unit length, and no two points should be antipodal.
|
|
57
|
+
// The area is always positive.
|
|
58
|
+
double Area(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
59
|
+
|
|
60
|
+
// Return the area of the triangle computed using Girard's formula. All
|
|
61
|
+
// points should be unit length, and no two points should be antipodal.
|
|
62
|
+
//
|
|
63
|
+
// This method is about twice as fast as Area() but has poor relative
|
|
64
|
+
// accuracy for small triangles. The maximum error is about 5e-15 (about
|
|
65
|
+
// 0.25 square meters on the Earth's surface) and the average error is about
|
|
66
|
+
// 1e-15. These bounds apply to triangles of any size, even as the maximum
|
|
67
|
+
// edge length of the triangle approaches 180 degrees. But note that for
|
|
68
|
+
// such triangles, tiny perturbations of the input points can change the
|
|
69
|
+
// true mathematical area dramatically.
|
|
70
|
+
double GirardArea(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
71
|
+
|
|
72
|
+
// Like Area(), but returns a positive value for counterclockwise triangles
|
|
73
|
+
// and a negative value otherwise.
|
|
74
|
+
double SignedArea(const S2Point& a, const S2Point& b, const S2Point& c);
|
|
75
|
+
|
|
76
|
+
} // namespace S2
|
|
77
|
+
|
|
78
|
+
#endif // S2_S2MEASURES_H_
|