@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,336 @@
|
|
|
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
|
+
#ifndef S2_S1ANGLE_H_
|
|
19
|
+
#define S2_S1ANGLE_H_
|
|
20
|
+
|
|
21
|
+
#include <cmath>
|
|
22
|
+
#include <limits>
|
|
23
|
+
#include <ostream>
|
|
24
|
+
#include <type_traits>
|
|
25
|
+
|
|
26
|
+
#include "s2/base/integral_types.h"
|
|
27
|
+
#include "s2/_fp_contract_off.h"
|
|
28
|
+
#include "s2/s2point.h"
|
|
29
|
+
#include "s2/util/math/mathutil.h"
|
|
30
|
+
#include "s2/util/math/vector.h"
|
|
31
|
+
|
|
32
|
+
class S2LatLng;
|
|
33
|
+
|
|
34
|
+
#ifndef SWIG
|
|
35
|
+
#define IFNDEF_SWIG(x) x
|
|
36
|
+
#else
|
|
37
|
+
#define IFNDEF_SWIG(x)
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
// This class represents a one-dimensional angle (as opposed to a
|
|
41
|
+
// two-dimensional solid angle). It has methods for converting angles to
|
|
42
|
+
// or from radians, degrees, and the E5/E6/E7 representations (i.e. degrees
|
|
43
|
+
// multiplied by 1e5/1e6/1e7 and rounded to the nearest integer).
|
|
44
|
+
//
|
|
45
|
+
// The internal representation is a double-precision value in radians, so
|
|
46
|
+
// conversion to and from radians is exact. Conversions between E5, E6, E7,
|
|
47
|
+
// and Degrees are not always exact; for example, Degrees(3.1) is different
|
|
48
|
+
// from E6(3100000) or E7(310000000). However, the following properties are
|
|
49
|
+
// guaranteed for any integer "n", provided that "n" is in the input range of
|
|
50
|
+
// both functions:
|
|
51
|
+
//
|
|
52
|
+
// Degrees(n) == E6(1000000 * n)
|
|
53
|
+
// Degrees(n) == E7(10000000 * n)
|
|
54
|
+
// E6(n) == E7(10 * n)
|
|
55
|
+
//
|
|
56
|
+
// The corresponding properties are *not* true for E5, so if you use E5 then
|
|
57
|
+
// don't test for exact equality when comparing to other formats such as
|
|
58
|
+
// Degrees or E7.
|
|
59
|
+
//
|
|
60
|
+
// The following conversions between degrees and radians are exact:
|
|
61
|
+
//
|
|
62
|
+
// Degrees(180) == Radians(M_PI)
|
|
63
|
+
// Degrees(45 * k) == Radians(k * M_PI / 4) for k == 0..8
|
|
64
|
+
//
|
|
65
|
+
// These identities also hold when the arguments are scaled up or down by any
|
|
66
|
+
// power of 2. Some similar identities are also true, for example,
|
|
67
|
+
// Degrees(60) == Radians(M_PI / 3), but be aware that this type of identity
|
|
68
|
+
// does not hold in general. For example, Degrees(3) != Radians(M_PI / 60).
|
|
69
|
+
//
|
|
70
|
+
// Similarly, the conversion to radians means that Angle::Degrees(x).degrees()
|
|
71
|
+
// does not always equal "x". For example,
|
|
72
|
+
//
|
|
73
|
+
// S1Angle::Degrees(45 * k).degrees() == 45 * k for k == 0..8
|
|
74
|
+
// but S1Angle::Degrees(60).degrees() != 60.
|
|
75
|
+
//
|
|
76
|
+
// This means that when testing for equality, you should allow for numerical
|
|
77
|
+
// errors (EXPECT_DOUBLE_EQ) or convert to discrete E5/E6/E7 values first.
|
|
78
|
+
//
|
|
79
|
+
// CAVEAT: All of the above properties depend on "double" being the usual
|
|
80
|
+
// 64-bit IEEE 754 type (which is true on almost all modern platforms).
|
|
81
|
+
//
|
|
82
|
+
// This class is intended to be copied by value as desired. It uses
|
|
83
|
+
// the default copy constructor and assignment operator.
|
|
84
|
+
class S1Angle {
|
|
85
|
+
public:
|
|
86
|
+
// These methods construct S1Angle objects from their measure in radians
|
|
87
|
+
// or degrees.
|
|
88
|
+
static constexpr S1Angle Radians(double radians);
|
|
89
|
+
static constexpr S1Angle Degrees(double degrees);
|
|
90
|
+
static constexpr S1Angle E5(int32 e5);
|
|
91
|
+
static constexpr S1Angle E6(int32 e6);
|
|
92
|
+
static constexpr S1Angle E7(int32 e7);
|
|
93
|
+
|
|
94
|
+
// Convenience functions -- to use when args have been fixed32s in protos.
|
|
95
|
+
//
|
|
96
|
+
// The arguments are static_cast into int32, so very large unsigned values
|
|
97
|
+
// are treated as negative numbers.
|
|
98
|
+
static constexpr S1Angle UnsignedE6(uint32 e6);
|
|
99
|
+
static constexpr S1Angle UnsignedE7(uint32 e7);
|
|
100
|
+
|
|
101
|
+
// The default constructor yields a zero angle. This is useful for STL
|
|
102
|
+
// containers and class methods with output arguments.
|
|
103
|
+
IFNDEF_SWIG(constexpr) S1Angle() : radians_(0) {}
|
|
104
|
+
|
|
105
|
+
// Return an angle larger than any finite angle.
|
|
106
|
+
static constexpr S1Angle Infinity();
|
|
107
|
+
|
|
108
|
+
// A explicit shorthand for the default constructor.
|
|
109
|
+
static constexpr S1Angle Zero();
|
|
110
|
+
|
|
111
|
+
// Return the angle between two points, which is also equal to the distance
|
|
112
|
+
// between these points on the unit sphere. The points do not need to be
|
|
113
|
+
// normalized. This function has a maximum error of 3.25 * DBL_EPSILON (or
|
|
114
|
+
// 2.5 * DBL_EPSILON for angles up to 1 radian). If either point is
|
|
115
|
+
// zero-length (e.g. an uninitialized S2Point), or almost zero-length, the
|
|
116
|
+
// resulting angle will be zero.
|
|
117
|
+
S1Angle(const S2Point& x, const S2Point& y);
|
|
118
|
+
|
|
119
|
+
// Like the constructor above, but return the angle (i.e., distance) between
|
|
120
|
+
// two S2LatLng points. This function has about 15 digits of accuracy for
|
|
121
|
+
// small distances but only about 8 digits of accuracy as the distance
|
|
122
|
+
// approaches 180 degrees (i.e., nearly-antipodal points).
|
|
123
|
+
S1Angle(const S2LatLng& x, const S2LatLng& y);
|
|
124
|
+
|
|
125
|
+
constexpr double radians() const;
|
|
126
|
+
constexpr double degrees() const;
|
|
127
|
+
|
|
128
|
+
int32 e5() const;
|
|
129
|
+
int32 e6() const;
|
|
130
|
+
int32 e7() const;
|
|
131
|
+
|
|
132
|
+
// Return the absolute value of an angle.
|
|
133
|
+
S1Angle abs() const;
|
|
134
|
+
|
|
135
|
+
// Comparison operators.
|
|
136
|
+
friend bool operator==(S1Angle x, S1Angle y);
|
|
137
|
+
friend bool operator!=(S1Angle x, S1Angle y);
|
|
138
|
+
friend bool operator<(S1Angle x, S1Angle y);
|
|
139
|
+
friend bool operator>(S1Angle x, S1Angle y);
|
|
140
|
+
friend bool operator<=(S1Angle x, S1Angle y);
|
|
141
|
+
friend bool operator>=(S1Angle x, S1Angle y);
|
|
142
|
+
|
|
143
|
+
// Simple arithmetic operators for manipulating S1Angles.
|
|
144
|
+
friend S1Angle operator-(S1Angle a);
|
|
145
|
+
friend S1Angle operator+(S1Angle a, S1Angle b);
|
|
146
|
+
friend S1Angle operator-(S1Angle a, S1Angle b);
|
|
147
|
+
friend S1Angle operator*(double m, S1Angle a);
|
|
148
|
+
friend S1Angle operator*(S1Angle a, double m);
|
|
149
|
+
friend S1Angle operator/(S1Angle a, double m);
|
|
150
|
+
friend double operator/(S1Angle a, S1Angle b);
|
|
151
|
+
S1Angle& operator+=(S1Angle a);
|
|
152
|
+
S1Angle& operator-=(S1Angle a);
|
|
153
|
+
S1Angle& operator*=(double m);
|
|
154
|
+
S1Angle& operator/=(double m);
|
|
155
|
+
|
|
156
|
+
// Trigonmetric functions (not necessary but slightly more convenient).
|
|
157
|
+
friend double sin(S1Angle a);
|
|
158
|
+
friend double cos(S1Angle a);
|
|
159
|
+
friend double tan(S1Angle a);
|
|
160
|
+
|
|
161
|
+
// Return the angle normalized to the range (-180, 180] degrees.
|
|
162
|
+
S1Angle Normalized() const;
|
|
163
|
+
|
|
164
|
+
// Normalize this angle to the range (-180, 180] degrees.
|
|
165
|
+
void Normalize();
|
|
166
|
+
|
|
167
|
+
// When S1Angle is used as a key in one of the btree container types
|
|
168
|
+
// (util/btree), indicate that linear rather than binary search should be
|
|
169
|
+
// used. This is much faster when the comparison function is cheap.
|
|
170
|
+
typedef std::true_type goog_btree_prefer_linear_node_search;
|
|
171
|
+
|
|
172
|
+
private:
|
|
173
|
+
explicit IFNDEF_SWIG(constexpr) S1Angle(double radians) : radians_(radians) {}
|
|
174
|
+
double radians_;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
////////////////// Implementation details follow ////////////////////
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
inline constexpr S1Angle S1Angle::Infinity() {
|
|
182
|
+
return S1Angle(std::numeric_limits<double>::infinity());
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
inline constexpr S1Angle S1Angle::Zero() {
|
|
186
|
+
return S1Angle(0);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
inline constexpr double S1Angle::radians() const {
|
|
190
|
+
return radians_;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
inline constexpr double S1Angle::degrees() const {
|
|
194
|
+
return (180 / M_PI) * radians_;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Note that the E5, E6, and E7 conversion involve two multiplications rather
|
|
198
|
+
// than one. This is mainly for backwards compatibility (changing this would
|
|
199
|
+
// break many tests), but it does have the nice side effect that conversions
|
|
200
|
+
// between Degrees, E6, and E7 are exact when the arguments are integers.
|
|
201
|
+
|
|
202
|
+
inline int32 S1Angle::e5() const {
|
|
203
|
+
return MathUtil::FastIntRound(1e5 * degrees());
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
inline int32 S1Angle::e6() const {
|
|
207
|
+
return MathUtil::FastIntRound(1e6 * degrees());
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
inline int32 S1Angle::e7() const {
|
|
211
|
+
return MathUtil::FastIntRound(1e7 * degrees());
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
inline S1Angle S1Angle::abs() const {
|
|
215
|
+
return S1Angle(std::fabs(radians_));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
inline bool operator==(S1Angle x, S1Angle y) {
|
|
219
|
+
return x.radians() == y.radians();
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
inline bool operator!=(S1Angle x, S1Angle y) {
|
|
223
|
+
return x.radians() != y.radians();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
inline bool operator<(S1Angle x, S1Angle y) {
|
|
227
|
+
return x.radians() < y.radians();
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
inline bool operator>(S1Angle x, S1Angle y) {
|
|
231
|
+
return x.radians() > y.radians();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
inline bool operator<=(S1Angle x, S1Angle y) {
|
|
235
|
+
return x.radians() <= y.radians();
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
inline bool operator>=(S1Angle x, S1Angle y) {
|
|
239
|
+
return x.radians() >= y.radians();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
inline S1Angle operator-(S1Angle a) {
|
|
243
|
+
return S1Angle::Radians(-a.radians());
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
inline S1Angle operator+(S1Angle a, S1Angle b) {
|
|
247
|
+
return S1Angle::Radians(a.radians() + b.radians());
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
inline S1Angle operator-(S1Angle a, S1Angle b) {
|
|
251
|
+
return S1Angle::Radians(a.radians() - b.radians());
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
inline S1Angle operator*(double m, S1Angle a) {
|
|
255
|
+
return S1Angle::Radians(m * a.radians());
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
inline S1Angle operator*(S1Angle a, double m) {
|
|
259
|
+
return S1Angle::Radians(m * a.radians());
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
inline S1Angle operator/(S1Angle a, double m) {
|
|
263
|
+
return S1Angle::Radians(a.radians() / m);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
inline double operator/(S1Angle a, S1Angle b) {
|
|
267
|
+
return a.radians() / b.radians();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
inline S1Angle& S1Angle::operator+=(S1Angle a) {
|
|
271
|
+
radians_ += a.radians();
|
|
272
|
+
return *this;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
inline S1Angle& S1Angle::operator-=(S1Angle a) {
|
|
276
|
+
radians_ -= a.radians();
|
|
277
|
+
return *this;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
inline S1Angle& S1Angle::operator*=(double m) {
|
|
281
|
+
radians_ *= m;
|
|
282
|
+
return *this;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
inline S1Angle& S1Angle::operator/=(double m) {
|
|
286
|
+
radians_ /= m;
|
|
287
|
+
return *this;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
inline double sin(S1Angle a) {
|
|
291
|
+
return sin(a.radians());
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
inline double cos(S1Angle a) {
|
|
295
|
+
return cos(a.radians());
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
inline double tan(S1Angle a) {
|
|
299
|
+
return tan(a.radians());
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
inline constexpr S1Angle S1Angle::Radians(double radians) {
|
|
303
|
+
return S1Angle(radians);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
inline constexpr S1Angle S1Angle::Degrees(double degrees) {
|
|
307
|
+
return S1Angle((M_PI / 180) * degrees);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
inline constexpr S1Angle S1Angle::E5(int32 e5) {
|
|
311
|
+
return Degrees(1e-5 * e5);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
inline constexpr S1Angle S1Angle::E6(int32 e6) {
|
|
315
|
+
return Degrees(1e-6 * e6);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
inline constexpr S1Angle S1Angle::E7(int32 e7) {
|
|
319
|
+
return Degrees(1e-7 * e7);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
inline constexpr S1Angle S1Angle::UnsignedE6(uint32 e6) {
|
|
323
|
+
return E6(static_cast<int32>(e6));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
inline constexpr S1Angle S1Angle::UnsignedE7(uint32 e7) {
|
|
327
|
+
return E7(static_cast<int32>(e7));
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Writes the angle in degrees with 7 digits of precision after the
|
|
331
|
+
// decimal point, e.g. "17.3745904".
|
|
332
|
+
std::ostream& operator<<(std::ostream& os, S1Angle a);
|
|
333
|
+
|
|
334
|
+
#undef IFNDEF_SWIG
|
|
335
|
+
|
|
336
|
+
#endif // S2_S1ANGLE_H_
|
|
@@ -0,0 +1,185 @@
|
|
|
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/s1angle.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
|
|
22
|
+
#include "s2/base/integral_types.h"
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/s2latlng.h"
|
|
25
|
+
#include "s2/s2testing.h"
|
|
26
|
+
|
|
27
|
+
TEST(S1Angle, DefaultConstructor) {
|
|
28
|
+
// Check that the default constructor returns an angle of 0.
|
|
29
|
+
S1Angle a;
|
|
30
|
+
EXPECT_EQ(0, a.radians());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
TEST(S1Angle, Infinity) {
|
|
34
|
+
EXPECT_LT(S1Angle::Radians(1e30), S1Angle::Infinity());
|
|
35
|
+
EXPECT_LT(-S1Angle::Infinity(), S1Angle::Zero());
|
|
36
|
+
EXPECT_EQ(S1Angle::Infinity(), S1Angle::Infinity());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
TEST(S1Angle, Zero) {
|
|
40
|
+
EXPECT_EQ(S1Angle::Radians(0), S1Angle::Zero());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
TEST(S1Angle, PiRadiansExactly180Degrees) {
|
|
44
|
+
// Check that the conversion between Pi radians and 180 degrees is exact.
|
|
45
|
+
EXPECT_EQ(M_PI, S1Angle::Radians(M_PI).radians());
|
|
46
|
+
EXPECT_EQ(180.0, S1Angle::Radians(M_PI).degrees());
|
|
47
|
+
EXPECT_EQ(M_PI, S1Angle::Degrees(180).radians());
|
|
48
|
+
EXPECT_EQ(180.0, S1Angle::Degrees(180).degrees());
|
|
49
|
+
|
|
50
|
+
EXPECT_EQ(90.0, S1Angle::Radians(M_PI_2).degrees());
|
|
51
|
+
|
|
52
|
+
// Check negative angles.
|
|
53
|
+
EXPECT_EQ(-90.0, S1Angle::Radians(-M_PI_2).degrees());
|
|
54
|
+
EXPECT_EQ(-M_PI_4, S1Angle::Degrees(-45).radians());
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
TEST(S1Angle, E5E6E7Representations) {
|
|
58
|
+
// Check that E5/E6/E7 representations work as expected.
|
|
59
|
+
EXPECT_DOUBLE_EQ(S1Angle::Degrees(-45).radians(),
|
|
60
|
+
S1Angle::E5(-4500000).radians());
|
|
61
|
+
EXPECT_DOUBLE_EQ(S1Angle::Degrees(-60).radians(),
|
|
62
|
+
S1Angle::E6(-60000000).radians());
|
|
63
|
+
EXPECT_DOUBLE_EQ(S1Angle::Degrees(75).radians(),
|
|
64
|
+
S1Angle::E7(750000000).radians());
|
|
65
|
+
EXPECT_EQ(-17256123, S1Angle::Degrees(-172.56123).e5());
|
|
66
|
+
EXPECT_EQ(12345678, S1Angle::Degrees(12.345678).e6());
|
|
67
|
+
EXPECT_EQ(-123456789, S1Angle::Degrees(-12.3456789).e7());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
TEST(S1Angle, E6E7RepresentationsUnsigned) {
|
|
71
|
+
// Check that unsigned E6/E7 representations work as expected.
|
|
72
|
+
EXPECT_DOUBLE_EQ(
|
|
73
|
+
S1Angle::Degrees(60).radians(),
|
|
74
|
+
S1Angle::UnsignedE6(static_cast<uint32>(60000000)).radians());
|
|
75
|
+
EXPECT_DOUBLE_EQ(
|
|
76
|
+
S1Angle::Degrees(-60).radians(),
|
|
77
|
+
S1Angle::UnsignedE6(static_cast<uint32>(-60000000)).radians());
|
|
78
|
+
EXPECT_DOUBLE_EQ(
|
|
79
|
+
S1Angle::Degrees(75).radians(),
|
|
80
|
+
S1Angle::UnsignedE7(static_cast<uint32>(750000000)).radians());
|
|
81
|
+
EXPECT_DOUBLE_EQ(
|
|
82
|
+
S1Angle::Degrees(-75).radians(),
|
|
83
|
+
S1Angle::UnsignedE7(static_cast<uint32>(-750000000)).radians());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
TEST(S1Angle, NormalizeCorrectlyCanonicalizesAngles) {
|
|
87
|
+
EXPECT_DOUBLE_EQ(0.0, S1Angle::Degrees(360.0).Normalized().degrees());
|
|
88
|
+
EXPECT_DOUBLE_EQ(-90.0, S1Angle::Degrees(-90.0).Normalized().degrees());
|
|
89
|
+
EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(-180.0).Normalized().degrees());
|
|
90
|
+
EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(180.0).Normalized().degrees());
|
|
91
|
+
EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(540.0).Normalized().degrees());
|
|
92
|
+
EXPECT_DOUBLE_EQ(90.0, S1Angle::Degrees(-270.0).Normalized().degrees());
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
TEST(S1Angle, ArithmeticOperationsOnAngles) {
|
|
96
|
+
EXPECT_DOUBLE_EQ(0.3, S1Angle::Radians(-0.3).abs().radians());
|
|
97
|
+
EXPECT_DOUBLE_EQ(-0.1, (-S1Angle::Radians(0.1)).radians());
|
|
98
|
+
EXPECT_DOUBLE_EQ(0.4,
|
|
99
|
+
(S1Angle::Radians(0.1) + S1Angle::Radians(0.3)).radians());
|
|
100
|
+
EXPECT_DOUBLE_EQ(-0.2,
|
|
101
|
+
(S1Angle::Radians(0.1) - S1Angle::Radians(0.3)).radians());
|
|
102
|
+
EXPECT_DOUBLE_EQ(0.6, (2 * S1Angle::Radians(0.3)).radians());
|
|
103
|
+
EXPECT_DOUBLE_EQ(0.6, (S1Angle::Radians(0.3) * 2).radians());
|
|
104
|
+
EXPECT_DOUBLE_EQ(0.15, (S1Angle::Radians(0.3) / 2).radians());
|
|
105
|
+
EXPECT_DOUBLE_EQ(0.5, (S1Angle::Radians(0.3) / S1Angle::Radians(0.6)));
|
|
106
|
+
|
|
107
|
+
S1Angle tmp = S1Angle::Radians(1.0);
|
|
108
|
+
tmp += S1Angle::Radians(0.5);
|
|
109
|
+
EXPECT_DOUBLE_EQ(1.5, tmp.radians());
|
|
110
|
+
tmp -= S1Angle::Radians(1.0);
|
|
111
|
+
EXPECT_DOUBLE_EQ(0.5, tmp.radians());
|
|
112
|
+
tmp *= 5;
|
|
113
|
+
EXPECT_DOUBLE_EQ(2.5, tmp.radians());
|
|
114
|
+
tmp /= 2;
|
|
115
|
+
EXPECT_DOUBLE_EQ(1.25, tmp.radians());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
TEST(S1Angle, Trigonometry) {
|
|
119
|
+
// Spot check a few angles to ensure that the correct function is called.
|
|
120
|
+
EXPECT_DOUBLE_EQ(1, cos(S1Angle::Degrees(0)));
|
|
121
|
+
EXPECT_DOUBLE_EQ(1, sin(S1Angle::Degrees(90)));
|
|
122
|
+
EXPECT_DOUBLE_EQ(1, tan(S1Angle::Degrees(45)));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
TEST(S1Angle, ConstructorsThatMeasureAngles) {
|
|
126
|
+
EXPECT_DOUBLE_EQ(M_PI_2,
|
|
127
|
+
S1Angle(S2Point(1, 0, 0), S2Point(0, 0, 2)).radians());
|
|
128
|
+
EXPECT_DOUBLE_EQ(0.0, S1Angle(S2Point(1, 0, 0), S2Point(1, 0, 0)).radians());
|
|
129
|
+
EXPECT_NEAR(50.0,
|
|
130
|
+
S1Angle(S2LatLng::FromDegrees(20, 20),
|
|
131
|
+
S2LatLng::FromDegrees(70, 20)).degrees(),
|
|
132
|
+
1e-13);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
TEST(S1Angle, TestFormatting) {
|
|
136
|
+
std::ostringstream ss;
|
|
137
|
+
ss << S1Angle::Degrees(180.0);
|
|
138
|
+
EXPECT_EQ("180.0000000", ss.str());
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The current implementation guarantees exact conversions between
|
|
142
|
+
// Degrees() and E6() when the Degrees() argument is an integer.
|
|
143
|
+
TEST(S1Angle, DegreesVsE6) {
|
|
144
|
+
for (int i = 0; i <= 180; ++i) {
|
|
145
|
+
EXPECT_EQ(S1Angle::Degrees(i), S1Angle::E6(1000000 * i));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The current implementation guarantees exact conversions between
|
|
150
|
+
// Degrees() and E7() when the Degrees() argument is an integer.
|
|
151
|
+
TEST(S1Angle, DegreesVsE7) {
|
|
152
|
+
for (int i = 0; i <= 180; ++i) {
|
|
153
|
+
EXPECT_EQ(S1Angle::Degrees(i), S1Angle::E7(10000000 * i));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// The current implementation guarantees exact conversions between
|
|
158
|
+
// E6() and E7() when the E6() argument is an integer.
|
|
159
|
+
TEST(S1Angle, E6VsE7) {
|
|
160
|
+
S2Testing::rnd.Reset(FLAGS_s2_random_seed);
|
|
161
|
+
for (int iter = 0; iter < 1000; ++iter) {
|
|
162
|
+
int i = S2Testing::rnd.Uniform(180000000);
|
|
163
|
+
EXPECT_EQ(S1Angle::E6(i), S1Angle::E7(10 * i));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// The current implementation guarantees certain exact conversions between
|
|
168
|
+
// degrees and radians (see the header file for details).
|
|
169
|
+
TEST(S1Angle, DegreesVsRadians) {
|
|
170
|
+
for (int k = -8; k <= 8; ++k) {
|
|
171
|
+
EXPECT_EQ(S1Angle::Degrees(45 * k), S1Angle::Radians(k * M_PI / 4));
|
|
172
|
+
EXPECT_EQ(45 * k, S1Angle::Degrees(45 * k).degrees());
|
|
173
|
+
}
|
|
174
|
+
for (int k = 0; k <= 30; ++k) {
|
|
175
|
+
int n = 1 << k;
|
|
176
|
+
EXPECT_EQ(S1Angle::Degrees(180. / n), S1Angle::Radians(M_PI / n));
|
|
177
|
+
EXPECT_EQ(S1Angle::Degrees(60. / n), S1Angle::Radians(M_PI / (3. * n)));
|
|
178
|
+
EXPECT_EQ(S1Angle::Degrees(36. / n), S1Angle::Radians(M_PI / (5. * n)));
|
|
179
|
+
EXPECT_EQ(S1Angle::Degrees(20. / n), S1Angle::Radians(M_PI / (9. * n)));
|
|
180
|
+
EXPECT_EQ(S1Angle::Degrees(4. / n), S1Angle::Radians(M_PI / (45. * n)));
|
|
181
|
+
}
|
|
182
|
+
// We also spot check a couple of non-identities.
|
|
183
|
+
EXPECT_NE(S1Angle::Degrees(3), S1Angle::Radians(M_PI / 60));
|
|
184
|
+
EXPECT_NE(60, S1Angle::Degrees(60).degrees());
|
|
185
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
#include "s2/s1chord_angle.h"
|
|
19
|
+
|
|
20
|
+
#include <cfloat>
|
|
21
|
+
#include <cmath>
|
|
22
|
+
|
|
23
|
+
#include "s2/s1angle.h"
|
|
24
|
+
#include "s2/s2pointutil.h"
|
|
25
|
+
|
|
26
|
+
using std::max;
|
|
27
|
+
using std::min;
|
|
28
|
+
// Android with gnustl has ::nextafter but not std::nextafter.
|
|
29
|
+
// https://github.com/android-ndk/ndk/issues/82
|
|
30
|
+
// Check for gnustl with _GLIBCXX_CMATH, which is its cmath include
|
|
31
|
+
// guard.
|
|
32
|
+
#if !defined(__ANDROID__) || !defined(_GLIBCXX_CMATH)
|
|
33
|
+
using std::nextafter;
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
static constexpr double kMaxLength2 = 4.0;
|
|
37
|
+
|
|
38
|
+
S1ChordAngle::S1ChordAngle(S1Angle angle) {
|
|
39
|
+
if (angle.radians() < 0) {
|
|
40
|
+
*this = Negative();
|
|
41
|
+
} else if (angle == S1Angle::Infinity()) {
|
|
42
|
+
*this = Infinity();
|
|
43
|
+
} else {
|
|
44
|
+
// The chord length is 2 * sin(angle / 2).
|
|
45
|
+
double length = 2 * sin(0.5 * min(M_PI, angle.radians()));
|
|
46
|
+
length2_ = length * length;
|
|
47
|
+
}
|
|
48
|
+
S2_DCHECK(is_valid());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
S1Angle S1ChordAngle::ToAngle() const {
|
|
52
|
+
if (is_negative()) return S1Angle::Radians(-1);
|
|
53
|
+
if (is_infinity()) return S1Angle::Infinity();
|
|
54
|
+
return S1Angle::Radians(2 * asin(0.5 * sqrt(length2_)));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
bool S1ChordAngle::is_valid() const {
|
|
58
|
+
return (length2_ >= 0 && length2_ <= kMaxLength2) || is_special();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
S1ChordAngle S1ChordAngle::Successor() const {
|
|
62
|
+
if (length2_ >= kMaxLength2) return Infinity();
|
|
63
|
+
if (length2_ < 0.0) return Zero();
|
|
64
|
+
return S1ChordAngle(nextafter(length2_, 10.0));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
S1ChordAngle S1ChordAngle::Predecessor() const {
|
|
68
|
+
if (length2_ <= 0.0) return Negative();
|
|
69
|
+
if (length2_ > kMaxLength2) return Straight();
|
|
70
|
+
return S1ChordAngle(nextafter(length2_, -10.0));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
S1ChordAngle S1ChordAngle::PlusError(double error) const {
|
|
74
|
+
// If angle is Negative() or Infinity(), don't change it.
|
|
75
|
+
// Otherwise clamp it to the valid range.
|
|
76
|
+
if (is_special()) return *this;
|
|
77
|
+
return S1ChordAngle(max(0.0, min(kMaxLength2, length2_ + error)));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
double S1ChordAngle::GetS2PointConstructorMaxError() const {
|
|
81
|
+
// There is a relative error of 2.5 * DBL_EPSILON when computing the squared
|
|
82
|
+
// distance, plus a relative error of 2 * DBL_EPSILON and an absolute error
|
|
83
|
+
// of (16 * DBL_EPSILON**2) because the lengths of the input points may
|
|
84
|
+
// differ from 1 by up to (2 * DBL_EPSILON) each. (This is the maximum
|
|
85
|
+
// length error in S2Point::Normalize.)
|
|
86
|
+
return 4.5 * DBL_EPSILON * length2_ + 16 * DBL_EPSILON * DBL_EPSILON;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
double S1ChordAngle::GetS1AngleConstructorMaxError() const {
|
|
90
|
+
// Assuming that an accurate math library is being used, the sin() call and
|
|
91
|
+
// the multiply each have a relative error of 0.5 * DBL_EPSILON.
|
|
92
|
+
return DBL_EPSILON * length2_;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
S1ChordAngle operator+(S1ChordAngle a, S1ChordAngle b) {
|
|
96
|
+
// Note that this method is much more efficient than converting the chord
|
|
97
|
+
// angles to S1Angles and adding those. It requires only one square root
|
|
98
|
+
// plus a few additions and multiplications.
|
|
99
|
+
S2_DCHECK(!a.is_special());
|
|
100
|
+
S2_DCHECK(!b.is_special());
|
|
101
|
+
|
|
102
|
+
// Optimization for the common case where "b" is an error tolerance
|
|
103
|
+
// parameter that happens to be set to zero.
|
|
104
|
+
double a2 = a.length2(), b2 = b.length2();
|
|
105
|
+
if (b2 == 0) return a;
|
|
106
|
+
|
|
107
|
+
// Clamp the angle sum to at most 180 degrees.
|
|
108
|
+
if (a2 + b2 >= kMaxLength2) return S1ChordAngle::Straight();
|
|
109
|
+
|
|
110
|
+
// Let "a" and "b" be the (non-squared) chord lengths, and let c = a+b.
|
|
111
|
+
// Let A, B, and C be the corresponding half-angles (a = 2*sin(A), etc).
|
|
112
|
+
// Then the formula below can be derived from c = 2 * sin(A+B) and the
|
|
113
|
+
// relationships sin(A+B) = sin(A)*cos(B) + sin(B)*cos(A)
|
|
114
|
+
// cos(X) = sqrt(1 - sin^2(X)) .
|
|
115
|
+
|
|
116
|
+
double x = a2 * (1 - 0.25 * b2); // is_valid() => non-negative
|
|
117
|
+
double y = b2 * (1 - 0.25 * a2); // is_valid() => non-negative
|
|
118
|
+
return S1ChordAngle(min(kMaxLength2, x + y + 2 * sqrt(x * y)));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
S1ChordAngle operator-(S1ChordAngle a, S1ChordAngle b) {
|
|
122
|
+
// See comments in operator+().
|
|
123
|
+
S2_DCHECK(!a.is_special());
|
|
124
|
+
S2_DCHECK(!b.is_special());
|
|
125
|
+
double a2 = a.length2(), b2 = b.length2();
|
|
126
|
+
if (b2 == 0) return a;
|
|
127
|
+
if (a2 <= b2) return S1ChordAngle::Zero();
|
|
128
|
+
double x = a2 * (1 - 0.25 * b2);
|
|
129
|
+
double y = b2 * (1 - 0.25 * a2);
|
|
130
|
+
return S1ChordAngle(max(0.0, x + y - 2 * sqrt(x * y)));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
double sin2(S1ChordAngle a) {
|
|
134
|
+
S2_DCHECK(!a.is_special());
|
|
135
|
+
// Let "a" be the (non-squared) chord length, and let A be the corresponding
|
|
136
|
+
// half-angle (a = 2*sin(A)). The formula below can be derived from:
|
|
137
|
+
// sin(2*A) = 2 * sin(A) * cos(A)
|
|
138
|
+
// cos^2(A) = 1 - sin^2(A)
|
|
139
|
+
// This is much faster than converting to an angle and computing its sine.
|
|
140
|
+
return a.length2() * (1 - 0.25 * a.length2());
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
double sin(S1ChordAngle a) {
|
|
144
|
+
return sqrt(sin2(a));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
double cos(S1ChordAngle a) {
|
|
148
|
+
// cos(2*A) = cos^2(A) - sin^2(A) = 1 - 2*sin^2(A)
|
|
149
|
+
S2_DCHECK(!a.is_special());
|
|
150
|
+
return 1 - 0.5 * a.length2();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
double tan(S1ChordAngle a) {
|
|
154
|
+
return sin(a) / cos(a);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
std::ostream& operator<<(std::ostream& os, S1ChordAngle a) {
|
|
158
|
+
return os << a.ToAngle();
|
|
159
|
+
}
|