@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,328 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2CONTAINS_POINT_QUERY_H_
|
|
19
|
+
#define S2_S2CONTAINS_POINT_QUERY_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/s2edge_crosser.h"
|
|
24
|
+
#include "s2/s2shape_index.h"
|
|
25
|
+
#include "s2/s2shapeutil_shape_edge.h"
|
|
26
|
+
|
|
27
|
+
// Defines whether shapes are considered to contain their vertices. Note that
|
|
28
|
+
// these definitions differ from the ones used by S2BooleanOperation.
|
|
29
|
+
//
|
|
30
|
+
// - In the OPEN model, no shapes contain their vertices (not even points).
|
|
31
|
+
// Therefore Contains(S2Point) returns true if and only if the point is
|
|
32
|
+
// in the interior of some polygon.
|
|
33
|
+
//
|
|
34
|
+
// - In the SEMI_OPEN model, polygon point containment is defined such that
|
|
35
|
+
// if several polygons tile the region around a vertex, then exactly one of
|
|
36
|
+
// those polygons contains that vertex. Points and polylines still do not
|
|
37
|
+
// contain any vertices.
|
|
38
|
+
//
|
|
39
|
+
// - In the CLOSED model, all shapes contain their vertices (including points
|
|
40
|
+
// and polylines).
|
|
41
|
+
//
|
|
42
|
+
// Note that points other than vertices are never contained by polylines.
|
|
43
|
+
// If you want need this behavior, use S2ClosestEdgeQuery::IsDistanceLess()
|
|
44
|
+
// with a suitable distance threshold instead.
|
|
45
|
+
enum class S2VertexModel { OPEN, SEMI_OPEN, CLOSED };
|
|
46
|
+
|
|
47
|
+
// This class defines the options supported by S2ContainsPointQuery.
|
|
48
|
+
class S2ContainsPointQueryOptions {
|
|
49
|
+
public:
|
|
50
|
+
S2ContainsPointQueryOptions() {}
|
|
51
|
+
|
|
52
|
+
// Convenience constructor that sets the vertex_model() option.
|
|
53
|
+
explicit S2ContainsPointQueryOptions(S2VertexModel vertex_model);
|
|
54
|
+
|
|
55
|
+
// Controls whether shapes are considered to contain their vertices (see
|
|
56
|
+
// definitions above). By default the SEMI_OPEN model is used.
|
|
57
|
+
//
|
|
58
|
+
// DEFAULT: S2VertexModel::SEMI_OPEN
|
|
59
|
+
S2VertexModel vertex_model() const;
|
|
60
|
+
void set_vertex_model(S2VertexModel model);
|
|
61
|
+
|
|
62
|
+
private:
|
|
63
|
+
S2VertexModel vertex_model_ = S2VertexModel::SEMI_OPEN;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// S2ContainsPointQuery determines whether one or more shapes in an
|
|
67
|
+
// S2ShapeIndex contain a given S2Point. The S2ShapeIndex may contain any
|
|
68
|
+
// number of points, polylines, and/or polygons (possibly overlapping).
|
|
69
|
+
// Shape boundaries may be modeled as OPEN, SEMI_OPEN, or CLOSED (this affects
|
|
70
|
+
// whether or not shapes are considered to contain their vertices).
|
|
71
|
+
//
|
|
72
|
+
// Example usage:
|
|
73
|
+
// auto query = MakeS2ContainsPointQuery(&index, S2VertexModel::CLOSED);
|
|
74
|
+
// return query.Contains(point);
|
|
75
|
+
//
|
|
76
|
+
// This class is not thread-safe. To use it in parallel, each thread should
|
|
77
|
+
// construct its own instance (this is not expensive).
|
|
78
|
+
//
|
|
79
|
+
// However, note that if you need to do a large number of point containment
|
|
80
|
+
// tests, it is more efficient to re-use the S2ContainsPointQuery object
|
|
81
|
+
// rather than constructing a new one each time.
|
|
82
|
+
template <class IndexType>
|
|
83
|
+
class S2ContainsPointQuery {
|
|
84
|
+
private:
|
|
85
|
+
using Iterator = typename IndexType::Iterator;
|
|
86
|
+
|
|
87
|
+
public:
|
|
88
|
+
// Default constructor; requires Init() to be called.
|
|
89
|
+
S2ContainsPointQuery();
|
|
90
|
+
|
|
91
|
+
// Rather than calling this constructor, which requires specifying the
|
|
92
|
+
// IndexType template argument explicitly, the preferred idiom is to call
|
|
93
|
+
// MakeS2ContainsPointQuery() instead. For example:
|
|
94
|
+
//
|
|
95
|
+
// return MakeS2ContainsPointQuery(&index).Contains(p);
|
|
96
|
+
using Options = S2ContainsPointQueryOptions;
|
|
97
|
+
explicit S2ContainsPointQuery(const IndexType* index,
|
|
98
|
+
const Options& options = Options());
|
|
99
|
+
|
|
100
|
+
// Convenience constructor that accepts the S2VertexModel directly.
|
|
101
|
+
S2ContainsPointQuery(const IndexType* index, S2VertexModel vertex_model);
|
|
102
|
+
|
|
103
|
+
const IndexType& index() const { return *index_; }
|
|
104
|
+
const Options& options() const { return options_; }
|
|
105
|
+
|
|
106
|
+
// Equivalent to the two-argument constructor above.
|
|
107
|
+
void Init(const IndexType* index, const Options& options = Options());
|
|
108
|
+
|
|
109
|
+
// Returns true if any shape in the given index() contains the point "p"
|
|
110
|
+
// under the vertex model specified (OPEN, SEMI_OPEN, or CLOSED).
|
|
111
|
+
bool Contains(const S2Point& p);
|
|
112
|
+
|
|
113
|
+
// Returns true if the given shape contains the point "p" under the vertex
|
|
114
|
+
// model specified (OPEN, SEMI_OPEN, or CLOSED).
|
|
115
|
+
//
|
|
116
|
+
// REQUIRES: "shape" belongs to index().
|
|
117
|
+
bool ShapeContains(const S2Shape& shape, const S2Point& p);
|
|
118
|
+
|
|
119
|
+
// Visits all shapes in the given index() that contain the given point "p",
|
|
120
|
+
// terminating early if the given ShapeVisitor function returns false (in
|
|
121
|
+
// which case VisitContainingShapes returns false as well). Each shape is
|
|
122
|
+
// visited at most once.
|
|
123
|
+
//
|
|
124
|
+
// Note that the API allows non-const access to the visited shapes.
|
|
125
|
+
using ShapeVisitor = std::function<bool (S2Shape* shape)>;
|
|
126
|
+
bool VisitContainingShapes(const S2Point& p, const ShapeVisitor& visitor);
|
|
127
|
+
|
|
128
|
+
// Convenience function that returns all the shapes that contain the given
|
|
129
|
+
// point "p".
|
|
130
|
+
std::vector<S2Shape*> GetContainingShapes(const S2Point& p);
|
|
131
|
+
|
|
132
|
+
// Visits all edges in the given index() that are incident to the point "p"
|
|
133
|
+
// (i.e., "p" is one of the edge endpoints), terminating early if the given
|
|
134
|
+
// EdgeVisitor function returns false (in which case VisitIncidentEdges
|
|
135
|
+
// returns false as well). Each edge is visited at most once.
|
|
136
|
+
using EdgeVisitor = std::function<bool (const s2shapeutil::ShapeEdge&)>;
|
|
137
|
+
bool VisitIncidentEdges(const S2Point& p, const EdgeVisitor& visitor);
|
|
138
|
+
|
|
139
|
+
/////////////////////////// Low-Level Methods ////////////////////////////
|
|
140
|
+
//
|
|
141
|
+
// Most clients will not need the following methods. They can be slightly
|
|
142
|
+
// more efficient but are harder to use.
|
|
143
|
+
|
|
144
|
+
// Returns a pointer to the iterator used internally by this class, in order
|
|
145
|
+
// to avoid the need for clients to create their own iterator. Clients are
|
|
146
|
+
// allowed to reposition this iterator arbitrarily between method calls.
|
|
147
|
+
Iterator* mutable_iter() { return &it_; }
|
|
148
|
+
|
|
149
|
+
// Low-level helper method that returns true if the given S2ClippedShape
|
|
150
|
+
// referred to by an S2ShapeIndex::Iterator contains the point "p".
|
|
151
|
+
bool ShapeContains(const Iterator& it, const S2ClippedShape& clipped,
|
|
152
|
+
const S2Point& p) const;
|
|
153
|
+
|
|
154
|
+
private:
|
|
155
|
+
const IndexType* index_;
|
|
156
|
+
Options options_;
|
|
157
|
+
Iterator it_;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// Returns an S2ContainsPointQuery for the given S2ShapeIndex. Note that
|
|
161
|
+
// it is efficient to return S2ContainsPointQuery objects by value.
|
|
162
|
+
template <class IndexType>
|
|
163
|
+
inline S2ContainsPointQuery<IndexType> MakeS2ContainsPointQuery(
|
|
164
|
+
const IndexType* index,
|
|
165
|
+
const S2ContainsPointQueryOptions& options =
|
|
166
|
+
S2ContainsPointQueryOptions()) {
|
|
167
|
+
return S2ContainsPointQuery<IndexType>(index, options);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
////////////////// Implementation details follow ////////////////////
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
inline S2ContainsPointQueryOptions::S2ContainsPointQueryOptions(
|
|
175
|
+
S2VertexModel vertex_model)
|
|
176
|
+
: vertex_model_(vertex_model) {
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
inline S2VertexModel S2ContainsPointQueryOptions::vertex_model() const {
|
|
180
|
+
return vertex_model_;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
inline void S2ContainsPointQueryOptions::set_vertex_model(S2VertexModel model) {
|
|
184
|
+
vertex_model_ = model;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
template <class IndexType>
|
|
188
|
+
inline S2ContainsPointQuery<IndexType>::S2ContainsPointQuery()
|
|
189
|
+
: index_(nullptr) {
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
template <class IndexType>
|
|
193
|
+
inline S2ContainsPointQuery<IndexType>::S2ContainsPointQuery(
|
|
194
|
+
const IndexType* index, const Options& options)
|
|
195
|
+
: index_(index), options_(options), it_(index_) {
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
template <class IndexType>
|
|
199
|
+
inline S2ContainsPointQuery<IndexType>::S2ContainsPointQuery(
|
|
200
|
+
const IndexType* index, S2VertexModel vertex_model)
|
|
201
|
+
: S2ContainsPointQuery(index, Options(vertex_model)) {
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
template <class IndexType>
|
|
205
|
+
void S2ContainsPointQuery<IndexType>::Init(const IndexType* index,
|
|
206
|
+
const Options& options) {
|
|
207
|
+
index_ = index;
|
|
208
|
+
options_ = options;
|
|
209
|
+
it_.Init(index);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
template <class IndexType>
|
|
213
|
+
bool S2ContainsPointQuery<IndexType>::Contains(const S2Point& p) {
|
|
214
|
+
if (!it_.Locate(p)) return false;
|
|
215
|
+
|
|
216
|
+
const S2ShapeIndexCell& cell = it_.cell();
|
|
217
|
+
int num_clipped = cell.num_clipped();
|
|
218
|
+
for (int s = 0; s < num_clipped; ++s) {
|
|
219
|
+
if (ShapeContains(it_, cell.clipped(s), p)) return true;
|
|
220
|
+
}
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
template <class IndexType>
|
|
225
|
+
bool S2ContainsPointQuery<IndexType>::ShapeContains(const S2Shape& shape,
|
|
226
|
+
const S2Point& p) {
|
|
227
|
+
if (!it_.Locate(p)) return false;
|
|
228
|
+
const S2ClippedShape* clipped = it_.cell().find_clipped(shape.id());
|
|
229
|
+
if (clipped == nullptr) return false;
|
|
230
|
+
return ShapeContains(it_, *clipped, p);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
template <class IndexType>
|
|
234
|
+
bool S2ContainsPointQuery<IndexType>::VisitContainingShapes(
|
|
235
|
+
const S2Point& p, const ShapeVisitor& visitor) {
|
|
236
|
+
// This function returns "false" only if the algorithm terminates early
|
|
237
|
+
// because the "visitor" function returned false.
|
|
238
|
+
if (!it_.Locate(p)) return true;
|
|
239
|
+
|
|
240
|
+
const S2ShapeIndexCell& cell = it_.cell();
|
|
241
|
+
int num_clipped = cell.num_clipped();
|
|
242
|
+
for (int s = 0; s < num_clipped; ++s) {
|
|
243
|
+
const S2ClippedShape& clipped = cell.clipped(s);
|
|
244
|
+
if (ShapeContains(it_, clipped, p) &&
|
|
245
|
+
!visitor(index_->shape(clipped.shape_id()))) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
template <class IndexType>
|
|
253
|
+
bool S2ContainsPointQuery<IndexType>::VisitIncidentEdges(
|
|
254
|
+
const S2Point& p, const EdgeVisitor& visitor) {
|
|
255
|
+
// This function returns "false" only if the algorithm terminates early
|
|
256
|
+
// because the "visitor" function returned false.
|
|
257
|
+
if (!it_.Locate(p)) return true;
|
|
258
|
+
|
|
259
|
+
const S2ShapeIndexCell& cell = it_.cell();
|
|
260
|
+
int num_clipped = cell.num_clipped();
|
|
261
|
+
for (int s = 0; s < num_clipped; ++s) {
|
|
262
|
+
const S2ClippedShape& clipped = cell.clipped(s);
|
|
263
|
+
int num_edges = clipped.num_edges();
|
|
264
|
+
if (num_edges == 0) continue;
|
|
265
|
+
const S2Shape& shape = *index_->shape(clipped.shape_id());
|
|
266
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
267
|
+
int edge_id = clipped.edge(i);
|
|
268
|
+
auto edge = shape.edge(edge_id);
|
|
269
|
+
if ((edge.v0 == p || edge.v1 == p) &&
|
|
270
|
+
!visitor(s2shapeutil::ShapeEdge(shape.id(), edge_id, edge))) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
template <class IndexType>
|
|
279
|
+
std::vector<S2Shape*> S2ContainsPointQuery<IndexType>::GetContainingShapes(
|
|
280
|
+
const S2Point& p) {
|
|
281
|
+
std::vector<S2Shape*> results;
|
|
282
|
+
VisitContainingShapes(p, [&results](S2Shape* shape) {
|
|
283
|
+
results.push_back(shape);
|
|
284
|
+
return true;
|
|
285
|
+
});
|
|
286
|
+
return results;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
template <class IndexType>
|
|
290
|
+
bool S2ContainsPointQuery<IndexType>::ShapeContains(
|
|
291
|
+
const Iterator& it, const S2ClippedShape& clipped, const S2Point& p) const {
|
|
292
|
+
bool inside = clipped.contains_center();
|
|
293
|
+
const int num_edges = clipped.num_edges();
|
|
294
|
+
if (num_edges > 0) {
|
|
295
|
+
const S2Shape& shape = *index_->shape(clipped.shape_id());
|
|
296
|
+
if (shape.dimension() < 2) {
|
|
297
|
+
// Points and polylines can be ignored unless the vertex model is CLOSED.
|
|
298
|
+
if (options_.vertex_model() != S2VertexModel::CLOSED) return false;
|
|
299
|
+
|
|
300
|
+
// Otherwise, the point is contained if and only if it matches a vertex.
|
|
301
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
302
|
+
auto edge = shape.edge(clipped.edge(i));
|
|
303
|
+
if (edge.v0 == p || edge.v1 == p) return true;
|
|
304
|
+
}
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
// Test containment by drawing a line segment from the cell center to the
|
|
308
|
+
// given point and counting edge crossings.
|
|
309
|
+
S2CopyingEdgeCrosser crosser(it.center(), p);
|
|
310
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
311
|
+
auto edge = shape.edge(clipped.edge(i));
|
|
312
|
+
int sign = crosser.CrossingSign(edge.v0, edge.v1);
|
|
313
|
+
if (sign < 0) continue;
|
|
314
|
+
if (sign == 0) {
|
|
315
|
+
// For the OPEN and CLOSED models, check whether "p" is a vertex.
|
|
316
|
+
if (options_.vertex_model() != S2VertexModel::SEMI_OPEN &&
|
|
317
|
+
(edge.v0 == p || edge.v1 == p)) {
|
|
318
|
+
return (options_.vertex_model() == S2VertexModel::CLOSED);
|
|
319
|
+
}
|
|
320
|
+
sign = S2::VertexCrossing(crosser.a(), crosser.b(), edge.v0, edge.v1);
|
|
321
|
+
}
|
|
322
|
+
inside ^= sign;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return inside;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
#endif // S2_S2CONTAINS_POINT_QUERY_H_
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2contains_point_query.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include "s2/base/casts.h"
|
|
22
|
+
#include <gtest/gtest.h>
|
|
23
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
24
|
+
#include "s2/mutable_s2shape_index.h"
|
|
25
|
+
#include "s2/s2cap.h"
|
|
26
|
+
#include "s2/s2loop.h"
|
|
27
|
+
#include "s2/s2testing.h"
|
|
28
|
+
#include "s2/s2text_format.h"
|
|
29
|
+
|
|
30
|
+
using absl::make_unique;
|
|
31
|
+
using s2shapeutil::ShapeEdge;
|
|
32
|
+
using s2shapeutil::ShapeEdgeId;
|
|
33
|
+
using s2textformat::MakeIndexOrDie;
|
|
34
|
+
using s2textformat::MakePointOrDie;
|
|
35
|
+
using std::vector;
|
|
36
|
+
|
|
37
|
+
TEST(S2ContainsPointQuery, VertexModelOpen) {
|
|
38
|
+
auto index = MakeIndexOrDie("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6");
|
|
39
|
+
S2ContainsPointQueryOptions options(S2VertexModel::OPEN);
|
|
40
|
+
auto q = MakeS2ContainsPointQuery(index.get(), options);
|
|
41
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:0")));
|
|
42
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("-1:1")));
|
|
43
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("1:1")));
|
|
44
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:2")));
|
|
45
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:3")));
|
|
46
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:5")));
|
|
47
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:7")));
|
|
48
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("2:6")));
|
|
49
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("1:6")));
|
|
50
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("10:10")));
|
|
51
|
+
|
|
52
|
+
// Test the last few cases using the Init() method instead.
|
|
53
|
+
S2ContainsPointQuery<MutableS2ShapeIndex> q2;
|
|
54
|
+
q2.Init(index.get(), options);
|
|
55
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(1), MakePointOrDie("1:6")));
|
|
56
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("1:6")));
|
|
57
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:5")));
|
|
58
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:7")));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TEST(S2ContainsPointQuery, VertexModelSemiOpen) {
|
|
62
|
+
auto index = MakeIndexOrDie("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6");
|
|
63
|
+
S2ContainsPointQueryOptions options(S2VertexModel::SEMI_OPEN);
|
|
64
|
+
auto q = MakeS2ContainsPointQuery(index.get(), options);
|
|
65
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:0")));
|
|
66
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("-1:1")));
|
|
67
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("1:1")));
|
|
68
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:2")));
|
|
69
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:5")));
|
|
70
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("0:7"))); // Contained vertex.
|
|
71
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("2:6")));
|
|
72
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("1:6")));
|
|
73
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("10:10")));
|
|
74
|
+
|
|
75
|
+
// Test the last few cases using the Init() method instead.
|
|
76
|
+
S2ContainsPointQuery<MutableS2ShapeIndex> q2;
|
|
77
|
+
q2.Init(index.get(), options);
|
|
78
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(1), MakePointOrDie("1:6")));
|
|
79
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("1:6")));
|
|
80
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:5")));
|
|
81
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:7")));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
TEST(S2ContainsPointQuery, VertexModelClosed) {
|
|
85
|
+
auto index = MakeIndexOrDie("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6");
|
|
86
|
+
S2ContainsPointQueryOptions options(S2VertexModel::CLOSED);
|
|
87
|
+
auto q = MakeS2ContainsPointQuery(index.get(), options);
|
|
88
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("0:0")));
|
|
89
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("-1:1")));
|
|
90
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("1:1")));
|
|
91
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("0:2")));
|
|
92
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("0:5")));
|
|
93
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("0:7")));
|
|
94
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("2:6")));
|
|
95
|
+
EXPECT_TRUE(q.Contains(MakePointOrDie("1:6")));
|
|
96
|
+
EXPECT_FALSE(q.Contains(MakePointOrDie("10:10")));
|
|
97
|
+
|
|
98
|
+
// Test the last few cases using the Init() method instead.
|
|
99
|
+
S2ContainsPointQuery<MutableS2ShapeIndex> q2;
|
|
100
|
+
q2.Init(index.get(), options);
|
|
101
|
+
EXPECT_FALSE(q2.ShapeContains(*index->shape(1), MakePointOrDie("1:6")));
|
|
102
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("1:6")));
|
|
103
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:5")));
|
|
104
|
+
EXPECT_TRUE(q2.ShapeContains(*index->shape(2), MakePointOrDie("0:7")));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
TEST(S2ContainsPointQuery, GetContainingShapes) {
|
|
108
|
+
// Also tests ShapeContains().
|
|
109
|
+
const int kNumVerticesPerLoop = 10;
|
|
110
|
+
const S1Angle kMaxLoopRadius = S2Testing::KmToAngle(10);
|
|
111
|
+
const S2Cap center_cap(S2Testing::RandomPoint(), kMaxLoopRadius);
|
|
112
|
+
MutableS2ShapeIndex index;
|
|
113
|
+
for (int i = 0; i < 100; ++i) {
|
|
114
|
+
std::unique_ptr<S2Loop> loop = S2Loop::MakeRegularLoop(
|
|
115
|
+
S2Testing::SamplePoint(center_cap),
|
|
116
|
+
S2Testing::rnd.RandDouble() * kMaxLoopRadius, kNumVerticesPerLoop);
|
|
117
|
+
index.Add(make_unique<S2Loop::OwningShape>(std::move(loop)));
|
|
118
|
+
}
|
|
119
|
+
auto query = MakeS2ContainsPointQuery(&index);
|
|
120
|
+
for (int i = 0; i < 100; ++i) {
|
|
121
|
+
S2Point p = S2Testing::SamplePoint(center_cap);
|
|
122
|
+
vector<S2Shape*> expected;
|
|
123
|
+
for (S2Shape* shape : index) {
|
|
124
|
+
const S2Loop* loop = down_cast<const S2Loop::Shape*>(shape)->loop();
|
|
125
|
+
if (loop->Contains(p)) {
|
|
126
|
+
EXPECT_TRUE(query.ShapeContains(*shape, p));
|
|
127
|
+
expected.push_back(shape);
|
|
128
|
+
} else {
|
|
129
|
+
EXPECT_FALSE(query.ShapeContains(*shape, p));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
vector<S2Shape*> actual = query.GetContainingShapes(p);
|
|
133
|
+
EXPECT_EQ(expected, actual);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
using EdgeIdVector = vector<ShapeEdgeId>;
|
|
138
|
+
|
|
139
|
+
void ExpectIncidentEdgeIds(const EdgeIdVector& expected,
|
|
140
|
+
const MutableS2ShapeIndex& index, const S2Point& p) {
|
|
141
|
+
EdgeIdVector actual;
|
|
142
|
+
auto q = MakeS2ContainsPointQuery(&index);
|
|
143
|
+
EXPECT_TRUE(
|
|
144
|
+
q.VisitIncidentEdges(p, [&actual](const s2shapeutil::ShapeEdge& e) {
|
|
145
|
+
actual.push_back(e.id());
|
|
146
|
+
return true;
|
|
147
|
+
}));
|
|
148
|
+
EXPECT_EQ(expected, actual);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
TEST(S2ContainsPointQuery, VisitIncidentEdges) {
|
|
152
|
+
auto index = MakeIndexOrDie("0:0 | 1:1 # 1:1, 1:2 # 1:2, 1:3, 2:2");
|
|
153
|
+
ExpectIncidentEdgeIds({{0, 0}}, *index, MakePointOrDie("0:0"));
|
|
154
|
+
ExpectIncidentEdgeIds({{0, 1}, {1, 0}}, *index, MakePointOrDie("1:1"));
|
|
155
|
+
ExpectIncidentEdgeIds({{1, 0}, {2, 0}, {2, 2}}, *index,
|
|
156
|
+
MakePointOrDie("1:2"));
|
|
157
|
+
ExpectIncidentEdgeIds({{2, 0}, {2, 1}}, *index, MakePointOrDie("1:3"));
|
|
158
|
+
ExpectIncidentEdgeIds({{2, 1}, {2, 2}}, *index, MakePointOrDie("2:2"));
|
|
159
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2contains_vertex_query.h"
|
|
19
|
+
|
|
20
|
+
#include <cmath>
|
|
21
|
+
#include <utility>
|
|
22
|
+
#include "s2/s2pointutil.h"
|
|
23
|
+
#include "s2/s2predicates.h"
|
|
24
|
+
|
|
25
|
+
using std::abs;
|
|
26
|
+
|
|
27
|
+
int S2ContainsVertexQuery::ContainsSign() {
|
|
28
|
+
// Find the unmatched edge that is immediately clockwise from S2::Ortho(P).
|
|
29
|
+
S2Point reference_dir = S2::Ortho(target_);
|
|
30
|
+
std::pair<S2Point, int> best(reference_dir, 0);
|
|
31
|
+
for (const auto& e : edge_map_) {
|
|
32
|
+
S2_DCHECK_LE(abs(e.second), 1);
|
|
33
|
+
if (e.second == 0) continue; // This is a "matched" edge.
|
|
34
|
+
if (s2pred::OrderedCCW(reference_dir, best.first, e.first, target_)) {
|
|
35
|
+
best = e;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return best.second;
|
|
39
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2CONTAINS_VERTEX_QUERY_H_
|
|
19
|
+
#define S2_S2CONTAINS_VERTEX_QUERY_H_
|
|
20
|
+
|
|
21
|
+
#include "s2/util/gtl/btree_map.h"
|
|
22
|
+
#include "s2/s2point.h"
|
|
23
|
+
|
|
24
|
+
// This class determines whether a polygon contains one of its vertices given
|
|
25
|
+
// the edges incident to that vertex. The result is +1 if the vertex is
|
|
26
|
+
// contained, -1 if it is not contained, and 0 if the incident edges consist
|
|
27
|
+
// of matched sibling pairs (in which case the result cannot be determined
|
|
28
|
+
// locally).
|
|
29
|
+
//
|
|
30
|
+
// Point containment is defined according to the "semi-open" boundary model
|
|
31
|
+
// (see S2VertexModel), which means that if several polygons tile the region
|
|
32
|
+
// around a vertex, then exactly one of those polygons contains that vertex.
|
|
33
|
+
//
|
|
34
|
+
// This class is not thread-safe. To use it in parallel, each thread should
|
|
35
|
+
// construct its own instance (this is not expensive).
|
|
36
|
+
class S2ContainsVertexQuery {
|
|
37
|
+
public:
|
|
38
|
+
// "target" is the vertex whose containment will be determined.
|
|
39
|
+
explicit S2ContainsVertexQuery(const S2Point& target);
|
|
40
|
+
|
|
41
|
+
// Indicates that the polygon has an edge between "target" and "v" in the
|
|
42
|
+
// given direction (+1 = outgoing, -1 = incoming, 0 = degenerate).
|
|
43
|
+
void AddEdge(const S2Point& v, int direction);
|
|
44
|
+
|
|
45
|
+
// Returns +1 if the vertex is contained, -1 if it is not contained, and 0
|
|
46
|
+
// if the incident edges consisted of matched sibling pairs.
|
|
47
|
+
int ContainsSign();
|
|
48
|
+
|
|
49
|
+
private:
|
|
50
|
+
S2Point target_;
|
|
51
|
+
gtl::btree_map<S2Point, int> edge_map_;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
////////////////// Implementation details follow ////////////////////
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
inline S2ContainsVertexQuery::S2ContainsVertexQuery(const S2Point& target)
|
|
59
|
+
: target_(target) {
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
inline void S2ContainsVertexQuery::AddEdge(const S2Point& v, int direction) {
|
|
63
|
+
edge_map_[v] += direction;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
#endif // S2_S2CONTAINS_VERTEX_QUERY_H_
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2contains_vertex_query.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
#include "s2/s2loop.h"
|
|
22
|
+
#include "s2/s2pointutil.h"
|
|
23
|
+
#include "s2/s2text_format.h"
|
|
24
|
+
|
|
25
|
+
using s2textformat::MakePoint;
|
|
26
|
+
|
|
27
|
+
TEST(S2ContainsVertexQuery, Undetermined) {
|
|
28
|
+
S2ContainsVertexQuery q(MakePoint("1:2"));
|
|
29
|
+
q.AddEdge(MakePoint("3:4"), 1);
|
|
30
|
+
q.AddEdge(MakePoint("3:4"), -1);
|
|
31
|
+
EXPECT_EQ(0, q.ContainsSign());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
TEST(S2ContainsVertexQuery, ContainedWithDuplicates) {
|
|
35
|
+
// The S2::Ortho reference direction points approximately due west.
|
|
36
|
+
// Containment is determined by the unmatched edge immediately clockwise.
|
|
37
|
+
S2ContainsVertexQuery q(MakePoint("0:0"));
|
|
38
|
+
q.AddEdge(MakePoint("3:-3"), -1);
|
|
39
|
+
q.AddEdge(MakePoint("1:-5"), 1);
|
|
40
|
+
q.AddEdge(MakePoint("2:-4"), 1);
|
|
41
|
+
q.AddEdge(MakePoint("1:-5"), -1);
|
|
42
|
+
EXPECT_EQ(1, q.ContainsSign());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
TEST(S2ContainsVertexQuery, NotContainedWithDuplicates) {
|
|
46
|
+
// The S2::Ortho reference direction points approximately due west.
|
|
47
|
+
// Containment is determined by the unmatched edge immediately clockwise.
|
|
48
|
+
S2ContainsVertexQuery q(MakePoint("1:1"));
|
|
49
|
+
q.AddEdge(MakePoint("1:-5"), 1);
|
|
50
|
+
q.AddEdge(MakePoint("2:-4"), -1);
|
|
51
|
+
q.AddEdge(MakePoint("3:-3"), 1);
|
|
52
|
+
q.AddEdge(MakePoint("1:-5"), -1);
|
|
53
|
+
EXPECT_EQ(-1, q.ContainsSign());
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
TEST(S2ContainsVertexQuery, MatchesLoopContainment) {
|
|
57
|
+
// Check that the containment function defined is compatible with S2Loop
|
|
58
|
+
// (which at least currently does not use this class).
|
|
59
|
+
auto loop = S2Loop::MakeRegularLoop(MakePoint("89:-179"),
|
|
60
|
+
S1Angle::Degrees(10), 1000);
|
|
61
|
+
for (int i = 1; i <= loop->num_vertices(); ++i) {
|
|
62
|
+
S2ContainsVertexQuery q(loop->vertex(i));
|
|
63
|
+
q.AddEdge(loop->vertex(i - 1), -1);
|
|
64
|
+
q.AddEdge(loop->vertex(i + 1), 1);
|
|
65
|
+
EXPECT_EQ(q.ContainsSign() > 0, loop->Contains(loop->vertex(i)));
|
|
66
|
+
}
|
|
67
|
+
}
|