@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,336 @@
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_S1ANGLE_H_
19
+ #define S2_S1ANGLE_H_
20
+
21
+ #include <cmath>
22
+ #include <limits>
23
+ #include <ostream>
24
+ #include <type_traits>
25
+
26
+ #include "s2/base/integral_types.h"
27
+ #include "s2/_fp_contract_off.h"
28
+ #include "s2/s2point.h"
29
+ #include "s2/util/math/mathutil.h"
30
+ #include "s2/util/math/vector.h"
31
+
32
+ class S2LatLng;
33
+
34
+ #ifndef SWIG
35
+ #define IFNDEF_SWIG(x) x
36
+ #else
37
+ #define IFNDEF_SWIG(x)
38
+ #endif
39
+
40
+ // This class represents a one-dimensional angle (as opposed to a
41
+ // two-dimensional solid angle). It has methods for converting angles to
42
+ // or from radians, degrees, and the E5/E6/E7 representations (i.e. degrees
43
+ // multiplied by 1e5/1e6/1e7 and rounded to the nearest integer).
44
+ //
45
+ // The internal representation is a double-precision value in radians, so
46
+ // conversion to and from radians is exact. Conversions between E5, E6, E7,
47
+ // and Degrees are not always exact; for example, Degrees(3.1) is different
48
+ // from E6(3100000) or E7(310000000). However, the following properties are
49
+ // guaranteed for any integer "n", provided that "n" is in the input range of
50
+ // both functions:
51
+ //
52
+ // Degrees(n) == E6(1000000 * n)
53
+ // Degrees(n) == E7(10000000 * n)
54
+ // E6(n) == E7(10 * n)
55
+ //
56
+ // The corresponding properties are *not* true for E5, so if you use E5 then
57
+ // don't test for exact equality when comparing to other formats such as
58
+ // Degrees or E7.
59
+ //
60
+ // The following conversions between degrees and radians are exact:
61
+ //
62
+ // Degrees(180) == Radians(M_PI)
63
+ // Degrees(45 * k) == Radians(k * M_PI / 4) for k == 0..8
64
+ //
65
+ // These identities also hold when the arguments are scaled up or down by any
66
+ // power of 2. Some similar identities are also true, for example,
67
+ // Degrees(60) == Radians(M_PI / 3), but be aware that this type of identity
68
+ // does not hold in general. For example, Degrees(3) != Radians(M_PI / 60).
69
+ //
70
+ // Similarly, the conversion to radians means that Angle::Degrees(x).degrees()
71
+ // does not always equal "x". For example,
72
+ //
73
+ // S1Angle::Degrees(45 * k).degrees() == 45 * k for k == 0..8
74
+ // but S1Angle::Degrees(60).degrees() != 60.
75
+ //
76
+ // This means that when testing for equality, you should allow for numerical
77
+ // errors (EXPECT_DOUBLE_EQ) or convert to discrete E5/E6/E7 values first.
78
+ //
79
+ // CAVEAT: All of the above properties depend on "double" being the usual
80
+ // 64-bit IEEE 754 type (which is true on almost all modern platforms).
81
+ //
82
+ // This class is intended to be copied by value as desired. It uses
83
+ // the default copy constructor and assignment operator.
84
+ class S1Angle {
85
+ public:
86
+ // These methods construct S1Angle objects from their measure in radians
87
+ // or degrees.
88
+ static constexpr S1Angle Radians(double radians);
89
+ static constexpr S1Angle Degrees(double degrees);
90
+ static constexpr S1Angle E5(int32 e5);
91
+ static constexpr S1Angle E6(int32 e6);
92
+ static constexpr S1Angle E7(int32 e7);
93
+
94
+ // Convenience functions -- to use when args have been fixed32s in protos.
95
+ //
96
+ // The arguments are static_cast into int32, so very large unsigned values
97
+ // are treated as negative numbers.
98
+ static constexpr S1Angle UnsignedE6(uint32 e6);
99
+ static constexpr S1Angle UnsignedE7(uint32 e7);
100
+
101
+ // The default constructor yields a zero angle. This is useful for STL
102
+ // containers and class methods with output arguments.
103
+ IFNDEF_SWIG(constexpr) S1Angle() : radians_(0) {}
104
+
105
+ // Return an angle larger than any finite angle.
106
+ static constexpr S1Angle Infinity();
107
+
108
+ // A explicit shorthand for the default constructor.
109
+ static constexpr S1Angle Zero();
110
+
111
+ // Return the angle between two points, which is also equal to the distance
112
+ // between these points on the unit sphere. The points do not need to be
113
+ // normalized. This function has a maximum error of 3.25 * DBL_EPSILON (or
114
+ // 2.5 * DBL_EPSILON for angles up to 1 radian). If either point is
115
+ // zero-length (e.g. an uninitialized S2Point), or almost zero-length, the
116
+ // resulting angle will be zero.
117
+ S1Angle(const S2Point& x, const S2Point& y);
118
+
119
+ // Like the constructor above, but return the angle (i.e., distance) between
120
+ // two S2LatLng points. This function has about 15 digits of accuracy for
121
+ // small distances but only about 8 digits of accuracy as the distance
122
+ // approaches 180 degrees (i.e., nearly-antipodal points).
123
+ S1Angle(const S2LatLng& x, const S2LatLng& y);
124
+
125
+ constexpr double radians() const;
126
+ constexpr double degrees() const;
127
+
128
+ int32 e5() const;
129
+ int32 e6() const;
130
+ int32 e7() const;
131
+
132
+ // Return the absolute value of an angle.
133
+ S1Angle abs() const;
134
+
135
+ // Comparison operators.
136
+ friend bool operator==(S1Angle x, S1Angle y);
137
+ friend bool operator!=(S1Angle x, S1Angle y);
138
+ friend bool operator<(S1Angle x, S1Angle y);
139
+ friend bool operator>(S1Angle x, S1Angle y);
140
+ friend bool operator<=(S1Angle x, S1Angle y);
141
+ friend bool operator>=(S1Angle x, S1Angle y);
142
+
143
+ // Simple arithmetic operators for manipulating S1Angles.
144
+ friend S1Angle operator-(S1Angle a);
145
+ friend S1Angle operator+(S1Angle a, S1Angle b);
146
+ friend S1Angle operator-(S1Angle a, S1Angle b);
147
+ friend S1Angle operator*(double m, S1Angle a);
148
+ friend S1Angle operator*(S1Angle a, double m);
149
+ friend S1Angle operator/(S1Angle a, double m);
150
+ friend double operator/(S1Angle a, S1Angle b);
151
+ S1Angle& operator+=(S1Angle a);
152
+ S1Angle& operator-=(S1Angle a);
153
+ S1Angle& operator*=(double m);
154
+ S1Angle& operator/=(double m);
155
+
156
+ // Trigonmetric functions (not necessary but slightly more convenient).
157
+ friend double sin(S1Angle a);
158
+ friend double cos(S1Angle a);
159
+ friend double tan(S1Angle a);
160
+
161
+ // Return the angle normalized to the range (-180, 180] degrees.
162
+ S1Angle Normalized() const;
163
+
164
+ // Normalize this angle to the range (-180, 180] degrees.
165
+ void Normalize();
166
+
167
+ // When S1Angle is used as a key in one of the btree container types
168
+ // (util/btree), indicate that linear rather than binary search should be
169
+ // used. This is much faster when the comparison function is cheap.
170
+ typedef std::true_type goog_btree_prefer_linear_node_search;
171
+
172
+ private:
173
+ explicit IFNDEF_SWIG(constexpr) S1Angle(double radians) : radians_(radians) {}
174
+ double radians_;
175
+ };
176
+
177
+
178
+ ////////////////// Implementation details follow ////////////////////
179
+
180
+
181
+ inline constexpr S1Angle S1Angle::Infinity() {
182
+ return S1Angle(std::numeric_limits<double>::infinity());
183
+ }
184
+
185
+ inline constexpr S1Angle S1Angle::Zero() {
186
+ return S1Angle(0);
187
+ }
188
+
189
+ inline constexpr double S1Angle::radians() const {
190
+ return radians_;
191
+ }
192
+
193
+ inline constexpr double S1Angle::degrees() const {
194
+ return (180 / M_PI) * radians_;
195
+ }
196
+
197
+ // Note that the E5, E6, and E7 conversion involve two multiplications rather
198
+ // than one. This is mainly for backwards compatibility (changing this would
199
+ // break many tests), but it does have the nice side effect that conversions
200
+ // between Degrees, E6, and E7 are exact when the arguments are integers.
201
+
202
+ inline int32 S1Angle::e5() const {
203
+ return MathUtil::FastIntRound(1e5 * degrees());
204
+ }
205
+
206
+ inline int32 S1Angle::e6() const {
207
+ return MathUtil::FastIntRound(1e6 * degrees());
208
+ }
209
+
210
+ inline int32 S1Angle::e7() const {
211
+ return MathUtil::FastIntRound(1e7 * degrees());
212
+ }
213
+
214
+ inline S1Angle S1Angle::abs() const {
215
+ return S1Angle(std::fabs(radians_));
216
+ }
217
+
218
+ inline bool operator==(S1Angle x, S1Angle y) {
219
+ return x.radians() == y.radians();
220
+ }
221
+
222
+ inline bool operator!=(S1Angle x, S1Angle y) {
223
+ return x.radians() != y.radians();
224
+ }
225
+
226
+ inline bool operator<(S1Angle x, S1Angle y) {
227
+ return x.radians() < y.radians();
228
+ }
229
+
230
+ inline bool operator>(S1Angle x, S1Angle y) {
231
+ return x.radians() > y.radians();
232
+ }
233
+
234
+ inline bool operator<=(S1Angle x, S1Angle y) {
235
+ return x.radians() <= y.radians();
236
+ }
237
+
238
+ inline bool operator>=(S1Angle x, S1Angle y) {
239
+ return x.radians() >= y.radians();
240
+ }
241
+
242
+ inline S1Angle operator-(S1Angle a) {
243
+ return S1Angle::Radians(-a.radians());
244
+ }
245
+
246
+ inline S1Angle operator+(S1Angle a, S1Angle b) {
247
+ return S1Angle::Radians(a.radians() + b.radians());
248
+ }
249
+
250
+ inline S1Angle operator-(S1Angle a, S1Angle b) {
251
+ return S1Angle::Radians(a.radians() - b.radians());
252
+ }
253
+
254
+ inline S1Angle operator*(double m, S1Angle a) {
255
+ return S1Angle::Radians(m * a.radians());
256
+ }
257
+
258
+ inline S1Angle operator*(S1Angle a, double m) {
259
+ return S1Angle::Radians(m * a.radians());
260
+ }
261
+
262
+ inline S1Angle operator/(S1Angle a, double m) {
263
+ return S1Angle::Radians(a.radians() / m);
264
+ }
265
+
266
+ inline double operator/(S1Angle a, S1Angle b) {
267
+ return a.radians() / b.radians();
268
+ }
269
+
270
+ inline S1Angle& S1Angle::operator+=(S1Angle a) {
271
+ radians_ += a.radians();
272
+ return *this;
273
+ }
274
+
275
+ inline S1Angle& S1Angle::operator-=(S1Angle a) {
276
+ radians_ -= a.radians();
277
+ return *this;
278
+ }
279
+
280
+ inline S1Angle& S1Angle::operator*=(double m) {
281
+ radians_ *= m;
282
+ return *this;
283
+ }
284
+
285
+ inline S1Angle& S1Angle::operator/=(double m) {
286
+ radians_ /= m;
287
+ return *this;
288
+ }
289
+
290
+ inline double sin(S1Angle a) {
291
+ return sin(a.radians());
292
+ }
293
+
294
+ inline double cos(S1Angle a) {
295
+ return cos(a.radians());
296
+ }
297
+
298
+ inline double tan(S1Angle a) {
299
+ return tan(a.radians());
300
+ }
301
+
302
+ inline constexpr S1Angle S1Angle::Radians(double radians) {
303
+ return S1Angle(radians);
304
+ }
305
+
306
+ inline constexpr S1Angle S1Angle::Degrees(double degrees) {
307
+ return S1Angle((M_PI / 180) * degrees);
308
+ }
309
+
310
+ inline constexpr S1Angle S1Angle::E5(int32 e5) {
311
+ return Degrees(1e-5 * e5);
312
+ }
313
+
314
+ inline constexpr S1Angle S1Angle::E6(int32 e6) {
315
+ return Degrees(1e-6 * e6);
316
+ }
317
+
318
+ inline constexpr S1Angle S1Angle::E7(int32 e7) {
319
+ return Degrees(1e-7 * e7);
320
+ }
321
+
322
+ inline constexpr S1Angle S1Angle::UnsignedE6(uint32 e6) {
323
+ return E6(static_cast<int32>(e6));
324
+ }
325
+
326
+ inline constexpr S1Angle S1Angle::UnsignedE7(uint32 e7) {
327
+ return E7(static_cast<int32>(e7));
328
+ }
329
+
330
+ // Writes the angle in degrees with 7 digits of precision after the
331
+ // decimal point, e.g. "17.3745904".
332
+ std::ostream& operator<<(std::ostream& os, S1Angle a);
333
+
334
+ #undef IFNDEF_SWIG
335
+
336
+ #endif // S2_S1ANGLE_H_
@@ -0,0 +1,185 @@
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/s1angle.h"
19
+
20
+ #include <gtest/gtest.h>
21
+
22
+ #include "s2/base/integral_types.h"
23
+ #include "s2/base/logging.h"
24
+ #include "s2/s2latlng.h"
25
+ #include "s2/s2testing.h"
26
+
27
+ TEST(S1Angle, DefaultConstructor) {
28
+ // Check that the default constructor returns an angle of 0.
29
+ S1Angle a;
30
+ EXPECT_EQ(0, a.radians());
31
+ }
32
+
33
+ TEST(S1Angle, Infinity) {
34
+ EXPECT_LT(S1Angle::Radians(1e30), S1Angle::Infinity());
35
+ EXPECT_LT(-S1Angle::Infinity(), S1Angle::Zero());
36
+ EXPECT_EQ(S1Angle::Infinity(), S1Angle::Infinity());
37
+ }
38
+
39
+ TEST(S1Angle, Zero) {
40
+ EXPECT_EQ(S1Angle::Radians(0), S1Angle::Zero());
41
+ }
42
+
43
+ TEST(S1Angle, PiRadiansExactly180Degrees) {
44
+ // Check that the conversion between Pi radians and 180 degrees is exact.
45
+ EXPECT_EQ(M_PI, S1Angle::Radians(M_PI).radians());
46
+ EXPECT_EQ(180.0, S1Angle::Radians(M_PI).degrees());
47
+ EXPECT_EQ(M_PI, S1Angle::Degrees(180).radians());
48
+ EXPECT_EQ(180.0, S1Angle::Degrees(180).degrees());
49
+
50
+ EXPECT_EQ(90.0, S1Angle::Radians(M_PI_2).degrees());
51
+
52
+ // Check negative angles.
53
+ EXPECT_EQ(-90.0, S1Angle::Radians(-M_PI_2).degrees());
54
+ EXPECT_EQ(-M_PI_4, S1Angle::Degrees(-45).radians());
55
+ }
56
+
57
+ TEST(S1Angle, E5E6E7Representations) {
58
+ // Check that E5/E6/E7 representations work as expected.
59
+ EXPECT_DOUBLE_EQ(S1Angle::Degrees(-45).radians(),
60
+ S1Angle::E5(-4500000).radians());
61
+ EXPECT_DOUBLE_EQ(S1Angle::Degrees(-60).radians(),
62
+ S1Angle::E6(-60000000).radians());
63
+ EXPECT_DOUBLE_EQ(S1Angle::Degrees(75).radians(),
64
+ S1Angle::E7(750000000).radians());
65
+ EXPECT_EQ(-17256123, S1Angle::Degrees(-172.56123).e5());
66
+ EXPECT_EQ(12345678, S1Angle::Degrees(12.345678).e6());
67
+ EXPECT_EQ(-123456789, S1Angle::Degrees(-12.3456789).e7());
68
+ }
69
+
70
+ TEST(S1Angle, E6E7RepresentationsUnsigned) {
71
+ // Check that unsigned E6/E7 representations work as expected.
72
+ EXPECT_DOUBLE_EQ(
73
+ S1Angle::Degrees(60).radians(),
74
+ S1Angle::UnsignedE6(static_cast<uint32>(60000000)).radians());
75
+ EXPECT_DOUBLE_EQ(
76
+ S1Angle::Degrees(-60).radians(),
77
+ S1Angle::UnsignedE6(static_cast<uint32>(-60000000)).radians());
78
+ EXPECT_DOUBLE_EQ(
79
+ S1Angle::Degrees(75).radians(),
80
+ S1Angle::UnsignedE7(static_cast<uint32>(750000000)).radians());
81
+ EXPECT_DOUBLE_EQ(
82
+ S1Angle::Degrees(-75).radians(),
83
+ S1Angle::UnsignedE7(static_cast<uint32>(-750000000)).radians());
84
+ }
85
+
86
+ TEST(S1Angle, NormalizeCorrectlyCanonicalizesAngles) {
87
+ EXPECT_DOUBLE_EQ(0.0, S1Angle::Degrees(360.0).Normalized().degrees());
88
+ EXPECT_DOUBLE_EQ(-90.0, S1Angle::Degrees(-90.0).Normalized().degrees());
89
+ EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(-180.0).Normalized().degrees());
90
+ EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(180.0).Normalized().degrees());
91
+ EXPECT_DOUBLE_EQ(180.0, S1Angle::Degrees(540.0).Normalized().degrees());
92
+ EXPECT_DOUBLE_EQ(90.0, S1Angle::Degrees(-270.0).Normalized().degrees());
93
+ }
94
+
95
+ TEST(S1Angle, ArithmeticOperationsOnAngles) {
96
+ EXPECT_DOUBLE_EQ(0.3, S1Angle::Radians(-0.3).abs().radians());
97
+ EXPECT_DOUBLE_EQ(-0.1, (-S1Angle::Radians(0.1)).radians());
98
+ EXPECT_DOUBLE_EQ(0.4,
99
+ (S1Angle::Radians(0.1) + S1Angle::Radians(0.3)).radians());
100
+ EXPECT_DOUBLE_EQ(-0.2,
101
+ (S1Angle::Radians(0.1) - S1Angle::Radians(0.3)).radians());
102
+ EXPECT_DOUBLE_EQ(0.6, (2 * S1Angle::Radians(0.3)).radians());
103
+ EXPECT_DOUBLE_EQ(0.6, (S1Angle::Radians(0.3) * 2).radians());
104
+ EXPECT_DOUBLE_EQ(0.15, (S1Angle::Radians(0.3) / 2).radians());
105
+ EXPECT_DOUBLE_EQ(0.5, (S1Angle::Radians(0.3) / S1Angle::Radians(0.6)));
106
+
107
+ S1Angle tmp = S1Angle::Radians(1.0);
108
+ tmp += S1Angle::Radians(0.5);
109
+ EXPECT_DOUBLE_EQ(1.5, tmp.radians());
110
+ tmp -= S1Angle::Radians(1.0);
111
+ EXPECT_DOUBLE_EQ(0.5, tmp.radians());
112
+ tmp *= 5;
113
+ EXPECT_DOUBLE_EQ(2.5, tmp.radians());
114
+ tmp /= 2;
115
+ EXPECT_DOUBLE_EQ(1.25, tmp.radians());
116
+ }
117
+
118
+ TEST(S1Angle, Trigonometry) {
119
+ // Spot check a few angles to ensure that the correct function is called.
120
+ EXPECT_DOUBLE_EQ(1, cos(S1Angle::Degrees(0)));
121
+ EXPECT_DOUBLE_EQ(1, sin(S1Angle::Degrees(90)));
122
+ EXPECT_DOUBLE_EQ(1, tan(S1Angle::Degrees(45)));
123
+ }
124
+
125
+ TEST(S1Angle, ConstructorsThatMeasureAngles) {
126
+ EXPECT_DOUBLE_EQ(M_PI_2,
127
+ S1Angle(S2Point(1, 0, 0), S2Point(0, 0, 2)).radians());
128
+ EXPECT_DOUBLE_EQ(0.0, S1Angle(S2Point(1, 0, 0), S2Point(1, 0, 0)).radians());
129
+ EXPECT_NEAR(50.0,
130
+ S1Angle(S2LatLng::FromDegrees(20, 20),
131
+ S2LatLng::FromDegrees(70, 20)).degrees(),
132
+ 1e-13);
133
+ }
134
+
135
+ TEST(S1Angle, TestFormatting) {
136
+ std::ostringstream ss;
137
+ ss << S1Angle::Degrees(180.0);
138
+ EXPECT_EQ("180.0000000", ss.str());
139
+ }
140
+
141
+ // The current implementation guarantees exact conversions between
142
+ // Degrees() and E6() when the Degrees() argument is an integer.
143
+ TEST(S1Angle, DegreesVsE6) {
144
+ for (int i = 0; i <= 180; ++i) {
145
+ EXPECT_EQ(S1Angle::Degrees(i), S1Angle::E6(1000000 * i));
146
+ }
147
+ }
148
+
149
+ // The current implementation guarantees exact conversions between
150
+ // Degrees() and E7() when the Degrees() argument is an integer.
151
+ TEST(S1Angle, DegreesVsE7) {
152
+ for (int i = 0; i <= 180; ++i) {
153
+ EXPECT_EQ(S1Angle::Degrees(i), S1Angle::E7(10000000 * i));
154
+ }
155
+ }
156
+
157
+ // The current implementation guarantees exact conversions between
158
+ // E6() and E7() when the E6() argument is an integer.
159
+ TEST(S1Angle, E6VsE7) {
160
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
161
+ for (int iter = 0; iter < 1000; ++iter) {
162
+ int i = S2Testing::rnd.Uniform(180000000);
163
+ EXPECT_EQ(S1Angle::E6(i), S1Angle::E7(10 * i));
164
+ }
165
+ }
166
+
167
+ // The current implementation guarantees certain exact conversions between
168
+ // degrees and radians (see the header file for details).
169
+ TEST(S1Angle, DegreesVsRadians) {
170
+ for (int k = -8; k <= 8; ++k) {
171
+ EXPECT_EQ(S1Angle::Degrees(45 * k), S1Angle::Radians(k * M_PI / 4));
172
+ EXPECT_EQ(45 * k, S1Angle::Degrees(45 * k).degrees());
173
+ }
174
+ for (int k = 0; k <= 30; ++k) {
175
+ int n = 1 << k;
176
+ EXPECT_EQ(S1Angle::Degrees(180. / n), S1Angle::Radians(M_PI / n));
177
+ EXPECT_EQ(S1Angle::Degrees(60. / n), S1Angle::Radians(M_PI / (3. * n)));
178
+ EXPECT_EQ(S1Angle::Degrees(36. / n), S1Angle::Radians(M_PI / (5. * n)));
179
+ EXPECT_EQ(S1Angle::Degrees(20. / n), S1Angle::Radians(M_PI / (9. * n)));
180
+ EXPECT_EQ(S1Angle::Degrees(4. / n), S1Angle::Radians(M_PI / (45. * n)));
181
+ }
182
+ // We also spot check a couple of non-identities.
183
+ EXPECT_NE(S1Angle::Degrees(3), S1Angle::Radians(M_PI / 60));
184
+ EXPECT_NE(60, S1Angle::Degrees(60).degrees());
185
+ }
@@ -0,0 +1,159 @@
1
+ // Copyright 2013 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #include "s2/s1chord_angle.h"
19
+
20
+ #include <cfloat>
21
+ #include <cmath>
22
+
23
+ #include "s2/s1angle.h"
24
+ #include "s2/s2pointutil.h"
25
+
26
+ using std::max;
27
+ using std::min;
28
+ // Android with gnustl has ::nextafter but not std::nextafter.
29
+ // https://github.com/android-ndk/ndk/issues/82
30
+ // Check for gnustl with _GLIBCXX_CMATH, which is its cmath include
31
+ // guard.
32
+ #if !defined(__ANDROID__) || !defined(_GLIBCXX_CMATH)
33
+ using std::nextafter;
34
+ #endif
35
+
36
+ static constexpr double kMaxLength2 = 4.0;
37
+
38
+ S1ChordAngle::S1ChordAngle(S1Angle angle) {
39
+ if (angle.radians() < 0) {
40
+ *this = Negative();
41
+ } else if (angle == S1Angle::Infinity()) {
42
+ *this = Infinity();
43
+ } else {
44
+ // The chord length is 2 * sin(angle / 2).
45
+ double length = 2 * sin(0.5 * min(M_PI, angle.radians()));
46
+ length2_ = length * length;
47
+ }
48
+ S2_DCHECK(is_valid());
49
+ }
50
+
51
+ S1Angle S1ChordAngle::ToAngle() const {
52
+ if (is_negative()) return S1Angle::Radians(-1);
53
+ if (is_infinity()) return S1Angle::Infinity();
54
+ return S1Angle::Radians(2 * asin(0.5 * sqrt(length2_)));
55
+ }
56
+
57
+ bool S1ChordAngle::is_valid() const {
58
+ return (length2_ >= 0 && length2_ <= kMaxLength2) || is_special();
59
+ }
60
+
61
+ S1ChordAngle S1ChordAngle::Successor() const {
62
+ if (length2_ >= kMaxLength2) return Infinity();
63
+ if (length2_ < 0.0) return Zero();
64
+ return S1ChordAngle(nextafter(length2_, 10.0));
65
+ }
66
+
67
+ S1ChordAngle S1ChordAngle::Predecessor() const {
68
+ if (length2_ <= 0.0) return Negative();
69
+ if (length2_ > kMaxLength2) return Straight();
70
+ return S1ChordAngle(nextafter(length2_, -10.0));
71
+ }
72
+
73
+ S1ChordAngle S1ChordAngle::PlusError(double error) const {
74
+ // If angle is Negative() or Infinity(), don't change it.
75
+ // Otherwise clamp it to the valid range.
76
+ if (is_special()) return *this;
77
+ return S1ChordAngle(max(0.0, min(kMaxLength2, length2_ + error)));
78
+ }
79
+
80
+ double S1ChordAngle::GetS2PointConstructorMaxError() const {
81
+ // There is a relative error of 2.5 * DBL_EPSILON when computing the squared
82
+ // distance, plus a relative error of 2 * DBL_EPSILON and an absolute error
83
+ // of (16 * DBL_EPSILON**2) because the lengths of the input points may
84
+ // differ from 1 by up to (2 * DBL_EPSILON) each. (This is the maximum
85
+ // length error in S2Point::Normalize.)
86
+ return 4.5 * DBL_EPSILON * length2_ + 16 * DBL_EPSILON * DBL_EPSILON;
87
+ }
88
+
89
+ double S1ChordAngle::GetS1AngleConstructorMaxError() const {
90
+ // Assuming that an accurate math library is being used, the sin() call and
91
+ // the multiply each have a relative error of 0.5 * DBL_EPSILON.
92
+ return DBL_EPSILON * length2_;
93
+ }
94
+
95
+ S1ChordAngle operator+(S1ChordAngle a, S1ChordAngle b) {
96
+ // Note that this method is much more efficient than converting the chord
97
+ // angles to S1Angles and adding those. It requires only one square root
98
+ // plus a few additions and multiplications.
99
+ S2_DCHECK(!a.is_special());
100
+ S2_DCHECK(!b.is_special());
101
+
102
+ // Optimization for the common case where "b" is an error tolerance
103
+ // parameter that happens to be set to zero.
104
+ double a2 = a.length2(), b2 = b.length2();
105
+ if (b2 == 0) return a;
106
+
107
+ // Clamp the angle sum to at most 180 degrees.
108
+ if (a2 + b2 >= kMaxLength2) return S1ChordAngle::Straight();
109
+
110
+ // Let "a" and "b" be the (non-squared) chord lengths, and let c = a+b.
111
+ // Let A, B, and C be the corresponding half-angles (a = 2*sin(A), etc).
112
+ // Then the formula below can be derived from c = 2 * sin(A+B) and the
113
+ // relationships sin(A+B) = sin(A)*cos(B) + sin(B)*cos(A)
114
+ // cos(X) = sqrt(1 - sin^2(X)) .
115
+
116
+ double x = a2 * (1 - 0.25 * b2); // is_valid() => non-negative
117
+ double y = b2 * (1 - 0.25 * a2); // is_valid() => non-negative
118
+ return S1ChordAngle(min(kMaxLength2, x + y + 2 * sqrt(x * y)));
119
+ }
120
+
121
+ S1ChordAngle operator-(S1ChordAngle a, S1ChordAngle b) {
122
+ // See comments in operator+().
123
+ S2_DCHECK(!a.is_special());
124
+ S2_DCHECK(!b.is_special());
125
+ double a2 = a.length2(), b2 = b.length2();
126
+ if (b2 == 0) return a;
127
+ if (a2 <= b2) return S1ChordAngle::Zero();
128
+ double x = a2 * (1 - 0.25 * b2);
129
+ double y = b2 * (1 - 0.25 * a2);
130
+ return S1ChordAngle(max(0.0, x + y - 2 * sqrt(x * y)));
131
+ }
132
+
133
+ double sin2(S1ChordAngle a) {
134
+ S2_DCHECK(!a.is_special());
135
+ // Let "a" be the (non-squared) chord length, and let A be the corresponding
136
+ // half-angle (a = 2*sin(A)). The formula below can be derived from:
137
+ // sin(2*A) = 2 * sin(A) * cos(A)
138
+ // cos^2(A) = 1 - sin^2(A)
139
+ // This is much faster than converting to an angle and computing its sine.
140
+ return a.length2() * (1 - 0.25 * a.length2());
141
+ }
142
+
143
+ double sin(S1ChordAngle a) {
144
+ return sqrt(sin2(a));
145
+ }
146
+
147
+ double cos(S1ChordAngle a) {
148
+ // cos(2*A) = cos^2(A) - sin^2(A) = 1 - 2*sin^2(A)
149
+ S2_DCHECK(!a.is_special());
150
+ return 1 - 0.5 * a.length2();
151
+ }
152
+
153
+ double tan(S1ChordAngle a) {
154
+ return sin(a) / cos(a);
155
+ }
156
+
157
+ std::ostream& operator<<(std::ostream& os, S1ChordAngle a) {
158
+ return os << a.ToAngle();
159
+ }