@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,487 @@
1
+ // Copyright 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
+ #include <memory>
17
+ #include <set>
18
+ #include <vector>
19
+
20
+ #include <gtest/gtest.h>
21
+ #include "s2/third_party/absl/memory/memory.h"
22
+ #include "s2/mutable_s2shape_index.h"
23
+ #include "s2/s1angle.h"
24
+ #include "s2/s2cap.h"
25
+ #include "s2/s2cell.h"
26
+ #include "s2/s2cell_id.h"
27
+ #include "s2/s2closest_edge_query_testing.h"
28
+ #include "s2/s2coords.h"
29
+ #include "s2/s2edge_distances.h"
30
+ #include "s2/s2furthest_edge_query.h"
31
+ #include "s2/s2loop.h"
32
+ #include "s2/s2metrics.h"
33
+ #include "s2/s2point.h"
34
+ #include "s2/s2polygon.h"
35
+ #include "s2/s2predicates.h"
36
+ #include "s2/s2testing.h"
37
+ #include "s2/s2text_format.h"
38
+
39
+ using absl::make_unique;
40
+ using s2textformat::MakeIndexOrDie;
41
+ using s2textformat::MakePointOrDie;
42
+ using s2textformat::ParsePointsOrDie;
43
+ using std::make_pair;
44
+ using std::min;
45
+ using std::pair;
46
+ using std::unique_ptr;
47
+ using std::vector;
48
+
49
+ TEST(S2FurthestEdgeQuery, NoEdges) {
50
+ MutableS2ShapeIndex index;
51
+ S2FurthestEdgeQuery query(&index);
52
+ S2FurthestEdgeQuery::PointTarget target(S2Point(1, 0, 0));
53
+ const auto edge = query.FindFurthestEdge(&target);
54
+ EXPECT_EQ(S1ChordAngle::Negative(), edge.distance());
55
+ EXPECT_EQ(-1, edge.edge_id());
56
+ EXPECT_EQ(-1, edge.shape_id());
57
+ EXPECT_EQ(S1ChordAngle::Negative(), query.GetDistance(&target));
58
+ }
59
+
60
+ TEST(S2FurthestEdgeQuery, OptionsNotModified) {
61
+ // Tests that FindFurthestEdge(), GetDistance(), and IsDistanceGreater() do
62
+ // not modify query.options(), even though all of these methods have their
63
+ // own specific options requirements.
64
+ S2FurthestEdgeQuery::Options options;
65
+ options.set_max_results(3);
66
+ options.set_min_distance(S1ChordAngle::Degrees(1));
67
+ options.set_max_error(S1ChordAngle::Degrees(0.001));
68
+ auto index = MakeIndexOrDie("0:1 | 0:2 | 0:3 # #");
69
+ S2FurthestEdgeQuery query(index.get(), options);
70
+ S2FurthestEdgeQuery::PointTarget target(MakePointOrDie("0:4"));
71
+ EXPECT_EQ(0, query.FindFurthestEdge(&target).edge_id());
72
+ EXPECT_NEAR(3.0, query.GetDistance(&target).degrees(), 1e-15);
73
+ EXPECT_TRUE(query.IsDistanceGreater(&target, S1ChordAngle::Degrees(1.5)));
74
+
75
+ // Verify that none of the options above were modified.
76
+ EXPECT_EQ(options.max_results(), query.options().max_results());
77
+ EXPECT_EQ(options.min_distance(), query.options().min_distance());
78
+ EXPECT_EQ(options.max_error(), query.options().max_error());
79
+ }
80
+
81
+ // In furthest edge queries, the following distance computation is used when
82
+ // updating max distances.
83
+ S1ChordAngle GetMaxDistanceToEdge(
84
+ const S2Point& x, const S2Point& y0, const S2Point& y1) {
85
+ S1ChordAngle dist = S1ChordAngle::Negative();
86
+ S2::UpdateMaxDistance(x, y0, y1, &dist);
87
+ return dist;
88
+ }
89
+
90
+ TEST(S2FurthestEdgeQuery, DistanceEqualToLimit) {
91
+ // Tests the behavior of IsDistanceGreater, IsDistanceGreaterOrEqual, and
92
+ // IsConservativeDistanceGreaterOrEqual (and the corresponding Options) when
93
+ // the distance to the target exactly equals the chosen limit.
94
+ S2Point p0(MakePointOrDie("23:12"));
95
+ S2Point p1(MakePointOrDie("47:11"));
96
+ vector<S2Point> index_points{p0};
97
+ MutableS2ShapeIndex index;
98
+ index.Add(make_unique<S2PointVectorShape>(index_points));
99
+ S2FurthestEdgeQuery query(&index);
100
+
101
+ // Start with antipodal points and a maximum (180 degrees) distance.
102
+ S2FurthestEdgeQuery::PointTarget target0(-p0);
103
+ S1ChordAngle dist_max = S1ChordAngle::Straight();
104
+ EXPECT_FALSE(query.IsDistanceGreater(&target0, dist_max));
105
+ EXPECT_TRUE(query.IsDistanceGreaterOrEqual(&target0, dist_max));
106
+ EXPECT_TRUE(query.IsConservativeDistanceGreaterOrEqual(&target0, dist_max));
107
+
108
+ // Now try two points separated by a non-maximal distance.
109
+ S2FurthestEdgeQuery::PointTarget target1(-p1);
110
+ S1ChordAngle dist1 = GetMaxDistanceToEdge(p0, -p1, -p1);
111
+ EXPECT_FALSE(query.IsDistanceGreater(&target1, dist1));
112
+ EXPECT_TRUE(query.IsDistanceGreaterOrEqual(&target1, dist1));
113
+ EXPECT_TRUE(query.IsConservativeDistanceGreaterOrEqual(&target1, dist1));
114
+ }
115
+
116
+ TEST(S2FurthestEdgeQuery, TrueDistanceGreaterThanS1ChordAngleDistance) {
117
+ // Tests that IsConservativeDistanceGreaterOrEqual returns points where the
118
+ // true distance is slightly greater than the one computed by S1ChordAngle.
119
+ //
120
+ // The points below had the worst error from among 1x10^6 random pairs.
121
+ S2Point p0(0.72362949088190598, -0.39019820403414807, -0.56930283812266336);
122
+ S2Point p1(0.54383822931548842, 0.758981734255934404, 0.35803171284238039);
123
+
124
+ // The S1ChordAngle distance is ~3 ulps greater than the true distance.
125
+ S1ChordAngle dist1 = GetMaxDistanceToEdge(p0, p1, p1);
126
+ auto limit = dist1.Successor().Successor().Successor();
127
+ ASSERT_GT(s2pred::CompareDistance(p0, p1, limit), 0);
128
+
129
+ // Verify that IsConservativeDistanceGreaterOrEqual() still returns "p1".
130
+ vector<S2Point> index_points{p0};
131
+ MutableS2ShapeIndex index;
132
+ index.Add(make_unique<S2PointVectorShape>(index_points));
133
+ S2FurthestEdgeQuery query(&index);
134
+ S2FurthestEdgeQuery::PointTarget target1(p1);
135
+ EXPECT_FALSE(query.IsDistanceGreater(&target1, limit));
136
+ EXPECT_FALSE(query.IsDistanceGreaterOrEqual(&target1, limit));
137
+ EXPECT_TRUE(query.IsConservativeDistanceGreaterOrEqual(&target1, limit));
138
+ }
139
+
140
+ TEST(S2FurthestEdgeQuery, AntipodalPointInsideIndexedPolygon) {
141
+ // Tests a target point antipodal to the interior of an indexed polygon.
142
+ // (The index also includes a polyline loop with no interior.)
143
+ auto index = MakeIndexOrDie("# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
144
+ S2FurthestEdgeQuery::Options options;
145
+
146
+ // First check that with include_interiors set to true, the distance is 180.
147
+ options.set_include_interiors(true);
148
+ options.set_min_distance(S1Angle::Degrees(178));
149
+ S2FurthestEdgeQuery query(index.get(), options);
150
+ S2FurthestEdgeQuery::PointTarget target(-MakePointOrDie("2:12"));
151
+ auto results = query.FindFurthestEdges(&target);
152
+ ASSERT_GT(results.size(), 0);
153
+ EXPECT_EQ(S1ChordAngle::Straight(), results[0].distance());
154
+ // Should find the polygon shape (id = 1).
155
+ EXPECT_EQ(1, results[0].shape_id());
156
+ // Should find the interior, so no specific edge id.
157
+ EXPECT_EQ(-1, results[0].edge_id());
158
+
159
+ // Next check that with include_interiors set to false, the distance is less
160
+ // than 180 for the same target and index.
161
+ query.mutable_options()->set_include_interiors(false);
162
+ results = query.FindFurthestEdges(&target);
163
+ ASSERT_GT(results.size(), 0);
164
+ EXPECT_LE(results[0].distance(), S1ChordAngle::Straight());
165
+ EXPECT_EQ(1, results[0].shape_id());
166
+ // Found a specific edge, so id should be positive.
167
+ EXPECT_NE(-1, results[0].edge_id());
168
+ }
169
+
170
+ TEST(S2FurthestEdgeQuery, AntipodalPointOutsideIndexedPolygon) {
171
+ // Tests a target point antipodal to the interior of a polyline loop with no
172
+ // interior. The index also includes a polygon almost antipodal to the
173
+ // target, but with all edges closer than the min_distance threshold.
174
+ auto index = MakeIndexOrDie("# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
175
+ S2FurthestEdgeQuery::Options options;
176
+ options.set_include_interiors(true);
177
+ options.set_min_distance(S1Angle::Degrees(179));
178
+ S2FurthestEdgeQuery query(index.get(), options);
179
+ S2FurthestEdgeQuery::PointTarget target(-MakePointOrDie("2:2"));
180
+ auto results = query.FindFurthestEdges(&target);
181
+ EXPECT_EQ(0, results.size());
182
+ }
183
+
184
+ TEST(S2FurthestEdgeQuery, TargetPolygonContainingIndexedPoints) {
185
+ // Two points are contained within a polyline loop (no interior) and two
186
+ // points are contained within a polygon.
187
+ auto index = MakeIndexOrDie("2:2 | 4:4 | 1:11 | 3:12 # #");
188
+ S2FurthestEdgeQuery query(index.get());
189
+ query.mutable_options()->set_use_brute_force(false);
190
+ auto target_index = MakeIndexOrDie(
191
+ "# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
192
+ S2FurthestEdgeQuery::ShapeIndexTarget target(target_index.get());
193
+ target.set_include_interiors(true);
194
+ target.set_use_brute_force(true);
195
+ auto results1 = query.FindFurthestEdges(&target);
196
+ // All points should be returned since we did not specify max_results.
197
+ ASSERT_EQ(4, results1.size());
198
+ EXPECT_NE(S1ChordAngle::Zero(), results1[0].distance());
199
+ EXPECT_EQ(0, results1[0].shape_id());
200
+ EXPECT_EQ(0, results1[0].edge_id()); // 2:2 (to 5:15)
201
+ EXPECT_NE(S1ChordAngle::Zero(), results1[1].distance());
202
+ EXPECT_EQ(0, results1[1].shape_id());
203
+ EXPECT_EQ(3, results1[1].edge_id()); // 3:12 (to 0:0)
204
+ }
205
+
206
+ TEST(S2FurthestEdgeQuery, AntipodalPolygonContainingIndexedPoints) {
207
+ // Two antipodal points are contained within a polyline loop (no interior)
208
+ // and two antipodal points are contained within a polygon.
209
+ auto points = ParsePointsOrDie("2:2, 3:3, 1:11, 3:13");
210
+ auto index = make_unique<MutableS2ShapeIndex>();
211
+ vector<S2Point> antipodal_points;
212
+ for (const auto& p : points) {
213
+ antipodal_points.push_back(-p);
214
+ }
215
+ index->Add(make_unique<S2PointVectorShape>(std::move(antipodal_points)));
216
+
217
+ S2FurthestEdgeQuery query(index.get());
218
+ query.mutable_options()->set_min_distance(S1Angle::Degrees(179));
219
+ auto target_index = MakeIndexOrDie(
220
+ "# 0:0, 0:5, 5:5, 5:0 # 0:10, 0:15, 5:15, 5:10");
221
+ S2FurthestEdgeQuery::ShapeIndexTarget target(target_index.get());
222
+ target.set_include_interiors(true);
223
+ auto results = query.FindFurthestEdges(&target);
224
+ ASSERT_EQ(2, results.size());
225
+ EXPECT_EQ(S1ChordAngle::Straight(), results[0].distance());
226
+ EXPECT_EQ(0, results[0].shape_id());
227
+ EXPECT_EQ(2, results[0].edge_id()); // 1:11
228
+ EXPECT_EQ(S1ChordAngle::Straight(), results[1].distance());
229
+ EXPECT_EQ(0, results[1].shape_id());
230
+ EXPECT_EQ(3, results[1].edge_id()); // 3:13
231
+ }
232
+
233
+ TEST(S2FurthestEdgeQuery, EmptyPolygonTarget) {
234
+ // Verifies that distances are measured correctly to empty polygon targets.
235
+ auto empty_polygon_index = MakeIndexOrDie("# # empty");
236
+ auto point_index = MakeIndexOrDie("1:1 # #");
237
+ auto full_polygon_index = MakeIndexOrDie("# # full");
238
+ S2FurthestEdgeQuery::ShapeIndexTarget target(empty_polygon_index.get());
239
+ target.set_include_interiors(true);
240
+
241
+ S2FurthestEdgeQuery empty_query(empty_polygon_index.get());
242
+ empty_query.mutable_options()->set_include_interiors(true);
243
+ EXPECT_EQ(S1ChordAngle::Negative(), empty_query.GetDistance(&target));
244
+
245
+ S2FurthestEdgeQuery point_query(point_index.get());
246
+ point_query.mutable_options()->set_include_interiors(true);
247
+ EXPECT_EQ(S1ChordAngle::Negative(), point_query.GetDistance(&target));
248
+
249
+ S2FurthestEdgeQuery full_query(full_polygon_index.get());
250
+ full_query.mutable_options()->set_include_interiors(true);
251
+ EXPECT_EQ(S1ChordAngle::Negative(), full_query.GetDistance(&target));
252
+ }
253
+
254
+ TEST(S2FurthestEdgeQuery, FullLaxPolygonTarget) {
255
+ // Verifies that distances are measured correctly to full LaxPolygon targets.
256
+ auto empty_polygon_index = MakeIndexOrDie("# # empty");
257
+ auto point_index = MakeIndexOrDie("1:1 # #");
258
+ auto full_polygon_index = MakeIndexOrDie("# # full");
259
+ S2FurthestEdgeQuery::ShapeIndexTarget target(full_polygon_index.get());
260
+ target.set_include_interiors(true);
261
+
262
+ S2FurthestEdgeQuery empty_query(empty_polygon_index.get());
263
+ empty_query.mutable_options()->set_include_interiors(true);
264
+ EXPECT_EQ(S1ChordAngle::Negative(), empty_query.GetDistance(&target));
265
+
266
+ S2FurthestEdgeQuery point_query(point_index.get());
267
+ point_query.mutable_options()->set_include_interiors(true);
268
+ EXPECT_EQ(S1ChordAngle::Straight(), point_query.GetDistance(&target));
269
+
270
+ S2FurthestEdgeQuery full_query(full_polygon_index.get());
271
+ full_query.mutable_options()->set_include_interiors(true);
272
+ EXPECT_EQ(S1ChordAngle::Straight(), full_query.GetDistance(&target));
273
+ }
274
+
275
+ TEST(S2FurthestEdgeQuery, FullS2PolygonTarget) {
276
+ // Verifies that distances are measured correctly to full S2Polygon targets
277
+ // (which use a different representation of "full" than LaxPolygon does).
278
+ auto empty_polygon_index = MakeIndexOrDie("# # empty");
279
+ auto point_index = MakeIndexOrDie("1:1 # #");
280
+ auto full_polygon_index = MakeIndexOrDie("# #");
281
+ full_polygon_index->Add(make_unique<S2Polygon::OwningShape>(
282
+ s2textformat::MakePolygonOrDie("full")));
283
+
284
+ S2FurthestEdgeQuery::ShapeIndexTarget target(full_polygon_index.get());
285
+ target.set_include_interiors(true);
286
+
287
+ S2FurthestEdgeQuery empty_query(empty_polygon_index.get());
288
+ empty_query.mutable_options()->set_include_interiors(true);
289
+ EXPECT_EQ(S1ChordAngle::Negative(), empty_query.GetDistance(&target));
290
+
291
+ S2FurthestEdgeQuery point_query(point_index.get());
292
+ point_query.mutable_options()->set_include_interiors(true);
293
+ EXPECT_EQ(S1ChordAngle::Straight(), point_query.GetDistance(&target));
294
+
295
+ S2FurthestEdgeQuery full_query(full_polygon_index.get());
296
+ full_query.mutable_options()->set_include_interiors(true);
297
+ EXPECT_EQ(S1ChordAngle::Straight(), full_query.GetDistance(&target));
298
+ }
299
+
300
+ //////////////////////////////////////////////////////////////////////////////
301
+ // General query testing by comparing with brute force method.
302
+ //////////////////////////////////////////////////////////////////////////////
303
+
304
+ // The approximate radius of S2Cap from which query edges are chosen.
305
+ static const S1Angle kTestCapRadius = S2Testing::KmToAngle(10);
306
+
307
+ using Result = pair<S2MaxDistance, s2shapeutil::ShapeEdgeId>;
308
+
309
+ // Converts to the format required by CheckDistanceResults() in s2testing.h
310
+ // TODO(user): When S2ClosestEdgeQuery::Result is made into a class, some
311
+ // of the following code may become redundant with that in
312
+ // s2closest_edge_query.cc.
313
+ vector<Result> ConvertResults(
314
+ const vector<S2FurthestEdgeQuery::Result>& edges) {
315
+ vector<Result> results;
316
+ for (const auto& edge : edges) {
317
+ results.push_back(
318
+ make_pair(S2MaxDistance(edge.distance()),
319
+ s2shapeutil::ShapeEdgeId(edge.shape_id(), edge.edge_id())));
320
+ }
321
+
322
+ return results;
323
+ }
324
+
325
+ // Use "query" to find the furthest edge(s) to the given target. Verify that
326
+ // the results satisfy the search criteria.
327
+ static void GetFurthestEdges(S2FurthestEdgeQuery::Target* target,
328
+ S2FurthestEdgeQuery *query,
329
+ vector<S2FurthestEdgeQuery::Result>* edges) {
330
+ query->FindFurthestEdges(target, edges);
331
+ EXPECT_LE(edges->size(), query->options().max_results());
332
+ if (query->options().min_distance() == S1ChordAngle::Negative()) {
333
+ int min_expected = min(query->options().max_results(),
334
+ s2shapeutil::CountEdges(query->index()));
335
+ if (!query->options().include_interiors()) {
336
+ // We can predict exactly how many edges should be returned.
337
+ EXPECT_EQ(min_expected, edges->size());
338
+ } else {
339
+ // All edges should be returned, and possibly some shape interiors.
340
+ EXPECT_LE(min_expected, edges->size());
341
+ }
342
+ }
343
+ for (const auto& edge : *edges) {
344
+ // Check that the edge satisfies the min_distance() condition.
345
+ EXPECT_GE(edge.distance(), S1ChordAngle(query->options().min_distance()));
346
+ }
347
+ }
348
+
349
+ static void TestFindFurthestEdges(
350
+ S2FurthestEdgeQuery::Target* target, S2FurthestEdgeQuery *query) {
351
+ vector<S2FurthestEdgeQuery::Result> expected, actual;
352
+ query->mutable_options()->set_use_brute_force(true);
353
+ GetFurthestEdges(target, query, &expected);
354
+ query->mutable_options()->set_use_brute_force(false);
355
+ GetFurthestEdges(target, query, &actual);
356
+
357
+ S1ChordAngle min_distance = query->options().min_distance();
358
+ S1ChordAngle max_error = query->options().max_error();
359
+ EXPECT_TRUE(CheckDistanceResults(
360
+ ConvertResults(expected),
361
+ ConvertResults(actual),
362
+ query->options().max_results(),
363
+ S2MaxDistance(min_distance),
364
+ max_error))
365
+ << "max_results=" << query->options().max_results()
366
+ << ", max_distance=" << S1ChordAngle(min_distance)
367
+ << ", max_error=" << max_error;
368
+
369
+ if (expected.empty()) {
370
+ return;
371
+ }
372
+
373
+ // Note that when options.max_error() > 0, expected[0].distance may not be
374
+ // the maximum distance. It is never smaller by more than max_error(), but
375
+ // the actual value also depends on max_results().
376
+ //
377
+ // Here we verify that GetDistance() and IsDistanceGreater() return results
378
+ // that are consistent with the max_error() setting.
379
+ S1ChordAngle expected_distance = expected[0].distance();
380
+ EXPECT_GE(query->GetDistance(target), expected_distance - max_error);
381
+
382
+ // Test IsDistanceGreater().
383
+ EXPECT_FALSE(query->IsDistanceGreater(
384
+ target, expected_distance + max_error));
385
+ EXPECT_TRUE(query->IsDistanceGreater(
386
+ target, expected[0].distance().Predecessor()));
387
+ }
388
+
389
+ // The running time of this test is proportional to
390
+ // (num_indexes + num_queries) * num_edges.
391
+ // (Note that every query is checked using the brute force algorithm.)
392
+ static void TestWithIndexFactory(const s2testing::ShapeIndexFactory& factory,
393
+ int num_indexes, int num_edges,
394
+ int num_queries) {
395
+ // Build a set of MutableS2ShapeIndexes containing the desired geometry.
396
+ vector<S2Cap> index_caps;
397
+ vector<unique_ptr<MutableS2ShapeIndex>> indexes;
398
+ for (int i = 0; i < num_indexes; ++i) {
399
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
400
+ index_caps.push_back(S2Cap(S2Testing::RandomPoint(), kTestCapRadius));
401
+ indexes.emplace_back(new MutableS2ShapeIndex);
402
+ factory.AddEdges(index_caps.back(), num_edges, indexes.back().get());
403
+ }
404
+
405
+ for (int i = 0; i < num_queries; ++i) {
406
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed + i);
407
+ int i_index = S2Testing::rnd.Uniform(num_indexes);
408
+ const S2Cap& index_cap = index_caps[i_index];
409
+
410
+ // Choose query points from an area approximately 4x larger than the
411
+ // geometry being tested.
412
+ S1Angle query_radius = 2 * index_cap.GetRadius();
413
+ S2FurthestEdgeQuery query(indexes[i_index].get());
414
+
415
+ // Exercise the opposite-hemisphere code 1/5 of the time.
416
+ int antipodal = S2Testing::rnd.OneIn(5) ? -1 : 1;
417
+ S2Cap query_cap(antipodal * index_cap.center(), query_radius);
418
+
419
+ // Occasionally we don't set any limit on the number of result edges.
420
+ // (This may return all edges if we also don't set a distance limit.)
421
+ if (!S2Testing::rnd.OneIn(5)) {
422
+ query.mutable_options()->set_max_results(1 + S2Testing::rnd.Uniform(10));
423
+ }
424
+ // We set a distance limit 2/3 of the time.
425
+ if (!S2Testing::rnd.OneIn(3)) {
426
+ query.mutable_options()->set_min_distance(
427
+ S2Testing::rnd.RandDouble() * query_radius);
428
+ }
429
+ if (S2Testing::rnd.OneIn(2)) {
430
+ // Choose a maximum error whose logarithm is uniformly distributed over
431
+ // a reasonable range, except that it is sometimes zero.
432
+ query.mutable_options()->set_max_error(S1Angle::Radians(
433
+ pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius.radians()));
434
+ }
435
+ query.mutable_options()->set_include_interiors(S2Testing::rnd.OneIn(2));
436
+ int target_type = S2Testing::rnd.Uniform(4);
437
+ if (target_type == 0) {
438
+ // Find the edges furthest from a given point.
439
+ S2Point point = S2Testing::SamplePoint(query_cap);
440
+ S2FurthestEdgeQuery::PointTarget target(point);
441
+ TestFindFurthestEdges(&target, &query);
442
+ } else if (target_type == 1) {
443
+ // Find the edges furthest from a given edge.
444
+ S2Point a = S2Testing::SamplePoint(query_cap);
445
+ S2Point b = S2Testing::SamplePoint(
446
+ S2Cap(a, pow(1e-4, S2Testing::rnd.RandDouble()) * query_radius));
447
+ S2FurthestEdgeQuery::EdgeTarget target(a, b);
448
+ TestFindFurthestEdges(&target, &query);
449
+ } else if (target_type == 2) {
450
+ // Find the edges furthest from a given cell.
451
+ int min_level = S2::kMaxDiag.GetLevelForMaxValue(query_radius.radians());
452
+ int level = min_level + S2Testing::rnd.Uniform(
453
+ S2CellId::kMaxLevel - min_level + 1);
454
+ S2Point a = S2Testing::SamplePoint(query_cap);
455
+ S2Cell cell(S2CellId(a).parent(level));
456
+ S2FurthestEdgeQuery::CellTarget target(cell);
457
+ TestFindFurthestEdges(&target, &query);
458
+ } else {
459
+ S2_DCHECK_EQ(3, target_type);
460
+ // Use another one of the pre-built indexes as the target.
461
+ int j_index = S2Testing::rnd.Uniform(num_indexes);
462
+ S2FurthestEdgeQuery::ShapeIndexTarget target(indexes[j_index].get());
463
+ target.set_include_interiors(S2Testing::rnd.OneIn(2));
464
+ TestFindFurthestEdges(&target, &query);
465
+ }
466
+ }
467
+ }
468
+
469
+ static const int kNumIndexes = 50;
470
+ static const int kNumEdges = 100;
471
+ static const int kNumQueries = 200;
472
+
473
+ TEST(S2FurthestEdgeQuery, CircleEdges) {
474
+ TestWithIndexFactory(s2testing::RegularLoopShapeIndexFactory(),
475
+ kNumIndexes, kNumEdges, kNumQueries);
476
+ }
477
+
478
+ TEST(S2FurthestEdgeQuery, FractalEdges) {
479
+ TestWithIndexFactory(s2testing::FractalLoopShapeIndexFactory(),
480
+ kNumIndexes, kNumEdges, kNumQueries);
481
+ }
482
+
483
+ TEST(S2FurthestEdgeQuery, PointCloudEdges) {
484
+ TestWithIndexFactory(s2testing::PointCloudShapeIndexFactory(),
485
+ kNumIndexes, kNumEdges, kNumQueries);
486
+ }
487
+
@@ -0,0 +1,90 @@
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/s2latlng.h"
19
+
20
+ #include <algorithm>
21
+ #include <ostream>
22
+
23
+ #include "s2/base/logging.h"
24
+ #include "s2/base/stringprintf.h"
25
+
26
+ using std::max;
27
+ using std::min;
28
+
29
+ S2LatLng S2LatLng::Normalized() const {
30
+ // remainder(x, 2 * M_PI) reduces its argument to the range [-M_PI, M_PI]
31
+ // inclusive, which is what we want here.
32
+ return S2LatLng(max(-M_PI_2, min(M_PI_2, lat().radians())),
33
+ remainder(lng().radians(), 2 * M_PI));
34
+ }
35
+
36
+ S2Point S2LatLng::ToPoint() const {
37
+ S2_DLOG_IF(ERROR, !is_valid())
38
+ << "Invalid S2LatLng in S2LatLng::ToPoint: " << *this;
39
+ double phi = lat().radians();
40
+ double theta = lng().radians();
41
+ double cosphi = cos(phi);
42
+ return S2Point(cos(theta) * cosphi, sin(theta) * cosphi, sin(phi));
43
+ }
44
+
45
+ S2LatLng::S2LatLng(const S2Point& p)
46
+ : coords_(Latitude(p).radians(), Longitude(p).radians()) {
47
+ // The latitude and longitude are already normalized.
48
+ S2_DLOG_IF(ERROR, !is_valid())
49
+ << "Invalid S2LatLng in constructor: " << *this;
50
+ }
51
+
52
+ S1Angle S2LatLng::GetDistance(const S2LatLng& o) const {
53
+ // This implements the Haversine formula, which is numerically stable for
54
+ // small distances but only gets about 8 digits of precision for very large
55
+ // distances (e.g. antipodal points). Note that 8 digits is still accurate
56
+ // to within about 10cm for a sphere the size of the Earth.
57
+ //
58
+ // This could be fixed with another sin() and cos() below, but at that point
59
+ // you might as well just convert both arguments to S2Points and compute the
60
+ // distance that way (which gives about 15 digits of accuracy for all
61
+ // distances).
62
+
63
+ S2_DLOG_IF(ERROR, !is_valid())
64
+ << "Invalid S2LatLng in S2LatLng::GetDistance: " << *this;
65
+
66
+ S2_DLOG_IF(ERROR, !o.is_valid())
67
+ << "Invalid S2LatLng in S2LatLng::GetDistance: " << o;
68
+
69
+ double lat1 = lat().radians();
70
+ double lat2 = o.lat().radians();
71
+ double lng1 = lng().radians();
72
+ double lng2 = o.lng().radians();
73
+ double dlat = sin(0.5 * (lat2 - lat1));
74
+ double dlng = sin(0.5 * (lng2 - lng1));
75
+ double x = dlat * dlat + dlng * dlng * cos(lat1) * cos(lat2);
76
+ return S1Angle::Radians(2 * asin(sqrt(min(1.0, x))));
77
+ }
78
+
79
+ string S2LatLng::ToStringInDegrees() const {
80
+ S2LatLng pt = Normalized();
81
+ return StringPrintf("%f,%f", pt.lat().degrees(), pt.lng().degrees());
82
+ }
83
+
84
+ void S2LatLng::ToStringInDegrees(string* s) const {
85
+ *s = ToStringInDegrees();
86
+ }
87
+
88
+ std::ostream& operator<<(std::ostream& os, const S2LatLng& ll) {
89
+ return os << "[" << ll.lat() << ", " << ll.lng() << "]";
90
+ }