@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,198 @@
|
|
|
1
|
+
// Copyright 2015 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 implement Andrew's monotone chain algorithm, which is a variant of the
|
|
19
|
+
// Graham scan (see https://en.wikipedia.org/wiki/Graham_scan). The time
|
|
20
|
+
// complexity is O(n log n), and the space required is O(n). In fact only the
|
|
21
|
+
// call to "sort" takes O(n log n) time; the rest of the algorithm is linear.
|
|
22
|
+
//
|
|
23
|
+
// Demonstration of the algorithm and code:
|
|
24
|
+
// en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain
|
|
25
|
+
|
|
26
|
+
#include "s2/s2convex_hull_query.h"
|
|
27
|
+
|
|
28
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
29
|
+
#include "s2/s2pointutil.h"
|
|
30
|
+
#include "s2/s2predicates.h"
|
|
31
|
+
|
|
32
|
+
using absl::make_unique;
|
|
33
|
+
using std::unique_ptr;
|
|
34
|
+
using std::vector;
|
|
35
|
+
|
|
36
|
+
S2ConvexHullQuery::S2ConvexHullQuery()
|
|
37
|
+
: bound_(S2LatLngRect::Empty()), points_() {
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void S2ConvexHullQuery::AddPoint(const S2Point& point) {
|
|
41
|
+
bound_.AddPoint(point);
|
|
42
|
+
points_.push_back(point);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void S2ConvexHullQuery::AddPolyline(const S2Polyline& polyline) {
|
|
46
|
+
bound_ = bound_.Union(polyline.GetRectBound());
|
|
47
|
+
for (int i = 0; i < polyline.num_vertices(); ++i) {
|
|
48
|
+
points_.push_back(polyline.vertex(i));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
void S2ConvexHullQuery::AddLoop(const S2Loop& loop) {
|
|
53
|
+
bound_ = bound_.Union(loop.GetRectBound());
|
|
54
|
+
if (loop.is_empty_or_full()) {
|
|
55
|
+
// The empty and full loops consist of a single fake "vertex" that should
|
|
56
|
+
// not be added to our point collection.
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (int i = 0; i < loop.num_vertices(); ++i) {
|
|
60
|
+
points_.push_back(loop.vertex(i));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void S2ConvexHullQuery::AddPolygon(const S2Polygon& polygon) {
|
|
65
|
+
for (int i = 0; i < polygon.num_loops(); ++i) {
|
|
66
|
+
const S2Loop& loop = *polygon.loop(i);
|
|
67
|
+
// Only loops at depth 0 can contribute to the convex hull.
|
|
68
|
+
if (loop.depth() == 0) {
|
|
69
|
+
AddLoop(loop);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
S2Cap S2ConvexHullQuery::GetCapBound() {
|
|
75
|
+
// We keep track of a rectangular bound rather than a spherical cap because
|
|
76
|
+
// it is easy to compute a tight bound for a union of rectangles, whereas it
|
|
77
|
+
// is quite difficult to compute a tight bound around a union of caps.
|
|
78
|
+
// Also, polygons and polylines implement GetCapBound() in terms of
|
|
79
|
+
// GetRectBound() for this same reason, so it is much better to keep track
|
|
80
|
+
// of a rectangular bound as we go along and convert it at the end.
|
|
81
|
+
//
|
|
82
|
+
// TODO(ericv): We could compute an optimal bound by implementing Welzl's
|
|
83
|
+
// algorithm. However we would still need to have special handling of loops
|
|
84
|
+
// and polygons, since if a loop spans more than 180 degrees in any
|
|
85
|
+
// direction (i.e., if it contains two antipodal points), then it is not
|
|
86
|
+
// enough just to bound its vertices. In this case the only convex bounding
|
|
87
|
+
// cap is S2Cap::Full(), and the only convex bounding loop is the full loop.
|
|
88
|
+
return bound_.GetCapBound();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// A comparator for sorting points in CCW around a central point "center".
|
|
92
|
+
class OrderedCcwAround {
|
|
93
|
+
public:
|
|
94
|
+
explicit OrderedCcwAround(const S2Point& center) : center_(center) {}
|
|
95
|
+
bool operator()(const S2Point& x, const S2Point& y) const {
|
|
96
|
+
// If X and Y are equal, this will return false (as desired).
|
|
97
|
+
return s2pred::Sign(center_, x, y) > 0;
|
|
98
|
+
}
|
|
99
|
+
private:
|
|
100
|
+
S2Point center_;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
unique_ptr<S2Loop> S2ConvexHullQuery::GetConvexHull() {
|
|
104
|
+
S2Cap cap = GetCapBound();
|
|
105
|
+
if (cap.height() >= 1) {
|
|
106
|
+
// The bounding cap is not convex. The current bounding cap
|
|
107
|
+
// implementation is not optimal, but nevertheless it is likely that the
|
|
108
|
+
// input geometry itself is not contained by any convex polygon. In any
|
|
109
|
+
// case, we need a convex bounding cap to proceed with the algorithm below
|
|
110
|
+
// (in order to construct a point "origin" that is definitely outside the
|
|
111
|
+
// convex hull).
|
|
112
|
+
return make_unique<S2Loop>(S2Loop::kFull());
|
|
113
|
+
}
|
|
114
|
+
// This code implements Andrew's monotone chain algorithm, which is a simple
|
|
115
|
+
// variant of the Graham scan. Rather than sorting by x-coordinate, instead
|
|
116
|
+
// we sort the points in CCW order around an origin O such that all points
|
|
117
|
+
// are guaranteed to be on one side of some geodesic through O. This
|
|
118
|
+
// ensures that as we scan through the points, each new point can only
|
|
119
|
+
// belong at the end of the chain (i.e., the chain is monotone in terms of
|
|
120
|
+
// the angle around O from the starting point).
|
|
121
|
+
S2Point origin = cap.center().Ortho();
|
|
122
|
+
std::sort(points_.begin(), points_.end(), OrderedCcwAround(origin));
|
|
123
|
+
|
|
124
|
+
// Remove duplicates. We need to do this before checking whether there are
|
|
125
|
+
// fewer than 3 points.
|
|
126
|
+
points_.erase(std::unique(points_.begin(), points_.end()), points_.end());
|
|
127
|
+
|
|
128
|
+
// Special cases for fewer than 3 points.
|
|
129
|
+
if (points_.size() < 3) {
|
|
130
|
+
if (points_.empty()) {
|
|
131
|
+
return make_unique<S2Loop>(S2Loop::kEmpty());
|
|
132
|
+
} else if (points_.size() == 1) {
|
|
133
|
+
return GetSinglePointLoop(points_[0]);
|
|
134
|
+
} else {
|
|
135
|
+
return GetSingleEdgeLoop(points_[0], points_[1]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Verify that all points lie within a 180 degree span around the origin.
|
|
140
|
+
S2_DCHECK_GE(s2pred::Sign(origin, points_.front(), points_.back()), 0);
|
|
141
|
+
|
|
142
|
+
// Generate the lower and upper halves of the convex hull. Each half
|
|
143
|
+
// consists of the maximal subset of vertices such that the edge chain makes
|
|
144
|
+
// only left (CCW) turns.
|
|
145
|
+
vector<S2Point> lower, upper;
|
|
146
|
+
GetMonotoneChain(&lower);
|
|
147
|
+
std::reverse(points_.begin(), points_.end());
|
|
148
|
+
GetMonotoneChain(&upper);
|
|
149
|
+
|
|
150
|
+
// Remove the duplicate vertices and combine the chains.
|
|
151
|
+
S2_DCHECK_EQ(lower.front(), upper.back());
|
|
152
|
+
S2_DCHECK_EQ(lower.back(), upper.front());
|
|
153
|
+
lower.pop_back();
|
|
154
|
+
upper.pop_back();
|
|
155
|
+
lower.insert(lower.end(), upper.begin(), upper.end());
|
|
156
|
+
return make_unique<S2Loop>(lower);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Iterate through the given points, selecting the maximal subset of points
|
|
160
|
+
// such that the edge chain makes only left (CCW) turns.
|
|
161
|
+
void S2ConvexHullQuery::GetMonotoneChain(vector<S2Point>* output) {
|
|
162
|
+
S2_DCHECK(output->empty());
|
|
163
|
+
for (const S2Point& p : points_) {
|
|
164
|
+
// Remove any points that would cause the chain to make a clockwise turn.
|
|
165
|
+
while (output->size() >= 2 &&
|
|
166
|
+
s2pred::Sign(output->end()[-2], output->back(), p) <= 0) {
|
|
167
|
+
output->pop_back();
|
|
168
|
+
}
|
|
169
|
+
output->push_back(p);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
unique_ptr<S2Loop> S2ConvexHullQuery::GetSinglePointLoop(const S2Point& p) {
|
|
174
|
+
// Construct a 3-vertex polygon consisting of "p" and two nearby vertices.
|
|
175
|
+
// Note that Contains(p) may be false for the resulting loop (see comments
|
|
176
|
+
// in header file).
|
|
177
|
+
static const double kOffset = 1e-15;
|
|
178
|
+
S2Point d0 = S2::Ortho(p);
|
|
179
|
+
S2Point d1 = p.CrossProd(d0);
|
|
180
|
+
vector<S2Point> vertices;
|
|
181
|
+
vertices.push_back(p);
|
|
182
|
+
vertices.push_back((p + kOffset * d0).Normalize());
|
|
183
|
+
vertices.push_back((p + kOffset * d1).Normalize());
|
|
184
|
+
return make_unique<S2Loop>(vertices);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
unique_ptr<S2Loop> S2ConvexHullQuery::GetSingleEdgeLoop(const S2Point& a,
|
|
188
|
+
const S2Point& b) {
|
|
189
|
+
// Construct a loop consisting of the two vertices and their midpoint.
|
|
190
|
+
vector<S2Point> vertices;
|
|
191
|
+
vertices.push_back(a);
|
|
192
|
+
vertices.push_back(b);
|
|
193
|
+
vertices.push_back((a + b).Normalize());
|
|
194
|
+
auto loop = make_unique<S2Loop>(vertices);
|
|
195
|
+
// The resulting loop may be clockwise, so invert it if necessary.
|
|
196
|
+
loop->Normalize();
|
|
197
|
+
return loop;
|
|
198
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Copyright 2015 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_S2CONVEX_HULL_QUERY_H_
|
|
19
|
+
#define S2_S2CONVEX_HULL_QUERY_H_
|
|
20
|
+
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "s2/_fp_contract_off.h"
|
|
25
|
+
#include "s2/s2cap.h"
|
|
26
|
+
#include "s2/s2latlng_rect.h"
|
|
27
|
+
#include "s2/s2loop.h"
|
|
28
|
+
#include "s2/s2polygon.h"
|
|
29
|
+
#include "s2/s2polyline.h"
|
|
30
|
+
|
|
31
|
+
// S2ConvexHullQuery builds the convex hull of any collection of points,
|
|
32
|
+
// polylines, loops, and polygons. It returns a single convex loop.
|
|
33
|
+
//
|
|
34
|
+
// The convex hull is defined as the smallest convex region on the sphere that
|
|
35
|
+
// contains all of your input geometry. Recall that a region is "convex" if
|
|
36
|
+
// for every pair of points inside the region, the straight edge between them
|
|
37
|
+
// is also inside the region. In our case, a "straight" edge is a geodesic,
|
|
38
|
+
// i.e. the shortest path on the sphere between two points.
|
|
39
|
+
//
|
|
40
|
+
// Containment of input geometry is defined as follows:
|
|
41
|
+
//
|
|
42
|
+
// - Each input loop and polygon is contained by the convex hull exactly
|
|
43
|
+
// (i.e., according to S2Polygon::Contains(S2Polygon)).
|
|
44
|
+
//
|
|
45
|
+
// - Each input point is either contained by the convex hull or is a vertex
|
|
46
|
+
// of the convex hull. (Recall that S2Loops do not necessarily contain their
|
|
47
|
+
// vertices.)
|
|
48
|
+
//
|
|
49
|
+
// - For each input polyline, the convex hull contains all of its vertices
|
|
50
|
+
// according to the rule for points above. (The definition of convexity
|
|
51
|
+
// then ensures that the convex hull also contains the polyline edges.)
|
|
52
|
+
//
|
|
53
|
+
// To use this class, call the Add*() methods to add your input geometry, and
|
|
54
|
+
// then call GetConvexHull(). Note that GetConvexHull() does *not* reset the
|
|
55
|
+
// state; you can continue adding geometry if desired and compute the convex
|
|
56
|
+
// hull again. If you want to start from scratch, simply declare a new
|
|
57
|
+
// S2ConvexHullQuery object (they are cheap to create).
|
|
58
|
+
//
|
|
59
|
+
// This class is not thread-safe. There are no "const" methods.
|
|
60
|
+
class S2ConvexHullQuery {
|
|
61
|
+
public:
|
|
62
|
+
S2ConvexHullQuery();
|
|
63
|
+
|
|
64
|
+
// Add a point to the input geometry.
|
|
65
|
+
void AddPoint(const S2Point& point);
|
|
66
|
+
|
|
67
|
+
// Add a polyline to the input geometry.
|
|
68
|
+
void AddPolyline(const S2Polyline& polyline);
|
|
69
|
+
|
|
70
|
+
// Add a loop to the input geometry.
|
|
71
|
+
void AddLoop(const S2Loop& loop);
|
|
72
|
+
|
|
73
|
+
// Add a polygon to the input geometry.
|
|
74
|
+
void AddPolygon(const S2Polygon& polygon);
|
|
75
|
+
|
|
76
|
+
// Compute a bounding cap for the input geometry provided.
|
|
77
|
+
//
|
|
78
|
+
// Note that this method does not clear the geometry; you can continue
|
|
79
|
+
// adding to it and call this method again if desired.
|
|
80
|
+
S2Cap GetCapBound();
|
|
81
|
+
|
|
82
|
+
// Compute the convex hull of the input geometry provided.
|
|
83
|
+
//
|
|
84
|
+
// If there is no geometry, this method returns an empty loop containing no
|
|
85
|
+
// points (see S2Loop::is_empty()).
|
|
86
|
+
//
|
|
87
|
+
// If the geometry spans more than half of the sphere, this method returns a
|
|
88
|
+
// full loop containing the entire sphere (see S2Loop::is_full()).
|
|
89
|
+
//
|
|
90
|
+
// If the geometry contains 1 or 2 points, or a single edge, this method
|
|
91
|
+
// returns a very small loop consisting of three vertices (which are a
|
|
92
|
+
// superset of the input vertices).
|
|
93
|
+
//
|
|
94
|
+
// Note that this method does not clear the geometry; you can continue
|
|
95
|
+
// adding to it and call this method again if desired.
|
|
96
|
+
std::unique_ptr<S2Loop> GetConvexHull();
|
|
97
|
+
|
|
98
|
+
private:
|
|
99
|
+
void GetMonotoneChain(std::vector<S2Point>* output);
|
|
100
|
+
std::unique_ptr<S2Loop> GetSinglePointLoop(const S2Point& p);
|
|
101
|
+
std::unique_ptr<S2Loop> GetSingleEdgeLoop(const S2Point& a, const S2Point& b);
|
|
102
|
+
|
|
103
|
+
S2LatLngRect bound_;
|
|
104
|
+
std::vector<S2Point> points_;
|
|
105
|
+
|
|
106
|
+
S2ConvexHullQuery(const S2ConvexHullQuery&) = delete;
|
|
107
|
+
void operator=(const S2ConvexHullQuery&) = delete;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
#endif // S2_S2CONVEX_HULL_QUERY_H_
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// Copyright 2015 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/s2convex_hull_query.h"
|
|
19
|
+
|
|
20
|
+
#include <cmath>
|
|
21
|
+
#include <memory>
|
|
22
|
+
|
|
23
|
+
#include <gtest/gtest.h>
|
|
24
|
+
#include "s2/s2testing.h"
|
|
25
|
+
#include "s2/s2text_format.h"
|
|
26
|
+
|
|
27
|
+
using std::fabs;
|
|
28
|
+
using std::unique_ptr;
|
|
29
|
+
using std::vector;
|
|
30
|
+
|
|
31
|
+
namespace {
|
|
32
|
+
|
|
33
|
+
TEST(S2ConvexHullQueryTest, NoPoints) {
|
|
34
|
+
S2ConvexHullQuery query;
|
|
35
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
36
|
+
EXPECT_TRUE(result->is_empty());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static bool LoopHasVertex(const S2Loop& loop, const S2Point& p) {
|
|
40
|
+
for (int i = 0; i < loop.num_vertices(); ++i) {
|
|
41
|
+
if (loop.vertex(i) == p) return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
TEST(S2ConvexHullQueryTest, OnePoint) {
|
|
47
|
+
S2ConvexHullQuery query;
|
|
48
|
+
S2Point p(0, 0, 1);
|
|
49
|
+
query.AddPoint(p);
|
|
50
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
51
|
+
EXPECT_EQ(3, result->num_vertices());
|
|
52
|
+
EXPECT_TRUE(result->IsNormalized());
|
|
53
|
+
EXPECT_TRUE(LoopHasVertex(*result, p));
|
|
54
|
+
// Add some duplicate points and check that the result is the same.
|
|
55
|
+
query.AddPoint(p);
|
|
56
|
+
query.AddPoint(p);
|
|
57
|
+
unique_ptr<S2Loop> result2(query.GetConvexHull());
|
|
58
|
+
EXPECT_TRUE(result2->Equals(result.get()));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TEST(S2ConvexHullQueryTest, TwoPoints) {
|
|
62
|
+
S2ConvexHullQuery query;
|
|
63
|
+
S2Point p(0, 0, 1);
|
|
64
|
+
S2Point q(0, 1, 0);
|
|
65
|
+
query.AddPoint(p);
|
|
66
|
+
query.AddPoint(q);
|
|
67
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
68
|
+
EXPECT_EQ(3, result->num_vertices());
|
|
69
|
+
EXPECT_TRUE(result->IsNormalized());
|
|
70
|
+
EXPECT_TRUE(LoopHasVertex(*result, p));
|
|
71
|
+
EXPECT_TRUE(LoopHasVertex(*result, q));
|
|
72
|
+
// Add some duplicate points and check that the result is the same.
|
|
73
|
+
query.AddPoint(q);
|
|
74
|
+
query.AddPoint(p);
|
|
75
|
+
query.AddPoint(p);
|
|
76
|
+
unique_ptr<S2Loop> result2(query.GetConvexHull());
|
|
77
|
+
EXPECT_TRUE(result2->Equals(result.get()));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
TEST(S2ConvexHullQueryTest, EmptyLoop) {
|
|
81
|
+
S2ConvexHullQuery query;
|
|
82
|
+
S2Loop empty(S2Loop::kEmpty());
|
|
83
|
+
query.AddLoop(empty);
|
|
84
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
85
|
+
EXPECT_TRUE(result->is_empty());
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
TEST(S2ConvexHullQueryTest, FullLoop) {
|
|
89
|
+
S2ConvexHullQuery query;
|
|
90
|
+
S2Loop full(S2Loop::kFull());
|
|
91
|
+
query.AddLoop(full);
|
|
92
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
93
|
+
EXPECT_TRUE(result->is_full());
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
TEST(S2ConvexHullQueryTest, EmptyPolygon) {
|
|
97
|
+
S2ConvexHullQuery query;
|
|
98
|
+
vector<unique_ptr<S2Loop>> loops;
|
|
99
|
+
S2Polygon empty(std::move(loops));
|
|
100
|
+
query.AddPolygon(empty);
|
|
101
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
102
|
+
EXPECT_TRUE(result->is_empty());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
TEST(S2ConvexHullQueryTest, NonConvexPoints) {
|
|
106
|
+
// Generate a point set such that the only convex region containing them is
|
|
107
|
+
// the entire sphere. In other words, you can generate any point on the
|
|
108
|
+
// sphere by repeatedly linearly interpolating between the points. (The
|
|
109
|
+
// four points of a tetrahedron would also work, but this is easier.)
|
|
110
|
+
S2ConvexHullQuery query;
|
|
111
|
+
for (int face = 0; face < 6; ++face) {
|
|
112
|
+
query.AddPoint(S2CellId::FromFace(face).ToPoint());
|
|
113
|
+
}
|
|
114
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
115
|
+
EXPECT_TRUE(result->is_full());
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
TEST(S2ConvexHullQueryTest, SimplePolyline) {
|
|
119
|
+
// A polyline is handling identically to a point set, so there is no need
|
|
120
|
+
// for special testing other than code coverage.
|
|
121
|
+
unique_ptr<S2Polyline> polyline(s2textformat::MakePolyline(
|
|
122
|
+
"0:1, 0:9, 1:6, 2:6, 3:10, 4:10, 5:5, 4:0, 3:0, 2:5, 1:5"));
|
|
123
|
+
S2ConvexHullQuery query;
|
|
124
|
+
query.AddPolyline(*polyline);
|
|
125
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
126
|
+
unique_ptr<S2Loop> expected_result(
|
|
127
|
+
s2textformat::MakeLoop("0:1, 0:9, 3:10, 4:10, 5:5, 4:0, 3:0"));
|
|
128
|
+
EXPECT_TRUE(result->BoundaryEquals(expected_result.get()));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void TestNorthPoleLoop(S1Angle radius, int num_vertices) {
|
|
132
|
+
// If the radius is very close to 90, then it's hard to predict whether the
|
|
133
|
+
// result will be the full loop or not.
|
|
134
|
+
S2_DCHECK_GE(fabs(radius.radians() - M_PI_2), 1e-15);
|
|
135
|
+
|
|
136
|
+
S2ConvexHullQuery query;
|
|
137
|
+
unique_ptr<S2Loop> loop(
|
|
138
|
+
S2Loop::MakeRegularLoop(S2Point(0, 0, 1), radius, num_vertices));
|
|
139
|
+
query.AddLoop(*loop);
|
|
140
|
+
unique_ptr<S2Loop> result(query.GetConvexHull());
|
|
141
|
+
if (radius > S1Angle::Radians(M_PI_2)) {
|
|
142
|
+
EXPECT_TRUE(result->is_full());
|
|
143
|
+
} else {
|
|
144
|
+
EXPECT_TRUE(result->BoundaryEquals(loop.get()));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
TEST(S2ConvexHullQueryTest, LoopsAroundNorthPole) {
|
|
150
|
+
// Test loops of various sizes around the north pole.
|
|
151
|
+
TestNorthPoleLoop(S1Angle::Degrees(1), 3);
|
|
152
|
+
TestNorthPoleLoop(S1Angle::Degrees(89), 3);
|
|
153
|
+
|
|
154
|
+
// The following two loops should yield the full loop.
|
|
155
|
+
TestNorthPoleLoop(S1Angle::Degrees(91), 3);
|
|
156
|
+
TestNorthPoleLoop(S1Angle::Degrees(179), 3);
|
|
157
|
+
|
|
158
|
+
TestNorthPoleLoop(S1Angle::Degrees(10), 100);
|
|
159
|
+
TestNorthPoleLoop(S1Angle::Degrees(89), 1000);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
TEST(S2ConvexHullQueryTest, PointsInsideHull) {
|
|
163
|
+
// Repeatedly build the convex hull of a set of points, then add more points
|
|
164
|
+
// inside that loop and build the convex hull again. The result should
|
|
165
|
+
// always be the same.
|
|
166
|
+
const int kIters = 1000;
|
|
167
|
+
for (int iter = 0; iter < kIters; ++iter) {
|
|
168
|
+
S2Testing::rnd.Reset(iter + 1); // Easier to reproduce a specific case.
|
|
169
|
+
|
|
170
|
+
// Choose points from within a cap of random size, up to but not including
|
|
171
|
+
// an entire hemisphere.
|
|
172
|
+
S2Cap cap = S2Testing::GetRandomCap(1e-15, 1.999 * M_PI);
|
|
173
|
+
S2ConvexHullQuery query;
|
|
174
|
+
int num_points1 = S2Testing::rnd.Uniform(100) + 3;
|
|
175
|
+
for (int i = 0; i < num_points1; ++i) {
|
|
176
|
+
query.AddPoint(S2Testing::SamplePoint(cap));
|
|
177
|
+
}
|
|
178
|
+
unique_ptr<S2Loop> hull(query.GetConvexHull());
|
|
179
|
+
|
|
180
|
+
// When the convex hull is nearly a hemisphere, the algorithm sometimes
|
|
181
|
+
// returns a full cap instead. This is because it first computes a
|
|
182
|
+
// bounding rectangle for all the input points/edges and then converts it
|
|
183
|
+
// to a bounding cap, which sometimes yields a non-convex cap (radius
|
|
184
|
+
// larger than 90 degrees). This should not be a problem in practice
|
|
185
|
+
// (since most convex hulls are not hemispheres), but in order make this
|
|
186
|
+
// test pass reliably it means that we need to reject convex hulls whose
|
|
187
|
+
// bounding cap (when computed from a bounding rectangle) is not convex.
|
|
188
|
+
//
|
|
189
|
+
// TODO(ericv): This test can still fail (about 1 iteration in 500,000)
|
|
190
|
+
// because the S2LatLngRect::GetCapBound implementation does not guarantee
|
|
191
|
+
// that A.Contains(B) implies A.GetCapBound().Contains(B.GetCapBound()).
|
|
192
|
+
if (hull->GetCapBound().height() >= 1) continue;
|
|
193
|
+
|
|
194
|
+
// Otherwise, add more points inside the convex hull.
|
|
195
|
+
const int num_points2 = 1000;
|
|
196
|
+
for (int i = 0; i < num_points2; ++i) {
|
|
197
|
+
S2Point p = S2Testing::SamplePoint(cap);
|
|
198
|
+
if (hull->Contains(p)) {
|
|
199
|
+
query.AddPoint(p);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Finally, build a new convex hull and check that it hasn't changed.
|
|
203
|
+
unique_ptr<S2Loop> hull2(query.GetConvexHull());
|
|
204
|
+
EXPECT_TRUE(hull2->BoundaryEquals(hull.get())) << "Iteration: " << iter;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
} // namespace
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Copyright 2005 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2coords.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/util/bits/bits.h"
|
|
21
|
+
|
|
22
|
+
namespace S2 {
|
|
23
|
+
|
|
24
|
+
namespace internal {
|
|
25
|
+
|
|
26
|
+
// Define the "extern" constants in s2coords_internal.h.
|
|
27
|
+
|
|
28
|
+
static_assert(kSwapMask == 0x01 && kInvertMask == 0x02, "masks changed");
|
|
29
|
+
|
|
30
|
+
// kIJtoPos[orientation][ij] -> pos
|
|
31
|
+
const int kIJtoPos[4][4] = {
|
|
32
|
+
// (0,0) (0,1) (1,0) (1,1)
|
|
33
|
+
{ 0, 1, 3, 2 }, // canonical order
|
|
34
|
+
{ 0, 3, 1, 2 }, // axes swapped
|
|
35
|
+
{ 2, 3, 1, 0 }, // bits inverted
|
|
36
|
+
{ 2, 1, 3, 0 }, // swapped & inverted
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// kPosToIJ[orientation][pos] -> ij
|
|
40
|
+
const int kPosToIJ[4][4] = {
|
|
41
|
+
// 0 1 2 3
|
|
42
|
+
{ 0, 1, 3, 2 }, // canonical order: (0,0), (0,1), (1,1), (1,0)
|
|
43
|
+
{ 0, 2, 3, 1 }, // axes swapped: (0,0), (1,0), (1,1), (0,1)
|
|
44
|
+
{ 3, 2, 0, 1 }, // bits inverted: (1,1), (1,0), (0,0), (0,1)
|
|
45
|
+
{ 3, 1, 0, 2 }, // swapped & inverted: (1,1), (0,1), (0,0), (1,0)
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// kPosToOrientation[pos] -> orientation_modifier
|
|
49
|
+
const int kPosToOrientation[4] = {
|
|
50
|
+
kSwapMask,
|
|
51
|
+
0,
|
|
52
|
+
0,
|
|
53
|
+
kInvertMask + kSwapMask,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const int kFaceUVWFaces[6][3][2] = {
|
|
57
|
+
{ { 4, 1 }, { 5, 2 }, { 3, 0 } },
|
|
58
|
+
{ { 0, 3 }, { 5, 2 }, { 4, 1 } },
|
|
59
|
+
{ { 0, 3 }, { 1, 4 }, { 5, 2 } },
|
|
60
|
+
{ { 2, 5 }, { 1, 4 }, { 0, 3 } },
|
|
61
|
+
{ { 2, 5 }, { 3, 0 }, { 1, 4 } },
|
|
62
|
+
{ { 4, 1 }, { 3, 0 }, { 2, 5 } }
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const double kFaceUVWAxes[6][3][3] = {
|
|
66
|
+
{
|
|
67
|
+
{ 0, 1, 0 },
|
|
68
|
+
{ 0, 0, 1 },
|
|
69
|
+
{ 1, 0, 0 }
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
{-1, 0, 0 },
|
|
73
|
+
{ 0, 0, 1 },
|
|
74
|
+
{ 0, 1, 0 }
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
{-1, 0, 0 },
|
|
78
|
+
{ 0, -1, 0 },
|
|
79
|
+
{ 0, 0, 1 }
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
{ 0, 0, -1 },
|
|
83
|
+
{ 0, -1, 0 },
|
|
84
|
+
{-1, 0, 0 }
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
{ 0, 0, -1 },
|
|
88
|
+
{ 1, 0, 0 },
|
|
89
|
+
{ 0, -1, 0 }
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
{ 0, 1, 0 },
|
|
93
|
+
{ 1, 0, 0 },
|
|
94
|
+
{ 0, 0, -1 }
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
} // namespace internal
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
S2Point FaceXYZtoUVW(int face, const S2Point& p) {
|
|
103
|
+
// The result coordinates are simply the dot products of P with the (u,v,w)
|
|
104
|
+
// axes for the given face (see kFaceUVWAxes).
|
|
105
|
+
switch (face) {
|
|
106
|
+
case 0: return S2Point( p.y(), p.z(), p.x());
|
|
107
|
+
case 1: return S2Point(-p.x(), p.z(), p.y());
|
|
108
|
+
case 2: return S2Point(-p.x(), -p.y(), p.z());
|
|
109
|
+
case 3: return S2Point(-p.z(), -p.y(), -p.x());
|
|
110
|
+
case 4: return S2Point(-p.z(), p.x(), -p.y());
|
|
111
|
+
default: return S2Point( p.y(), p.x(), -p.z());
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
int XYZtoFaceSiTi(const S2Point& p, int* face, unsigned int* si,
|
|
116
|
+
unsigned int* ti) {
|
|
117
|
+
double u, v;
|
|
118
|
+
*face = XYZtoFaceUV(p, &u, &v);
|
|
119
|
+
*si = STtoSiTi(UVtoST(u));
|
|
120
|
+
*ti = STtoSiTi(UVtoST(v));
|
|
121
|
+
// If the levels corresponding to si,ti are not equal, then p is not a cell
|
|
122
|
+
// center. The si,ti values 0 and kMaxSiTi need to be handled specially
|
|
123
|
+
// because they do not correspond to cell centers at any valid level; they
|
|
124
|
+
// are mapped to level -1 by the code below.
|
|
125
|
+
int level = kMaxCellLevel - Bits::FindLSBSetNonZero(*si | kMaxSiTi);
|
|
126
|
+
if (level < 0 ||
|
|
127
|
+
level != kMaxCellLevel - Bits::FindLSBSetNonZero(*ti | kMaxSiTi)) {
|
|
128
|
+
return -1;
|
|
129
|
+
}
|
|
130
|
+
S2_DCHECK_LE(level, kMaxCellLevel);
|
|
131
|
+
// In infinite precision, this test could be changed to ST == SiTi. However,
|
|
132
|
+
// due to rounding errors, UVtoST(XYZtoFaceUV(FaceUVtoXYZ(STtoUV(...)))) is
|
|
133
|
+
// not idempotent. On the other hand, center_raw is computed exactly the same
|
|
134
|
+
// way p was originally computed (if it is indeed the center of an S2Cell):
|
|
135
|
+
// the comparison can be exact.
|
|
136
|
+
S2Point center = FaceSiTitoXYZ(*face, *si, *ti).Normalize();
|
|
137
|
+
return p == center ? level : -1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
S2Point FaceSiTitoXYZ(int face, unsigned int si, unsigned int ti) {
|
|
141
|
+
double u = STtoUV(SiTitoST(si));
|
|
142
|
+
double v = STtoUV(SiTitoST(ti));
|
|
143
|
+
return FaceUVtoXYZ(face, u, v);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
} // namespace S2
|