@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,296 @@
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/s1interval.h"
19
+
20
+ #include <algorithm>
21
+ #include <cfloat>
22
+ #include <cmath>
23
+
24
+ #include "s2/base/logging.h"
25
+
26
+ using std::fabs;
27
+ using std::max;
28
+
29
+ S1Interval S1Interval::FromPoint(double p) {
30
+ if (p == -M_PI) p = M_PI;
31
+ return S1Interval(p, p, ARGS_CHECKED);
32
+ }
33
+
34
+ double S1Interval::GetCenter() const {
35
+ double center = 0.5 * (lo() + hi());
36
+ if (!is_inverted()) return center;
37
+ // Return the center in the range (-Pi, Pi].
38
+ return (center <= 0) ? (center + M_PI) : (center - M_PI);
39
+ }
40
+
41
+ double S1Interval::GetLength() const {
42
+ double length = hi() - lo();
43
+ if (length >= 0) return length;
44
+ length += 2 * M_PI;
45
+ // Empty intervals have a negative length.
46
+ return (length > 0) ? length : -1;
47
+ }
48
+
49
+ S1Interval S1Interval::Complement() const {
50
+ if (lo() == hi()) return Full(); // Singleton.
51
+ return S1Interval(hi(), lo(), ARGS_CHECKED); // Handles empty and full.
52
+ }
53
+
54
+ double S1Interval::GetComplementCenter() const {
55
+ if (lo() != hi()) {
56
+ return Complement().GetCenter();
57
+ } else { // Singleton.
58
+ return (hi() <= 0) ? (hi() + M_PI) : (hi() - M_PI);
59
+ }
60
+ }
61
+
62
+ bool S1Interval::FastContains(double p) const {
63
+ if (is_inverted()) {
64
+ return (p >= lo() || p <= hi()) && !is_empty();
65
+ } else {
66
+ return p >= lo() && p <= hi();
67
+ }
68
+ }
69
+
70
+ bool S1Interval::Contains(double p) const {
71
+ // Works for empty, full, and singleton intervals.
72
+ S2_DCHECK_LE(fabs(p), M_PI);
73
+ if (p == -M_PI) p = M_PI;
74
+ return FastContains(p);
75
+ }
76
+
77
+ bool S1Interval::InteriorContains(double p) const {
78
+ // Works for empty, full, and singleton intervals.
79
+ S2_DCHECK_LE(fabs(p), M_PI);
80
+ if (p == -M_PI) p = M_PI;
81
+
82
+ if (is_inverted()) {
83
+ return p > lo() || p < hi();
84
+ } else {
85
+ return (p > lo() && p < hi()) || is_full();
86
+ }
87
+ }
88
+
89
+ bool S1Interval::Contains(const S1Interval& y) const {
90
+ // It might be helpful to compare the structure of these tests to
91
+ // the simpler Contains(double) method above.
92
+
93
+ if (is_inverted()) {
94
+ if (y.is_inverted()) return y.lo() >= lo() && y.hi() <= hi();
95
+ return (y.lo() >= lo() || y.hi() <= hi()) && !is_empty();
96
+ } else {
97
+ if (y.is_inverted()) return is_full() || y.is_empty();
98
+ return y.lo() >= lo() && y.hi() <= hi();
99
+ }
100
+ }
101
+
102
+ bool S1Interval::InteriorContains(const S1Interval& y) const {
103
+ if (is_inverted()) {
104
+ if (!y.is_inverted()) return y.lo() > lo() || y.hi() < hi();
105
+ return (y.lo() > lo() && y.hi() < hi()) || y.is_empty();
106
+ } else {
107
+ if (y.is_inverted()) return is_full() || y.is_empty();
108
+ return (y.lo() > lo() && y.hi() < hi()) || is_full();
109
+ }
110
+ }
111
+
112
+ bool S1Interval::Intersects(const S1Interval& y) const {
113
+ if (is_empty() || y.is_empty()) return false;
114
+ if (is_inverted()) {
115
+ // Every non-empty inverted interval contains Pi.
116
+ return y.is_inverted() || y.lo() <= hi() || y.hi() >= lo();
117
+ } else {
118
+ if (y.is_inverted()) return y.lo() <= hi() || y.hi() >= lo();
119
+ return y.lo() <= hi() && y.hi() >= lo();
120
+ }
121
+ }
122
+
123
+ bool S1Interval::InteriorIntersects(const S1Interval& y) const {
124
+ if (is_empty() || y.is_empty() || lo() == hi()) return false;
125
+ if (is_inverted()) {
126
+ return y.is_inverted() || y.lo() < hi() || y.hi() > lo();
127
+ } else {
128
+ if (y.is_inverted()) return y.lo() < hi() || y.hi() > lo();
129
+ return (y.lo() < hi() && y.hi() > lo()) || is_full();
130
+ }
131
+ }
132
+
133
+ inline static double PositiveDistance(double a, double b) {
134
+ // Compute the distance from "a" to "b" in the range [0, 2*Pi).
135
+ // This is equivalent to (remainder(b - a - M_PI, 2 * M_PI) + M_PI),
136
+ // except that it is more numerically stable (it does not lose
137
+ // precision for very small positive distances).
138
+ double d = b - a;
139
+ if (d >= 0) return d;
140
+ // We want to ensure that if b == Pi and a == (-Pi + eps),
141
+ // the return result is approximately 2*Pi and not zero.
142
+ return (b + M_PI) - (a - M_PI);
143
+ }
144
+
145
+ double S1Interval::GetDirectedHausdorffDistance(const S1Interval& y) const {
146
+ if (y.Contains(*this)) return 0.0; // this includes the case *this is empty
147
+ if (y.is_empty()) return M_PI; // maximum possible distance on S1
148
+
149
+ double y_complement_center = y.GetComplementCenter();
150
+ if (Contains(y_complement_center)) {
151
+ return PositiveDistance(y.hi(), y_complement_center);
152
+ } else {
153
+ // The Hausdorff distance is realized by either two hi() endpoints or two
154
+ // lo() endpoints, whichever is farther apart.
155
+ double hi_hi = S1Interval(y.hi(), y_complement_center).Contains(hi()) ?
156
+ PositiveDistance(y.hi(), hi()) : 0;
157
+ double lo_lo = S1Interval(y_complement_center, y.lo()).Contains(lo()) ?
158
+ PositiveDistance(lo(), y.lo()) : 0;
159
+ S2_DCHECK(hi_hi > 0 || lo_lo > 0);
160
+ return max(hi_hi, lo_lo);
161
+ }
162
+ }
163
+
164
+ void S1Interval::AddPoint(double p) {
165
+ S2_DCHECK_LE(fabs(p), M_PI);
166
+ if (p == -M_PI) p = M_PI;
167
+
168
+ if (FastContains(p)) return;
169
+ if (is_empty()) {
170
+ set_hi(p);
171
+ set_lo(p);
172
+ } else {
173
+ // Compute distance from p to each endpoint.
174
+ double dlo = PositiveDistance(p, lo());
175
+ double dhi = PositiveDistance(hi(), p);
176
+ if (dlo < dhi) {
177
+ set_lo(p);
178
+ } else {
179
+ set_hi(p);
180
+ }
181
+ // Adding a point can never turn a non-full interval into a full one.
182
+ }
183
+ }
184
+
185
+ double S1Interval::Project(double p) const {
186
+ S2_DCHECK(!is_empty());
187
+ S2_DCHECK_LE(fabs(p), M_PI);
188
+ if (p == -M_PI) p = M_PI;
189
+ if (FastContains(p)) return p;
190
+ // Compute distance from p to each endpoint.
191
+ double dlo = PositiveDistance(p, lo());
192
+ double dhi = PositiveDistance(hi(), p);
193
+ return (dlo < dhi) ? lo() : hi();
194
+ }
195
+
196
+ S1Interval S1Interval::FromPointPair(double p1, double p2) {
197
+ S2_DCHECK_LE(fabs(p1), M_PI);
198
+ S2_DCHECK_LE(fabs(p2), M_PI);
199
+ if (p1 == -M_PI) p1 = M_PI;
200
+ if (p2 == -M_PI) p2 = M_PI;
201
+ if (PositiveDistance(p1, p2) <= M_PI) {
202
+ return S1Interval(p1, p2, ARGS_CHECKED);
203
+ } else {
204
+ return S1Interval(p2, p1, ARGS_CHECKED);
205
+ }
206
+ }
207
+
208
+ S1Interval S1Interval::Expanded(double margin) const {
209
+ if (margin >= 0) {
210
+ if (is_empty()) return *this;
211
+ // Check whether this interval will be full after expansion, allowing
212
+ // for a 1-bit rounding error when computing each endpoint.
213
+ if (GetLength() + 2 * margin + 2 * DBL_EPSILON >= 2 * M_PI) return Full();
214
+ } else {
215
+ if (is_full()) return *this;
216
+ // Check whether this interval will be empty after expansion, allowing
217
+ // for a 1-bit rounding error when computing each endpoint.
218
+ if (GetLength() + 2 * margin - 2 * DBL_EPSILON <= 0) return Empty();
219
+ }
220
+ S1Interval result(remainder(lo() - margin, 2*M_PI),
221
+ remainder(hi() + margin, 2*M_PI));
222
+ if (result.lo() <= -M_PI) result.set_lo(M_PI);
223
+ return result;
224
+ }
225
+
226
+ S1Interval S1Interval::Union(const S1Interval& y) const {
227
+ // The y.is_full() case is handled correctly in all cases by the code
228
+ // below, but can follow three separate code paths depending on whether
229
+ // this interval is inverted, is non-inverted but contains Pi, or neither.
230
+
231
+ if (y.is_empty()) return *this;
232
+ if (FastContains(y.lo())) {
233
+ if (FastContains(y.hi())) {
234
+ // Either this interval contains y, or the union of the two
235
+ // intervals is the Full() interval.
236
+ if (Contains(y)) return *this; // is_full() code path
237
+ return Full();
238
+ }
239
+ return S1Interval(lo(), y.hi(), ARGS_CHECKED);
240
+ }
241
+ if (FastContains(y.hi())) return S1Interval(y.lo(), hi(), ARGS_CHECKED);
242
+
243
+ // This interval contains neither endpoint of y. This means that either y
244
+ // contains all of this interval, or the two intervals are disjoint.
245
+ if (is_empty() || y.FastContains(lo())) return y;
246
+
247
+ // Check which pair of endpoints are closer together.
248
+ double dlo = PositiveDistance(y.hi(), lo());
249
+ double dhi = PositiveDistance(hi(), y.lo());
250
+ if (dlo < dhi) {
251
+ return S1Interval(y.lo(), hi(), ARGS_CHECKED);
252
+ } else {
253
+ return S1Interval(lo(), y.hi(), ARGS_CHECKED);
254
+ }
255
+ }
256
+
257
+ S1Interval S1Interval::Intersection(const S1Interval& y) const {
258
+ // The y.is_full() case is handled correctly in all cases by the code
259
+ // below, but can follow three separate code paths depending on whether
260
+ // this interval is inverted, is non-inverted but contains Pi, or neither.
261
+
262
+ if (y.is_empty()) return Empty();
263
+ if (FastContains(y.lo())) {
264
+ if (FastContains(y.hi())) {
265
+ // Either this interval contains y, or the region of intersection
266
+ // consists of two disjoint subintervals. In either case, we want
267
+ // to return the shorter of the two original intervals.
268
+ if (y.GetLength() < GetLength()) return y; // is_full() code path
269
+ return *this;
270
+ }
271
+ return S1Interval(y.lo(), hi(), ARGS_CHECKED);
272
+ }
273
+ if (FastContains(y.hi())) return S1Interval(lo(), y.hi(), ARGS_CHECKED);
274
+
275
+ // This interval contains neither endpoint of y. This means that either y
276
+ // contains all of this interval, or the two intervals are disjoint.
277
+
278
+ if (y.FastContains(lo())) return *this; // is_empty() okay here
279
+ S2_DCHECK(!Intersects(y));
280
+ return Empty();
281
+ }
282
+
283
+ bool S1Interval::ApproxEquals(const S1Interval& y, double max_error) const {
284
+ // Full and empty intervals require special cases because the "endpoints"
285
+ // are considered to be positioned arbitrarily.
286
+ if (is_empty()) return y.GetLength() <= 2 * max_error;
287
+ if (y.is_empty()) return GetLength() <= 2 * max_error;
288
+ if (is_full()) return y.GetLength() >= 2 * (M_PI - max_error);
289
+ if (y.is_full()) return GetLength() >= 2 * (M_PI - max_error);
290
+
291
+ // The purpose of the last test below is to verify that moving the endpoints
292
+ // does not invert the interval, e.g. [-1e20, 1e20] vs. [1e20, -1e20].
293
+ return (fabs(remainder(y.lo() - lo(), 2 * M_PI)) <= max_error &&
294
+ fabs(remainder(y.hi() - hi(), 2 * M_PI)) <= max_error &&
295
+ fabs(GetLength() - y.GetLength()) <= 2 * max_error);
296
+ }
@@ -0,0 +1,266 @@
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
+ #ifndef S2_S1INTERVAL_H_
19
+ #define S2_S1INTERVAL_H_
20
+
21
+ #include <cmath>
22
+ #include <iosfwd>
23
+ #include <iostream>
24
+
25
+ #include "s2/base/logging.h"
26
+ #include "s2/_fp_contract_off.h"
27
+ #include "s2/util/math/vector.h" // IWYU pragma: export
28
+
29
+ // An S1Interval represents a closed interval on a unit circle (also known
30
+ // as a 1-dimensional sphere). It is capable of representing the empty
31
+ // interval (containing no points), the full interval (containing all
32
+ // points), and zero-length intervals (containing a single point).
33
+ //
34
+ // Points are represented by the angle they make with the positive x-axis in
35
+ // the range [-Pi, Pi]. An interval is represented by its lower and upper
36
+ // bounds (both inclusive, since the interval is closed). The lower bound may
37
+ // be greater than the upper bound, in which case the interval is "inverted"
38
+ // (i.e. it passes through the point (-1, 0)).
39
+ //
40
+ // Note that the point (-1, 0) has two valid representations, Pi and -Pi.
41
+ // The normalized representation of this point internally is Pi, so that
42
+ // endpoints of normal intervals are in the range (-Pi, Pi]. However, we
43
+ // take advantage of the point -Pi to construct two special intervals:
44
+ // the Full() interval is [-Pi, Pi], and the Empty() interval is [Pi, -Pi].
45
+ //
46
+ // This class is intended to be copied by value as desired. It uses
47
+ // the default copy constructor and assignment operator.
48
+ class S1Interval {
49
+ public:
50
+ // Constructor. Both endpoints must be in the range -Pi to Pi inclusive.
51
+ // The value -Pi is converted internally to Pi except for the Full()
52
+ // and Empty() intervals.
53
+ S1Interval(double lo, double hi);
54
+
55
+ // The default constructor creates an empty interval.
56
+ //
57
+ // Note: Don't construct an interval using the default constructor and
58
+ // set_lo()/set_hi(). If you need to set both endpoints, use the
59
+ // constructor above:
60
+ //
61
+ // lng_bounds_ = S1Interval(lng_lo, lng_hi);
62
+ S1Interval();
63
+
64
+ // Returns the empty interval.
65
+ static S1Interval Empty();
66
+
67
+ // Returns the full interval.
68
+ static S1Interval Full();
69
+
70
+ // Convenience method to construct an interval containing a single point.
71
+ static S1Interval FromPoint(double p);
72
+
73
+ // Convenience method to construct the minimal interval containing
74
+ // the two given points. This is equivalent to starting with an empty
75
+ // interval and calling AddPoint() twice, but it is more efficient.
76
+ static S1Interval FromPointPair(double p1, double p2);
77
+
78
+ // Accessors methods.
79
+ double lo() const { return bounds_[0]; }
80
+ double hi() const { return bounds_[1]; }
81
+
82
+ // Methods that allow the S1Interval to be accessed as a vector. (The
83
+ // recommended style is to use lo() and hi() whenever possible, but these
84
+ // methods are useful when the endpoint to be selected is not constant.)
85
+ //
86
+ // Only const versions of these methods are provided, since S1Interval
87
+ // has invariants that must be maintained after each update.
88
+ double operator[](int i) const { return bounds_[i]; }
89
+ const Vector2_d& bounds() const { return bounds_; }
90
+
91
+ // An interval is valid if neither bound exceeds Pi in absolute value,
92
+ // and the value -Pi appears only in the Empty() and Full() intervals.
93
+ bool is_valid() const;
94
+
95
+ // Return true if the interval contains all points on the unit circle.
96
+ bool is_full() const { return lo() == -M_PI && hi() == M_PI; }
97
+
98
+ // Return true if the interval is empty, i.e. it contains no points.
99
+ bool is_empty() const { return lo() == M_PI && hi() == -M_PI; }
100
+
101
+ // Return true if lo() > hi(). (This is true for empty intervals.)
102
+ bool is_inverted() const { return lo() > hi(); }
103
+
104
+ // Return the midpoint of the interval. For full and empty intervals,
105
+ // the result is arbitrary.
106
+ double GetCenter() const;
107
+
108
+ // Return the length of the interval. The length of an empty interval
109
+ // is negative.
110
+ double GetLength() const;
111
+
112
+ // Return the complement of the interior of the interval. An interval and
113
+ // its complement have the same boundary but do not share any interior
114
+ // values. The complement operator is not a bijection, since the complement
115
+ // of a singleton interval (containing a single value) is the same as the
116
+ // complement of an empty interval.
117
+ S1Interval Complement() const;
118
+
119
+ // Return the midpoint of the complement of the interval. For full and empty
120
+ // intervals, the result is arbitrary. For a singleton interval (containing a
121
+ // single point), the result is its antipodal point on S1.
122
+ double GetComplementCenter() const;
123
+
124
+ // Return true if the interval (which is closed) contains the point 'p'.
125
+ bool Contains(double p) const;
126
+
127
+ // Return true if the interior of the interval contains the point 'p'.
128
+ bool InteriorContains(double p) const;
129
+
130
+ // Return true if the interval contains the given interval 'y'.
131
+ // Works for empty, full, and singleton intervals.
132
+ bool Contains(const S1Interval& y) const;
133
+
134
+ // Returns true if the interior of this interval contains the entire
135
+ // interval 'y'. Note that x.InteriorContains(x) is true only when
136
+ // x is the empty or full interval, and x.InteriorContains(S1Interval(p,p))
137
+ // is equivalent to x.InteriorContains(p).
138
+ bool InteriorContains(const S1Interval& y) const;
139
+
140
+ // Return true if the two intervals contain any points in common.
141
+ // Note that the point +/-Pi has two representations, so the intervals
142
+ // [-Pi,-3] and [2,Pi] intersect, for example.
143
+ bool Intersects(const S1Interval& y) const;
144
+
145
+ // Return true if the interior of this interval contains any point of the
146
+ // interval 'y' (including its boundary). Works for empty, full, and
147
+ // singleton intervals.
148
+ bool InteriorIntersects(const S1Interval& y) const;
149
+
150
+ // Return the Hausdorff distance to the given interval 'y'. For two
151
+ // S1Intervals x and y, this distance is defined by
152
+ // h(x, y) = max_{p in x} min_{q in y} d(p, q),
153
+ // where d(.,.) is measured along S1.
154
+ double GetDirectedHausdorffDistance(const S1Interval& y) const;
155
+
156
+ // Expand the interval by the minimum amount necessary so that it
157
+ // contains the given point "p" (an angle in the range [-Pi, Pi]).
158
+ void AddPoint(double p);
159
+
160
+ // Return the closest point in the interval to the given point "p".
161
+ // The interval must be non-empty.
162
+ double Project(double p) const;
163
+
164
+ // Return an interval that has been expanded on each side by the given
165
+ // distance "margin". If "margin" is negative, then shrink the interval on
166
+ // each side by "margin" instead. The resulting interval may be empty or
167
+ // full. Any expansion (positive or negative) of a full interval remains
168
+ // full, and any expansion of an empty interval remains empty.
169
+ S1Interval Expanded(double margin) const;
170
+
171
+ // Return the smallest interval that contains this interval and the
172
+ // given interval "y".
173
+ S1Interval Union(const S1Interval& y) const;
174
+
175
+ // Return the smallest interval that contains the intersection of this
176
+ // interval with "y". Note that the region of intersection may
177
+ // consist of two disjoint intervals.
178
+ S1Interval Intersection(const S1Interval& y) const;
179
+
180
+ // Return true if two intervals contains the same set of points.
181
+ bool operator==(const S1Interval& y) const;
182
+
183
+ // Return true if this interval can be transformed into the given interval by
184
+ // moving each endpoint by at most "max_error" (and without the endpoints
185
+ // crossing, which would invert the interval). Empty and full intervals are
186
+ // considered to start at an arbitrary point on the unit circle, thus any
187
+ // interval with (length <= 2*max_error) matches the empty interval, and any
188
+ // interval with (length >= 2*Pi - 2*max_error) matches the full interval.
189
+ bool ApproxEquals(const S1Interval& y, double max_error = 1e-15) const;
190
+
191
+ // Low-level methods to modify one endpoint of an existing S1Interval.
192
+ // These methods should really be private because setting just one endpoint
193
+ // can violate the invariants maintained by S1Interval. In particular:
194
+ //
195
+ // - It is not valid to call these methods on an Empty() or Full()
196
+ // interval, since these intervals do not have any endpoints.
197
+ //
198
+ // - It is not allowed to set an endpoint to -Pi. (When these methods are
199
+ // used internally, values of -Pi have already been normalized to Pi.)
200
+ //
201
+ // The preferred way to modify both endpoints of an interval is to use a
202
+ // constructor, e.g. lng = S1Interval(lng_lo, lng_hi).
203
+ void set_lo(double p);
204
+ void set_hi(double p);
205
+
206
+ private:
207
+ enum ArgsChecked { ARGS_CHECKED };
208
+
209
+ // Internal constructor that assumes that both arguments are in the
210
+ // correct range, i.e. normalization from -Pi to Pi is already done.
211
+ S1Interval(double lo, double hi, ArgsChecked dummy);
212
+
213
+ // Return true if the interval (which is closed) contains the point 'p'.
214
+ // Skips the normalization of 'p' from -Pi to Pi.
215
+ bool FastContains(double p) const;
216
+
217
+ Vector2_d bounds_;
218
+ };
219
+
220
+ inline S1Interval::S1Interval(double lo, double hi) : bounds_(lo, hi) {
221
+ if (lo == -M_PI && hi != M_PI) set_lo(M_PI);
222
+ if (hi == -M_PI && lo != M_PI) set_hi(M_PI);
223
+ S2_DCHECK(is_valid());
224
+ }
225
+
226
+ inline S1Interval::S1Interval(double lo, double hi, ArgsChecked dummy)
227
+ : bounds_(lo, hi) {
228
+ S2_DCHECK(is_valid());
229
+ }
230
+
231
+ inline S1Interval::S1Interval() : bounds_(M_PI, -M_PI) {
232
+ }
233
+
234
+ inline S1Interval S1Interval::Empty() {
235
+ return S1Interval();
236
+ }
237
+
238
+ inline S1Interval S1Interval::Full() {
239
+ return S1Interval(-M_PI, M_PI, ARGS_CHECKED);
240
+ }
241
+
242
+ inline bool S1Interval::is_valid() const {
243
+ return (std::fabs(lo()) <= M_PI && std::fabs(hi()) <= M_PI &&
244
+ !(lo() == -M_PI && hi() != M_PI) &&
245
+ !(hi() == -M_PI && lo() != M_PI));
246
+ }
247
+
248
+ inline bool S1Interval::operator==(const S1Interval& y) const {
249
+ return lo() == y.lo() && hi() == y.hi();
250
+ }
251
+
252
+ inline void S1Interval::set_lo(double p) {
253
+ bounds_[0] = p;
254
+ S2_DCHECK(is_valid());
255
+ }
256
+
257
+ inline void S1Interval::set_hi(double p) {
258
+ bounds_[1] = p;
259
+ S2_DCHECK(is_valid());
260
+ }
261
+
262
+ inline std::ostream& operator<<(std::ostream& os, const S1Interval& x) {
263
+ return os << "[" << x.lo() << ", " << x.hi() << "]";
264
+ }
265
+
266
+ #endif // S2_S1INTERVAL_H_