@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,276 @@
|
|
|
1
|
+
// Copyright 2017 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/s2edge_tessellator.h"
|
|
19
|
+
|
|
20
|
+
#include <cmath>
|
|
21
|
+
#include "s2/s2edge_distances.h"
|
|
22
|
+
#include "s2/s2latlng.h"
|
|
23
|
+
#include "s2/s2pointutil.h"
|
|
24
|
+
|
|
25
|
+
using std::vector;
|
|
26
|
+
// Tessellation is implemented by subdividing the edge until the estimated
|
|
27
|
+
// maximum error is below the given tolerance. Estimating error is a hard
|
|
28
|
+
// problem, especially when the only methods available are point evaluation of
|
|
29
|
+
// the projection and its inverse. (These are the only methods that
|
|
30
|
+
// S2::Projection provides, which makes it easier and less error-prone to
|
|
31
|
+
// implement new projections.)
|
|
32
|
+
//
|
|
33
|
+
// One technique that significantly increases robustness is to treat the
|
|
34
|
+
// geodesic and projected edges as parametric curves rather than geometric ones.
|
|
35
|
+
// Given a spherical edge AB and a projection p:S2->R2, let f(t) be the
|
|
36
|
+
// normalized arc length parametrization of AB and let g(t) be the normalized
|
|
37
|
+
// arc length parameterization of the projected edge p(A)p(B). (In other words,
|
|
38
|
+
// f(0)=A, f(1)=B, g(0)=p(A), g(1)=p(B).) We now define the geometric error as
|
|
39
|
+
// the maximum distance from the point p^-1(g(t)) to the geodesic edge AB for
|
|
40
|
+
// any t in [0,1], where p^-1 denotes the inverse projection. In other words,
|
|
41
|
+
// the geometric error is the maximum distance from any point on the projected
|
|
42
|
+
// edge (mapped back onto the sphere) to the geodesic edge AB. On the other
|
|
43
|
+
// hand we define the parametric error as the maximum distance between the
|
|
44
|
+
// points f(t) and p^-1(g(t)) for any t in [0,1], i.e. the maximum distance
|
|
45
|
+
// (measured on the sphere) between the geodesic and projected points at the
|
|
46
|
+
// same interpolation fraction t.
|
|
47
|
+
//
|
|
48
|
+
// The easiest way to estimate the parametric error is to simply evaluate both
|
|
49
|
+
// edges at their midpoints and measure the distance between them (the "midpoint
|
|
50
|
+
// method"). This is very fast and works quite well for most edges, however it
|
|
51
|
+
// has one major drawback: it doesn't handle points of inflection (i.e., points
|
|
52
|
+
// where the curvature changes sign). For example, edges in the Mercator and
|
|
53
|
+
// Plate Carree projections always curve towards the equator relative to the
|
|
54
|
+
// corresponding geodesic edge, so in these projections there is a point of
|
|
55
|
+
// inflection whenever the projected edge crosses the equator. The worst case
|
|
56
|
+
// occurs when the edge endpoints have different longitudes but the same
|
|
57
|
+
// absolute latitude, since in that case the error is non-zero but the edges
|
|
58
|
+
// have exactly the same midpoint (on the equator).
|
|
59
|
+
//
|
|
60
|
+
// One solution to this problem is to split the input edges at all inflection
|
|
61
|
+
// points (i.e., along the equator in the case of the Mercator and Plate Carree
|
|
62
|
+
// projections). However for general projections these inflection points can
|
|
63
|
+
// occur anywhere on the sphere (e.g., consider the Transverse Mercator
|
|
64
|
+
// projection). This could be addressed by adding methods to the S2Projection
|
|
65
|
+
// interface to split edges at inflection points but this would make it harder
|
|
66
|
+
// and more error-prone to implement new projections.
|
|
67
|
+
//
|
|
68
|
+
// Another problem with this approach is that the midpoint method sometimes
|
|
69
|
+
// underestimates the true error even when edges do not cross the equator. For
|
|
70
|
+
// the Plate Carree and Mercator projections, the midpoint method can
|
|
71
|
+
// underestimate the error by up to 3%.
|
|
72
|
+
//
|
|
73
|
+
// Both of these problems can be solved as follows. We assume that the error
|
|
74
|
+
// can be modeled as a convex combination of two worst-case functions, one
|
|
75
|
+
// where the error is maximized at the edge midpoint and another where the
|
|
76
|
+
// error is *minimized* (i.e., zero) at the edge midpoint. For example, we
|
|
77
|
+
// could choose these functions as:
|
|
78
|
+
//
|
|
79
|
+
// E1(x) = 1 - x^2
|
|
80
|
+
// E2(x) = x * (1 - x^2)
|
|
81
|
+
//
|
|
82
|
+
// where for convenience we use an interpolation parameter "x" in the range
|
|
83
|
+
// [-1, 1] rather than the original "t" in the range [0, 1]. Note that both
|
|
84
|
+
// error functions must have roots at x = {-1, 1} since the error must be zero
|
|
85
|
+
// at the edge endpoints. E1 is simply a parabola whose maximum value is 1
|
|
86
|
+
// attained at x = 0, while E2 is a cubic with an additional root at x = 0,
|
|
87
|
+
// and whose maximum value is 2 * sqrt(3) / 9 attained at x = 1 / sqrt(3).
|
|
88
|
+
//
|
|
89
|
+
// Next, it is convenient to scale these functions so that the both have a
|
|
90
|
+
// maximum value of 1. E1 already satisfies this requirement, and we simply
|
|
91
|
+
// redefine E2 as
|
|
92
|
+
//
|
|
93
|
+
// E2(x) = x * (1 - x^2) / (2 * sqrt(3) / 9)
|
|
94
|
+
//
|
|
95
|
+
// Now define x0 to be the point where these two functions intersect, i.e. the
|
|
96
|
+
// point in the range (-1, 1) where E1(x0) = E2(x0). This value has the very
|
|
97
|
+
// convenient property that if we evaluate the actual error E(x0), then the
|
|
98
|
+
// maximum error on the entire interval [-1, 1] is bounded by
|
|
99
|
+
//
|
|
100
|
+
// E(x) <= E(x0) / E1(x0)
|
|
101
|
+
//
|
|
102
|
+
// since whether the error is modeled using E1 or E2, the resulting function
|
|
103
|
+
// has the same maximum value (namely E(x0) / E1(x0)). If it is modeled as
|
|
104
|
+
// some other convex combination of E1 and E2, the maximum value can only
|
|
105
|
+
// decrease.
|
|
106
|
+
//
|
|
107
|
+
// Finally, since E2 is not symmetric about the y-axis, we must also allow for
|
|
108
|
+
// the possibility that the error is a convex combination of E1 and -E2. This
|
|
109
|
+
// can be handled by evaluating the error at E(-x0) as well, and then
|
|
110
|
+
// computing the final error bound as
|
|
111
|
+
//
|
|
112
|
+
// E(x) <= max(E(x0), E(-x0)) / E1(x0) .
|
|
113
|
+
//
|
|
114
|
+
// Effectively, this method is simply evaluating the error at two points about
|
|
115
|
+
// 1/3 and 2/3 of the way along the edges, and then scaling the maximum of
|
|
116
|
+
// these two errors by a constant factor. Intuitively, the reason this works
|
|
117
|
+
// is that if the two edges cross somewhere in the interior, then at least one
|
|
118
|
+
// of these points will be far from the crossing.
|
|
119
|
+
//
|
|
120
|
+
// The actual algorithm implemented below has some additional refinements.
|
|
121
|
+
// First, edges longer than 90 degrees are always subdivided; this avoids
|
|
122
|
+
// various unusual situations that can happen with very long edges, and there
|
|
123
|
+
// is really no reason to avoid adding vertices to edges that are so long.
|
|
124
|
+
//
|
|
125
|
+
// Second, the error function E1 above needs to be modified to take into
|
|
126
|
+
// account spherical distortions. (It turns out that spherical distortions are
|
|
127
|
+
// beneficial in the case of E2, i.e. they only make its error estimates
|
|
128
|
+
// slightly more conservative.) To do this, we model E1 as the maximum error
|
|
129
|
+
// in a Plate Carree edge of length 90 degrees or less. This turns out to be
|
|
130
|
+
// an edge from 45:-90 to 45:90 (in lat:lng format). The corresponding error
|
|
131
|
+
// as a function of "x" in the range [-1, 1] can be computed as the distance
|
|
132
|
+
// between the the the Plate Caree edge point (45, 90 * x) and the geodesic
|
|
133
|
+
// edge point (90 - 45 * abs(x), 90 * sgn(x)). Using the Haversine formula,
|
|
134
|
+
// the corresponding function E1 (normalized to have a maximum value of 1) is:
|
|
135
|
+
//
|
|
136
|
+
// E1(x) =
|
|
137
|
+
// asin(sqrt(sin(Pi / 8 * (1 - x)) ^ 2 +
|
|
138
|
+
// sin(Pi / 4 * (1 - x)) ^ 2 * cos(Pi / 4) * sin(Pi / 4 * x))) /
|
|
139
|
+
// asin(sqrt((1 - 1 / sqrt(2)) / 2))
|
|
140
|
+
//
|
|
141
|
+
// Note that this function does not need to be evaluated at runtime, it
|
|
142
|
+
// simply affects the calculation of the value x0 where E1(x0) = E2(x0)
|
|
143
|
+
// and the corresponding scaling factor C = 1 / E1(x0).
|
|
144
|
+
//
|
|
145
|
+
// ------------------------------------------------------------------
|
|
146
|
+
//
|
|
147
|
+
// In the case of the Mercator and Plate Carree projections this strategy
|
|
148
|
+
// produces a conservative upper bound (verified using 10 million random
|
|
149
|
+
// edges). Furthermore the bound is nearly tight; the scaling constant is
|
|
150
|
+
// C = 1.19289, whereas the maximum observed value was 1.19254.
|
|
151
|
+
//
|
|
152
|
+
// Compared to the simpler midpoint evaluation method, this strategy requires
|
|
153
|
+
// more function evaluations (currently twice as many, but with a smarter
|
|
154
|
+
// tessellation algorithm it will only be 50% more). It also results in a
|
|
155
|
+
// small amount of additional tessellation (about 1.5%) compared to the
|
|
156
|
+
// midpoint method, but this is due almost entirely to the fact that the
|
|
157
|
+
// midpoint method does not yield conservative error estimates.
|
|
158
|
+
//
|
|
159
|
+
// For random edges with a tolerance of 1 meter, the expected amount of
|
|
160
|
+
// overtessellation is as follows:
|
|
161
|
+
//
|
|
162
|
+
// Midpoint Method Cubic Method
|
|
163
|
+
// Plate Carree 1.8% 3.0%
|
|
164
|
+
// Mercator 15.8% 17.4%
|
|
165
|
+
|
|
166
|
+
// The interpolation fraction at which the two edges are evaluated in order to
|
|
167
|
+
// measure the error between them. (Edges are evaluated at two points measured
|
|
168
|
+
// this fraction from either end.) With respect to the algorithm description
|
|
169
|
+
// above, this value is t0 = (1 - x0) / 2 in the range [0, 1] that corresponds
|
|
170
|
+
// to x0 in the range [-1, 1] chosen such that E1(x0) == E2(x0).
|
|
171
|
+
static constexpr double kInterpolationFraction = 0.31215691082248312;
|
|
172
|
+
|
|
173
|
+
// The following is the value of E1(x0) == E2(x0).
|
|
174
|
+
static constexpr double kScaleFactor = 0.83829992569888509;
|
|
175
|
+
|
|
176
|
+
S1Angle S2EdgeTessellator::kMinTolerance() {
|
|
177
|
+
// This distance is less than 1 micrometer on the Earth's surface, but is
|
|
178
|
+
// still much larger than the expected projection and interpolation errors.
|
|
179
|
+
return S1Angle::Radians(1e-13);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
S2EdgeTessellator::S2EdgeTessellator(const S2::Projection* projection,
|
|
183
|
+
S1Angle tolerance)
|
|
184
|
+
: proj_(*projection) {
|
|
185
|
+
if (tolerance < kMinTolerance()) S2_LOG(DFATAL) << "Tolerance too small";
|
|
186
|
+
|
|
187
|
+
// Rather than scaling the error estimate as described above, instead we scale
|
|
188
|
+
// the tolerance. See algorithm description at the top of this file.
|
|
189
|
+
scaled_tolerance_ = S1ChordAngle(kScaleFactor *
|
|
190
|
+
std::max(tolerance, kMinTolerance()));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
S1ChordAngle S2EdgeTessellator::EstimateMaxError(
|
|
194
|
+
const R2Point& pa, const S2Point& a, const R2Point& pb, const S2Point& b)
|
|
195
|
+
const {
|
|
196
|
+
// See the algorithm description at the top of this file.
|
|
197
|
+
|
|
198
|
+
// We always tessellate edges longer than 90 degrees on the sphere, since the
|
|
199
|
+
// approximation below is not robust enough to handle such edges.
|
|
200
|
+
if (a.DotProd(b) < -1e-14) return S1ChordAngle::Infinity();
|
|
201
|
+
|
|
202
|
+
constexpr double t1 = kInterpolationFraction;
|
|
203
|
+
constexpr double t2 = 1 - kInterpolationFraction;
|
|
204
|
+
S2Point mid1 = S2::Interpolate(t1, a, b);
|
|
205
|
+
S2Point mid2 = S2::Interpolate(t2, a, b);
|
|
206
|
+
S2Point pmid1 = proj_.Unproject(proj_.Interpolate(t1, pa, pb));
|
|
207
|
+
S2Point pmid2 = proj_.Unproject(proj_.Interpolate(t2, pa, pb));
|
|
208
|
+
return std::max(S1ChordAngle(mid1, pmid1), S1ChordAngle(mid2, pmid2));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
void S2EdgeTessellator::AppendProjected(
|
|
212
|
+
const S2Point& a, const S2Point& b, vector<R2Point>* vertices) const {
|
|
213
|
+
R2Point pa = proj_.Project(a);
|
|
214
|
+
if (vertices->empty()) {
|
|
215
|
+
vertices->push_back(pa);
|
|
216
|
+
} else {
|
|
217
|
+
pa = proj_.WrapDestination(vertices->back(), pa);
|
|
218
|
+
S2_DCHECK_EQ(vertices->back(), pa) << "Appended edges must form a chain";
|
|
219
|
+
}
|
|
220
|
+
R2Point pb = proj_.Project(b);
|
|
221
|
+
AppendProjected(pa, a, pb, b, vertices);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Given a geodesic edge AB, split the edge as necessary and append all
|
|
225
|
+
// projected vertices except the first to "vertices".
|
|
226
|
+
//
|
|
227
|
+
// The maximum recursion depth is (M_PI / kMinTolerance()) < 45, and the
|
|
228
|
+
// frame size is small so stack overflow should not be an issue.
|
|
229
|
+
void S2EdgeTessellator::AppendProjected(const R2Point& pa, const S2Point& a,
|
|
230
|
+
const R2Point& pb_in, const S2Point& b,
|
|
231
|
+
vector<R2Point>* vertices) const {
|
|
232
|
+
R2Point pb = proj_.WrapDestination(pa, pb_in);
|
|
233
|
+
if (EstimateMaxError(pa, a, pb, b) <= scaled_tolerance_) {
|
|
234
|
+
vertices->push_back(pb);
|
|
235
|
+
} else {
|
|
236
|
+
S2Point mid = (a + b).Normalize();
|
|
237
|
+
R2Point pmid = proj_.WrapDestination(pa, proj_.Project(mid));
|
|
238
|
+
AppendProjected(pa, a, pmid, mid, vertices);
|
|
239
|
+
AppendProjected(pmid, mid, pb, b, vertices);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
void S2EdgeTessellator::AppendUnprojected(
|
|
244
|
+
const R2Point& pa, const R2Point& pb, vector<S2Point>* vertices) const {
|
|
245
|
+
S2Point a = proj_.Unproject(pa);
|
|
246
|
+
S2Point b = proj_.Unproject(pb);
|
|
247
|
+
if (vertices->empty()) {
|
|
248
|
+
vertices->push_back(a);
|
|
249
|
+
} else {
|
|
250
|
+
// Note that coordinate wrapping can create a small amount of error. For
|
|
251
|
+
// example in the edge chain "0:-175, 0:179, 0:-177", the first edge is
|
|
252
|
+
// transformed into "0:-175, 0:-181" while the second is transformed into
|
|
253
|
+
// "0:179, 0:183". The two coordinate pairs for the middle vertex
|
|
254
|
+
// ("0:-181" and "0:179") may not yield exactly the same S2Point.
|
|
255
|
+
S2_DCHECK(S2::ApproxEquals(vertices->back(), a))
|
|
256
|
+
<< "Appended edges must form a chain";
|
|
257
|
+
}
|
|
258
|
+
AppendUnprojected(pa, a, pb, b, vertices);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Like AppendProjected, but interpolates a projected edge and appends the
|
|
262
|
+
// corresponding points on the sphere.
|
|
263
|
+
void S2EdgeTessellator::AppendUnprojected(
|
|
264
|
+
const R2Point& pa, const S2Point& a,
|
|
265
|
+
const R2Point& pb_in, const S2Point& b, vector<S2Point>* vertices) const {
|
|
266
|
+
// See notes above regarding measuring the interpolation error.
|
|
267
|
+
R2Point pb = proj_.WrapDestination(pa, pb_in);
|
|
268
|
+
if (EstimateMaxError(pa, a, pb, b) <= scaled_tolerance_) {
|
|
269
|
+
vertices->push_back(b);
|
|
270
|
+
} else {
|
|
271
|
+
R2Point pmid = proj_.Interpolate(0.5, pa, pb);
|
|
272
|
+
S2Point mid = proj_.Unproject(pmid);
|
|
273
|
+
AppendUnprojected(pa, a, pmid, mid, vertices);
|
|
274
|
+
AppendUnprojected(pmid, mid, pb, b, vertices);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Copyright 2017 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_S2EDGE_TESSELLATOR_H_
|
|
19
|
+
#define S2_S2EDGE_TESSELLATOR_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/r2.h"
|
|
23
|
+
#include "s2/s1chord_angle.h"
|
|
24
|
+
#include "s2/s2point.h"
|
|
25
|
+
#include "s2/s2projections.h"
|
|
26
|
+
|
|
27
|
+
// Given an edge in some 2D projection (e.g., Mercator), S2EdgeTessellator
|
|
28
|
+
// converts the edge into a chain of spherical geodesic edges such that the
|
|
29
|
+
// maximum distance between the original edge and the geodesic edge chain is
|
|
30
|
+
// at most "tolerance". Similarly, it can convert a spherical geodesic edge
|
|
31
|
+
// into a chain of edges in a given 2D projection such that the maximum
|
|
32
|
+
// distance between the geodesic edge and the chain of projected edges is at
|
|
33
|
+
// most "tolerance".
|
|
34
|
+
class S2EdgeTessellator {
|
|
35
|
+
public:
|
|
36
|
+
// Constructs an S2EdgeTessellator using the given projection and error
|
|
37
|
+
// tolerance. The projection object must be valid for the entire lifetime
|
|
38
|
+
// of this object. (Projections are typically declared once and reused.)
|
|
39
|
+
//
|
|
40
|
+
// Method | Input | Output
|
|
41
|
+
// ------------------|------------------------|-----------------------
|
|
42
|
+
// AppendProjected | S2 geodesics | Planar projected edges
|
|
43
|
+
// AppendUnprojected | Planar projected edges | S2 geodesics
|
|
44
|
+
S2EdgeTessellator(const S2::Projection* projection, S1Angle tolerance);
|
|
45
|
+
|
|
46
|
+
// Converts the spherical geodesic edge AB to a chain of planar edges in the
|
|
47
|
+
// given projection and appends the corresponding vertices to "vertices".
|
|
48
|
+
//
|
|
49
|
+
// This method can be called multiple times with the same output vector to
|
|
50
|
+
// convert an entire polyline or loop. All vertices of the first edge are
|
|
51
|
+
// appended, but the first vertex of each subsequent edge is omitted (and
|
|
52
|
+
// must match the last vertex of the previous edge).
|
|
53
|
+
//
|
|
54
|
+
// If the given projection has one or more coordinate axes that "wrap", then
|
|
55
|
+
// every vertex's coordinates will be as close as possible to the previous
|
|
56
|
+
// vertex's coordinates. Note that this may yield vertices whose
|
|
57
|
+
// coordinates are outside the usual range. For example, tessellating the
|
|
58
|
+
// edge (0:170, 0:-170) (in lat:lng notation) yields (0:170, 0:190).
|
|
59
|
+
void AppendProjected(const S2Point& a, const S2Point& b,
|
|
60
|
+
std::vector<R2Point>* vertices) const;
|
|
61
|
+
|
|
62
|
+
// Converts the planar edge AB in the given projection to a chain of
|
|
63
|
+
// spherical geodesic edges and appends the vertices to "vertices".
|
|
64
|
+
//
|
|
65
|
+
// This method can be called multiple times with the same output vector to
|
|
66
|
+
// convert an entire polyline or loop. All vertices of the first edge are
|
|
67
|
+
// appended, but the first vertex of each subsequent edge is omitted (and is
|
|
68
|
+
// required to match that last vertex of the previous edge).
|
|
69
|
+
//
|
|
70
|
+
// Note that to construct an S2Loop, you must call vertices->pop_back() at
|
|
71
|
+
// the very end to eliminate the duplicate first and last vertex. Note also
|
|
72
|
+
// that if the given projection involves coordinate "wrapping" (e.g. across
|
|
73
|
+
// the 180 degree meridian) then the first and last vertices may not be
|
|
74
|
+
// exactly the same.
|
|
75
|
+
void AppendUnprojected(const R2Point& a, const R2Point& b,
|
|
76
|
+
std::vector<S2Point>* vertices) const;
|
|
77
|
+
|
|
78
|
+
// Returns the minimum supported tolerance (which corresponds to a distance
|
|
79
|
+
// less than one micrometer on the Earth's surface).
|
|
80
|
+
static S1Angle kMinTolerance();
|
|
81
|
+
|
|
82
|
+
private:
|
|
83
|
+
S1ChordAngle EstimateMaxError(const R2Point& pa, const S2Point& a,
|
|
84
|
+
const R2Point& pb, const S2Point& b) const;
|
|
85
|
+
|
|
86
|
+
void AppendUnprojected(const R2Point& pa, const S2Point& a,
|
|
87
|
+
const R2Point& pb, const S2Point& b,
|
|
88
|
+
std::vector<S2Point>* vertices) const;
|
|
89
|
+
|
|
90
|
+
void AppendProjected(const R2Point& pa, const S2Point& a,
|
|
91
|
+
const R2Point& pb, const S2Point& b,
|
|
92
|
+
std::vector<R2Point>* vertices) const;
|
|
93
|
+
|
|
94
|
+
const S2::Projection& proj_;
|
|
95
|
+
|
|
96
|
+
// The given tolerance scaled by a constant fraction so that it can be
|
|
97
|
+
// compared against the result returned by EstimateMaxError().
|
|
98
|
+
S1ChordAngle scaled_tolerance_;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
#endif // S2_S2EDGE_TESSELLATOR_H_
|