@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,135 @@
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/s2measures.h"
19
+
20
+ #include <cmath>
21
+
22
+ #include <gtest/gtest.h>
23
+ #include "s2/s2latlng.h"
24
+ #include "s2/s2testing.h"
25
+
26
+ using std::fabs;
27
+
28
+ TEST(S2, AngleMethods) {
29
+ S2Point pz(0, 0, 1);
30
+ S2Point p000(1, 0, 0);
31
+ S2Point p045 = S2Point(1, 1, 0).Normalize();
32
+ S2Point p090(0, 1, 0);
33
+ S2Point p180(-1, 0, 0);
34
+
35
+ EXPECT_DOUBLE_EQ(S2::Angle(p000, pz, p045), M_PI_4);
36
+ EXPECT_DOUBLE_EQ(S2::TurnAngle(p000, pz, p045), -3 * M_PI_4);
37
+
38
+ EXPECT_DOUBLE_EQ(S2::Angle(p045, pz, p180), 3 * M_PI_4);
39
+ EXPECT_DOUBLE_EQ(S2::TurnAngle(p045, pz, p180), -M_PI_4);
40
+
41
+ EXPECT_DOUBLE_EQ(S2::Angle(p000, pz, p180), M_PI);
42
+ EXPECT_DOUBLE_EQ(S2::TurnAngle(p000, pz, p180), 0);
43
+
44
+ EXPECT_DOUBLE_EQ(S2::Angle(pz, p000, p045), M_PI_2);
45
+ EXPECT_DOUBLE_EQ(S2::TurnAngle(pz, p000, p045), M_PI_2);
46
+
47
+ EXPECT_DOUBLE_EQ(S2::Angle(pz, p000, pz), 0);
48
+ EXPECT_DOUBLE_EQ(fabs(S2::TurnAngle(pz, p000, pz)), M_PI);
49
+ }
50
+
51
+ TEST(S2, AreaMethods) {
52
+ S2Point pz(0, 0, 1);
53
+ S2Point p000(1, 0, 0);
54
+ S2Point p045 = S2Point(1, 1, 0).Normalize();
55
+ S2Point p090(0, 1, 0);
56
+ S2Point p180(-1, 0, 0);
57
+
58
+ EXPECT_DOUBLE_EQ(S2::Area(p000, p090, pz), M_PI_2);
59
+ EXPECT_DOUBLE_EQ(S2::Area(p045, pz, p180), 3 * M_PI_4);
60
+
61
+ // Make sure that Area() has good *relative* accuracy even for
62
+ // very small areas.
63
+ static const double eps = 1e-10;
64
+ S2Point pepsx = S2Point(eps, 0, 1).Normalize();
65
+ S2Point pepsy = S2Point(0, eps, 1).Normalize();
66
+ double expected1 = 0.5 * eps * eps;
67
+ EXPECT_NEAR(S2::Area(pepsx, pepsy, pz), expected1, 1e-14 * expected1);
68
+
69
+ // Make sure that it can handle degenerate triangles.
70
+ S2Point pr = S2Point(0.257, -0.5723, 0.112).Normalize();
71
+ S2Point pq = S2Point(-0.747, 0.401, 0.2235).Normalize();
72
+ EXPECT_EQ(S2::Area(pr, pr, pr), 0);
73
+ // The following test is not exact due to rounding error.
74
+ EXPECT_NEAR(S2::Area(pr, pq, pr), 0, 1e-15);
75
+ EXPECT_EQ(S2::Area(p000, p045, p090), 0);
76
+
77
+ double max_girard = 0;
78
+ for (int i = 0; i < 10000; ++i) {
79
+ S2Point p0 = S2Testing::RandomPoint();
80
+ S2Point d1 = S2Testing::RandomPoint();
81
+ S2Point d2 = S2Testing::RandomPoint();
82
+ S2Point p1 = (p0 + 1e-15 * d1).Normalize();
83
+ S2Point p2 = (p0 + 1e-15 * d2).Normalize();
84
+ // The actual displacement can be as much as 1.2e-15 due to roundoff.
85
+ // This yields a maximum triangle area of about 0.7e-30.
86
+ EXPECT_LE(S2::Area(p0, p1, p2), 0.7e-30);
87
+ max_girard = std::max(max_girard, S2::GirardArea(p0, p1, p2));
88
+ }
89
+ // This check only passes if GirardArea() uses RobustCrossProd().
90
+ S2_LOG(INFO) << "Worst case Girard for triangle area 1e-30: " << max_girard;
91
+ EXPECT_LE(max_girard, 1e-14);
92
+
93
+ // Try a very long and skinny triangle.
94
+ S2Point p045eps = S2Point(1, 1, eps).Normalize();
95
+ double expected2 = 5.8578643762690495119753e-11; // Mathematica.
96
+ EXPECT_NEAR(S2::Area(p000, p045eps, p090), expected2, 1e-9 * expected2);
97
+
98
+ // Triangles with near-180 degree edges that sum to a quarter-sphere.
99
+ static const double eps2 = 1e-14;
100
+ S2Point p000eps2 = S2Point(1, 0.1*eps2, eps2).Normalize();
101
+ double quarter_area1 = S2::Area(p000eps2, p000, p045) +
102
+ S2::Area(p000eps2, p045, p180) +
103
+ S2::Area(p000eps2, p180, pz) +
104
+ S2::Area(p000eps2, pz, p000);
105
+ EXPECT_DOUBLE_EQ(quarter_area1, M_PI);
106
+
107
+ // Four other triangles that sum to a quarter-sphere.
108
+ S2Point p045eps2 = S2Point(1, 1, eps2).Normalize();
109
+ double quarter_area2 = S2::Area(p045eps2, p000, p045) +
110
+ S2::Area(p045eps2, p045, p180) +
111
+ S2::Area(p045eps2, p180, pz) +
112
+ S2::Area(p045eps2, pz, p000);
113
+ EXPECT_DOUBLE_EQ(quarter_area2, M_PI);
114
+
115
+ // Compute the area of a hemisphere using four triangles with one near-180
116
+ // degree edge and one near-degenerate edge.
117
+ for (int i = 0; i < 100; ++i) {
118
+ double lng = 2 * M_PI * S2Testing::rnd.RandDouble();
119
+ S2Point p0 = S2LatLng::FromRadians(1e-20, lng).Normalized().ToPoint();
120
+ S2Point p1 = S2LatLng::FromRadians(0, lng).Normalized().ToPoint();
121
+ double p2_lng = lng + S2Testing::rnd.RandDouble();
122
+ S2Point p2 = S2LatLng::FromRadians(0, p2_lng).Normalized().ToPoint();
123
+ S2Point p3 = S2LatLng::FromRadians(0, lng + M_PI).Normalized().ToPoint();
124
+ S2Point p4 = S2LatLng::FromRadians(0, lng + 5.0).Normalized().ToPoint();
125
+ double area = (S2::Area(p0, p1, p2) + S2::Area(p0, p2, p3) +
126
+ S2::Area(p0, p3, p4) + S2::Area(p0, p4, p1));
127
+ EXPECT_NEAR(area, 2 * M_PI, 2e-15);
128
+ }
129
+
130
+ // This tests a case where the triangle has zero area, but S2::Area()
131
+ // computes (dmin > 0) due to rounding errors.
132
+ EXPECT_EQ(0.0, S2::Area(S2LatLng::FromDegrees(-45, -170).ToPoint(),
133
+ S2LatLng::FromDegrees(45, -170).ToPoint(),
134
+ S2LatLng::FromDegrees(0, -170).ToPoint()));
135
+ }
@@ -0,0 +1,122 @@
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
+ // All of the values below were obtained by a combination of hand analysis and
19
+ // Mathematica. In general, S2_TAN_PROJECTION produces the most uniform
20
+ // shapes and sizes of cells, S2_LINEAR_PROJECTION is considerably worse, and
21
+ // S2_QUADRATIC_PROJECTION is somewhere in between (but generally closer to
22
+ // the tangent projection than the linear one).
23
+ //
24
+ // Note that S2_LINEAR_PROJECTION can be useful for analysis even when another
25
+ // projection is being used, since it allows many cell metrics to be bounded
26
+ // in terms of (u,v) coordinates rather than (s,t) coordinates. (With the
27
+ // linear projection, u = 2 * s - 1 and similarly for v.) Similarly,
28
+ // S2_TAN_PROJECTION allows cell metrics to be bounded in terms of (u,v)
29
+ // coordinate changes when they are measured as distances on the unit sphere.
30
+
31
+ #include "s2/s2metrics.h"
32
+
33
+ namespace S2 {
34
+
35
+ const LengthMetric kMinAngleSpan(
36
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.0 : // 1.000
37
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / 2 : // 1.571
38
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 4. / 3 : // 1.333
39
+ 0);
40
+
41
+ const LengthMetric kMaxAngleSpan(
42
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 : // 2.000
43
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / 2 : // 1.571
44
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.704897179199218452 : // 1.705
45
+ 0);
46
+
47
+ const LengthMetric kAvgAngleSpan(M_PI / 2); // 1.571
48
+ // This is true for all projections.
49
+
50
+ const LengthMetric kMinWidth(
51
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? sqrt(2. / 3) : // 0.816
52
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / (2 * sqrt(2)) : // 1.111
53
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
54
+ 0);
55
+
56
+ const LengthMetric kMaxWidth(kMaxAngleSpan.deriv());
57
+ // This is true for all projections.
58
+
59
+ const LengthMetric kAvgWidth(
60
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.411459345844456965 : // 1.411
61
+ S2_PROJECTION == S2_TAN_PROJECTION ? 1.437318638925160885 : // 1.437
62
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.434523672886099389 : // 1.435
63
+ 0);
64
+
65
+ const LengthMetric kMinEdge(
66
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
67
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI / (2 * sqrt(2)) : // 1.111
68
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
69
+ 0);
70
+
71
+ const LengthMetric kMaxEdge(kMaxAngleSpan.deriv());
72
+ // This is true for all projections.
73
+
74
+ const LengthMetric kAvgEdge(
75
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 1.440034192955603643 : // 1.440
76
+ S2_PROJECTION == S2_TAN_PROJECTION ? 1.461667032546739266 : // 1.462
77
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.459213746386106062 : // 1.459
78
+ 0);
79
+
80
+ const LengthMetric kMinDiag(
81
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) / 3 : // 0.943
82
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * sqrt(2) / 3 : // 1.481
83
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 8 * sqrt(2) / 9 : // 1.257
84
+ 0);
85
+
86
+ const LengthMetric kMaxDiag(
87
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 2 * sqrt(2) : // 2.828
88
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * sqrt(2. / 3) : // 2.565
89
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.438654594434021032 : // 2.439
90
+ 0);
91
+
92
+ const LengthMetric kAvgDiag(
93
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 2.031817866418812674 : // 2.032
94
+ S2_PROJECTION == S2_TAN_PROJECTION ? 2.063623197195635753 : // 2.064
95
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.060422738998471683 : // 2.060
96
+ 0);
97
+
98
+ const AreaMetric kMinArea(
99
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 4 / (3 * sqrt(3)) : // 0.770
100
+ S2_PROJECTION == S2_TAN_PROJECTION ? (M_PI*M_PI) / (4*sqrt(2)) : // 1.745
101
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 8 * sqrt(2) / 9 : // 1.257
102
+ 0);
103
+
104
+ const AreaMetric kMaxArea(
105
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? 4 : // 4.000
106
+ S2_PROJECTION == S2_TAN_PROJECTION ? M_PI * M_PI / 4 : // 2.467
107
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 2.635799256963161491 : // 2.636
108
+ 0);
109
+
110
+ const AreaMetric kAvgArea(4 * M_PI / 6); // 2.094
111
+ // This is true for all projections.
112
+
113
+ const double kMaxEdgeAspect = (
114
+ S2_PROJECTION == S2_LINEAR_PROJECTION ? sqrt(2) : // 1.414
115
+ S2_PROJECTION == S2_TAN_PROJECTION ? sqrt(2) : // 1.414
116
+ S2_PROJECTION == S2_QUADRATIC_PROJECTION ? 1.442615274452682920 : // 1.443
117
+ 0);
118
+
119
+ const double kMaxDiagAspect = sqrt(3); // 1.732
120
+ // This is true for all projections.
121
+
122
+ } // namespace S2
@@ -0,0 +1,199 @@
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
+ // The following are various constants that describe the shapes and sizes of
19
+ // S2Cells (see s2coords.h and s2cell_id.h). They are useful for deciding
20
+ // which cell level to use in order to satisfy a given condition (e.g. that
21
+ // cell vertices must be no further than "x" apart). All of the raw constants
22
+ // are differential quantities; you can use the GetValue(level) method to
23
+ // compute the corresponding length or area on the unit sphere for cells at a
24
+ // given level. The minimum and maximum bounds are valid for cells at all
25
+ // levels, but they may be somewhat conservative for very large cells
26
+ // (e.g. face cells).
27
+
28
+ #ifndef S2_S2METRICS_H_
29
+ #define S2_S2METRICS_H_
30
+
31
+ #include <algorithm>
32
+ #include <cmath>
33
+
34
+ #include "s2/s2coords.h"
35
+ #include "s2/util/math/mathutil.h"
36
+
37
+ namespace S2 {
38
+
39
+ // Defines a cell metric of the given dimension (1 == length, 2 == area).
40
+ template <int dim> class Metric {
41
+ public:
42
+ explicit constexpr Metric(double deriv) : deriv_(deriv) {}
43
+
44
+ // The "deriv" value of a metric is a derivative, and must be multiplied by
45
+ // a length or area in (s,t)-space to get a useful value.
46
+ double deriv() const { return deriv_; }
47
+
48
+ // Return the value of a metric for cells at the given level. The value is
49
+ // either a length or an area on the unit sphere, depending on the
50
+ // particular metric.
51
+ double GetValue(int level) const { return ldexp(deriv_, - dim * level); }
52
+
53
+ // Return the level at which the metric has approximately the given
54
+ // value. For example, S2::kAvgEdge.GetClosestLevel(0.1) returns the
55
+ // level at which the average cell edge length is approximately 0.1.
56
+ // The return value is always a valid level.
57
+ int GetClosestLevel(double value) const;
58
+
59
+ // Return the minimum level such that the metric is at most the given
60
+ // value, or S2CellId::kMaxLevel if there is no such level. For example,
61
+ // S2::kMaxDiag.GetLevelForMaxValue(0.1) returns the minimum level such
62
+ // that all cell diagonal lengths are 0.1 or smaller. The return value
63
+ // is always a valid level.
64
+ int GetLevelForMaxValue(double value) const;
65
+
66
+ // Return the maximum level such that the metric is at least the given
67
+ // value, or zero if there is no such level. For example,
68
+ // S2::kMinWidth.GetLevelForMinValue(0.1) returns the maximum level such
69
+ // that all cells have a minimum width of 0.1 or larger. The return value
70
+ // is always a valid level.
71
+ int GetLevelForMinValue(double value) const;
72
+
73
+ private:
74
+ const double deriv_;
75
+
76
+ Metric(const Metric&) = delete;
77
+ void operator=(const Metric&) = delete;
78
+ };
79
+ using LengthMetric = Metric<1>;
80
+ using AreaMetric = Metric<2>;
81
+
82
+ // Each cell is bounded by four planes passing through its four edges and
83
+ // the center of the sphere. These metrics relate to the angle between each
84
+ // pair of opposite bounding planes, or equivalently, between the planes
85
+ // corresponding to two different s-values or two different t-values. For
86
+ // example, the maximum angle between opposite bounding planes for a cell at
87
+ // level k is kMaxAngleSpan.GetValue(k), and the average angle span for all
88
+ // cells at level k is approximately kAvgAngleSpan.GetValue(k).
89
+ extern const LengthMetric kMinAngleSpan;
90
+ extern const LengthMetric kMaxAngleSpan;
91
+ extern const LengthMetric kAvgAngleSpan;
92
+
93
+ // The width of geometric figure is defined as the distance between two
94
+ // parallel bounding lines in a given direction. For cells, the minimum
95
+ // width is always attained between two opposite edges, and the maximum
96
+ // width is attained between two opposite vertices. However, for our
97
+ // purposes we redefine the width of a cell as the perpendicular distance
98
+ // between a pair of opposite edges. A cell therefore has two widths, one
99
+ // in each direction. The minimum width according to this definition agrees
100
+ // with the classic geometric one, but the maximum width is different. (The
101
+ // maximum geometric width corresponds to kMaxDiag defined below.)
102
+ //
103
+ // For a cell at level k, the distance between opposite edges is at least
104
+ // kMinWidth.GetValue(k) and at most kMaxWidth.GetValue(k). The average
105
+ // width in both directions for all cells at level k is approximately
106
+ // kAvgWidth.GetValue(k).
107
+ //
108
+ // The width is useful for bounding the minimum or maximum distance from a
109
+ // point on one edge of a cell to the closest point on the opposite edge.
110
+ // For example, this is useful when "growing" regions by a fixed distance.
111
+ //
112
+ // Note that because S2Cells are not usually rectangles, the minimum width of
113
+ // a cell is generally smaller than its minimum edge length. (The interior
114
+ // angles of an S2Cell range from 60 to 120 degrees.)
115
+ extern const LengthMetric kMinWidth;
116
+ extern const LengthMetric kMaxWidth;
117
+ extern const LengthMetric kAvgWidth;
118
+
119
+ // The minimum edge length of any cell at level k is at least
120
+ // kMinEdge.GetValue(k), and the maximum is at most kMaxEdge.GetValue(k).
121
+ // The average edge length is approximately kAvgEdge.GetValue(k).
122
+ //
123
+ // The edge length metrics can also be used to bound the minimum, maximum,
124
+ // or average distance from the center of one cell to the center of one of
125
+ // its edge neighbors. In particular, it can be used to bound the distance
126
+ // between adjacent cell centers along the space-filling Hilbert curve for
127
+ // cells at any given level.
128
+ extern const LengthMetric kMinEdge;
129
+ extern const LengthMetric kMaxEdge;
130
+ extern const LengthMetric kAvgEdge;
131
+
132
+ // The minimum diagonal length of any cell at level k is at least
133
+ // kMinDiag.GetValue(k), and the maximum is at most kMaxDiag.GetValue(k).
134
+ // The average diagonal length is approximately kAvgDiag.GetValue(k).
135
+ //
136
+ // The maximum diagonal also happens to be the maximum diameter of any cell,
137
+ // and also the maximum geometric width (see the discussion above). So for
138
+ // example, the distance from an arbitrary point to the closest cell center
139
+ // at a given level is at most half the maximum diagonal length.
140
+ extern const LengthMetric kMinDiag;
141
+ extern const LengthMetric kMaxDiag;
142
+ extern const LengthMetric kAvgDiag;
143
+
144
+ // The minimum area of any cell at level k is at least kMinArea.GetValue(k),
145
+ // and the maximum is at most kMaxArea.GetValue(k). The average area of all
146
+ // cells at level k is exactly kAvgArea.GetValue(k).
147
+ extern const AreaMetric kMinArea;
148
+ extern const AreaMetric kMaxArea;
149
+ extern const AreaMetric kAvgArea;
150
+
151
+ // This is the maximum edge aspect ratio over all cells at any level, where
152
+ // the edge aspect ratio of a cell is defined as the ratio of its longest
153
+ // edge length to its shortest edge length.
154
+ extern const double kMaxEdgeAspect;
155
+
156
+ // This is the maximum diagonal aspect ratio over all cells at any level,
157
+ // where the diagonal aspect ratio of a cell is defined as the ratio of its
158
+ // longest diagonal length to its shortest diagonal length.
159
+ extern const double kMaxDiagAspect;
160
+
161
+
162
+ ////////////////// Implementation details follow ////////////////////
163
+
164
+
165
+ template <int dim>
166
+ int S2::Metric<dim>::GetLevelForMaxValue(double value) const {
167
+ if (value <= 0) return S2::kMaxCellLevel;
168
+
169
+ // This code is equivalent to computing a floating-point "level"
170
+ // value and rounding up. ilogb() returns the exponent corresponding to a
171
+ // fraction in the range [1,2).
172
+ int level = ilogb(value / deriv_);
173
+ level = std::max(0, std::min(S2::kMaxCellLevel, -(level >> (dim - 1))));
174
+ S2_DCHECK(level == S2::kMaxCellLevel || GetValue(level) <= value);
175
+ S2_DCHECK(level == 0 || GetValue(level - 1) > value);
176
+ return level;
177
+ }
178
+
179
+ template <int dim>
180
+ int S2::Metric<dim>::GetLevelForMinValue(double value) const {
181
+ if (value <= 0) return S2::kMaxCellLevel;
182
+
183
+ // This code is equivalent to computing a floating-point "level"
184
+ // value and rounding down.
185
+ int level = ilogb(deriv_ / value);
186
+ level = std::max(0, std::min(S2::kMaxCellLevel, level >> (dim - 1)));
187
+ S2_DCHECK(level == 0 || GetValue(level) >= value);
188
+ S2_DCHECK(level == kMaxCellLevel || GetValue(level + 1) < value);
189
+ return level;
190
+ }
191
+
192
+ template <int dim>
193
+ int Metric<dim>::GetClosestLevel(double value) const {
194
+ return GetLevelForMaxValue((dim == 1 ? M_SQRT2 : 2) * value);
195
+ }
196
+
197
+ } // namespace S2
198
+
199
+ #endif // S2_S2METRICS_H_
@@ -0,0 +1,127 @@
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/s2metrics.h"
19
+
20
+ #include <gtest/gtest.h>
21
+ #include "s2/s2coords.h"
22
+
23
+ // Note: obviously, I could have defined a bundle of metrics like this in the
24
+ // S2 class itself rather than just for testing. However, it's not clear that
25
+ // this is useful other than for testing purposes, and I find
26
+ // S2::kMinWidth.GetLevelForMinValue(width) to be slightly more readable than
27
+ // than S2::kWidth.min().GetLevelForMinValue(width). Also, there is no
28
+ // fundamental reason that we need to analyze the minimum, maximum, and average
29
+ // values of every metric; it would be perfectly reasonable to just define
30
+ // one of these.
31
+ template<int dim>
32
+ class MetricBundle {
33
+ public:
34
+ using Metric = S2::Metric<dim>;
35
+ MetricBundle(const Metric& min, const Metric& max, const Metric& avg) :
36
+ min_(min), max_(max), avg_(avg) {}
37
+ const Metric& min_;
38
+ const Metric& max_;
39
+ const Metric& avg_;
40
+
41
+ private:
42
+ MetricBundle(const MetricBundle&) = delete;
43
+ void operator=(const MetricBundle&) = delete;
44
+ };
45
+
46
+ template<int dim>
47
+ static void CheckMinMaxAvg(const MetricBundle<dim>& bundle) {
48
+ EXPECT_LE(bundle.min_.deriv(), bundle.avg_.deriv());
49
+ EXPECT_LE(bundle.avg_.deriv(), bundle.max_.deriv());
50
+ }
51
+
52
+ template<int dim>
53
+ static void CheckLessOrEqual(const MetricBundle<dim>& a,
54
+ const MetricBundle<dim>& b) {
55
+ EXPECT_LE(a.min_.deriv(), b.min_.deriv());
56
+ EXPECT_LE(a.max_.deriv(), b.max_.deriv());
57
+ EXPECT_LE(a.avg_.deriv(), b.avg_.deriv());
58
+ }
59
+
60
+ TEST(S2, Metrics) {
61
+ MetricBundle<1> angle_span(S2::kMinAngleSpan, S2::kMaxAngleSpan,
62
+ S2::kAvgAngleSpan);
63
+ MetricBundle<1> width(S2::kMinWidth, S2::kMaxWidth, S2::kAvgWidth);
64
+ MetricBundle<1> edge(S2::kMinEdge, S2::kMaxEdge, S2::kAvgEdge);
65
+ MetricBundle<1> diag(S2::kMinDiag, S2::kMaxDiag, S2::kAvgDiag);
66
+ MetricBundle<2> area(S2::kMinArea, S2::kMaxArea, S2::kAvgArea);
67
+
68
+ // First, check that min <= avg <= max for each metric.
69
+ CheckMinMaxAvg(angle_span);
70
+ CheckMinMaxAvg(width);
71
+ CheckMinMaxAvg(edge);
72
+ CheckMinMaxAvg(diag);
73
+ CheckMinMaxAvg(area);
74
+
75
+ // Check that the maximum aspect ratio of an individual cell is consistent
76
+ // with the global minimums and maximums.
77
+ EXPECT_GE(S2::kMaxEdgeAspect, 1);
78
+ EXPECT_LE(S2::kMaxEdgeAspect, S2::kMaxEdge.deriv() / S2::kMinEdge.deriv());
79
+ EXPECT_GE(S2::kMaxDiagAspect, 1);
80
+ EXPECT_LE(S2::kMaxDiagAspect, S2::kMaxDiag.deriv() / S2::kMinDiag.deriv());
81
+
82
+ // Check various conditions that are provable mathematically.
83
+ CheckLessOrEqual(width, angle_span);
84
+ CheckLessOrEqual(width, edge);
85
+ CheckLessOrEqual(edge, diag);
86
+
87
+ EXPECT_GE(S2::kMinArea.deriv(),
88
+ S2::kMinWidth.deriv() * S2::kMinEdge.deriv() - 1e-15);
89
+ EXPECT_LE(S2::kMaxArea.deriv(),
90
+ S2::kMaxWidth.deriv() * S2::kMaxEdge.deriv() + 1e-15);
91
+
92
+ // GetLevelForMaxValue() and friends have built-in assertions, we just need
93
+ // to call these functions to test them.
94
+ //
95
+ // We don't actually check that the metrics are correct here, e.g. that
96
+ // GetMinWidth(10) is a lower bound on the width of cells at level 10.
97
+ // It is easier to check these properties in s2cell_test, since
98
+ // S2Cell has methods to compute the cell vertices, etc.
99
+
100
+ for (int level = -2; level <= S2::kMaxCellLevel + 3; ++level) {
101
+ double width = S2::kMinWidth.deriv() * pow(2, -level);
102
+ if (level >= S2::kMaxCellLevel + 3) width = 0;
103
+
104
+ // Check boundary cases (exactly equal to a threshold value).
105
+ int expected_level = std::max(0, std::min(S2::kMaxCellLevel, level));
106
+ EXPECT_EQ(S2::kMinWidth.GetLevelForMaxValue(width), expected_level);
107
+ EXPECT_EQ(S2::kMinWidth.GetLevelForMinValue(width), expected_level);
108
+ EXPECT_EQ(S2::kMinWidth.GetClosestLevel(width), expected_level);
109
+
110
+ // Also check non-boundary cases.
111
+ EXPECT_EQ(S2::kMinWidth.GetLevelForMaxValue(1.2 * width), expected_level);
112
+ EXPECT_EQ(S2::kMinWidth.GetLevelForMinValue(0.8 * width), expected_level);
113
+ EXPECT_EQ(S2::kMinWidth.GetClosestLevel(1.2 * width), expected_level);
114
+ EXPECT_EQ(S2::kMinWidth.GetClosestLevel(0.8 * width), expected_level);
115
+
116
+ // Same thing for area.
117
+ double area = S2::kMinArea.deriv() * pow(4, -level);
118
+ if (level <= -3) area = 0;
119
+ EXPECT_EQ(S2::kMinArea.GetLevelForMaxValue(area), expected_level);
120
+ EXPECT_EQ(S2::kMinArea.GetLevelForMinValue(area), expected_level);
121
+ EXPECT_EQ(S2::kMinArea.GetClosestLevel(area), expected_level);
122
+ EXPECT_EQ(S2::kMinArea.GetLevelForMaxValue(1.2 * area), expected_level);
123
+ EXPECT_EQ(S2::kMinArea.GetLevelForMinValue(0.8 * area), expected_level);
124
+ EXPECT_EQ(S2::kMinArea.GetClosestLevel(1.2 * area), expected_level);
125
+ EXPECT_EQ(S2::kMinArea.GetClosestLevel(0.8 * area), expected_level);
126
+ }
127
+ }