@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,385 @@
1
+ // Copyright 2005 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2TESTING_H_
19
+ #define S2_S2TESTING_H_
20
+
21
+ #include <algorithm>
22
+ #include <memory>
23
+ #include <string>
24
+ #include <utility>
25
+ #include <vector>
26
+
27
+ #include "s2/base/commandlineflags.h"
28
+ #include "s2/base/integral_types.h"
29
+ #include "s2/_fp_contract_off.h"
30
+ #include "s2/r2.h"
31
+ #include "s2/s1angle.h"
32
+ #include "s2/s1chord_angle.h"
33
+ #include "s2/s2cell_id.h"
34
+ #include "s2/third_party/absl/base/macros.h"
35
+ #include "s2/util/math/matrix3x3.h"
36
+
37
+ class S1Angle;
38
+ class S2Cap;
39
+ class S2CellUnion;
40
+ class S2LatLng;
41
+ class S2LatLngRect;
42
+ class S2Loop;
43
+ class S2Polygon;
44
+ class S2Polyline;
45
+ class S2Region;
46
+
47
+ // You can optionally call S2Testing::rnd.Reset(FLAGS_s2_random_seed) at the
48
+ // start of a test or benchmark to ensure that its results do not depend on
49
+ // which other tests of benchmarks have run previously. This can help with
50
+ // debugging.
51
+ //
52
+ // This flag currently does *not* affect the initial seed value for
53
+ // S2Testing::rnd. TODO(user): Fix this.
54
+ S2_DECLARE_int32(s2_random_seed);
55
+
56
+ // This class defines various static functions that are useful for writing
57
+ // unit tests.
58
+ class S2Testing {
59
+ public:
60
+ // Returns a vector of points shaped as a regular polygon with
61
+ // num_vertices vertices, all on a circle of the specified angular
62
+ // radius around the center. The radius is the actual distance from
63
+ // the center to the circle along the sphere.
64
+ //
65
+ // If you want to construct a regular polygon, try this:
66
+ // S2Polygon polygon(S2Loop::MakeRegularLoop(center, radius, num_vertices));
67
+ static std::vector<S2Point> MakeRegularPoints(const S2Point& center,
68
+ S1Angle radius,
69
+ int num_vertices);
70
+
71
+ // Append the vertices of "loop" to "vertices".
72
+ static void AppendLoopVertices(const S2Loop& loop,
73
+ std::vector<S2Point>* vertices);
74
+
75
+ // A simple class that generates "Koch snowflake" fractals (see Wikipedia
76
+ // for an introduction). There is an option to control the fractal
77
+ // dimension (between 1.0 and 2.0); values between 1.02 and 1.50 are
78
+ // reasonable simulations of various coastlines. The default dimension
79
+ // (about 1.26) corresponds to the standard Koch snowflake. (The west coast
80
+ // of Britain has a fractal dimension of approximately 1.25.)
81
+ //
82
+ // The fractal is obtained by starting with an equilateral triangle and
83
+ // recursively subdividing each edge into four segments of equal length.
84
+ // Therefore the shape at level "n" consists of 3*(4**n) edges. Multi-level
85
+ // fractals are also supported: if you set min_level() to a non-negative
86
+ // value, then the recursive subdivision has an equal probability of
87
+ // stopping at any of the levels between the given min and max (inclusive).
88
+ // This yields a fractal where the perimeter of the original triangle is
89
+ // approximately equally divided between fractals at the various possible
90
+ // levels. If there are k distinct levels {min,..,max}, the expected number
91
+ // of edges at each level "i" is approximately 3*(4**i)/k.
92
+ class Fractal {
93
+ public:
94
+ // You must call set_max_level() or SetLevelForApproxMaxEdges() before
95
+ // calling MakeLoop().
96
+ Fractal();
97
+
98
+ // Set the maximum subdivision level for the fractal (see above).
99
+ // REQUIRES: max_level >= 0
100
+ void set_max_level(int max_level);
101
+ int max_level() const { return max_level_; }
102
+
103
+ // Set the minimum subdivision level for the fractal (see above). The
104
+ // default value of -1 causes the min and max levels to be the same. A
105
+ // min_level of 0 should be avoided since this creates a significant
106
+ // chance that none of the three original edges will be subdivided at all.
107
+ //
108
+ // DEFAULT: max_level()
109
+ void set_min_level(int min_level_arg);
110
+ int min_level() const { return min_level_arg_; }
111
+
112
+ // Set the min and/or max level to produce approximately the given number
113
+ // of edges. (The values are rounded to a nearby value of 3*(4**n).)
114
+ void SetLevelForApproxMinEdges(int min_edges);
115
+ void SetLevelForApproxMaxEdges(int max_edges);
116
+
117
+ // Set the fractal dimension. The default value of approximately 1.26
118
+ // corresponds to the stardard Koch curve. The value must lie in the
119
+ // range [1.0, 2.0).
120
+ //
121
+ // DEFAULT: log(4) / log(3) ~= 1.26
122
+ void set_fractal_dimension(double dimension);
123
+ double fractal_dimension() const { return dimension_; }
124
+
125
+ // Return a lower bound on ratio (Rmin / R), where "R" is the radius
126
+ // passed to MakeLoop() and "Rmin" is the minimum distance from the
127
+ // fractal boundary to its center, where all distances are measured in the
128
+ // tangent plane at the fractal's center. This can be used to inscribe
129
+ // another geometric figure within the fractal without intersection.
130
+ double min_radius_factor() const;
131
+
132
+ // Return the ratio (Rmax / R), where "R" is the radius passed to
133
+ // MakeLoop() and "Rmax" is the maximum distance from the fractal boundary
134
+ // to its center, where all distances are measured in the tangent plane at
135
+ // the fractal's center. This can be used to inscribe the fractal within
136
+ // some other geometric figure without intersection.
137
+ double max_radius_factor() const;
138
+
139
+ // Return a fractal loop centered around the z-axis of the given
140
+ // coordinate frame, with the first vertex in the direction of the
141
+ // positive x-axis. In order to avoid self-intersections, the fractal is
142
+ // generated by first drawing it in a 2D tangent plane to the unit sphere
143
+ // (touching at the fractal's center point) and then projecting the edges
144
+ // onto the sphere. This has the side effect of shrinking the fractal
145
+ // slightly compared to its nominal radius.
146
+ std::unique_ptr<S2Loop> MakeLoop(const Matrix3x3_d& frame,
147
+ S1Angle nominal_radius) const;
148
+
149
+ private:
150
+ void ComputeMinLevel();
151
+ void ComputeOffsets();
152
+ void GetR2Vertices(std::vector<R2Point>* vertices) const;
153
+ void GetR2VerticesHelper(const R2Point& v0, const R2Point& v4, int level,
154
+ std::vector<R2Point>* vertices) const;
155
+
156
+ int max_level_;
157
+ int min_level_arg_; // Value set by user
158
+ int min_level_; // Actual min level (depends on max_level_)
159
+ double dimension_;
160
+
161
+ // The ratio of the sub-edge length to the original edge length at each
162
+ // subdivision step.
163
+ double edge_fraction_;
164
+
165
+ // The distance from the original edge to the middle vertex at each
166
+ // subdivision step, as a fraction of the original edge length.
167
+ double offset_fraction_;
168
+
169
+ Fractal(const Fractal&) = delete;
170
+ void operator=(const Fractal&) = delete;
171
+ };
172
+
173
+ // Convert a distance on the Earth's surface to an angle.
174
+ // Do not use these methods in non-testing code; use s2earth.h instead.
175
+ static S1Angle MetersToAngle(double meters);
176
+ static S1Angle KmToAngle(double km);
177
+
178
+ // Convert an area in steradians (as returned by the S2 area methods) to
179
+ // square meters or square kilometers.
180
+ static double AreaToMeters2(double steradians);
181
+ static double AreaToKm2(double steradians);
182
+
183
+ // The Earth's mean radius in kilometers (according to NASA).
184
+ static const double kEarthRadiusKm;
185
+
186
+ // A deterministically-seeded random number generator.
187
+ class Random;
188
+
189
+ static Random rnd;
190
+
191
+ // Return a random unit-length vector.
192
+ static S2Point RandomPoint();
193
+
194
+ // Return a right-handed coordinate frame (three orthonormal vectors).
195
+ static void GetRandomFrame(S2Point* x, S2Point* y, S2Point* z);
196
+ static Matrix3x3_d GetRandomFrame();
197
+
198
+ // Given a unit-length z-axis, compute x- and y-axes such that (x,y,z) is a
199
+ // right-handed coordinate frame (three orthonormal vectors).
200
+ static void GetRandomFrameAt(const S2Point& z, S2Point* x, S2Point *y);
201
+ static Matrix3x3_d GetRandomFrameAt(const S2Point& z);
202
+
203
+ // Return a cap with a random axis such that the log of its area is
204
+ // uniformly distributed between the logs of the two given values.
205
+ // (The log of the cap angle is also approximately uniformly distributed.)
206
+ static S2Cap GetRandomCap(double min_area, double max_area);
207
+
208
+ // Return a point chosen uniformly at random (with respect to area)
209
+ // from the given cap.
210
+ static S2Point SamplePoint(const S2Cap& cap);
211
+
212
+ // Return a point chosen uniformly at random (with respect to area on the
213
+ // sphere) from the given latitude-longitude rectangle.
214
+ static S2Point SamplePoint(const S2LatLngRect& rect);
215
+
216
+ // Return a random cell id at the given level or at a randomly chosen
217
+ // level. The distribution is uniform over the space of cell ids,
218
+ // but only approximately uniform over the surface of the sphere.
219
+ static S2CellId GetRandomCellId(int level);
220
+ static S2CellId GetRandomCellId();
221
+
222
+ // Return a polygon with the specified center, number of concentric loops
223
+ // and vertices per loop.
224
+ static void ConcentricLoopsPolygon(const S2Point& center,
225
+ int num_loops,
226
+ int num_vertices_per_loop,
227
+ S2Polygon* polygon);
228
+
229
+ // Checks that "covering" completely covers the given region. If
230
+ // "check_tight" is true, also checks that it does not contain any cells
231
+ // that do not intersect the given region. ("id" is only used internally.)
232
+ static void CheckCovering(const S2Region& region,
233
+ const S2CellUnion& covering,
234
+ bool check_tight,
235
+ S2CellId id = S2CellId());
236
+
237
+ private:
238
+ // Contains static methods
239
+ S2Testing() = delete;
240
+ S2Testing(const S2Testing&) = delete;
241
+ void operator=(const S2Testing&) = delete;
242
+ };
243
+
244
+ // Functions in this class return random numbers that are as good as random()
245
+ // is. The results are reproducible since the seed is deterministic. This
246
+ // class is *NOT* thread-safe; it is only intended for testing purposes.
247
+ class S2Testing::Random {
248
+ public:
249
+ // Initialize using a deterministic seed.
250
+ Random();
251
+
252
+ // Reset the generator state using the given seed.
253
+ void Reset(int32 seed);
254
+
255
+ // Return a uniformly distributed 64-bit unsigned integer.
256
+ uint64 Rand64();
257
+
258
+ // Return a uniformly distributed 32-bit unsigned integer.
259
+ uint32 Rand32();
260
+
261
+ // Return a uniformly distributed "double" in the range [0,1). Note that
262
+ // the values returned are all multiples of 2**-53, which means that not all
263
+ // possible values in this range are returned.
264
+ double RandDouble();
265
+
266
+ // Return a uniformly distributed integer in the range [0,n).
267
+ int32 Uniform(int32 n);
268
+
269
+ // Return a uniformly distributed "double" in the range [min, limit).
270
+ double UniformDouble(double min, double limit);
271
+
272
+ // A functor-style version of Uniform, so that this class can be used with
273
+ // STL functions that require a RandomNumberGenerator concept.
274
+ int32 operator() (int32 n) {
275
+ return Uniform(n);
276
+ }
277
+
278
+ // Return true with probability 1 in n.
279
+ bool OneIn(int32 n);
280
+
281
+ // Skewed: pick "base" uniformly from range [0,max_log] and then
282
+ // return "base" random bits. The effect is to pick a number in the
283
+ // range [0,2^max_log-1] with bias towards smaller numbers.
284
+ int32 Skewed(int max_log);
285
+
286
+ private:
287
+ // Currently this class is based on random(), therefore it makes no sense to
288
+ // make a copy.
289
+ Random(const Random&) = delete;
290
+ void operator=(const Random&) = delete;
291
+ };
292
+
293
+ // Compare two sets of "closest" items, where "expected" is computed via brute
294
+ // force (i.e., considering every possible candidate) and "actual" is computed
295
+ // using a spatial data structure. Here "max_size" is a bound on the maximum
296
+ // number of items, "max_distance" is a limit on the distance to any item, and
297
+ // "max_error" is the maximum error allowed when selecting which items are
298
+ // closest (see S2ClosestEdgeQuery::Options::max_error).
299
+ template <typename Id, typename Distance>
300
+ bool CheckDistanceResults(
301
+ const std::vector<std::pair<Distance, Id>>& expected,
302
+ const std::vector<std::pair<Distance, Id>>& actual,
303
+ int max_size, Distance max_distance, typename Distance::Delta max_error);
304
+
305
+
306
+ //////////////////// Implementation Details Follow ////////////////////////
307
+
308
+
309
+ namespace S2 {
310
+ namespace internal {
311
+
312
+ // Check that result set "x" contains all the expected results from "y", and
313
+ // does not include any duplicate results.
314
+ template <typename Id, typename Distance>
315
+ bool CheckResultSet(const std::vector<std::pair<Distance, Id>>& x,
316
+ const std::vector<std::pair<Distance, Id>>& y,
317
+ int max_size, Distance max_distance,
318
+ typename Distance::Delta max_error,
319
+ typename Distance::Delta max_pruning_error,
320
+ const string& label) {
321
+ using Result = std::pair<Distance, Id>;
322
+ // Results should be sorted by distance, but not necessarily then by Id.
323
+ EXPECT_TRUE(std::is_sorted(x.begin(), x.end(),
324
+ [](const Result& x, const Result& y) {
325
+ return x.first < y.first;
326
+ }));
327
+
328
+ // Result set X should contain all the items from Y whose distance is less
329
+ // than "limit" computed below.
330
+ Distance limit = Distance::Zero();
331
+ if (x.size() < max_size) {
332
+ // Result set X was not limited by "max_size", so it should contain all
333
+ // the items up to "max_distance", except that a few items right near the
334
+ // distance limit may be missed because the distance measurements used for
335
+ // pruning S2Cells are not conservative.
336
+ if (max_distance == Distance::Infinity()) {
337
+ limit = max_distance;
338
+ } else {
339
+ limit = max_distance - max_pruning_error;
340
+ }
341
+ } else if (!x.empty()) {
342
+ // Result set X contains only the closest "max_size" items, to within a
343
+ // tolerance of "max_error + max_pruning_error".
344
+ limit = (x.back().first - max_error) - max_pruning_error;
345
+ }
346
+
347
+ bool result = true;
348
+ for (const auto& yp : y) {
349
+ // Note that this test also catches duplicate values.
350
+ int count = std::count_if(x.begin(), x.end(), [&yp](const Result& xp) {
351
+ return xp.second == yp.second;
352
+ });
353
+ if (yp.first < limit && count != 1) {
354
+ result = false;
355
+ std::cout << (count > 1 ? "Duplicate" : label) << " distance = "
356
+ << S1ChordAngle(yp.first) << ", id = " << yp.second
357
+ << std::endl;
358
+ }
359
+ }
360
+
361
+ return result;
362
+ }
363
+
364
+ } // namespace internal
365
+ } // namespace S2
366
+
367
+ template <typename Id, typename Distance>
368
+ bool CheckDistanceResults(
369
+ const std::vector<std::pair<Distance, Id>>& expected,
370
+ const std::vector<std::pair<Distance, Id>>& actual,
371
+ int max_size, Distance max_distance, typename Distance::Delta max_error) {
372
+ // This is a conservative bound on the error in computing the distance from
373
+ // the target geometry to an S2Cell. Such errors can cause candidates to be
374
+ // pruned from the result set even though they may be slightly closer.
375
+ static const typename Distance::Delta kMaxPruningError(
376
+ S1ChordAngle::Radians(1e-15));
377
+ return (S2::internal::CheckResultSet(
378
+ actual, expected, max_size, max_distance, max_error,
379
+ kMaxPruningError, "Missing") & /*not &&*/
380
+ S2::internal::CheckResultSet(
381
+ expected, actual, max_size, max_distance, max_error,
382
+ Distance::Delta::Zero(), "Extra"));
383
+ }
384
+
385
+ #endif // S2_S2TESTING_H_
@@ -0,0 +1,166 @@
1
+ // Copyright 2012 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/s2testing.h"
19
+
20
+ #include <algorithm>
21
+ #include <cmath>
22
+ #include <memory>
23
+
24
+ #include "s2/base/logging.h"
25
+ #include <gtest/gtest.h>
26
+
27
+ #include "s2/s1angle.h"
28
+ #include "s2/s2loop.h"
29
+
30
+ using std::max;
31
+ using std::min;
32
+ using std::unique_ptr;
33
+
34
+ namespace {
35
+
36
+ int NumVerticesAtLevel(int level) {
37
+ S2_DCHECK(level >= 0 && level <= 14); // Sanity / overflow check
38
+ return 3 * (1 << (2 * level)); // 3*(4**level)
39
+ }
40
+
41
+ void TestFractal(int min_level, int max_level, double dimension) {
42
+ // This function constructs a fractal and then computes various metrics
43
+ // (number of vertices, total length, minimum and maximum radius) and
44
+ // verifies that they are within expected tolerances. Essentially this
45
+ // directly verifies that the shape constructed *is* a fractal, i.e. the
46
+ // total length of the curve increases exponentially with the level, while
47
+ // the area bounded by the fractal is more or less constant.
48
+
49
+ // The radius needs to be fairly small to avoid spherical distortions.
50
+ const double nominal_radius = 0.001; // radians, or about 6km
51
+ const double kDistortionError = 1e-5;
52
+
53
+ S2Testing::Fractal fractal;
54
+ fractal.set_min_level(min_level);
55
+ fractal.set_max_level(max_level);
56
+ fractal.set_fractal_dimension(dimension);
57
+ Matrix3x3_d frame = S2Testing::GetRandomFrame();
58
+ unique_ptr<S2Loop> loop(
59
+ fractal.MakeLoop(frame, S1Angle::Radians(nominal_radius)));
60
+ ASSERT_TRUE(loop->IsValid());
61
+
62
+ // If min_level and max_level are not equal, then the number of vertices and
63
+ // the total length of the curve are subject to random variation. Here we
64
+ // compute an approximation of the standard deviation relative to the mean,
65
+ // noting that most of the variance is due to the random choices about
66
+ // whether to stop subdividing at "min_level" or not. (The random choices
67
+ // at higher levels contribute progressively less and less to the variance.)
68
+ // The "relative_error" below corresponds to *one* standard deviation of
69
+ // error; it can be increased to a higher multiple if necessary.
70
+ //
71
+ // Details: Let n=3*(4**min_level) and k=(max_level-min_level+1). Each of
72
+ // the "n" edges at min_level stops subdividing at that level with
73
+ // probability (1/k). This gives a binomial distribution with mean u=(n/k)
74
+ // and standard deviation s=sqrt((n/k)(1-1/k)). The relative error (s/u)
75
+ // can be simplified to sqrt((k-1)/n).
76
+ int num_levels = max_level - min_level + 1;
77
+ int min_vertices = NumVerticesAtLevel(min_level);
78
+ double relative_error = sqrt((num_levels - 1.0) / min_vertices);
79
+
80
+ // "expansion_factor" is the total fractal length at level "n+1" divided by
81
+ // the total fractal length at level "n".
82
+ double expansion_factor = pow(4, 1 - 1/dimension);
83
+ double expected_num_vertices = 0;
84
+ double expected_length_sum = 0;
85
+
86
+ // "triangle_perim" is the perimeter of the original equilateral triangle
87
+ // before any subdivision occurs.
88
+ double triangle_perim = 3 * sqrt(3) * tan(nominal_radius);
89
+ double min_length_sum = triangle_perim * pow(expansion_factor, min_level);
90
+ for (int level = min_level; level <= max_level; ++level) {
91
+ expected_num_vertices += NumVerticesAtLevel(level);
92
+ expected_length_sum += pow(expansion_factor, level);
93
+ }
94
+ expected_num_vertices /= num_levels;
95
+ expected_length_sum *= triangle_perim / num_levels;
96
+
97
+ EXPECT_GE(loop->num_vertices(), min_vertices);
98
+ EXPECT_LE(loop->num_vertices(), NumVerticesAtLevel(max_level));
99
+ EXPECT_NEAR(expected_num_vertices, loop->num_vertices(),
100
+ relative_error * (expected_num_vertices - min_vertices));
101
+
102
+ S2Point center = frame.Col(2);
103
+ double min_radius = 2 * M_PI;
104
+ double max_radius = 0;
105
+ double length_sum = 0;
106
+ for (int i = 0; i < loop->num_vertices(); ++i) {
107
+ // Measure the radius of the fractal in the tangent plane at "center".
108
+ double r = tan(center.Angle(loop->vertex(i)));
109
+ min_radius = min(min_radius, r);
110
+ max_radius = max(max_radius, r);
111
+ length_sum += loop->vertex(i).Angle(loop->vertex(i+1));
112
+ }
113
+ // kVertexError is an approximate bound on the error when computing vertex
114
+ // positions of the fractal (due to S2::FromFrame, trig calculations, etc).
115
+ const double kVertexError = 1e-14;
116
+
117
+ // Although min_radius_factor() is only a lower bound in general, it happens
118
+ // to be exact (to within numerical errors) unless the dimension is in the
119
+ // range (1.0, 1.09).
120
+ if (dimension == 1.0 || dimension >= 1.09) {
121
+ // Expect the min radius to match very closely.
122
+ EXPECT_NEAR(min_radius, fractal.min_radius_factor() * nominal_radius,
123
+ kVertexError);
124
+ } else {
125
+ // Expect the min radius to satisfy the lower bound.
126
+ EXPECT_GE(min_radius,
127
+ fractal.min_radius_factor() * nominal_radius - kVertexError);
128
+ }
129
+ // max_radius_factor() is exact (modulo errors) for all dimensions.
130
+ EXPECT_NEAR(max_radius, fractal.max_radius_factor() * nominal_radius,
131
+ kVertexError);
132
+
133
+ EXPECT_NEAR(expected_length_sum, length_sum,
134
+ relative_error * (expected_length_sum - min_length_sum) +
135
+ kDistortionError * length_sum);
136
+ }
137
+
138
+ TEST(S2Testing, TriangleFractal) {
139
+ TestFractal(7, 7, 1.0);
140
+ }
141
+
142
+ TEST(S2Testing, TriangleMultiFractal) {
143
+ TestFractal(2, 6, 1.0);
144
+ }
145
+
146
+ TEST(S2Testing, SpaceFillingFractal) {
147
+ TestFractal(4, 4, 1.999);
148
+ }
149
+
150
+ TEST(S2Testing, KochCurveFractal) {
151
+ TestFractal(7, 7, log(4)/log(3));
152
+ }
153
+
154
+ TEST(S2Testing, KochCurveMultiFractal) {
155
+ TestFractal(4, 8, log(4)/log(3));
156
+ }
157
+
158
+ TEST(S2Testing, CesaroFractal) {
159
+ TestFractal(7, 7, 1.8);
160
+ }
161
+
162
+ TEST(S2Testing, CesaroMultiFractal) {
163
+ TestFractal(3, 6, 1.8);
164
+ }
165
+
166
+ } // namespace