@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,282 @@
1
+ // Copyright 2016 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
+ // This class contains various predicates that are guaranteed to produce
19
+ // correct, consistent results. They are also relatively efficient. This is
20
+ // achieved by computing conservative error bounds and falling back to high
21
+ // precision or even exact arithmetic when the result is uncertain. Such
22
+ // predicates are useful in implementing robust algorithms.
23
+ //
24
+ // See also S2EdgeCrosser, which implements various exact
25
+ // edge-crossing predicates more efficiently than can be done here.
26
+ //
27
+ // TODO(ericv): Add InCircleSign() (the Voronoi/Delaunay predicate).
28
+ // (This is trickier than the usual textbook implementations because we want
29
+ // to model S2Points as lying exactly on the mathematical unit sphere.)
30
+
31
+ #ifndef S2_S2PREDICATES_H_
32
+ #define S2_S2PREDICATES_H_
33
+
34
+ #include <cfloat>
35
+ #include <iosfwd>
36
+
37
+ #include "s2/_fp_contract_off.h"
38
+ #include "s2/s1chord_angle.h"
39
+ #include "s2/s2debug.h"
40
+ #include "s2/s2pointutil.h"
41
+
42
+ namespace s2pred {
43
+
44
+ // S2EdgeUtil contains the following exact predicates that test for edge
45
+ // crossings. (Usually you will want to use S2EdgeCrosser, which
46
+ // implements them much more efficiently.)
47
+ //
48
+ // int CrossingSign(const S2Point& a0, const S2Point& a1,
49
+ // const S2Point& b0, const S2Point& b1);
50
+ //
51
+ // bool EdgeOrVertexCrossing(const S2Point& a0, const S2Point& a1,
52
+ // const S2Point& b0, const S2Point& b1);
53
+
54
+ // Returns +1 if the points A, B, C are counterclockwise, -1 if the points
55
+ // are clockwise, and 0 if any two points are the same. This function is
56
+ // essentially like taking the sign of the determinant of ABC, except that
57
+ // it has additional logic to make sure that the above properties hold even
58
+ // when the three points are coplanar, and to deal with the limitations of
59
+ // floating-point arithmetic.
60
+ //
61
+ // Sign satisfies the following conditions:
62
+ //
63
+ // (1) Sign(a,b,c) == 0 if and only if a == b, b == c, or c == a
64
+ // (2) Sign(b,c,a) == Sign(a,b,c) for all a,b,c
65
+ // (3) Sign(c,b,a) == -Sign(a,b,c) for all a,b,c
66
+ //
67
+ // In other words:
68
+ //
69
+ // (1) The result is zero if and only if two points are the same.
70
+ // (2) Rotating the order of the arguments does not affect the result.
71
+ // (3) Exchanging any two arguments inverts the result.
72
+ //
73
+ // On the other hand, note that it is not true in general that
74
+ // Sign(-a,b,c) == -Sign(a,b,c), or any similar identities
75
+ // involving antipodal points.
76
+ int Sign(const S2Point& a, const S2Point& b, const S2Point& c);
77
+
78
+ // Given 4 points on the unit sphere, return true if the edges OA, OB, and
79
+ // OC are encountered in that order while sweeping CCW around the point O.
80
+ // You can think of this as testing whether A <= B <= C with respect to the
81
+ // CCW ordering around O that starts at A, or equivalently, whether B is
82
+ // contained in the range of angles (inclusive) that starts at A and extends
83
+ // CCW to C. Properties:
84
+ //
85
+ // (1) If OrderedCCW(a,b,c,o) && OrderedCCW(b,a,c,o), then a == b
86
+ // (2) If OrderedCCW(a,b,c,o) && OrderedCCW(a,c,b,o), then b == c
87
+ // (3) If OrderedCCW(a,b,c,o) && OrderedCCW(c,b,a,o), then a == b == c
88
+ // (4) If a == b or b == c, then OrderedCCW(a,b,c,o) is true
89
+ // (5) Otherwise if a == c, then OrderedCCW(a,b,c,o) is false
90
+ bool OrderedCCW(const S2Point& a, const S2Point& b, const S2Point& c,
91
+ const S2Point& o);
92
+
93
+ // Returns -1, 0, or +1 according to whether AX < BX, A == B, or AX > BX
94
+ // respectively. Distances are measured with respect to the positions of X,
95
+ // A, and B as though they were reprojected to lie exactly on the surface of
96
+ // the unit sphere. Furthermore, this method uses symbolic perturbations to
97
+ // ensure that the result is non-zero whenever A != B, even when AX == BX
98
+ // exactly, or even when A and B project to the same point on the sphere.
99
+ // Such results are guaranteed to be self-consistent, i.e. if AB < BC and
100
+ // BC < AC, then AB < AC.
101
+ int CompareDistances(const S2Point& x, const S2Point& a, const S2Point& b);
102
+
103
+ // Returns -1, 0, or +1 according to whether the distance XY is less than,
104
+ // equal to, or greater than "r" respectively. Distances are measured with
105
+ // respect the positions of all points as though they are projected to lie
106
+ // exactly on the surface of the unit sphere.
107
+ int CompareDistance(const S2Point& x, const S2Point& y, S1ChordAngle r);
108
+
109
+ // Returns -1, 0, or +1 according to whether the distance from the point X to
110
+ // the edge A is less than, equal to, or greater than "r" respectively.
111
+ // Distances are measured with respect the positions of all points as though
112
+ // they were projected to lie exactly on the surface of the unit sphere.
113
+ //
114
+ // REQUIRES: A0 and A1 do not project to antipodal points (e.g., A0 == -A1).
115
+ // This requires that (A0 != C * A1) for any constant C < 0.
116
+ //
117
+ // NOTE(ericv): All of the predicates defined here could be extended to handle
118
+ // edges consisting of antipodal points by implementing additional symbolic
119
+ // perturbation logic (similar to Sign) in order to rigorously define the
120
+ // direction of such edges.
121
+ int CompareEdgeDistance(const S2Point& x, const S2Point& a0, const S2Point& a1,
122
+ S1ChordAngle r);
123
+
124
+ // Returns -1, 0, or +1 according to whether the normal of edge A has
125
+ // negative, zero, or positive dot product with the normal of edge B. This
126
+ // essentially measures whether the edges A and B are closer to proceeding in
127
+ // the same direction or in opposite directions around the sphere.
128
+ //
129
+ // This method returns an exact result, i.e. the result is zero if and only if
130
+ // the two edges are exactly perpendicular or at least one edge is degenerate.
131
+ // (i.e., both edge endpoints project to the same point on the sphere).
132
+ //
133
+ // CAVEAT: This method does not use symbolic perturbations. Therefore it can
134
+ // return zero even when A0 != A1 and B0 != B1, e.g. if (A0 == C * A1) exactly
135
+ // for some constant C > 0 (which is possible even when both points are
136
+ // considered "normalized").
137
+ //
138
+ // REQUIRES: Neither edge can consist of antipodal points (e.g., A0 == -A1)
139
+ // (see comments in CompareEdgeDistance).
140
+ int CompareEdgeDirections(const S2Point& a0, const S2Point& a1,
141
+ const S2Point& b0, const S2Point& b1);
142
+
143
+ // Returns Sign(X0, X1, Z) where Z is the circumcenter of triangle ABC.
144
+ // The return value is +1 if Z is to the left of edge X, and -1 if Z is to the
145
+ // right of edge X. The return value is zero if A == B, B == C, or C == A
146
+ // (exactly), and also if X0 and X1 project to identical points on the sphere
147
+ // (e.g., X0 == X1).
148
+ //
149
+ // The result is determined with respect to the positions of all points as
150
+ // though they were projected to lie exactly on the surface of the unit
151
+ // sphere. Furthermore this method uses symbolic perturbations to compute a
152
+ // consistent non-zero result even when Z lies exactly on edge X.
153
+ //
154
+ // REQUIRES: X0 and X1 do not project to antipodal points (e.g., X0 == -X1)
155
+ // (see comments in CompareEdgeDistance).
156
+ int EdgeCircumcenterSign(const S2Point& x0, const S2Point& x1,
157
+ const S2Point& a, const S2Point& b, const S2Point& c);
158
+
159
+ // This is a specialized method that is used to compute the intersection of an
160
+ // edge X with the Voronoi diagram of a set of points, where each Voronoi
161
+ // region is intersected with a disc of fixed radius "r".
162
+ //
163
+ // Given two sites A and B and an edge (X0, X1) such that d(A,X0) < d(B,X0)
164
+ // and both sites are within the given distance "r" of edge X, this method
165
+ // intersects the Voronoi region of each site with a disc of radius r and
166
+ // determines whether either region has an empty intersection with edge X. It
167
+ // returns FIRST if site A has an empty intersection, SECOND if site B has an
168
+ // empty intersection, NEITHER if neither site has an empty intersection, or
169
+ // UNCERTAIN if A == B exactly. Note that it is not possible for both
170
+ // intersections to be empty because of the requirement that both sites are
171
+ // within distance r of edge X. (For example, the only reason that Voronoi
172
+ // region A can have an empty intersection with X is that site B is closer to
173
+ // all points on X that are within radius r of site A.)
174
+ //
175
+ // The result is determined with respect to the positions of all points as
176
+ // though they were projected to lie exactly on the surface of the unit
177
+ // sphere. Furthermore this method uses symbolic perturbations to compute a
178
+ // consistent non-zero result even when A and B lie on opposite sides of X
179
+ // such that the Voronoi edge between them exactly coincides with edge X, or
180
+ // when A and B are distinct but project to the same point on the sphere
181
+ // (i.e., they are linearly dependent).
182
+ //
183
+ // REQUIRES: r < S1ChordAngle::Right() (90 degrees)
184
+ // REQUIRES: s2pred::CompareDistances(x0, a, b) < 0
185
+ // REQUIRES: s2pred::CompareEdgeDistance(a, x0, x1, r) <= 0
186
+ // REQUIRES: s2pred::CompareEdgeDistance(b, x0, x1, r) <= 0
187
+ // REQUIRES: X0 and X1 do not project to antipodal points (e.g., X0 == -X1)
188
+ // (see comments in CompareEdgeDistance).
189
+ enum class Excluded { FIRST, SECOND, NEITHER, UNCERTAIN };
190
+ std::ostream& operator<<(std::ostream& os, Excluded excluded);
191
+ Excluded GetVoronoiSiteExclusion(const S2Point& a, const S2Point& b,
192
+ const S2Point& x0, const S2Point& x1,
193
+ S1ChordAngle r);
194
+
195
+ /////////////////////////// Low-Level Methods ////////////////////////////
196
+ //
197
+ // Most clients will not need the following methods. They can be slightly
198
+ // more efficient but are harder to use, since they require the client to do
199
+ // all the actual crossing tests.
200
+
201
+ // A more efficient version of Sign that allows the precomputed
202
+ // cross-product of A and B to be specified. (Unlike the 3 argument
203
+ // version this method is also inlined.)
204
+ inline int Sign(const S2Point& a, const S2Point& b, const S2Point& c,
205
+ const Vector3_d& a_cross_b);
206
+
207
+ // This version of Sign returns +1 if the points are definitely CCW, -1 if
208
+ // they are definitely CW, and 0 if two points are identical or the result
209
+ // is uncertain. Uncertain cases can be resolved, if desired, by calling
210
+ // ExpensiveSign.
211
+ //
212
+ // The purpose of this method is to allow additional cheap tests to be done,
213
+ // where possible, in order to avoid calling ExpensiveSign unnecessarily.
214
+ inline int TriageSign(const S2Point& a, const S2Point& b,
215
+ const S2Point& c, const Vector3_d& a_cross_b);
216
+
217
+ // This function is invoked by Sign() if the sign of the determinant is
218
+ // uncertain. It always returns a non-zero result unless two of the input
219
+ // points are the same. It uses a combination of multiple-precision
220
+ // arithmetic and symbolic perturbations to ensure that its results are
221
+ // always self-consistent (cf. Simulation of Simplicity, Edelsbrunner and
222
+ // Muecke). The basic idea is to assign an infinitesimal symbolic
223
+ // perturbation to every possible S2Point such that no three S2Points are
224
+ // collinear and no four S2Points are coplanar. These perturbations are so
225
+ // small that they do not affect the sign of any determinant that was
226
+ // non-zero before the perturbations. If "perturb" is false, then instead
227
+ // the exact sign of the unperturbed input points is returned, which can be
228
+ // zero even when all three points are distinct.
229
+ //
230
+ // Unlike Sign(), this method does not require the input points to be
231
+ // normalized.
232
+ int ExpensiveSign(const S2Point& a, const S2Point& b,
233
+ const S2Point& c, bool perturb = true);
234
+
235
+ ////////////////// Implementation details follow ////////////////////
236
+
237
+ inline int Sign(const S2Point& a, const S2Point& b, const S2Point& c,
238
+ const Vector3_d& a_cross_b) {
239
+ int sign = TriageSign(a, b, c, a_cross_b);
240
+ if (sign == 0) sign = ExpensiveSign(a, b, c);
241
+ return sign;
242
+ }
243
+
244
+ inline int TriageSign(const S2Point& a, const S2Point& b,
245
+ const S2Point& c, const Vector3_d& a_cross_b) {
246
+ // kMaxDetError is the maximum error in computing (AxB).C where all vectors
247
+ // are unit length. Using standard inequalities, it can be shown that
248
+ //
249
+ // fl(AxB) = AxB + D where |D| <= (|AxB| + (2/sqrt(3))*|A|*|B|) * e
250
+ //
251
+ // where "fl()" denotes a calculation done in floating-point arithmetic,
252
+ // |x| denotes either absolute value or the L2-norm as appropriate, and
253
+ // e = 0.5*DBL_EPSILON. Similarly,
254
+ //
255
+ // fl(B.C) = B.C + d where |d| <= (1.5*|B.C| + 1.5*|B|*|C|) * e .
256
+ //
257
+ // Applying these bounds to the unit-length vectors A,B,C and neglecting
258
+ // relative error (which does not affect the sign of the result), we get
259
+ //
260
+ // fl((AxB).C) = (AxB).C + d where |d| <= (2.5 + 2/sqrt(3)) * e
261
+ //
262
+ // which is about 3.6548 * e, or 1.8274 * DBL_EPSILON.
263
+ const double kMaxDetError = 1.8274 * DBL_EPSILON;
264
+ S2_DCHECK(S2::IsUnitLength(a));
265
+ S2_DCHECK(S2::IsUnitLength(b));
266
+ S2_DCHECK(S2::IsUnitLength(c));
267
+ double det = a_cross_b.DotProd(c);
268
+
269
+ // Double-check borderline cases in debug mode.
270
+ S2_DCHECK(!FLAGS_s2debug ||
271
+ std::fabs(det) <= kMaxDetError ||
272
+ std::fabs(det) >= 100 * kMaxDetError ||
273
+ det * ExpensiveSign(a, b, c) > 0);
274
+
275
+ if (det > kMaxDetError) return 1;
276
+ if (det < -kMaxDetError) return -1;
277
+ return 0;
278
+ }
279
+
280
+ } // namespace s2pred
281
+
282
+ #endif // S2_S2PREDICATES_H_
@@ -0,0 +1,135 @@
1
+ // Copyright 2016 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
+ // The following functions are not part of the public API. Currently they are
19
+ // only used internally for testing purposes.
20
+
21
+ #ifndef S2_S2PREDICATES_INTERNAL_H_
22
+ #define S2_S2PREDICATES_INTERNAL_H_
23
+
24
+ #include <limits>
25
+
26
+ #include "s2/third_party/absl/base/casts.h"
27
+ #include "s2/s1chord_angle.h"
28
+ #include "s2/s2predicates.h"
29
+ #include "s2/util/math/exactfloat/exactfloat.h"
30
+ #include "s2/util/math/vector.h"
31
+
32
+ namespace s2pred {
33
+
34
+ // Returns 2 ** (-digits). This could be implemented using "ldexp" except
35
+ // that std::ldexp is not constexpr in C++11.
36
+ constexpr double epsilon_for_digits(int digits) {
37
+ return (digits < 64 ? 1.0 / (1ULL << digits) :
38
+ epsilon_for_digits(digits - 63) / (1ULL << 63));
39
+ }
40
+
41
+ // Returns the maximum rounding error for arithmetic operations in type T.
42
+ // We could simply return 0.5 * numeric_limits<T>::epsilon(), except that some
43
+ // platforms implement "long double" using "double-double" arithmetic, and for
44
+ // those platforms we need to compute the rounding error manually based on
45
+ // numeric_limits<T>::digits (the number of bits of mantissa precision).
46
+ template <typename T> constexpr T rounding_epsilon() {
47
+ return epsilon_for_digits(std::numeric_limits<T>::digits);
48
+ }
49
+
50
+ using Vector3_ld = Vector3<long double>;
51
+ using Vector3_xf = Vector3<ExactFloat>;
52
+
53
+ inline static Vector3_ld ToLD(const S2Point& x) {
54
+ return Vector3_ld::Cast(x);
55
+ }
56
+
57
+ inline static long double ToLD(double x) {
58
+ return absl::implicit_cast<long double>(x);
59
+ }
60
+
61
+ inline static Vector3_xf ToExact(const S2Point& x) {
62
+ return Vector3_xf::Cast(x);
63
+ }
64
+
65
+ int StableSign(const S2Point& a, const S2Point& b, const S2Point& c);
66
+
67
+ int ExactSign(const S2Point& a, const S2Point& b, const S2Point& c,
68
+ bool perturb);
69
+
70
+ int SymbolicallyPerturbedSign(
71
+ const Vector3_xf& a, const Vector3_xf& b,
72
+ const Vector3_xf& c, const Vector3_xf& b_cross_c);
73
+
74
+ template <class T>
75
+ int TriageCompareCosDistances(const Vector3<T>& x,
76
+ const Vector3<T>& a, const Vector3<T>& b);
77
+
78
+ template <class T>
79
+ int TriageCompareSin2Distances(const Vector3<T>& x,
80
+ const Vector3<T>& a, const Vector3<T>& b);
81
+
82
+ int ExactCompareDistances(const Vector3_xf& x,
83
+ const Vector3_xf& a, const Vector3_xf& b);
84
+
85
+ int SymbolicCompareDistances(const S2Point& x,
86
+ const S2Point& a, const S2Point& b);
87
+
88
+ template <class T>
89
+ int TriageCompareSin2Distance(const Vector3<T>& x, const Vector3<T>& y, T r2);
90
+
91
+ template <class T>
92
+ int TriageCompareCosDistance(const Vector3<T>& x, const Vector3<T>& y, T r2);
93
+
94
+ int ExactCompareDistance(const Vector3_xf& x, const Vector3_xf& y,
95
+ const ExactFloat& r2);
96
+
97
+ template <class T>
98
+ int TriageCompareEdgeDistance(const Vector3<T>& x, const Vector3<T>& a0,
99
+ const Vector3<T>& a1, T r2);
100
+
101
+ int ExactCompareEdgeDistance(const S2Point& x, const S2Point& a0,
102
+ const S2Point& a1, S1ChordAngle r);
103
+
104
+ template <class T>
105
+ int TriageCompareEdgeDirections(
106
+ const Vector3<T>& a0, const Vector3<T>& a1,
107
+ const Vector3<T>& b0, const Vector3<T>& b1);
108
+
109
+ int ExactCompareEdgeDirections(const Vector3_xf& a0, const Vector3_xf& a1,
110
+ const Vector3_xf& b0, const Vector3_xf& b1);
111
+
112
+ template <class T>
113
+ int TriageEdgeCircumcenterSign(const Vector3<T>& x0, const Vector3<T>& x1,
114
+ const Vector3<T>& a, const Vector3<T>& b,
115
+ const Vector3<T>& c, int abc_sign);
116
+
117
+ int ExactEdgeCircumcenterSign(const Vector3_xf& x0, const Vector3_xf& x1,
118
+ const Vector3_xf& a, const Vector3_xf& b,
119
+ const Vector3_xf& c, int abc_sign);
120
+
121
+ int SymbolicEdgeCircumcenterSign(
122
+ const S2Point& x0, const S2Point& x1,
123
+ const S2Point& a_arg, const S2Point& b_arg, const S2Point& c_arg);
124
+
125
+ template <class T>
126
+ Excluded TriageVoronoiSiteExclusion(const Vector3<T>& a, const Vector3<T>& b,
127
+ const Vector3<T>& x0, const Vector3<T>& x1,
128
+ T r2);
129
+
130
+ Excluded ExactVoronoiSiteExclusion(const Vector3_xf& a, const Vector3_xf& b,
131
+ const Vector3_xf& x0, const Vector3_xf& x1,
132
+ const ExactFloat& r2);
133
+ } // namespace s2pred
134
+
135
+ #endif // S2_S2PREDICATES_INTERNAL_H_