@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,57 @@
|
|
|
1
|
+
// Copyright 2018 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/s2polyline_measures.h"
|
|
19
|
+
|
|
20
|
+
#include <cmath>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/s1angle.h"
|
|
25
|
+
#include "s2/s2testing.h"
|
|
26
|
+
|
|
27
|
+
using std::fabs;
|
|
28
|
+
using std::vector;
|
|
29
|
+
|
|
30
|
+
namespace {
|
|
31
|
+
|
|
32
|
+
TEST(GetLengthAndCentroid, GreatCircles) {
|
|
33
|
+
// Construct random great circles and divide them randomly into segments.
|
|
34
|
+
// Then make sure that the length and centroid are correct. Note that
|
|
35
|
+
// because of the way the centroid is computed, it does not matter how
|
|
36
|
+
// we split the great circle into segments.
|
|
37
|
+
|
|
38
|
+
for (int iter = 0; iter < 100; ++iter) {
|
|
39
|
+
// Choose a coordinate frame for the great circle.
|
|
40
|
+
S2Point x, y, z;
|
|
41
|
+
S2Testing::GetRandomFrame(&x, &y, &z);
|
|
42
|
+
|
|
43
|
+
vector<S2Point> line;
|
|
44
|
+
for (double theta = 0; theta < 2 * M_PI;
|
|
45
|
+
theta += pow(S2Testing::rnd.RandDouble(), 10)) {
|
|
46
|
+
line.push_back(cos(theta) * x + sin(theta) * y);
|
|
47
|
+
}
|
|
48
|
+
// Close the circle.
|
|
49
|
+
line.push_back(line[0]);
|
|
50
|
+
S1Angle length = S2::GetLength(line);
|
|
51
|
+
EXPECT_LE(fabs(length.radians() - 2 * M_PI), 2e-14);
|
|
52
|
+
S2Point centroid = S2::GetCentroid(line);
|
|
53
|
+
EXPECT_LE(centroid.Norm(), 2e-14);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
} // namespace
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// Copyright 2016 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/s2polyline_simplifier.h"
|
|
19
|
+
|
|
20
|
+
#include <cfloat>
|
|
21
|
+
|
|
22
|
+
#include "s2/s1chord_angle.h"
|
|
23
|
+
#include "s2/s1interval.h"
|
|
24
|
+
|
|
25
|
+
void S2PolylineSimplifier::Init(const S2Point& src) {
|
|
26
|
+
src_ = src;
|
|
27
|
+
window_ = S1Interval::Full();
|
|
28
|
+
|
|
29
|
+
// Precompute basis vectors for the tangent space at "src". This is similar
|
|
30
|
+
// to GetFrame() except that we don't normalize the vectors. As it turns
|
|
31
|
+
// out, the two basis vectors below have the same magnitude (up to the
|
|
32
|
+
// length error in S2Point::Normalize).
|
|
33
|
+
|
|
34
|
+
// Find the index of the component whose magnitude is smallest.
|
|
35
|
+
S2Point tmp = src.Abs();
|
|
36
|
+
int i = (tmp[0] < tmp[1] ?
|
|
37
|
+
(tmp[0] < tmp[2] ? 0 : 2) : (tmp[1] < tmp[2] ? 1 : 2));
|
|
38
|
+
|
|
39
|
+
// We define the "y" basis vector as the cross product of "src" and the
|
|
40
|
+
// basis vector for axis "i". Let "j" and "k" be the indices of the other
|
|
41
|
+
// two components in cyclic order.
|
|
42
|
+
int j = (i == 2 ? 0 : i + 1), k = (i == 0 ? 2 : i - 1);
|
|
43
|
+
y_dir_[i] = 0;
|
|
44
|
+
y_dir_[j] = src[k];
|
|
45
|
+
y_dir_[k] = -src[j];
|
|
46
|
+
|
|
47
|
+
// Compute the cross product of "y_dir" and "src". We write out the cross
|
|
48
|
+
// product here mainly for documentation purposes; it also happens to save a
|
|
49
|
+
// few multiplies because unfortunately the optimizer does *not* get rid of
|
|
50
|
+
// multiplies by zero (since these multiplies propagate NaN, for example).
|
|
51
|
+
x_dir_[i] = src[j] * src[j] + src[k] * src[k];
|
|
52
|
+
x_dir_[j] = -src[j] * src[i];
|
|
53
|
+
x_dir_[k] = -src[k] * src[i];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
bool S2PolylineSimplifier::Extend(const S2Point& dst) const {
|
|
57
|
+
// We limit the maximum edge length to 90 degrees in order to simplify the
|
|
58
|
+
// error bounds. (The error gets arbitrarily large as the edge length
|
|
59
|
+
// approaches 180 degrees.)
|
|
60
|
+
if (S1ChordAngle(src_, dst) > S1ChordAngle::Right()) return false;
|
|
61
|
+
|
|
62
|
+
// Otherwise check whether this vertex is in the acceptable angle range.
|
|
63
|
+
return window_.Contains(GetAngle(dst));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
bool S2PolylineSimplifier::TargetDisc(const S2Point& p, S1ChordAngle r) {
|
|
67
|
+
// Shrink the target interval by the maximum error from all sources. This
|
|
68
|
+
// guarantees that the output edge will intersect the given disc.
|
|
69
|
+
double semiwidth = GetSemiwidth(p, r, -1 /*round down*/);
|
|
70
|
+
if (semiwidth >= M_PI) {
|
|
71
|
+
// The target disc contains "src", so there is nothing to do.
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (semiwidth < 0) {
|
|
75
|
+
window_ = S1Interval::Empty();
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
// Otherwise compute the angle interval corresponding to the target disc and
|
|
79
|
+
// intersect it with the current window.
|
|
80
|
+
double center = GetAngle(p);
|
|
81
|
+
S1Interval target = S1Interval::FromPoint(center).Expanded(semiwidth);
|
|
82
|
+
window_ = window_.Intersection(target);
|
|
83
|
+
return !window_.is_empty();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
bool S2PolylineSimplifier::AvoidDisc(const S2Point& p, S1ChordAngle r,
|
|
87
|
+
bool disc_on_left) {
|
|
88
|
+
// Expand the interval by the maximum error from all sources. This
|
|
89
|
+
// guarantees that the final output edge will avoid the given disc.
|
|
90
|
+
double semiwidth = GetSemiwidth(p, r, 1 /*round up*/);
|
|
91
|
+
if (semiwidth >= M_PI) {
|
|
92
|
+
// The avoidance disc contains "src", so it is impossible to avoid.
|
|
93
|
+
window_ = S1Interval::Empty();
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
double center = GetAngle(p);
|
|
97
|
+
double opposite = (center > 0) ? center - M_PI : center + M_PI;
|
|
98
|
+
S1Interval target = (disc_on_left ? S1Interval(opposite, center) :
|
|
99
|
+
S1Interval(center, opposite));
|
|
100
|
+
window_ = window_.Intersection(target.Expanded(-semiwidth));
|
|
101
|
+
return !window_.is_empty();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
double S2PolylineSimplifier::GetAngle(const S2Point& p) const {
|
|
105
|
+
return atan2(p.DotProd(y_dir_), p.DotProd(x_dir_));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
double S2PolylineSimplifier::GetSemiwidth(const S2Point& p, S1ChordAngle r,
|
|
109
|
+
int round_direction) const {
|
|
110
|
+
double constexpr DBL_ERR = 0.5 * DBL_EPSILON;
|
|
111
|
+
|
|
112
|
+
// Using spherical trigonometry,
|
|
113
|
+
//
|
|
114
|
+
// sin(semiwidth) = sin(r) / sin(a)
|
|
115
|
+
//
|
|
116
|
+
// where "a" is the angle between "src" and "p". Rather than measuring
|
|
117
|
+
// these angles, instead we measure the squared chord lengths through the
|
|
118
|
+
// interior of the sphere (i.e., Cartersian distance). Letting "r2" be the
|
|
119
|
+
// squared chord distance corresponding to "r", and "a2" be the squared
|
|
120
|
+
// chord distance corresponding to "a", we use the relationships
|
|
121
|
+
//
|
|
122
|
+
// sin^2(r) = r2 (1 - r2 / 4)
|
|
123
|
+
// sin^2(a) = d2 (1 - d2 / 4)
|
|
124
|
+
//
|
|
125
|
+
// which follow from the fact that r2 = (2 * sin(r / 2)) ^ 2, etc.
|
|
126
|
+
|
|
127
|
+
// "a2" has a relative error up to 5 * DBL_ERR, plus an absolute error of up
|
|
128
|
+
// to 64 * DBL_ERR^2 (because "src" and "p" may differ from unit length by
|
|
129
|
+
// up to 4 * DBL_ERR). We can correct for the relative error later, but for
|
|
130
|
+
// the absolute error we use "round_direction" to account for it now.
|
|
131
|
+
double r2 = r.length2();
|
|
132
|
+
double a2 = S1ChordAngle(src_, p).length2();
|
|
133
|
+
a2 -= 64 * DBL_ERR * DBL_ERR * round_direction;
|
|
134
|
+
if (a2 <= r2) return M_PI; // The given disc contains "src".
|
|
135
|
+
|
|
136
|
+
double sin2_r = r2 * (1 - 0.25 * r2);
|
|
137
|
+
double sin2_a = a2 * (1 - 0.25 * a2);
|
|
138
|
+
double semiwidth = asin(sqrt(sin2_r / sin2_a));
|
|
139
|
+
|
|
140
|
+
// We compute bounds on the errors from all sources:
|
|
141
|
+
//
|
|
142
|
+
// - The call to GetSemiwidth (this call).
|
|
143
|
+
// - The call to GetAngle that computes the center of the interval.
|
|
144
|
+
// - The call to GetAngle in Extend that tests whether a given point
|
|
145
|
+
// is an acceptable destination vertex.
|
|
146
|
+
//
|
|
147
|
+
// Summary of the errors in GetAngle:
|
|
148
|
+
//
|
|
149
|
+
// y_dir_ has no error.
|
|
150
|
+
//
|
|
151
|
+
// x_dir_ has a relative error of DBL_ERR in two components, a relative
|
|
152
|
+
// error of 2 * DBL_ERR in the other component, plus an overall relative
|
|
153
|
+
// length error of 4 * DBL_ERR (compared to y_dir_) because "src" is assumed
|
|
154
|
+
// to be normalized only to within the tolerances of S2Point::Normalize().
|
|
155
|
+
//
|
|
156
|
+
// p.DotProd(y_dir_) has a relative error of 1.5 * DBL_ERR and an
|
|
157
|
+
// absolute error of 1.5 * DBL_ERR * y_dir_.Norm().
|
|
158
|
+
//
|
|
159
|
+
// p.DotProd(x_dir_) has a relative error of 5.5 * DBL_ERR and an absolute
|
|
160
|
+
// error of 3.5 * DBL_ERR * y_dir_.Norm() (noting that x_dir_ and y_dir_
|
|
161
|
+
// have the same length to within a relative error of 4 * DBL_ERR).
|
|
162
|
+
//
|
|
163
|
+
// It's possible to show by taking derivatives that these errors can affect
|
|
164
|
+
// the angle atan2(y, x) by up 7.093 * DBL_ERR radians. Rounding up and
|
|
165
|
+
// including the call to atan2 gives a final error bound of 10 * DBL_ERR.
|
|
166
|
+
//
|
|
167
|
+
// Summary of the errors in GetSemiwidth:
|
|
168
|
+
//
|
|
169
|
+
// The distance a2 has a relative error of 5 * DBL_ERR plus an absolute
|
|
170
|
+
// error of 64 * DBL_ERR^2 because the points "src" and "p" may differ from
|
|
171
|
+
// unit length (by up to 4 * DBL_ERR). We have already accounted for the
|
|
172
|
+
// absolute error above, leaving only the relative error.
|
|
173
|
+
//
|
|
174
|
+
// sin2_r has a relative error of 2 * DBL_ERR.
|
|
175
|
+
//
|
|
176
|
+
// sin2_a has a relative error of 12 * DBL_ERR assuming that a2 <= 2,
|
|
177
|
+
// i.e. distance(src, p) <= 90 degrees. (The relative error gets
|
|
178
|
+
// arbitrarily larger as this distance approaches 180 degrees.)
|
|
179
|
+
//
|
|
180
|
+
// semiwidth has a relative error of 17 * DBL_ERR.
|
|
181
|
+
//
|
|
182
|
+
// Finally, (center +/- semiwidth) has a rounding error of up to 4 * DBL_ERR
|
|
183
|
+
// because in theory, the result magnitude may be as large as 1.5 * M_PI
|
|
184
|
+
// which is larger than 4.0. This gives a total error of:
|
|
185
|
+
double error = (2 * 10 + 4) * DBL_ERR + 17 * DBL_ERR * semiwidth;
|
|
186
|
+
return semiwidth + round_direction * error;
|
|
187
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Copyright 2016 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
|
+
// This is a helper class for simplifying polylines. It allows you to compute
|
|
19
|
+
// a maximal edge that intersects a sequence of discs, and that optionally
|
|
20
|
+
// avoids a different sequence of discs. The results are conservative in that
|
|
21
|
+
// the edge is guaranteed to intersect or avoid the specified discs using
|
|
22
|
+
// exact arithmetic (see s2predicates.h).
|
|
23
|
+
//
|
|
24
|
+
// Note that S2Builder can also simplify polylines and supports more features
|
|
25
|
+
// (e.g., snapping to S2CellId centers), so it is only recommended to use this
|
|
26
|
+
// class if S2Builder does not meet your needs.
|
|
27
|
+
//
|
|
28
|
+
// Here is a simple example showing how to simplify a polyline into a sequence
|
|
29
|
+
// of edges that stay within "max_error" of the original edges:
|
|
30
|
+
//
|
|
31
|
+
// vector<S2Point> v = { ... };
|
|
32
|
+
// S2PolylineSimplifier simplifier;
|
|
33
|
+
// simplifier.Init(v[0]);
|
|
34
|
+
// for (int i = 1; i < v.size(); ++i) {
|
|
35
|
+
// if (!simplifier.Extend(v[i])) {
|
|
36
|
+
// OutputEdge(simplifier.src(), v[i-1]);
|
|
37
|
+
// simplifier.Init(v[i-1]);
|
|
38
|
+
// }
|
|
39
|
+
// simplifier.TargetDisc(v[i], max_error);
|
|
40
|
+
// }
|
|
41
|
+
// OutputEdge(simplifer.src(), v.back());
|
|
42
|
+
//
|
|
43
|
+
// Note that the points targeted by TargetDisc do not need to be the same as
|
|
44
|
+
// the candidate endpoints passed to Extend. So for example, you could target
|
|
45
|
+
// the original vertices of a polyline, but only consider endpoints that are
|
|
46
|
+
// snapped to E7 coordinates or S2CellId centers.
|
|
47
|
+
//
|
|
48
|
+
// Please be aware that this class works by maintaining a range of acceptable
|
|
49
|
+
// angles (bearings) from the start vertex to the hypothetical destination
|
|
50
|
+
// vertex. It does not keep track of distances to any of the discs to be
|
|
51
|
+
// targeted or avoided. Therefore to use this class correctly, constraints
|
|
52
|
+
// should be added in increasing order of distance. (The actual requirement
|
|
53
|
+
// is slightly weaker than this, which is why it is not enforced, but
|
|
54
|
+
// basically you should only call TargetDisc() and AvoidDisc() with arguments
|
|
55
|
+
// that you want to constrain the immediately following call to Extend().)
|
|
56
|
+
|
|
57
|
+
#ifndef S2_S2POLYLINE_SIMPLIFIER_H_
|
|
58
|
+
#define S2_S2POLYLINE_SIMPLIFIER_H_
|
|
59
|
+
|
|
60
|
+
#include "s2/_fp_contract_off.h"
|
|
61
|
+
#include "s2/s1chord_angle.h"
|
|
62
|
+
#include "s2/s1interval.h"
|
|
63
|
+
|
|
64
|
+
class S2PolylineSimplifier {
|
|
65
|
+
public:
|
|
66
|
+
S2PolylineSimplifier() {}
|
|
67
|
+
|
|
68
|
+
// Starts a new simplified edge at "src".
|
|
69
|
+
void Init(const S2Point& src);
|
|
70
|
+
|
|
71
|
+
// Returns the source vertex of the output edge.
|
|
72
|
+
S2Point src() const;
|
|
73
|
+
|
|
74
|
+
// Returns true if the edge (src, dst) satisfies all of the targeting
|
|
75
|
+
// requirements so far. Returns false if the edge would be longer than
|
|
76
|
+
// 90 degrees (such edges are not supported).
|
|
77
|
+
bool Extend(const S2Point& dst) const;
|
|
78
|
+
|
|
79
|
+
// Requires that the output edge must pass through the given disc.
|
|
80
|
+
bool TargetDisc(const S2Point& point, S1ChordAngle radius);
|
|
81
|
+
|
|
82
|
+
// Requires that the output edge must avoid the given disc. "disc_on_left"
|
|
83
|
+
// specifies whether the disc must be to the left or right of the edge.
|
|
84
|
+
// (This feature allows the simplified edge to preserve the topology of the
|
|
85
|
+
// original polyline with respect to other nearby points.)
|
|
86
|
+
//
|
|
87
|
+
// If your input is a polyline, you can compute "disc_on_left" as follows.
|
|
88
|
+
// Let the polyline be ABCDE and assume that it already avoids a set of
|
|
89
|
+
// points X_i. Suppose that you have aleady added ABC to the simplifer, and
|
|
90
|
+
// now want to extend the edge chain to D. First find the X_i that are near
|
|
91
|
+
// the edge CD, then discard the ones such that AX_i <= AC or AX_i >= AD
|
|
92
|
+
// (since these points have either already been considered or aren't
|
|
93
|
+
// relevant yet). Now X_i is to the left of the polyline if and only if
|
|
94
|
+
// s2pred::OrderedCCW(A, D, X, C) (in other words, if X_i is to the left of
|
|
95
|
+
// the angle wedge ACD).
|
|
96
|
+
bool AvoidDisc(const S2Point& point, S1ChordAngle radius,
|
|
97
|
+
bool disc_on_left);
|
|
98
|
+
|
|
99
|
+
private:
|
|
100
|
+
double GetAngle(const S2Point& p) const;
|
|
101
|
+
double GetSemiwidth(const S2Point& p, S1ChordAngle r,
|
|
102
|
+
int round_direction) const;
|
|
103
|
+
|
|
104
|
+
S2Point src_;
|
|
105
|
+
S2Point x_dir_, y_dir_;
|
|
106
|
+
S1Interval window_;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
#endif // S2_S2POLYLINE_SIMPLIFIER_H_
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright 2016 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/s2polyline_simplifier.h"
|
|
19
|
+
|
|
20
|
+
#include <cfloat>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/s1angle.h"
|
|
25
|
+
#include "s2/s1chord_angle.h"
|
|
26
|
+
#include "s2/s2edge_distances.h"
|
|
27
|
+
#include "s2/s2pointutil.h"
|
|
28
|
+
#include "s2/s2testing.h"
|
|
29
|
+
#include "s2/s2text_format.h"
|
|
30
|
+
|
|
31
|
+
void CheckSimplify(const char* src, const char* dst,
|
|
32
|
+
const char* target, const char* avoid,
|
|
33
|
+
const std::vector<bool>& disc_on_left,
|
|
34
|
+
double radius_degrees, bool expected_result) {
|
|
35
|
+
S1ChordAngle radius(S1Angle::Degrees(radius_degrees));
|
|
36
|
+
S2PolylineSimplifier s;
|
|
37
|
+
s.Init(s2textformat::MakePoint(src));
|
|
38
|
+
for (const S2Point& p : s2textformat::ParsePoints(target)) {
|
|
39
|
+
s.TargetDisc(p, radius);
|
|
40
|
+
}
|
|
41
|
+
int i = 0;
|
|
42
|
+
for (const S2Point& p : s2textformat::ParsePoints(avoid)) {
|
|
43
|
+
s.AvoidDisc(p, radius, disc_on_left[i++]);
|
|
44
|
+
}
|
|
45
|
+
EXPECT_EQ(expected_result, s.Extend(s2textformat::MakePoint(dst)))
|
|
46
|
+
<< "\nsrc = " << src << "\ndst = " << dst
|
|
47
|
+
<< "\ntarget = " << target << "\navoid = " << avoid;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
TEST(S2PolylineSimplifier, Reuse) {
|
|
51
|
+
// Check that Init() can be called more than once.
|
|
52
|
+
S2PolylineSimplifier s;
|
|
53
|
+
S1ChordAngle radius(S1Angle::Degrees(10));
|
|
54
|
+
s.Init(S2Point(1, 0, 0));
|
|
55
|
+
EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0).Normalize(), radius));
|
|
56
|
+
EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.1).Normalize(), radius));
|
|
57
|
+
EXPECT_FALSE(s.Extend(S2Point(1, 1, 0.4).Normalize()));
|
|
58
|
+
|
|
59
|
+
// s.Init(S2Point(0, 1, 0));
|
|
60
|
+
EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.3).Normalize(), radius));
|
|
61
|
+
EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.2).Normalize(), radius));
|
|
62
|
+
EXPECT_FALSE(s.Extend(S2Point(1, 1, 0).Normalize()));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
TEST(S2PolylineSimplifier, NoConstraints) {
|
|
66
|
+
// No constraints, dst == src.
|
|
67
|
+
CheckSimplify("0:1", "0:1", "", "", {}, 0, true);
|
|
68
|
+
|
|
69
|
+
// No constraints, dst != src.
|
|
70
|
+
CheckSimplify("0:1", "1:0", "", "", {}, 0, true);
|
|
71
|
+
|
|
72
|
+
// No constraints, (src, dst) longer than 90 degrees (not supported).
|
|
73
|
+
CheckSimplify("0:0", "0:91", "", "", {}, 0, false);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
TEST(S2PolylineSimplifier, TargetOnePoint) {
|
|
77
|
+
// Three points on a straight line. In theory zero tolerance should work,
|
|
78
|
+
// but in practice there are floating point errors.
|
|
79
|
+
CheckSimplify("0:0", "0:2", "0:1", "", {}, 1e-10, true);
|
|
80
|
+
|
|
81
|
+
// Three points where the middle point is too far away.
|
|
82
|
+
CheckSimplify("0:0", "0:2", "1:1", "", {}, 0.9, false);
|
|
83
|
+
|
|
84
|
+
// A target disc that contains the source vertex.
|
|
85
|
+
CheckSimplify("0:0", "0:2", "0:0.1", "", {}, 1.0, true);
|
|
86
|
+
|
|
87
|
+
// A target disc that contains the destination vertex.
|
|
88
|
+
CheckSimplify("0:0", "0:2", "0:2.1", "", {}, 1.0, true);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
TEST(S2PolylineSimplifier, AvoidOnePoint) {
|
|
92
|
+
// Three points on a straight line, attempting to avoid the middle point.
|
|
93
|
+
CheckSimplify("0:0", "0:2", "", "0:1", {true}, 1e-10, false);
|
|
94
|
+
|
|
95
|
+
// Three points where the middle point can be successfully avoided.
|
|
96
|
+
CheckSimplify("0:0", "0:2", "", "1:1", {true}, 0.9, true);
|
|
97
|
+
|
|
98
|
+
// Three points where the middle point is on the left, but where the client
|
|
99
|
+
// requires the point to be on the right of the edge.
|
|
100
|
+
CheckSimplify("0:0", "0:2", "", "1:1", {false}, 1e-10, false);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
TEST(S2PolylineSimplifier, TargetAndAvoid) {
|
|
104
|
+
// Target several points that are separated from the proposed edge by about
|
|
105
|
+
// 0.7 degrees, and avoid several points that are separated from the
|
|
106
|
+
// proposed edge by about 1.4 degrees.
|
|
107
|
+
CheckSimplify("0:0", "10:10", "2:3, 4:3, 7:8",
|
|
108
|
+
"4:2, 7:5, 7:9", {true, true, false}, 1.0, true);
|
|
109
|
+
|
|
110
|
+
// The same example, but one point to be targeted is 1.4 degrees away.
|
|
111
|
+
CheckSimplify("0:0", "10:10", "2:3, 4:6, 7:8",
|
|
112
|
+
"4:2, 7:5, 7:9", {true, true, false}, 1.0, false);
|
|
113
|
+
|
|
114
|
+
// The same example, but one point to be avoided is 0.7 degrees away.
|
|
115
|
+
CheckSimplify("0:0", "10:10", "2:3, 4:3, 7:8",
|
|
116
|
+
"4:2, 6:5, 7:9", {true, true, false}, 1.0, false);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
TEST(S2PolylineSimplifier, Precision) {
|
|
120
|
+
// This is a rough upper bound on both the error in constructing the disc
|
|
121
|
+
// locations (i.e., S2::InterpolateAtDistance, etc), and also on the
|
|
122
|
+
// padding that S2PolylineSimplifier uses to ensure that its results are
|
|
123
|
+
// conservative (i.e., the error calculated by GetSemiwidth).
|
|
124
|
+
const S1Angle kMaxError = S1Angle::Radians(25 * DBL_EPSILON);
|
|
125
|
+
|
|
126
|
+
// We repeatedly generate a random edge. We then target several discs that
|
|
127
|
+
// barely overlap the edge, and avoid several discs that barely miss the
|
|
128
|
+
// edge. About half the time, we choose one disc and make it slightly too
|
|
129
|
+
// large or too small so that targeting fails.
|
|
130
|
+
const int kIters = 1000; // Passes with 1 million iterations.
|
|
131
|
+
S2PolylineSimplifier simplifier;
|
|
132
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
133
|
+
S2Testing::rnd.Reset(iter + 1); // Easier to reproduce a specific case.
|
|
134
|
+
S2Point src = S2Testing::RandomPoint();
|
|
135
|
+
simplifier.Init(src);
|
|
136
|
+
S2Point dst = S2::InterpolateAtDistance(
|
|
137
|
+
S1Angle::Radians(S2Testing::rnd.RandDouble()),
|
|
138
|
+
src, S2Testing::RandomPoint());
|
|
139
|
+
S2Point n = S2::RobustCrossProd(src, dst).Normalize();
|
|
140
|
+
|
|
141
|
+
// If bad_disc >= 0, then we make targeting fail for that disc.
|
|
142
|
+
const int kNumDiscs = 5;
|
|
143
|
+
int bad_disc = S2Testing::rnd.Uniform(2 * kNumDiscs) - kNumDiscs;
|
|
144
|
+
for (int i = 0; i < kNumDiscs; ++i) {
|
|
145
|
+
double f = S2Testing::rnd.RandDouble();
|
|
146
|
+
S2Point a = ((1 - f) * src + f * dst).Normalize();
|
|
147
|
+
S1Angle r = S1Angle::Radians(S2Testing::rnd.RandDouble());
|
|
148
|
+
bool on_left = S2Testing::rnd.OneIn(2);
|
|
149
|
+
S2Point x = S2::InterpolateAtDistance(r, a, on_left ? n : -n);
|
|
150
|
+
// We grow the radius slightly if we want to target the disc and shrink
|
|
151
|
+
// it otherwise, *unless* we want targeting to fail for this disc, in
|
|
152
|
+
// which case these actions are reversed.
|
|
153
|
+
bool avoid = S2Testing::rnd.OneIn(2);
|
|
154
|
+
bool grow_radius = (avoid == (i == bad_disc));
|
|
155
|
+
S1ChordAngle radius(grow_radius ? r + kMaxError : r - kMaxError);
|
|
156
|
+
if (avoid) {
|
|
157
|
+
simplifier.AvoidDisc(x, radius, on_left);
|
|
158
|
+
} else {
|
|
159
|
+
simplifier.TargetDisc(x, radius);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// The result is true iff all the disc constraints were satisfiable.
|
|
163
|
+
EXPECT_EQ(bad_disc < 0, simplifier.Extend(dst));
|
|
164
|
+
}
|
|
165
|
+
}
|