@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,57 @@
1
+ // Copyright 2018 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_measures.h"
19
+
20
+ #include <cmath>
21
+ #include <vector>
22
+
23
+ #include <gtest/gtest.h>
24
+ #include "s2/s1angle.h"
25
+ #include "s2/s2testing.h"
26
+
27
+ using std::fabs;
28
+ using std::vector;
29
+
30
+ namespace {
31
+
32
+ TEST(GetLengthAndCentroid, GreatCircles) {
33
+ // Construct random great circles and divide them randomly into segments.
34
+ // Then make sure that the length and centroid are correct. Note that
35
+ // because of the way the centroid is computed, it does not matter how
36
+ // we split the great circle into segments.
37
+
38
+ for (int iter = 0; iter < 100; ++iter) {
39
+ // Choose a coordinate frame for the great circle.
40
+ S2Point x, y, z;
41
+ S2Testing::GetRandomFrame(&x, &y, &z);
42
+
43
+ vector<S2Point> line;
44
+ for (double theta = 0; theta < 2 * M_PI;
45
+ theta += pow(S2Testing::rnd.RandDouble(), 10)) {
46
+ line.push_back(cos(theta) * x + sin(theta) * y);
47
+ }
48
+ // Close the circle.
49
+ line.push_back(line[0]);
50
+ S1Angle length = S2::GetLength(line);
51
+ EXPECT_LE(fabs(length.radians() - 2 * M_PI), 2e-14);
52
+ S2Point centroid = S2::GetCentroid(line);
53
+ EXPECT_LE(centroid.Norm(), 2e-14);
54
+ }
55
+ }
56
+
57
+ } // namespace
@@ -0,0 +1,187 @@
1
+ // Copyright 2016 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_simplifier.h"
19
+
20
+ #include <cfloat>
21
+
22
+ #include "s2/s1chord_angle.h"
23
+ #include "s2/s1interval.h"
24
+
25
+ void S2PolylineSimplifier::Init(const S2Point& src) {
26
+ src_ = src;
27
+ window_ = S1Interval::Full();
28
+
29
+ // Precompute basis vectors for the tangent space at "src". This is similar
30
+ // to GetFrame() except that we don't normalize the vectors. As it turns
31
+ // out, the two basis vectors below have the same magnitude (up to the
32
+ // length error in S2Point::Normalize).
33
+
34
+ // Find the index of the component whose magnitude is smallest.
35
+ S2Point tmp = src.Abs();
36
+ int i = (tmp[0] < tmp[1] ?
37
+ (tmp[0] < tmp[2] ? 0 : 2) : (tmp[1] < tmp[2] ? 1 : 2));
38
+
39
+ // We define the "y" basis vector as the cross product of "src" and the
40
+ // basis vector for axis "i". Let "j" and "k" be the indices of the other
41
+ // two components in cyclic order.
42
+ int j = (i == 2 ? 0 : i + 1), k = (i == 0 ? 2 : i - 1);
43
+ y_dir_[i] = 0;
44
+ y_dir_[j] = src[k];
45
+ y_dir_[k] = -src[j];
46
+
47
+ // Compute the cross product of "y_dir" and "src". We write out the cross
48
+ // product here mainly for documentation purposes; it also happens to save a
49
+ // few multiplies because unfortunately the optimizer does *not* get rid of
50
+ // multiplies by zero (since these multiplies propagate NaN, for example).
51
+ x_dir_[i] = src[j] * src[j] + src[k] * src[k];
52
+ x_dir_[j] = -src[j] * src[i];
53
+ x_dir_[k] = -src[k] * src[i];
54
+ }
55
+
56
+ bool S2PolylineSimplifier::Extend(const S2Point& dst) const {
57
+ // We limit the maximum edge length to 90 degrees in order to simplify the
58
+ // error bounds. (The error gets arbitrarily large as the edge length
59
+ // approaches 180 degrees.)
60
+ if (S1ChordAngle(src_, dst) > S1ChordAngle::Right()) return false;
61
+
62
+ // Otherwise check whether this vertex is in the acceptable angle range.
63
+ return window_.Contains(GetAngle(dst));
64
+ }
65
+
66
+ bool S2PolylineSimplifier::TargetDisc(const S2Point& p, S1ChordAngle r) {
67
+ // Shrink the target interval by the maximum error from all sources. This
68
+ // guarantees that the output edge will intersect the given disc.
69
+ double semiwidth = GetSemiwidth(p, r, -1 /*round down*/);
70
+ if (semiwidth >= M_PI) {
71
+ // The target disc contains "src", so there is nothing to do.
72
+ return true;
73
+ }
74
+ if (semiwidth < 0) {
75
+ window_ = S1Interval::Empty();
76
+ return false;
77
+ }
78
+ // Otherwise compute the angle interval corresponding to the target disc and
79
+ // intersect it with the current window.
80
+ double center = GetAngle(p);
81
+ S1Interval target = S1Interval::FromPoint(center).Expanded(semiwidth);
82
+ window_ = window_.Intersection(target);
83
+ return !window_.is_empty();
84
+ }
85
+
86
+ bool S2PolylineSimplifier::AvoidDisc(const S2Point& p, S1ChordAngle r,
87
+ bool disc_on_left) {
88
+ // Expand the interval by the maximum error from all sources. This
89
+ // guarantees that the final output edge will avoid the given disc.
90
+ double semiwidth = GetSemiwidth(p, r, 1 /*round up*/);
91
+ if (semiwidth >= M_PI) {
92
+ // The avoidance disc contains "src", so it is impossible to avoid.
93
+ window_ = S1Interval::Empty();
94
+ return false;
95
+ }
96
+ double center = GetAngle(p);
97
+ double opposite = (center > 0) ? center - M_PI : center + M_PI;
98
+ S1Interval target = (disc_on_left ? S1Interval(opposite, center) :
99
+ S1Interval(center, opposite));
100
+ window_ = window_.Intersection(target.Expanded(-semiwidth));
101
+ return !window_.is_empty();
102
+ }
103
+
104
+ double S2PolylineSimplifier::GetAngle(const S2Point& p) const {
105
+ return atan2(p.DotProd(y_dir_), p.DotProd(x_dir_));
106
+ }
107
+
108
+ double S2PolylineSimplifier::GetSemiwidth(const S2Point& p, S1ChordAngle r,
109
+ int round_direction) const {
110
+ double constexpr DBL_ERR = 0.5 * DBL_EPSILON;
111
+
112
+ // Using spherical trigonometry,
113
+ //
114
+ // sin(semiwidth) = sin(r) / sin(a)
115
+ //
116
+ // where "a" is the angle between "src" and "p". Rather than measuring
117
+ // these angles, instead we measure the squared chord lengths through the
118
+ // interior of the sphere (i.e., Cartersian distance). Letting "r2" be the
119
+ // squared chord distance corresponding to "r", and "a2" be the squared
120
+ // chord distance corresponding to "a", we use the relationships
121
+ //
122
+ // sin^2(r) = r2 (1 - r2 / 4)
123
+ // sin^2(a) = d2 (1 - d2 / 4)
124
+ //
125
+ // which follow from the fact that r2 = (2 * sin(r / 2)) ^ 2, etc.
126
+
127
+ // "a2" has a relative error up to 5 * DBL_ERR, plus an absolute error of up
128
+ // to 64 * DBL_ERR^2 (because "src" and "p" may differ from unit length by
129
+ // up to 4 * DBL_ERR). We can correct for the relative error later, but for
130
+ // the absolute error we use "round_direction" to account for it now.
131
+ double r2 = r.length2();
132
+ double a2 = S1ChordAngle(src_, p).length2();
133
+ a2 -= 64 * DBL_ERR * DBL_ERR * round_direction;
134
+ if (a2 <= r2) return M_PI; // The given disc contains "src".
135
+
136
+ double sin2_r = r2 * (1 - 0.25 * r2);
137
+ double sin2_a = a2 * (1 - 0.25 * a2);
138
+ double semiwidth = asin(sqrt(sin2_r / sin2_a));
139
+
140
+ // We compute bounds on the errors from all sources:
141
+ //
142
+ // - The call to GetSemiwidth (this call).
143
+ // - The call to GetAngle that computes the center of the interval.
144
+ // - The call to GetAngle in Extend that tests whether a given point
145
+ // is an acceptable destination vertex.
146
+ //
147
+ // Summary of the errors in GetAngle:
148
+ //
149
+ // y_dir_ has no error.
150
+ //
151
+ // x_dir_ has a relative error of DBL_ERR in two components, a relative
152
+ // error of 2 * DBL_ERR in the other component, plus an overall relative
153
+ // length error of 4 * DBL_ERR (compared to y_dir_) because "src" is assumed
154
+ // to be normalized only to within the tolerances of S2Point::Normalize().
155
+ //
156
+ // p.DotProd(y_dir_) has a relative error of 1.5 * DBL_ERR and an
157
+ // absolute error of 1.5 * DBL_ERR * y_dir_.Norm().
158
+ //
159
+ // p.DotProd(x_dir_) has a relative error of 5.5 * DBL_ERR and an absolute
160
+ // error of 3.5 * DBL_ERR * y_dir_.Norm() (noting that x_dir_ and y_dir_
161
+ // have the same length to within a relative error of 4 * DBL_ERR).
162
+ //
163
+ // It's possible to show by taking derivatives that these errors can affect
164
+ // the angle atan2(y, x) by up 7.093 * DBL_ERR radians. Rounding up and
165
+ // including the call to atan2 gives a final error bound of 10 * DBL_ERR.
166
+ //
167
+ // Summary of the errors in GetSemiwidth:
168
+ //
169
+ // The distance a2 has a relative error of 5 * DBL_ERR plus an absolute
170
+ // error of 64 * DBL_ERR^2 because the points "src" and "p" may differ from
171
+ // unit length (by up to 4 * DBL_ERR). We have already accounted for the
172
+ // absolute error above, leaving only the relative error.
173
+ //
174
+ // sin2_r has a relative error of 2 * DBL_ERR.
175
+ //
176
+ // sin2_a has a relative error of 12 * DBL_ERR assuming that a2 <= 2,
177
+ // i.e. distance(src, p) <= 90 degrees. (The relative error gets
178
+ // arbitrarily larger as this distance approaches 180 degrees.)
179
+ //
180
+ // semiwidth has a relative error of 17 * DBL_ERR.
181
+ //
182
+ // Finally, (center +/- semiwidth) has a rounding error of up to 4 * DBL_ERR
183
+ // because in theory, the result magnitude may be as large as 1.5 * M_PI
184
+ // which is larger than 4.0. This gives a total error of:
185
+ double error = (2 * 10 + 4) * DBL_ERR + 17 * DBL_ERR * semiwidth;
186
+ return semiwidth + round_direction * error;
187
+ }
@@ -0,0 +1,109 @@
1
+ // Copyright 2016 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+ //
18
+ // This is a helper class for simplifying polylines. It allows you to compute
19
+ // a maximal edge that intersects a sequence of discs, and that optionally
20
+ // avoids a different sequence of discs. The results are conservative in that
21
+ // the edge is guaranteed to intersect or avoid the specified discs using
22
+ // exact arithmetic (see s2predicates.h).
23
+ //
24
+ // Note that S2Builder can also simplify polylines and supports more features
25
+ // (e.g., snapping to S2CellId centers), so it is only recommended to use this
26
+ // class if S2Builder does not meet your needs.
27
+ //
28
+ // Here is a simple example showing how to simplify a polyline into a sequence
29
+ // of edges that stay within "max_error" of the original edges:
30
+ //
31
+ // vector<S2Point> v = { ... };
32
+ // S2PolylineSimplifier simplifier;
33
+ // simplifier.Init(v[0]);
34
+ // for (int i = 1; i < v.size(); ++i) {
35
+ // if (!simplifier.Extend(v[i])) {
36
+ // OutputEdge(simplifier.src(), v[i-1]);
37
+ // simplifier.Init(v[i-1]);
38
+ // }
39
+ // simplifier.TargetDisc(v[i], max_error);
40
+ // }
41
+ // OutputEdge(simplifer.src(), v.back());
42
+ //
43
+ // Note that the points targeted by TargetDisc do not need to be the same as
44
+ // the candidate endpoints passed to Extend. So for example, you could target
45
+ // the original vertices of a polyline, but only consider endpoints that are
46
+ // snapped to E7 coordinates or S2CellId centers.
47
+ //
48
+ // Please be aware that this class works by maintaining a range of acceptable
49
+ // angles (bearings) from the start vertex to the hypothetical destination
50
+ // vertex. It does not keep track of distances to any of the discs to be
51
+ // targeted or avoided. Therefore to use this class correctly, constraints
52
+ // should be added in increasing order of distance. (The actual requirement
53
+ // is slightly weaker than this, which is why it is not enforced, but
54
+ // basically you should only call TargetDisc() and AvoidDisc() with arguments
55
+ // that you want to constrain the immediately following call to Extend().)
56
+
57
+ #ifndef S2_S2POLYLINE_SIMPLIFIER_H_
58
+ #define S2_S2POLYLINE_SIMPLIFIER_H_
59
+
60
+ #include "s2/_fp_contract_off.h"
61
+ #include "s2/s1chord_angle.h"
62
+ #include "s2/s1interval.h"
63
+
64
+ class S2PolylineSimplifier {
65
+ public:
66
+ S2PolylineSimplifier() {}
67
+
68
+ // Starts a new simplified edge at "src".
69
+ void Init(const S2Point& src);
70
+
71
+ // Returns the source vertex of the output edge.
72
+ S2Point src() const;
73
+
74
+ // Returns true if the edge (src, dst) satisfies all of the targeting
75
+ // requirements so far. Returns false if the edge would be longer than
76
+ // 90 degrees (such edges are not supported).
77
+ bool Extend(const S2Point& dst) const;
78
+
79
+ // Requires that the output edge must pass through the given disc.
80
+ bool TargetDisc(const S2Point& point, S1ChordAngle radius);
81
+
82
+ // Requires that the output edge must avoid the given disc. "disc_on_left"
83
+ // specifies whether the disc must be to the left or right of the edge.
84
+ // (This feature allows the simplified edge to preserve the topology of the
85
+ // original polyline with respect to other nearby points.)
86
+ //
87
+ // If your input is a polyline, you can compute "disc_on_left" as follows.
88
+ // Let the polyline be ABCDE and assume that it already avoids a set of
89
+ // points X_i. Suppose that you have aleady added ABC to the simplifer, and
90
+ // now want to extend the edge chain to D. First find the X_i that are near
91
+ // the edge CD, then discard the ones such that AX_i <= AC or AX_i >= AD
92
+ // (since these points have either already been considered or aren't
93
+ // relevant yet). Now X_i is to the left of the polyline if and only if
94
+ // s2pred::OrderedCCW(A, D, X, C) (in other words, if X_i is to the left of
95
+ // the angle wedge ACD).
96
+ bool AvoidDisc(const S2Point& point, S1ChordAngle radius,
97
+ bool disc_on_left);
98
+
99
+ private:
100
+ double GetAngle(const S2Point& p) const;
101
+ double GetSemiwidth(const S2Point& p, S1ChordAngle r,
102
+ int round_direction) const;
103
+
104
+ S2Point src_;
105
+ S2Point x_dir_, y_dir_;
106
+ S1Interval window_;
107
+ };
108
+
109
+ #endif // S2_S2POLYLINE_SIMPLIFIER_H_
@@ -0,0 +1,165 @@
1
+ // Copyright 2016 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_simplifier.h"
19
+
20
+ #include <cfloat>
21
+ #include <vector>
22
+
23
+ #include <gtest/gtest.h>
24
+ #include "s2/s1angle.h"
25
+ #include "s2/s1chord_angle.h"
26
+ #include "s2/s2edge_distances.h"
27
+ #include "s2/s2pointutil.h"
28
+ #include "s2/s2testing.h"
29
+ #include "s2/s2text_format.h"
30
+
31
+ void CheckSimplify(const char* src, const char* dst,
32
+ const char* target, const char* avoid,
33
+ const std::vector<bool>& disc_on_left,
34
+ double radius_degrees, bool expected_result) {
35
+ S1ChordAngle radius(S1Angle::Degrees(radius_degrees));
36
+ S2PolylineSimplifier s;
37
+ s.Init(s2textformat::MakePoint(src));
38
+ for (const S2Point& p : s2textformat::ParsePoints(target)) {
39
+ s.TargetDisc(p, radius);
40
+ }
41
+ int i = 0;
42
+ for (const S2Point& p : s2textformat::ParsePoints(avoid)) {
43
+ s.AvoidDisc(p, radius, disc_on_left[i++]);
44
+ }
45
+ EXPECT_EQ(expected_result, s.Extend(s2textformat::MakePoint(dst)))
46
+ << "\nsrc = " << src << "\ndst = " << dst
47
+ << "\ntarget = " << target << "\navoid = " << avoid;
48
+ }
49
+
50
+ TEST(S2PolylineSimplifier, Reuse) {
51
+ // Check that Init() can be called more than once.
52
+ S2PolylineSimplifier s;
53
+ S1ChordAngle radius(S1Angle::Degrees(10));
54
+ s.Init(S2Point(1, 0, 0));
55
+ EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0).Normalize(), radius));
56
+ EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.1).Normalize(), radius));
57
+ EXPECT_FALSE(s.Extend(S2Point(1, 1, 0.4).Normalize()));
58
+
59
+ // s.Init(S2Point(0, 1, 0));
60
+ EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.3).Normalize(), radius));
61
+ EXPECT_TRUE(s.TargetDisc(S2Point(1, 1, 0.2).Normalize(), radius));
62
+ EXPECT_FALSE(s.Extend(S2Point(1, 1, 0).Normalize()));
63
+ }
64
+
65
+ TEST(S2PolylineSimplifier, NoConstraints) {
66
+ // No constraints, dst == src.
67
+ CheckSimplify("0:1", "0:1", "", "", {}, 0, true);
68
+
69
+ // No constraints, dst != src.
70
+ CheckSimplify("0:1", "1:0", "", "", {}, 0, true);
71
+
72
+ // No constraints, (src, dst) longer than 90 degrees (not supported).
73
+ CheckSimplify("0:0", "0:91", "", "", {}, 0, false);
74
+ }
75
+
76
+ TEST(S2PolylineSimplifier, TargetOnePoint) {
77
+ // Three points on a straight line. In theory zero tolerance should work,
78
+ // but in practice there are floating point errors.
79
+ CheckSimplify("0:0", "0:2", "0:1", "", {}, 1e-10, true);
80
+
81
+ // Three points where the middle point is too far away.
82
+ CheckSimplify("0:0", "0:2", "1:1", "", {}, 0.9, false);
83
+
84
+ // A target disc that contains the source vertex.
85
+ CheckSimplify("0:0", "0:2", "0:0.1", "", {}, 1.0, true);
86
+
87
+ // A target disc that contains the destination vertex.
88
+ CheckSimplify("0:0", "0:2", "0:2.1", "", {}, 1.0, true);
89
+ }
90
+
91
+ TEST(S2PolylineSimplifier, AvoidOnePoint) {
92
+ // Three points on a straight line, attempting to avoid the middle point.
93
+ CheckSimplify("0:0", "0:2", "", "0:1", {true}, 1e-10, false);
94
+
95
+ // Three points where the middle point can be successfully avoided.
96
+ CheckSimplify("0:0", "0:2", "", "1:1", {true}, 0.9, true);
97
+
98
+ // Three points where the middle point is on the left, but where the client
99
+ // requires the point to be on the right of the edge.
100
+ CheckSimplify("0:0", "0:2", "", "1:1", {false}, 1e-10, false);
101
+ }
102
+
103
+ TEST(S2PolylineSimplifier, TargetAndAvoid) {
104
+ // Target several points that are separated from the proposed edge by about
105
+ // 0.7 degrees, and avoid several points that are separated from the
106
+ // proposed edge by about 1.4 degrees.
107
+ CheckSimplify("0:0", "10:10", "2:3, 4:3, 7:8",
108
+ "4:2, 7:5, 7:9", {true, true, false}, 1.0, true);
109
+
110
+ // The same example, but one point to be targeted is 1.4 degrees away.
111
+ CheckSimplify("0:0", "10:10", "2:3, 4:6, 7:8",
112
+ "4:2, 7:5, 7:9", {true, true, false}, 1.0, false);
113
+
114
+ // The same example, but one point to be avoided is 0.7 degrees away.
115
+ CheckSimplify("0:0", "10:10", "2:3, 4:3, 7:8",
116
+ "4:2, 6:5, 7:9", {true, true, false}, 1.0, false);
117
+ }
118
+
119
+ TEST(S2PolylineSimplifier, Precision) {
120
+ // This is a rough upper bound on both the error in constructing the disc
121
+ // locations (i.e., S2::InterpolateAtDistance, etc), and also on the
122
+ // padding that S2PolylineSimplifier uses to ensure that its results are
123
+ // conservative (i.e., the error calculated by GetSemiwidth).
124
+ const S1Angle kMaxError = S1Angle::Radians(25 * DBL_EPSILON);
125
+
126
+ // We repeatedly generate a random edge. We then target several discs that
127
+ // barely overlap the edge, and avoid several discs that barely miss the
128
+ // edge. About half the time, we choose one disc and make it slightly too
129
+ // large or too small so that targeting fails.
130
+ const int kIters = 1000; // Passes with 1 million iterations.
131
+ S2PolylineSimplifier simplifier;
132
+ for (int iter = 0; iter < kIters; ++iter) {
133
+ S2Testing::rnd.Reset(iter + 1); // Easier to reproduce a specific case.
134
+ S2Point src = S2Testing::RandomPoint();
135
+ simplifier.Init(src);
136
+ S2Point dst = S2::InterpolateAtDistance(
137
+ S1Angle::Radians(S2Testing::rnd.RandDouble()),
138
+ src, S2Testing::RandomPoint());
139
+ S2Point n = S2::RobustCrossProd(src, dst).Normalize();
140
+
141
+ // If bad_disc >= 0, then we make targeting fail for that disc.
142
+ const int kNumDiscs = 5;
143
+ int bad_disc = S2Testing::rnd.Uniform(2 * kNumDiscs) - kNumDiscs;
144
+ for (int i = 0; i < kNumDiscs; ++i) {
145
+ double f = S2Testing::rnd.RandDouble();
146
+ S2Point a = ((1 - f) * src + f * dst).Normalize();
147
+ S1Angle r = S1Angle::Radians(S2Testing::rnd.RandDouble());
148
+ bool on_left = S2Testing::rnd.OneIn(2);
149
+ S2Point x = S2::InterpolateAtDistance(r, a, on_left ? n : -n);
150
+ // We grow the radius slightly if we want to target the disc and shrink
151
+ // it otherwise, *unless* we want targeting to fail for this disc, in
152
+ // which case these actions are reversed.
153
+ bool avoid = S2Testing::rnd.OneIn(2);
154
+ bool grow_radius = (avoid == (i == bad_disc));
155
+ S1ChordAngle radius(grow_radius ? r + kMaxError : r - kMaxError);
156
+ if (avoid) {
157
+ simplifier.AvoidDisc(x, radius, on_left);
158
+ } else {
159
+ simplifier.TargetDisc(x, radius);
160
+ }
161
+ }
162
+ // The result is true iff all the disc constraints were satisfiable.
163
+ EXPECT_EQ(bad_disc < 0, simplifier.Extend(dst));
164
+ }
165
+ }