@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,610 @@
1
+ // Copyright Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS-IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+
16
+ #include "s2/s2polyline_alignment.h"
17
+ #include "s2/s2polyline_alignment_internal.h"
18
+
19
+ #include <vector>
20
+
21
+ #include <gtest/gtest.h>
22
+
23
+ #include "s2/base/stringprintf.h"
24
+ #include "s2/third_party/absl/memory/memory.h"
25
+ #include "s2/third_party/absl/strings/str_cat.h"
26
+ #include "s2/s2cap.h"
27
+ #include "s2/s2loop.h"
28
+ #include "s2/s2testing.h"
29
+ #include "s2/s2text_format.h"
30
+
31
+ namespace s2polyline_alignment {
32
+
33
+ // PRIVATE API TESTS
34
+
35
+ TEST(S2PolylineAlignmentTest, CreatesWindowFromStrides) {
36
+ // 0 1 2 3 4 5
37
+ // 0 * * * . . .
38
+ // 1 . * * * . .
39
+ // 2 . . * * . .
40
+ // 3 . . . * * *
41
+ // 4 . . . . * *
42
+ const std::vector<ColumnStride> strides = {
43
+ {0, 3}, {1, 4}, {2, 4}, {3, 6}, {4, 6}};
44
+ const Window w(strides);
45
+ EXPECT_EQ(w.GetColumnStride(0).start, 0);
46
+ EXPECT_EQ(w.GetColumnStride(0).end, 3);
47
+ EXPECT_EQ(w.GetColumnStride(4).start, 4);
48
+ EXPECT_EQ(w.GetColumnStride(4).end, 6);
49
+ }
50
+
51
+ TEST(S2PolylineAlignmentTest, CreatesWindowFromWarpPath) {
52
+ // 0 1 2 3 4 5
53
+ // 0 * . . . . .
54
+ // 1 * * . . . .
55
+ // 2 . * . . . .
56
+ // 3 . * * * . .
57
+ // 4 . . . . * *
58
+ const WarpPath path = {{0, 0}, {1, 0}, {1, 1}, {2, 1}, {3, 1},
59
+ {3, 2}, {3, 3}, {4, 4}, {4, 5}};
60
+ const Window w(path);
61
+ EXPECT_EQ(w.GetColumnStride(0).start, 0);
62
+ EXPECT_EQ(w.GetColumnStride(0).end, 1);
63
+ EXPECT_EQ(w.GetColumnStride(1).start, 0);
64
+ EXPECT_EQ(w.GetColumnStride(1).end, 2);
65
+ EXPECT_EQ(w.GetColumnStride(2).start, 1);
66
+ EXPECT_EQ(w.GetColumnStride(2).end, 2);
67
+ EXPECT_EQ(w.GetColumnStride(3).start, 1);
68
+ EXPECT_EQ(w.GetColumnStride(3).end, 4);
69
+ EXPECT_EQ(w.GetColumnStride(4).start, 4);
70
+ EXPECT_EQ(w.GetColumnStride(4).end, 6);
71
+ }
72
+
73
+ TEST(S2PolylineAlignmentTest, GeneratesWindowDebugString) {
74
+ const std::vector<ColumnStride> strides = {{0, 4}, {0, 4}, {0, 4}, {0, 4}};
75
+ const Window w(strides);
76
+ const string expected_output = R"(
77
+ * * * *
78
+ * * * *
79
+ * * * *
80
+ * * * *
81
+ )";
82
+ EXPECT_EQ("\n" + w.DebugString(), expected_output);
83
+ }
84
+
85
+ TEST(S2PolylineAlignmentTest, UpsamplesWindowByFactorOfTwo) {
86
+ // 0 1 2 3 4 5
87
+ // 0 * * * . . .
88
+ // 1 . * * * . .
89
+ // 2 . . * * . .
90
+ // 3 . . . * * *
91
+ // 4 . . . . * *
92
+ const std::vector<ColumnStride> strides = {
93
+ {0, 3}, {1, 4}, {2, 4}, {3, 6}, {4, 6}};
94
+ const Window w(strides);
95
+ const Window w_upscaled = w.Upsample(10, 12);
96
+ const string expected_output = R"(
97
+ * * * * * * . . . . . .
98
+ * * * * * * . . . . . .
99
+ . . * * * * * * . . . .
100
+ . . * * * * * * . . . .
101
+ . . . . * * * * . . . .
102
+ . . . . * * * * . . . .
103
+ . . . . . . * * * * * *
104
+ . . . . . . * * * * * *
105
+ . . . . . . . . * * * *
106
+ . . . . . . . . * * * *
107
+ )";
108
+ EXPECT_EQ("\n" + w_upscaled.DebugString(), expected_output);
109
+ }
110
+
111
+ TEST(S2PolylineAlignmentTest, UpsamplesWindowXAxisByFactorOfThree) {
112
+ // 0 1 2 3 4 5
113
+ // 0 * * * . . .
114
+ // 1 . * * * . .
115
+ // 2 . . * * . . 3 . . . * * *
116
+ // 4 . . . . * *
117
+ const std::vector<ColumnStride> strides = {
118
+ {0, 3}, {1, 4}, {2, 4}, {3, 6}, {4, 6}};
119
+ const Window w(strides);
120
+ const Window w_upscaled = w.Upsample(5, 18);
121
+ const string expected_output = R"(
122
+ * * * * * * * * * . . . . . . . . .
123
+ . . . * * * * * * * * * . . . . . .
124
+ . . . . . . * * * * * * . . . . . .
125
+ . . . . . . . . . * * * * * * * * *
126
+ . . . . . . . . . . . . * * * * * *
127
+ )";
128
+ EXPECT_EQ("\n" + w_upscaled.DebugString(), expected_output);
129
+ }
130
+
131
+ TEST(S2PolylineAlignmentTest, UpsamplesWindowYAxisByFactorOfThree) {
132
+ // 0 1 2 3 4 5
133
+ // 0 * * * . . .
134
+ // 1 . * * * . .
135
+ // 2 . . * * . .
136
+ // 3 . . . * * *
137
+ // 4 . . . . * *
138
+ const std::vector<ColumnStride> strides = {
139
+ {0, 3}, {1, 4}, {2, 4}, {3, 6}, {4, 6}};
140
+ const Window w(strides);
141
+ const Window w_upscaled = w.Upsample(15, 6);
142
+ const string expected_output = R"(
143
+ * * * . . .
144
+ * * * . . .
145
+ * * * . . .
146
+ . * * * . .
147
+ . * * * . .
148
+ . * * * . .
149
+ . . * * . .
150
+ . . * * . .
151
+ . . * * . .
152
+ . . . * * *
153
+ . . . * * *
154
+ . . . * * *
155
+ . . . . * *
156
+ . . . . * *
157
+ . . . . * *
158
+ )";
159
+ EXPECT_EQ("\n" + w_upscaled.DebugString(), expected_output);
160
+ }
161
+
162
+ TEST(S2PolylineAlignmentTest, UpsamplesWindowByNonInteger) {
163
+ // 0 1 2 3 4 5
164
+ // 0 * * * . . .
165
+ // 1 . * * * . .
166
+ // 2 . . * * . .
167
+ // 3 . . . * * *
168
+ // 4 . . . . * *
169
+ const std::vector<ColumnStride> strides = {
170
+ {0, 3}, {1, 4}, {2, 4}, {3, 6}, {4, 6}};
171
+ const Window w(strides);
172
+
173
+ const Window w_upscaled = w.Upsample(19, 23);
174
+ const string expected_output = R"(
175
+ * * * * * * * * * * * * . . . . . . . . . . .
176
+ * * * * * * * * * * * * . . . . . . . . . . .
177
+ * * * * * * * * * * * * . . . . . . . . . . .
178
+ * * * * * * * * * * * * . . . . . . . . . . .
179
+ . . . . * * * * * * * * * * * . . . . . . . .
180
+ . . . . * * * * * * * * * * * . . . . . . . .
181
+ . . . . * * * * * * * * * * * . . . . . . . .
182
+ . . . . * * * * * * * * * * * . . . . . . . .
183
+ . . . . . . . . * * * * * * * . . . . . . . .
184
+ . . . . . . . . * * * * * * * . . . . . . . .
185
+ . . . . . . . . * * * * * * * . . . . . . . .
186
+ . . . . . . . . . . . . * * * * * * * * * * *
187
+ . . . . . . . . . . . . * * * * * * * * * * *
188
+ . . . . . . . . . . . . * * * * * * * * * * *
189
+ . . . . . . . . . . . . * * * * * * * * * * *
190
+ . . . . . . . . . . . . . . . * * * * * * * *
191
+ . . . . . . . . . . . . . . . * * * * * * * *
192
+ . . . . . . . . . . . . . . . * * * * * * * *
193
+ . . . . . . . . . . . . . . . * * * * * * * *
194
+ )";
195
+ EXPECT_EQ("\n" + w_upscaled.DebugString(), expected_output);
196
+ }
197
+
198
+ TEST(S2PolylineAlignmentTest, DilatesWindowByRadiusZero) {
199
+ // 0 1 2 3 4 5
200
+ // 0 * * * . . .
201
+ // 1 . . * . . .
202
+ // 2 . . * . . .
203
+ // 3 . . * * . .
204
+ // 4 . . . * * *
205
+ const std::vector<ColumnStride> strides = {
206
+ {0, 3}, {2, 3}, {2, 3}, {2, 4}, {3, 6}};
207
+ const Window w(strides);
208
+ const Window w_d = w.Dilate(0);
209
+ const string expected_output = R"(
210
+ * * * . . .
211
+ . . * . . .
212
+ . . * . . .
213
+ . . * * . .
214
+ . . . * * *
215
+ )";
216
+ EXPECT_EQ("\n" + w_d.DebugString(), expected_output);
217
+ }
218
+
219
+ TEST(S2PolylineAlignmentTest, DilatesWindowByRadiusOne) {
220
+ // 0 1 2 3 4 5 (x's are the spots that we dilate into)
221
+ // 0 * * * x . .
222
+ // 1 x x * x . .
223
+ // 2 . x * x x .
224
+ // 3 . x * * x x
225
+ // 4 . x x * * *
226
+ const std::vector<ColumnStride> strides = {
227
+ {0, 3}, {2, 3}, {2, 3}, {2, 4}, {3, 6}};
228
+ const Window w(strides);
229
+ const Window w_d = w.Dilate(1);
230
+ const string expected_output = R"(
231
+ * * * * . .
232
+ * * * * . .
233
+ . * * * * .
234
+ . * * * * *
235
+ . * * * * *
236
+ )";
237
+ EXPECT_EQ("\n" + w_d.DebugString(), expected_output);
238
+ }
239
+
240
+ TEST(S2PolylineAlignmentTest, DilatesWindowByRadiusTwo) {
241
+ // 0 1 2 3 4 5 (x's are the spots that we dilate into)
242
+ // 0 * * * x x .
243
+ // 1 x x * x x x
244
+ // 2 x x * x x x
245
+ // 3 x x * * x x
246
+ // 4 x x x * * *
247
+ const std::vector<ColumnStride> strides = {
248
+ {0, 3}, {2, 3}, {2, 3}, {2, 4}, {3, 6}};
249
+ const Window w(strides);
250
+ const Window w_d = w.Dilate(2);
251
+ const string expected_output = R"(
252
+ * * * * * .
253
+ * * * * * *
254
+ * * * * * *
255
+ * * * * * *
256
+ * * * * * *
257
+ )";
258
+ EXPECT_EQ("\n" + w_d.DebugString(), expected_output);
259
+ }
260
+ TEST(S2PolylineAlignmentTest, DilatesWindowByVeryLargeRadius) {
261
+ const std::vector<ColumnStride> strides = {
262
+ {0, 3}, {2, 3}, {2, 3}, {2, 4}, {3, 6}};
263
+ const Window w(strides);
264
+ const Window w_d = w.Dilate(100);
265
+ const string expected_output = R"(
266
+ * * * * * *
267
+ * * * * * *
268
+ * * * * * *
269
+ * * * * * *
270
+ * * * * * *
271
+ )";
272
+ EXPECT_EQ("\n" + w_d.DebugString(), expected_output);
273
+ }
274
+
275
+ TEST(S2PolylineAlignmentTest, HalvesZeroLengthPolyline) {
276
+ const auto line = s2textformat::MakePolylineOrDie("");
277
+ const auto halved = HalfResolution(*line);
278
+ const auto correct = s2textformat::MakePolylineOrDie("");
279
+ EXPECT_EQ(s2textformat::ToString(*halved), s2textformat::ToString(*correct));
280
+ }
281
+
282
+ TEST(S2PolylineAlignmentTest, HalvesEvenLengthPolyline) {
283
+ const auto line = s2textformat::MakePolylineOrDie("0:0, 0:1, 0:2, 1:2");
284
+ const auto halved = HalfResolution(*line);
285
+ const auto correct = s2textformat::MakePolylineOrDie("0:0, 0:2");
286
+ EXPECT_EQ(s2textformat::ToString(*halved), s2textformat::ToString(*correct));
287
+ }
288
+
289
+ TEST(S2PolylineAlignmentTest, HalvesOddLengthPolyline) {
290
+ const auto line = s2textformat::MakePolylineOrDie("0:0, 0:1, 0:2, 1:2, 3:5");
291
+ const auto halved = HalfResolution(*line);
292
+ const auto correct = s2textformat::MakePolylineOrDie("0:0, 0:2, 3:5");
293
+ EXPECT_EQ(s2textformat::ToString(*halved), s2textformat::ToString(*correct));
294
+ }
295
+
296
+ // PUBLIC API TESTS
297
+
298
+ CostTable DistanceMatrix(const S2Polyline& a, const S2Polyline& b) {
299
+ const int a_n = a.num_vertices();
300
+ const int b_n = b.num_vertices();
301
+ auto table = CostTable(a_n, std::vector<double>(b_n));
302
+ for (int i = 0; i < a_n; ++i) {
303
+ for (int j = 0; j < b_n; ++j) {
304
+ table[i][j] = (a.vertex(i) - b.vertex(j)).Norm2();
305
+ }
306
+ }
307
+ return table;
308
+ }
309
+
310
+ // Do some testing against random sequences with a brute-force solver.
311
+ // Returns the optimal cost of alignment up until vertex i, j.
312
+ double GetBruteForceCost(const CostTable& table, const int i, const int j) {
313
+ if (i == 0 && j == 0) {
314
+ return table[0][0];
315
+ } else if (i == 0) {
316
+ return GetBruteForceCost(table, i, j - 1) + table[i][j];
317
+ } else if (j == 0) {
318
+ return GetBruteForceCost(table, i - 1, j) + table[i][j];
319
+ } else {
320
+ return std::min({GetBruteForceCost(table, i - 1, j - 1),
321
+ GetBruteForceCost(table, i - 1, j),
322
+ GetBruteForceCost(table, i, j - 1)}) +
323
+ table[i][j];
324
+ }
325
+ }
326
+
327
+ // Use Brute Force solver to verify exact Dynamic Programming solvers.
328
+ void VerifyCost(const S2Polyline& a, const S2Polyline& b) {
329
+ const int a_n = a.num_vertices();
330
+ const int b_n = b.num_vertices();
331
+ const double brute_cost =
332
+ GetBruteForceCost(DistanceMatrix(a, b), a_n - 1, b_n - 1);
333
+ const double exact_cost = GetExactVertexAlignmentCost(a, b);
334
+ const VertexAlignment exact_alignment = GetExactVertexAlignment(a, b);
335
+ EXPECT_FLOAT_EQ(brute_cost, exact_cost);
336
+ EXPECT_FLOAT_EQ(brute_cost, exact_alignment.alignment_cost);
337
+ }
338
+
339
+ // Check that the costs are the same between both exact computation methods, and
340
+ // that the warp path matches the one given.
341
+ void VerifyPath(const S2Polyline& a, const S2Polyline& b, const WarpPath& p) {
342
+ double correct = 0;
343
+ for (const auto& pair : p) {
344
+ correct += (a.vertex(pair.first) - b.vertex(pair.second)).Norm2();
345
+ }
346
+ const double exact_cost = GetExactVertexAlignmentCost(a, b);
347
+ const VertexAlignment exact_alignment = GetExactVertexAlignment(a, b);
348
+ EXPECT_FLOAT_EQ(correct, exact_cost);
349
+ EXPECT_FLOAT_EQ(correct, exact_alignment.alignment_cost);
350
+ EXPECT_EQ(exact_alignment.warp_path.size(), p.size());
351
+ for (int i = 0; i < exact_alignment.warp_path.size(); ++i) {
352
+ EXPECT_EQ(exact_alignment.warp_path[i], p[i]);
353
+ }
354
+ }
355
+
356
+ // Return vector of length `num_polylines` containing correlated random
357
+ // polylines with `num_vertices` vertices each.
358
+ //
359
+ // First, we construct a regularly spaced base loop with `num_vertices`
360
+ // vertices. Then, for each of `num_polylines` iterations, we construct an new
361
+ // loop by uniformly perturbing each point in the base loop by an amount equal
362
+ // to `perturbation` * edge_length in a spherical cap. If `perturbation` is less
363
+ // than 0.5, then we can perturb each point in the second loop by up to 0.5 edge
364
+ // lengths in any direction, which will leave that point with only one possible
365
+ // closest vertex match in the base loop. On the other hand, if `perturbation`
366
+ // is greater than 0.5, then each vertex in the additional loop will more than
367
+ // one match (approximately 2*perturbation + 1) on average in the base loop. The
368
+ // intent of this method is to provide a set of correlated testing lines for
369
+ // benchmarks and fuzz tests.
370
+ std::vector<std::unique_ptr<S2Polyline>> GenPolylines(
371
+ const int num_polylines, const int num_vertices,
372
+ const double perturbation) {
373
+ const auto kLoopRadius = S1Angle::Radians(0.01);
374
+ const auto edge_length = 2 * M_PI * kLoopRadius / num_vertices;
375
+ const auto perturbation_radius = perturbation * edge_length;
376
+ const auto center = S2Testing::RandomPoint();
377
+ const auto loop =
378
+ S2Testing::MakeRegularPoints(center, kLoopRadius, num_vertices);
379
+
380
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
381
+ polylines.reserve(num_polylines);
382
+
383
+ for (int i = 0; i < num_polylines; ++i) {
384
+ std::vector<S2Point> pts;
385
+ pts.reserve(num_vertices);
386
+ for (int j = 0; j < num_vertices; ++j) {
387
+ pts.push_back(
388
+ S2Testing::SamplePoint(S2Cap(loop[j], perturbation_radius)));
389
+ }
390
+ polylines.push_back(absl::make_unique<S2Polyline>(pts));
391
+ }
392
+ return polylines;
393
+ }
394
+
395
+ TEST(S2PolylineAlignmentTest, ExactLengthZeroInputs) {
396
+ const auto a = s2textformat::MakePolylineOrDie("");
397
+ const auto b = s2textformat::MakePolylineOrDie("");
398
+ const WarpPath correct_path = {};
399
+ EXPECT_DEATH(VerifyPath(*a, *b, correct_path), "");
400
+ }
401
+
402
+ TEST(S2PolylineAlignmentTest, ExactLengthZeroInputA) {
403
+ const auto a = s2textformat::MakePolylineOrDie("");
404
+ const auto b = s2textformat::MakePolylineOrDie("0:0, 1:1, 2:2");
405
+ const WarpPath correct_path = {};
406
+ EXPECT_DEATH(VerifyPath(*a, *b, correct_path), "");
407
+ }
408
+
409
+ TEST(S2PolylineAlignmentTest, ExactLengthZeroInputB) {
410
+ const auto a = s2textformat::MakePolylineOrDie("0:0, 1:1, 2:2");
411
+ const auto b = s2textformat::MakePolylineOrDie("");
412
+ const WarpPath correct_path = {};
413
+ EXPECT_DEATH(VerifyPath(*a, *b, correct_path), "");
414
+ }
415
+
416
+ TEST(S2PolylineAlignmentTest, ExactLengthOneInputs) {
417
+ const auto a = s2textformat::MakePolylineOrDie("1:1");
418
+ const auto b = s2textformat::MakePolylineOrDie("2:2");
419
+ const WarpPath correct_path = {{0, 0}};
420
+ VerifyPath(*a, *b, correct_path);
421
+ VerifyCost(*a, *b);
422
+ }
423
+
424
+ TEST(S2PolylineAlignmentTest, ExactLengthOneInputA) {
425
+ const auto a = s2textformat::MakePolylineOrDie("0:0");
426
+ const auto b = s2textformat::MakePolylineOrDie("0:0, 1:1, 2:2");
427
+ const WarpPath correct_path = {{0, 0}, {0, 1}, {0, 2}};
428
+ VerifyPath(*a, *b, correct_path);
429
+ VerifyCost(*a, *b);
430
+ }
431
+
432
+ TEST(S2PolylineAlignmentTest, ExactLengthOneInputB) {
433
+ const auto a = s2textformat::MakePolylineOrDie("0:0, 1:1, 2:2");
434
+ const auto b = s2textformat::MakePolylineOrDie("0:0");
435
+ const WarpPath correct_path = {{0, 0}, {1, 0}, {2, 0}};
436
+ VerifyPath(*a, *b, correct_path);
437
+ VerifyCost(*a, *b);
438
+ }
439
+
440
+ TEST(S2PolylineAlignmentTest, ExactHeaderFileExample) {
441
+ const auto a = s2textformat::MakePolylineOrDie("1:0, 5:0, 6:0, 9:0");
442
+ const auto b = s2textformat::MakePolylineOrDie("2:0, 7:0, 8:0");
443
+ const WarpPath correct_path = {{0, 0}, {1, 1}, {2, 1}, {3, 2}};
444
+ VerifyPath(*a, *b, correct_path);
445
+ VerifyCost(*a, *b);
446
+ }
447
+
448
+ // Take a small random selection of short correlated polylines and ensure that
449
+ // the cost from the brute force solver equals the cost from the DP solvers.
450
+ TEST(S2PolylineAlignmentTest, FuzzedWithBruteForce) {
451
+ const int kNumPolylines = 10;
452
+ const int kNumVertices = 8;
453
+ const double kPerturbation = 1.5;
454
+ const auto lines = GenPolylines(kNumPolylines, kNumVertices, kPerturbation);
455
+ for (int i = 0; i < kNumPolylines; ++i) {
456
+ for (int j = i + 1; j < kNumPolylines; ++j) {
457
+ VerifyCost(*lines[i], *lines[j]);
458
+ }
459
+ }
460
+ }
461
+
462
+ // TESTS FOR TRAJECTORY CONSENSUS ALGORITHMS
463
+
464
+ // Tests for GetMedoidPolyline
465
+ TEST(S2PolylineAlignmentTest, MedoidPolylineNoPolylines) {
466
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
467
+ const MedoidOptions default_opts;
468
+ EXPECT_DEATH(GetMedoidPolyline(polylines, default_opts), "");
469
+ }
470
+
471
+ TEST(S2PolylineAlignmentTest, MedoidPolylineOnePolyline) {
472
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
473
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("5:0, 5:1, 5:2"));
474
+ const MedoidOptions default_opts;
475
+ const auto medoid = GetMedoidPolyline(polylines, default_opts);
476
+ EXPECT_EQ(medoid, 0);
477
+ }
478
+
479
+ TEST(S2PolylineAlignmentTest, MedoidPolylineTwoPolylines) {
480
+ // Tie-breaking is contractually done by choosing the smallest tied index.
481
+ // These inputs (really, any collection of two polylines) yield a tie.
482
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
483
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("5:0, 5:1, 5:2"));
484
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
485
+
486
+ const MedoidOptions default_opts;
487
+ const auto medoid = GetMedoidPolyline(polylines, default_opts);
488
+ EXPECT_EQ(medoid, 0);
489
+ }
490
+
491
+ TEST(S2PolylineAlignmentTest, MedoidPolylineFewSmallPolylines) {
492
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
493
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("5:0, 5:1, 5:2"));
494
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("3:0, 3:1, 3:2"));
495
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
496
+
497
+ const MedoidOptions default_opts;
498
+ const auto medoid = GetMedoidPolyline(polylines, default_opts);
499
+ EXPECT_EQ(medoid, 1);
500
+ }
501
+
502
+ TEST(S2PolylineAlignmentTest, MedoidPolylineOverlappingPolylines) {
503
+ // Given two identical polylines as input, break the tie with smallest index.
504
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
505
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
506
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
507
+
508
+ const MedoidOptions default_opts;
509
+ const auto medoid = GetMedoidPolyline(polylines, default_opts);
510
+ EXPECT_EQ(medoid, 0);
511
+ }
512
+
513
+ TEST(S2PolylineAlignmentTest, MedoidPolylineDifferentLengthPolylines) {
514
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
515
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("5:0, 5:1, 5:2"));
516
+ polylines.emplace_back(
517
+ s2textformat::MakePolylineOrDie("3:0, 3:0.5, 3:1, 3:2"));
518
+ polylines.emplace_back(
519
+ s2textformat::MakePolylineOrDie("1:0, 1:0.5, 1:1, 1:1.5, 1:2"));
520
+
521
+ const MedoidOptions default_opts;
522
+ const auto medoid = GetMedoidPolyline(polylines, default_opts);
523
+ EXPECT_EQ(medoid, 1);
524
+ }
525
+
526
+ TEST(S2PolylineAlignmentTest, MedoidPolylineFewLargePolylines) {
527
+ // We pick num_vertices to be large so that the approx and exact vertex
528
+ // alignment computations are likely to give different results.
529
+ const int num_polylines = 3;
530
+ const int num_vertices = 1024;
531
+ const double perturb = 0.9;
532
+ const auto polylines = GenPolylines(num_polylines, num_vertices, perturb);
533
+
534
+ // clang-format off
535
+ const std::vector<double> exact_costs = {
536
+ GetExactVertexAlignmentCost(*polylines[0], *polylines[1]) +
537
+ GetExactVertexAlignmentCost(*polylines[0], *polylines[2]),
538
+ GetExactVertexAlignmentCost(*polylines[1], *polylines[0]) +
539
+ GetExactVertexAlignmentCost(*polylines[1], *polylines[2]),
540
+ GetExactVertexAlignmentCost(*polylines[2], *polylines[0]) +
541
+ GetExactVertexAlignmentCost(*polylines[2], *polylines[1])
542
+ };
543
+ const std::vector<double> approx_costs = {
544
+ GetApproxVertexAlignment(*polylines[0], *polylines[1]).alignment_cost +
545
+ GetApproxVertexAlignment(*polylines[0], *polylines[2]).alignment_cost,
546
+ GetApproxVertexAlignment(*polylines[1], *polylines[0]).alignment_cost +
547
+ GetApproxVertexAlignment(*polylines[1], *polylines[2]).alignment_cost,
548
+ GetApproxVertexAlignment(*polylines[2], *polylines[0]).alignment_cost +
549
+ GetApproxVertexAlignment(*polylines[2], *polylines[1]).alignment_cost
550
+ };
551
+ // clang-format on
552
+
553
+ const int exact_medoid_index =
554
+ std::min_element(exact_costs.begin(), exact_costs.end()) -
555
+ exact_costs.begin();
556
+
557
+ const int approx_medoid_index =
558
+ std::min_element(approx_costs.begin(), approx_costs.end()) -
559
+ approx_costs.begin();
560
+
561
+ MedoidOptions options;
562
+ options.set_approx(false);
563
+ const auto exact_medoid = GetMedoidPolyline(polylines, options);
564
+ EXPECT_EQ(exact_medoid, exact_medoid_index);
565
+
566
+ options.set_approx(true);
567
+ const auto approx_medoid = GetMedoidPolyline(polylines, options);
568
+ EXPECT_EQ(approx_medoid, approx_medoid_index);
569
+ }
570
+
571
+ // Tests for GetConsensusPolyline
572
+ TEST(S2PolylineAlignmentTest, ConsensusPolylineNoPolylines) {
573
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
574
+ const ConsensusOptions default_opts;
575
+ EXPECT_DEATH(GetConsensusPolyline(polylines, default_opts), "");
576
+ }
577
+
578
+ TEST(S2PolylineAlignmentTest, ConsensusPolylineOnePolyline) {
579
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
580
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("3:0, 3:1, 3:2"));
581
+
582
+ const ConsensusOptions default_opts;
583
+ const auto result = GetConsensusPolyline(polylines, default_opts);
584
+ const auto expected = s2textformat::MakePolylineOrDie("3:0, 3:1, 3:2");
585
+ EXPECT_TRUE(result->ApproxEquals(*expected));
586
+ }
587
+
588
+ TEST(S2PolylineAlignmentTest, ConsensusPolylineTwoPolylines) {
589
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
590
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("3:0, 3:1, 3:2"));
591
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
592
+
593
+ const ConsensusOptions default_opts;
594
+ const auto result = GetConsensusPolyline(polylines, default_opts);
595
+ const auto expected = s2textformat::MakePolylineOrDie("2:0, 2:1, 2:2");
596
+ EXPECT_TRUE(result->ApproxEquals(*expected));
597
+ }
598
+
599
+ TEST(S2PolylineAlignmentTest, ConsensusPolylineOverlappingPolylines) {
600
+ std::vector<std::unique_ptr<S2Polyline>> polylines;
601
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
602
+ polylines.emplace_back(s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2"));
603
+
604
+ const ConsensusOptions default_opts;
605
+ const auto result = GetConsensusPolyline(polylines, default_opts);
606
+ const auto expected = s2textformat::MakePolylineOrDie("1:0, 1:1, 1:2");
607
+ EXPECT_TRUE(result->ApproxEquals(*expected));
608
+ }
609
+
610
+ } // namespace s2polyline_alignment
@@ -0,0 +1,42 @@
1
+ // Copyright 2018 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/s2polyline_measures.h"
19
+
20
+ #include <cmath>
21
+ #include "s2/base/logging.h"
22
+ #include "s2/s2centroids.h"
23
+
24
+ namespace S2 {
25
+
26
+ S1Angle GetLength(S2PointSpan polyline) {
27
+ S1Angle length;
28
+ for (int i = 1; i < polyline.size(); ++i) {
29
+ length += S1Angle(polyline[i - 1], polyline[i]);
30
+ }
31
+ return length;
32
+ }
33
+
34
+ S2Point GetCentroid(S2PointSpan polyline) {
35
+ S2Point centroid;
36
+ for (int i = 1; i < polyline.size(); ++i) {
37
+ centroid += S2::TrueCentroid(polyline[i - 1], polyline[i]);
38
+ }
39
+ return centroid;
40
+ }
41
+
42
+ } // namespace S2
@@ -0,0 +1,53 @@
1
+ // Copyright 2018 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
+ // Defines various measures for polylines on the sphere. These are low-level
19
+ // methods that work directly with arrays of S2Points. They are used to
20
+ // implement the methods in s2shapeindex_measures.h, s2shape_measures.h, and
21
+ // s2polyline.h.
22
+ //
23
+ // See s2loop_measures.h, s2edge_distances.h, and s2measures.h for additional
24
+ // low-level methods.
25
+
26
+ #ifndef S2_S2POLYLINE_MEASURES_H_
27
+ #define S2_S2POLYLINE_MEASURES_H_
28
+
29
+ #include "s2/s1angle.h"
30
+ #include "s2/s2point.h"
31
+ #include "s2/s2point_span.h"
32
+
33
+ namespace S2 {
34
+
35
+ // Returns the length of the polyline. Returns zero for polylines with fewer
36
+ // than two vertices.
37
+ S1Angle GetLength(S2PointSpan polyline);
38
+
39
+ // Returns the true centroid of the polyline multiplied by the length of the
40
+ // polyline (see s2centroids.h for details on centroids). The result is not
41
+ // unit length, so you may want to normalize it.
42
+ //
43
+ // Scaling by the polyline length makes it easy to compute the centroid of
44
+ // several polylines (by simply adding up their centroids).
45
+ //
46
+ // CAVEAT: Returns S2Point() for degenerate polylines (e.g., AA). [Note that
47
+ // this answer is correct; the result of this function is a line integral over
48
+ // the polyline, whose value is always zero if the polyline is degenerate.]
49
+ S2Point GetCentroid(S2PointSpan polyline);
50
+
51
+ } // namespace S2
52
+
53
+ #endif // S2_S2POLYLINE_MEASURES_H_