@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,344 @@
|
|
|
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/s2latlng_rect_bounder.h"
|
|
19
|
+
|
|
20
|
+
#include <cfloat>
|
|
21
|
+
#include <cmath>
|
|
22
|
+
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/r1interval.h"
|
|
25
|
+
#include "s2/s1chord_angle.h"
|
|
26
|
+
#include "s2/s1interval.h"
|
|
27
|
+
#include "s2/s2pointutil.h"
|
|
28
|
+
|
|
29
|
+
using std::fabs;
|
|
30
|
+
using std::max;
|
|
31
|
+
using std::min;
|
|
32
|
+
|
|
33
|
+
void S2LatLngRectBounder::AddPoint(const S2Point& b) {
|
|
34
|
+
S2_DCHECK(S2::IsUnitLength(b));
|
|
35
|
+
AddInternal(b, S2LatLng(b));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void S2LatLngRectBounder::AddLatLng(const S2LatLng& b_latlng) {
|
|
39
|
+
AddInternal(b_latlng.ToPoint(), b_latlng);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void S2LatLngRectBounder::AddInternal(const S2Point& b,
|
|
43
|
+
const S2LatLng& b_latlng) {
|
|
44
|
+
// Simple consistency check to verify that b and b_latlng are alternate
|
|
45
|
+
// representations of the same vertex.
|
|
46
|
+
S2_DCHECK(S2::ApproxEquals(b, b_latlng.ToPoint()));
|
|
47
|
+
|
|
48
|
+
if (bound_.is_empty()) {
|
|
49
|
+
bound_.AddPoint(b_latlng);
|
|
50
|
+
} else {
|
|
51
|
+
// First compute the cross product N = A x B robustly. This is the normal
|
|
52
|
+
// to the great circle through A and B. We don't use S2::RobustCrossProd()
|
|
53
|
+
// since that method returns an arbitrary vector orthogonal to A if the two
|
|
54
|
+
// vectors are proportional, and we want the zero vector in that case.
|
|
55
|
+
Vector3_d n = (a_ - b).CrossProd(a_ + b); // N = 2 * (A x B)
|
|
56
|
+
|
|
57
|
+
// The relative error in N gets large as its norm gets very small (i.e.,
|
|
58
|
+
// when the two points are nearly identical or antipodal). We handle this
|
|
59
|
+
// by choosing a maximum allowable error, and if the error is greater than
|
|
60
|
+
// this we fall back to a different technique. Since it turns out that
|
|
61
|
+
// the other sources of error in converting the normal to a maximum
|
|
62
|
+
// latitude add up to at most 1.16 * DBL_EPSILON (see below), and it is
|
|
63
|
+
// desirable to have the total error be a multiple of DBL_EPSILON, we have
|
|
64
|
+
// chosen to limit the maximum error in the normal to 3.84 * DBL_EPSILON.
|
|
65
|
+
// It is possible to show that the error is less than this when
|
|
66
|
+
//
|
|
67
|
+
// n.Norm() >= 8 * sqrt(3) / (3.84 - 0.5 - sqrt(3)) * DBL_EPSILON
|
|
68
|
+
// = 1.91346e-15 (about 8.618 * DBL_EPSILON)
|
|
69
|
+
double n_norm = n.Norm();
|
|
70
|
+
if (n_norm < 1.91346e-15) {
|
|
71
|
+
// A and B are either nearly identical or nearly antipodal (to within
|
|
72
|
+
// 4.309 * DBL_EPSILON, or about 6 nanometers on the earth's surface).
|
|
73
|
+
if (a_.DotProd(b) < 0) {
|
|
74
|
+
// The two points are nearly antipodal. The easiest solution is to
|
|
75
|
+
// assume that the edge between A and B could go in any direction
|
|
76
|
+
// around the sphere.
|
|
77
|
+
bound_ = S2LatLngRect::Full();
|
|
78
|
+
} else {
|
|
79
|
+
// The two points are nearly identical (to within 4.309 * DBL_EPSILON).
|
|
80
|
+
// In this case we can just use the bounding rectangle of the points,
|
|
81
|
+
// since after the expansion done by GetBound() this rectangle is
|
|
82
|
+
// guaranteed to include the (lat,lng) values of all points along AB.
|
|
83
|
+
bound_ = bound_.Union(S2LatLngRect::FromPointPair(a_latlng_, b_latlng));
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
// Compute the longitude range spanned by AB.
|
|
87
|
+
S1Interval lng_ab = S1Interval::FromPointPair(a_latlng_.lng().radians(),
|
|
88
|
+
b_latlng.lng().radians());
|
|
89
|
+
if (lng_ab.GetLength() >= M_PI - 2 * DBL_EPSILON) {
|
|
90
|
+
// The points lie on nearly opposite lines of longitude to within the
|
|
91
|
+
// maximum error of the calculation. (Note that this test relies on
|
|
92
|
+
// the fact that M_PI is slightly less than the true value of Pi, and
|
|
93
|
+
// that representable values near M_PI are 2 * DBL_EPSILON apart.)
|
|
94
|
+
// The easiest solution is to assume that AB could go on either side
|
|
95
|
+
// of the pole.
|
|
96
|
+
lng_ab = S1Interval::Full();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Next we compute the latitude range spanned by the edge AB. We start
|
|
100
|
+
// with the range spanning the two endpoints of the edge:
|
|
101
|
+
R1Interval lat_ab = R1Interval::FromPointPair(a_latlng_.lat().radians(),
|
|
102
|
+
b_latlng.lat().radians());
|
|
103
|
+
|
|
104
|
+
// This is the desired range unless the edge AB crosses the plane
|
|
105
|
+
// through N and the Z-axis (which is where the great circle through A
|
|
106
|
+
// and B attains its minimum and maximum latitudes). To test whether AB
|
|
107
|
+
// crosses this plane, we compute a vector M perpendicular to this
|
|
108
|
+
// plane and then project A and B onto it.
|
|
109
|
+
Vector3_d m = n.CrossProd(S2Point(0, 0, 1));
|
|
110
|
+
double m_a = m.DotProd(a_);
|
|
111
|
+
double m_b = m.DotProd(b);
|
|
112
|
+
|
|
113
|
+
// We want to test the signs of "m_a" and "m_b", so we need to bound
|
|
114
|
+
// the error in these calculations. It is possible to show that the
|
|
115
|
+
// total error is bounded by
|
|
116
|
+
//
|
|
117
|
+
// (1 + sqrt(3)) * DBL_EPSILON * n_norm + 8 * sqrt(3) * (DBL_EPSILON**2)
|
|
118
|
+
// = 6.06638e-16 * n_norm + 6.83174e-31
|
|
119
|
+
|
|
120
|
+
double m_error = 6.06638e-16 * n_norm + 6.83174e-31;
|
|
121
|
+
if (m_a * m_b < 0 || fabs(m_a) <= m_error || fabs(m_b) <= m_error) {
|
|
122
|
+
// Minimum/maximum latitude *may* occur in the edge interior.
|
|
123
|
+
//
|
|
124
|
+
// The maximum latitude is 90 degrees minus the latitude of N. We
|
|
125
|
+
// compute this directly using atan2 in order to get maximum accuracy
|
|
126
|
+
// near the poles.
|
|
127
|
+
//
|
|
128
|
+
// Our goal is compute a bound that contains the computed latitudes of
|
|
129
|
+
// all S2Points P that pass the point-in-polygon containment test.
|
|
130
|
+
// There are three sources of error we need to consider:
|
|
131
|
+
// - the directional error in N (at most 3.84 * DBL_EPSILON)
|
|
132
|
+
// - converting N to a maximum latitude
|
|
133
|
+
// - computing the latitude of the test point P
|
|
134
|
+
// The latter two sources of error are at most 0.955 * DBL_EPSILON
|
|
135
|
+
// individually, but it is possible to show by a more complex analysis
|
|
136
|
+
// that together they can add up to at most 1.16 * DBL_EPSILON, for a
|
|
137
|
+
// total error of 5 * DBL_EPSILON.
|
|
138
|
+
//
|
|
139
|
+
// We add 3 * DBL_EPSILON to the bound here, and GetBound() will pad
|
|
140
|
+
// the bound by another 2 * DBL_EPSILON.
|
|
141
|
+
double max_lat = min(
|
|
142
|
+
atan2(sqrt(n[0]*n[0] + n[1]*n[1]), fabs(n[2])) + 3 * DBL_EPSILON,
|
|
143
|
+
M_PI_2);
|
|
144
|
+
|
|
145
|
+
// In order to get tight bounds when the two points are close together,
|
|
146
|
+
// we also bound the min/max latitude relative to the latitudes of the
|
|
147
|
+
// endpoints A and B. First we compute the distance between A and B,
|
|
148
|
+
// and then we compute the maximum change in latitude between any two
|
|
149
|
+
// points along the great circle that are separated by this distance.
|
|
150
|
+
// This gives us a latitude change "budget". Some of this budget must
|
|
151
|
+
// be spent getting from A to B; the remainder bounds the round-trip
|
|
152
|
+
// distance (in latitude) from A or B to the min or max latitude
|
|
153
|
+
// attained along the edge AB.
|
|
154
|
+
double lat_budget = 2 * asin(0.5 * (a_ - b).Norm() * sin(max_lat));
|
|
155
|
+
double max_delta = 0.5*(lat_budget - lat_ab.GetLength()) + DBL_EPSILON;
|
|
156
|
+
|
|
157
|
+
// Test whether AB passes through the point of maximum latitude or
|
|
158
|
+
// minimum latitude. If the dot product(s) are small enough then the
|
|
159
|
+
// result may be ambiguous.
|
|
160
|
+
if (m_a <= m_error && m_b >= -m_error) {
|
|
161
|
+
lat_ab.set_hi(min(max_lat, lat_ab.hi() + max_delta));
|
|
162
|
+
}
|
|
163
|
+
if (m_b <= m_error && m_a >= -m_error) {
|
|
164
|
+
lat_ab.set_lo(max(-max_lat, lat_ab.lo() - max_delta));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
bound_ = bound_.Union(S2LatLngRect(lat_ab, lng_ab));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
a_ = b;
|
|
171
|
+
a_latlng_ = b_latlng;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
S2LatLngRect S2LatLngRectBounder::GetBound() const {
|
|
175
|
+
// To save time, we ignore numerical errors in the computed S2LatLngs while
|
|
176
|
+
// accumulating the bounds and then account for them here.
|
|
177
|
+
//
|
|
178
|
+
// S2LatLng(S2Point) has a maximum error of 0.955 * DBL_EPSILON in latitude.
|
|
179
|
+
// In the worst case, we might have rounded "inwards" when computing the
|
|
180
|
+
// bound and "outwards" when computing the latitude of a contained point P,
|
|
181
|
+
// therefore we expand the latitude bounds by 2 * DBL_EPSILON in each
|
|
182
|
+
// direction. (A more complex analysis shows that 1.5 * DBL_EPSILON is
|
|
183
|
+
// enough, but the expansion amount should be a multiple of DBL_EPSILON in
|
|
184
|
+
// order to avoid rounding errors during the expansion itself.)
|
|
185
|
+
//
|
|
186
|
+
// S2LatLng(S2Point) has a maximum error of DBL_EPSILON in longitude, which
|
|
187
|
+
// is simply the maximum rounding error for results in the range [-Pi, Pi].
|
|
188
|
+
// This is true because the Gnu implementation of atan2() comes from the IBM
|
|
189
|
+
// Accurate Mathematical Library, which implements correct rounding for this
|
|
190
|
+
// instrinsic (i.e., it returns the infinite precision result rounded to the
|
|
191
|
+
// nearest representable value, with ties rounded to even values). This
|
|
192
|
+
// implies that we don't need to expand the longitude bounds at all, since
|
|
193
|
+
// we only guarantee that the bound contains the *rounded* latitudes of
|
|
194
|
+
// contained points. The *true* latitudes of contained points may lie up to
|
|
195
|
+
// DBL_EPSILON outside of the returned bound.
|
|
196
|
+
|
|
197
|
+
const S2LatLng kExpansion = S2LatLng::FromRadians(2 * DBL_EPSILON, 0);
|
|
198
|
+
return bound_.Expanded(kExpansion).PolarClosure();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
S2LatLngRect S2LatLngRectBounder::ExpandForSubregions(
|
|
202
|
+
const S2LatLngRect& bound) {
|
|
203
|
+
// Empty bounds don't need expansion.
|
|
204
|
+
if (bound.is_empty()) return bound;
|
|
205
|
+
|
|
206
|
+
// First we need to check whether the bound B contains any nearly-antipodal
|
|
207
|
+
// points (to within 4.309 * DBL_EPSILON). If so then we need to return
|
|
208
|
+
// S2LatLngRect::Full(), since the subregion might have an edge between two
|
|
209
|
+
// such points, and AddPoint() returns Full() for such edges. Note that
|
|
210
|
+
// this can happen even if B is not Full(); for example, consider a loop
|
|
211
|
+
// that defines a 10km strip straddling the equator extending from
|
|
212
|
+
// longitudes -100 to +100 degrees.
|
|
213
|
+
//
|
|
214
|
+
// It is easy to check whether B contains any antipodal points, but checking
|
|
215
|
+
// for nearly-antipodal points is trickier. Essentially we consider the
|
|
216
|
+
// original bound B and its reflection through the origin B', and then test
|
|
217
|
+
// whether the minimum distance between B and B' is less than 4.309 *
|
|
218
|
+
// DBL_EPSILON.
|
|
219
|
+
|
|
220
|
+
// "lng_gap" is a lower bound on the longitudinal distance between B and its
|
|
221
|
+
// reflection B'. (2.5 * DBL_EPSILON is the maximum combined error of the
|
|
222
|
+
// endpoint longitude calculations and the GetLength() call.)
|
|
223
|
+
double lng_gap = max(0.0, M_PI - bound.lng().GetLength() - 2.5 * DBL_EPSILON);
|
|
224
|
+
|
|
225
|
+
// "min_abs_lat" is the minimum distance from B to the equator (if zero or
|
|
226
|
+
// negative, then B straddles the equator).
|
|
227
|
+
double min_abs_lat = max(bound.lat().lo(), -bound.lat().hi());
|
|
228
|
+
|
|
229
|
+
// "lat_gap1" and "lat_gap2" measure the minimum distance from B to the
|
|
230
|
+
// south and north poles respectively.
|
|
231
|
+
double lat_gap1 = M_PI_2 + bound.lat().lo();
|
|
232
|
+
double lat_gap2 = M_PI_2 - bound.lat().hi();
|
|
233
|
+
|
|
234
|
+
if (min_abs_lat >= 0) {
|
|
235
|
+
// The bound B does not straddle the equator. In this case the minimum
|
|
236
|
+
// distance is between one endpoint of the latitude edge in B closest to
|
|
237
|
+
// the equator and the other endpoint of that edge in B'. The latitude
|
|
238
|
+
// distance between these two points is 2*min_abs_lat, and the longitude
|
|
239
|
+
// distance is lng_gap. We could compute the distance exactly using the
|
|
240
|
+
// Haversine formula, but then we would need to bound the errors in that
|
|
241
|
+
// calculation. Since we only need accuracy when the distance is very
|
|
242
|
+
// small (close to 4.309 * DBL_EPSILON), we substitute the Euclidean
|
|
243
|
+
// distance instead. This gives us a right triangle XYZ with two edges of
|
|
244
|
+
// length x = 2*min_abs_lat and y ~= lng_gap. The desired distance is the
|
|
245
|
+
// length of the third edge "z", and we have
|
|
246
|
+
//
|
|
247
|
+
// z ~= sqrt(x^2 + y^2) >= (x + y) / sqrt(2)
|
|
248
|
+
//
|
|
249
|
+
// Therefore the region may contain nearly antipodal points only if
|
|
250
|
+
//
|
|
251
|
+
// 2*min_abs_lat + lng_gap < sqrt(2) * 4.309 * DBL_EPSILON
|
|
252
|
+
// ~= 1.354e-15
|
|
253
|
+
//
|
|
254
|
+
// Note that because the given bound B is conservative, "min_abs_lat" and
|
|
255
|
+
// "lng_gap" are both lower bounds on their true values so we do not need
|
|
256
|
+
// to make any adjustments for their errors.
|
|
257
|
+
if (2 * min_abs_lat + lng_gap < 1.354e-15) {
|
|
258
|
+
return S2LatLngRect::Full();
|
|
259
|
+
}
|
|
260
|
+
} else if (lng_gap >= M_PI_2) {
|
|
261
|
+
// B spans at most Pi/2 in longitude. The minimum distance is always
|
|
262
|
+
// between one corner of B and the diagonally opposite corner of B'. We
|
|
263
|
+
// use the same distance approximation that we used above; in this case
|
|
264
|
+
// we have an obtuse triangle XYZ with two edges of length x = lat_gap1
|
|
265
|
+
// and y = lat_gap2, and angle Z >= Pi/2 between them. We then have
|
|
266
|
+
//
|
|
267
|
+
// z >= sqrt(x^2 + y^2) >= (x + y) / sqrt(2)
|
|
268
|
+
//
|
|
269
|
+
// Unlike the case above, "lat_gap1" and "lat_gap2" are not lower bounds
|
|
270
|
+
// (because of the extra addition operation, and because M_PI_2 is not
|
|
271
|
+
// exactly equal to Pi/2); they can exceed their true values by up to
|
|
272
|
+
// 0.75 * DBL_EPSILON. Putting this all together, the region may
|
|
273
|
+
// contain nearly antipodal points only if
|
|
274
|
+
//
|
|
275
|
+
// lat_gap1 + lat_gap2 < (sqrt(2) * 4.309 + 1.5) * DBL_EPSILON
|
|
276
|
+
// ~= 1.687e-15
|
|
277
|
+
if (lat_gap1 + lat_gap2 < 1.687e-15) {
|
|
278
|
+
return S2LatLngRect::Full();
|
|
279
|
+
}
|
|
280
|
+
} else {
|
|
281
|
+
// Otherwise we know that (1) the bound straddles the equator and (2) its
|
|
282
|
+
// width in longitude is at least Pi/2. In this case the minimum
|
|
283
|
+
// distance can occur either between a corner of B and the diagonally
|
|
284
|
+
// opposite corner of B' (as in the case above), or between a corner of B
|
|
285
|
+
// and the opposite longitudinal edge reflected in B'. It is sufficient
|
|
286
|
+
// to only consider the corner-edge case, since this distance is also a
|
|
287
|
+
// lower bound on the corner-corner distance when that case applies.
|
|
288
|
+
|
|
289
|
+
// Consider the spherical triangle XYZ where X is a corner of B with
|
|
290
|
+
// minimum absolute latitude, Y is the closest pole to X, and Z is the
|
|
291
|
+
// point closest to X on the opposite longitudinal edge of B'. This is a
|
|
292
|
+
// right triangle (Z = Pi/2), and from the spherical law of sines we have
|
|
293
|
+
//
|
|
294
|
+
// sin(z) / sin(Z) = sin(y) / sin(Y)
|
|
295
|
+
// sin(max_lat_gap) / 1 = sin(d_min) / sin(lng_gap)
|
|
296
|
+
// sin(d_min) = sin(max_lat_gap) * sin(lng_gap)
|
|
297
|
+
//
|
|
298
|
+
// where "max_lat_gap" = max(lat_gap1, lat_gap2) and "d_min" is the
|
|
299
|
+
// desired minimum distance. Now using the facts that sin(t) >= (2/Pi)*t
|
|
300
|
+
// for 0 <= t <= Pi/2, that we only need an accurate approximation when
|
|
301
|
+
// at least one of "max_lat_gap" or "lng_gap" is extremely small (in
|
|
302
|
+
// which case sin(t) ~= t), and recalling that "max_lat_gap" has an error
|
|
303
|
+
// of up to 0.75 * DBL_EPSILON, we want to test whether
|
|
304
|
+
//
|
|
305
|
+
// max_lat_gap * lng_gap < (4.309 + 0.75) * (Pi/2) * DBL_EPSILON
|
|
306
|
+
// ~= 1.765e-15
|
|
307
|
+
if (max(lat_gap1, lat_gap2) * lng_gap < 1.765e-15) {
|
|
308
|
+
return S2LatLngRect::Full();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Next we need to check whether the subregion might contain any edges that
|
|
312
|
+
// span (M_PI - 2 * DBL_EPSILON) radians or more in longitude, since AddPoint
|
|
313
|
+
// sets the longitude bound to Full() in that case. This corresponds to
|
|
314
|
+
// testing whether (lng_gap <= 0) in "lng_expansion" below.
|
|
315
|
+
|
|
316
|
+
// Otherwise, the maximum latitude error in AddPoint is 4.8 * DBL_EPSILON.
|
|
317
|
+
// In the worst case, the errors when computing the latitude bound for a
|
|
318
|
+
// subregion could go in the opposite direction as the errors when computing
|
|
319
|
+
// the bound for the original region, so we need to double this value.
|
|
320
|
+
// (More analysis shows that it's okay to round down to a multiple of
|
|
321
|
+
// DBL_EPSILON.)
|
|
322
|
+
//
|
|
323
|
+
// For longitude, we rely on the fact that atan2 is correctly rounded and
|
|
324
|
+
// therefore no additional bounds expansion is necessary.
|
|
325
|
+
|
|
326
|
+
double lat_expansion = 9 * DBL_EPSILON;
|
|
327
|
+
double lng_expansion = (lng_gap <= 0) ? M_PI : 0;
|
|
328
|
+
return bound.Expanded(S2LatLng::FromRadians(lat_expansion,
|
|
329
|
+
lng_expansion)).PolarClosure();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
S2LatLng S2LatLngRectBounder::MaxErrorForTests() {
|
|
333
|
+
// The maximum error in the latitude calculation is
|
|
334
|
+
// 3.84 * DBL_EPSILON for the RobustCrossProd calculation
|
|
335
|
+
// 0.96 * DBL_EPSILON for the Latitude() calculation
|
|
336
|
+
// 5 * DBL_EPSILON added by AddPoint/GetBound to compensate for error
|
|
337
|
+
// ------------------
|
|
338
|
+
// 9.80 * DBL_EPSILON maximum error in result
|
|
339
|
+
//
|
|
340
|
+
// The maximum error in the longitude calculation is DBL_EPSILON. GetBound
|
|
341
|
+
// does not do any expansion because this isn't necessary in order to
|
|
342
|
+
// bound the *rounded* longitudes of contained points.
|
|
343
|
+
return S2LatLng::FromRadians(10 * DBL_EPSILON, 1 * DBL_EPSILON);
|
|
344
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
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_S2LATLNG_RECT_BOUNDER_H_
|
|
19
|
+
#define S2_S2LATLNG_RECT_BOUNDER_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/s2latlng.h"
|
|
22
|
+
#include "s2/s2latlng_rect.h"
|
|
23
|
+
#include "s2/s2point.h"
|
|
24
|
+
|
|
25
|
+
// This class computes a bounding rectangle that contains all edges defined
|
|
26
|
+
// by a vertex chain v0, v1, v2, ... All vertices must be unit length.
|
|
27
|
+
// Note that the bounding rectangle of an edge can be larger than the
|
|
28
|
+
// bounding rectangle of its endpoints, e.g. consider an edge that passes
|
|
29
|
+
// through the north pole.
|
|
30
|
+
//
|
|
31
|
+
// The bounds are calculated conservatively to account for numerical errors
|
|
32
|
+
// when S2Points are converted to S2LatLngs. More precisely, this class
|
|
33
|
+
// guarantees the following. Let L be a closed edge chain (loop) such that
|
|
34
|
+
// the interior of the loop does not contain either pole. Now if P is any
|
|
35
|
+
// point such that L.Contains(P), then RectBound(L).Contains(S2LatLng(P)).
|
|
36
|
+
class S2LatLngRectBounder {
|
|
37
|
+
public:
|
|
38
|
+
S2LatLngRectBounder() : bound_(S2LatLngRect::Empty()) {}
|
|
39
|
+
|
|
40
|
+
// This method is called to add a vertex to the chain when the vertex is
|
|
41
|
+
// represented as an S2Point. Requires that 'b' has unit length. Repeated
|
|
42
|
+
// vertices are ignored.
|
|
43
|
+
void AddPoint(const S2Point& b);
|
|
44
|
+
|
|
45
|
+
// This method is called to add a vertex to the chain when the vertex is
|
|
46
|
+
// represented as an S2LatLng. Repeated vertices are ignored.
|
|
47
|
+
void AddLatLng(const S2LatLng& b_latlng);
|
|
48
|
+
|
|
49
|
+
// Returns the bounding rectangle of the edge chain that connects the
|
|
50
|
+
// vertices defined so far. This bound satisfies the guarantee made
|
|
51
|
+
// above, i.e. if the edge chain defines a loop, then the bound contains
|
|
52
|
+
// the S2LatLng coordinates of all S2Points contained by the loop.
|
|
53
|
+
S2LatLngRect GetBound() const;
|
|
54
|
+
|
|
55
|
+
// Expands a bound returned by GetBound() so that it is guaranteed to
|
|
56
|
+
// contain the bounds of any subregion whose bounds are computed using
|
|
57
|
+
// this class. For example, consider a loop L that defines a square.
|
|
58
|
+
// GetBound() ensures that if a point P is contained by this square, then
|
|
59
|
+
// S2LatLng(P) is contained by the bound. But now consider a diamond
|
|
60
|
+
// shaped loop S contained by L. It is possible that GetBound() returns a
|
|
61
|
+
// *larger* bound for S than it does for L, due to rounding errors. This
|
|
62
|
+
// method expands the bound for L so that it is guaranteed to contain the
|
|
63
|
+
// bounds of any subregion S.
|
|
64
|
+
//
|
|
65
|
+
// More precisely, if L is a loop that does not contain either pole, and S
|
|
66
|
+
// is a loop such that L.Contains(S), then
|
|
67
|
+
//
|
|
68
|
+
// ExpandForSubregions(RectBound(L)).Contains(RectBound(S)).
|
|
69
|
+
static S2LatLngRect ExpandForSubregions(const S2LatLngRect& bound);
|
|
70
|
+
|
|
71
|
+
// Returns the maximum error in GetBound() provided that the result does
|
|
72
|
+
// not include either pole. It is only to be used for testing purposes
|
|
73
|
+
// (e.g., by passing it to S2LatLngRect::ApproxEquals).
|
|
74
|
+
static S2LatLng MaxErrorForTests();
|
|
75
|
+
|
|
76
|
+
private:
|
|
77
|
+
// Common back end for AddPoint() and AddLatLng(). b and b_latlng
|
|
78
|
+
// must refer to the same vertex.
|
|
79
|
+
void AddInternal(const S2Point& b, const S2LatLng& b_latlng);
|
|
80
|
+
|
|
81
|
+
S2Point a_; // The previous vertex in the chain.
|
|
82
|
+
S2LatLng a_latlng_; // The corresponding latitude-longitude.
|
|
83
|
+
S2LatLngRect bound_; // The current bounding rectangle.
|
|
84
|
+
|
|
85
|
+
S2LatLngRectBounder(const S2LatLngRectBounder&) = delete;
|
|
86
|
+
void operator=(const S2LatLngRectBounder&) = delete;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
#endif // S2_S2LATLNG_RECT_BOUNDER_H_
|