@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.
Files changed (471) hide show
  1. package/.circleci/config.yml +45 -0
  2. package/.dockerignore +1 -0
  3. package/.gitmodules +3 -0
  4. package/CHANGELOG.md +33 -0
  5. package/LICENSE +201 -0
  6. package/README.md +147 -0
  7. package/binding.gyp +170 -0
  8. package/docker/Dockerfile.node20.test +8 -0
  9. package/docker/Dockerfile.node22.test +8 -0
  10. package/docker/Dockerfile.node24.test +8 -0
  11. package/index.d.ts +117 -0
  12. package/index.js +6 -0
  13. package/jest.config.js +184 -0
  14. package/package.json +43 -0
  15. package/publish-linux.sh +18 -0
  16. package/publish-osx.sh +19 -0
  17. package/src/builder.cc +84 -0
  18. package/src/builder.h +29 -0
  19. package/src/cell.cc +71 -0
  20. package/src/cell.h +26 -0
  21. package/src/cell_id.cc +210 -0
  22. package/src/cell_id.h +44 -0
  23. package/src/cell_union.cc +237 -0
  24. package/src/cell_union.h +34 -0
  25. package/src/earth.cc +185 -0
  26. package/src/earth.h +33 -0
  27. package/src/latlng.cc +132 -0
  28. package/src/latlng.h +28 -0
  29. package/src/loop.cc +51 -0
  30. package/src/loop.h +21 -0
  31. package/src/point.cc +69 -0
  32. package/src/point.h +23 -0
  33. package/src/polygon.cc +36 -0
  34. package/src/polygon.h +20 -0
  35. package/src/polyline.cc +186 -0
  36. package/src/polyline.h +34 -0
  37. package/src/region_coverer.cc +450 -0
  38. package/src/region_coverer.h +56 -0
  39. package/src/s2.cc +27 -0
  40. package/test/Cell.test.js +37 -0
  41. package/test/CellId.test.js +135 -0
  42. package/test/CellUnion.test.js +150 -0
  43. package/test/Earth.test.js +62 -0
  44. package/test/LatLng.test.js +45 -0
  45. package/test/Point.test.js +14 -0
  46. package/test/Polyline.test.js +78 -0
  47. package/test/RegionCoverer.test.js +301 -0
  48. package/test.sh +16 -0
  49. package/third_party/s2geometry/.travis.yml +163 -0
  50. package/third_party/s2geometry/AUTHORS +13 -0
  51. package/third_party/s2geometry/CONTRIBUTING.md +65 -0
  52. package/third_party/s2geometry/CONTRIBUTORS +30 -0
  53. package/third_party/s2geometry/LICENSE +202 -0
  54. package/third_party/s2geometry/NOTICE +5 -0
  55. package/third_party/s2geometry/README.md +127 -0
  56. package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
  57. package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
  58. package/third_party/s2geometry/doc/examples/term_index.py +101 -0
  59. package/third_party/s2geometry/src/python/coder.i +125 -0
  60. package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
  61. package/third_party/s2geometry/src/python/s2.i +37 -0
  62. package/third_party/s2geometry/src/python/s2_common.i +756 -0
  63. package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
  64. package/third_party/s2geometry/src/s2/base/casts.h +318 -0
  65. package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
  66. package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
  67. package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
  68. package/third_party/s2geometry/src/s2/base/logging.h +173 -0
  69. package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
  70. package/third_party/s2geometry/src/s2/base/port.h +999 -0
  71. package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
  72. package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
  73. package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
  74. package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
  75. package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
  76. package/third_party/s2geometry/src/s2/base/timer.h +50 -0
  77. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
  78. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
  79. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
  80. package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
  81. package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
  82. package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
  83. package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
  84. package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
  85. package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
  86. package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
  87. package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
  88. package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
  89. package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
  90. package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
  91. package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
  92. package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
  93. package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
  94. package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
  95. package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
  96. package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
  97. package/third_party/s2geometry/src/s2/r1interval.h +220 -0
  98. package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
  99. package/third_party/s2geometry/src/s2/r2.h +26 -0
  100. package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
  101. package/third_party/s2geometry/src/s2/r2rect.h +234 -0
  102. package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
  103. package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
  104. package/third_party/s2geometry/src/s2/s1angle.h +336 -0
  105. package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
  106. package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
  107. package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
  108. package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
  109. package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
  110. package/third_party/s2geometry/src/s2/s1interval.h +266 -0
  111. package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
  112. package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
  113. package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
  114. package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
  115. package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
  116. package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
  117. package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
  118. package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
  119. package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
  120. package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
  121. package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
  122. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
  123. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
  124. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
  125. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
  126. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
  127. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
  128. package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
  129. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
  130. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
  131. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
  132. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
  133. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
  134. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
  135. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
  136. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
  137. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
  138. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
  139. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
  140. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
  141. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
  142. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
  143. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
  144. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
  145. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
  146. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
  147. package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
  148. package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
  149. package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
  150. package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
  151. package/third_party/s2geometry/src/s2/s2cap.h +286 -0
  152. package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
  153. package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
  154. package/third_party/s2geometry/src/s2/s2cell.h +249 -0
  155. package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
  156. package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
  157. package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
  158. package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
  159. package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
  160. package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
  161. package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
  162. package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
  163. package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
  164. package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
  165. package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
  166. package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
  167. package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
  168. package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
  169. package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
  170. package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
  171. package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
  172. package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
  173. package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
  174. package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
  175. package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
  176. package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
  177. package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
  178. package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
  179. package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
  180. package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
  181. package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
  182. package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
  183. package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
  184. package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
  185. package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
  186. package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
  187. package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
  188. package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
  189. package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
  190. package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
  191. package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
  192. package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
  193. package/third_party/s2geometry/src/s2/s2coords.h +459 -0
  194. package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
  195. package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
  196. package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
  197. package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
  198. package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
  199. package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
  200. package/third_party/s2geometry/src/s2/s2debug.h +69 -0
  201. package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
  202. package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
  203. package/third_party/s2geometry/src/s2/s2earth.h +268 -0
  204. package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
  205. package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
  206. package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
  207. package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
  208. package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
  209. package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
  210. package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
  211. package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
  212. package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
  213. package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
  214. package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
  215. package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
  216. package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
  217. package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
  218. package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
  219. package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
  220. package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
  221. package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
  222. package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
  223. package/third_party/s2geometry/src/s2/s2error.cc +29 -0
  224. package/third_party/s2geometry/src/s2/s2error.h +147 -0
  225. package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
  226. package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
  227. package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
  228. package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
  229. package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
  230. package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
  231. package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
  232. package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
  233. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
  234. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
  235. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
  236. package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
  237. package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
  238. package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
  239. package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
  240. package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
  241. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
  242. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
  243. package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
  244. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
  245. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
  246. package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
  247. package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
  248. package/third_party/s2geometry/src/s2/s2loop.h +711 -0
  249. package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
  250. package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
  251. package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
  252. package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
  253. package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
  254. package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
  255. package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
  256. package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
  257. package/third_party/s2geometry/src/s2/s2measures.h +78 -0
  258. package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
  259. package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
  260. package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
  261. package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
  262. package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
  263. package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
  264. package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
  265. package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
  266. package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
  267. package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
  268. package/third_party/s2geometry/src/s2/s2point.h +38 -0
  269. package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
  270. package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
  271. package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
  272. package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
  273. package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
  274. package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
  275. package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
  276. package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
  277. package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
  278. package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
  279. package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
  280. package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
  281. package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
  282. package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
  283. package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
  284. package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
  285. package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
  286. package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
  287. package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
  288. package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
  289. package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
  290. package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
  291. package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
  292. package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
  293. package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
  294. package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
  295. package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
  296. package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
  297. package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
  298. package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
  299. package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
  300. package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
  301. package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
  302. package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
  303. package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
  304. package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
  305. package/third_party/s2geometry/src/s2/s2projections.h +161 -0
  306. package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
  307. package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
  308. package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
  309. package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
  310. package/third_party/s2geometry/src/s2/s2region.cc +26 -0
  311. package/third_party/s2geometry/src/s2/s2region.h +142 -0
  312. package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
  313. package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
  314. package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
  315. package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
  316. package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
  317. package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
  318. package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
  319. package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
  320. package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
  321. package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
  322. package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
  323. package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
  324. package/third_party/s2geometry/src/s2/s2shape.h +283 -0
  325. package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
  326. package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
  327. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
  328. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
  329. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
  330. package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
  331. package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
  332. package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
  333. package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
  334. package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
  335. package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
  336. package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
  337. package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
  338. package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
  339. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
  340. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
  341. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
  342. package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
  343. package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
  344. package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
  345. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
  346. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
  347. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
  348. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
  349. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
  350. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
  351. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
  352. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
  353. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
  354. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
  355. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
  356. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
  357. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
  358. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
  359. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
  360. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
  361. package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
  362. package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
  363. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
  364. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
  365. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
  366. package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
  367. package/third_party/s2geometry/src/s2/s2testing.h +385 -0
  368. package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
  369. package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
  370. package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
  371. package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
  372. package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
  373. package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
  374. package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
  375. package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
  376. package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
  377. package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
  378. package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
  379. package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
  380. package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
  381. package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
  382. package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
  383. package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
  384. package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
  385. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
  386. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
  387. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
  388. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
  389. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
  390. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
  391. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
  392. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
  393. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
  394. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
  395. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
  396. package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
  397. package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
  398. package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
  399. package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
  400. package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
  401. package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
  402. package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
  403. package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
  404. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
  405. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
  406. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
  407. package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
  408. package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
  409. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
  410. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
  411. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
  412. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
  413. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
  414. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
  415. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
  416. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
  417. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
  418. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
  419. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
  420. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
  421. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
  422. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
  423. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
  424. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
  425. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
  426. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
  427. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
  428. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
  429. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
  430. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
  431. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
  432. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
  433. package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
  434. package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
  435. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
  436. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
  437. package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
  438. package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
  439. package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
  440. package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
  441. package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
  442. package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
  443. package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
  444. package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
  445. package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
  446. package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
  447. package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
  448. package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
  449. package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
  450. package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
  451. package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
  452. package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
  453. package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
  454. package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
  455. package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
  456. package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
  457. package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
  458. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
  459. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
  460. package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
  461. package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
  462. package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
  463. package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
  464. package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
  465. package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
  466. package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
  467. package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
  468. package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
  469. package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
  470. package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
  471. 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
+ }