@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,292 @@
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_S2R2RECT_H_
19
+ #define S2_S2R2RECT_H_
20
+
21
+ #include <iosfwd>
22
+
23
+ #include "s2/base/logging.h"
24
+ #include "s2/_fp_contract_off.h"
25
+ #include "s2/r1interval.h"
26
+ #include "s2/r2.h"
27
+ #include "s2/r2rect.h"
28
+ #include "s2/s1angle.h"
29
+ #include "s2/s2region.h"
30
+
31
+ class Decoder;
32
+ class Encoder;
33
+ class R1Interval;
34
+ class S2Cap;
35
+ class S2Cell;
36
+ class S2CellId;
37
+ class S2LatLngRect;
38
+
39
+ // This class is a stopgap measure that allows some of the S2 spherical
40
+ // geometry machinery to be applied to planar geometry. An S2R2Rect
41
+ // represents a closed axis-aligned rectangle in the (x,y) plane (an R2Rect),
42
+ // but it also happens to be a subtype of S2Region, which means that you can
43
+ // use an S2RegionCoverer to approximate it as a collection of S2CellIds.
44
+ //
45
+ // With respect to the S2Cell decomposition, an S2R2Rect is interpreted as a
46
+ // region of (s,t)-space on face 0. In particular, the rectangle [0,1]x[0,1]
47
+ // corresponds to the S2CellId that covers all of face 0. This means that
48
+ // only rectangles that are subsets of [0,1]x[0,1] can be approximated using
49
+ // the S2RegionCoverer interface.
50
+ //
51
+ // The S2R2Rect class is also a convenient way to find the (s,t)-region
52
+ // covered by a given S2CellId (see the FromCell and FromCellId methods).
53
+ //
54
+ // TODO(ericv): If the geometry library is extended to have better support
55
+ // for planar geometry, then this class should no longer be necessary.
56
+ //
57
+ // This class is intended to be copied by value as desired. It uses
58
+ // the default copy constructor and assignment operator, however it is
59
+ // not a "plain old datatype" (POD) because it has virtual functions.
60
+ class S2R2Rect final : public S2Region {
61
+ public:
62
+ // Construct a rectangle from an R2Rect.
63
+ explicit S2R2Rect(const R2Rect& rect);
64
+
65
+ // Construct a rectangle from the given lower-left and upper-right points.
66
+ S2R2Rect(const R2Point& lo, const R2Point& hi);
67
+
68
+ // Construct a rectangle from the given intervals in x and y. The two
69
+ // intervals must either be both empty or both non-empty.
70
+ S2R2Rect(const R1Interval& x, const R1Interval& y);
71
+
72
+ // The canonical empty rectangle. Use is_empty() to test for empty
73
+ // rectangles, since they have more than one representation.
74
+ static S2R2Rect Empty();
75
+
76
+ // Construct a rectangle that corresponds to the boundary of the given cell
77
+ // is (s,t)-space. Such rectangles are always a subset of [0,1]x[0,1].
78
+ static S2R2Rect FromCell(const S2Cell& cell);
79
+ static S2R2Rect FromCellId(S2CellId id);
80
+
81
+ // Construct a rectangle from a center point and size in each dimension.
82
+ // Both components of size should be non-negative, i.e. this method cannot
83
+ // be used to create an empty rectangle.
84
+ static S2R2Rect FromCenterSize(const R2Point& center, const R2Point& size);
85
+
86
+ // Convenience method to construct a rectangle containing a single point.
87
+ static S2R2Rect FromPoint(const R2Point& p);
88
+
89
+ // Convenience method to construct the minimal bounding rectangle containing
90
+ // the two given points. This is equivalent to starting with an empty
91
+ // rectangle and calling AddPoint() twice. Note that it is different than
92
+ // the S2R2Rect(lo, hi) constructor, where the first point is always
93
+ // used as the lower-left corner of the resulting rectangle.
94
+ static S2R2Rect FromPointPair(const R2Point& p1, const R2Point& p2);
95
+
96
+ // Accessor methods.
97
+ const R1Interval& x() const;
98
+ const R1Interval& y() const;
99
+ R2Point lo() const;
100
+ R2Point hi() const;
101
+
102
+ // Methods that allow the S2R2Rect to be accessed as a vector.
103
+ const R1Interval& operator[](int i) const;
104
+ R1Interval& operator[](int i);
105
+
106
+ // Return true if the rectangle is valid, which essentially just means
107
+ // that if the bound for either axis is empty then both must be.
108
+ bool is_valid() const;
109
+
110
+ // Return true if the rectangle is empty, i.e. it contains no points at all.
111
+ bool is_empty() const;
112
+
113
+ // Return the k-th vertex of the rectangle (k = 0,1,2,3) in CCW order.
114
+ // Vertex 0 is in the lower-left corner. For convenience, the argument is
115
+ // reduced modulo 4 to the range [0..3].
116
+ R2Point GetVertex(int k) const;
117
+
118
+ // Return the vertex in direction "i" along the x-axis (0=left, 1=right) and
119
+ // direction "j" along the y-axis (0=down, 1=up). Equivalently, return the
120
+ // vertex constructed by selecting endpoint "i" of the x-interval (0=lo,
121
+ // 1=hi) and vertex "j" of the y-interval.
122
+ R2Point GetVertex(int i, int j) const;
123
+
124
+ // Return the center of the rectangle in (x,y)-space
125
+ // (in general this is not the center of the region on the sphere).
126
+ R2Point GetCenter() const;
127
+
128
+ // Return the width and height of this rectangle in (x,y)-space. Empty
129
+ // rectangles have a negative width and height.
130
+ R2Point GetSize() const;
131
+
132
+ // Return true if the rectangle contains the given point. Note that
133
+ // rectangles are closed regions, i.e. they contain their boundary.
134
+ bool Contains(const R2Point& p) const;
135
+
136
+ // Return true if and only if the given point is contained in the interior
137
+ // of the region (i.e. the region excluding its boundary).
138
+ bool InteriorContains(const R2Point& p) const;
139
+
140
+ // Return true if and only if the rectangle contains the given other
141
+ // rectangle.
142
+ bool Contains(const S2R2Rect& other) const;
143
+
144
+ // Return true if and only if the interior of this rectangle contains all
145
+ // points of the given other rectangle (including its boundary).
146
+ bool InteriorContains(const S2R2Rect& other) const;
147
+
148
+ // Return true if this rectangle and the given other rectangle have any
149
+ // points in common.
150
+ bool Intersects(const S2R2Rect& other) const;
151
+
152
+ // Return true if and only if the interior of this rectangle intersects
153
+ // any point (including the boundary) of the given other rectangle.
154
+ bool InteriorIntersects(const S2R2Rect& other) const;
155
+
156
+ // Increase the size of the bounding rectangle to include the given point.
157
+ // The rectangle is expanded by the minimum amount possible.
158
+ void AddPoint(const R2Point& p);
159
+
160
+ // Return the closest point in the rectangle to the given point "p".
161
+ // The rectangle must be non-empty.
162
+ R2Point Project(const R2Point& p) const;
163
+
164
+ // Return a rectangle that has been expanded on each side in the x-direction
165
+ // by margin.x(), and on each side in the y-direction by margin.y(). If
166
+ // either margin is negative, then shrink the interval on the corresponding
167
+ // sides instead. The resulting rectangle may be empty. Any expansion of
168
+ // an empty rectangle remains empty.
169
+ S2R2Rect Expanded(const R2Point& margin) const;
170
+ S2R2Rect Expanded(double margin) const;
171
+
172
+ // Return the smallest rectangle containing the union of this rectangle and
173
+ // the given rectangle.
174
+ S2R2Rect Union(const S2R2Rect& other) const;
175
+
176
+ // Return the smallest rectangle containing the intersection of this
177
+ // rectangle and the given rectangle.
178
+ S2R2Rect Intersection(const S2R2Rect& other) const;
179
+
180
+ // Return true if two rectangles contains the same set of points.
181
+ bool operator==(const S2R2Rect& other) const;
182
+
183
+ // Return true if the x- and y-intervals of the two rectangles are the same
184
+ // up to the given tolerance (see r1interval.h for details).
185
+ bool ApproxEquals(const S2R2Rect& other,
186
+ S1Angle max_error = S1Angle::Radians(1e-15)) const;
187
+
188
+ // Return the unit-length S2Point corresponding to the given point "p" in
189
+ // the (s,t)-plane. "p" need not be restricted to the range [0,1]x[0,1].
190
+ static S2Point ToS2Point(const R2Point& p);
191
+
192
+ ////////////////////////////////////////////////////////////////////////
193
+ // S2Region interface (see s2region.h for details):
194
+
195
+ S2R2Rect* Clone() const override;
196
+ S2Cap GetCapBound() const override;
197
+ S2LatLngRect GetRectBound() const override;
198
+ bool Contains(const S2Point& p) const override;
199
+ bool Contains(const S2Cell& cell) const override;
200
+ bool MayIntersect(const S2Cell& cell) const override;
201
+
202
+ private:
203
+ R2Rect rect_;
204
+ };
205
+
206
+ std::ostream& operator<<(std::ostream& os, const S2R2Rect& r);
207
+
208
+
209
+ ////////////////// Implementation details follow ////////////////////
210
+
211
+
212
+ inline S2R2Rect::S2R2Rect(const R2Rect& rect) : rect_(rect) {}
213
+
214
+ inline S2R2Rect::S2R2Rect(const R2Point& lo, const R2Point& hi)
215
+ : rect_(lo, hi) {}
216
+
217
+ inline S2R2Rect::S2R2Rect(const R1Interval& x, const R1Interval& y)
218
+ : rect_(x, y) {}
219
+
220
+ inline S2R2Rect S2R2Rect::FromCenterSize(const R2Point& center,
221
+ const R2Point& size) {
222
+ return S2R2Rect(R2Rect::FromCenterSize(center, size));
223
+ }
224
+
225
+ inline S2R2Rect S2R2Rect::FromPoint(const R2Point& p) {
226
+ return S2R2Rect(R2Rect::FromPoint(p));
227
+ }
228
+
229
+ inline S2R2Rect S2R2Rect::FromPointPair(const R2Point& p1, const R2Point& p2) {
230
+ return S2R2Rect(R2Rect::FromPointPair(p1, p2));
231
+ }
232
+
233
+ inline const R1Interval& S2R2Rect::x() const { return rect_.x(); }
234
+ inline const R1Interval& S2R2Rect::y() const { return rect_.y(); }
235
+ inline R2Point S2R2Rect::lo() const { return rect_.lo(); }
236
+ inline R2Point S2R2Rect::hi() const { return rect_.hi(); }
237
+ inline const R1Interval& S2R2Rect::operator[](int i) const { return rect_[i]; }
238
+ inline R1Interval& S2R2Rect::operator[](int i) { return rect_[i]; }
239
+ inline S2R2Rect S2R2Rect::Empty() { return S2R2Rect(R2Rect::Empty()); }
240
+ inline bool S2R2Rect::is_valid() const { return rect_.is_valid(); }
241
+ inline bool S2R2Rect::is_empty() const { return rect_.is_empty(); }
242
+ inline R2Point S2R2Rect::GetVertex(int k) const { return rect_.GetVertex(k); }
243
+ inline R2Point S2R2Rect::GetVertex(int i, int j) const {
244
+ return rect_.GetVertex(i, j);
245
+ }
246
+ inline R2Point S2R2Rect::GetCenter() const { return rect_.GetCenter(); }
247
+ inline R2Point S2R2Rect::GetSize() const { return rect_.GetSize(); }
248
+ inline bool S2R2Rect::Contains(const R2Point& p) const {
249
+ return rect_.Contains(p);
250
+ }
251
+ inline bool S2R2Rect::InteriorContains(const R2Point& p) const {
252
+ return rect_.InteriorContains(p);
253
+ }
254
+ inline bool S2R2Rect::Contains(const S2R2Rect& other) const {
255
+ return rect_.Contains(other.rect_);
256
+ }
257
+ inline bool S2R2Rect::InteriorContains(const S2R2Rect& other) const {
258
+ return rect_.InteriorContains(other.rect_);
259
+ }
260
+ inline bool S2R2Rect::Intersects(const S2R2Rect& other) const {
261
+ return rect_.Intersects(other.rect_);
262
+ }
263
+ inline bool S2R2Rect::InteriorIntersects(const S2R2Rect& other) const {
264
+ return rect_.InteriorIntersects(other.rect_);
265
+ }
266
+ inline void S2R2Rect::AddPoint(const R2Point& p) {
267
+ rect_.AddPoint(p);
268
+ }
269
+ inline R2Point S2R2Rect::Project(const R2Point& p) const {
270
+ return rect_.Project(p);
271
+ }
272
+ inline S2R2Rect S2R2Rect::Expanded(const R2Point& margin) const {
273
+ return S2R2Rect(rect_.Expanded(margin));
274
+ }
275
+ inline S2R2Rect S2R2Rect::Expanded(double margin) const {
276
+ return S2R2Rect(rect_.Expanded(margin));
277
+ }
278
+ inline S2R2Rect S2R2Rect::Union(const S2R2Rect& other) const {
279
+ return S2R2Rect(rect_.Union(other.rect_));
280
+ }
281
+ inline S2R2Rect S2R2Rect::Intersection(const S2R2Rect& other) const {
282
+ return S2R2Rect(rect_.Intersection(other.rect_));
283
+ }
284
+ inline bool S2R2Rect::operator==(const S2R2Rect& other) const {
285
+ return rect_ == other.rect_;
286
+ }
287
+ inline bool S2R2Rect::ApproxEquals(const S2R2Rect& other,
288
+ S1Angle max_error) const {
289
+ return rect_.ApproxEquals(other.rect_, max_error.radians());
290
+ }
291
+
292
+ #endif // S2_S2R2RECT_H_
@@ -0,0 +1,312 @@
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
+ // Most of the S2R2Rect methods have trivial implementations in terms of the
19
+ // R1Interval class, so most of the testing is done in that unit test.
20
+
21
+ #include "s2/s2r2rect.h"
22
+
23
+ #include <gtest/gtest.h>
24
+
25
+ #include "s2/base/integral_types.h"
26
+ #include "s2/r1interval.h"
27
+ #include "s2/s2cap.h"
28
+ #include "s2/s2cell.h"
29
+ #include "s2/s2cell_id.h"
30
+ #include "s2/s2coords.h"
31
+ #include "s2/s2latlng.h"
32
+ #include "s2/s2latlng_rect.h"
33
+ #include "s2/s2pointutil.h"
34
+ #include "s2/s2testing.h"
35
+ #include "s2/third_party/absl/strings/str_cat.h"
36
+
37
+ using absl::StrCat;
38
+
39
+ static void TestIntervalOps(const S2R2Rect& x, const S2R2Rect& y,
40
+ const char* expected_rexion,
41
+ const S2R2Rect& expected_union,
42
+ const S2R2Rect& expected_intersection) {
43
+ // Test all of the interval operations on the given pair of intervals.
44
+ // "expected_rexion" is a sequence of "T" and "F" characters corresponding
45
+ // to the expected results of Contains(), InteriorContains(), Intersects(),
46
+ // and InteriorIntersects() respectively.
47
+
48
+ EXPECT_EQ(expected_rexion[0] == 'T', x.Contains(y));
49
+ EXPECT_EQ(expected_rexion[1] == 'T', x.InteriorContains(y));
50
+ EXPECT_EQ(expected_rexion[2] == 'T', x.Intersects(y));
51
+ EXPECT_EQ(expected_rexion[3] == 'T', x.InteriorIntersects(y));
52
+
53
+ EXPECT_EQ(x.Union(y) == x, x.Contains(y));
54
+ EXPECT_EQ(!x.Intersection(y).is_empty(), x.Intersects(y));
55
+
56
+ EXPECT_EQ(expected_union, x.Union(y));
57
+ EXPECT_EQ(expected_intersection, x.Intersection(y));
58
+
59
+ if (y.GetSize() == R2Point(0, 0)) {
60
+ S2R2Rect r = x;
61
+ r.AddPoint(y.lo());
62
+ EXPECT_EQ(expected_union, r);
63
+ }
64
+ }
65
+
66
+ static void TestCellOps(const S2R2Rect& r, const S2Cell& cell, int level) {
67
+ // Test the relationship between the given rectangle and cell:
68
+ // 0 == no intersection, 2 == Intersects,
69
+ // 3 == Intersects and one region contains a vertex of the other,
70
+ // 4 == Contains
71
+
72
+ bool vertex_contained = false;
73
+ for (int i = 0; i < 4; ++i) {
74
+ // This would be easier to do by constructing an S2R2Rect from the cell,
75
+ // but that would defeat the purpose of testing this code independently.
76
+ double u, v;
77
+ if (S2::FaceXYZtoUV(0, cell.GetVertexRaw(i), &u, &v)) {
78
+ if (r.Contains(R2Point(S2::UVtoST(u), S2::UVtoST(v))))
79
+ vertex_contained = true;
80
+ }
81
+ if (!r.is_empty() && cell.Contains(S2R2Rect::ToS2Point(r.GetVertex(i))))
82
+ vertex_contained = true;
83
+ }
84
+ EXPECT_EQ(level >= 2, r.MayIntersect(cell));
85
+ EXPECT_EQ(level >= 3, vertex_contained);
86
+ EXPECT_EQ(level >= 4, r.Contains(cell));
87
+ }
88
+
89
+ TEST(S2R2Rect, EmptyRectangles) {
90
+ // Test basic properties of empty rectangles.
91
+ S2R2Rect empty = S2R2Rect::Empty();
92
+ EXPECT_TRUE(empty.is_valid());
93
+ EXPECT_TRUE(empty.is_empty());
94
+ }
95
+
96
+ TEST(S2R2Rect, ConstructorsAndAccessors) {
97
+ // Check various constructors and accessor methods.
98
+ S2R2Rect d1 = S2R2Rect(R2Point(0.1, 0), R2Point(0.25, 1));
99
+ EXPECT_EQ(0.1, d1.x().lo());
100
+ EXPECT_EQ(0.25, d1.x().hi());
101
+ EXPECT_EQ(0.0, d1.y().lo());
102
+ EXPECT_EQ(1.0, d1.y().hi());
103
+ EXPECT_EQ(R1Interval(0.1, 0.25), d1.x());
104
+ EXPECT_EQ(R1Interval(0, 1), d1.y());
105
+ }
106
+
107
+ TEST(S2R2Rect, FromCell) {
108
+ // FromCell, FromCellId
109
+ EXPECT_EQ(S2R2Rect(R2Point(0, 0), R2Point(0.5, 0.5)),
110
+ S2R2Rect::FromCell(S2Cell::FromFacePosLevel(0, 0, 1)));
111
+ EXPECT_EQ(S2R2Rect(R2Point(0, 0), R2Point(1, 1)),
112
+ S2R2Rect::FromCellId(S2CellId::FromFacePosLevel(0, 0, 0)));
113
+ }
114
+
115
+ TEST(S2R2Rect, FromCenterSize) {
116
+ // FromCenterSize()
117
+ EXPECT_TRUE(S2R2Rect::FromCenterSize(R2Point(0.3, 0.5), R2Point(0.2, 0.4)).
118
+ ApproxEquals(S2R2Rect(R2Point(0.2, 0.3), R2Point(0.4, 0.7))));
119
+ EXPECT_TRUE(S2R2Rect::FromCenterSize(R2Point(1, 0.1), R2Point(0, 2)).
120
+ ApproxEquals(S2R2Rect(R2Point(1, -0.9), R2Point(1, 1.1))));
121
+ }
122
+
123
+ TEST(S2R2Rect, FromPoint) {
124
+ // FromPoint(), FromPointPair()
125
+ S2R2Rect d1 = S2R2Rect(R2Point(0.1, 0), R2Point(0.25, 1));
126
+ EXPECT_EQ(S2R2Rect(d1.lo(), d1.lo()), S2R2Rect::FromPoint(d1.lo()));
127
+ EXPECT_EQ(S2R2Rect(R2Point(0.15, 0.3), R2Point(0.35, 0.9)),
128
+ S2R2Rect::FromPointPair(R2Point(0.15, 0.9), R2Point(0.35, 0.3)));
129
+ EXPECT_EQ(S2R2Rect(R2Point(0.12, 0), R2Point(0.83, 0.5)),
130
+ S2R2Rect::FromPointPair(R2Point(0.83, 0), R2Point(0.12, 0.5)));
131
+ }
132
+
133
+ TEST(S2R2Rect, SimplePredicates) {
134
+ // GetCenter(), GetVertex(), Contains(R2Point), InteriorContains(R2Point).
135
+ R2Point sw1 = R2Point(0, 0.25);
136
+ R2Point ne1 = R2Point(0.5, 0.75);
137
+ S2R2Rect r1(sw1, ne1);
138
+
139
+ EXPECT_EQ(R2Point(0.25, 0.5), r1.GetCenter());
140
+ EXPECT_EQ(R2Point(0, 0.25), r1.GetVertex(0));
141
+ EXPECT_EQ(R2Point(0.5, 0.25), r1.GetVertex(1));
142
+ EXPECT_EQ(R2Point(0.5, 0.75), r1.GetVertex(2));
143
+ EXPECT_EQ(R2Point(0, 0.75), r1.GetVertex(3));
144
+ EXPECT_TRUE(r1.Contains(R2Point(0.2, 0.4)));
145
+ EXPECT_FALSE(r1.Contains(R2Point(0.2, 0.8)));
146
+ EXPECT_FALSE(r1.Contains(R2Point(-0.1, 0.4)));
147
+ EXPECT_FALSE(r1.Contains(R2Point(0.6, 0.1)));
148
+ EXPECT_TRUE(r1.Contains(sw1));
149
+ EXPECT_TRUE(r1.Contains(ne1));
150
+ EXPECT_FALSE(r1.InteriorContains(sw1));
151
+ EXPECT_FALSE(r1.InteriorContains(ne1));
152
+
153
+ // Make sure that GetVertex() returns vertices in CCW order.
154
+ for (int k = 0; k < 4; ++k) {
155
+ SCOPED_TRACE(StrCat("k=", k));
156
+ EXPECT_TRUE(S2::SimpleCCW(S2R2Rect::ToS2Point(r1.GetVertex(k - 1)),
157
+ S2R2Rect::ToS2Point(r1.GetVertex(k)),
158
+ S2R2Rect::ToS2Point(r1.GetVertex(k + 1))));
159
+ }
160
+ }
161
+
162
+ TEST(S2R2Rect, IntervalOperations) {
163
+ // Contains(S2R2Rect), InteriorContains(S2R2Rect),
164
+ // Intersects(), InteriorIntersects(), Union(), Intersection().
165
+ //
166
+ // Much more testing of these methods is done in s1interval_test
167
+ // and r1interval_test.
168
+
169
+ S2R2Rect empty = S2R2Rect::Empty();
170
+ R2Point sw1 = R2Point(0, 0.25);
171
+ R2Point ne1 = R2Point(0.5, 0.75);
172
+ S2R2Rect r1(sw1, ne1);
173
+ S2R2Rect r1_mid = S2R2Rect(R2Point(0.25, 0.5), R2Point(0.25, 0.5));
174
+ S2R2Rect r_sw1(sw1, sw1);
175
+ S2R2Rect r_ne1(ne1, ne1);
176
+
177
+ TestIntervalOps(r1, r1_mid, "TTTT", r1, r1_mid);
178
+ TestIntervalOps(r1, r_sw1, "TFTF", r1, r_sw1);
179
+ TestIntervalOps(r1, r_ne1, "TFTF", r1, r_ne1);
180
+
181
+ EXPECT_EQ(S2R2Rect(R2Point(0, 0.25), R2Point(0.5, 0.75)), r1);
182
+ TestIntervalOps(r1, S2R2Rect(R2Point(0.45, 0.1), R2Point(0.75, 0.3)), "FFTT",
183
+ S2R2Rect(R2Point(0, 0.1), R2Point(0.75, 0.75)),
184
+ S2R2Rect(R2Point(0.45, 0.25), R2Point(0.5, 0.3)));
185
+ TestIntervalOps(r1, S2R2Rect(R2Point(0.5, 0.1), R2Point(0.7, 0.3)), "FFTF",
186
+ S2R2Rect(R2Point(0, 0.1), R2Point(0.7, 0.75)),
187
+ S2R2Rect(R2Point(0.5, 0.25), R2Point(0.5, 0.3)));
188
+ TestIntervalOps(r1, S2R2Rect(R2Point(0.45, 0.1), R2Point(0.7, 0.25)), "FFTF",
189
+ S2R2Rect(R2Point(0, 0.1), R2Point(0.7, 0.75)),
190
+ S2R2Rect(R2Point(0.45, 0.25), R2Point(0.5, 0.25)));
191
+
192
+ TestIntervalOps(S2R2Rect(R2Point(0.1, 0.2), R2Point(0.1, 0.3)),
193
+ S2R2Rect(R2Point(0.15, 0.7), R2Point(0.2, 0.8)), "FFFF",
194
+ S2R2Rect(R2Point(0.1, 0.2), R2Point(0.2, 0.8)),
195
+ empty);
196
+
197
+ // Check that the intersection of two rectangles that overlap in x but not y
198
+ // is valid, and vice versa.
199
+ TestIntervalOps(S2R2Rect(R2Point(0.1, 0.2), R2Point(0.4, 0.5)),
200
+ S2R2Rect(R2Point(0, 0), R2Point(0.2, 0.1)), "FFFF",
201
+ S2R2Rect(R2Point(0, 0), R2Point(0.4, 0.5)), empty);
202
+ TestIntervalOps(S2R2Rect(R2Point(0, 0), R2Point(0.1, 0.3)),
203
+ S2R2Rect(R2Point(0.2, 0.1), R2Point(0.3, 0.4)), "FFFF",
204
+ S2R2Rect(R2Point(0, 0), R2Point(0.3, 0.4)), empty);
205
+ }
206
+
207
+ TEST(S2R2Rect, AddPoint) {
208
+ // AddPoint()
209
+ R2Point sw1 = R2Point(0, 0.25);
210
+ R2Point ne1 = R2Point(0.5, 0.75);
211
+ S2R2Rect r1(sw1, ne1);
212
+
213
+ S2R2Rect r2 = S2R2Rect::Empty();
214
+ r2.AddPoint(R2Point(0, 0.25));
215
+ r2.AddPoint(R2Point(0.5, 0.25));
216
+ r2.AddPoint(R2Point(0, 0.75));
217
+ r2.AddPoint(R2Point(0.1, 0.4));
218
+ EXPECT_EQ(r1, r2);
219
+ }
220
+
221
+ TEST(S2R2Rect, Project) {
222
+ S2R2Rect r1(R1Interval(0, 0.5), R1Interval(0.25, 0.75));
223
+
224
+ EXPECT_EQ(R2Point(0, 0.25), r1.Project(R2Point(-0.01, 0.24)));
225
+ EXPECT_EQ(R2Point(0, 0.48), r1.Project(R2Point(-5.0, 0.48)));
226
+ EXPECT_EQ(R2Point(0, 0.75), r1.Project(R2Point(-5.0, 2.48)));
227
+ EXPECT_EQ(R2Point(0.19, 0.75), r1.Project(R2Point(0.19, 2.48)));
228
+ EXPECT_EQ(R2Point(0.5, 0.75), r1.Project(R2Point(6.19, 2.48)));
229
+ EXPECT_EQ(R2Point(0.5, 0.53), r1.Project(R2Point(6.19, 0.53)));
230
+ EXPECT_EQ(R2Point(0.5, 0.25), r1.Project(R2Point(6.19, -2.53)));
231
+ EXPECT_EQ(R2Point(0.33, 0.25), r1.Project(R2Point(0.33, -2.53)));
232
+ EXPECT_EQ(R2Point(0.33, 0.37), r1.Project(R2Point(0.33, 0.37)));
233
+ }
234
+
235
+ TEST(S2R2Rect, Expanded) {
236
+ // Expanded()
237
+ EXPECT_TRUE(S2R2Rect::Empty().Expanded(R2Point(0.1, 0.3)).is_empty());
238
+ EXPECT_TRUE(S2R2Rect::Empty().Expanded(R2Point(-0.1, -0.3)).is_empty());
239
+ EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
240
+ Expanded(R2Point(0.1, 0.3)).
241
+ ApproxEquals(S2R2Rect(R2Point(0.1, 0.1), R2Point(0.4, 1.0))));
242
+ EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
243
+ Expanded(R2Point(-0.1, 0.3)).is_empty());
244
+ EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
245
+ Expanded(R2Point(0.1, -0.2)).is_empty());
246
+ EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).
247
+ Expanded(R2Point(0.1, -0.1)).
248
+ ApproxEquals(S2R2Rect(R2Point(0.1, 0.5), R2Point(0.4, 0.6))));
249
+ EXPECT_TRUE(S2R2Rect(R2Point(0.2, 0.4), R2Point(0.3, 0.7)).Expanded(0.1).
250
+ ApproxEquals(S2R2Rect(R2Point(0.1, 0.3), R2Point(0.4, 0.8))));
251
+ }
252
+
253
+ TEST(S2R2Rect, Bounds) {
254
+ // GetCapBound(), GetRectBound()
255
+ S2R2Rect empty = S2R2Rect::Empty();
256
+ EXPECT_TRUE(empty.GetCapBound().is_empty());
257
+ EXPECT_TRUE(empty.GetRectBound().is_empty());
258
+ EXPECT_EQ(S2Cap::FromPoint(S2Point(1, 0, 0)),
259
+ S2R2Rect(R2Point(0.5, 0.5), R2Point(0.5, 0.5)).GetCapBound());
260
+ EXPECT_EQ(S2LatLngRect::FromPoint(S2LatLng::FromDegrees(0, 0)),
261
+ S2R2Rect(R2Point(0.5, 0.5), R2Point(0.5, 0.5)).GetRectBound());
262
+
263
+ for (int i = 0; i < 10; ++i) {
264
+ SCOPED_TRACE(StrCat("i=", i));
265
+ S2R2Rect rect = S2R2Rect::FromCellId(S2Testing::GetRandomCellId());
266
+ S2Cap cap = rect.GetCapBound();
267
+ S2LatLngRect llrect = rect.GetRectBound();
268
+ for (int k = 0; k < 4; ++k) {
269
+ S2Point v = S2R2Rect::ToS2Point(rect.GetVertex(k));
270
+ // v2 is a point that is well outside the rectangle.
271
+ S2Point v2 = (cap.center() + 3 * (v - cap.center())).Normalize();
272
+ EXPECT_TRUE(cap.Contains(v));
273
+ EXPECT_FALSE(cap.Contains(v2));
274
+ EXPECT_TRUE(llrect.Contains(v));
275
+ EXPECT_FALSE(llrect.Contains(v2));
276
+ }
277
+ }
278
+ }
279
+
280
+ TEST(S2R2Rect, CellOperations) {
281
+ // Contains(S2Cell), MayIntersect(S2Cell)
282
+
283
+ S2R2Rect empty = S2R2Rect::Empty();
284
+ TestCellOps(empty, S2Cell::FromFace(3), 0);
285
+
286
+ // This rectangle includes the first quadrant of face 0. It's expanded
287
+ // slightly because cell bounding rectangles are slightly conservative.
288
+ S2R2Rect r4 = S2R2Rect(R2Point(0, 0), R2Point(0.5, 0.5));
289
+ TestCellOps(r4, S2Cell::FromFacePosLevel(0, 0, 0), 3);
290
+ TestCellOps(r4, S2Cell::FromFacePosLevel(0, 0, 1), 4);
291
+ TestCellOps(r4, S2Cell::FromFacePosLevel(1, 0, 1), 0);
292
+
293
+ // This rectangle intersects the first quadrant of face 0.
294
+ S2R2Rect r5 = S2R2Rect(R2Point(0, 0.45), R2Point(0.5, 0.55));
295
+ TestCellOps(r5, S2Cell::FromFacePosLevel(0, 0, 0), 3);
296
+ TestCellOps(r5, S2Cell::FromFacePosLevel(0, 0, 1), 3);
297
+ TestCellOps(r5, S2Cell::FromFacePosLevel(1, 0, 1), 0);
298
+
299
+ // Rectangle consisting of a single point.
300
+ TestCellOps(S2R2Rect(R2Point(0.51, 0.51), R2Point(0.51, 0.51)),
301
+ S2Cell::FromFace(0), 3);
302
+
303
+ // Rectangle that intersects the bounding rectangle of face 0
304
+ // but not the face itself.
305
+ TestCellOps(S2R2Rect(R2Point(0.01, 1.001), R2Point(0.02, 1.002)),
306
+ S2Cell::FromFace(0), 0);
307
+
308
+ // Rectangle that intersects one corner of face 0.
309
+ TestCellOps(S2R2Rect(R2Point(0.99, -0.01), R2Point(1.01, 0.01)),
310
+ S2Cell::FromFacePosLevel(0, ~uint64{0} >> S2CellId::kFaceBits, 5),
311
+ 3);
312
+ }
@@ -0,0 +1,26 @@
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/s2region.h"
19
+
20
+ #include <vector>
21
+
22
+ #include "s2/s2cap.h"
23
+
24
+ void S2Region::GetCellUnionBound(std::vector<S2CellId> *cell_ids) const {
25
+ return GetCapBound().GetCellUnionBound(cell_ids);
26
+ }