@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,687 @@
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/s2cell.h"
19
+
20
+ #include <algorithm>
21
+ #include <cfloat>
22
+ #include <cmath>
23
+ #include <cstdio>
24
+ #include <map>
25
+ #include <utility>
26
+ #include <vector>
27
+
28
+ #include <gtest/gtest.h>
29
+
30
+ #include "s2/base/logging.h"
31
+ #include "s2/mutable_s2shape_index.h"
32
+ #include "s2/r2.h"
33
+ #include "s2/r2rect.h"
34
+ #include "s2/s1angle.h"
35
+ #include "s2/s1chord_angle.h"
36
+ #include "s2/s1interval.h"
37
+ #include "s2/s2cap.h"
38
+ #include "s2/s2crossing_edge_query.h"
39
+ #include "s2/s2edge_crossings.h"
40
+ #include "s2/s2edge_distances.h"
41
+ #include "s2/s2latlng.h"
42
+ #include "s2/s2latlng_rect.h"
43
+ #include "s2/s2latlng_rect_bounder.h"
44
+ #include "s2/s2loop.h"
45
+ #include "s2/s2metrics.h"
46
+ #include "s2/s2pointutil.h"
47
+ #include "s2/s2testing.h"
48
+ #include "s2/s2text_format.h"
49
+ #include "s2/third_party/absl/base/macros.h"
50
+ #include "s2/third_party/absl/memory/memory.h"
51
+ #include "s2/third_party/absl/strings/str_cat.h"
52
+
53
+ using absl::StrCat;
54
+ using S2::internal::kSwapMask;
55
+ using s2textformat::MakePointOrDie;
56
+ using std::fabs;
57
+ using std::map;
58
+ using std::max;
59
+ using std::min;
60
+ using std::pow;
61
+ using std::vector;
62
+
63
+ TEST(S2Cell, TestFaces) {
64
+ map<S2Point, int> edge_counts;
65
+ map<S2Point, int> vertex_counts;
66
+ for (int face = 0; face < 6; ++face) {
67
+ S2CellId id = S2CellId::FromFace(face);
68
+ S2Cell cell(id);
69
+ EXPECT_EQ(id, cell.id());
70
+ EXPECT_EQ(face, cell.face());
71
+ EXPECT_EQ(0, cell.level());
72
+ // Top-level faces have alternating orientations to get RHS coordinates.
73
+ EXPECT_EQ(face & kSwapMask, cell.orientation());
74
+ EXPECT_FALSE(cell.is_leaf());
75
+ for (int k = 0; k < 4; ++k) {
76
+ edge_counts[cell.GetEdgeRaw(k)] += 1;
77
+ vertex_counts[cell.GetVertexRaw(k)] += 1;
78
+ EXPECT_DOUBLE_EQ(0.0, cell.GetVertexRaw(k).DotProd(cell.GetEdgeRaw(k)));
79
+ EXPECT_DOUBLE_EQ(0.0,
80
+ cell.GetVertexRaw(k + 1).DotProd(cell.GetEdgeRaw(k)));
81
+ EXPECT_DOUBLE_EQ(1.0,
82
+ cell.GetVertexRaw(k).CrossProd(cell.GetVertexRaw(k + 1)).
83
+ Normalize().DotProd(cell.GetEdge(k)));
84
+ }
85
+ }
86
+ // Check that edges have multiplicity 2 and vertices have multiplicity 3.
87
+ for (const auto& p : edge_counts) {
88
+ EXPECT_EQ(2, p.second);
89
+ }
90
+ for (const auto& p : vertex_counts) {
91
+ EXPECT_EQ(3, p.second);
92
+ }
93
+ }
94
+
95
+ struct LevelStats {
96
+ double count;
97
+ double min_area, max_area, avg_area;
98
+ double min_width, max_width, avg_width;
99
+ double min_edge, max_edge, avg_edge, max_edge_aspect;
100
+ double min_diag, max_diag, avg_diag, max_diag_aspect;
101
+ double min_angle_span, max_angle_span, avg_angle_span;
102
+ double min_approx_ratio, max_approx_ratio;
103
+ LevelStats()
104
+ : count(0), min_area(100), max_area(0), avg_area(0),
105
+ min_width(100), max_width(0), avg_width(0),
106
+ min_edge(100), max_edge(0), avg_edge(0), max_edge_aspect(0),
107
+ min_diag(100), max_diag(0), avg_diag(0), max_diag_aspect(0),
108
+ min_angle_span(100), max_angle_span(0), avg_angle_span(0),
109
+ min_approx_ratio(100), max_approx_ratio(0) {}
110
+ };
111
+ static vector<LevelStats> level_stats(S2CellId::kMaxLevel+1);
112
+
113
+ static void GatherStats(const S2Cell& cell) {
114
+ LevelStats* s = &level_stats[cell.level()];
115
+ double exact_area = cell.ExactArea();
116
+ double approx_area = cell.ApproxArea();
117
+ double min_edge = 100, max_edge = 0, avg_edge = 0;
118
+ double min_diag = 100, max_diag = 0;
119
+ double min_width = 100, max_width = 0;
120
+ double min_angle_span = 100, max_angle_span = 0;
121
+ for (int i = 0; i < 4; ++i) {
122
+ double edge = cell.GetVertexRaw(i).Angle(cell.GetVertexRaw(i + 1));
123
+ min_edge = min(edge, min_edge);
124
+ max_edge = max(edge, max_edge);
125
+ avg_edge += 0.25 * edge;
126
+ S2Point mid = cell.GetVertexRaw(i) + cell.GetVertexRaw(i + 1);
127
+ double width = M_PI_2 - mid.Angle(cell.GetEdgeRaw(i + 2));
128
+ min_width = min(width, min_width);
129
+ max_width = max(width, max_width);
130
+ if (i < 2) {
131
+ double diag = cell.GetVertexRaw(i).Angle(cell.GetVertexRaw(i + 2));
132
+ min_diag = min(diag, min_diag);
133
+ max_diag = max(diag, max_diag);
134
+ double angle_span = cell.GetEdgeRaw(i).Angle(-cell.GetEdgeRaw(i + 2));
135
+ min_angle_span = min(angle_span, min_angle_span);
136
+ max_angle_span = max(angle_span, max_angle_span);
137
+ }
138
+ }
139
+ s->count += 1;
140
+ s->min_area = min(exact_area, s->min_area);
141
+ s->max_area = max(exact_area, s->max_area);
142
+ s->avg_area += exact_area;
143
+ s->min_width = min(min_width, s->min_width);
144
+ s->max_width = max(max_width, s->max_width);
145
+ s->avg_width += 0.5 * (min_width + max_width);
146
+ s->min_edge = min(min_edge, s->min_edge);
147
+ s->max_edge = max(max_edge, s->max_edge);
148
+ s->avg_edge += avg_edge;
149
+ s->max_edge_aspect = max(max_edge / min_edge, s->max_edge_aspect);
150
+ s->min_diag = min(min_diag, s->min_diag);
151
+ s->max_diag = max(max_diag, s->max_diag);
152
+ s->avg_diag += 0.5 * (min_diag + max_diag);
153
+ s->max_diag_aspect = max(max_diag / min_diag, s->max_diag_aspect);
154
+ s->min_angle_span = min(min_angle_span, s->min_angle_span);
155
+ s->max_angle_span = max(max_angle_span, s->max_angle_span);
156
+ s->avg_angle_span += 0.5 * (min_angle_span + max_angle_span);
157
+ double approx_ratio = approx_area / exact_area;
158
+ s->min_approx_ratio = min(approx_ratio, s->min_approx_ratio);
159
+ s->max_approx_ratio = max(approx_ratio, s->max_approx_ratio);
160
+ }
161
+
162
+ static void TestSubdivide(const S2Cell& cell) {
163
+ GatherStats(cell);
164
+ if (cell.is_leaf()) return;
165
+
166
+ S2Cell children[4];
167
+ S2_CHECK(cell.Subdivide(children));
168
+ S2CellId child_id = cell.id().child_begin();
169
+ double exact_area = 0;
170
+ double approx_area = 0;
171
+ double average_area = 0;
172
+ for (int i = 0; i < 4; ++i, child_id = child_id.next()) {
173
+ exact_area += children[i].ExactArea();
174
+ approx_area += children[i].ApproxArea();
175
+ average_area += children[i].AverageArea();
176
+
177
+ // Check that the child geometry is consistent with its cell ID.
178
+ EXPECT_EQ(child_id, children[i].id());
179
+ EXPECT_TRUE(S2::ApproxEquals(children[i].GetCenter(), child_id.ToPoint()));
180
+ S2Cell direct(child_id);
181
+ EXPECT_EQ(direct.face(), children[i].face());
182
+ EXPECT_EQ(direct.level(), children[i].level());
183
+ EXPECT_EQ(direct.orientation(), children[i].orientation());
184
+ EXPECT_EQ(direct.GetCenterRaw(), children[i].GetCenterRaw());
185
+ for (int k = 0; k < 4; ++k) {
186
+ EXPECT_EQ(direct.GetVertexRaw(k), children[i].GetVertexRaw(k));
187
+ EXPECT_EQ(direct.GetEdgeRaw(k), children[i].GetEdgeRaw(k));
188
+ }
189
+
190
+ // Test Contains() and MayIntersect().
191
+ EXPECT_TRUE(cell.Contains(children[i]));
192
+ EXPECT_TRUE(cell.MayIntersect(children[i]));
193
+ EXPECT_FALSE(children[i].Contains(cell));
194
+ EXPECT_TRUE(cell.Contains(children[i].GetCenterRaw()));
195
+ for (int j = 0; j < 4; ++j) {
196
+ EXPECT_TRUE(cell.Contains(children[i].GetVertexRaw(j)));
197
+ if (j != i) {
198
+ EXPECT_FALSE(children[i].Contains(children[j].GetCenterRaw()));
199
+ EXPECT_FALSE(children[i].MayIntersect(children[j]));
200
+ }
201
+ }
202
+
203
+ // Test GetCapBound and GetRectBound.
204
+ S2Cap parent_cap = cell.GetCapBound();
205
+ S2LatLngRect parent_rect = cell.GetRectBound();
206
+ if (cell.Contains(S2Point(0, 0, 1)) || cell.Contains(S2Point(0, 0, -1))) {
207
+ EXPECT_TRUE(parent_rect.lng().is_full());
208
+ }
209
+ S2Cap child_cap = children[i].GetCapBound();
210
+ S2LatLngRect child_rect = children[i].GetRectBound();
211
+ EXPECT_TRUE(child_cap.Contains(children[i].GetCenter()));
212
+ EXPECT_TRUE(child_rect.Contains(children[i].GetCenterRaw()));
213
+ EXPECT_TRUE(parent_cap.Contains(children[i].GetCenter()));
214
+ EXPECT_TRUE(parent_rect.Contains(children[i].GetCenterRaw()));
215
+ for (int j = 0; j < 4; ++j) {
216
+ EXPECT_TRUE(child_cap.Contains(children[i].GetVertex(j)));
217
+ EXPECT_TRUE(child_rect.Contains(children[i].GetVertex(j)));
218
+ EXPECT_TRUE(child_rect.Contains(children[i].GetVertexRaw(j)));
219
+ EXPECT_TRUE(parent_cap.Contains(children[i].GetVertex(j)));
220
+ EXPECT_TRUE(parent_rect.Contains(children[i].GetVertex(j)));
221
+ EXPECT_TRUE(parent_rect.Contains(children[i].GetVertexRaw(j)));
222
+ if (j != i) {
223
+ // The bounding caps and rectangles should be tight enough so that
224
+ // they exclude at least two vertices of each adjacent cell.
225
+ int cap_count = 0;
226
+ int rect_count = 0;
227
+ for (int k = 0; k < 4; ++k) {
228
+ if (child_cap.Contains(children[j].GetVertex(k)))
229
+ ++cap_count;
230
+ if (child_rect.Contains(children[j].GetVertexRaw(k)))
231
+ ++rect_count;
232
+ }
233
+ EXPECT_LE(cap_count, 2);
234
+ if (child_rect.lat_lo().radians() > -M_PI_2 &&
235
+ child_rect.lat_hi().radians() < M_PI_2) {
236
+ // Bounding rectangles may be too large at the poles because the
237
+ // pole itself has an arbitrary fixed longitude.
238
+ EXPECT_LE(rect_count, 2);
239
+ }
240
+ }
241
+ }
242
+
243
+ // Check all children for the first few levels, and then sample randomly.
244
+ // We also always subdivide the cells containing a few chosen points so
245
+ // that we have a better chance of sampling the minimum and maximum metric
246
+ // values. kMaxSizeUV is the absolute value of the u- and v-coordinate
247
+ // where the cell size at a given level is maximal.
248
+ const double kMaxSizeUV = 0.3964182625366691;
249
+ const R2Point special_uv[] = {
250
+ R2Point(DBL_EPSILON, DBL_EPSILON), // Face center
251
+ R2Point(DBL_EPSILON, 1), // Edge midpoint
252
+ R2Point(1, 1), // Face corner
253
+ R2Point(kMaxSizeUV, kMaxSizeUV), // Largest cell area
254
+ R2Point(DBL_EPSILON, kMaxSizeUV), // Longest edge/diagonal
255
+ };
256
+ bool force_subdivide = false;
257
+ for (const R2Point& uv : special_uv) {
258
+ if (children[i].GetBoundUV().Contains(uv))
259
+ force_subdivide = true;
260
+ }
261
+ if (force_subdivide ||
262
+ cell.level() < (google::DEBUG_MODE ? 5 : 6) ||
263
+ S2Testing::rnd.OneIn(google::DEBUG_MODE ? 5 : 4)) {
264
+ TestSubdivide(children[i]);
265
+ }
266
+ }
267
+
268
+ // Check sum of child areas equals parent area.
269
+ //
270
+ // For ExactArea(), the best relative error we can expect is about 1e-6
271
+ // because the precision of the unit vector coordinates is only about 1e-15
272
+ // and the edge length of a leaf cell is about 1e-9.
273
+ //
274
+ // For ApproxArea(), the areas are accurate to within a few percent.
275
+ //
276
+ // For AverageArea(), the areas themselves are not very accurate, but
277
+ // the average area of a parent is exactly 4 times the area of a child.
278
+
279
+ EXPECT_LE(fabs(log(exact_area / cell.ExactArea())), fabs(log(1 + 1e-6)));
280
+ EXPECT_LE(fabs(log(approx_area / cell.ApproxArea())), fabs(log(1.03)));
281
+ EXPECT_LE(fabs(log(average_area / cell.AverageArea())), fabs(log(1 + 1e-15)));
282
+ }
283
+
284
+ template <int dim>
285
+ static void CheckMinMaxAvg(
286
+ const char* label, int level, double count, double abs_error,
287
+ double min_value, double max_value, double avg_value,
288
+ const S2::Metric<dim>& min_metric,
289
+ const S2::Metric<dim>& max_metric,
290
+ const S2::Metric<dim>& avg_metric) {
291
+
292
+ // All metrics are minimums, maximums, or averages of differential
293
+ // quantities, and therefore will not be exact for cells at any finite
294
+ // level. The differential minimum is always a lower bound, and the maximum
295
+ // is always an upper bound, but these minimums and maximums may not be
296
+ // achieved for two different reasons. First, the cells at each level are
297
+ // sampled and we may miss the most extreme examples. Second, the actual
298
+ // metric for a cell is obtained by integrating the differential quantity,
299
+ // which is not constant across the cell. Therefore cells at low levels
300
+ // (bigger cells) have smaller variations.
301
+ //
302
+ // The "tolerance" below is an attempt to model both of these effects.
303
+ // At low levels, error is dominated by the variation of differential
304
+ // quantities across the cells, while at high levels error is dominated by
305
+ // the effects of random sampling.
306
+ double tolerance = (max_metric.GetValue(level) - min_metric.GetValue(level)) /
307
+ sqrt(min(count, 0.5 * double(1 << level)));
308
+ if (tolerance == 0) tolerance = abs_error;
309
+
310
+ double min_error = min_value - min_metric.GetValue(level);
311
+ double max_error = max_metric.GetValue(level) - max_value;
312
+ double avg_error = fabs(avg_metric.GetValue(level) - avg_value);
313
+ printf("%-10s (%6.0f samples, tolerance %8.3g) - min %9.4g (%9.3g : %9.3g) "
314
+ "max %9.4g (%9.3g : %9.3g), avg %9.4g (%9.3g : %9.3g)\n",
315
+ label, count, tolerance,
316
+ min_value, min_error / min_value, min_error / tolerance,
317
+ max_value, max_error / max_value, max_error / tolerance,
318
+ avg_value, avg_error / avg_value, avg_error / tolerance);
319
+
320
+ EXPECT_LE(min_metric.GetValue(level), min_value + abs_error);
321
+ EXPECT_GE(min_metric.GetValue(level), min_value - tolerance);
322
+ EXPECT_LE(max_metric.GetValue(level), max_value + tolerance);
323
+ EXPECT_GE(max_metric.GetValue(level), max_value - abs_error);
324
+ EXPECT_NEAR(avg_metric.GetValue(level), avg_value, 10 * tolerance);
325
+ }
326
+
327
+ TEST(S2Cell, TestSubdivide) {
328
+ // Only test a sample of faces to reduce the runtime.
329
+ TestSubdivide(S2Cell::FromFace(0));
330
+ TestSubdivide(S2Cell::FromFace(3));
331
+ TestSubdivide(S2Cell::FromFace(5));
332
+
333
+ // This table is useful in evaluating the quality of the various S2
334
+ // projections.
335
+ //
336
+ // The maximum edge *ratio* is the ratio of the longest edge of any cell to
337
+ // the shortest edge of any cell at the same level (and similarly for the
338
+ // maximum diagonal ratio).
339
+ //
340
+ // The maximum edge *aspect* is the maximum ratio of the longest edge of a
341
+ // cell to the shortest edge of that same cell (and similarly for the
342
+ // maximum diagonal aspect).
343
+ printf(
344
+ "Ratio: (Max value for any cell) / (Min value for any cell)\n"
345
+ "Aspect: (Max value / min value) for any cell\n"
346
+ " Edge Diag Approx Area/ Avg Area/\n"
347
+ " Area Length Length Exact Area Exact Area\n"
348
+ "Level Ratio Ratio Aspect Ratio Aspect Min Max Min Max\n"
349
+ "--------------------------------------------------------------------\n");
350
+ for (int i = 0; i <= S2CellId::kMaxLevel; ++i) {
351
+ LevelStats* s = &level_stats[i];
352
+ if (s->count > 0) {
353
+ s->avg_area /= s->count;
354
+ s->avg_width /= s->count;
355
+ s->avg_edge /= s->count;
356
+ s->avg_diag /= s->count;
357
+ s->avg_angle_span /= s->count;
358
+ }
359
+ printf("%5d %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\n",
360
+ i, s->max_area / s->min_area,
361
+ s->max_edge / s->min_edge, s->max_edge_aspect,
362
+ s->max_diag / s->min_diag, s->max_diag_aspect,
363
+ s->min_approx_ratio, s->max_approx_ratio,
364
+ S2Cell::AverageArea(i) / s->max_area,
365
+ S2Cell::AverageArea(i) / s->min_area);
366
+ }
367
+
368
+ // Now check the validity of the S2 length and area metrics.
369
+ for (int i = 0; i <= S2CellId::kMaxLevel; ++i) {
370
+ const LevelStats* s = &level_stats[i];
371
+ if (s->count == 0) continue;
372
+
373
+ printf("Level %2d - metric value (error/actual : error/tolerance)\n", i);
374
+
375
+ // The various length calculations are only accurate to 1e-15 or so,
376
+ // so we need to allow for this amount of discrepancy with the theoretical
377
+ // minimums and maximums. The area calculation is accurate to about 1e-15
378
+ // times the cell width.
379
+ CheckMinMaxAvg("area", i, s->count, 1e-15 * s->min_width,
380
+ s->min_area, s->max_area, s->avg_area,
381
+ S2::kMinArea, S2::kMaxArea, S2::kAvgArea);
382
+ CheckMinMaxAvg("width", i, s->count, 1e-15,
383
+ s->min_width, s->max_width, s->avg_width,
384
+ S2::kMinWidth, S2::kMaxWidth, S2::kAvgWidth);
385
+ CheckMinMaxAvg("edge", i, s->count, 1e-15,
386
+ s->min_edge, s->max_edge, s->avg_edge,
387
+ S2::kMinEdge, S2::kMaxEdge, S2::kAvgEdge);
388
+ CheckMinMaxAvg("diagonal", i, s->count, 1e-15,
389
+ s->min_diag, s->max_diag, s->avg_diag,
390
+ S2::kMinDiag, S2::kMaxDiag, S2::kAvgDiag);
391
+ CheckMinMaxAvg("angle span", i, s->count, 1e-15,
392
+ s->min_angle_span, s->max_angle_span, s->avg_angle_span,
393
+ S2::kMinAngleSpan, S2::kMaxAngleSpan, S2::kAvgAngleSpan);
394
+
395
+ // The aspect ratio calculations are ratios of lengths and are therefore
396
+ // less accurate at higher subdivision levels.
397
+ EXPECT_LE(s->max_edge_aspect, S2::kMaxEdgeAspect + 1e-15 * (1 << i));
398
+ EXPECT_LE(s->max_diag_aspect, S2::kMaxDiagAspect + 1e-15 * (1 << i));
399
+ }
400
+ }
401
+
402
+ TEST(S2Cell, CellVsLoopRectBound) {
403
+ // This test verifies that the S2Cell and S2Loop bounds contain each other
404
+ // to within their maximum errors.
405
+ //
406
+ // The S2Cell and S2Loop calculations for the latitude of a vertex can differ
407
+ // by up to 2 * DBL_EPSILON, therefore the S2Cell bound should never exceed
408
+ // the S2Loop bound by more than this (the reverse is not true, because the
409
+ // S2Loop code sometimes thinks that the maximum occurs along an edge).
410
+ // Similarly, the longitude bounds can differ by up to 4 * DBL_EPSILON since
411
+ // the S2Cell bound has an error of 2 * DBL_EPSILON and then expands by this
412
+ // amount, while the S2Loop bound does no expansion at all.
413
+
414
+ // Possible additional S2Cell error compared to S2Loop error:
415
+ static S2LatLng kCellError = S2LatLng::FromRadians(2 * DBL_EPSILON,
416
+ 4 * DBL_EPSILON);
417
+ // Possible additional S2Loop error compared to S2Cell error:
418
+ static S2LatLng kLoopError = S2LatLngRectBounder::MaxErrorForTests();
419
+
420
+ for (int iter = 0; iter < 1000; ++iter) {
421
+ S2Cell cell(S2Testing::GetRandomCellId());
422
+ S2Loop loop(cell);
423
+ S2LatLngRect cell_bound = cell.GetRectBound();
424
+ S2LatLngRect loop_bound = loop.GetRectBound();
425
+ EXPECT_TRUE(loop_bound.Expanded(kCellError).Contains(cell_bound));
426
+ EXPECT_TRUE(cell_bound.Expanded(kLoopError).Contains(loop_bound));
427
+ }
428
+ }
429
+
430
+ TEST(S2Cell, RectBoundIsLargeEnough) {
431
+ // Construct many points that are nearly on an S2Cell edge, and verify that
432
+ // whenever the cell contains a point P then its bound contains S2LatLng(P).
433
+
434
+ for (int iter = 0; iter < 1000; /* advanced in loop below */) {
435
+ S2Cell cell(S2Testing::GetRandomCellId());
436
+ int i = S2Testing::rnd.Uniform(4);
437
+ S2Point v1 = cell.GetVertex(i);
438
+ S2Point v2 = S2Testing::SamplePoint(
439
+ S2Cap(cell.GetVertex(i + 1), S1Angle::Radians(1e-15)));
440
+ S2Point p = S2::Interpolate(S2Testing::rnd.RandDouble(), v1, v2);
441
+ if (S2Loop(cell).Contains(p)) {
442
+ EXPECT_TRUE(cell.GetRectBound().Contains(S2LatLng(p)));
443
+ ++iter;
444
+ }
445
+ }
446
+ }
447
+
448
+ TEST(S2Cell, ConsistentWithS2CellIdFromPoint) {
449
+ // Construct many points that are nearly on an S2Cell edge, and verify that
450
+ // S2Cell(S2CellId(p)).Contains(p) is always true.
451
+
452
+ for (int iter = 0; iter < 1000; ++iter) {
453
+ S2Cell cell(S2Testing::GetRandomCellId());
454
+ int i = S2Testing::rnd.Uniform(4);
455
+ S2Point v1 = cell.GetVertex(i);
456
+ S2Point v2 = S2Testing::SamplePoint(
457
+ S2Cap(cell.GetVertex(i + 1), S1Angle::Radians(1e-15)));
458
+ S2Point p = S2::Interpolate(S2Testing::rnd.RandDouble(), v1, v2);
459
+ EXPECT_TRUE(S2Cell(S2CellId(p)).Contains(p));
460
+ }
461
+ }
462
+
463
+ TEST(S2CellId, AmbiguousContainsPoint) {
464
+ // This tests a case where S2CellId returns the "wrong" cell for a point
465
+ // that is very close to the cell edge. (ConsistentWithS2CellIdFromPoint
466
+ // generates more examples like this.)
467
+ //
468
+ // The S2Point below should have x = 0, but conversion from latlng to
469
+ // (x,y,z) gives x = 6.1e-17. When xyz is converted to uv, this gives u =
470
+ // -6.1e-17. However when converting to st, which is centered at 0.5 rather
471
+ // than 0, the low precision bits of u are lost and we wind up with s = 0.5.
472
+ // S2CellId(const S2Point&) then chooses an arbitrary neighboring cell.
473
+ //
474
+ // This tests that S2Cell::Contains() expands the cell bounds sufficiently
475
+ // so that the returned cell is still considered to contain "p".
476
+ S2Point p = S2LatLng::FromDegrees(-2, 90).ToPoint();
477
+ S2CellId cell_id = S2CellId(p).parent(1);
478
+ S2Cell cell(cell_id);
479
+ EXPECT_TRUE(cell.Contains(p));
480
+ }
481
+
482
+ static S1ChordAngle GetDistanceToPointBruteForce(const S2Cell& cell,
483
+ const S2Point& target) {
484
+ S1ChordAngle min_distance = S1ChordAngle::Infinity();
485
+ for (int i = 0; i < 4; ++i) {
486
+ S2::UpdateMinDistance(target, cell.GetVertex(i),
487
+ cell.GetVertex(i + 1), &min_distance);
488
+ }
489
+ return min_distance;
490
+ }
491
+
492
+ static S1ChordAngle GetMaxDistanceToPointBruteForce(const S2Cell& cell,
493
+ const S2Point& target) {
494
+ if (cell.Contains(-target)) {
495
+ return S1ChordAngle::Straight();
496
+ }
497
+ S1ChordAngle max_distance = S1ChordAngle::Negative();
498
+ for (int i = 0; i < 4; ++i) {
499
+ S2::UpdateMaxDistance(target, cell.GetVertex(i),
500
+ cell.GetVertex(i + 1), &max_distance);
501
+ }
502
+ return max_distance;
503
+ }
504
+
505
+ TEST(S2Cell, GetDistanceToPoint) {
506
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
507
+ for (int iter = 0; iter < 1000; ++iter) {
508
+ SCOPED_TRACE(StrCat("Iteration ", iter));
509
+ S2Cell cell(S2Testing::GetRandomCellId());
510
+ S2Point target = S2Testing::RandomPoint();
511
+ S1Angle expected_to_boundary =
512
+ GetDistanceToPointBruteForce(cell, target).ToAngle();
513
+ S1Angle expected_to_interior =
514
+ cell.Contains(target) ? S1Angle::Zero() : expected_to_boundary;
515
+ S1Angle expected_max =
516
+ GetMaxDistanceToPointBruteForce(cell, target).ToAngle();
517
+ S1Angle actual_to_boundary = cell.GetBoundaryDistance(target).ToAngle();
518
+ S1Angle actual_to_interior = cell.GetDistance(target).ToAngle();
519
+ S1Angle actual_max = cell.GetMaxDistance(target).ToAngle();
520
+ // The error has a peak near Pi/2 for edge distance, and another peak near
521
+ // Pi for vertex distance.
522
+ EXPECT_NEAR(expected_to_boundary.radians(),
523
+ actual_to_boundary.radians(), 1e-12);
524
+ EXPECT_NEAR(expected_to_interior.radians(),
525
+ actual_to_interior.radians(), 1e-12);
526
+ EXPECT_NEAR(expected_max.radians(),
527
+ actual_max.radians(), 1e-12);
528
+ if (expected_to_boundary.radians() <= M_PI / 3) {
529
+ EXPECT_NEAR(expected_to_boundary.radians(),
530
+ actual_to_boundary.radians(), 1e-15);
531
+ EXPECT_NEAR(expected_to_interior.radians(),
532
+ actual_to_interior.radians(), 1e-15);
533
+ }
534
+ if (expected_max.radians() <= M_PI / 3) {
535
+ EXPECT_NEAR(expected_max.radians(), actual_max.radians(), 1e-15);
536
+ }
537
+ }
538
+ }
539
+
540
+ static void ChooseEdgeNearCell(const S2Cell& cell, S2Point* a, S2Point* b) {
541
+ S2Cap cap = cell.GetCapBound();
542
+ if (S2Testing::rnd.OneIn(5)) {
543
+ // Choose a point anywhere on the sphere.
544
+ *a = S2Testing::RandomPoint();
545
+ } else {
546
+ // Choose a point inside or somewhere near the cell.
547
+ *a = S2Testing::SamplePoint(S2Cap(cap.center(), 1.5 * cap.GetRadius()));
548
+ }
549
+ // Now choose a maximum edge length ranging from very short to very long
550
+ // relative to the cell size, and choose the other endpoint.
551
+ double max_length = min(100 * pow(1e-4, S2Testing::rnd.RandDouble()) *
552
+ cap.GetRadius().radians(), M_PI_2);
553
+ *b = S2Testing::SamplePoint(S2Cap(*a, S1Angle::Radians(max_length)));
554
+
555
+ if (S2Testing::rnd.OneIn(20)) {
556
+ // Occasionally replace edge with antipodal edge.
557
+ *a = -*a;
558
+ *b = -*b;
559
+ }
560
+ }
561
+
562
+ static S1ChordAngle GetDistanceToEdgeBruteForce(
563
+ const S2Cell& cell, const S2Point& a, const S2Point& b) {
564
+ if (cell.Contains(a) || cell.Contains(b)) {
565
+ return S1ChordAngle::Zero();
566
+ }
567
+
568
+ S1ChordAngle min_dist = S1ChordAngle::Infinity();
569
+ for (int i = 0; i < 4; ++i) {
570
+ S2Point v0 = cell.GetVertex(i);
571
+ S2Point v1 = cell.GetVertex(i + 1);
572
+ // If the edge crosses through the cell, max distance is 0.
573
+ if (S2::CrossingSign(a, b, v0, v1) >= 0) {
574
+ return S1ChordAngle::Zero();
575
+ }
576
+ S2::UpdateMinDistance(a, v0, v1, &min_dist);
577
+ S2::UpdateMinDistance(b, v0, v1, &min_dist);
578
+ S2::UpdateMinDistance(v0, a, b, &min_dist);
579
+ }
580
+ return min_dist;
581
+ }
582
+
583
+ static S1ChordAngle GetMaxDistanceToEdgeBruteForce(
584
+ const S2Cell& cell, const S2Point& a, const S2Point& b) {
585
+ // If any antipodal endpoint is within the cell, the max distance is Pi.
586
+ if (cell.Contains(-a) || cell.Contains(-b)) {
587
+ return S1ChordAngle::Straight();
588
+ }
589
+
590
+ S1ChordAngle max_dist = S1ChordAngle::Negative();
591
+ for (int i = 0; i < 4; ++i) {
592
+ S2Point v0 = cell.GetVertex(i);
593
+ S2Point v1 = cell.GetVertex(i + 1);
594
+ // If the antipodal edge crosses through the cell, max distance is Pi.
595
+ if (S2::CrossingSign(-a, -b, v0, v1) >= 0) {
596
+ return S1ChordAngle::Straight();
597
+ }
598
+ S2::UpdateMaxDistance(a, v0, v1, &max_dist);
599
+ S2::UpdateMaxDistance(b, v0, v1, &max_dist);
600
+ S2::UpdateMaxDistance(v0, a, b, &max_dist);
601
+ }
602
+ return max_dist;
603
+ }
604
+
605
+ TEST(S2Cell, GetDistanceToEdge) {
606
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
607
+ for (int iter = 0; iter < 1000; ++iter) {
608
+ SCOPED_TRACE(StrCat("Iteration ", iter));
609
+ S2Cell cell(S2Testing::GetRandomCellId());
610
+ S2Point a, b;
611
+ ChooseEdgeNearCell(cell, &a, &b);
612
+ S1Angle expected_min = GetDistanceToEdgeBruteForce(cell, a, b).ToAngle();
613
+ S1Angle expected_max =
614
+ GetMaxDistanceToEdgeBruteForce(cell, a, b).ToAngle();
615
+ S1Angle actual_min = cell.GetDistance(a, b).ToAngle();
616
+ S1Angle actual_max = cell.GetMaxDistance(a, b).ToAngle();
617
+ // The error has a peak near Pi/2 for edge distance, and another peak near
618
+ // Pi for vertex distance.
619
+ if (expected_min.radians() > M_PI/2) {
620
+ // Max error for S1ChordAngle as it approaches Pi is about 2e-8.
621
+ EXPECT_NEAR(expected_min.radians(), actual_min.radians(), 2e-8);
622
+ } else if (expected_min.radians() <= M_PI / 3) {
623
+ EXPECT_NEAR(expected_min.radians(), actual_min.radians(), 1e-15);
624
+ } else {
625
+ EXPECT_NEAR(expected_min.radians(), actual_min.radians(), 1e-12);
626
+ }
627
+
628
+ EXPECT_NEAR(expected_max.radians(), actual_max.radians(), 1e-12);
629
+ if (expected_max.radians() <= M_PI / 3) {
630
+ EXPECT_NEAR(expected_max.radians(), actual_max.radians(), 1e-15);
631
+ }
632
+ }
633
+ }
634
+
635
+ TEST(S2Cell, GetMaxDistanceToEdge) {
636
+ // Test an edge for which its antipode crosses the cell. Validates both the
637
+ // standard and brute force implementations for this case.
638
+ S2Cell cell = S2Cell::FromFacePosLevel(0, 0, 20);
639
+ S2Point a = -S2::Interpolate(2.0, cell.GetCenter(), cell.GetVertex(0));
640
+ S2Point b = -S2::Interpolate(2.0, cell.GetCenter(), cell.GetVertex(2));
641
+
642
+ S1ChordAngle actual = cell.GetMaxDistance(a, b);
643
+ S1ChordAngle expected = GetMaxDistanceToEdgeBruteForce(cell, a, b);
644
+
645
+ EXPECT_NEAR(expected.radians(), S1ChordAngle::Straight().radians(), 1e-15);
646
+ EXPECT_NEAR(actual.radians(), S1ChordAngle::Straight().radians(), 1e-15);
647
+ }
648
+
649
+ TEST(S2Cell, GetMaxDistanceToCellAntipodal) {
650
+ S2Point p = MakePointOrDie("0:0");
651
+ S2Cell cell(p);
652
+ S2Cell antipodal_cell(-p);
653
+ S1ChordAngle dist = cell.GetMaxDistance(antipodal_cell);
654
+ EXPECT_EQ(S1ChordAngle::Straight(), dist);
655
+ }
656
+
657
+ TEST(S2Cell, GetMaxDistanceToCell) {
658
+ for (int i = 0; i < 1000; i++) {
659
+ S2Cell cell(S2Testing::GetRandomCellId());
660
+ S2Cell test_cell(S2Testing::GetRandomCellId());
661
+ S2CellId antipodal_leaf_id(-test_cell.GetCenter());
662
+ S2Cell antipodal_test_cell(antipodal_leaf_id.parent(test_cell.level()));
663
+
664
+ S1ChordAngle dist_from_min = S1ChordAngle::Straight() -
665
+ cell.GetDistance(antipodal_test_cell);
666
+ S1ChordAngle dist_from_max = cell.GetMaxDistance(test_cell);
667
+ EXPECT_NEAR(dist_from_min.radians(), dist_from_max.radians(), 1e-8);
668
+ }
669
+ }
670
+
671
+ TEST(S2Cell, EncodeDecode) {
672
+ S2Cell orig_cell(S2LatLng::FromDegrees(40.7406264, -74.0029963));
673
+ Encoder encoder;
674
+ orig_cell.Encode(&encoder);
675
+
676
+ S2Cell decoded_cell(S2LatLng::FromDegrees(51.494987, -0.146585));
677
+ Decoder decoder(encoder.base(), encoder.length());
678
+ decoded_cell.Decode(&decoder);
679
+
680
+ EXPECT_EQ(orig_cell, decoded_cell);
681
+ EXPECT_EQ(orig_cell.face(), decoded_cell.face());
682
+ EXPECT_EQ(orig_cell.level(), decoded_cell.level());
683
+ EXPECT_EQ(orig_cell.orientation(), decoded_cell.orientation());
684
+ EXPECT_EQ(orig_cell.id(), decoded_cell.id());
685
+ EXPECT_EQ(orig_cell.GetBoundUV(), decoded_cell.GetBoundUV());
686
+ }
687
+