@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,344 @@
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/s2latlng_rect_bounder.h"
19
+
20
+ #include <cfloat>
21
+ #include <cmath>
22
+
23
+ #include "s2/base/logging.h"
24
+ #include "s2/r1interval.h"
25
+ #include "s2/s1chord_angle.h"
26
+ #include "s2/s1interval.h"
27
+ #include "s2/s2pointutil.h"
28
+
29
+ using std::fabs;
30
+ using std::max;
31
+ using std::min;
32
+
33
+ void S2LatLngRectBounder::AddPoint(const S2Point& b) {
34
+ S2_DCHECK(S2::IsUnitLength(b));
35
+ AddInternal(b, S2LatLng(b));
36
+ }
37
+
38
+ void S2LatLngRectBounder::AddLatLng(const S2LatLng& b_latlng) {
39
+ AddInternal(b_latlng.ToPoint(), b_latlng);
40
+ }
41
+
42
+ void S2LatLngRectBounder::AddInternal(const S2Point& b,
43
+ const S2LatLng& b_latlng) {
44
+ // Simple consistency check to verify that b and b_latlng are alternate
45
+ // representations of the same vertex.
46
+ S2_DCHECK(S2::ApproxEquals(b, b_latlng.ToPoint()));
47
+
48
+ if (bound_.is_empty()) {
49
+ bound_.AddPoint(b_latlng);
50
+ } else {
51
+ // First compute the cross product N = A x B robustly. This is the normal
52
+ // to the great circle through A and B. We don't use S2::RobustCrossProd()
53
+ // since that method returns an arbitrary vector orthogonal to A if the two
54
+ // vectors are proportional, and we want the zero vector in that case.
55
+ Vector3_d n = (a_ - b).CrossProd(a_ + b); // N = 2 * (A x B)
56
+
57
+ // The relative error in N gets large as its norm gets very small (i.e.,
58
+ // when the two points are nearly identical or antipodal). We handle this
59
+ // by choosing a maximum allowable error, and if the error is greater than
60
+ // this we fall back to a different technique. Since it turns out that
61
+ // the other sources of error in converting the normal to a maximum
62
+ // latitude add up to at most 1.16 * DBL_EPSILON (see below), and it is
63
+ // desirable to have the total error be a multiple of DBL_EPSILON, we have
64
+ // chosen to limit the maximum error in the normal to 3.84 * DBL_EPSILON.
65
+ // It is possible to show that the error is less than this when
66
+ //
67
+ // n.Norm() >= 8 * sqrt(3) / (3.84 - 0.5 - sqrt(3)) * DBL_EPSILON
68
+ // = 1.91346e-15 (about 8.618 * DBL_EPSILON)
69
+ double n_norm = n.Norm();
70
+ if (n_norm < 1.91346e-15) {
71
+ // A and B are either nearly identical or nearly antipodal (to within
72
+ // 4.309 * DBL_EPSILON, or about 6 nanometers on the earth's surface).
73
+ if (a_.DotProd(b) < 0) {
74
+ // The two points are nearly antipodal. The easiest solution is to
75
+ // assume that the edge between A and B could go in any direction
76
+ // around the sphere.
77
+ bound_ = S2LatLngRect::Full();
78
+ } else {
79
+ // The two points are nearly identical (to within 4.309 * DBL_EPSILON).
80
+ // In this case we can just use the bounding rectangle of the points,
81
+ // since after the expansion done by GetBound() this rectangle is
82
+ // guaranteed to include the (lat,lng) values of all points along AB.
83
+ bound_ = bound_.Union(S2LatLngRect::FromPointPair(a_latlng_, b_latlng));
84
+ }
85
+ } else {
86
+ // Compute the longitude range spanned by AB.
87
+ S1Interval lng_ab = S1Interval::FromPointPair(a_latlng_.lng().radians(),
88
+ b_latlng.lng().radians());
89
+ if (lng_ab.GetLength() >= M_PI - 2 * DBL_EPSILON) {
90
+ // The points lie on nearly opposite lines of longitude to within the
91
+ // maximum error of the calculation. (Note that this test relies on
92
+ // the fact that M_PI is slightly less than the true value of Pi, and
93
+ // that representable values near M_PI are 2 * DBL_EPSILON apart.)
94
+ // The easiest solution is to assume that AB could go on either side
95
+ // of the pole.
96
+ lng_ab = S1Interval::Full();
97
+ }
98
+
99
+ // Next we compute the latitude range spanned by the edge AB. We start
100
+ // with the range spanning the two endpoints of the edge:
101
+ R1Interval lat_ab = R1Interval::FromPointPair(a_latlng_.lat().radians(),
102
+ b_latlng.lat().radians());
103
+
104
+ // This is the desired range unless the edge AB crosses the plane
105
+ // through N and the Z-axis (which is where the great circle through A
106
+ // and B attains its minimum and maximum latitudes). To test whether AB
107
+ // crosses this plane, we compute a vector M perpendicular to this
108
+ // plane and then project A and B onto it.
109
+ Vector3_d m = n.CrossProd(S2Point(0, 0, 1));
110
+ double m_a = m.DotProd(a_);
111
+ double m_b = m.DotProd(b);
112
+
113
+ // We want to test the signs of "m_a" and "m_b", so we need to bound
114
+ // the error in these calculations. It is possible to show that the
115
+ // total error is bounded by
116
+ //
117
+ // (1 + sqrt(3)) * DBL_EPSILON * n_norm + 8 * sqrt(3) * (DBL_EPSILON**2)
118
+ // = 6.06638e-16 * n_norm + 6.83174e-31
119
+
120
+ double m_error = 6.06638e-16 * n_norm + 6.83174e-31;
121
+ if (m_a * m_b < 0 || fabs(m_a) <= m_error || fabs(m_b) <= m_error) {
122
+ // Minimum/maximum latitude *may* occur in the edge interior.
123
+ //
124
+ // The maximum latitude is 90 degrees minus the latitude of N. We
125
+ // compute this directly using atan2 in order to get maximum accuracy
126
+ // near the poles.
127
+ //
128
+ // Our goal is compute a bound that contains the computed latitudes of
129
+ // all S2Points P that pass the point-in-polygon containment test.
130
+ // There are three sources of error we need to consider:
131
+ // - the directional error in N (at most 3.84 * DBL_EPSILON)
132
+ // - converting N to a maximum latitude
133
+ // - computing the latitude of the test point P
134
+ // The latter two sources of error are at most 0.955 * DBL_EPSILON
135
+ // individually, but it is possible to show by a more complex analysis
136
+ // that together they can add up to at most 1.16 * DBL_EPSILON, for a
137
+ // total error of 5 * DBL_EPSILON.
138
+ //
139
+ // We add 3 * DBL_EPSILON to the bound here, and GetBound() will pad
140
+ // the bound by another 2 * DBL_EPSILON.
141
+ double max_lat = min(
142
+ atan2(sqrt(n[0]*n[0] + n[1]*n[1]), fabs(n[2])) + 3 * DBL_EPSILON,
143
+ M_PI_2);
144
+
145
+ // In order to get tight bounds when the two points are close together,
146
+ // we also bound the min/max latitude relative to the latitudes of the
147
+ // endpoints A and B. First we compute the distance between A and B,
148
+ // and then we compute the maximum change in latitude between any two
149
+ // points along the great circle that are separated by this distance.
150
+ // This gives us a latitude change "budget". Some of this budget must
151
+ // be spent getting from A to B; the remainder bounds the round-trip
152
+ // distance (in latitude) from A or B to the min or max latitude
153
+ // attained along the edge AB.
154
+ double lat_budget = 2 * asin(0.5 * (a_ - b).Norm() * sin(max_lat));
155
+ double max_delta = 0.5*(lat_budget - lat_ab.GetLength()) + DBL_EPSILON;
156
+
157
+ // Test whether AB passes through the point of maximum latitude or
158
+ // minimum latitude. If the dot product(s) are small enough then the
159
+ // result may be ambiguous.
160
+ if (m_a <= m_error && m_b >= -m_error) {
161
+ lat_ab.set_hi(min(max_lat, lat_ab.hi() + max_delta));
162
+ }
163
+ if (m_b <= m_error && m_a >= -m_error) {
164
+ lat_ab.set_lo(max(-max_lat, lat_ab.lo() - max_delta));
165
+ }
166
+ }
167
+ bound_ = bound_.Union(S2LatLngRect(lat_ab, lng_ab));
168
+ }
169
+ }
170
+ a_ = b;
171
+ a_latlng_ = b_latlng;
172
+ }
173
+
174
+ S2LatLngRect S2LatLngRectBounder::GetBound() const {
175
+ // To save time, we ignore numerical errors in the computed S2LatLngs while
176
+ // accumulating the bounds and then account for them here.
177
+ //
178
+ // S2LatLng(S2Point) has a maximum error of 0.955 * DBL_EPSILON in latitude.
179
+ // In the worst case, we might have rounded "inwards" when computing the
180
+ // bound and "outwards" when computing the latitude of a contained point P,
181
+ // therefore we expand the latitude bounds by 2 * DBL_EPSILON in each
182
+ // direction. (A more complex analysis shows that 1.5 * DBL_EPSILON is
183
+ // enough, but the expansion amount should be a multiple of DBL_EPSILON in
184
+ // order to avoid rounding errors during the expansion itself.)
185
+ //
186
+ // S2LatLng(S2Point) has a maximum error of DBL_EPSILON in longitude, which
187
+ // is simply the maximum rounding error for results in the range [-Pi, Pi].
188
+ // This is true because the Gnu implementation of atan2() comes from the IBM
189
+ // Accurate Mathematical Library, which implements correct rounding for this
190
+ // instrinsic (i.e., it returns the infinite precision result rounded to the
191
+ // nearest representable value, with ties rounded to even values). This
192
+ // implies that we don't need to expand the longitude bounds at all, since
193
+ // we only guarantee that the bound contains the *rounded* latitudes of
194
+ // contained points. The *true* latitudes of contained points may lie up to
195
+ // DBL_EPSILON outside of the returned bound.
196
+
197
+ const S2LatLng kExpansion = S2LatLng::FromRadians(2 * DBL_EPSILON, 0);
198
+ return bound_.Expanded(kExpansion).PolarClosure();
199
+ }
200
+
201
+ S2LatLngRect S2LatLngRectBounder::ExpandForSubregions(
202
+ const S2LatLngRect& bound) {
203
+ // Empty bounds don't need expansion.
204
+ if (bound.is_empty()) return bound;
205
+
206
+ // First we need to check whether the bound B contains any nearly-antipodal
207
+ // points (to within 4.309 * DBL_EPSILON). If so then we need to return
208
+ // S2LatLngRect::Full(), since the subregion might have an edge between two
209
+ // such points, and AddPoint() returns Full() for such edges. Note that
210
+ // this can happen even if B is not Full(); for example, consider a loop
211
+ // that defines a 10km strip straddling the equator extending from
212
+ // longitudes -100 to +100 degrees.
213
+ //
214
+ // It is easy to check whether B contains any antipodal points, but checking
215
+ // for nearly-antipodal points is trickier. Essentially we consider the
216
+ // original bound B and its reflection through the origin B', and then test
217
+ // whether the minimum distance between B and B' is less than 4.309 *
218
+ // DBL_EPSILON.
219
+
220
+ // "lng_gap" is a lower bound on the longitudinal distance between B and its
221
+ // reflection B'. (2.5 * DBL_EPSILON is the maximum combined error of the
222
+ // endpoint longitude calculations and the GetLength() call.)
223
+ double lng_gap = max(0.0, M_PI - bound.lng().GetLength() - 2.5 * DBL_EPSILON);
224
+
225
+ // "min_abs_lat" is the minimum distance from B to the equator (if zero or
226
+ // negative, then B straddles the equator).
227
+ double min_abs_lat = max(bound.lat().lo(), -bound.lat().hi());
228
+
229
+ // "lat_gap1" and "lat_gap2" measure the minimum distance from B to the
230
+ // south and north poles respectively.
231
+ double lat_gap1 = M_PI_2 + bound.lat().lo();
232
+ double lat_gap2 = M_PI_2 - bound.lat().hi();
233
+
234
+ if (min_abs_lat >= 0) {
235
+ // The bound B does not straddle the equator. In this case the minimum
236
+ // distance is between one endpoint of the latitude edge in B closest to
237
+ // the equator and the other endpoint of that edge in B'. The latitude
238
+ // distance between these two points is 2*min_abs_lat, and the longitude
239
+ // distance is lng_gap. We could compute the distance exactly using the
240
+ // Haversine formula, but then we would need to bound the errors in that
241
+ // calculation. Since we only need accuracy when the distance is very
242
+ // small (close to 4.309 * DBL_EPSILON), we substitute the Euclidean
243
+ // distance instead. This gives us a right triangle XYZ with two edges of
244
+ // length x = 2*min_abs_lat and y ~= lng_gap. The desired distance is the
245
+ // length of the third edge "z", and we have
246
+ //
247
+ // z ~= sqrt(x^2 + y^2) >= (x + y) / sqrt(2)
248
+ //
249
+ // Therefore the region may contain nearly antipodal points only if
250
+ //
251
+ // 2*min_abs_lat + lng_gap < sqrt(2) * 4.309 * DBL_EPSILON
252
+ // ~= 1.354e-15
253
+ //
254
+ // Note that because the given bound B is conservative, "min_abs_lat" and
255
+ // "lng_gap" are both lower bounds on their true values so we do not need
256
+ // to make any adjustments for their errors.
257
+ if (2 * min_abs_lat + lng_gap < 1.354e-15) {
258
+ return S2LatLngRect::Full();
259
+ }
260
+ } else if (lng_gap >= M_PI_2) {
261
+ // B spans at most Pi/2 in longitude. The minimum distance is always
262
+ // between one corner of B and the diagonally opposite corner of B'. We
263
+ // use the same distance approximation that we used above; in this case
264
+ // we have an obtuse triangle XYZ with two edges of length x = lat_gap1
265
+ // and y = lat_gap2, and angle Z >= Pi/2 between them. We then have
266
+ //
267
+ // z >= sqrt(x^2 + y^2) >= (x + y) / sqrt(2)
268
+ //
269
+ // Unlike the case above, "lat_gap1" and "lat_gap2" are not lower bounds
270
+ // (because of the extra addition operation, and because M_PI_2 is not
271
+ // exactly equal to Pi/2); they can exceed their true values by up to
272
+ // 0.75 * DBL_EPSILON. Putting this all together, the region may
273
+ // contain nearly antipodal points only if
274
+ //
275
+ // lat_gap1 + lat_gap2 < (sqrt(2) * 4.309 + 1.5) * DBL_EPSILON
276
+ // ~= 1.687e-15
277
+ if (lat_gap1 + lat_gap2 < 1.687e-15) {
278
+ return S2LatLngRect::Full();
279
+ }
280
+ } else {
281
+ // Otherwise we know that (1) the bound straddles the equator and (2) its
282
+ // width in longitude is at least Pi/2. In this case the minimum
283
+ // distance can occur either between a corner of B and the diagonally
284
+ // opposite corner of B' (as in the case above), or between a corner of B
285
+ // and the opposite longitudinal edge reflected in B'. It is sufficient
286
+ // to only consider the corner-edge case, since this distance is also a
287
+ // lower bound on the corner-corner distance when that case applies.
288
+
289
+ // Consider the spherical triangle XYZ where X is a corner of B with
290
+ // minimum absolute latitude, Y is the closest pole to X, and Z is the
291
+ // point closest to X on the opposite longitudinal edge of B'. This is a
292
+ // right triangle (Z = Pi/2), and from the spherical law of sines we have
293
+ //
294
+ // sin(z) / sin(Z) = sin(y) / sin(Y)
295
+ // sin(max_lat_gap) / 1 = sin(d_min) / sin(lng_gap)
296
+ // sin(d_min) = sin(max_lat_gap) * sin(lng_gap)
297
+ //
298
+ // where "max_lat_gap" = max(lat_gap1, lat_gap2) and "d_min" is the
299
+ // desired minimum distance. Now using the facts that sin(t) >= (2/Pi)*t
300
+ // for 0 <= t <= Pi/2, that we only need an accurate approximation when
301
+ // at least one of "max_lat_gap" or "lng_gap" is extremely small (in
302
+ // which case sin(t) ~= t), and recalling that "max_lat_gap" has an error
303
+ // of up to 0.75 * DBL_EPSILON, we want to test whether
304
+ //
305
+ // max_lat_gap * lng_gap < (4.309 + 0.75) * (Pi/2) * DBL_EPSILON
306
+ // ~= 1.765e-15
307
+ if (max(lat_gap1, lat_gap2) * lng_gap < 1.765e-15) {
308
+ return S2LatLngRect::Full();
309
+ }
310
+ }
311
+ // Next we need to check whether the subregion might contain any edges that
312
+ // span (M_PI - 2 * DBL_EPSILON) radians or more in longitude, since AddPoint
313
+ // sets the longitude bound to Full() in that case. This corresponds to
314
+ // testing whether (lng_gap <= 0) in "lng_expansion" below.
315
+
316
+ // Otherwise, the maximum latitude error in AddPoint is 4.8 * DBL_EPSILON.
317
+ // In the worst case, the errors when computing the latitude bound for a
318
+ // subregion could go in the opposite direction as the errors when computing
319
+ // the bound for the original region, so we need to double this value.
320
+ // (More analysis shows that it's okay to round down to a multiple of
321
+ // DBL_EPSILON.)
322
+ //
323
+ // For longitude, we rely on the fact that atan2 is correctly rounded and
324
+ // therefore no additional bounds expansion is necessary.
325
+
326
+ double lat_expansion = 9 * DBL_EPSILON;
327
+ double lng_expansion = (lng_gap <= 0) ? M_PI : 0;
328
+ return bound.Expanded(S2LatLng::FromRadians(lat_expansion,
329
+ lng_expansion)).PolarClosure();
330
+ }
331
+
332
+ S2LatLng S2LatLngRectBounder::MaxErrorForTests() {
333
+ // The maximum error in the latitude calculation is
334
+ // 3.84 * DBL_EPSILON for the RobustCrossProd calculation
335
+ // 0.96 * DBL_EPSILON for the Latitude() calculation
336
+ // 5 * DBL_EPSILON added by AddPoint/GetBound to compensate for error
337
+ // ------------------
338
+ // 9.80 * DBL_EPSILON maximum error in result
339
+ //
340
+ // The maximum error in the longitude calculation is DBL_EPSILON. GetBound
341
+ // does not do any expansion because this isn't necessary in order to
342
+ // bound the *rounded* longitudes of contained points.
343
+ return S2LatLng::FromRadians(10 * DBL_EPSILON, 1 * DBL_EPSILON);
344
+ }
@@ -0,0 +1,89 @@
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_S2LATLNG_RECT_BOUNDER_H_
19
+ #define S2_S2LATLNG_RECT_BOUNDER_H_
20
+
21
+ #include "s2/s2latlng.h"
22
+ #include "s2/s2latlng_rect.h"
23
+ #include "s2/s2point.h"
24
+
25
+ // This class computes a bounding rectangle that contains all edges defined
26
+ // by a vertex chain v0, v1, v2, ... All vertices must be unit length.
27
+ // Note that the bounding rectangle of an edge can be larger than the
28
+ // bounding rectangle of its endpoints, e.g. consider an edge that passes
29
+ // through the north pole.
30
+ //
31
+ // The bounds are calculated conservatively to account for numerical errors
32
+ // when S2Points are converted to S2LatLngs. More precisely, this class
33
+ // guarantees the following. Let L be a closed edge chain (loop) such that
34
+ // the interior of the loop does not contain either pole. Now if P is any
35
+ // point such that L.Contains(P), then RectBound(L).Contains(S2LatLng(P)).
36
+ class S2LatLngRectBounder {
37
+ public:
38
+ S2LatLngRectBounder() : bound_(S2LatLngRect::Empty()) {}
39
+
40
+ // This method is called to add a vertex to the chain when the vertex is
41
+ // represented as an S2Point. Requires that 'b' has unit length. Repeated
42
+ // vertices are ignored.
43
+ void AddPoint(const S2Point& b);
44
+
45
+ // This method is called to add a vertex to the chain when the vertex is
46
+ // represented as an S2LatLng. Repeated vertices are ignored.
47
+ void AddLatLng(const S2LatLng& b_latlng);
48
+
49
+ // Returns the bounding rectangle of the edge chain that connects the
50
+ // vertices defined so far. This bound satisfies the guarantee made
51
+ // above, i.e. if the edge chain defines a loop, then the bound contains
52
+ // the S2LatLng coordinates of all S2Points contained by the loop.
53
+ S2LatLngRect GetBound() const;
54
+
55
+ // Expands a bound returned by GetBound() so that it is guaranteed to
56
+ // contain the bounds of any subregion whose bounds are computed using
57
+ // this class. For example, consider a loop L that defines a square.
58
+ // GetBound() ensures that if a point P is contained by this square, then
59
+ // S2LatLng(P) is contained by the bound. But now consider a diamond
60
+ // shaped loop S contained by L. It is possible that GetBound() returns a
61
+ // *larger* bound for S than it does for L, due to rounding errors. This
62
+ // method expands the bound for L so that it is guaranteed to contain the
63
+ // bounds of any subregion S.
64
+ //
65
+ // More precisely, if L is a loop that does not contain either pole, and S
66
+ // is a loop such that L.Contains(S), then
67
+ //
68
+ // ExpandForSubregions(RectBound(L)).Contains(RectBound(S)).
69
+ static S2LatLngRect ExpandForSubregions(const S2LatLngRect& bound);
70
+
71
+ // Returns the maximum error in GetBound() provided that the result does
72
+ // not include either pole. It is only to be used for testing purposes
73
+ // (e.g., by passing it to S2LatLngRect::ApproxEquals).
74
+ static S2LatLng MaxErrorForTests();
75
+
76
+ private:
77
+ // Common back end for AddPoint() and AddLatLng(). b and b_latlng
78
+ // must refer to the same vertex.
79
+ void AddInternal(const S2Point& b, const S2LatLng& b_latlng);
80
+
81
+ S2Point a_; // The previous vertex in the chain.
82
+ S2LatLng a_latlng_; // The corresponding latitude-longitude.
83
+ S2LatLngRect bound_; // The current bounding rectangle.
84
+
85
+ S2LatLngRectBounder(const S2LatLngRectBounder&) = delete;
86
+ void operator=(const S2LatLngRectBounder&) = delete;
87
+ };
88
+
89
+ #endif // S2_S2LATLNG_RECT_BOUNDER_H_