@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,135 @@
|
|
|
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 <cmath>
|
|
21
|
+
|
|
22
|
+
#include <gtest/gtest.h>
|
|
23
|
+
#include "s2/s2latlng.h"
|
|
24
|
+
#include "s2/s2testing.h"
|
|
25
|
+
|
|
26
|
+
using std::fabs;
|
|
27
|
+
|
|
28
|
+
TEST(S2, AngleMethods) {
|
|
29
|
+
S2Point pz(0, 0, 1);
|
|
30
|
+
S2Point p000(1, 0, 0);
|
|
31
|
+
S2Point p045 = S2Point(1, 1, 0).Normalize();
|
|
32
|
+
S2Point p090(0, 1, 0);
|
|
33
|
+
S2Point p180(-1, 0, 0);
|
|
34
|
+
|
|
35
|
+
EXPECT_DOUBLE_EQ(S2::Angle(p000, pz, p045), M_PI_4);
|
|
36
|
+
EXPECT_DOUBLE_EQ(S2::TurnAngle(p000, pz, p045), -3 * M_PI_4);
|
|
37
|
+
|
|
38
|
+
EXPECT_DOUBLE_EQ(S2::Angle(p045, pz, p180), 3 * M_PI_4);
|
|
39
|
+
EXPECT_DOUBLE_EQ(S2::TurnAngle(p045, pz, p180), -M_PI_4);
|
|
40
|
+
|
|
41
|
+
EXPECT_DOUBLE_EQ(S2::Angle(p000, pz, p180), M_PI);
|
|
42
|
+
EXPECT_DOUBLE_EQ(S2::TurnAngle(p000, pz, p180), 0);
|
|
43
|
+
|
|
44
|
+
EXPECT_DOUBLE_EQ(S2::Angle(pz, p000, p045), M_PI_2);
|
|
45
|
+
EXPECT_DOUBLE_EQ(S2::TurnAngle(pz, p000, p045), M_PI_2);
|
|
46
|
+
|
|
47
|
+
EXPECT_DOUBLE_EQ(S2::Angle(pz, p000, pz), 0);
|
|
48
|
+
EXPECT_DOUBLE_EQ(fabs(S2::TurnAngle(pz, p000, pz)), M_PI);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
TEST(S2, AreaMethods) {
|
|
52
|
+
S2Point pz(0, 0, 1);
|
|
53
|
+
S2Point p000(1, 0, 0);
|
|
54
|
+
S2Point p045 = S2Point(1, 1, 0).Normalize();
|
|
55
|
+
S2Point p090(0, 1, 0);
|
|
56
|
+
S2Point p180(-1, 0, 0);
|
|
57
|
+
|
|
58
|
+
EXPECT_DOUBLE_EQ(S2::Area(p000, p090, pz), M_PI_2);
|
|
59
|
+
EXPECT_DOUBLE_EQ(S2::Area(p045, pz, p180), 3 * M_PI_4);
|
|
60
|
+
|
|
61
|
+
// Make sure that Area() has good *relative* accuracy even for
|
|
62
|
+
// very small areas.
|
|
63
|
+
static const double eps = 1e-10;
|
|
64
|
+
S2Point pepsx = S2Point(eps, 0, 1).Normalize();
|
|
65
|
+
S2Point pepsy = S2Point(0, eps, 1).Normalize();
|
|
66
|
+
double expected1 = 0.5 * eps * eps;
|
|
67
|
+
EXPECT_NEAR(S2::Area(pepsx, pepsy, pz), expected1, 1e-14 * expected1);
|
|
68
|
+
|
|
69
|
+
// Make sure that it can handle degenerate triangles.
|
|
70
|
+
S2Point pr = S2Point(0.257, -0.5723, 0.112).Normalize();
|
|
71
|
+
S2Point pq = S2Point(-0.747, 0.401, 0.2235).Normalize();
|
|
72
|
+
EXPECT_EQ(S2::Area(pr, pr, pr), 0);
|
|
73
|
+
// The following test is not exact due to rounding error.
|
|
74
|
+
EXPECT_NEAR(S2::Area(pr, pq, pr), 0, 1e-15);
|
|
75
|
+
EXPECT_EQ(S2::Area(p000, p045, p090), 0);
|
|
76
|
+
|
|
77
|
+
double max_girard = 0;
|
|
78
|
+
for (int i = 0; i < 10000; ++i) {
|
|
79
|
+
S2Point p0 = S2Testing::RandomPoint();
|
|
80
|
+
S2Point d1 = S2Testing::RandomPoint();
|
|
81
|
+
S2Point d2 = S2Testing::RandomPoint();
|
|
82
|
+
S2Point p1 = (p0 + 1e-15 * d1).Normalize();
|
|
83
|
+
S2Point p2 = (p0 + 1e-15 * d2).Normalize();
|
|
84
|
+
// The actual displacement can be as much as 1.2e-15 due to roundoff.
|
|
85
|
+
// This yields a maximum triangle area of about 0.7e-30.
|
|
86
|
+
EXPECT_LE(S2::Area(p0, p1, p2), 0.7e-30);
|
|
87
|
+
max_girard = std::max(max_girard, S2::GirardArea(p0, p1, p2));
|
|
88
|
+
}
|
|
89
|
+
// This check only passes if GirardArea() uses RobustCrossProd().
|
|
90
|
+
S2_LOG(INFO) << "Worst case Girard for triangle area 1e-30: " << max_girard;
|
|
91
|
+
EXPECT_LE(max_girard, 1e-14);
|
|
92
|
+
|
|
93
|
+
// Try a very long and skinny triangle.
|
|
94
|
+
S2Point p045eps = S2Point(1, 1, eps).Normalize();
|
|
95
|
+
double expected2 = 5.8578643762690495119753e-11; // Mathematica.
|
|
96
|
+
EXPECT_NEAR(S2::Area(p000, p045eps, p090), expected2, 1e-9 * expected2);
|
|
97
|
+
|
|
98
|
+
// Triangles with near-180 degree edges that sum to a quarter-sphere.
|
|
99
|
+
static const double eps2 = 1e-14;
|
|
100
|
+
S2Point p000eps2 = S2Point(1, 0.1*eps2, eps2).Normalize();
|
|
101
|
+
double quarter_area1 = S2::Area(p000eps2, p000, p045) +
|
|
102
|
+
S2::Area(p000eps2, p045, p180) +
|
|
103
|
+
S2::Area(p000eps2, p180, pz) +
|
|
104
|
+
S2::Area(p000eps2, pz, p000);
|
|
105
|
+
EXPECT_DOUBLE_EQ(quarter_area1, M_PI);
|
|
106
|
+
|
|
107
|
+
// Four other triangles that sum to a quarter-sphere.
|
|
108
|
+
S2Point p045eps2 = S2Point(1, 1, eps2).Normalize();
|
|
109
|
+
double quarter_area2 = S2::Area(p045eps2, p000, p045) +
|
|
110
|
+
S2::Area(p045eps2, p045, p180) +
|
|
111
|
+
S2::Area(p045eps2, p180, pz) +
|
|
112
|
+
S2::Area(p045eps2, pz, p000);
|
|
113
|
+
EXPECT_DOUBLE_EQ(quarter_area2, M_PI);
|
|
114
|
+
|
|
115
|
+
// Compute the area of a hemisphere using four triangles with one near-180
|
|
116
|
+
// degree edge and one near-degenerate edge.
|
|
117
|
+
for (int i = 0; i < 100; ++i) {
|
|
118
|
+
double lng = 2 * M_PI * S2Testing::rnd.RandDouble();
|
|
119
|
+
S2Point p0 = S2LatLng::FromRadians(1e-20, lng).Normalized().ToPoint();
|
|
120
|
+
S2Point p1 = S2LatLng::FromRadians(0, lng).Normalized().ToPoint();
|
|
121
|
+
double p2_lng = lng + S2Testing::rnd.RandDouble();
|
|
122
|
+
S2Point p2 = S2LatLng::FromRadians(0, p2_lng).Normalized().ToPoint();
|
|
123
|
+
S2Point p3 = S2LatLng::FromRadians(0, lng + M_PI).Normalized().ToPoint();
|
|
124
|
+
S2Point p4 = S2LatLng::FromRadians(0, lng + 5.0).Normalized().ToPoint();
|
|
125
|
+
double area = (S2::Area(p0, p1, p2) + S2::Area(p0, p2, p3) +
|
|
126
|
+
S2::Area(p0, p3, p4) + S2::Area(p0, p4, p1));
|
|
127
|
+
EXPECT_NEAR(area, 2 * M_PI, 2e-15);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// This tests a case where the triangle has zero area, but S2::Area()
|
|
131
|
+
// computes (dmin > 0) due to rounding errors.
|
|
132
|
+
EXPECT_EQ(0.0, S2::Area(S2LatLng::FromDegrees(-45, -170).ToPoint(),
|
|
133
|
+
S2LatLng::FromDegrees(45, -170).ToPoint(),
|
|
134
|
+
S2LatLng::FromDegrees(0, -170).ToPoint()));
|
|
135
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
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
|
+
// All of the values below were obtained by a combination of hand analysis and
|
|
19
|
+
// Mathematica. In general, S2_TAN_PROJECTION produces the most uniform
|
|
20
|
+
// shapes and sizes of cells, S2_LINEAR_PROJECTION is considerably worse, and
|
|
21
|
+
// S2_QUADRATIC_PROJECTION is somewhere in between (but generally closer to
|
|
22
|
+
// the tangent projection than the linear one).
|
|
23
|
+
//
|
|
24
|
+
// Note that S2_LINEAR_PROJECTION can be useful for analysis even when another
|
|
25
|
+
// projection is being used, since it allows many cell metrics to be bounded
|
|
26
|
+
// in terms of (u,v) coordinates rather than (s,t) coordinates. (With the
|
|
27
|
+
// linear projection, u = 2 * s - 1 and similarly for v.) Similarly,
|
|
28
|
+
// S2_TAN_PROJECTION allows cell metrics to be bounded in terms of (u,v)
|
|
29
|
+
// coordinate changes when they are measured as distances on the unit sphere.
|
|
30
|
+
|
|
31
|
+
#include "s2/s2metrics.h"
|
|
32
|
+
|
|
33
|
+
namespace S2 {
|
|
34
|
+
|
|
35
|
+
const LengthMetric kMinAngleSpan(
|
|
36
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.0 : // 1.000
|
|
37
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / 2 : // 1.571
|
|
38
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 4. / 3 : // 1.333
|
|
39
|
+
0);
|
|
40
|
+
|
|
41
|
+
const LengthMetric kMaxAngleSpan(
|
|
42
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 : // 2.000
|
|
43
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / 2 : // 1.571
|
|
44
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.704897179199218452 : // 1.705
|
|
45
|
+
0);
|
|
46
|
+
|
|
47
|
+
const LengthMetric kAvgAngleSpan(M_PI / 2); // 1.571
|
|
48
|
+
// This is true for all projections.
|
|
49
|
+
|
|
50
|
+
const LengthMetric kMinWidth(
|
|
51
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? sqrt(2. / 3) : // 0.816
|
|
52
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / (2 * sqrt(2)) : // 1.111
|
|
53
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
|
|
54
|
+
0);
|
|
55
|
+
|
|
56
|
+
const LengthMetric kMaxWidth(kMaxAngleSpan.deriv());
|
|
57
|
+
// This is true for all projections.
|
|
58
|
+
|
|
59
|
+
const LengthMetric kAvgWidth(
|
|
60
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.411459345844456965 : // 1.411
|
|
61
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? 1.437318638925160885 : // 1.437
|
|
62
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.434523672886099389 : // 1.435
|
|
63
|
+
0);
|
|
64
|
+
|
|
65
|
+
const LengthMetric kMinEdge(
|
|
66
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
|
|
67
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / (2 * sqrt(2)) : // 1.111
|
|
68
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
|
|
69
|
+
0);
|
|
70
|
+
|
|
71
|
+
const LengthMetric kMaxEdge(kMaxAngleSpan.deriv());
|
|
72
|
+
// This is true for all projections.
|
|
73
|
+
|
|
74
|
+
const LengthMetric kAvgEdge(
|
|
75
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.440034192955603643 : // 1.440
|
|
76
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? 1.461667032546739266 : // 1.462
|
|
77
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.459213746386106062 : // 1.459
|
|
78
|
+
0);
|
|
79
|
+
|
|
80
|
+
const LengthMetric kMinDiag(
|
|
81
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
|
|
82
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * sqrt(2) / 3 : // 1.481
|
|
83
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 8 * sqrt(2) / 9 : // 1.257
|
|
84
|
+
0);
|
|
85
|
+
|
|
86
|
+
const LengthMetric kMaxDiag(
|
|
87
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) : // 2.828
|
|
88
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * sqrt(2. / 3) : // 2.565
|
|
89
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.438654594434021032 : // 2.439
|
|
90
|
+
0);
|
|
91
|
+
|
|
92
|
+
const LengthMetric kAvgDiag(
|
|
93
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 2.031817866418812674 : // 2.032
|
|
94
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? 2.063623197195635753 : // 2.064
|
|
95
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.060422738998471683 : // 2.060
|
|
96
|
+
0);
|
|
97
|
+
|
|
98
|
+
const AreaMetric kMinArea(
|
|
99
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 4 / (3 * sqrt(3)) : // 0.770
|
|
100
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? (M_PI*M_PI) / (4*sqrt(2)) : // 1.745
|
|
101
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 8 * sqrt(2) / 9 : // 1.257
|
|
102
|
+
0);
|
|
103
|
+
|
|
104
|
+
const AreaMetric kMaxArea(
|
|
105
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? 4 : // 4.000
|
|
106
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * M_PI / 4 : // 2.467
|
|
107
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.635799256963161491 : // 2.636
|
|
108
|
+
0);
|
|
109
|
+
|
|
110
|
+
const AreaMetric kAvgArea(4 * M_PI / 6); // 2.094
|
|
111
|
+
// This is true for all projections.
|
|
112
|
+
|
|
113
|
+
const double kMaxEdgeAspect = (
|
|
114
|
+
S2_PROJECTION == S2_LINEAR_PROJECTION ? sqrt(2) : // 1.414
|
|
115
|
+
S2_PROJECTION == S2_TAN_PROJECTION ? sqrt(2) : // 1.414
|
|
116
|
+
S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.442615274452682920 : // 1.443
|
|
117
|
+
0);
|
|
118
|
+
|
|
119
|
+
const double kMaxDiagAspect = sqrt(3); // 1.732
|
|
120
|
+
// This is true for all projections.
|
|
121
|
+
|
|
122
|
+
} // namespace S2
|
|
@@ -0,0 +1,199 @@
|
|
|
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
|
+
// The following are various constants that describe the shapes and sizes of
|
|
19
|
+
// S2Cells (see s2coords.h and s2cell_id.h). They are useful for deciding
|
|
20
|
+
// which cell level to use in order to satisfy a given condition (e.g. that
|
|
21
|
+
// cell vertices must be no further than "x" apart). All of the raw constants
|
|
22
|
+
// are differential quantities; you can use the GetValue(level) method to
|
|
23
|
+
// compute the corresponding length or area on the unit sphere for cells at a
|
|
24
|
+
// given level. The minimum and maximum bounds are valid for cells at all
|
|
25
|
+
// levels, but they may be somewhat conservative for very large cells
|
|
26
|
+
// (e.g. face cells).
|
|
27
|
+
|
|
28
|
+
#ifndef S2_S2METRICS_H_
|
|
29
|
+
#define S2_S2METRICS_H_
|
|
30
|
+
|
|
31
|
+
#include <algorithm>
|
|
32
|
+
#include <cmath>
|
|
33
|
+
|
|
34
|
+
#include "s2/s2coords.h"
|
|
35
|
+
#include "s2/util/math/mathutil.h"
|
|
36
|
+
|
|
37
|
+
namespace S2 {
|
|
38
|
+
|
|
39
|
+
// Defines a cell metric of the given dimension (1 == length, 2 == area).
|
|
40
|
+
template <int dim> class Metric {
|
|
41
|
+
public:
|
|
42
|
+
explicit constexpr Metric(double deriv) : deriv_(deriv) {}
|
|
43
|
+
|
|
44
|
+
// The "deriv" value of a metric is a derivative, and must be multiplied by
|
|
45
|
+
// a length or area in (s,t)-space to get a useful value.
|
|
46
|
+
double deriv() const { return deriv_; }
|
|
47
|
+
|
|
48
|
+
// Return the value of a metric for cells at the given level. The value is
|
|
49
|
+
// either a length or an area on the unit sphere, depending on the
|
|
50
|
+
// particular metric.
|
|
51
|
+
double GetValue(int level) const { return ldexp(deriv_, - dim * level); }
|
|
52
|
+
|
|
53
|
+
// Return the level at which the metric has approximately the given
|
|
54
|
+
// value. For example, S2::kAvgEdge.GetClosestLevel(0.1) returns the
|
|
55
|
+
// level at which the average cell edge length is approximately 0.1.
|
|
56
|
+
// The return value is always a valid level.
|
|
57
|
+
int GetClosestLevel(double value) const;
|
|
58
|
+
|
|
59
|
+
// Return the minimum level such that the metric is at most the given
|
|
60
|
+
// value, or S2CellId::kMaxLevel if there is no such level. For example,
|
|
61
|
+
// S2::kMaxDiag.GetLevelForMaxValue(0.1) returns the minimum level such
|
|
62
|
+
// that all cell diagonal lengths are 0.1 or smaller. The return value
|
|
63
|
+
// is always a valid level.
|
|
64
|
+
int GetLevelForMaxValue(double value) const;
|
|
65
|
+
|
|
66
|
+
// Return the maximum level such that the metric is at least the given
|
|
67
|
+
// value, or zero if there is no such level. For example,
|
|
68
|
+
// S2::kMinWidth.GetLevelForMinValue(0.1) returns the maximum level such
|
|
69
|
+
// that all cells have a minimum width of 0.1 or larger. The return value
|
|
70
|
+
// is always a valid level.
|
|
71
|
+
int GetLevelForMinValue(double value) const;
|
|
72
|
+
|
|
73
|
+
private:
|
|
74
|
+
const double deriv_;
|
|
75
|
+
|
|
76
|
+
Metric(const Metric&) = delete;
|
|
77
|
+
void operator=(const Metric&) = delete;
|
|
78
|
+
};
|
|
79
|
+
using LengthMetric = Metric<1>;
|
|
80
|
+
using AreaMetric = Metric<2>;
|
|
81
|
+
|
|
82
|
+
// Each cell is bounded by four planes passing through its four edges and
|
|
83
|
+
// the center of the sphere. These metrics relate to the angle between each
|
|
84
|
+
// pair of opposite bounding planes, or equivalently, between the planes
|
|
85
|
+
// corresponding to two different s-values or two different t-values. For
|
|
86
|
+
// example, the maximum angle between opposite bounding planes for a cell at
|
|
87
|
+
// level k is kMaxAngleSpan.GetValue(k), and the average angle span for all
|
|
88
|
+
// cells at level k is approximately kAvgAngleSpan.GetValue(k).
|
|
89
|
+
extern const LengthMetric kMinAngleSpan;
|
|
90
|
+
extern const LengthMetric kMaxAngleSpan;
|
|
91
|
+
extern const LengthMetric kAvgAngleSpan;
|
|
92
|
+
|
|
93
|
+
// The width of geometric figure is defined as the distance between two
|
|
94
|
+
// parallel bounding lines in a given direction. For cells, the minimum
|
|
95
|
+
// width is always attained between two opposite edges, and the maximum
|
|
96
|
+
// width is attained between two opposite vertices. However, for our
|
|
97
|
+
// purposes we redefine the width of a cell as the perpendicular distance
|
|
98
|
+
// between a pair of opposite edges. A cell therefore has two widths, one
|
|
99
|
+
// in each direction. The minimum width according to this definition agrees
|
|
100
|
+
// with the classic geometric one, but the maximum width is different. (The
|
|
101
|
+
// maximum geometric width corresponds to kMaxDiag defined below.)
|
|
102
|
+
//
|
|
103
|
+
// For a cell at level k, the distance between opposite edges is at least
|
|
104
|
+
// kMinWidth.GetValue(k) and at most kMaxWidth.GetValue(k). The average
|
|
105
|
+
// width in both directions for all cells at level k is approximately
|
|
106
|
+
// kAvgWidth.GetValue(k).
|
|
107
|
+
//
|
|
108
|
+
// The width is useful for bounding the minimum or maximum distance from a
|
|
109
|
+
// point on one edge of a cell to the closest point on the opposite edge.
|
|
110
|
+
// For example, this is useful when "growing" regions by a fixed distance.
|
|
111
|
+
//
|
|
112
|
+
// Note that because S2Cells are not usually rectangles, the minimum width of
|
|
113
|
+
// a cell is generally smaller than its minimum edge length. (The interior
|
|
114
|
+
// angles of an S2Cell range from 60 to 120 degrees.)
|
|
115
|
+
extern const LengthMetric kMinWidth;
|
|
116
|
+
extern const LengthMetric kMaxWidth;
|
|
117
|
+
extern const LengthMetric kAvgWidth;
|
|
118
|
+
|
|
119
|
+
// The minimum edge length of any cell at level k is at least
|
|
120
|
+
// kMinEdge.GetValue(k), and the maximum is at most kMaxEdge.GetValue(k).
|
|
121
|
+
// The average edge length is approximately kAvgEdge.GetValue(k).
|
|
122
|
+
//
|
|
123
|
+
// The edge length metrics can also be used to bound the minimum, maximum,
|
|
124
|
+
// or average distance from the center of one cell to the center of one of
|
|
125
|
+
// its edge neighbors. In particular, it can be used to bound the distance
|
|
126
|
+
// between adjacent cell centers along the space-filling Hilbert curve for
|
|
127
|
+
// cells at any given level.
|
|
128
|
+
extern const LengthMetric kMinEdge;
|
|
129
|
+
extern const LengthMetric kMaxEdge;
|
|
130
|
+
extern const LengthMetric kAvgEdge;
|
|
131
|
+
|
|
132
|
+
// The minimum diagonal length of any cell at level k is at least
|
|
133
|
+
// kMinDiag.GetValue(k), and the maximum is at most kMaxDiag.GetValue(k).
|
|
134
|
+
// The average diagonal length is approximately kAvgDiag.GetValue(k).
|
|
135
|
+
//
|
|
136
|
+
// The maximum diagonal also happens to be the maximum diameter of any cell,
|
|
137
|
+
// and also the maximum geometric width (see the discussion above). So for
|
|
138
|
+
// example, the distance from an arbitrary point to the closest cell center
|
|
139
|
+
// at a given level is at most half the maximum diagonal length.
|
|
140
|
+
extern const LengthMetric kMinDiag;
|
|
141
|
+
extern const LengthMetric kMaxDiag;
|
|
142
|
+
extern const LengthMetric kAvgDiag;
|
|
143
|
+
|
|
144
|
+
// The minimum area of any cell at level k is at least kMinArea.GetValue(k),
|
|
145
|
+
// and the maximum is at most kMaxArea.GetValue(k). The average area of all
|
|
146
|
+
// cells at level k is exactly kAvgArea.GetValue(k).
|
|
147
|
+
extern const AreaMetric kMinArea;
|
|
148
|
+
extern const AreaMetric kMaxArea;
|
|
149
|
+
extern const AreaMetric kAvgArea;
|
|
150
|
+
|
|
151
|
+
// This is the maximum edge aspect ratio over all cells at any level, where
|
|
152
|
+
// the edge aspect ratio of a cell is defined as the ratio of its longest
|
|
153
|
+
// edge length to its shortest edge length.
|
|
154
|
+
extern const double kMaxEdgeAspect;
|
|
155
|
+
|
|
156
|
+
// This is the maximum diagonal aspect ratio over all cells at any level,
|
|
157
|
+
// where the diagonal aspect ratio of a cell is defined as the ratio of its
|
|
158
|
+
// longest diagonal length to its shortest diagonal length.
|
|
159
|
+
extern const double kMaxDiagAspect;
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
////////////////// Implementation details follow ////////////////////
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
template <int dim>
|
|
166
|
+
int S2::Metric<dim>::GetLevelForMaxValue(double value) const {
|
|
167
|
+
if (value <= 0) return S2::kMaxCellLevel;
|
|
168
|
+
|
|
169
|
+
// This code is equivalent to computing a floating-point "level"
|
|
170
|
+
// value and rounding up. ilogb() returns the exponent corresponding to a
|
|
171
|
+
// fraction in the range [1,2).
|
|
172
|
+
int level = ilogb(value / deriv_);
|
|
173
|
+
level = std::max(0, std::min(S2::kMaxCellLevel, -(level >> (dim - 1))));
|
|
174
|
+
S2_DCHECK(level == S2::kMaxCellLevel || GetValue(level) <= value);
|
|
175
|
+
S2_DCHECK(level == 0 || GetValue(level - 1) > value);
|
|
176
|
+
return level;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
template <int dim>
|
|
180
|
+
int S2::Metric<dim>::GetLevelForMinValue(double value) const {
|
|
181
|
+
if (value <= 0) return S2::kMaxCellLevel;
|
|
182
|
+
|
|
183
|
+
// This code is equivalent to computing a floating-point "level"
|
|
184
|
+
// value and rounding down.
|
|
185
|
+
int level = ilogb(deriv_ / value);
|
|
186
|
+
level = std::max(0, std::min(S2::kMaxCellLevel, level >> (dim - 1)));
|
|
187
|
+
S2_DCHECK(level == 0 || GetValue(level) >= value);
|
|
188
|
+
S2_DCHECK(level == kMaxCellLevel || GetValue(level + 1) < value);
|
|
189
|
+
return level;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
template <int dim>
|
|
193
|
+
int Metric<dim>::GetClosestLevel(double value) const {
|
|
194
|
+
return GetLevelForMaxValue((dim == 1 ? M_SQRT2 : 2) * value);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
} // namespace S2
|
|
198
|
+
|
|
199
|
+
#endif // S2_S2METRICS_H_
|
|
@@ -0,0 +1,127 @@
|
|
|
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/s2metrics.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
#include "s2/s2coords.h"
|
|
22
|
+
|
|
23
|
+
// Note: obviously, I could have defined a bundle of metrics like this in the
|
|
24
|
+
// S2 class itself rather than just for testing. However, it's not clear that
|
|
25
|
+
// this is useful other than for testing purposes, and I find
|
|
26
|
+
// S2::kMinWidth.GetLevelForMinValue(width) to be slightly more readable than
|
|
27
|
+
// than S2::kWidth.min().GetLevelForMinValue(width). Also, there is no
|
|
28
|
+
// fundamental reason that we need to analyze the minimum, maximum, and average
|
|
29
|
+
// values of every metric; it would be perfectly reasonable to just define
|
|
30
|
+
// one of these.
|
|
31
|
+
template<int dim>
|
|
32
|
+
class MetricBundle {
|
|
33
|
+
public:
|
|
34
|
+
using Metric = S2::Metric<dim>;
|
|
35
|
+
MetricBundle(const Metric& min, const Metric& max, const Metric& avg) :
|
|
36
|
+
min_(min), max_(max), avg_(avg) {}
|
|
37
|
+
const Metric& min_;
|
|
38
|
+
const Metric& max_;
|
|
39
|
+
const Metric& avg_;
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
MetricBundle(const MetricBundle&) = delete;
|
|
43
|
+
void operator=(const MetricBundle&) = delete;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
template<int dim>
|
|
47
|
+
static void CheckMinMaxAvg(const MetricBundle<dim>& bundle) {
|
|
48
|
+
EXPECT_LE(bundle.min_.deriv(), bundle.avg_.deriv());
|
|
49
|
+
EXPECT_LE(bundle.avg_.deriv(), bundle.max_.deriv());
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
template<int dim>
|
|
53
|
+
static void CheckLessOrEqual(const MetricBundle<dim>& a,
|
|
54
|
+
const MetricBundle<dim>& b) {
|
|
55
|
+
EXPECT_LE(a.min_.deriv(), b.min_.deriv());
|
|
56
|
+
EXPECT_LE(a.max_.deriv(), b.max_.deriv());
|
|
57
|
+
EXPECT_LE(a.avg_.deriv(), b.avg_.deriv());
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
TEST(S2, Metrics) {
|
|
61
|
+
MetricBundle<1> angle_span(S2::kMinAngleSpan, S2::kMaxAngleSpan,
|
|
62
|
+
S2::kAvgAngleSpan);
|
|
63
|
+
MetricBundle<1> width(S2::kMinWidth, S2::kMaxWidth, S2::kAvgWidth);
|
|
64
|
+
MetricBundle<1> edge(S2::kMinEdge, S2::kMaxEdge, S2::kAvgEdge);
|
|
65
|
+
MetricBundle<1> diag(S2::kMinDiag, S2::kMaxDiag, S2::kAvgDiag);
|
|
66
|
+
MetricBundle<2> area(S2::kMinArea, S2::kMaxArea, S2::kAvgArea);
|
|
67
|
+
|
|
68
|
+
// First, check that min <= avg <= max for each metric.
|
|
69
|
+
CheckMinMaxAvg(angle_span);
|
|
70
|
+
CheckMinMaxAvg(width);
|
|
71
|
+
CheckMinMaxAvg(edge);
|
|
72
|
+
CheckMinMaxAvg(diag);
|
|
73
|
+
CheckMinMaxAvg(area);
|
|
74
|
+
|
|
75
|
+
// Check that the maximum aspect ratio of an individual cell is consistent
|
|
76
|
+
// with the global minimums and maximums.
|
|
77
|
+
EXPECT_GE(S2::kMaxEdgeAspect, 1);
|
|
78
|
+
EXPECT_LE(S2::kMaxEdgeAspect, S2::kMaxEdge.deriv() / S2::kMinEdge.deriv());
|
|
79
|
+
EXPECT_GE(S2::kMaxDiagAspect, 1);
|
|
80
|
+
EXPECT_LE(S2::kMaxDiagAspect, S2::kMaxDiag.deriv() / S2::kMinDiag.deriv());
|
|
81
|
+
|
|
82
|
+
// Check various conditions that are provable mathematically.
|
|
83
|
+
CheckLessOrEqual(width, angle_span);
|
|
84
|
+
CheckLessOrEqual(width, edge);
|
|
85
|
+
CheckLessOrEqual(edge, diag);
|
|
86
|
+
|
|
87
|
+
EXPECT_GE(S2::kMinArea.deriv(),
|
|
88
|
+
S2::kMinWidth.deriv() * S2::kMinEdge.deriv() - 1e-15);
|
|
89
|
+
EXPECT_LE(S2::kMaxArea.deriv(),
|
|
90
|
+
S2::kMaxWidth.deriv() * S2::kMaxEdge.deriv() + 1e-15);
|
|
91
|
+
|
|
92
|
+
// GetLevelForMaxValue() and friends have built-in assertions, we just need
|
|
93
|
+
// to call these functions to test them.
|
|
94
|
+
//
|
|
95
|
+
// We don't actually check that the metrics are correct here, e.g. that
|
|
96
|
+
// GetMinWidth(10) is a lower bound on the width of cells at level 10.
|
|
97
|
+
// It is easier to check these properties in s2cell_test, since
|
|
98
|
+
// S2Cell has methods to compute the cell vertices, etc.
|
|
99
|
+
|
|
100
|
+
for (int level = -2; level <= S2::kMaxCellLevel + 3; ++level) {
|
|
101
|
+
double width = S2::kMinWidth.deriv() * pow(2, -level);
|
|
102
|
+
if (level >= S2::kMaxCellLevel + 3) width = 0;
|
|
103
|
+
|
|
104
|
+
// Check boundary cases (exactly equal to a threshold value).
|
|
105
|
+
int expected_level = std::max(0, std::min(S2::kMaxCellLevel, level));
|
|
106
|
+
EXPECT_EQ(S2::kMinWidth.GetLevelForMaxValue(width), expected_level);
|
|
107
|
+
EXPECT_EQ(S2::kMinWidth.GetLevelForMinValue(width), expected_level);
|
|
108
|
+
EXPECT_EQ(S2::kMinWidth.GetClosestLevel(width), expected_level);
|
|
109
|
+
|
|
110
|
+
// Also check non-boundary cases.
|
|
111
|
+
EXPECT_EQ(S2::kMinWidth.GetLevelForMaxValue(1.2 * width), expected_level);
|
|
112
|
+
EXPECT_EQ(S2::kMinWidth.GetLevelForMinValue(0.8 * width), expected_level);
|
|
113
|
+
EXPECT_EQ(S2::kMinWidth.GetClosestLevel(1.2 * width), expected_level);
|
|
114
|
+
EXPECT_EQ(S2::kMinWidth.GetClosestLevel(0.8 * width), expected_level);
|
|
115
|
+
|
|
116
|
+
// Same thing for area.
|
|
117
|
+
double area = S2::kMinArea.deriv() * pow(4, -level);
|
|
118
|
+
if (level <= -3) area = 0;
|
|
119
|
+
EXPECT_EQ(S2::kMinArea.GetLevelForMaxValue(area), expected_level);
|
|
120
|
+
EXPECT_EQ(S2::kMinArea.GetLevelForMinValue(area), expected_level);
|
|
121
|
+
EXPECT_EQ(S2::kMinArea.GetClosestLevel(area), expected_level);
|
|
122
|
+
EXPECT_EQ(S2::kMinArea.GetLevelForMaxValue(1.2 * area), expected_level);
|
|
123
|
+
EXPECT_EQ(S2::kMinArea.GetLevelForMinValue(0.8 * area), expected_level);
|
|
124
|
+
EXPECT_EQ(S2::kMinArea.GetClosestLevel(1.2 * area), expected_level);
|
|
125
|
+
EXPECT_EQ(S2::kMinArea.GetClosestLevel(0.8 * area), expected_level);
|
|
126
|
+
}
|
|
127
|
+
}
|