@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,369 @@
|
|
|
1
|
+
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S1CHORD_ANGLE_H_
|
|
19
|
+
#define S2_S1CHORD_ANGLE_H_
|
|
20
|
+
|
|
21
|
+
#include <cmath>
|
|
22
|
+
#include <limits>
|
|
23
|
+
#include <ostream>
|
|
24
|
+
#include <type_traits>
|
|
25
|
+
|
|
26
|
+
#include "s2/_fp_contract_off.h"
|
|
27
|
+
#include "s2/s1angle.h"
|
|
28
|
+
#include "s2/s2pointutil.h"
|
|
29
|
+
|
|
30
|
+
// S1ChordAngle represents the angle subtended by a chord (i.e., the straight
|
|
31
|
+
// line segment connecting two points on the sphere). Its representation
|
|
32
|
+
// makes it very efficient for computing and comparing distances, but unlike
|
|
33
|
+
// S1Angle it is only capable of representing angles between 0 and Pi radians.
|
|
34
|
+
// Generally, S1ChordAngle should only be used in loops where many angles need
|
|
35
|
+
// to be calculated and compared. Otherwise it is simpler to use S1Angle.
|
|
36
|
+
//
|
|
37
|
+
// S1ChordAngle also loses some accuracy as the angle approaches Pi radians.
|
|
38
|
+
// Specifically, the representation of (Pi - x) radians has an error of about
|
|
39
|
+
// (1e-15 / x), with a maximum error of about 2e-8 radians (about 13cm on the
|
|
40
|
+
// Earth's surface). For comparison, for angles up to 90 degrees (10000km)
|
|
41
|
+
// the worst-case representation error is about 2e-16 radians (1 nanometer),
|
|
42
|
+
// which is about the same as S1Angle.
|
|
43
|
+
//
|
|
44
|
+
// This class is intended to be copied by value as desired. It uses
|
|
45
|
+
// the default copy constructor and assignment operator.
|
|
46
|
+
class S1ChordAngle {
|
|
47
|
+
public:
|
|
48
|
+
// The default constructor yields a zero angle. This is useful for STL
|
|
49
|
+
// containers and class methods with output arguments.
|
|
50
|
+
S1ChordAngle() : length2_(0) {}
|
|
51
|
+
|
|
52
|
+
// Construct the S1ChordAngle corresponding to the distance between the two
|
|
53
|
+
// given points. The points must be unit length.
|
|
54
|
+
S1ChordAngle(const S2Point& x, const S2Point& y);
|
|
55
|
+
|
|
56
|
+
// Return the zero chord angle.
|
|
57
|
+
static S1ChordAngle Zero();
|
|
58
|
+
|
|
59
|
+
// Return a chord angle of 90 degrees (a "right angle").
|
|
60
|
+
static S1ChordAngle Right();
|
|
61
|
+
|
|
62
|
+
// Return a chord angle of 180 degrees (a "straight angle"). This is the
|
|
63
|
+
// maximum finite chord angle.
|
|
64
|
+
static S1ChordAngle Straight();
|
|
65
|
+
|
|
66
|
+
// Return a chord angle larger than any finite chord angle. The only valid
|
|
67
|
+
// operations on Infinity() are comparisons, S1Angle conversions, and
|
|
68
|
+
// Successor() / Predecessor().
|
|
69
|
+
static S1ChordAngle Infinity();
|
|
70
|
+
|
|
71
|
+
// Return a chord angle smaller than Zero(). The only valid operations on
|
|
72
|
+
// Negative() are comparisons, S1Angle conversions, and Successor() /
|
|
73
|
+
// Predecessor().
|
|
74
|
+
static S1ChordAngle Negative();
|
|
75
|
+
|
|
76
|
+
// Conversion from an S1Angle. Angles outside the range [0, Pi] are handled
|
|
77
|
+
// as follows: Infinity() is mapped to Infinity(), negative angles are
|
|
78
|
+
// mapped to Negative(), and finite angles larger than Pi are mapped to
|
|
79
|
+
// Straight().
|
|
80
|
+
//
|
|
81
|
+
// Note that this operation is relatively expensive and should be avoided.
|
|
82
|
+
// To use S1ChordAngle effectively, you should structure your code so that
|
|
83
|
+
// input arguments are converted to S1ChordAngles at the beginning of your
|
|
84
|
+
// algorithm, and results are converted back to S1Angles only at the end.
|
|
85
|
+
explicit S1ChordAngle(S1Angle angle);
|
|
86
|
+
|
|
87
|
+
// Convenience methods implemented by converting from an S1Angle.
|
|
88
|
+
static S1ChordAngle Radians(double radians);
|
|
89
|
+
static S1ChordAngle Degrees(double degrees);
|
|
90
|
+
static S1ChordAngle E5(int32 e5);
|
|
91
|
+
static S1ChordAngle E6(int32 e6);
|
|
92
|
+
static S1ChordAngle E7(int32 e7);
|
|
93
|
+
|
|
94
|
+
// Construct an S1ChordAngle that is an upper bound on the given S1Angle,
|
|
95
|
+
// i.e. such that FastUpperBoundFrom(x).ToAngle() >= x. Unlike the S1Angle
|
|
96
|
+
// constructor above, this method is very fast, and the bound is accurate to
|
|
97
|
+
// within 1% for distances up to about 3100km on the Earth's surface.
|
|
98
|
+
static S1ChordAngle FastUpperBoundFrom(S1Angle angle);
|
|
99
|
+
|
|
100
|
+
// Construct an S1ChordAngle from the squared chord length. Note that the
|
|
101
|
+
// argument is automatically clamped to a maximum of 4.0 to handle possible
|
|
102
|
+
// roundoff errors. The argument must be non-negative.
|
|
103
|
+
static S1ChordAngle FromLength2(double length2);
|
|
104
|
+
|
|
105
|
+
// Converts to an S1Angle. Can be used just like an S1Angle constructor:
|
|
106
|
+
//
|
|
107
|
+
// S1ChordAngle x = ...;
|
|
108
|
+
// return S1Angle(x);
|
|
109
|
+
//
|
|
110
|
+
// Infinity() is converted to S1Angle::Infinity(), and Negative() is
|
|
111
|
+
// converted to an unspecified negative S1Angle.
|
|
112
|
+
//
|
|
113
|
+
// Note that the conversion uses trigonometric functions and therefore
|
|
114
|
+
// should be avoided in inner loops.
|
|
115
|
+
explicit operator S1Angle() const;
|
|
116
|
+
|
|
117
|
+
// Converts to an S1Angle (equivalent to the operator above).
|
|
118
|
+
S1Angle ToAngle() const;
|
|
119
|
+
|
|
120
|
+
// Convenience methods implemented by calling ToAngle() first. Note that
|
|
121
|
+
// because of the S1Angle conversion these methods are relatively expensive
|
|
122
|
+
// (despite their lowercase names), so the results should be cached if they
|
|
123
|
+
// are needed inside loops.
|
|
124
|
+
double radians() const;
|
|
125
|
+
double degrees() const;
|
|
126
|
+
int32 e5() const;
|
|
127
|
+
int32 e6() const;
|
|
128
|
+
int32 e7() const;
|
|
129
|
+
|
|
130
|
+
// All operators and functions are declared here so that we can put them all
|
|
131
|
+
// in one place. (The compound assignment operators must be put here.)
|
|
132
|
+
|
|
133
|
+
// Comparison operators.
|
|
134
|
+
friend bool operator==(S1ChordAngle x, S1ChordAngle y);
|
|
135
|
+
friend bool operator!=(S1ChordAngle x, S1ChordAngle y);
|
|
136
|
+
friend bool operator<(S1ChordAngle x, S1ChordAngle y);
|
|
137
|
+
friend bool operator>(S1ChordAngle x, S1ChordAngle y);
|
|
138
|
+
friend bool operator<=(S1ChordAngle x, S1ChordAngle y);
|
|
139
|
+
friend bool operator>=(S1ChordAngle x, S1ChordAngle y);
|
|
140
|
+
|
|
141
|
+
// Comparison predicates.
|
|
142
|
+
bool is_zero() const;
|
|
143
|
+
bool is_negative() const;
|
|
144
|
+
bool is_infinity() const;
|
|
145
|
+
bool is_special() const; // Negative or infinity.
|
|
146
|
+
|
|
147
|
+
// Only addition and subtraction of S1ChordAngles is supported. These
|
|
148
|
+
// methods add or subtract the corresponding S1Angles, and clamp the result
|
|
149
|
+
// to the range [0, Pi]. Both arguments must be non-negative and
|
|
150
|
+
// non-infinite.
|
|
151
|
+
//
|
|
152
|
+
// REQUIRES: !a.is_special() && !b.is_special()
|
|
153
|
+
friend S1ChordAngle operator+(S1ChordAngle a, S1ChordAngle b);
|
|
154
|
+
friend S1ChordAngle operator-(S1ChordAngle a, S1ChordAngle b);
|
|
155
|
+
S1ChordAngle& operator+=(S1ChordAngle a);
|
|
156
|
+
S1ChordAngle& operator-=(S1ChordAngle a);
|
|
157
|
+
|
|
158
|
+
// Trigonmetric functions. It is more accurate and efficient to call these
|
|
159
|
+
// rather than first converting to an S1Angle.
|
|
160
|
+
friend double sin(S1ChordAngle a);
|
|
161
|
+
friend double cos(S1ChordAngle a);
|
|
162
|
+
friend double tan(S1ChordAngle a);
|
|
163
|
+
|
|
164
|
+
// Returns sin(a)**2, but computed more efficiently.
|
|
165
|
+
friend double sin2(S1ChordAngle a);
|
|
166
|
+
|
|
167
|
+
// The squared length of the chord. (Most clients will not need this.)
|
|
168
|
+
double length2() const { return length2_; }
|
|
169
|
+
|
|
170
|
+
// Returns the smallest representable S1ChordAngle larger than this object.
|
|
171
|
+
// This can be used to convert a "<" comparison to a "<=" comparison. For
|
|
172
|
+
// example:
|
|
173
|
+
//
|
|
174
|
+
// S2ClosestEdgeQuery query(...);
|
|
175
|
+
// S1ChordAngle limit = ...;
|
|
176
|
+
// if (query.IsDistanceLess(target, limit.Successor())) {
|
|
177
|
+
// // Distance to "target" is less than or equal to "limit".
|
|
178
|
+
// }
|
|
179
|
+
//
|
|
180
|
+
// Note the following special cases:
|
|
181
|
+
// Negative().Successor() == Zero()
|
|
182
|
+
// Straight().Successor() == Infinity()
|
|
183
|
+
// Infinity().Successor() == Infinity()
|
|
184
|
+
S1ChordAngle Successor() const;
|
|
185
|
+
|
|
186
|
+
// Like Successor(), but returns the largest representable S1ChordAngle less
|
|
187
|
+
// than this object.
|
|
188
|
+
//
|
|
189
|
+
// Note the following special cases:
|
|
190
|
+
// Infinity().Predecessor() == Straight()
|
|
191
|
+
// Zero().Predecessor() == Negative()
|
|
192
|
+
// Negative().Predecessor() == Negative()
|
|
193
|
+
S1ChordAngle Predecessor() const;
|
|
194
|
+
|
|
195
|
+
// Returns a new S1ChordAngle that has been adjusted by the given error
|
|
196
|
+
// bound (which can be positive or negative). "error" should be the value
|
|
197
|
+
// returned by one of the error bound methods below. For example:
|
|
198
|
+
// S1ChordAngle a(x, y);
|
|
199
|
+
// S1ChordAngle a1 = a.PlusError(a.GetS2PointConstructorMaxError());
|
|
200
|
+
S1ChordAngle PlusError(double error) const;
|
|
201
|
+
|
|
202
|
+
// Return the maximum error in length2() for the S1ChordAngle(x, y)
|
|
203
|
+
// constructor, assuming that "x" and "y" are normalized to within the
|
|
204
|
+
// bounds guaranteed by S2Point::Normalize(). (The error is defined with
|
|
205
|
+
// respect to the true distance after the points are projected to lie
|
|
206
|
+
// exactly on the sphere.)
|
|
207
|
+
double GetS2PointConstructorMaxError() const;
|
|
208
|
+
|
|
209
|
+
// Return the maximum error in length2() for the S1Angle constructor.
|
|
210
|
+
double GetS1AngleConstructorMaxError() const;
|
|
211
|
+
|
|
212
|
+
// Return true if the internal representation is valid. Negative() and
|
|
213
|
+
// Infinity() are both considered valid.
|
|
214
|
+
bool is_valid() const;
|
|
215
|
+
|
|
216
|
+
// When S1ChordAngle is used as a key in one of the btree container types
|
|
217
|
+
// (util/btree), indicate that linear rather than binary search should be
|
|
218
|
+
// used. This is much faster when the comparison function is cheap.
|
|
219
|
+
typedef std::true_type goog_btree_prefer_linear_node_search;
|
|
220
|
+
|
|
221
|
+
private:
|
|
222
|
+
// S1ChordAngles are represented by the squared chord length, which can
|
|
223
|
+
// range from 0 to 4. Infinity() uses an infinite squared length.
|
|
224
|
+
explicit S1ChordAngle(double length2) : length2_(length2) {
|
|
225
|
+
S2_DCHECK(is_valid());
|
|
226
|
+
}
|
|
227
|
+
double length2_;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
////////////////// Implementation details follow ////////////////////
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
inline S1ChordAngle::S1ChordAngle(const S2Point& x, const S2Point& y) {
|
|
235
|
+
S2_DCHECK(S2::IsUnitLength(x));
|
|
236
|
+
S2_DCHECK(S2::IsUnitLength(y));
|
|
237
|
+
// The squared distance may slightly exceed 4.0 due to roundoff errors.
|
|
238
|
+
// The maximum error in the result is 2 * DBL_EPSILON * length2_.
|
|
239
|
+
length2_ = std::min(4.0, (x - y).Norm2());
|
|
240
|
+
S2_DCHECK(is_valid());
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
inline S1ChordAngle S1ChordAngle::FromLength2(double length2) {
|
|
244
|
+
return S1ChordAngle(std::min(4.0, length2));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
inline S1ChordAngle S1ChordAngle::Zero() {
|
|
248
|
+
return S1ChordAngle(0);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
inline S1ChordAngle S1ChordAngle::Right() {
|
|
252
|
+
return S1ChordAngle(2);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
inline S1ChordAngle S1ChordAngle::Straight() {
|
|
256
|
+
return S1ChordAngle(4);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
inline S1ChordAngle S1ChordAngle::Infinity() {
|
|
260
|
+
return S1ChordAngle(std::numeric_limits<double>::infinity());
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
inline S1ChordAngle S1ChordAngle::Negative() {
|
|
264
|
+
return S1ChordAngle(-1);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
inline S1ChordAngle S1ChordAngle::Radians(double radians) {
|
|
268
|
+
return S1ChordAngle(S1Angle::Radians(radians));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
inline S1ChordAngle S1ChordAngle::Degrees(double degrees) {
|
|
272
|
+
return S1ChordAngle(S1Angle::Degrees(degrees));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
inline S1ChordAngle S1ChordAngle::E5(int32 e5) {
|
|
276
|
+
return S1ChordAngle(S1Angle::E5(e5));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
inline S1ChordAngle S1ChordAngle::E6(int32 e6) {
|
|
280
|
+
return S1ChordAngle(S1Angle::E6(e6));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
inline S1ChordAngle S1ChordAngle::E7(int32 e7) {
|
|
284
|
+
return S1ChordAngle(S1Angle::E7(e7));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
inline S1ChordAngle S1ChordAngle::FastUpperBoundFrom(S1Angle angle) {
|
|
288
|
+
// This method uses the distance along the surface of the sphere as an upper
|
|
289
|
+
// bound on the distance through the sphere's interior.
|
|
290
|
+
return S1ChordAngle::FromLength2(angle.radians() * angle.radians());
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
inline S1ChordAngle::operator S1Angle() const {
|
|
294
|
+
return ToAngle();
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
inline double S1ChordAngle::radians() const {
|
|
298
|
+
return ToAngle().radians();
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
inline double S1ChordAngle::degrees() const {
|
|
302
|
+
return ToAngle().degrees();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
inline int32 S1ChordAngle::e5() const {
|
|
306
|
+
return ToAngle().e5();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
inline int32 S1ChordAngle::e6() const {
|
|
310
|
+
return ToAngle().e6();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
inline int32 S1ChordAngle::e7() const {
|
|
314
|
+
return ToAngle().e7();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
inline bool S1ChordAngle::is_zero() const {
|
|
318
|
+
return length2_ == 0;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
inline bool S1ChordAngle::is_negative() const {
|
|
322
|
+
// TODO(ericv): Consider stricter check here -- only allow Negative().
|
|
323
|
+
return length2_ < 0;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
inline bool S1ChordAngle::is_infinity() const {
|
|
327
|
+
return length2_ == std::numeric_limits<double>::infinity();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
inline bool S1ChordAngle::is_special() const {
|
|
331
|
+
return is_negative() || is_infinity();
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
inline bool operator==(S1ChordAngle x, S1ChordAngle y) {
|
|
335
|
+
return x.length2() == y.length2();
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
inline bool operator!=(S1ChordAngle x, S1ChordAngle y) {
|
|
339
|
+
return x.length2() != y.length2();
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
inline bool operator<(S1ChordAngle x, S1ChordAngle y) {
|
|
343
|
+
return x.length2() < y.length2();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
inline bool operator>(S1ChordAngle x, S1ChordAngle y) {
|
|
347
|
+
return x.length2() > y.length2();
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
inline bool operator<=(S1ChordAngle x, S1ChordAngle y) {
|
|
351
|
+
return x.length2() <= y.length2();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
inline bool operator>=(S1ChordAngle x, S1ChordAngle y) {
|
|
355
|
+
return x.length2() >= y.length2();
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
inline S1ChordAngle& S1ChordAngle::operator+=(S1ChordAngle a) {
|
|
359
|
+
return (*this = *this + a);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
inline S1ChordAngle& S1ChordAngle::operator-=(S1ChordAngle a) {
|
|
363
|
+
return (*this = *this - a);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Outputs the chord angle as the equivalent S1Angle.
|
|
367
|
+
std::ostream& operator<<(std::ostream& os, S1ChordAngle a);
|
|
368
|
+
|
|
369
|
+
#endif // S2_S1CHORD_ANGLE_H_
|
|
@@ -0,0 +1,207 @@
|
|
|
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/s1chord_angle.h"
|
|
17
|
+
|
|
18
|
+
#include <cfloat>
|
|
19
|
+
#include <limits>
|
|
20
|
+
|
|
21
|
+
#include <gtest/gtest.h>
|
|
22
|
+
#include "s2/s1angle.h"
|
|
23
|
+
#include "s2/s2edge_distances.h"
|
|
24
|
+
#include "s2/s2predicates.h"
|
|
25
|
+
#include "s2/s2testing.h"
|
|
26
|
+
|
|
27
|
+
using std::numeric_limits;
|
|
28
|
+
|
|
29
|
+
TEST(S1ChordAngle, DefaultConstructor) {
|
|
30
|
+
// Check that the default constructor returns an angle of 0.
|
|
31
|
+
S1ChordAngle a;
|
|
32
|
+
EXPECT_EQ(S1ChordAngle::Zero(), a);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
TEST(S1ChordAngle, TwoPointConstructor) {
|
|
36
|
+
for (int iter = 0; iter < 100; ++iter) {
|
|
37
|
+
S2Point x, y, z;
|
|
38
|
+
S2Testing::GetRandomFrame(&x, &y, &z);
|
|
39
|
+
EXPECT_EQ(S1Angle::Zero(), S1Angle(S1ChordAngle(z, z)));
|
|
40
|
+
EXPECT_NEAR(M_PI, S1ChordAngle(-z, z).radians(), 1e-7);
|
|
41
|
+
EXPECT_DOUBLE_EQ(M_PI_2, S1ChordAngle(x, z).radians());
|
|
42
|
+
S2Point w = (y + z).Normalize();
|
|
43
|
+
EXPECT_DOUBLE_EQ(M_PI_4, S1ChordAngle(w, z).radians());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
TEST(S1ChordAngle, FromLength2) {
|
|
48
|
+
EXPECT_EQ(0, S1ChordAngle::FromLength2(0).degrees());
|
|
49
|
+
EXPECT_DOUBLE_EQ(60, S1ChordAngle::FromLength2(1).degrees());
|
|
50
|
+
EXPECT_DOUBLE_EQ(90, S1ChordAngle::FromLength2(2).degrees());
|
|
51
|
+
EXPECT_EQ(180, S1ChordAngle::FromLength2(4).degrees());
|
|
52
|
+
EXPECT_EQ(180, S1ChordAngle::FromLength2(5).degrees());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
TEST(S1ChordAngle, Zero) {
|
|
56
|
+
EXPECT_EQ(S1Angle::Zero(), S1Angle(S1ChordAngle::Zero()));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
TEST(S1ChordAngle, Right) {
|
|
60
|
+
EXPECT_DOUBLE_EQ(90, S1ChordAngle::Right().degrees());
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
TEST(S1ChordAngle, Straight) {
|
|
64
|
+
EXPECT_EQ(S1Angle::Degrees(180), S1Angle(S1ChordAngle::Straight()));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
TEST(S1ChordAngle, Infinity) {
|
|
68
|
+
EXPECT_LT(S1ChordAngle::Straight(), S1ChordAngle::Infinity());
|
|
69
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), S1ChordAngle::Infinity());
|
|
70
|
+
EXPECT_EQ(S1Angle::Infinity(), S1Angle(S1ChordAngle::Infinity()));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
TEST(S1ChordAngle, Negative) {
|
|
74
|
+
EXPECT_LT(S1ChordAngle::Negative(), S1ChordAngle::Zero());
|
|
75
|
+
EXPECT_EQ(S1ChordAngle::Negative(), S1ChordAngle::Negative());
|
|
76
|
+
EXPECT_LT(S1ChordAngle::Negative().ToAngle(), S1Angle::Zero());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
TEST(S1ChordAngle, Predicates) {
|
|
80
|
+
EXPECT_TRUE(S1ChordAngle::Zero().is_zero());
|
|
81
|
+
EXPECT_FALSE(S1ChordAngle::Zero().is_negative());
|
|
82
|
+
EXPECT_FALSE(S1ChordAngle::Zero().is_special());
|
|
83
|
+
EXPECT_FALSE(S1ChordAngle::Straight().is_special());
|
|
84
|
+
EXPECT_TRUE(S1ChordAngle::Negative().is_negative());
|
|
85
|
+
EXPECT_TRUE(S1ChordAngle::Negative().is_special());
|
|
86
|
+
EXPECT_TRUE(S1ChordAngle::Infinity().is_infinity());
|
|
87
|
+
EXPECT_TRUE(S1ChordAngle::Infinity().is_special());
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
TEST(S1ChordAngle, ToFromS1Angle) {
|
|
91
|
+
EXPECT_EQ(0, S1ChordAngle(S1Angle::Zero()).radians());
|
|
92
|
+
EXPECT_EQ(4, S1ChordAngle(S1Angle::Radians(M_PI)).length2());
|
|
93
|
+
EXPECT_EQ(M_PI, S1ChordAngle(S1Angle::Radians(M_PI)).radians());
|
|
94
|
+
EXPECT_EQ(S1Angle::Infinity(), S1Angle(S1ChordAngle(S1Angle::Infinity())));
|
|
95
|
+
EXPECT_LT(S1ChordAngle(S1Angle::Radians(-1)).radians(), 0);
|
|
96
|
+
EXPECT_DOUBLE_EQ(1.0,
|
|
97
|
+
S1ChordAngle(S1Angle::Radians(1.0)).radians());
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
TEST(S1ChordAngle, Successor) {
|
|
101
|
+
EXPECT_EQ(S1ChordAngle::Zero(), S1ChordAngle::Negative().Successor());
|
|
102
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), S1ChordAngle::Straight().Successor());
|
|
103
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), S1ChordAngle::Infinity().Successor());
|
|
104
|
+
S1ChordAngle x = S1ChordAngle::Negative();
|
|
105
|
+
for (int i = 0; i < 10; ++i) {
|
|
106
|
+
EXPECT_LT(x, x.Successor());
|
|
107
|
+
x = x.Successor();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
TEST(S1ChordAngle, Predecessor) {
|
|
112
|
+
EXPECT_EQ(S1ChordAngle::Straight(), S1ChordAngle::Infinity().Predecessor());
|
|
113
|
+
EXPECT_EQ(S1ChordAngle::Negative(), S1ChordAngle::Zero().Predecessor());
|
|
114
|
+
EXPECT_EQ(S1ChordAngle::Negative(), S1ChordAngle::Negative().Predecessor());
|
|
115
|
+
S1ChordAngle x = S1ChordAngle::Infinity();
|
|
116
|
+
for (int i = 0; i < 10; ++i) {
|
|
117
|
+
EXPECT_GT(x, x.Predecessor());
|
|
118
|
+
x = x.Predecessor();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
TEST(S1ChordAngle, Arithmetic) {
|
|
123
|
+
S1ChordAngle zero = S1ChordAngle::Zero();
|
|
124
|
+
S1ChordAngle degree30 = S1ChordAngle::Degrees(30);
|
|
125
|
+
S1ChordAngle degree60 = S1ChordAngle::Degrees(60);
|
|
126
|
+
S1ChordAngle degree90 = S1ChordAngle::Degrees(90);
|
|
127
|
+
S1ChordAngle degree120 = S1ChordAngle::Degrees(120);
|
|
128
|
+
S1ChordAngle degree180 = S1ChordAngle::Straight();
|
|
129
|
+
EXPECT_EQ(0, (zero + zero).degrees());
|
|
130
|
+
EXPECT_EQ(0, (zero - zero).degrees());
|
|
131
|
+
EXPECT_EQ(0, (degree60 - degree60).degrees());
|
|
132
|
+
EXPECT_EQ(0, (degree180 - degree180).degrees());
|
|
133
|
+
EXPECT_EQ(0, (zero - degree60).degrees());
|
|
134
|
+
EXPECT_EQ(0, (degree30 - degree90).degrees());
|
|
135
|
+
EXPECT_DOUBLE_EQ(60, (degree60 + zero).degrees());
|
|
136
|
+
EXPECT_DOUBLE_EQ(60, (degree60 - zero).degrees());
|
|
137
|
+
EXPECT_DOUBLE_EQ(60, (zero + degree60).degrees());
|
|
138
|
+
EXPECT_DOUBLE_EQ(90, (degree30 + degree60).degrees());
|
|
139
|
+
EXPECT_DOUBLE_EQ(90, (degree60 + degree30).degrees());
|
|
140
|
+
EXPECT_DOUBLE_EQ(60, (degree90 - degree30).degrees());
|
|
141
|
+
EXPECT_DOUBLE_EQ(30, (degree90 - degree60).degrees());
|
|
142
|
+
EXPECT_EQ(180, (degree180 + zero).degrees());
|
|
143
|
+
EXPECT_EQ(180, (degree180 - zero).degrees());
|
|
144
|
+
EXPECT_EQ(180, (degree90 + degree90).degrees());
|
|
145
|
+
EXPECT_EQ(180, (degree120 + degree90).degrees());
|
|
146
|
+
EXPECT_EQ(180, (degree120 + degree120).degrees());
|
|
147
|
+
EXPECT_EQ(180, (degree30 + degree180).degrees());
|
|
148
|
+
EXPECT_EQ(180, (degree180 + degree180).degrees());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
TEST(S1ChordAngle, Trigonometry) {
|
|
152
|
+
static const int kIters = 20;
|
|
153
|
+
for (int iter = 0; iter <= kIters; ++iter) {
|
|
154
|
+
double radians = M_PI * iter / kIters;
|
|
155
|
+
S1ChordAngle angle(S1Angle::Radians(radians));
|
|
156
|
+
EXPECT_NEAR(sin(radians), sin(angle), 1e-15);
|
|
157
|
+
EXPECT_NEAR(cos(radians), cos(angle), 1e-15);
|
|
158
|
+
// Since the tan(x) is unbounded near Pi/4, we map the result back to an
|
|
159
|
+
// angle before comparing. (The assertion is that the result is equal to
|
|
160
|
+
// the tangent of a nearby angle.)
|
|
161
|
+
EXPECT_NEAR(atan(tan(radians)), atan(tan(angle)), 1e-15);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Unlike S1Angle, S1ChordAngle can represent 90 and 180 degrees exactly.
|
|
165
|
+
S1ChordAngle angle90 = S1ChordAngle::FromLength2(2);
|
|
166
|
+
S1ChordAngle angle180 = S1ChordAngle::FromLength2(4);
|
|
167
|
+
EXPECT_EQ(1, sin(angle90));
|
|
168
|
+
EXPECT_EQ(0, cos(angle90));
|
|
169
|
+
EXPECT_EQ(numeric_limits<double>::infinity(), tan(angle90));
|
|
170
|
+
EXPECT_EQ(0, sin(angle180));
|
|
171
|
+
EXPECT_EQ(-1, cos(angle180));
|
|
172
|
+
EXPECT_EQ(0, tan(angle180));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
TEST(S1ChordAngle, PlusError) {
|
|
176
|
+
EXPECT_EQ(S1ChordAngle::Negative(), S1ChordAngle::Negative().PlusError(5));
|
|
177
|
+
EXPECT_EQ(S1ChordAngle::Infinity(), S1ChordAngle::Infinity().PlusError(-5));
|
|
178
|
+
EXPECT_EQ(S1ChordAngle::Straight(), S1ChordAngle::Straight().PlusError(5));
|
|
179
|
+
EXPECT_EQ(S1ChordAngle::Zero(), S1ChordAngle::Zero().PlusError(-5));
|
|
180
|
+
EXPECT_EQ(S1ChordAngle::FromLength2(1.25),
|
|
181
|
+
S1ChordAngle::FromLength2(1).PlusError(0.25));
|
|
182
|
+
EXPECT_EQ(S1ChordAngle::FromLength2(0.75),
|
|
183
|
+
S1ChordAngle::FromLength2(1).PlusError(-0.25));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
TEST(S1ChordAngle, GetS2PointConstructorMaxError) {
|
|
187
|
+
// Check that the error bound returned by GetS2PointConstructorMaxError() is
|
|
188
|
+
// large enough.
|
|
189
|
+
auto& rnd = S2Testing::rnd;
|
|
190
|
+
for (int iter = 0; iter < 100000; ++iter) {
|
|
191
|
+
rnd.Reset(iter); // Easier to reproduce a specific case.
|
|
192
|
+
S2Point x = S2Testing::RandomPoint();
|
|
193
|
+
S2Point y = S2Testing::RandomPoint();
|
|
194
|
+
if (rnd.OneIn(10)) {
|
|
195
|
+
// Occasionally test a point pair that is nearly identical or antipodal.
|
|
196
|
+
S1Angle r = S1Angle::Radians(1e-15 * rnd.RandDouble());
|
|
197
|
+
y = S2::InterpolateAtDistance(r, x, y);
|
|
198
|
+
if (rnd.OneIn(2)) y = -y;
|
|
199
|
+
}
|
|
200
|
+
S1ChordAngle dist = S1ChordAngle(x, y);
|
|
201
|
+
double error = dist.GetS2PointConstructorMaxError();
|
|
202
|
+
EXPECT_LE(s2pred::CompareDistance(x, y, dist.PlusError(error)), 0)
|
|
203
|
+
<< "angle=" << S1Angle(dist) << ", iter=" << iter;
|
|
204
|
+
EXPECT_GE(s2pred::CompareDistance(x, y, dist.PlusError(-error)), 0)
|
|
205
|
+
<< "angle=" << S1Angle(dist) << ", iter=" << iter;
|
|
206
|
+
}
|
|
207
|
+
}
|