@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,645 @@
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/s2polyline.h"
19
+
20
+ #include <algorithm>
21
+ #include <cmath>
22
+ #include <functional>
23
+ #include <set>
24
+ #include <utility>
25
+ #include <vector>
26
+
27
+ #include "s2/base/commandlineflags.h"
28
+ #include "s2/base/logging.h"
29
+ #include "s2/third_party/absl/utility/utility.h"
30
+ #include "s2/util/coding/coder.h"
31
+ #include "s2/s1angle.h"
32
+ #include "s2/s1interval.h"
33
+ #include "s2/s2cap.h"
34
+ #include "s2/s2cell.h"
35
+ #include "s2/s2debug.h"
36
+ #include "s2/s2edge_crosser.h"
37
+ #include "s2/s2edge_distances.h"
38
+ #include "s2/s2error.h"
39
+ #include "s2/s2latlng_rect_bounder.h"
40
+ #include "s2/s2pointutil.h"
41
+ #include "s2/s2polyline_measures.h"
42
+ #include "s2/s2predicates.h"
43
+ #include "s2/util/math/matrix3x3.h"
44
+
45
+ using std::max;
46
+ using std::min;
47
+ using std::set;
48
+ using std::vector;
49
+
50
+ static const unsigned char kCurrentLosslessEncodingVersionNumber = 1;
51
+
52
+ S2Polyline::S2Polyline()
53
+ : s2debug_override_(S2Debug::ALLOW) {}
54
+
55
+ S2Polyline::S2Polyline(S2Polyline&& other)
56
+ : s2debug_override_(other.s2debug_override_),
57
+ num_vertices_(absl::exchange(other.num_vertices_, 0)),
58
+ vertices_(std::move(other.vertices_)) {
59
+ }
60
+
61
+ S2Polyline& S2Polyline::operator=(S2Polyline&& other) {
62
+ s2debug_override_ = other.s2debug_override_;
63
+ num_vertices_ = absl::exchange(other.num_vertices_, 0);
64
+ vertices_ = std::move(other.vertices_);
65
+ return *this;
66
+ }
67
+
68
+ S2Polyline::S2Polyline(const vector<S2Point>& vertices)
69
+ : S2Polyline(vertices, S2Debug::ALLOW) {}
70
+
71
+ S2Polyline::S2Polyline(const vector<S2LatLng>& vertices)
72
+ : S2Polyline(vertices, S2Debug::ALLOW) {}
73
+
74
+ S2Polyline::S2Polyline(const vector<S2Point>& vertices,
75
+ S2Debug override)
76
+ : s2debug_override_(override) {
77
+ Init(vertices);
78
+ }
79
+
80
+ S2Polyline::S2Polyline(const vector<S2LatLng>& vertices,
81
+ S2Debug override)
82
+ : s2debug_override_(override) {
83
+ Init(vertices);
84
+ }
85
+
86
+ S2Polyline::~S2Polyline() {
87
+ }
88
+
89
+ void S2Polyline::set_s2debug_override(S2Debug override) {
90
+ s2debug_override_ = override;
91
+ }
92
+
93
+ S2Debug S2Polyline::s2debug_override() const {
94
+ return s2debug_override_;
95
+ }
96
+
97
+ void S2Polyline::Init(const vector<S2Point>& vertices) {
98
+ num_vertices_ = vertices.size();
99
+ vertices_.reset(new S2Point[num_vertices_]);
100
+ std::copy(vertices.begin(), vertices.end(), &vertices_[0]);
101
+ if (FLAGS_s2debug && s2debug_override_ == S2Debug::ALLOW) {
102
+ S2_CHECK(IsValid());
103
+ }
104
+ }
105
+
106
+ void S2Polyline::Init(const vector<S2LatLng>& vertices) {
107
+ num_vertices_ = vertices.size();
108
+ vertices_.reset(new S2Point[num_vertices_]);
109
+ for (int i = 0; i < num_vertices_; ++i) {
110
+ vertices_[i] = vertices[i].ToPoint();
111
+ }
112
+ if (FLAGS_s2debug && s2debug_override_ == S2Debug::ALLOW) {
113
+ S2_CHECK(IsValid());
114
+ }
115
+ }
116
+
117
+ bool S2Polyline::IsValid() const {
118
+ S2Error error;
119
+ if (FindValidationError(&error)) {
120
+ S2_LOG_IF(ERROR, FLAGS_s2debug) << error;
121
+ return false;
122
+ }
123
+ return true;
124
+ }
125
+
126
+ bool S2Polyline::FindValidationError(S2Error* error) const {
127
+ // All vertices must be unit length.
128
+ for (int i = 0; i < num_vertices(); ++i) {
129
+ if (!S2::IsUnitLength(vertex(i))) {
130
+ error->Init(S2Error::NOT_UNIT_LENGTH, "Vertex %d is not unit length", i);
131
+ return true;
132
+ }
133
+ }
134
+ // Adjacent vertices must not be identical or antipodal.
135
+ for (int i = 1; i < num_vertices(); ++i) {
136
+ if (vertex(i - 1) == vertex(i)) {
137
+ error->Init(S2Error::DUPLICATE_VERTICES,
138
+ "Vertices %d and %d are identical", i - 1, i);
139
+ return true;
140
+ }
141
+ if (vertex(i - 1) == -vertex(i)) {
142
+ error->Init(S2Error::ANTIPODAL_VERTICES,
143
+ "Vertices %d and %d are antipodal", i - 1, i);
144
+ return true;
145
+ }
146
+ }
147
+ return false;
148
+ }
149
+
150
+ S2Polyline::S2Polyline(const S2Polyline& src)
151
+ : num_vertices_(src.num_vertices_),
152
+ vertices_(new S2Point[num_vertices_]) {
153
+ std::copy(&src.vertices_[0], &src.vertices_[num_vertices_], &vertices_[0]);
154
+ }
155
+
156
+ S2Polyline* S2Polyline::Clone() const {
157
+ return new S2Polyline(*this);
158
+ }
159
+
160
+ S1Angle S2Polyline::GetLength() const {
161
+ return S2::GetLength(S2PointSpan(&vertices_[0], num_vertices_));
162
+ }
163
+
164
+ S2Point S2Polyline::GetCentroid() const {
165
+ return S2::GetCentroid(S2PointSpan(&vertices_[0], num_vertices_));
166
+ }
167
+
168
+ S2Point S2Polyline::GetSuffix(double fraction, int* next_vertex) const {
169
+ S2_DCHECK_GT(num_vertices(), 0);
170
+ // We intentionally let the (fraction >= 1) case fall through, since
171
+ // we need to handle it in the loop below in any case because of
172
+ // possible roundoff errors.
173
+ if (fraction <= 0) {
174
+ *next_vertex = 1;
175
+ return vertex(0);
176
+ }
177
+ S1Angle length_sum;
178
+ for (int i = 1; i < num_vertices(); ++i) {
179
+ length_sum += S1Angle(vertex(i-1), vertex(i));
180
+ }
181
+ S1Angle target = fraction * length_sum;
182
+ for (int i = 1; i < num_vertices(); ++i) {
183
+ S1Angle length(vertex(i-1), vertex(i));
184
+ if (target < length) {
185
+ // This interpolates with respect to arc length rather than
186
+ // straight-line distance, and produces a unit-length result.
187
+ S2Point result = S2::InterpolateAtDistance(target, vertex(i-1),
188
+ vertex(i));
189
+ // It is possible that (result == vertex(i)) due to rounding errors.
190
+ *next_vertex = (result == vertex(i)) ? (i + 1) : i;
191
+ return result;
192
+ }
193
+ target -= length;
194
+ }
195
+ *next_vertex = num_vertices();
196
+ return vertex(num_vertices() - 1);
197
+ }
198
+
199
+ S2Point S2Polyline::Interpolate(double fraction) const {
200
+ int next_vertex;
201
+ return GetSuffix(fraction, &next_vertex);
202
+ }
203
+
204
+ double S2Polyline::UnInterpolate(const S2Point& point, int next_vertex) const {
205
+ S2_DCHECK_GT(num_vertices(), 0);
206
+ if (num_vertices() < 2) {
207
+ return 0;
208
+ }
209
+ S1Angle length_sum;
210
+ for (int i = 1; i < next_vertex; ++i) {
211
+ length_sum += S1Angle(vertex(i-1), vertex(i));
212
+ }
213
+ S1Angle length_to_point = length_sum + S1Angle(vertex(next_vertex-1), point);
214
+ for (int i = next_vertex; i < num_vertices(); ++i) {
215
+ length_sum += S1Angle(vertex(i-1), vertex(i));
216
+ }
217
+ // The ratio can be greater than 1.0 due to rounding errors or because the
218
+ // point is not exactly on the polyline.
219
+ return min(1.0, length_to_point / length_sum);
220
+ }
221
+
222
+ S2Point S2Polyline::Project(const S2Point& point, int* next_vertex) const {
223
+ S2_DCHECK_GT(num_vertices(), 0);
224
+
225
+ if (num_vertices() == 1) {
226
+ // If there is only one vertex, it is always closest to any given point.
227
+ *next_vertex = 1;
228
+ return vertex(0);
229
+ }
230
+
231
+ // Initial value larger than any possible distance on the unit sphere.
232
+ S1Angle min_distance = S1Angle::Radians(10);
233
+ int min_index = -1;
234
+
235
+ // Find the line segment in the polyline that is closest to the point given.
236
+ for (int i = 1; i < num_vertices(); ++i) {
237
+ S1Angle distance_to_segment = S2::GetDistance(point, vertex(i-1),
238
+ vertex(i));
239
+ if (distance_to_segment < min_distance) {
240
+ min_distance = distance_to_segment;
241
+ min_index = i;
242
+ }
243
+ }
244
+ S2_DCHECK_NE(min_index, -1);
245
+
246
+ // Compute the point on the segment found that is closest to the point given.
247
+ S2Point closest_point =
248
+ S2::Project(point, vertex(min_index - 1), vertex(min_index));
249
+
250
+ *next_vertex = min_index + (closest_point == vertex(min_index) ? 1 : 0);
251
+ return closest_point;
252
+ }
253
+
254
+ bool S2Polyline::IsOnRight(const S2Point& point) const {
255
+ S2_DCHECK_GE(num_vertices(), 2);
256
+
257
+ int next_vertex;
258
+ S2Point closest_point = Project(point, &next_vertex);
259
+
260
+ S2_DCHECK_GE(next_vertex, 1);
261
+ S2_DCHECK_LE(next_vertex, num_vertices());
262
+
263
+ // If the closest point C is an interior vertex of the polyline, let B and D
264
+ // be the previous and next vertices. The given point P is on the right of
265
+ // the polyline (locally) if B, P, D are ordered CCW around vertex C.
266
+ if (closest_point == vertex(next_vertex-1) && next_vertex > 1 &&
267
+ next_vertex < num_vertices()) {
268
+ if (point == vertex(next_vertex-1))
269
+ return false; // Polyline vertices are not on the RHS.
270
+ return s2pred::OrderedCCW(vertex(next_vertex-2), point, vertex(next_vertex),
271
+ vertex(next_vertex-1));
272
+ }
273
+
274
+ // Otherwise, the closest point C is incident to exactly one polyline edge.
275
+ // We test the point P against that edge.
276
+ if (next_vertex == num_vertices())
277
+ --next_vertex;
278
+
279
+ return s2pred::Sign(point, vertex(next_vertex), vertex(next_vertex - 1)) > 0;
280
+ }
281
+
282
+ bool S2Polyline::Intersects(const S2Polyline* line) const {
283
+ if (num_vertices() <= 0 || line->num_vertices() <= 0) {
284
+ return false;
285
+ }
286
+
287
+ if (!GetRectBound().Intersects(line->GetRectBound())) {
288
+ return false;
289
+ }
290
+
291
+ // TODO(ericv): Use S2ShapeIndex here.
292
+ for (int i = 1; i < num_vertices(); ++i) {
293
+ S2EdgeCrosser crosser(
294
+ &vertex(i - 1), &vertex(i), &line->vertex(0));
295
+ for (int j = 1; j < line->num_vertices(); ++j) {
296
+ if (crosser.CrossingSign(&line->vertex(j)) >= 0) {
297
+ return true;
298
+ }
299
+ }
300
+ }
301
+ return false;
302
+ }
303
+
304
+ void S2Polyline::Reverse() {
305
+ std::reverse(&vertices_[0], &vertices_[num_vertices_]);
306
+ }
307
+
308
+ S2LatLngRect S2Polyline::GetRectBound() const {
309
+ S2LatLngRectBounder bounder;
310
+ for (int i = 0; i < num_vertices(); ++i) {
311
+ bounder.AddPoint(vertex(i));
312
+ }
313
+ return bounder.GetBound();
314
+ }
315
+
316
+ S2Cap S2Polyline::GetCapBound() const {
317
+ return GetRectBound().GetCapBound();
318
+ }
319
+
320
+ bool S2Polyline::MayIntersect(const S2Cell& cell) const {
321
+ if (num_vertices() == 0) return false;
322
+
323
+ // We only need to check whether the cell contains vertex 0 for correctness,
324
+ // but these tests are cheap compared to edge crossings so we might as well
325
+ // check all the vertices.
326
+ for (int i = 0; i < num_vertices(); ++i) {
327
+ if (cell.Contains(vertex(i))) return true;
328
+ }
329
+ S2Point cell_vertices[4];
330
+ for (int i = 0; i < 4; ++i) {
331
+ cell_vertices[i] = cell.GetVertex(i);
332
+ }
333
+ for (int j = 0; j < 4; ++j) {
334
+ S2EdgeCrosser crosser(&cell_vertices[j], &cell_vertices[(j+1)&3],
335
+ &vertex(0));
336
+ for (int i = 1; i < num_vertices(); ++i) {
337
+ if (crosser.CrossingSign(&vertex(i)) >= 0) {
338
+ // There is a proper crossing, or two vertices were the same.
339
+ return true;
340
+ }
341
+ }
342
+ }
343
+ return false;
344
+ }
345
+
346
+ void S2Polyline::Encode(Encoder* const encoder) const {
347
+ encoder->Ensure(num_vertices_ * sizeof(vertices_[0]) + 10); // sufficient
348
+
349
+ encoder->put8(kCurrentLosslessEncodingVersionNumber);
350
+ encoder->put32(num_vertices_);
351
+ encoder->putn(&vertices_[0], sizeof(vertices_[0]) * num_vertices_);
352
+
353
+ S2_DCHECK_GE(encoder->avail(), 0);
354
+ }
355
+
356
+ bool S2Polyline::Decode(Decoder* const decoder) {
357
+ if (decoder->avail() < sizeof(unsigned char) + sizeof(uint32)) return false;
358
+ unsigned char version = decoder->get8();
359
+ if (version > kCurrentLosslessEncodingVersionNumber) return false;
360
+
361
+ num_vertices_ = decoder->get32();
362
+ vertices_.reset(new S2Point[num_vertices_]);
363
+ if (decoder->avail() < num_vertices_ * sizeof(vertices_[0])) return false;
364
+ decoder->getn(&vertices_[0], num_vertices_ * sizeof(vertices_[0]));
365
+
366
+ if (FLAGS_s2debug && s2debug_override_ == S2Debug::ALLOW) {
367
+ S2_CHECK(IsValid());
368
+ }
369
+ return true;
370
+ }
371
+
372
+ namespace {
373
+
374
+ // Given a polyline, a tolerance distance, and a start index, this function
375
+ // returns the maximal end index such that the line segment between these two
376
+ // vertices passes within "tolerance" of all interior vertices, in order.
377
+ int FindEndVertex(const S2Polyline& polyline,
378
+ S1Angle tolerance, int index) {
379
+ S2_DCHECK_GE(tolerance.radians(), 0);
380
+ S2_DCHECK_LT((index + 1), polyline.num_vertices());
381
+
382
+ // The basic idea is to keep track of the "pie wedge" of angles from the
383
+ // starting vertex such that a ray from the starting vertex at that angle
384
+ // will pass through the discs of radius "tolerance" centered around all
385
+ // vertices processed so far.
386
+
387
+ // First we define a "coordinate frame" for the tangent and normal spaces
388
+ // at the starting vertex. Essentially this means picking three
389
+ // orthonormal vectors X,Y,Z such that X and Y span the tangent plane at
390
+ // the starting vertex, and Z is "up". We use the coordinate frame to
391
+ // define a mapping from 3D direction vectors to a one-dimensional "ray
392
+ // angle" in the range (-Pi, Pi]. The angle of a direction vector is
393
+ // computed by transforming it into the X,Y,Z basis, and then calculating
394
+ // atan2(y,x). This mapping allows us to represent a wedge of angles as a
395
+ // 1D interval. Since the interval wraps around, we represent it as an
396
+ // S1Interval, i.e. an interval on the unit circle.
397
+ Matrix3x3_d frame;
398
+ const S2Point& origin = polyline.vertex(index);
399
+ S2::GetFrame(origin, &frame);
400
+
401
+ // As we go along, we keep track of the current wedge of angles and the
402
+ // distance to the last vertex (which must be non-decreasing).
403
+ S1Interval current_wedge = S1Interval::Full();
404
+ double last_distance = 0;
405
+
406
+ for (++index; index < polyline.num_vertices(); ++index) {
407
+ const S2Point& candidate = polyline.vertex(index);
408
+ double distance = origin.Angle(candidate);
409
+
410
+ // We don't allow simplification to create edges longer than 90 degrees,
411
+ // to avoid numeric instability as lengths approach 180 degrees. (We do
412
+ // need to allow for original edges longer than 90 degrees, though.)
413
+ if (distance > M_PI/2 && last_distance > 0) break;
414
+
415
+ // Vertices must be in increasing order along the ray, except for the
416
+ // initial disc around the origin.
417
+ if (distance < last_distance && last_distance > tolerance.radians()) break;
418
+ last_distance = distance;
419
+
420
+ // Points that are within the tolerance distance of the origin do not
421
+ // constrain the ray direction, so we can ignore them.
422
+ if (distance <= tolerance.radians()) continue;
423
+
424
+ // If the current wedge of angles does not contain the angle to this
425
+ // vertex, then stop right now. Note that the wedge of possible ray
426
+ // angles is not necessarily empty yet, but we can't continue unless we
427
+ // are willing to backtrack to the last vertex that was contained within
428
+ // the wedge (since we don't create new vertices). This would be more
429
+ // complicated and also make the worst-case running time more than linear.
430
+ S2Point direction = S2::ToFrame(frame, candidate);
431
+ double center = atan2(direction.y(), direction.x());
432
+ if (!current_wedge.Contains(center)) break;
433
+
434
+ // To determine how this vertex constrains the possible ray angles,
435
+ // consider the triangle ABC where A is the origin, B is the candidate
436
+ // vertex, and C is one of the two tangent points between A and the
437
+ // spherical cap of radius "tolerance" centered at B. Then from the
438
+ // spherical law of sines, sin(a)/sin(A) = sin(c)/sin(C), where "a" and
439
+ // "c" are the lengths of the edges opposite A and C. In our case C is a
440
+ // 90 degree angle, therefore A = asin(sin(a) / sin(c)). Angle A is the
441
+ // half-angle of the allowable wedge.
442
+
443
+ double half_angle = asin(sin(tolerance.radians()) / sin(distance));
444
+ S1Interval target = S1Interval::FromPoint(center).Expanded(half_angle);
445
+ current_wedge = current_wedge.Intersection(target);
446
+ S2_DCHECK(!current_wedge.is_empty());
447
+ }
448
+ // We break out of the loop when we reach a vertex index that can't be
449
+ // included in the line segment, so back up by one vertex.
450
+ return index - 1;
451
+ }
452
+ } // namespace
453
+
454
+ void S2Polyline::SubsampleVertices(S1Angle tolerance,
455
+ vector<int>* indices) const {
456
+ indices->clear();
457
+ if (num_vertices() == 0) return;
458
+
459
+ indices->push_back(0);
460
+ S1Angle clamped_tolerance = max(tolerance, S1Angle::Radians(0));
461
+ for (int index = 0; index + 1 < num_vertices(); ) {
462
+ int next_index = FindEndVertex(*this, clamped_tolerance, index);
463
+ // Don't create duplicate adjacent vertices.
464
+ if (vertex(next_index) != vertex(index)) {
465
+ indices->push_back(next_index);
466
+ }
467
+ index = next_index;
468
+ }
469
+ }
470
+
471
+ bool S2Polyline::Equals(const S2Polyline* b) const {
472
+ if (num_vertices() != b->num_vertices()) return false;
473
+ for (int offset = 0; offset < num_vertices(); ++offset) {
474
+ if (vertex(offset) != b->vertex(offset)) return false;
475
+ }
476
+ return true;
477
+ }
478
+
479
+ bool S2Polyline::ApproxEquals(const S2Polyline& b, S1Angle max_error) const {
480
+ if (num_vertices() != b.num_vertices()) return false;
481
+ for (int offset = 0; offset < num_vertices(); ++offset) {
482
+ if (!S2::ApproxEquals(vertex(offset), b.vertex(offset), max_error)) {
483
+ return false;
484
+ }
485
+ }
486
+ return true;
487
+ }
488
+
489
+ size_t S2Polyline::SpaceUsed() const {
490
+ return sizeof(*this) + num_vertices() * sizeof(S2Point);
491
+ }
492
+
493
+ namespace {
494
+ // Return the first i > "index" such that the ith vertex of "pline" is not at
495
+ // the same point as the "index"th vertex. Returns pline.num_vertices() if
496
+ // there is no such value of i.
497
+ inline int NextDistinctVertex(const S2Polyline& pline, int index) {
498
+ const S2Point& initial = pline.vertex(index);
499
+ do {
500
+ ++index;
501
+ } while (index < pline.num_vertices() && pline.vertex(index) == initial);
502
+ return index;
503
+ }
504
+
505
+ // This struct represents a search state in the NearlyCovers algorithm
506
+ // below. See the description of the algorithm for details.
507
+ struct SearchState {
508
+ inline SearchState(int i_val, int j_val, bool i_in_progress_val)
509
+ : i(i_val), j(j_val), i_in_progress(i_in_progress_val) {}
510
+
511
+ int i;
512
+ int j;
513
+ bool i_in_progress;
514
+ };
515
+
516
+ // This operator is needed for storing SearchStates in a set. The ordering
517
+ // chosen has no special meaning.
518
+ struct SearchStateKeyCompare {
519
+ bool operator() (const SearchState& a, const SearchState& b) const {
520
+ if (a.i != b.i) return a.i < b.i;
521
+ if (a.j != b.j) return a.j < b.j;
522
+ return a.i_in_progress < b.i_in_progress;
523
+ }
524
+ };
525
+
526
+ } // namespace
527
+
528
+ bool S2Polyline::NearlyCovers(const S2Polyline& covered,
529
+ S1Angle max_error) const {
530
+ // NOTE: This algorithm is described assuming that adjacent vertices in a
531
+ // polyline are never at the same point. That is, the ith and i+1th vertices
532
+ // of a polyline are never at the same point in space. The implementation
533
+ // does not make this assumption.
534
+
535
+ // DEFINITIONS:
536
+ // - edge "i" of a polyline is the edge from the ith to i+1th vertex.
537
+ // - covered_j is a polyline consisting of edges 0 through j of "covered."
538
+ // - this_i is a polyline consisting of edges 0 through i of this polyline.
539
+ //
540
+ // A search state is represented as an (int, int, bool) tuple, (i, j,
541
+ // i_in_progress). Using the "drive a car" analogy from the header comment, a
542
+ // search state signifies that you can drive one car along "covered" from its
543
+ // first vertex through a point on its jth edge, and another car along this
544
+ // polyline from some point on or before its ith edge to a to a point on its
545
+ // ith edge, such that no car ever goes backward, and the cars are always
546
+ // within "max_error" of each other. If i_in_progress is true, it means that
547
+ // you can definitely drive along "covered" through the jth vertex (beginning
548
+ // of the jth edge). Otherwise, you can definitely drive along "covered"
549
+ // through the point on the jth edge of "covered" closest to the ith vertex of
550
+ // this polyline.
551
+ //
552
+ // The algorithm begins by finding all edges of this polyline that are within
553
+ // "max_error" of the first vertex of "covered," and adding search states
554
+ // representing all of these possible starting states to the stack of
555
+ // "pending" states.
556
+ //
557
+ // The algorithm proceeds by popping the next pending state,
558
+ // (i,j,i_in_progress), off of the stack. First it checks to see if that
559
+ // state represents finding a valid covering of "covered" and returns true if
560
+ // so. Next, if the state represents reaching the end of this polyline
561
+ // without finding a successful covering, the algorithm moves on to the next
562
+ // state in the stack. Otherwise, if state (i+1,j,false) is valid, it is
563
+ // added to the stack of pending states. Same for state (i,j+1,true).
564
+ //
565
+ // We need the stack because when "i" and "j" can both be incremented,
566
+ // sometimes only one choice leads to a solution. We use a set to keep track
567
+ // of visited states to avoid duplicating work. With the set, the worst-case
568
+ // number of states examined is O(n+m) where n = this->num_vertices() and m =
569
+ // covered.num_vertices(). Without it, the amount of work could be as high as
570
+ // O((n*m)^2). Using set, the running time is O((n*m) log (n*m)).
571
+ //
572
+ // TODO(user): Benchmark this, and see if the set is worth it.
573
+
574
+ if (covered.num_vertices() == 0) return true;
575
+ if (this->num_vertices() == 0) return false;
576
+
577
+ vector<SearchState> pending;
578
+ set<SearchState, SearchStateKeyCompare> done;
579
+
580
+ // Find all possible starting states.
581
+ for (int i = 0, next_i = NextDistinctVertex(*this, 0), next_next_i;
582
+ next_i < this->num_vertices(); i = next_i, next_i = next_next_i) {
583
+ next_next_i = NextDistinctVertex(*this, next_i);
584
+ S2Point closest_point = S2::Project(
585
+ covered.vertex(0), this->vertex(i), this->vertex(next_i));
586
+
587
+ // In order to avoid duplicate starting states, we exclude the end vertex
588
+ // of each edge *except* for the last non-degenerate edge.
589
+ if ((next_next_i == this->num_vertices() ||
590
+ closest_point != this->vertex(next_i)) &&
591
+ S1Angle(closest_point, covered.vertex(0)) <= max_error) {
592
+ pending.push_back(SearchState(i, 0, true));
593
+ }
594
+ }
595
+
596
+ while (!pending.empty()) {
597
+ const SearchState state = pending.back();
598
+ pending.pop_back();
599
+ if (!done.insert(state).second) continue;
600
+
601
+ const int next_i = NextDistinctVertex(*this, state.i);
602
+ const int next_j = NextDistinctVertex(covered, state.j);
603
+ if (next_j == covered.num_vertices()) {
604
+ return true;
605
+ } else if (next_i == this->num_vertices()) {
606
+ continue;
607
+ }
608
+
609
+ S2Point i_begin, j_begin;
610
+ if (state.i_in_progress) {
611
+ j_begin = covered.vertex(state.j);
612
+ i_begin = S2::Project(
613
+ j_begin, this->vertex(state.i), this->vertex(next_i));
614
+ } else {
615
+ i_begin = this->vertex(state.i);
616
+ j_begin = S2::Project(
617
+ i_begin, covered.vertex(state.j), covered.vertex(next_j));
618
+ }
619
+
620
+ if (S2::IsEdgeBNearEdgeA(j_begin, covered.vertex(next_j),
621
+ i_begin, this->vertex(next_i), max_error)) {
622
+ pending.push_back(SearchState(next_i, state.j, false));
623
+ }
624
+ if (S2::IsEdgeBNearEdgeA(i_begin, this->vertex(next_i),
625
+ j_begin, covered.vertex(next_j), max_error)) {
626
+ pending.push_back(SearchState(state.i, next_j, true));
627
+ }
628
+ }
629
+ return false;
630
+ }
631
+
632
+ void S2Polyline::Shape::Init(const S2Polyline* polyline) {
633
+ S2_LOG_IF(WARNING, polyline->num_vertices() == 1)
634
+ << "S2Polyline::Shape with one vertex has no edges";
635
+ polyline_ = polyline;
636
+ }
637
+
638
+ int S2Polyline::Shape::num_chains() const {
639
+ return min(1, Shape::num_edges()); // Avoid virtual call.
640
+ }
641
+
642
+ S2Shape::Chain S2Polyline::Shape::chain(int i) const {
643
+ S2_DCHECK_EQ(i, 0);
644
+ return Chain(0, Shape::num_edges()); // Avoid virtual call.
645
+ }