@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,286 @@
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_S2CAP_H_
19
+ #define S2_S2CAP_H_
20
+
21
+ #include <algorithm>
22
+ #include <cmath>
23
+ #include <iosfwd>
24
+ #include <vector>
25
+
26
+ #include "s2/base/logging.h"
27
+ #include "s2/_fp_contract_off.h"
28
+ #include "s2/s1angle.h"
29
+ #include "s2/s1chord_angle.h"
30
+ #include "s2/s2pointutil.h"
31
+ #include "s2/s2region.h"
32
+
33
+ class Decoder;
34
+ class Encoder;
35
+ class S2Cell;
36
+ class S2LatLngRect;
37
+
38
+ // S2Cap represents a disc-shaped region defined by a center and radius.
39
+ // Technically this shape is called a "spherical cap" (rather than disc)
40
+ // because it is not planar; the cap represents a portion of the sphere that
41
+ // has been cut off by a plane. The boundary of the cap is the circle defined
42
+ // by the intersection of the sphere and the plane. For containment purposes,
43
+ // the cap is a closed set, i.e. it contains its boundary.
44
+ //
45
+ // For the most part, you can use a spherical cap wherever you would use a
46
+ // disc in planar geometry. The radius of the cap is measured along the
47
+ // surface of the sphere (rather than the straight-line distance through the
48
+ // interior). Thus a cap of radius Pi/2 is a hemisphere, and a cap of radius
49
+ // Pi covers the entire sphere.
50
+ //
51
+ // A cap can also be defined by its center point and height. The height is
52
+ // simply the distance from the center point to the cutoff plane. There is
53
+ // also support for empty and full caps, which contain no points and all
54
+ // points respectively.
55
+ //
56
+ // This class is intended to be copied by value as desired. It uses the
57
+ // default copy constructor and assignment operator, however it is not a
58
+ // "plain old datatype" (POD) because it has virtual functions.
59
+ class S2Cap final : public S2Region {
60
+ public:
61
+ // The default constructor returns an empty S2Cap.
62
+ S2Cap() : center_(1, 0, 0), radius_(S1ChordAngle::Negative()) {}
63
+
64
+ // Constructs a cap with the given center and radius. A negative radius
65
+ // yields an empty cap; a radius of 180 degrees or more yields a full cap
66
+ // (containing the entire sphere). "center" should be unit length.
67
+ S2Cap(const S2Point& center, S1Angle radius);
68
+
69
+ // Constructs a cap where the angle is expressed as an S1ChordAngle. This
70
+ // constructor is more efficient than the one above.
71
+ S2Cap(const S2Point& center, S1ChordAngle radius);
72
+
73
+ // Convenience function that creates a cap containing a single point. This
74
+ // method is more efficient that the S2Cap(center, radius) constructor.
75
+ static S2Cap FromPoint(const S2Point& center);
76
+
77
+ // Returns a cap with the given center and height (see comments above). A
78
+ // negative height yields an empty cap; a height of 2 or more yields a full
79
+ // cap. "center" should be unit length.
80
+ static S2Cap FromCenterHeight(const S2Point& center, double height);
81
+
82
+ // Return a cap with the given center and surface area. Note that the area
83
+ // can also be interpreted as the solid angle subtended by the cap (because
84
+ // the sphere has unit radius). A negative area yields an empty cap; an
85
+ // area of 4*Pi or more yields a full cap. "center" should be unit length.
86
+ static S2Cap FromCenterArea(const S2Point& center, double area);
87
+
88
+ // Return an empty cap, i.e. a cap that contains no points.
89
+ static S2Cap Empty();
90
+
91
+ // Return a full cap, i.e. a cap that contains all points.
92
+ static S2Cap Full();
93
+
94
+ ~S2Cap() override {}
95
+
96
+ // Accessor methods.
97
+ const S2Point& center() const { return center_; }
98
+ S1ChordAngle radius() const { return radius_; }
99
+
100
+ // Returns the height of the cap, i.e. the distance from the center point to
101
+ // the cutoff plane.
102
+ double height() const;
103
+
104
+ // Return the cap radius as an S1Angle. (Note that the cap angle is stored
105
+ // internally as an S1ChordAngle, so this method requires a trigonometric
106
+ // operation and may yield a slightly different result than the value passed
107
+ // to the (S2Point, S1Angle) constructor.)
108
+ S1Angle GetRadius() const;
109
+
110
+ // Return the area of the cap.
111
+ double GetArea() const;
112
+
113
+ // Return the true centroid of the cap multiplied by its surface area (see
114
+ // s2centroids.h for details on centroids). The result lies on the ray from
115
+ // the origin through the cap's center, but it is not unit length. Note that
116
+ // if you just want the "surface centroid", i.e. the normalized result, then
117
+ // it is much simpler just to call center().
118
+ //
119
+ // The reason for multiplying the result by the cap area is to make it
120
+ // easier to compute the centroid of more complicated shapes. The centroid
121
+ // of a union of disjoint regions can be computed simply by adding their
122
+ // GetCentroid() results. Caveat: for caps that contain a single point
123
+ // (i.e., zero radius), this method always returns the origin (0, 0, 0).
124
+ // This is because shapes with no area don't affect the centroid of a
125
+ // union whose total area is positive.
126
+ S2Point GetCentroid() const;
127
+
128
+ // We allow negative heights (to represent empty caps) but heights are
129
+ // normalized so that they do not exceed 2.
130
+ bool is_valid() const;
131
+
132
+ // Return true if the cap is empty, i.e. it contains no points.
133
+ bool is_empty() const;
134
+
135
+ // Return true if the cap is full, i.e. it contains all points.
136
+ bool is_full() const;
137
+
138
+ // Return the complement of the interior of the cap. A cap and its
139
+ // complement have the same boundary but do not share any interior points.
140
+ // The complement operator is not a bijection because the complement of a
141
+ // singleton cap (containing a single point) is the same as the complement
142
+ // of an empty cap.
143
+ S2Cap Complement() const;
144
+
145
+ // Return true if and only if this cap contains the given other cap
146
+ // (in a set containment sense, e.g. every cap contains the empty cap).
147
+ bool Contains(const S2Cap& other) const;
148
+
149
+ // Return true if and only if this cap intersects the given other cap,
150
+ // i.e. whether they have any points in common.
151
+ bool Intersects(const S2Cap& other) const;
152
+
153
+ // Return true if and only if the interior of this cap intersects the
154
+ // given other cap. (This relationship is not symmetric, since only
155
+ // the interior of this cap is used.)
156
+ bool InteriorIntersects(const S2Cap& other) const;
157
+
158
+ // Return true if and only if the given point is contained in the interior
159
+ // of the cap (i.e. the cap excluding its boundary). "p" should be be a
160
+ // unit-length vector.
161
+ bool InteriorContains(const S2Point& p) const;
162
+
163
+ // Increase the cap height if necessary to include the given point. If the
164
+ // cap is empty then the center is set to the given point, but otherwise the
165
+ // center is not changed. "p" should be a unit-length vector.
166
+ void AddPoint(const S2Point& p);
167
+
168
+ // Increase the cap height if necessary to include "other". If the current
169
+ // cap is empty it is set to the given other cap.
170
+ void AddCap(const S2Cap& other);
171
+
172
+ // Return a cap that contains all points within a given distance of this
173
+ // cap. Note that any expansion of the empty cap is still empty.
174
+ S2Cap Expanded(S1Angle distance) const;
175
+
176
+ // Return the smallest cap which encloses this cap and "other".
177
+ S2Cap Union(const S2Cap& other) const;
178
+
179
+ ////////////////////////////////////////////////////////////////////////
180
+ // S2Region interface (see s2region.h for details):
181
+
182
+ S2Cap* Clone() const override;
183
+ S2Cap GetCapBound() const override;
184
+ S2LatLngRect GetRectBound() const override;
185
+ void GetCellUnionBound(std::vector<S2CellId> *cell_ids) const override;
186
+ bool Contains(const S2Cell& cell) const override;
187
+ bool MayIntersect(const S2Cell& cell) const override;
188
+
189
+ // The point "p" should be a unit-length vector.
190
+ bool Contains(const S2Point& p) const override;
191
+
192
+ // Appends a serialized representation of the S2Cap to "encoder".
193
+ //
194
+ // REQUIRES: "encoder" uses the default constructor, so that its buffer
195
+ // can be enlarged as necessary by calling Ensure(int).
196
+ void Encode(Encoder* const encoder) const;
197
+
198
+ // Decodes an S2Cap encoded with Encode(). Returns true on success.
199
+ bool Decode(Decoder* const decoder);
200
+
201
+ ///////////////////////////////////////////////////////////////////////
202
+ // The following static methods are convenience functions for assertions
203
+ // and testing purposes only.
204
+
205
+ // Return true if two caps are identical.
206
+ bool operator==(const S2Cap& other) const;
207
+
208
+ // Return true if the cap center and height differ by at most "max_error"
209
+ // from the given cap "other".
210
+ bool ApproxEquals(const S2Cap& other,
211
+ S1Angle max_error = S1Angle::Radians(1e-14)) const;
212
+
213
+ private:
214
+ // Here are some useful relationships between the cap height (h), the cap
215
+ // radius (r), the maximum chord length from the cap's center (d), and the
216
+ // radius of cap's base (a).
217
+ //
218
+ // h = 1 - cos(r)
219
+ // = 2 * sin^2(r/2)
220
+ // d^2 = 2 * h
221
+ // = a^2 + h^2
222
+
223
+ // Return true if the cap intersects "cell", given that the cap does contain
224
+ // any of the cell vertices (supplied in "vertices", an array of length 4).
225
+ bool Intersects(const S2Cell& cell, const S2Point* vertices) const;
226
+
227
+ S2Point center_;
228
+ S1ChordAngle radius_;
229
+ };
230
+
231
+ std::ostream& operator<<(std::ostream& os, const S2Cap& cap);
232
+
233
+
234
+ ////////////////// Implementation details follow ////////////////////
235
+
236
+
237
+ inline S2Cap::S2Cap(const S2Point& center, S1Angle radius)
238
+ : center_(center), radius_(std::min(radius, S1Angle::Radians(M_PI))) {
239
+ // The "min" calculation above is necessary to handle S1Angle::Infinity().
240
+ S2_DCHECK(is_valid());
241
+ }
242
+
243
+ inline S2Cap::S2Cap(const S2Point& center, S1ChordAngle radius)
244
+ : center_(center), radius_(radius) {
245
+ S2_DCHECK(is_valid());
246
+ }
247
+
248
+ inline S2Cap S2Cap::FromPoint(const S2Point& center) {
249
+ return S2Cap(center, S1ChordAngle::Zero());
250
+ }
251
+
252
+ inline S2Cap S2Cap::FromCenterHeight(const S2Point& center, double height) {
253
+ return S2Cap(center, S1ChordAngle::FromLength2(2 * height));
254
+ }
255
+
256
+ inline S2Cap S2Cap::FromCenterArea(const S2Point& center, double area) {
257
+ return S2Cap(center, S1ChordAngle::FromLength2(area / M_PI));
258
+ }
259
+
260
+ inline S2Cap S2Cap::Empty() { return S2Cap(); }
261
+
262
+ inline S2Cap S2Cap::Full() {
263
+ return S2Cap(S2Point(1, 0, 0), S1ChordAngle::Straight());
264
+ }
265
+
266
+ inline double S2Cap::height() const {
267
+ return 0.5 * radius_.length2();
268
+ }
269
+
270
+ inline S1Angle S2Cap::GetRadius() const {
271
+ return radius_.ToAngle();
272
+ }
273
+
274
+ inline bool S2Cap::is_valid() const {
275
+ return S2::IsUnitLength(center_) && radius_.length2() <= 4;
276
+ }
277
+
278
+ inline bool S2Cap::is_empty() const {
279
+ return radius_.is_negative();
280
+ }
281
+
282
+ inline bool S2Cap::is_full() const {
283
+ return radius_.length2() == 4;
284
+ }
285
+
286
+ #endif // S2_S2CAP_H_
@@ -0,0 +1,379 @@
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/s2cap.h"
19
+
20
+ #include <cfloat>
21
+ #include <gtest/gtest.h>
22
+ #include "s2/r1interval.h"
23
+ #include "s2/s1interval.h"
24
+ #include "s2/s2cell.h"
25
+ #include "s2/s2cell_id.h"
26
+ #include "s2/s2coords.h"
27
+ #include "s2/s2latlng.h"
28
+ #include "s2/s2latlng_rect.h"
29
+ #include "s2/s2metrics.h"
30
+ #include "s2/s2testing.h"
31
+ #include "s2/util/math/vector.h"
32
+
33
+ using std::vector;
34
+
35
+ static S2Point GetLatLngPoint(double lat_degrees, double lng_degrees) {
36
+ return S2LatLng::FromDegrees(lat_degrees, lng_degrees).ToPoint();
37
+ }
38
+
39
+ // About 9 times the double-precision roundoff relative error.
40
+ static const double kEps = 1e-15;
41
+
42
+ TEST(S2Cap, Basic) {
43
+ // Test basic properties of empty and full caps.
44
+ S2Cap empty = S2Cap::Empty();
45
+ S2Cap full = S2Cap::Full();
46
+ EXPECT_TRUE(empty.is_valid());
47
+ EXPECT_TRUE(empty.is_empty());
48
+ EXPECT_TRUE(empty.Complement().is_full());
49
+ EXPECT_TRUE(full.is_valid());
50
+ EXPECT_TRUE(full.is_full());
51
+ EXPECT_TRUE(full.Complement().is_empty());
52
+ EXPECT_EQ(2, full.height());
53
+ EXPECT_DOUBLE_EQ(180.0, full.GetRadius().degrees());
54
+
55
+ // Test the S1Angle constructor using out-of-range arguments.
56
+ EXPECT_TRUE(S2Cap(S2Point(1, 0, 0), S1Angle::Radians(-20)).is_empty());
57
+ EXPECT_TRUE(S2Cap(S2Point(1, 0, 0), S1Angle::Radians(5)).is_full());
58
+ EXPECT_TRUE(S2Cap(S2Point(1, 0, 0), S1Angle::Infinity()).is_full());
59
+
60
+ // Check that the default S2Cap is identical to Empty().
61
+ S2Cap default_empty;
62
+ EXPECT_TRUE(default_empty.is_valid());
63
+ EXPECT_TRUE(default_empty.is_empty());
64
+ EXPECT_EQ(empty.center(), default_empty.center());
65
+ EXPECT_EQ(empty.height(), default_empty.height());
66
+
67
+ // Containment and intersection of empty and full caps.
68
+ EXPECT_TRUE(empty.Contains(empty));
69
+ EXPECT_TRUE(full.Contains(empty));
70
+ EXPECT_TRUE(full.Contains(full));
71
+ EXPECT_FALSE(empty.InteriorIntersects(empty));
72
+ EXPECT_TRUE(full.InteriorIntersects(full));
73
+ EXPECT_FALSE(full.InteriorIntersects(empty));
74
+
75
+ // Singleton cap containing the x-axis.
76
+ S2Cap xaxis = S2Cap::FromPoint(S2Point(1, 0, 0));
77
+ EXPECT_TRUE(xaxis.Contains(S2Point(1, 0, 0)));
78
+ EXPECT_FALSE(xaxis.Contains(S2Point(1, 1e-20, 0)));
79
+ EXPECT_EQ(0, xaxis.GetRadius().radians());
80
+
81
+ // Singleton cap containing the y-axis.
82
+ S2Cap yaxis = S2Cap::FromPoint(S2Point(0, 1, 0));
83
+ EXPECT_FALSE(yaxis.Contains(xaxis.center()));
84
+ EXPECT_EQ(0, xaxis.height());
85
+
86
+ // Check that the complement of a singleton cap is the full cap.
87
+ S2Cap xcomp = xaxis.Complement();
88
+ EXPECT_TRUE(xcomp.is_valid());
89
+ EXPECT_TRUE(xcomp.is_full());
90
+ EXPECT_TRUE(xcomp.Contains(xaxis.center()));
91
+
92
+ // Check that the complement of the complement is *not* the original.
93
+ EXPECT_TRUE(xcomp.Complement().is_valid());
94
+ EXPECT_TRUE(xcomp.Complement().is_empty());
95
+ EXPECT_FALSE(xcomp.Complement().Contains(xaxis.center()));
96
+
97
+ // Check that very small caps can be represented accurately.
98
+ // Here "kTinyRad" is small enough that unit vectors perturbed by this
99
+ // amount along a tangent do not need to be renormalized.
100
+ static const double kTinyRad = 1e-10;
101
+ S2Cap tiny(S2Point(1, 2, 3).Normalize(), S1Angle::Radians(kTinyRad));
102
+ Vector3_d tangent = tiny.center().CrossProd(S2Point(3, 2, 1)).Normalize();
103
+ EXPECT_TRUE(tiny.Contains(tiny.center() + 0.99 * kTinyRad * tangent));
104
+ EXPECT_FALSE(tiny.Contains(tiny.center() + 1.01 * kTinyRad * tangent));
105
+
106
+ // Basic tests on a hemispherical cap.
107
+ S2Cap hemi = S2Cap::FromCenterHeight(S2Point(1, 0, 1).Normalize(), 1);
108
+ EXPECT_EQ(-hemi.center(), S2Point(hemi.Complement().center()));
109
+ EXPECT_EQ(1, hemi.Complement().height());
110
+ EXPECT_TRUE(hemi.Contains(S2Point(1, 0, 0)));
111
+ EXPECT_FALSE(hemi.Complement().Contains(S2Point(1, 0, 0)));
112
+ EXPECT_TRUE(hemi.Contains(S2Point(1, 0, -(1-kEps)).Normalize()));
113
+ EXPECT_FALSE(hemi.InteriorContains(S2Point(1, 0, -(1+kEps)).Normalize()));
114
+
115
+ // A concave cap. Note that the error bounds for point containment tests
116
+ // increase with the cap angle, so we need to use a larger error bound
117
+ // here. (It would be painful to do this everywhere, but this at least
118
+ // gives an example of how to compute the maximum error.)
119
+ S2Point center = GetLatLngPoint(80, 10);
120
+ S1ChordAngle radius(S1Angle::Degrees(150));
121
+ double max_error = (radius.GetS2PointConstructorMaxError() +
122
+ radius.GetS1AngleConstructorMaxError() +
123
+ 3 * DBL_EPSILON); // GetLatLngPoint() error
124
+ S2Cap concave(center, radius);
125
+ S2Cap concave_min(center, radius.PlusError(-max_error));
126
+ S2Cap concave_max(center, radius.PlusError(max_error));
127
+ EXPECT_TRUE(concave_max.Contains(GetLatLngPoint(-70, 10)));
128
+ EXPECT_FALSE(concave_min.Contains(GetLatLngPoint(-70, 10)));
129
+ EXPECT_TRUE(concave_max.Contains(GetLatLngPoint(-50, -170)));
130
+ EXPECT_FALSE(concave_min.Contains(GetLatLngPoint(-50, -170)));
131
+
132
+ // Cap containment tests.
133
+ EXPECT_FALSE(empty.Contains(xaxis));
134
+ EXPECT_FALSE(empty.InteriorIntersects(xaxis));
135
+ EXPECT_TRUE(full.Contains(xaxis));
136
+ EXPECT_TRUE(full.InteriorIntersects(xaxis));
137
+ EXPECT_FALSE(xaxis.Contains(full));
138
+ EXPECT_FALSE(xaxis.InteriorIntersects(full));
139
+ EXPECT_TRUE(xaxis.Contains(xaxis));
140
+ EXPECT_FALSE(xaxis.InteriorIntersects(xaxis));
141
+ EXPECT_TRUE(xaxis.Contains(empty));
142
+ EXPECT_FALSE(xaxis.InteriorIntersects(empty));
143
+ EXPECT_TRUE(hemi.Contains(tiny));
144
+ EXPECT_TRUE(hemi.Contains(
145
+ S2Cap(S2Point(1, 0, 0), S1Angle::Radians(M_PI_4 - kEps))));
146
+ EXPECT_FALSE(hemi.Contains(
147
+ S2Cap(S2Point(1, 0, 0), S1Angle::Radians(M_PI_4 + kEps))));
148
+ EXPECT_TRUE(concave.Contains(hemi));
149
+ EXPECT_TRUE(concave.InteriorIntersects(hemi.Complement()));
150
+ EXPECT_FALSE(concave.Contains(
151
+ S2Cap::FromCenterHeight(-concave.center(), 0.1)));
152
+ }
153
+
154
+ TEST(S2Cap, AddEmptyCapToNonEmptyCap) {
155
+ S2Cap non_empty_cap(S2Point(1, 0, 0), S1Angle::Degrees(10));
156
+ double initial_area = non_empty_cap.GetArea();
157
+ non_empty_cap.AddCap(S2Cap::Empty());
158
+ EXPECT_EQ(initial_area, non_empty_cap.GetArea());
159
+ }
160
+
161
+ TEST(S2Cap, AddNonEmptyCapToEmptyCap) {
162
+ S2Cap empty = S2Cap::Empty();
163
+ S2Cap non_empty_cap(S2Point(1, 0, 0), S1Angle::Degrees(10));
164
+ empty.AddCap(non_empty_cap);
165
+ EXPECT_EQ(non_empty_cap.GetArea(), empty.GetArea());
166
+ }
167
+
168
+ TEST(S2Cap, GetRectBound) {
169
+ // Empty and full caps.
170
+ EXPECT_TRUE(S2Cap::Empty().GetRectBound().is_empty());
171
+ EXPECT_TRUE(S2Cap::Full().GetRectBound().is_full());
172
+
173
+ static const double kDegreeEps = 1e-13;
174
+ // Maximum allowable error for latitudes and longitudes measured in
175
+ // degrees. (EXPECT_DOUBLE_EQ isn't sufficient.)
176
+
177
+ // Cap that includes the south pole.
178
+ S2LatLngRect rect = S2Cap(GetLatLngPoint(-45, 57),
179
+ S1Angle::Degrees(50)).GetRectBound();
180
+ EXPECT_NEAR(rect.lat_lo().degrees(), -90, kDegreeEps);
181
+ EXPECT_NEAR(rect.lat_hi().degrees(), 5, kDegreeEps);
182
+ EXPECT_TRUE(rect.lng().is_full());
183
+
184
+ // Cap that is tangent to the north pole.
185
+ rect = S2Cap(S2Point(1, 0, 1).Normalize(),
186
+ S1Angle::Radians(M_PI_4 + 1e-16)).GetRectBound();
187
+ EXPECT_NEAR(rect.lat().lo(), 0, kEps);
188
+ EXPECT_NEAR(rect.lat().hi(), M_PI_2, kEps);
189
+ EXPECT_TRUE(rect.lng().is_full());
190
+
191
+ rect = S2Cap(S2Point(1, 0, 1).Normalize(),
192
+ S1Angle::Degrees(45 + 5e-15)).GetRectBound();
193
+ EXPECT_NEAR(rect.lat_lo().degrees(), 0, kDegreeEps);
194
+ EXPECT_NEAR(rect.lat_hi().degrees(), 90, kDegreeEps);
195
+ EXPECT_TRUE(rect.lng().is_full());
196
+
197
+ // The eastern hemisphere.
198
+ rect = S2Cap(S2Point(0, 1, 0),
199
+ S1Angle::Radians(M_PI_2 + 2e-16)).GetRectBound();
200
+ EXPECT_NEAR(rect.lat_lo().degrees(), -90, kDegreeEps);
201
+ EXPECT_NEAR(rect.lat_hi().degrees(), 90, kDegreeEps);
202
+ EXPECT_TRUE(rect.lng().is_full());
203
+
204
+ // A cap centered on the equator.
205
+ rect = S2Cap(GetLatLngPoint(0, 50), S1Angle::Degrees(20)).GetRectBound();
206
+ EXPECT_NEAR(rect.lat_lo().degrees(), -20, kDegreeEps);
207
+ EXPECT_NEAR(rect.lat_hi().degrees(), 20, kDegreeEps);
208
+ EXPECT_NEAR(rect.lng_lo().degrees(), 30, kDegreeEps);
209
+ EXPECT_NEAR(rect.lng_hi().degrees(), 70, kDegreeEps);
210
+
211
+ // A cap centered on the north pole.
212
+ rect = S2Cap(GetLatLngPoint(90, 123), S1Angle::Degrees(10)).GetRectBound();
213
+ EXPECT_NEAR(rect.lat_lo().degrees(), 80, kDegreeEps);
214
+ EXPECT_NEAR(rect.lat_hi().degrees(), 90, kDegreeEps);
215
+ EXPECT_TRUE(rect.lng().is_full());
216
+ }
217
+
218
+ TEST(S2Cap, S2CellMethods) {
219
+ // For each cube face, we construct some cells on
220
+ // that face and some caps whose positions are relative to that face,
221
+ // and then check for the expected intersection/containment results.
222
+
223
+ // The distance from the center of a face to one of its vertices.
224
+ static const double kFaceRadius = atan(sqrt(2));
225
+
226
+ for (int face = 0; face < 6; ++face) {
227
+ // The cell consisting of the entire face.
228
+ S2Cell root_cell = S2Cell::FromFace(face);
229
+
230
+ // A leaf cell at the midpoint of the v=1 edge.
231
+ S2Cell edge_cell(S2::FaceUVtoXYZ(face, 0, 1 - kEps));
232
+
233
+ // A leaf cell at the u=1, v=1 corner.
234
+ S2Cell corner_cell(S2::FaceUVtoXYZ(face, 1 - kEps, 1 - kEps));
235
+
236
+ // Quick check for full and empty caps.
237
+ EXPECT_TRUE(S2Cap::Full().Contains(root_cell));
238
+ EXPECT_FALSE(S2Cap::Empty().MayIntersect(root_cell));
239
+
240
+ // Check intersections with the bounding caps of the leaf cells that are
241
+ // adjacent to 'corner_cell' along the Hilbert curve. Because this corner
242
+ // is at (u=1,v=1), the curve stays locally within the same cube face.
243
+ S2CellId first = corner_cell.id().advance(-3);
244
+ S2CellId last = corner_cell.id().advance(4);
245
+ for (S2CellId id = first; id < last; id = id.next()) {
246
+ S2Cell cell(id);
247
+ EXPECT_EQ(id == corner_cell.id(),
248
+ cell.GetCapBound().Contains(corner_cell));
249
+ EXPECT_EQ(id.parent().contains(corner_cell.id()),
250
+ cell.GetCapBound().MayIntersect(corner_cell));
251
+ }
252
+
253
+ int anti_face = (face + 3) % 6; // Opposite face.
254
+ for (int cap_face = 0; cap_face < 6; ++cap_face) {
255
+ // A cap that barely contains all of 'cap_face'.
256
+ S2Point center = S2::GetNorm(cap_face);
257
+ S2Cap covering(center, S1Angle::Radians(kFaceRadius + kEps));
258
+ EXPECT_EQ(cap_face == face, covering.Contains(root_cell));
259
+ EXPECT_EQ(cap_face != anti_face, covering.MayIntersect(root_cell));
260
+ EXPECT_EQ(center.DotProd(edge_cell.GetCenter()) > 0.1,
261
+ covering.Contains(edge_cell));
262
+ EXPECT_EQ(covering.MayIntersect(edge_cell), covering.Contains(edge_cell));
263
+ EXPECT_EQ(cap_face == face, covering.Contains(corner_cell));
264
+ EXPECT_EQ(center.DotProd(corner_cell.GetCenter()) > 0,
265
+ covering.MayIntersect(corner_cell));
266
+
267
+ // A cap that barely intersects the edges of 'cap_face'.
268
+ S2Cap bulging(center, S1Angle::Radians(M_PI_4 + kEps));
269
+ EXPECT_FALSE(bulging.Contains(root_cell));
270
+ EXPECT_EQ(cap_face != anti_face, bulging.MayIntersect(root_cell));
271
+ EXPECT_EQ(cap_face == face, bulging.Contains(edge_cell));
272
+ EXPECT_EQ(center.DotProd(edge_cell.GetCenter()) > 0.1,
273
+ bulging.MayIntersect(edge_cell));
274
+ EXPECT_FALSE(bulging.Contains(corner_cell));
275
+ EXPECT_FALSE(bulging.MayIntersect(corner_cell));
276
+
277
+ // A singleton cap.
278
+ S2Cap singleton(center, S1Angle::Zero());
279
+ EXPECT_EQ(cap_face == face, singleton.MayIntersect(root_cell));
280
+ EXPECT_FALSE(singleton.MayIntersect(edge_cell));
281
+ EXPECT_FALSE(singleton.MayIntersect(corner_cell));
282
+ }
283
+ }
284
+ }
285
+
286
+ TEST(S2Cap, GetCellUnionBoundLevel1Radius) {
287
+ // Check that a cap whose radius is approximately the width of a level 1
288
+ // S2Cell can be covered by only 3 faces.
289
+ S2Cap cap(S2Point(1, 1, 1).Normalize(),
290
+ S1Angle::Radians(S2::kMinWidth.GetValue(1)));
291
+ vector<S2CellId> covering;
292
+ cap.GetCellUnionBound(&covering);
293
+ EXPECT_EQ(3, covering.size());
294
+ }
295
+
296
+ TEST(S2Cap, Expanded) {
297
+ EXPECT_TRUE(S2Cap::Empty().Expanded(S1Angle::Radians(2)).is_empty());
298
+ EXPECT_TRUE(S2Cap::Full().Expanded(S1Angle::Radians(2)).is_full());
299
+ S2Cap cap50(S2Point(1, 0, 0), S1Angle::Degrees(50));
300
+ S2Cap cap51(S2Point(1, 0, 0), S1Angle::Degrees(51));
301
+ EXPECT_TRUE(cap50.Expanded(S1Angle::Radians(0)).ApproxEquals(cap50));
302
+ EXPECT_TRUE(cap50.Expanded(S1Angle::Degrees(1)).ApproxEquals(cap51));
303
+ EXPECT_FALSE(cap50.Expanded(S1Angle::Degrees(129.99)).is_full());
304
+ EXPECT_TRUE(cap50.Expanded(S1Angle::Degrees(130.01)).is_full());
305
+ }
306
+
307
+ TEST(S2Cap, GetCentroid) {
308
+ // Empty and full caps.
309
+ EXPECT_EQ(S2Point(), S2Cap::Empty().GetCentroid());
310
+ EXPECT_LE(S2Cap::Full().GetCentroid().Norm(), 1e-15);
311
+
312
+ // Random caps.
313
+ for (int i = 0; i < 100; ++i) {
314
+ S2Point center = S2Testing::RandomPoint();
315
+ double height = S2Testing::rnd.UniformDouble(0.0, 2.0);
316
+ S2Cap cap = S2Cap::FromCenterHeight(center, height);
317
+ S2Point centroid = cap.GetCentroid();
318
+ S2Point expected = center * (1.0 - height / 2.0) * cap.GetArea();
319
+ EXPECT_LE((expected - centroid).Norm(), 1e-15);
320
+ }
321
+ }
322
+
323
+ TEST(S2Cap, Union) {
324
+ // Two caps which have the same center but one has a larger radius.
325
+ S2Cap a = S2Cap(GetLatLngPoint(50.0, 10.0), S1Angle::Degrees(0.2));
326
+ S2Cap b = S2Cap(GetLatLngPoint(50.0, 10.0), S1Angle::Degrees(0.3));
327
+ EXPECT_TRUE(b.Contains(a));
328
+ EXPECT_EQ(b, a.Union(b));
329
+
330
+ // Two caps where one is the full cap.
331
+ EXPECT_TRUE(a.Union(S2Cap::Full()).is_full());
332
+
333
+ // Two caps where one is the empty cap.
334
+ EXPECT_EQ(a, a.Union(S2Cap::Empty()));
335
+
336
+ // Two caps which have different centers, one entirely encompasses the other.
337
+ S2Cap c = S2Cap(GetLatLngPoint(51.0, 11.0), S1Angle::Degrees(1.5));
338
+ EXPECT_TRUE(c.Contains(a));
339
+ EXPECT_EQ(a.Union(c).center(), c.center());
340
+ EXPECT_EQ(a.Union(c).GetRadius(), c.GetRadius());
341
+
342
+ // Two entirely disjoint caps.
343
+ S2Cap d = S2Cap(GetLatLngPoint(51.0, 11.0), S1Angle::Degrees(0.1));
344
+ EXPECT_FALSE(d.Contains(a));
345
+ EXPECT_FALSE(d.Intersects(a));
346
+ EXPECT_TRUE(a.Union(d).ApproxEquals(d.Union(a)));
347
+ EXPECT_NEAR(50.4588, S2LatLng(a.Union(d).center()).lat().degrees(), 0.001);
348
+ EXPECT_NEAR(10.4525, S2LatLng(a.Union(d).center()).lng().degrees(), 0.001);
349
+ EXPECT_NEAR(0.7425, a.Union(d).GetRadius().degrees(), 0.001);
350
+
351
+ // Two partially overlapping caps.
352
+ S2Cap e = S2Cap(GetLatLngPoint(50.3, 10.3), S1Angle::Degrees(0.2));
353
+ EXPECT_FALSE(e.Contains(a));
354
+ EXPECT_TRUE(e.Intersects(a));
355
+ EXPECT_TRUE(a.Union(e).ApproxEquals(e.Union(a)));
356
+ EXPECT_NEAR(50.1500, S2LatLng(a.Union(e).center()).lat().degrees(), 0.001);
357
+ EXPECT_NEAR(10.1495, S2LatLng(a.Union(e).center()).lng().degrees(), 0.001);
358
+ EXPECT_NEAR(0.3781, a.Union(e).GetRadius().degrees(), 0.001);
359
+
360
+ // Two very large caps, whose radius sums to in excess of 180 degrees, and
361
+ // whose centers are not antipodal.
362
+ S2Cap f = S2Cap(S2Point(0, 0, 1).Normalize(), S1Angle::Degrees(150));
363
+ S2Cap g = S2Cap(S2Point(0, 1, 0).Normalize(), S1Angle::Degrees(150));
364
+ EXPECT_TRUE(f.Union(g).is_full());
365
+
366
+ // Two non-overlapping hemisphere caps with antipodal centers.
367
+ S2Cap hemi = S2Cap::FromCenterHeight(S2Point(0, 0, 1).Normalize(), 1);
368
+ EXPECT_TRUE(hemi.Union(hemi.Complement()).is_full());
369
+ }
370
+
371
+ TEST(S2Cap, EncodeDecode) {
372
+ S2Cap cap = S2Cap::FromCenterHeight(S2Point(3, 2, 1).Normalize(), 1);
373
+ Encoder encoder;
374
+ cap.Encode(&encoder);
375
+ Decoder decoder(encoder.base(), encoder.length());
376
+ S2Cap decoded_cap;
377
+ EXPECT_TRUE(decoded_cap.Decode(&decoder));
378
+ EXPECT_EQ(cap, decoded_cap);
379
+ }