@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,492 @@
1
+ // Copyright 2017 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/s2edge_tessellator.h"
19
+
20
+ #include <iostream>
21
+ #include <gtest/gtest.h>
22
+ #include "s2/third_party/absl/strings/str_cat.h"
23
+ #include "s2/s2edge_distances.h"
24
+ #include "s2/s2loop.h"
25
+ #include "s2/s2pointutil.h"
26
+ #include "s2/s2projections.h"
27
+ #include "s2/s2testing.h"
28
+ #include "s2/s2text_format.h"
29
+
30
+ using absl::StrCat;
31
+ using s2textformat::ParsePointsOrDie;
32
+ using std::cout;
33
+ using std::endl;
34
+ using std::fabs;
35
+ using std::min;
36
+ using std::max;
37
+ using std::vector;
38
+
39
+ namespace {
40
+
41
+ class Stats {
42
+ public:
43
+ Stats() : max_(-std::numeric_limits<double>::infinity()),
44
+ sum_(0), count_(0) {
45
+ }
46
+
47
+ void Tally(double v) {
48
+ if (std::isnan(v)) S2_LOG(FATAL) << "NaN";
49
+ max_ = std::max(v, max_);
50
+ sum_ += v;
51
+ count_ += 1;
52
+ }
53
+
54
+ double max() const { return max_; }
55
+ double avg() const { return sum_ / count_; }
56
+
57
+ string ToString() const {
58
+ return StrCat("avg = ", sum_ / count_, ", max = ", max_);
59
+ }
60
+
61
+ private:
62
+ double max_, sum_;
63
+ int count_;
64
+ };
65
+
66
+ // Determines whether the distance between the two edges is measured
67
+ // geometrically or parameterically (see algorithm description in .cc file).
68
+ enum class DistType { GEOMETRIC, PARAMETRIC };
69
+
70
+ S1Angle GetMaxDistance(const S2::Projection& proj,
71
+ const R2Point& px, const S2Point& x,
72
+ const R2Point& py, const S2Point& y,
73
+ DistType dist_type = DistType::GEOMETRIC) {
74
+ // Step along the projected edge at a fine resolution and keep track of the
75
+ // maximum distance of any point to the current geodesic edge.
76
+ const int kNumSteps = 100;
77
+ S1ChordAngle max_dist = S1ChordAngle::Zero();
78
+ for (double f = 0.5 / kNumSteps; f < 1.0; f += 1.0 / kNumSteps) {
79
+ S1ChordAngle dist = S1ChordAngle::Infinity();
80
+ S2Point p = proj.Unproject(proj.Interpolate(f, px, py));
81
+ if (dist_type == DistType::GEOMETRIC) {
82
+ S2::UpdateMinDistance(p, x, y, &dist);
83
+ } else {
84
+ S2_DCHECK(dist_type == DistType::PARAMETRIC);
85
+ dist = S1ChordAngle(p, S2::Interpolate(f, x, y));
86
+ }
87
+ if (dist > max_dist) max_dist = dist;
88
+ }
89
+ // Ensure that the maximum distance estimate is a lower bound, not an upper
90
+ // bound, since we only want to record a failure of the distance estimation
91
+ // algorithm if the number it returns is definitely too small.
92
+ return S1Angle(
93
+ max_dist.PlusError(-S2::GetUpdateMinDistanceMaxError(max_dist)));
94
+ }
95
+
96
+ // When there are longitudes greater than 180 degrees due to wrapping, the
97
+ // combination of projecting and unprojecting an S2Point can have slightly more
98
+ // error than is allowed by S2::ApproxEquals.
99
+ const S1Angle kMaxProjError(S1Angle::Radians(2e-15));
100
+
101
+ // Converts a projected edge to a sequence of geodesic edges and verifies that
102
+ // the result satisfies the given tolerance.
103
+ Stats TestUnprojected(const S2::Projection& proj, S1Angle tolerance,
104
+ const R2Point& pa, const R2Point& pb_in, bool log_stats) {
105
+ S2EdgeTessellator tess(&proj, tolerance);
106
+ vector<S2Point> vertices;
107
+ tess.AppendUnprojected(pa, pb_in, &vertices);
108
+ R2Point pb = proj.WrapDestination(pa, pb_in);
109
+ EXPECT_LE(S1Angle(proj.Unproject(pa), vertices.front()), kMaxProjError);
110
+ EXPECT_LE(S1Angle(proj.Unproject(pb), vertices.back()), kMaxProjError);
111
+ Stats stats;
112
+ if (pa == pb) {
113
+ EXPECT_EQ(1, vertices.size());
114
+ return stats;
115
+ }
116
+ // Precompute the normal to the projected edge.
117
+ Vector2_d norm = (pb - pa).Ortho().Normalize();
118
+ S2Point x = vertices[0];
119
+ R2Point px = proj.Project(x);
120
+ for (int i = 1; i < vertices.size(); ++i) {
121
+ S2Point y = vertices[i];
122
+ R2Point py = proj.WrapDestination(px, proj.Project(y));
123
+ // Check that every vertex is on the projected edge.
124
+ EXPECT_LE((py - pa).DotProd(norm), 1e-14 * py.Norm());
125
+ stats.Tally(GetMaxDistance(proj, px, x, py, y) / tolerance);
126
+ x = y;
127
+ px = py;
128
+ }
129
+ if (log_stats) {
130
+ cout << pa << " to " << pb << ": " << vertices.size() << " vertices, "
131
+ << stats.ToString() << endl;
132
+ }
133
+ return stats;
134
+ }
135
+
136
+ // Converts a geodesic edge to a sequence of projected edges and verifies that
137
+ // the result satisfies the given tolerance.
138
+ Stats TestProjected(const S2::Projection& proj, S1Angle tolerance,
139
+ const S2Point& a, const S2Point& b, bool log_stats) {
140
+ S2EdgeTessellator tess(&proj, tolerance);
141
+ vector<R2Point> vertices;
142
+ tess.AppendProjected(a, b, &vertices);
143
+ EXPECT_LE(S1Angle(a, proj.Unproject(vertices.front())), kMaxProjError);
144
+ EXPECT_LE(S1Angle(b, proj.Unproject(vertices.back())), kMaxProjError);
145
+ Stats stats;
146
+ if (a == b) {
147
+ EXPECT_EQ(1, vertices.size());
148
+ return stats;
149
+ }
150
+ R2Point px = vertices[0];
151
+ S2Point x = proj.Unproject(px);
152
+ for (int i = 1; i < vertices.size(); ++i) {
153
+ R2Point py = vertices[i];
154
+ S2Point y = proj.Unproject(py);
155
+ // Check that every vertex is on the geodesic edge.
156
+ static S1ChordAngle kMaxInterpolationError(S1Angle::Radians(1e-14));
157
+ EXPECT_TRUE(S2::IsDistanceLess(y, a, b, kMaxInterpolationError));
158
+ stats.Tally(GetMaxDistance(proj, px, x, py, y) / tolerance);
159
+ x = y;
160
+ px = py;
161
+ }
162
+ if (log_stats) {
163
+ cout << vertices[0] << " to " << px << ": " << vertices.size()
164
+ << " vertices, " << stats.ToString() << endl;
165
+ }
166
+ return stats;
167
+ }
168
+
169
+ TEST(S2EdgeTessellator, ProjectedNoTessellation) {
170
+ S2::PlateCarreeProjection proj(180);
171
+ S2EdgeTessellator tess(&proj, S1Angle::Degrees(0.01));
172
+ vector<R2Point> vertices;
173
+ tess.AppendProjected(S2Point(1, 0, 0), S2Point(0, 1, 0), &vertices);
174
+ EXPECT_EQ(2, vertices.size());
175
+ }
176
+
177
+ TEST(S2EdgeTessellator, UnprojectedNoTessellation) {
178
+ S2::PlateCarreeProjection proj(180);
179
+ S2EdgeTessellator tess(&proj, S1Angle::Degrees(0.01));
180
+ vector<S2Point> vertices;
181
+ tess.AppendUnprojected(R2Point(0, 30), R2Point(0, 50), &vertices);
182
+ EXPECT_EQ(2, vertices.size());
183
+ }
184
+
185
+ TEST(S2EdgeTessellator, UnprojectedWrapping) {
186
+ // This tests that a projected edge that crosses the 180 degree meridian
187
+ // goes the "short way" around the sphere.
188
+
189
+ S2::PlateCarreeProjection proj(180);
190
+ S2EdgeTessellator tess(&proj, S1Angle::Degrees(0.01));
191
+ vector<S2Point> vertices;
192
+ tess.AppendUnprojected(R2Point(-170, 0), R2Point(170, 80), &vertices);
193
+ for (const auto& v : vertices) {
194
+ EXPECT_GE(fabs(S2LatLng::Longitude(v).degrees()), 170);
195
+ }
196
+ }
197
+
198
+ TEST(S2EdgeTessellator, ProjectedWrapping) {
199
+ // This tests projecting a geodesic edge that crosses the 180 degree
200
+ // meridian. This results in a set of vertices that may be non-canonical
201
+ // (i.e., absolute longitudes greater than 180 degrees) but that don't have
202
+ // any sudden jumps in value, which is convenient for interpolating them.
203
+ S2::PlateCarreeProjection proj(180);
204
+ S2EdgeTessellator tess(&proj, S1Angle::Degrees(0.01));
205
+ vector<R2Point> vertices;
206
+ tess.AppendProjected(S2LatLng::FromDegrees(0, -170).ToPoint(),
207
+ S2LatLng::FromDegrees(0, 170).ToPoint(), &vertices);
208
+ for (const auto& v : vertices) {
209
+ EXPECT_LE(v.x(), -170);
210
+ }
211
+ }
212
+
213
+ TEST(S2EdgeTessellator, UnprojectedWrappingMultipleCrossings) {
214
+ // Tests an edge chain that crosses the 180 degree meridian multiple times.
215
+ // Note that due to coordinate wrapping, the last vertex of one edge may not
216
+ // exactly match the first edge of the next edge after unprojection.
217
+ S2::PlateCarreeProjection proj(180);
218
+ S2EdgeTessellator tess(&proj, S1Angle::Degrees(0.01));
219
+ vector<S2Point> vertices;
220
+ for (double lat = 1; lat <= 60; ++lat) {
221
+ tess.AppendUnprojected(R2Point(180 - 0.03 * lat, lat),
222
+ R2Point(-180 + 0.07 * lat, lat), &vertices);
223
+ tess.AppendUnprojected(R2Point(-180 + 0.07 * lat, lat),
224
+ R2Point(180 - 0.03 * (lat + 1), lat + 1), &vertices);
225
+ }
226
+ for (const auto& v : vertices) {
227
+ EXPECT_GE(fabs(S2LatLng::Longitude(v).degrees()), 175);
228
+ }
229
+ }
230
+
231
+ TEST(S2EdgeTessellator, ProjectedWrappingMultipleCrossings) {
232
+ // The following loop crosses the 180 degree meridian four times (twice in
233
+ // each direction).
234
+ auto loop = ParsePointsOrDie("0:160, 0:-40, 0:120, 0:-80, 10:120, "
235
+ "10:-40, 0:160");
236
+ S2::PlateCarreeProjection proj(180);
237
+ S1Angle tolerance(S1Angle::E7(1));
238
+ S2EdgeTessellator tess(&proj, tolerance);
239
+ vector<R2Point> vertices;
240
+ for (int i = 0; i + 1 < loop.size(); ++i) {
241
+ tess.AppendProjected(loop[i], loop[i + 1], &vertices);
242
+ }
243
+ EXPECT_EQ(vertices.front(), vertices.back());
244
+
245
+ // Note that the R2Point coordinates are in (lng, lat) order.
246
+ double min_lng = vertices[0].x();
247
+ double max_lng = vertices[0].x();
248
+ for (const R2Point& v : vertices) {
249
+ min_lng = min(min_lng, v.x());
250
+ max_lng = max(max_lng, v.x());
251
+ }
252
+ EXPECT_EQ(160, min_lng);
253
+ EXPECT_EQ(640, max_lng);
254
+ }
255
+
256
+ TEST(S2EdgeTessellator, InfiniteRecursionBug) {
257
+ S2::PlateCarreeProjection proj(180);
258
+ S1Angle kOneMicron = S1Angle::Radians(1e-6 / 6371.0);
259
+ S2EdgeTessellator tess(&proj, kOneMicron);
260
+ vector<R2Point> vertices;
261
+ tess.AppendProjected(S2LatLng::FromDegrees(3, 21).ToPoint(),
262
+ S2LatLng::FromDegrees(1, -159).ToPoint(), &vertices);
263
+ EXPECT_EQ(36, vertices.size());
264
+ }
265
+
266
+ TEST(S2EdgeTessellator, UnprojectedAccuracy) {
267
+ S2::MercatorProjection proj(180);
268
+ S1Angle tolerance(S1Angle::Degrees(1e-5));
269
+ R2Point pa(0, 0), pb(89.999999, 179);
270
+ Stats stats = TestUnprojected(proj, tolerance, pa, pb, true);
271
+ EXPECT_LE(stats.max(), 1.0);
272
+ }
273
+
274
+ TEST(S2EdgeTessellator, UnprojectedAccuracyCrossEquator) {
275
+ S2::MercatorProjection proj(180);
276
+ S1Angle tolerance(S1Angle::Degrees(1e-5));
277
+ R2Point pa(-10, -10), pb(10, 10);
278
+ Stats stats = TestUnprojected(proj, tolerance, pa, pb, true);
279
+ EXPECT_LT(stats.max(), 1.0);
280
+ }
281
+
282
+ TEST(S2EdgeTessellator, ProjectedAccuracy) {
283
+ S2::PlateCarreeProjection proj(180);
284
+ S1Angle tolerance(S1Angle::E7(1));
285
+ S2Point a = S2LatLng::FromDegrees(-89.999, -170).ToPoint();
286
+ S2Point b = S2LatLng::FromDegrees(50, 100).ToPoint();
287
+ Stats stats = TestProjected(proj, tolerance, a, b, true);
288
+ EXPECT_LE(stats.max(), 1.0);
289
+ }
290
+
291
+ TEST(S2EdgeTessellator, UnprojectedAccuracyMidpointEquator) {
292
+ S2::PlateCarreeProjection proj(180);
293
+ S1Angle tolerance = S2Testing::MetersToAngle(1);
294
+ R2Point a(80, 50), b(-80, -50);
295
+ Stats stats = TestUnprojected(proj, tolerance, a, b, true);
296
+ EXPECT_LE(stats.max(), 1.0);
297
+ }
298
+
299
+ TEST(S2EdgeTessellator, ProjectedAccuracyMidpointEquator) {
300
+ S2::PlateCarreeProjection proj(180);
301
+ S1Angle tolerance = S2Testing::MetersToAngle(1);
302
+ S2Point a = S2LatLng::FromDegrees(50, 80).ToPoint();
303
+ S2Point b = S2LatLng::FromDegrees(-50, -80).ToPoint();
304
+ Stats stats = TestProjected(proj, tolerance, a, b, true);
305
+ EXPECT_LE(stats.max(), 1.0);
306
+ }
307
+
308
+ TEST(S2EdgeTessellator, ProjectedAccuracyCrossEquator) {
309
+ S2::PlateCarreeProjection proj(180);
310
+ S1Angle tolerance(S1Angle::E7(1));
311
+ S2Point a = S2LatLng::FromDegrees(-20, -20).ToPoint();
312
+ S2Point b = S2LatLng::FromDegrees(20, 20).ToPoint();
313
+ Stats stats = TestProjected(proj, tolerance, a, b, true);
314
+ EXPECT_LT(stats.max(), 1.0);
315
+ }
316
+
317
+ TEST(S2EdgeTessellator, ProjectedAccuracySeattleToNewYork) {
318
+ S2::PlateCarreeProjection proj(180);
319
+ S1Angle tolerance = S2Testing::MetersToAngle(1);
320
+ S2Point seattle(S2LatLng::FromDegrees(47.6062, -122.3321).ToPoint());
321
+ S2Point newyork(S2LatLng::FromDegrees(40.7128, -74.0059).ToPoint());
322
+ Stats stats = TestProjected(proj, tolerance, seattle, newyork, true);
323
+ EXPECT_LE(stats.max(), 1.0);
324
+ }
325
+
326
+ // Given a projection, this function repeatedly chooses a pair of edge
327
+ // endpoints and measures the true distance between the geodesic and projected
328
+ // edges that connect those two endpoints. It then compares this to against
329
+ // the distance measurement algorithm used by S2EdgeTessellator, which
330
+ // consists of measuring the point-to-point distance between the edges at each
331
+ // of two fractions "t" and "1-t", computing the maximum of those two
332
+ // distances, and then scaling by the constant documented in the .cc file
333
+ // (based on the idea that the distance between the edges as a function of the
334
+ // interpolation fraction can be accurately modeled as a cubic polynomial).
335
+ //
336
+ // This function is used to (1) verify that the distance estimates are always
337
+ // conservative, (2) verify the optimality of the interpolation fraction "t",
338
+ // and (3) estimate the amount of overtessellation that occurs for various
339
+ // types of edges (e.g., short vs. long edges, edges that follow lines of
340
+ // latitude or longitude, etc).
341
+ void TestEdgeError(const S2::Projection& proj, double t) {
342
+ // Here we compute how much we need to scale the error measured at the
343
+ // chosen interpolation fraction "t" in order to bound the error along the
344
+ // entire edge, under the assumption that the error is a convex combination
345
+ // of E1(x) and E2(x) (see comments in the .cc file).
346
+ const double x = 1 - 2 * t;
347
+ const double dlat = sin(0.5 * M_PI_4 * (1 - x));
348
+ const double dlng = sin(M_PI_4 * (1 - x));
349
+ const double dsin2 = dlat * dlat + dlng * dlng * sin(M_PI_4 * x) * M_SQRT1_2;
350
+ const double dsin2_max = 0.5 * (1 - M_SQRT1_2);
351
+ // Note that this is the reciprocal of the value used in the .cc file!
352
+ const double kScaleFactor = max((2 * sqrt(3) / 9) / (x * (1 - x * x)),
353
+ asin(sqrt(dsin2_max)) / asin(sqrt(dsin2)));
354
+
355
+ // Keep track of the average and maximum geometric and parametric errors.
356
+ Stats stats_g, stats_p;
357
+ const int kIters = google::DEBUG_MODE ? 10000 : 100000;
358
+ for (int iter = 0; iter < kIters; ++iter) {
359
+ S2Testing::rnd.Reset(iter);
360
+ S2Point a = S2Testing::RandomPoint();
361
+ S2Point b = S2Testing::RandomPoint();
362
+ // Uncomment to test edges longer than 90 degrees.
363
+ if (a.DotProd(b) < -1e-14) continue;
364
+ // Uncomment to test edges than span more than 90 degrees longitude.
365
+ // if (a[0] * b[0] + a[1] * b[1] < 0) continue;
366
+ // Uncomment to only test edges of a certain length.
367
+ // b = S2::InterpolateAtDistance(S1Angle::Radians(1e-5), a, b);
368
+ // Uncomment to only test edges that stay in one hemisphere.
369
+ // if (a[2] * b[2] <= 0) continue;
370
+ R2Point pa = proj.Project(a);
371
+ R2Point pb = proj.WrapDestination(pa, proj.Project(b));
372
+ S1Angle max_dist_g = GetMaxDistance(proj, pa, a, pb, b,
373
+ DistType::GEOMETRIC);
374
+ // Ignore edges where the error is too small.
375
+ if (max_dist_g <= S2EdgeTessellator::kMinTolerance()) continue;
376
+ S1Angle max_dist_p = GetMaxDistance(proj, pa, a, pb, b,
377
+ DistType::PARAMETRIC);
378
+ if (max_dist_p <= S2EdgeTessellator::kMinTolerance()) continue;
379
+
380
+ // Compute the estimated error bound.
381
+ S1Angle d1(S2::Interpolate(t, a, b), proj.Unproject((1-t) * pa + t * pb));
382
+ S1Angle d2(S2::Interpolate(1-t, a, b), proj.Unproject(t * pa + (1-t) * pb));
383
+ S1Angle dist = kScaleFactor * max(S1Angle::Radians(1e-300), max(d1, d2));
384
+
385
+ // Compute the ratio of the true geometric/parametric errors to the
386
+ // estimate error bound.
387
+ double r_g = max_dist_g / dist;
388
+ double r_p = max_dist_p / dist;
389
+
390
+ // Our objective is to ensure that the geometric error ratio is at most 1.
391
+ // (The parametric ratio is computed only for analysis purposes.)
392
+ if (r_g > 0.99999) {
393
+ // Log any edges where the ratio is exceeded (or nearly so).
394
+ cout << pa << " to " << pb << ": ratio = " << r_g
395
+ << ", dist = " << max_dist_g.degrees() << endl;
396
+ }
397
+ stats_g.Tally(r_g);
398
+ stats_p.Tally(r_p);
399
+ }
400
+ cout << "t = " << t << ", scale = " << kScaleFactor << ", G["
401
+ << stats_g.ToString() << "], P[" << stats_p.ToString() << "]" << endl;
402
+ EXPECT_LE(stats_g.max(), kScaleFactor);
403
+ }
404
+
405
+ // The interpolation parameter actually used in the .cc file.
406
+ static constexpr double kBestFraction = 0.31215691082248312;
407
+
408
+ TEST(S2EdgeTessellator, MaxEdgeErrorPlateCarree) {
409
+ S2::PlateCarreeProjection proj(180);
410
+ // Uncomment to test some nearby parameter values.
411
+ // TestEdgeError(proj, 0.311);
412
+ TestEdgeError(proj, kBestFraction);
413
+ // TestEdgeError(proj, 0.313);
414
+ }
415
+
416
+ TEST(S2EdgeTessellator, MaxEdgeErrorMercator) {
417
+ S2::MercatorProjection proj(180);
418
+ // Uncomment to test some nearby parameter values.
419
+ // TestEdgeError(proj, 0.311);
420
+ TestEdgeError(proj, kBestFraction);
421
+ // TestEdgeError(proj, 0.313);
422
+ }
423
+
424
+ // Tessellates random edges using the given projection and tolerance, and
425
+ // verifies that the expected criteria are satisfied.
426
+ void TestRandomEdges(const S2::Projection& proj, S1Angle tolerance) {
427
+ const int kIters = google::DEBUG_MODE ? 50 : 500;
428
+ double max_r2 = 0, max_s2 = 0;
429
+ for (int iter = 0; iter < kIters; ++iter) {
430
+ S2Testing::rnd.Reset(iter);
431
+ S2Point a = S2Testing::RandomPoint();
432
+ S2Point b = S2Testing::RandomPoint();
433
+ max_r2 = max(max_r2, TestProjected(proj, tolerance, a, b, false).max());
434
+ R2Point pa = proj.Project(a);
435
+ R2Point pb = proj.Project(b);
436
+ max_s2 = max(max_s2, TestUnprojected(proj, tolerance, pa, pb, false).max());
437
+ }
438
+ cout << "max_r2 = " << max_r2 << ", max_s2 = " << max_s2 << endl;
439
+ EXPECT_LE(max_r2, 1.0);
440
+ EXPECT_LE(max_s2, 1.0);
441
+ }
442
+
443
+ TEST(S2EdgeTessellator, RandomEdgesPlateCarree) {
444
+ S2::PlateCarreeProjection proj(180);
445
+ S1Angle tolerance = S2Testing::MetersToAngle(100);
446
+ TestRandomEdges(proj, tolerance);
447
+ }
448
+
449
+ TEST(S2EdgeTessellator, RandomEdgesMercator) {
450
+ S2::MercatorProjection proj(180);
451
+ S1Angle tolerance = S2Testing::MetersToAngle(100);
452
+ TestRandomEdges(proj, tolerance);
453
+ }
454
+
455
+ // TODO(ericv): Superceded by random edge tests above, remove?
456
+ TEST(S2EdgeTessellator, UnprojectedAccuracyRandomCheck) {
457
+ S2::PlateCarreeProjection proj(180);
458
+ S1Angle tolerance(S1Angle::Degrees(1e-3));
459
+ S2Testing::Random rand;
460
+ const int kIters = google::DEBUG_MODE ? 250 : 5000;
461
+ for (int i = 0; i < kIters; ++i) {
462
+ S2Testing::rnd.Reset(i);
463
+ double alat = rand.UniformDouble(-89.99, 89.99);
464
+ double blat = rand.UniformDouble(-89.99, 89.99);
465
+ double blon = rand.UniformDouble(0, 179);
466
+
467
+ R2Point pa(0, alat), pb(blon, blat);
468
+ Stats stats = TestUnprojected(proj, tolerance, pa, pb, false);
469
+ EXPECT_LT(stats.max(), 1.0) << pa << ", " << pb;
470
+ }
471
+ }
472
+
473
+ // XXX(ericv): Superceded by random edge tests above, remove?
474
+ TEST(S2EdgeTessellator, ProjectedAccuracyRandomCheck) {
475
+ S2::PlateCarreeProjection proj(180);
476
+ S1Angle tolerance(S1Angle::Degrees(1e-3));
477
+ S2Testing::Random rand;
478
+ const int kIters = google::DEBUG_MODE ? 250 : 5000;
479
+ for (int i = 0; i < kIters; ++i) {
480
+ S2Testing::rnd.Reset(i);
481
+ double alat = rand.UniformDouble(-89.99, 89.99);
482
+ double blat = rand.UniformDouble(-89.99, 89.99);
483
+ double blon = rand.UniformDouble(-180, 180);
484
+
485
+ S2Point a = S2LatLng::FromDegrees(alat, 0).ToPoint();
486
+ S2Point b = S2LatLng::FromDegrees(blat, blon).ToPoint();
487
+ Stats stats = TestProjected(proj, tolerance, a, b, false);
488
+ EXPECT_LT(stats.max(), 1.0) << a << ", " << b;
489
+ }
490
+ }
491
+
492
+ } // namespace
@@ -0,0 +1,85 @@
1
+ // Copyright 2013 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ // Author: ericv@google.com (Eric Veach)
17
+
18
+ #ifndef S2_S2EDGE_VECTOR_SHAPE_H_
19
+ #define S2_S2EDGE_VECTOR_SHAPE_H_
20
+
21
+ #include <utility>
22
+ #include <vector>
23
+ #include "s2/s2shape.h"
24
+
25
+ // S2EdgeVectorShape is an S2Shape representing an arbitrary set of edges. It
26
+ // is mainly used for testing, but it can also be useful if you have, say, a
27
+ // collection of polylines and don't care about memory efficiency (since this
28
+ // class would store most of the vertices twice).
29
+ //
30
+ // Note that if you already have data stored in an S2Loop, S2Polyline, or
31
+ // S2Polygon, then you would be better off using the "Shape" class defined
32
+ // within those classes (e.g., S2Loop::Shape). Similarly, if the vertex data
33
+ // is stored in your own data structures, you can easily write your own
34
+ // subclass of S2Shape that points to the existing vertex data rather than
35
+ // copying it.
36
+ class S2EdgeVectorShape : public S2Shape {
37
+ public:
38
+ // Constructs an empty edge vector.
39
+ S2EdgeVectorShape() {}
40
+
41
+ // Constructs an S2EdgeVectorShape from a vector of edges.
42
+ explicit S2EdgeVectorShape(std::vector<std::pair<S2Point, S2Point>> edges) {
43
+ edges_ = std::move(edges);
44
+ }
45
+
46
+ // Creates an S2EdgeVectorShape containing a single edge.
47
+ S2EdgeVectorShape(const S2Point& a, const S2Point& b) {
48
+ edges_.push_back(std::make_pair(a, b));
49
+ }
50
+
51
+ ~S2EdgeVectorShape() override = default;
52
+
53
+ // Adds an edge to the vector.
54
+ //
55
+ // IMPORTANT: This method should only be called *before* adding the
56
+ // S2EdgeVectorShape to an S2ShapeIndex. S2Shapes can only be modified by
57
+ // removing them from the index, making changes, and adding them back again.
58
+ void Add(const S2Point& a, const S2Point& b) {
59
+ edges_.push_back(std::make_pair(a, b));
60
+ }
61
+
62
+ // S2Shape interface:
63
+ int num_edges() const final { return static_cast<int>(edges_.size()); }
64
+ Edge edge(int e) const final {
65
+ return Edge(edges_[e].first, edges_[e].second);
66
+ }
67
+ int dimension() const final { return 1; }
68
+ ReferencePoint GetReferencePoint() const final {
69
+ return ReferencePoint::Contained(false);
70
+ }
71
+ int num_chains() const final { return static_cast<int>(edges_.size()); }
72
+ Chain chain(int i) const final { return Chain(i, 1); }
73
+ Edge chain_edge(int i, int j) const final {
74
+ S2_DCHECK_EQ(j, 0);
75
+ return Edge(edges_[i].first, edges_[i].second);
76
+ }
77
+ ChainPosition chain_position(int e) const final {
78
+ return ChainPosition(e, 0);
79
+ }
80
+
81
+ private:
82
+ std::vector<std::pair<S2Point, S2Point>> edges_;
83
+ };
84
+
85
+ #endif // S2_S2EDGE_VECTOR_SHAPE_H_
@@ -0,0 +1,66 @@
1
+ // Copyright 2013 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/s2edge_vector_shape.h"
19
+
20
+ #include <gtest/gtest.h>
21
+ #include "s2/s2testing.h"
22
+
23
+ TEST(S2EdgeVectorShape, Empty) {
24
+ S2EdgeVectorShape shape;
25
+ EXPECT_EQ(0, shape.num_edges());
26
+ EXPECT_EQ(0, shape.num_chains());
27
+ EXPECT_EQ(1, shape.dimension());
28
+ EXPECT_TRUE(shape.is_empty());
29
+ EXPECT_FALSE(shape.is_full());
30
+ EXPECT_FALSE(shape.GetReferencePoint().contained);
31
+ }
32
+
33
+ TEST(S2EdgeVectorShape, EdgeAccess) {
34
+ S2EdgeVectorShape shape;
35
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
36
+ const int kNumEdges = 100;
37
+ for (int i = 0; i < kNumEdges; ++i) {
38
+ S2Point a = S2Testing::RandomPoint(); // Control the evaluation order
39
+ shape.Add(a, S2Testing::RandomPoint());
40
+ }
41
+ EXPECT_EQ(kNumEdges, shape.num_edges());
42
+ EXPECT_EQ(kNumEdges, shape.num_chains());
43
+ EXPECT_EQ(1, shape.dimension());
44
+ EXPECT_FALSE(shape.is_empty());
45
+ EXPECT_FALSE(shape.is_full());
46
+ S2Testing::rnd.Reset(FLAGS_s2_random_seed);
47
+ for (int i = 0; i < kNumEdges; ++i) {
48
+ EXPECT_EQ(i, shape.chain(i).start);
49
+ EXPECT_EQ(1, shape.chain(i).length);
50
+ auto edge = shape.edge(i);
51
+ EXPECT_EQ(S2Testing::RandomPoint(), edge.v0);
52
+ EXPECT_EQ(S2Testing::RandomPoint(), edge.v1);
53
+ }
54
+ }
55
+
56
+ TEST(S2EdgeVectorShape, SingletonConstructor) {
57
+ S2Point a(1, 0, 0), b(0, 1, 0);
58
+ S2EdgeVectorShape shape(a, b);
59
+ EXPECT_EQ(1, shape.num_edges());
60
+ EXPECT_EQ(1, shape.num_chains());
61
+ EXPECT_FALSE(shape.is_empty());
62
+ EXPECT_FALSE(shape.is_full());
63
+ auto edge = shape.edge(0);
64
+ EXPECT_EQ(a, edge.v0);
65
+ EXPECT_EQ(b, edge.v1);
66
+ }
@@ -0,0 +1,29 @@
1
+ // Copyright 2013 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/s2error.h"
19
+
20
+ #include "s2/base/stringprintf.h"
21
+
22
+ void S2Error::Init(Code code, const char* format, ...) {
23
+ code_ = code;
24
+ text_.clear();
25
+ va_list ap;
26
+ va_start(ap, format);
27
+ StringAppendV(&text_, format, ap);
28
+ va_end(ap);
29
+ }