@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,184 @@
1
+ // Copyright 2013 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/s2shapeutil_visit_crossing_edge_pairs.h"
19
+
20
+ #include <memory>
21
+ #include <vector>
22
+
23
+ #include <gtest/gtest.h>
24
+ #include "s2/third_party/absl/memory/memory.h"
25
+ #include "s2/mutable_s2shape_index.h"
26
+ #include "s2/s2edge_crossings.h"
27
+ #include "s2/s2edge_vector_shape.h"
28
+ #include "s2/s2error.h"
29
+ #include "s2/s2loop.h"
30
+ #include "s2/s2polygon.h"
31
+ #include "s2/s2shapeutil_contains_brute_force.h"
32
+ #include "s2/s2shapeutil_edge_iterator.h"
33
+ #include "s2/s2text_format.h"
34
+
35
+ using absl::make_unique;
36
+ using std::unique_ptr;
37
+ using std::vector;
38
+
39
+ namespace s2shapeutil {
40
+
41
+ // A set of edge pairs within an S2ShapeIndex.
42
+ using EdgePairVector = std::vector<std::pair<ShapeEdgeId, ShapeEdgeId>>;
43
+
44
+ EdgePairVector GetCrossings(const S2ShapeIndex& index, CrossingType type) {
45
+ EdgePairVector edge_pairs;
46
+ VisitCrossingEdgePairs(
47
+ index, type, [&edge_pairs](const ShapeEdge& a, const ShapeEdge& b, bool) {
48
+ edge_pairs.push_back(std::make_pair(a.id(), b.id()));
49
+ return true; // Continue visiting.
50
+ });
51
+ if (edge_pairs.size() > 1) {
52
+ std::sort(edge_pairs.begin(), edge_pairs.end());
53
+ edge_pairs.erase(std::unique(edge_pairs.begin(), edge_pairs.end()),
54
+ edge_pairs.end());
55
+ }
56
+ return edge_pairs;
57
+ }
58
+
59
+ EdgePairVector GetCrossingEdgePairsBruteForce(const S2ShapeIndex& index,
60
+ CrossingType type) {
61
+ EdgePairVector result;
62
+ int min_sign = (type == CrossingType::ALL) ? 0 : 1;
63
+ for (EdgeIterator a_iter(&index); !a_iter.Done(); a_iter.Next()) {
64
+ auto a = a_iter.edge();
65
+ EdgeIterator b_iter = a_iter;
66
+ for (b_iter.Next(); !b_iter.Done(); b_iter.Next()) {
67
+ auto b = b_iter.edge();
68
+ if (S2::CrossingSign(a.v0, a.v1, b.v0, b.v1) >= min_sign) {
69
+ result.push_back(
70
+ std::make_pair(a_iter.shape_edge_id(), b_iter.shape_edge_id()));
71
+ }
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+
77
+ std::ostream& operator<<(std::ostream& os,
78
+ const std::pair<ShapeEdgeId, ShapeEdgeId>& pair) {
79
+ return os << "(" << pair.first << "," << pair.second << ")";
80
+ }
81
+
82
+ void TestGetCrossingEdgePairs(const S2ShapeIndex& index,
83
+ CrossingType type) {
84
+ EdgePairVector expected = GetCrossingEdgePairsBruteForce(index, type);
85
+ EdgePairVector actual = GetCrossings(index, type);
86
+ if (actual != expected) {
87
+ ADD_FAILURE() << "Unexpected edge pairs; see details below."
88
+ << "\nExpected number of edge pairs: " << expected.size()
89
+ << "\nActual number of edge pairs: " << actual.size();
90
+ for (const auto& edge_pair : expected) {
91
+ if (std::count(actual.begin(), actual.end(), edge_pair) != 1) {
92
+ std::cout << "Missing value: " << edge_pair << std::endl;
93
+ }
94
+ }
95
+ for (const auto& edge_pair : actual) {
96
+ if (std::count(expected.begin(), expected.end(), edge_pair) != 1) {
97
+ std::cout << "Extra value: " << edge_pair << std::endl;
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ TEST(GetCrossingEdgePairs, NoIntersections) {
104
+ MutableS2ShapeIndex index;
105
+ TestGetCrossingEdgePairs(index, CrossingType::ALL);
106
+ TestGetCrossingEdgePairs(index, CrossingType::INTERIOR);
107
+ }
108
+
109
+ TEST(GetCrossingEdgePairs, EdgeGrid) {
110
+ const int kGridSize = 10; // (kGridSize + 1) * (kGridSize + 1) crossings
111
+ MutableS2ShapeIndex index;
112
+ auto shape = make_unique<S2EdgeVectorShape>();
113
+ for (int i = 0; i <= kGridSize; ++i) {
114
+ shape->Add(S2LatLng::FromDegrees(0, i).ToPoint(),
115
+ S2LatLng::FromDegrees(kGridSize, i).ToPoint());
116
+ shape->Add(S2LatLng::FromDegrees(i, 0).ToPoint(),
117
+ S2LatLng::FromDegrees(i, kGridSize).ToPoint());
118
+ }
119
+ index.Add(std::move(shape));
120
+ TestGetCrossingEdgePairs(index, CrossingType::ALL);
121
+ TestGetCrossingEdgePairs(index, CrossingType::INTERIOR);
122
+ }
123
+
124
+ // Return true if any loop crosses any other loop (including vertex crossings
125
+ // and duplicate edges), or any loop has a self-intersection (including
126
+ // duplicate vertices).
127
+ static bool HasSelfIntersection(const MutableS2ShapeIndex& index) {
128
+ S2Error error;
129
+ if (s2shapeutil::FindSelfIntersection(index, &error)) {
130
+ S2_VLOG(1) << error;
131
+ return true;
132
+ }
133
+ return false;
134
+ }
135
+
136
+ // This function recursively verifies that HasCrossing returns the given
137
+ // result for all possible cyclic permutations of the loop vertices for the
138
+ // given set of loops.
139
+ void TestHasCrossingPermutations(vector<unique_ptr<S2Loop>>* loops, int i,
140
+ bool has_crossing) {
141
+ if (i == loops->size()) {
142
+ MutableS2ShapeIndex index;
143
+ S2Polygon polygon(std::move(*loops), S2Debug::DISABLE);
144
+ index.Add(make_unique<S2Polygon::Shape>(&polygon));
145
+ EXPECT_EQ(has_crossing, HasSelfIntersection(index));
146
+ *loops = polygon.Release();
147
+ } else {
148
+ unique_ptr<S2Loop> orig_loop = std::move((*loops)[i]);
149
+ for (int j = 0; j < orig_loop->num_vertices(); ++j) {
150
+ vector<S2Point> vertices;
151
+ for (int k = 0; k < orig_loop->num_vertices(); ++k) {
152
+ vertices.push_back(orig_loop->vertex(j + k));
153
+ }
154
+ (*loops)[i] = make_unique<S2Loop>(vertices, S2Debug::DISABLE);
155
+ TestHasCrossingPermutations(loops, i+1, has_crossing);
156
+ }
157
+ (*loops)[i] = std::move(orig_loop);
158
+ }
159
+ }
160
+
161
+ // Given a string reprsenting a polygon, and a boolean indicating whether this
162
+ // polygon has any self-intersections or loop crossings, verify that all
163
+ // HasSelfIntersection returns the expected result for all possible cyclic
164
+ // permutations of the loop vertices.
165
+ void TestHasCrossing(const string& polygon_str, bool has_crossing) {
166
+ // Set S2Debug::DISABLE to allow invalid polygons.
167
+ unique_ptr<S2Polygon> polygon =
168
+ s2textformat::MakePolygonOrDie(polygon_str, S2Debug::DISABLE);
169
+ vector<unique_ptr<S2Loop>> loops = polygon->Release();
170
+ TestHasCrossingPermutations(&loops, 0, has_crossing);
171
+ }
172
+
173
+ TEST(FindSelfIntersection, Basic) {
174
+ // Coordinates are (lat,lng), which can be visualized as (y,x).
175
+ TestHasCrossing("0:0, 0:1, 0:2, 1:2, 1:1, 1:0", false);
176
+ TestHasCrossing("0:0, 0:1, 0:2, 1:2, 0:1, 1:0", true); // duplicate vertex
177
+ TestHasCrossing("0:0, 0:1, 1:0, 1:1", true); // edge crossing
178
+ TestHasCrossing("0:0, 1:1, 0:1; 0:0, 1:1, 1:0", true); // duplicate edge
179
+ TestHasCrossing("0:0, 1:1, 0:1; 1:1, 0:0, 1:0", true); // reversed edge
180
+ TestHasCrossing("0:0, 0:2, 2:2, 2:0; 1:1, 0:2, 3:1, 2:0",
181
+ true); // vertex crossing
182
+ }
183
+
184
+ } // namespace s2shapeutil
@@ -0,0 +1,464 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s2testing.h"
19
+
20
+ #include <algorithm>
21
+ #include <cmath>
22
+ #include <cstddef>
23
+ #include <cstdlib>
24
+ #include <memory>
25
+ #include <utility>
26
+ #include <vector>
27
+
28
+ #include "s2/base/commandlineflags.h"
29
+ #include "s2/base/integral_types.h"
30
+ #include "s2/base/logging.h"
31
+ #include "s2/r1interval.h"
32
+ #include "s2/s1angle.h"
33
+ #include "s2/s1interval.h"
34
+ #include "s2/s2cap.h"
35
+ #include "s2/s2cell.h"
36
+ #include "s2/s2cell_union.h"
37
+ #include "s2/s2latlng.h"
38
+ #include "s2/s2latlng_rect.h"
39
+ #include "s2/s2loop.h"
40
+ #include "s2/s2pointutil.h"
41
+ #include "s2/s2polygon.h"
42
+ #include "s2/s2polyline.h"
43
+ #include "s2/s2region.h"
44
+ #include "s2/s2text_format.h"
45
+ #include "s2/strings/serialize.h"
46
+ #include "s2/third_party/absl/memory/memory.h"
47
+ #include "s2/third_party/absl/strings/str_split.h"
48
+ #include "s2/util/math/matrix3x3.h"
49
+
50
+ using absl::make_unique;
51
+ using std::max;
52
+ using std::unique_ptr;
53
+ using std::vector;
54
+
55
+ S2_DEFINE_int32(s2_random_seed, 1,
56
+ "Seed value that can be passed to S2Testing::rnd.Reset()");
57
+
58
+ const double S2Testing::kEarthRadiusKm = 6371.01;
59
+
60
+ S2Testing::Random::Random() {
61
+ // Unfortunately we can't use FLAGS_s2_random_seed here, because the default
62
+ // S2Testing::Random instance is initialized before command-line flags have
63
+ // been parsed.
64
+ srandom(1);
65
+ }
66
+
67
+ void S2Testing::Random::Reset(int seed) {
68
+ srandom(seed);
69
+ }
70
+
71
+ // Return a 64-bit unsigned integer whose lowest "num_bits" are random, and
72
+ // whose other bits are zero.
73
+ inline uint64 GetBits(int num_bits) {
74
+ S2_DCHECK_GE(num_bits, 0);
75
+ S2_DCHECK_LE(num_bits, 64);
76
+
77
+ // This code uses random(), which returns an integer in the range
78
+ // from 0 to (2^31)-1 inclusive (i.e. all of the lower 31 bits are
79
+ // in play, and the 32nd bit and higher are 0) regardless of whether
80
+ // its return type (long) is larger than 32 bits. See
81
+ //
82
+ // www.gnu.org/software/libc/manual/html_node/BSD-Random.html#BSD-Random
83
+ //
84
+ // Note that at some point the manual page in linux claimed that the range
85
+ // is 0 to RAND_MAX as defined in stdlib.h. RAND_MAX however is part only
86
+ // of the ISO rand() interface. At least as of glibc-2.21, rand() is
87
+ // simply an alias for random(). On other systems, rand() may differ,
88
+ // but random() should always adhere to the behavior specified in BSD.
89
+ static const int RAND_BITS = 31;
90
+
91
+ uint64 result = 0;
92
+ for (int bits = 0; bits < num_bits; bits += RAND_BITS) {
93
+ result = (result << RAND_BITS) + random();
94
+ }
95
+ if (num_bits < 64) { // Not legal to shift by full bitwidth of type
96
+ result &= ((1ULL << num_bits) - 1);
97
+ }
98
+ return result;
99
+ }
100
+
101
+ uint64 S2Testing::Random::Rand64() {
102
+ return GetBits(64);
103
+ }
104
+
105
+ uint32 S2Testing::Random::Rand32() {
106
+ return GetBits(32);
107
+ }
108
+
109
+ double S2Testing::Random::RandDouble() {
110
+ const int NUM_BITS = 53;
111
+ return ldexp(GetBits(NUM_BITS), -NUM_BITS);
112
+ }
113
+
114
+ int32 S2Testing::Random::Uniform(int32 n) {
115
+ S2_DCHECK_GT(n, 0);
116
+ return static_cast<uint32>(RandDouble() * n);
117
+ }
118
+
119
+ double S2Testing::Random::UniformDouble(double min, double limit) {
120
+ S2_DCHECK_LT(min, limit);
121
+ return min + RandDouble() * (limit - min);
122
+ }
123
+
124
+ bool S2Testing::Random::OneIn(int32 n) {
125
+ return Uniform(n) == 0;
126
+ }
127
+
128
+ int32 S2Testing::Random::Skewed(int max_log) {
129
+ S2_DCHECK_GE(max_log, 0);
130
+ S2_DCHECK_LE(max_log, 31);
131
+ int32 base = Uniform(max_log + 1);
132
+ return GetBits(31) & ((1U << base) - 1);
133
+ }
134
+
135
+ S2Testing::Random S2Testing::rnd;
136
+
137
+ void S2Testing::AppendLoopVertices(const S2Loop& loop,
138
+ vector<S2Point>* vertices) {
139
+ int n = loop.num_vertices();
140
+ const S2Point* base = &loop.vertex(0);
141
+ S2_DCHECK_EQ(&loop.vertex(n - 1), base + n - 1);
142
+ vertices->insert(vertices->end(), base, base + n);
143
+ }
144
+
145
+ vector<S2Point> S2Testing::MakeRegularPoints(const S2Point& center,
146
+ S1Angle radius,
147
+ int num_vertices) {
148
+ unique_ptr<S2Loop> loop(
149
+ S2Loop::MakeRegularLoop(center, radius, num_vertices));
150
+ vector<S2Point> points;
151
+ points.reserve(loop->num_vertices());
152
+ for (int i = 0; i < loop->num_vertices(); i++) {
153
+ points.push_back(loop->vertex(i));
154
+ }
155
+ return points;
156
+ }
157
+
158
+ S1Angle S2Testing::MetersToAngle(double meters) {
159
+ return KmToAngle(0.001 * meters);
160
+ }
161
+
162
+ S1Angle S2Testing::KmToAngle(double km) {
163
+ return S1Angle::Radians(km / kEarthRadiusKm);
164
+ }
165
+
166
+ double S2Testing::AreaToMeters2(double steradians) {
167
+ return 1e6 * AreaToKm2(steradians);
168
+ }
169
+
170
+ double S2Testing::AreaToKm2(double steradians) {
171
+ return steradians * kEarthRadiusKm * kEarthRadiusKm;
172
+ }
173
+
174
+ // The overloaded Dump() function is for use within a debugger.
175
+ void Dump(const S2Point& p) {
176
+ std::cout << "S2Point: " << s2textformat::ToString(p) << std::endl;
177
+ }
178
+
179
+ void Dump(const S2Loop& loop) {
180
+ std::cout << "S2Polygon: " << s2textformat::ToString(loop) << std::endl;
181
+ }
182
+
183
+ void Dump(const S2Polyline& polyline) {
184
+ std::cout << "S2Polyline: " << s2textformat::ToString(polyline) << std::endl;
185
+ }
186
+
187
+ void Dump(const S2Polygon& polygon) {
188
+ std::cout << "S2Polygon: " << s2textformat::ToString(polygon) << std::endl;
189
+ }
190
+
191
+ // Outputs the contents of an S2ShapeIndex in human-readable form.
192
+ void Dump(const S2ShapeIndex& index) {
193
+ std::cout << "S2ShapeIndex: " << &index << std::endl;
194
+ for (S2ShapeIndex::Iterator it(&index, S2ShapeIndex::BEGIN);
195
+ !it.done(); it.Next()) {
196
+ std::cout << " id: " << it.id().ToString() << std::endl;
197
+ const S2ShapeIndexCell& cell = it.cell();
198
+ for (int s = 0; s < cell.num_clipped(); ++s) {
199
+ const S2ClippedShape& clipped = cell.clipped(s);
200
+ std::cout << " shape_id " << clipped.shape_id() << ": ";
201
+ for (int e = 0; e < clipped.num_edges(); ++e) {
202
+ if (e > 0) std::cout << ", ";
203
+ std::cout << clipped.edge(e);
204
+ }
205
+ std::cout << std::endl;
206
+ }
207
+ }
208
+ }
209
+
210
+ S2Point S2Testing::RandomPoint() {
211
+ // The order of evaluation of function arguments is unspecified,
212
+ // so we may not just call S2Point with three RandDouble-based args.
213
+ // Use temporaries to induce sequence points between calls.
214
+ double x = rnd.UniformDouble(-1, 1);
215
+ double y = rnd.UniformDouble(-1, 1);
216
+ double z = rnd.UniformDouble(-1, 1);
217
+ return S2Point(x, y, z).Normalize();
218
+ }
219
+
220
+ void S2Testing::GetRandomFrame(Vector3_d* x, Vector3_d* y, Vector3_d* z) {
221
+ *z = RandomPoint();
222
+ GetRandomFrameAt(*z, x, y);
223
+ }
224
+
225
+ Matrix3x3_d S2Testing::GetRandomFrame() {
226
+ return GetRandomFrameAt(RandomPoint());
227
+ }
228
+
229
+ void S2Testing::GetRandomFrameAt(const S2Point& z, S2Point* x, S2Point *y) {
230
+ *x = z.CrossProd(RandomPoint()).Normalize();
231
+ *y = z.CrossProd(*x).Normalize();
232
+ }
233
+
234
+ Matrix3x3_d S2Testing::GetRandomFrameAt(const S2Point& z) {
235
+ S2Point x, y;
236
+ GetRandomFrameAt(z, &x, &y);
237
+ return Matrix3x3_d::FromCols(x, y, z);
238
+ }
239
+
240
+ S2CellId S2Testing::GetRandomCellId(int level) {
241
+ int face = rnd.Uniform(S2CellId::kNumFaces);
242
+ uint64 pos = rnd.Rand64() & ((1ULL << S2CellId::kPosBits) - 1);
243
+ return S2CellId::FromFacePosLevel(face, pos, level);
244
+ }
245
+
246
+ S2CellId S2Testing::GetRandomCellId() {
247
+ return GetRandomCellId(rnd.Uniform(S2CellId::kMaxLevel + 1));
248
+ }
249
+
250
+ S2Cap S2Testing::GetRandomCap(double min_area, double max_area) {
251
+ double cap_area = max_area * pow(min_area / max_area, rnd.RandDouble());
252
+ S2_DCHECK_GE(cap_area, min_area);
253
+ S2_DCHECK_LE(cap_area, max_area);
254
+
255
+ // The surface area of a cap is 2*Pi times its height.
256
+ return S2Cap::FromCenterArea(RandomPoint(), cap_area);
257
+ }
258
+
259
+ void S2Testing::ConcentricLoopsPolygon(const S2Point& center,
260
+ int num_loops,
261
+ int num_vertices_per_loop,
262
+ S2Polygon* polygon) {
263
+ Matrix3x3_d m;
264
+ S2::GetFrame(center, &m);
265
+ vector<unique_ptr<S2Loop>> loops;
266
+ for (int li = 0; li < num_loops; ++li) {
267
+ vector<S2Point> vertices;
268
+ double radius = 0.005 * (li + 1) / num_loops;
269
+ double radian_step = 2 * M_PI / num_vertices_per_loop;
270
+ for (int vi = 0; vi < num_vertices_per_loop; ++vi) {
271
+ double angle = vi * radian_step;
272
+ S2Point p(radius * cos(angle), radius * sin(angle), 1);
273
+ vertices.push_back(S2::FromFrame(m, p.Normalize()));
274
+ }
275
+ loops.push_back(make_unique<S2Loop>(vertices));
276
+ }
277
+ polygon->InitNested(std::move(loops));
278
+ }
279
+
280
+ S2Point S2Testing::SamplePoint(const S2Cap& cap) {
281
+ // We consider the cap axis to be the "z" axis. We choose two other axes to
282
+ // complete the coordinate frame.
283
+
284
+ Matrix3x3_d m;
285
+ S2::GetFrame(cap.center(), &m);
286
+
287
+ // The surface area of a spherical cap is directly proportional to its
288
+ // height. First we choose a random height, and then we choose a random
289
+ // point along the circle at that height.
290
+
291
+ double h = rnd.RandDouble() * cap.height();
292
+ double theta = 2 * M_PI * rnd.RandDouble();
293
+ double r = sqrt(h * (2 - h)); // Radius of circle.
294
+
295
+ // The result should already be very close to unit-length, but we might as
296
+ // well make it accurate as possible.
297
+ return S2::FromFrame(m, S2Point(cos(theta) * r, sin(theta) * r, 1 - h))
298
+ .Normalize();
299
+ }
300
+
301
+ S2Point S2Testing::SamplePoint(const S2LatLngRect& rect) {
302
+ // First choose a latitude uniformly with respect to area on the sphere.
303
+ double sin_lo = sin(rect.lat().lo());
304
+ double sin_hi = sin(rect.lat().hi());
305
+ double lat = asin(rnd.UniformDouble(sin_lo, sin_hi));
306
+
307
+ // Now choose longitude uniformly within the given range.
308
+ double lng = rect.lng().lo() + rnd.RandDouble() * rect.lng().GetLength();
309
+ return S2LatLng::FromRadians(lat, lng).Normalized().ToPoint();
310
+ }
311
+
312
+ void S2Testing::CheckCovering(const S2Region& region,
313
+ const S2CellUnion& covering,
314
+ bool check_tight, S2CellId id) {
315
+ if (!id.is_valid()) {
316
+ for (int face = 0; face < 6; ++face) {
317
+ CheckCovering(region, covering, check_tight, S2CellId::FromFace(face));
318
+ }
319
+ return;
320
+ }
321
+
322
+ if (!region.MayIntersect(S2Cell(id))) {
323
+ // If region does not intersect id, then neither should the covering.
324
+ if (check_tight) S2_CHECK(!covering.Intersects(id));
325
+
326
+ } else if (!covering.Contains(id)) {
327
+ // The region may intersect id, but we can't assert that the covering
328
+ // intersects id because we may discover that the region does not actually
329
+ // intersect upon further subdivision. (MayIntersect is not exact.)
330
+ S2_CHECK(!region.Contains(S2Cell(id)));
331
+ S2_CHECK(!id.is_leaf());
332
+ S2CellId end = id.child_end();
333
+ S2CellId child;
334
+ for (child = id.child_begin(); child != end; child = child.next()) {
335
+ CheckCovering(region, covering, check_tight, child);
336
+ }
337
+ }
338
+ }
339
+
340
+ S2Testing::Fractal::Fractal()
341
+ : max_level_(-1), min_level_arg_(-1), min_level_(-1),
342
+ dimension_(log(4)/log(3)), /* standard Koch curve */
343
+ edge_fraction_(0), offset_fraction_(0) {
344
+ ComputeOffsets();
345
+ }
346
+
347
+ void S2Testing::Fractal::set_max_level(int max_level) {
348
+ S2_DCHECK_GE(max_level, 0);
349
+ max_level_ = max_level;
350
+ ComputeMinLevel();
351
+ }
352
+
353
+ void S2Testing::Fractal::set_min_level(int min_level_arg) {
354
+ S2_DCHECK_GE(min_level_arg, -1);
355
+ min_level_arg_ = min_level_arg;
356
+ ComputeMinLevel();
357
+ }
358
+
359
+ void S2Testing::Fractal::ComputeMinLevel() {
360
+ if (min_level_arg_ >= 0 && min_level_arg_ <= max_level_) {
361
+ min_level_ = min_level_arg_;
362
+ } else {
363
+ min_level_ = max_level_;
364
+ }
365
+ }
366
+
367
+ void S2Testing::Fractal::set_fractal_dimension(double dimension) {
368
+ S2_DCHECK_GE(dimension, 1.0);
369
+ S2_DCHECK_LT(dimension, 2.0);
370
+ dimension_ = dimension;
371
+ ComputeOffsets();
372
+ }
373
+
374
+ void S2Testing::Fractal::ComputeOffsets() {
375
+ edge_fraction_ = pow(4.0, -1.0 / dimension_);
376
+ offset_fraction_ = sqrt(edge_fraction_ - 0.25);
377
+ }
378
+
379
+ void S2Testing::Fractal::SetLevelForApproxMinEdges(int min_edges) {
380
+ // Map values in the range [3*(4**n)/2, 3*(4**n)*2) to level n.
381
+ set_min_level(round(0.5 * log2(min_edges / 3)));
382
+ }
383
+
384
+ void S2Testing::Fractal::SetLevelForApproxMaxEdges(int max_edges) {
385
+ // Map values in the range [3*(4**n)/2, 3*(4**n)*2) to level n.
386
+ set_max_level(round(0.5 * log2(max_edges / 3)));
387
+ }
388
+
389
+ double S2Testing::Fractal::min_radius_factor() const {
390
+ // The minimum radius is attained at one of the vertices created by the
391
+ // first subdivision step as long as the dimension is not too small (at
392
+ // least kMinDimensionForMinRadiusAtLevel1, see below). Otherwise we fall
393
+ // back on the incircle radius of the original triangle, which is always a
394
+ // lower bound (and is attained when dimension = 1).
395
+ //
396
+ // The value below was obtained by letting AE be an original triangle edge,
397
+ // letting ABCDE be the corresponding polyline after one subdivision step,
398
+ // and then letting BC be tangent to the inscribed circle at the center of
399
+ // the fractal O. This gives rise to a pair of similar triangles whose edge
400
+ // length ratios can be used to solve for the corresponding "edge fraction".
401
+ // This method is slightly conservative because it is computed using planar
402
+ // rather than spherical geometry. The value below is equal to
403
+ // -log(4)/log((2 + cbrt(2) - cbrt(4))/6).
404
+ const double kMinDimensionForMinRadiusAtLevel1 = 1.0852230903040407;
405
+ if (dimension_ >= kMinDimensionForMinRadiusAtLevel1) {
406
+ return sqrt(1 + 3 * edge_fraction_ * (edge_fraction_ - 1));
407
+ }
408
+ return 0.5;
409
+ }
410
+
411
+ double S2Testing::Fractal::max_radius_factor() const {
412
+ // The maximum radius is always attained at either an original triangle
413
+ // vertex or at a middle vertex from the first subdivision step.
414
+ return max(1.0, offset_fraction_ * sqrt(3) + 0.5);
415
+ }
416
+
417
+ void S2Testing::Fractal::GetR2Vertices(vector<R2Point>* vertices) const {
418
+ // The Koch "snowflake" consists of three Koch curves whose initial edges
419
+ // form an equilateral triangle.
420
+ R2Point v0(1.0, 0.0);
421
+ R2Point v1(-0.5, sqrt(3)/2);
422
+ R2Point v2(-0.5, -sqrt(3)/2);
423
+ GetR2VerticesHelper(v0, v1, 0, vertices);
424
+ GetR2VerticesHelper(v1, v2, 0, vertices);
425
+ GetR2VerticesHelper(v2, v0, 0, vertices);
426
+ }
427
+
428
+ // Given the two endpoints (v0,v4) of an edge, recursively subdivide the edge
429
+ // to the desired level, and insert all vertices of the resulting curve up to
430
+ // but not including the endpoint "v4".
431
+ void S2Testing::Fractal::GetR2VerticesHelper(const R2Point& v0,
432
+ const R2Point& v4, int level,
433
+ vector<R2Point>* vertices) const {
434
+ if (level >= min_level_ && S2Testing::rnd.OneIn(max_level_ - level + 1)) {
435
+ // Stop subdivision at this level.
436
+ vertices->push_back(v0);
437
+ return;
438
+ }
439
+ // Otherwise compute the intermediate vertices v1, v2, and v3.
440
+ Vector2_d dir = v4 - v0;
441
+ R2Point v1 = v0 + edge_fraction_ * dir;
442
+ R2Point v2 = 0.5 * (v0 + v4) - offset_fraction_ * dir.Ortho();
443
+ R2Point v3 = v4 - edge_fraction_ * dir;
444
+
445
+ // And recurse on the four sub-edges.
446
+ GetR2VerticesHelper(v0, v1, level+1, vertices);
447
+ GetR2VerticesHelper(v1, v2, level+1, vertices);
448
+ GetR2VerticesHelper(v2, v3, level+1, vertices);
449
+ GetR2VerticesHelper(v3, v4, level+1, vertices);
450
+ }
451
+
452
+ std::unique_ptr<S2Loop> S2Testing::Fractal::MakeLoop(
453
+ const Matrix3x3_d& frame,
454
+ S1Angle nominal_radius) const {
455
+ vector<R2Point> r2vertices;
456
+ GetR2Vertices(&r2vertices);
457
+ vector<S2Point> vertices;
458
+ double r = nominal_radius.radians();
459
+ for (const R2Point& v : r2vertices) {
460
+ S2Point p(v[0] * r, v[1] * r, 1);
461
+ vertices.push_back(S2::FromFrame(frame, p).Normalize());
462
+ }
463
+ return make_unique<S2Loop>(vertices);
464
+ }