flo-mat 4.1.4 → 5.0.1

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 (379) hide show
  1. package/__tests__/closest-boundary-point/get-endpoint-info.spec.ts +140 -0
  2. package/__tests__/closest-boundary-point/root-interval-to-distance-squared-interval.spec.ts +87 -0
  3. package/__tests__/cp-node/circle-identity.spec.ts +56 -0
  4. package/__tests__/cp-node/fs/get-all-on-loop-by-loop.spec.ts +55 -0
  5. package/__tests__/cp-node/fs/get-angle-between-mat-curves.spec.ts +39 -3
  6. package/__tests__/cp-node/fs/get-boundary-bezier-parts-to-next.spec.ts +87 -3
  7. package/__tests__/cp-node/fs/get-boundary-beziers-between.spec.ts +68 -3
  8. package/__tests__/cp-node/fs/get-boundary-beziers-to-next.spec.ts +41 -3
  9. package/__tests__/cp-node/fs/get-boundary-distance-to-next.spec.ts +20 -3
  10. package/__tests__/cp-node/fs/get-branch-beziers.spec.ts +42 -3
  11. package/__tests__/cp-node/fs/get-branch.spec.ts +60 -3
  12. package/__tests__/cp-node/fs/get-cp-node-ordering.spec.ts +19 -3
  13. package/__tests__/cp-node/fs/get-distance-to-next.spec.ts +37 -4
  14. package/__tests__/cp-node/fs/get-edge-direction.spec.ts +50 -3
  15. package/__tests__/cp-node/fs/get-first-exit.spec.ts +78 -3
  16. package/__tests__/cp-node/fs/get-hole-closers.spec.ts +32 -3
  17. package/__tests__/cp-node/fs/get-implied-boundary-bezier-between.spec.ts +48 -3
  18. package/__tests__/cp-node/fs/get-mat-curve-between.spec.ts +77 -3
  19. package/__tests__/cp-node/fs/get-mat-curve-to-next.spec.ts +17 -4
  20. package/__tests__/cp-node/fs/get-mat-curves-between.spec.ts +38 -3
  21. package/__tests__/cp-node/fs/get-salience.spec.ts +68 -3
  22. package/__tests__/cp-node/fs/get-vertex-forward-children.spec.ts +40 -3
  23. package/__tests__/cp-node/fs/insert-cp-node.spec.ts +87 -3
  24. package/__tests__/cp-node/fs/is-special.spec.ts +1 -1
  25. package/__tests__/cp-node/fs/remove-cp-node.spec.ts +42 -3
  26. package/__tests__/find-2-prong/calc-seperation-tolerance.spec.ts +46 -0
  27. package/__tests__/find-2-prong/get-medial/dd-get-medial-point-coeffs-same-curve.spec.ts +7 -5
  28. package/__tests__/find-2-prong/get-medial/dd-get-medial-point-coeffs.spec.ts +4 -2
  29. package/__tests__/find-2-prong/get-medial/get-closest-points.spec.ts +1 -1
  30. package/__tests__/floyd-warshall/get-graph.spec.ts +100 -0
  31. package/__tests__/get-mats-with-hole.ts +28 -0
  32. package/__tests__/get-mats1.spec.ts +61 -0
  33. package/__tests__/get-mats1.ts +75 -67
  34. package/__tests__/helpers/cp-node-by-id.ts +27 -0
  35. package/__tests__/helpers/expect-point-close.ts +42 -0
  36. package/__tests__/mat/hausdorff-distance-one-sided-exceeds.spec.ts +129 -0
  37. package/__tests__/mat/simplify-mat.spec.ts +85 -0
  38. package/__tests__/reconstruct-from-mat/reconstruct-from-mat.spec.ts +39 -0
  39. package/__tests__/specific-cases/test-svgs/achispado.svg +14 -0
  40. package/__tests__/utils/get-beziers-from-tangents.spec.ts +142 -0
  41. package/browser/index.js +17882 -13800
  42. package/browser/index.min.js +1 -1
  43. package/node/add-n-prong.ts/join-spokes.js +3 -2
  44. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  45. package/node/closest-boundary-point/cull-curve-pieces.d.ts +21 -0
  46. package/node/closest-boundary-point/cull-curve-pieces.js +40 -0
  47. package/node/closest-boundary-point/cull-curve-pieces.js.map +1 -0
  48. package/node/closest-boundary-point/get-close-boundary-points-certified.js +5 -2
  49. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  50. package/node/closest-boundary-point/get-endpoint-info.d.ts +39 -0
  51. package/node/closest-boundary-point/get-endpoint-info.js +78 -0
  52. package/node/closest-boundary-point/get-endpoint-info.js.map +1 -0
  53. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js +5 -19
  54. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js.map +1 -1
  55. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.d.ts +17 -5
  56. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js +37 -50
  57. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js.map +1 -1
  58. package/node/corner/get-corner.d.ts +18 -1
  59. package/node/corner/get-corner.js +8 -1
  60. package/node/corner/get-corner.js.map +1 -1
  61. package/node/corner/get-interface-ccw.js.map +1 -1
  62. package/node/cp-node/cp-node.d.ts +4 -3
  63. package/node/cp-node/fs/enhance-cp-node.d.ts +9 -9
  64. package/node/cp-node/fs/get-all-on-loop-by-loop.js +0 -4
  65. package/node/cp-node/fs/get-all-on-loop-by-loop.js.map +1 -1
  66. package/node/cp-node/fs/get-angle-between-mat-curves.d.ts +1 -1
  67. package/node/cp-node/fs/get-angle-between-mat-curves.js +7 -4
  68. package/node/cp-node/fs/get-angle-between-mat-curves.js.map +1 -1
  69. package/node/cp-node/fs/get-boundary-beziers-between.d.ts +6 -4
  70. package/node/cp-node/fs/get-boundary-beziers-between.js +6 -4
  71. package/node/cp-node/fs/get-boundary-beziers-between.js.map +1 -1
  72. package/node/cp-node/fs/get-branch-beziers.d.ts +2 -1
  73. package/node/cp-node/fs/get-branch-beziers.js +3 -2
  74. package/node/cp-node/fs/get-branch-beziers.js.map +1 -1
  75. package/node/cp-node/fs/get-branch.js +1 -2
  76. package/node/cp-node/fs/get-branch.js.map +1 -1
  77. package/node/cp-node/fs/get-distance-to-next.js +4 -2
  78. package/node/cp-node/fs/get-distance-to-next.js.map +1 -1
  79. package/node/cp-node/fs/get-edge-direction.js +3 -2
  80. package/node/cp-node/fs/get-edge-direction.js.map +1 -1
  81. package/node/cp-node/fs/get-first-exit.d.ts +7 -3
  82. package/node/cp-node/fs/get-first-exit.js +13 -11
  83. package/node/cp-node/fs/get-first-exit.js.map +1 -1
  84. package/node/cp-node/fs/get-implied-boundary-bezier-between.d.ts +10 -2
  85. package/node/cp-node/fs/get-implied-boundary-bezier-between.js +11 -54
  86. package/node/cp-node/fs/get-implied-boundary-bezier-between.js.map +1 -1
  87. package/node/cp-node/fs/get-mat-curve-between.d.ts +5 -3
  88. package/node/cp-node/fs/get-mat-curve-between.js +6 -49
  89. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  90. package/node/cp-node/fs/get-mat-curve-to-next.d.ts +1 -1
  91. package/node/cp-node/fs/get-mat-curves-between.d.ts +8 -0
  92. package/node/cp-node/fs/get-mat-curves-between.js +9 -2
  93. package/node/cp-node/fs/get-mat-curves-between.js.map +1 -1
  94. package/node/cp-node/fs/get-real-prong-count.d.ts +2 -1
  95. package/node/cp-node/fs/get-real-prong-count.js +11 -5
  96. package/node/cp-node/fs/get-real-prong-count.js.map +1 -1
  97. package/node/cp-node/fs/get-salience.d.ts +10 -0
  98. package/node/cp-node/fs/get-salience.js +17 -1
  99. package/node/cp-node/fs/get-salience.js.map +1 -1
  100. package/node/cp-node/fs/is-fully-terminating.d.ts +4 -2
  101. package/node/cp-node/fs/is-fully-terminating.js +6 -17
  102. package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
  103. package/node/cp-node/fs/is-on-same-circle.d.ts +3 -0
  104. package/node/cp-node/fs/is-on-same-circle.js +4 -4
  105. package/node/cp-node/fs/is-on-same-circle.js.map +1 -1
  106. package/node/cp-node/fs/is-on-same-loop.d.ts +1 -1
  107. package/node/cp-node/fs/is-special.d.ts +7 -0
  108. package/node/cp-node/fs/is-special.js +9 -2
  109. package/node/cp-node/fs/is-special.js.map +1 -1
  110. package/node/cp-node/fs/is-vertex.d.ts +1 -1
  111. package/node/cp-node/fs/traverse-edges.d.ts +7 -3
  112. package/node/cp-node/fs/traverse-edges.js +7 -3
  113. package/node/cp-node/fs/traverse-edges.js.map +1 -1
  114. package/node/cp-node/stringification/from-stringifyable.d.ts +2 -2
  115. package/node/cp-node/stringification/from-stringifyable.js +17 -1
  116. package/node/cp-node/stringification/from-stringifyable.js.map +1 -1
  117. package/node/cp-node/stringification/to-stringifyable.d.ts +3 -3
  118. package/node/cp-node/stringification/to-stringifyable.js +3 -3
  119. package/node/debug/debug.d.ts +26 -3
  120. package/node/debug/debug.js +16 -5
  121. package/node/debug/debug.js.map +1 -1
  122. package/node/find-2-prong/add-2-prong.js +7 -9
  123. package/node/find-2-prong/add-2-prong.js.map +1 -1
  124. package/node/find-2-prong/calc-seperation-tolerance.d.ts +28 -5
  125. package/node/find-2-prong/calc-seperation-tolerance.js +32 -89
  126. package/node/find-2-prong/calc-seperation-tolerance.js.map +1 -1
  127. package/node/find-2-prong/find-2-prong.js +8 -10
  128. package/node/find-2-prong/find-2-prong.js.map +1 -1
  129. package/node/find-2-prong/find-and-add-2-prongs.js +2 -2
  130. package/node/find-2-prong/find-and-add-2-prongs.js.map +1 -1
  131. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +1 -2
  132. package/node/find-2-prong/get-medial/get-antipodal-points.js +2 -3
  133. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -1
  134. package/node/find-2-prong/get-medial/get-closest-points.d.ts +1 -8
  135. package/node/find-2-prong/get-medial/get-closest-points.js +4 -40
  136. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -1
  137. package/node/find-2-prong/reduce-radius.d.ts +1 -1
  138. package/node/find-2-prong/reduce-radius.js +6 -3
  139. package/node/find-2-prong/reduce-radius.js.map +1 -1
  140. package/node/find-3-prong/calc-better-x.js +1 -1
  141. package/node/find-3-prong/calc-better-x.js.map +1 -1
  142. package/node/find-3-prong/find-3-prong-for-delta3s.d.ts +3 -2
  143. package/node/find-3-prong/find-3-prong-for-delta3s.js +36 -42
  144. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -1
  145. package/node/find-3-prong/find-3-prong.js +3 -1
  146. package/node/find-3-prong/find-3-prong.js.map +1 -1
  147. package/node/find-3-prong/find-and-add-3-prongs.js +16 -0
  148. package/node/find-3-prong/find-and-add-3-prongs.js.map +1 -1
  149. package/node/find-mat/create-initial-cp-tree.js +2 -2
  150. package/node/find-mat/create-initial-cp-tree.js.map +1 -1
  151. package/node/find-mat/find-mat.js +3 -4
  152. package/node/find-mat/find-mat.js.map +1 -1
  153. package/node/find-mat/find-mats.d.ts +6 -12
  154. package/node/find-mat/find-mats.js +10 -27
  155. package/node/find-mat/find-mats.js.map +1 -1
  156. package/node/find-mat/get-dull-corners-on-loop.js +2 -2
  157. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  158. package/node/find-mat/get-for-1-prongs-on-loop.js +36 -8
  159. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  160. package/node/find-mat/get-meta.d.ts +14 -4
  161. package/node/find-mat/get-meta.js +30 -24
  162. package/node/find-mat/get-meta.js.map +1 -1
  163. package/node/find-mat/get-sharp-corners.js +2 -2
  164. package/node/find-mat/get-sharp-corners.js.map +1 -1
  165. package/node/find-mat/mat-options.d.ts +2 -2
  166. package/node/floyd-warshall/get-graph.d.ts +12 -1
  167. package/node/floyd-warshall/get-graph.js +41 -38
  168. package/node/floyd-warshall/get-graph.js.map +1 -1
  169. package/node/geometry/get-bounding-box-.d.ts +16 -2
  170. package/node/geometry/get-bounding-box-.js +5 -2
  171. package/node/geometry/get-bounding-box-.js.map +1 -1
  172. package/node/geometry/get-closest-square-distance-to-rect.d.ts +3 -0
  173. package/node/geometry/get-closest-square-distance-to-rect.js +7 -5
  174. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  175. package/node/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +4 -0
  176. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js +12 -5
  177. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  178. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js +1 -2
  179. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js.map +1 -1
  180. package/node/index.d.ts +3 -2
  181. package/node/index.js +2 -1
  182. package/node/index.js.map +1 -1
  183. package/node/mat/clone-mat.d.ts +9 -0
  184. package/node/mat/clone-mat.js +17 -0
  185. package/node/mat/clone-mat.js.map +1 -0
  186. package/node/mat/clone-meta.d.ts +12 -0
  187. package/node/mat/clone-meta.js +24 -0
  188. package/node/mat/clone-meta.js.map +1 -0
  189. package/node/mat/get-boundary-piece-beziers.d.ts +5 -0
  190. package/node/mat/get-boundary-piece-beziers.js +7 -93
  191. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  192. package/node/mat/get-closeby-cp-if-exist.js +2 -1
  193. package/node/mat/get-closeby-cp-if-exist.js.map +1 -1
  194. package/node/mat/get-largest-3-prong.d.ts +6 -0
  195. package/node/mat/get-largest-3-prong.js +8 -5
  196. package/node/mat/get-largest-3-prong.js.map +1 -1
  197. package/node/mat/get-largest-vertex.d.ts +15 -1
  198. package/node/mat/get-largest-vertex.js +20 -7
  199. package/node/mat/get-largest-vertex.js.map +1 -1
  200. package/node/mat/hausdorff-distance-one-sided-exceeds.d.ts +79 -0
  201. package/node/mat/hausdorff-distance-one-sided-exceeds.js +251 -0
  202. package/node/mat/hausdorff-distance-one-sided-exceeds.js.map +1 -0
  203. package/node/mat/mat-meta.d.ts +0 -6
  204. package/node/mat/simplify-mat.d.ts +25 -8
  205. package/node/mat/simplify-mat.js +182 -53
  206. package/node/mat/simplify-mat.js.map +1 -1
  207. package/node/mat/trim-mat.d.ts +4 -2
  208. package/node/mat/trim-mat.js +3 -1
  209. package/node/mat/trim-mat.js.map +1 -1
  210. package/node/point-on-shape/get-boundary-tangent-line.d.ts +19 -0
  211. package/node/point-on-shape/get-boundary-tangent-line.js +33 -0
  212. package/node/point-on-shape/get-boundary-tangent-line.js.map +1 -0
  213. package/node/point-on-shape/get-osculating-circle.d.ts +6 -4
  214. package/node/point-on-shape/get-osculating-circle.js +6 -4
  215. package/node/point-on-shape/get-osculating-circle.js.map +1 -1
  216. package/node/point-on-shape/get-pos-corner.js +2 -2
  217. package/node/point-on-shape/get-pos-corner.js.map +1 -1
  218. package/node/point-on-shape/point-on-shape.d.ts +5 -0
  219. package/node/reconstruct-from-mat/reconstruct-from-mat.js +20 -80
  220. package/node/reconstruct-from-mat/reconstruct-from-mat.js.map +1 -1
  221. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.d.ts +4 -0
  222. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js +4 -0
  223. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js.map +1 -1
  224. package/node/sat/cull.d.ts +7 -6
  225. package/node/sat/cull.js +13 -16
  226. package/node/sat/cull.js.map +1 -1
  227. package/node/sat/get-sat-culls.d.ts +12 -2
  228. package/node/sat/get-sat-culls.js +21 -16
  229. package/node/sat/get-sat-culls.js.map +1 -1
  230. package/node/svg/get-shape-bounds.d.ts +1 -12
  231. package/node/svg/get-shape-bounds.js +2 -3
  232. package/node/svg/get-shape-bounds.js.map +1 -1
  233. package/node/sweep-line/sweep-line.js.map +1 -1
  234. package/node/utils/get-beziers-from-tangents.d.ts +28 -0
  235. package/node/utils/get-beziers-from-tangents.js +92 -0
  236. package/node/utils/get-beziers-from-tangents.js.map +1 -0
  237. package/node/vertex/remove-vertex.d.ts +5 -3
  238. package/node/vertex/remove-vertex.js +5 -3
  239. package/node/vertex/remove-vertex.js.map +1 -1
  240. package/package.json +16 -16
  241. package/qv-infinite-loop.md +120 -0
  242. package/src/add-n-prong.ts/join-spokes.ts +4 -2
  243. package/src/closest-boundary-point/cull-curve-pieces.ts +49 -0
  244. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +5 -2
  245. package/src/closest-boundary-point/get-endpoint-info.ts +96 -0
  246. package/src/closest-boundary-point/get-potential-closest-points-on-curve-certified.ts +5 -23
  247. package/src/closest-boundary-point/root-interval-to-distance-squared-interval.ts +42 -60
  248. package/src/corner/get-corner.ts +10 -1
  249. package/src/corner/get-interface-ccw.ts +2 -2
  250. package/src/cp-node/cp-node.ts +4 -3
  251. package/src/cp-node/fs/get-all-on-loop-by-loop.ts +0 -4
  252. package/src/cp-node/fs/get-angle-between-mat-curves.ts +9 -5
  253. package/src/cp-node/fs/get-boundary-beziers-between.ts +10 -8
  254. package/src/cp-node/fs/get-branch-beziers.ts +3 -2
  255. package/src/cp-node/fs/get-branch.ts +1 -2
  256. package/src/cp-node/fs/get-distance-to-next.ts +4 -2
  257. package/src/cp-node/fs/get-edge-direction.ts +4 -2
  258. package/src/cp-node/fs/get-first-exit.ts +15 -14
  259. package/src/cp-node/fs/get-implied-boundary-bezier-between.ts +18 -70
  260. package/src/cp-node/fs/get-mat-curve-between.ts +10 -67
  261. package/src/cp-node/fs/get-mat-curves-between.ts +9 -2
  262. package/src/cp-node/fs/get-real-prong-count.ts +11 -7
  263. package/src/cp-node/fs/get-salience.ts +15 -2
  264. package/src/cp-node/fs/is-fully-terminating.ts +6 -22
  265. package/src/cp-node/fs/is-on-same-circle.ts +6 -7
  266. package/src/cp-node/fs/is-on-same-loop.ts +2 -2
  267. package/src/cp-node/fs/is-special.ts +11 -6
  268. package/src/cp-node/fs/is-vertex.ts +1 -1
  269. package/src/cp-node/fs/traverse-edges.ts +8 -4
  270. package/src/cp-node/stringification/from-stringifyable.ts +75 -58
  271. package/src/cp-node/stringification/to-stringifyable.ts +3 -3
  272. package/src/debug/debug.ts +44 -8
  273. package/src/find-2-prong/add-2-prong.ts +9 -11
  274. package/src/find-2-prong/calc-seperation-tolerance.ts +34 -115
  275. package/src/find-2-prong/find-2-prong.ts +9 -11
  276. package/src/find-2-prong/find-and-add-2-prongs.ts +2 -2
  277. package/src/find-2-prong/get-medial/get-antipodal-points.ts +1 -3
  278. package/src/find-2-prong/get-medial/get-closest-points.ts +6 -51
  279. package/src/find-2-prong/reduce-radius.ts +6 -4
  280. package/src/find-3-prong/calc-better-x.ts +2 -2
  281. package/src/find-3-prong/find-3-prong-for-delta3s.ts +197 -214
  282. package/src/find-3-prong/find-3-prong.ts +54 -51
  283. package/src/find-3-prong/find-and-add-3-prongs.ts +20 -1
  284. package/src/find-mat/create-initial-cp-tree.ts +2 -2
  285. package/src/find-mat/find-mat.ts +4 -6
  286. package/src/find-mat/find-mats.ts +83 -105
  287. package/src/find-mat/get-dull-corners-on-loop.ts +2 -2
  288. package/src/find-mat/get-for-1-prongs-on-loop.ts +40 -8
  289. package/src/find-mat/get-meta.ts +34 -39
  290. package/src/find-mat/get-sharp-corners.ts +2 -2
  291. package/src/find-mat/mat-options.ts +2 -2
  292. package/src/floyd-warshall/get-graph.ts +46 -47
  293. package/src/geometry/get-bounding-box-.ts +5 -2
  294. package/src/geometry/get-closest-square-distance-to-rect.ts +7 -7
  295. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +15 -13
  296. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.ts +1 -2
  297. package/src/index.ts +3 -2
  298. package/src/mat/clone-mat.ts +9 -3
  299. package/src/mat/clone-meta.ts +8 -0
  300. package/src/mat/get-boundary-piece-beziers.ts +16 -117
  301. package/src/mat/get-closeby-cp-if-exist.ts +3 -1
  302. package/src/mat/get-largest-3-prong.ts +9 -6
  303. package/src/mat/get-largest-vertex.ts +25 -9
  304. package/src/mat/hausdorff-distance-one-sided-exceeds.ts +314 -0
  305. package/src/mat/mat-meta.ts +0 -9
  306. package/src/mat/simplify-mat.ts +254 -116
  307. package/src/mat/trim-mat.ts +6 -4
  308. package/src/point-on-shape/get-boundary-tangent-line.ts +36 -0
  309. package/src/point-on-shape/get-osculating-circle.ts +7 -5
  310. package/src/point-on-shape/get-pos-corner.ts +2 -2
  311. package/src/point-on-shape/point-on-shape.ts +5 -0
  312. package/src/reconstruct-from-mat/reconstruct-from-mat.ts +22 -111
  313. package/src/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.ts +4 -0
  314. package/src/sat/cull.ts +16 -20
  315. package/src/sat/get-sat-culls.ts +28 -23
  316. package/src/svg/get-shape-bounds.ts +2 -3
  317. package/src/sweep-line/sweep-line.ts +1 -1
  318. package/src/utils/deg-to-rad.ts +4 -2
  319. package/src/utils/get-beziers-from-tangents.ts +110 -0
  320. package/src/utils/map-map.ts +1 -1
  321. package/src/utils/rad-to-deg.ts +4 -1
  322. package/src/vertex/remove-vertex.ts +5 -3
  323. package/webpack.config.cjs +7 -2
  324. package/__tests__/cp-node/fs/get-distance-between.spec.ts +0 -7
  325. package/__tests__/cp-node/fs/get-terminating-on-circle.spec.ts +0 -24
  326. package/__tests__/cp-node/fs/is-single-3-prong.spec.ts +0 -17
  327. package/__tests__/cp-node/fs/iterate-all-on-loop.spec.ts +0 -17
  328. package/__tests__/cp-node/fs/traverse-all-forward.spec.ts +0 -14
  329. package/node/closest-boundary-point/cull-bezier-pieces-1.d.ts +0 -9
  330. package/node/closest-boundary-point/cull-bezier-pieces-1.js +0 -17
  331. package/node/closest-boundary-point/cull-bezier-pieces-1.js.map +0 -1
  332. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +0 -13
  333. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +0 -27
  334. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +0 -1
  335. package/node/closest-boundary-point/cull-by-tight-boundary-box.d.ts +0 -11
  336. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +0 -27
  337. package/node/closest-boundary-point/cull-by-tight-boundary-box.js.map +0 -1
  338. package/node/cp-node/fs/find-first.d.ts +0 -10
  339. package/node/cp-node/fs/find-first.js +0 -19
  340. package/node/cp-node/fs/find-first.js.map +0 -1
  341. package/node/debug/functions/check-ordering.d.ts +0 -4
  342. package/node/debug/functions/check-ordering.js +0 -43
  343. package/node/debug/functions/check-ordering.js.map +0 -1
  344. package/node/find-2-prong/cull-bezier-pieces.d.ts +0 -13
  345. package/node/find-2-prong/cull-bezier-pieces.js +0 -43
  346. package/node/find-2-prong/cull-bezier-pieces.js.map +0 -1
  347. package/node/floyd-warshall/get-hole-closer-pairs.d.ts +0 -8
  348. package/node/floyd-warshall/get-hole-closer-pairs.js +0 -27
  349. package/node/floyd-warshall/get-hole-closer-pairs.js.map +0 -1
  350. package/node/utils/dual-set.d.ts +0 -27
  351. package/node/utils/dual-set.js +0 -55
  352. package/node/utils/dual-set.js.map +0 -1
  353. package/node/utils/tri-map.d.ts +0 -27
  354. package/node/utils/tri-map.js +0 -49
  355. package/node/utils/tri-map.js.map +0 -1
  356. package/src/closest-boundary-point/cull-bezier-pieces-1.ts +0 -36
  357. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +0 -42
  358. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +0 -43
  359. package/src/closest-boundary-point/get-p-from-box.ts +0 -14
  360. package/src/cp-node/fs/add-distance-from.ts +0 -49
  361. package/src/cp-node/fs/get-distance-between.ts +0 -16
  362. package/src/cp-node/fs/get-terminating-on-circle.ts +0 -24
  363. package/src/cp-node/fs/is-single-3-prong.ts +0 -15
  364. package/src/cp-node/fs/iterate-all-on-loop.ts +0 -15
  365. package/src/cp-node/fs/traverse-all-forward.ts +0 -24
  366. package/src/debug/functions/draw/draw-beziers-as-single-path.ts +0 -40
  367. package/src/debug/functions/draw/draw-disk.ts +0 -34
  368. package/src/debug/functions/draw/xmlns.ts +0 -5
  369. package/src/find-2-prong/cull-bezier-pieces.ts +0 -61
  370. package/src/find-2-prong/find-and-add-2-prong.ts +0 -30
  371. package/src/find-2-prong/get-medial/get-closest-points-d.ts +0 -213
  372. package/src/find-2-prong/x-for-debugging.ts +0 -13
  373. package/src/floyd-warshall/get-hole-closer-pairs.ts +0 -35
  374. package/src/mat/get-two-prong-type.ts +0 -13
  375. package/src/point-on-shape/is-pos-dull-corner.ts +0 -18
  376. package/src/point-on-shape/is-pos-quite-dull-corner.ts +0 -18
  377. package/src/point-on-shape/is-pos-quite-sharp-corner.ts +0 -18
  378. package/src/point-on-shape/pos-to-human-string.ts +0 -18
  379. package/src/sweep-line/are-boxes-intersecting.ts +0 -37
@@ -0,0 +1,251 @@
1
+ import { closestPointOnBezier, controlPointLinesLength, evalDeCasteljau, fromTo } from 'flo-bezier3';
2
+ const { max, sqrt } = Math;
3
+ /**
4
+ * Returns the closest point on the piecewise bezier curve given by `curves`
5
+ * to the point `p` (as a `Foot`), i.e. the piece-wise minimum of the
6
+ * (certified) `closestPointOnBezier` of `flo-bezier3`.
7
+ *
8
+ * @param p the point
9
+ * @param curves the pieces of the piecewise bezier curve
10
+ *
11
+ * @internal
12
+ */
13
+ function closestPointOnCurves(p, curves) {
14
+ let best = { d: Infinity, q: p, k: 0, t: 0 };
15
+ for (let k = 0; k < curves.length; k++) {
16
+ const c = closestPointOnBezier(curves[k], p);
17
+ if (c.d < best.d) {
18
+ best = { d: c.d, q: c.p, k, t: c.t };
19
+ }
20
+ }
21
+ return best;
22
+ }
23
+ /**
24
+ * Returns the distance from the point `p` to the piecewise bezier curve given
25
+ * by `curves` (i.e. the minimum over the pieces of the distance to the piece).
26
+ *
27
+ * @param p the point
28
+ * @param curves the pieces of the piecewise bezier curve
29
+ *
30
+ * @internal
31
+ */
32
+ function distanceToCurves(p, curves) {
33
+ return closestPointOnCurves(p, curves).d;
34
+ }
35
+ /**
36
+ * Evaluates the bezier curve `ps` (of order 1, 2 or 3) and its first two
37
+ * derivatives at `t`, returned as `[B, B', B'']`.
38
+ *
39
+ * @internal
40
+ */
41
+ function evalWithDerivatives(ps, t) {
42
+ const [p0, p1] = ps;
43
+ if (ps.length === 2) {
44
+ return [
45
+ [p0[0] + t * (p1[0] - p0[0]), p0[1] + t * (p1[1] - p0[1])],
46
+ [p1[0] - p0[0], p1[1] - p0[1]],
47
+ [0, 0]
48
+ ];
49
+ }
50
+ const s = 1 - t;
51
+ if (ps.length === 3) {
52
+ const p2 = ps[2];
53
+ return [
54
+ [s * s * p0[0] + 2 * s * t * p1[0] + t * t * p2[0],
55
+ s * s * p0[1] + 2 * s * t * p1[1] + t * t * p2[1]],
56
+ [2 * (s * (p1[0] - p0[0]) + t * (p2[0] - p1[0])),
57
+ 2 * (s * (p1[1] - p0[1]) + t * (p2[1] - p1[1]))],
58
+ [2 * (p2[0] - 2 * p1[0] + p0[0]),
59
+ 2 * (p2[1] - 2 * p1[1] + p0[1])]
60
+ ];
61
+ }
62
+ const p2 = ps[2];
63
+ const p3 = ps[3];
64
+ return [
65
+ [s * s * s * p0[0] + 3 * s * s * t * p1[0] + 3 * s * t * t * p2[0] + t * t * t * p3[0],
66
+ s * s * s * p0[1] + 3 * s * s * t * p1[1] + 3 * s * t * t * p2[1] + t * t * t * p3[1]],
67
+ [3 * (s * s * (p1[0] - p0[0]) + 2 * s * t * (p2[0] - p1[0]) + t * t * (p3[0] - p2[0])),
68
+ 3 * (s * s * (p1[1] - p0[1]) + 2 * s * t * (p2[1] - p1[1]) + t * t * (p3[1] - p2[1]))],
69
+ [6 * (s * (p2[0] - 2 * p1[0] + p0[0]) + t * (p3[0] - 2 * p2[0] + p1[0])),
70
+ 6 * (s * (p2[1] - 2 * p1[1] + p0[1]) + t * (p3[1] - 2 * p2[1] + p1[1]))]
71
+ ];
72
+ }
73
+ /**
74
+ * Returns a point on piece `k` of `curves` close to `p` found by a few Newton
75
+ * iterations on the squared distance starting from parameter `t0`, as a
76
+ * `Foot`.
77
+ *
78
+ * * the returned distance is thus an *upper bound* on the distance from `p`
79
+ * to the piecewise curve (any point on the curve gives one) - it is not
80
+ * certified to be the minimum
81
+ *
82
+ * @internal
83
+ */
84
+ function newtonFoot(p, curves, k, t0) {
85
+ const ps = curves[k];
86
+ if (ps.length === 1) {
87
+ const q = ps[0];
88
+ return { d: sqrt((q[0] - p[0]) ** 2 + (q[1] - p[1]) ** 2), q, k, t: 0 };
89
+ }
90
+ let t = t0;
91
+ let [q, dq, ddq] = evalWithDerivatives(ps, t);
92
+ let rx = q[0] - p[0];
93
+ let ry = q[1] - p[1];
94
+ let best = { d: sqrt(rx * rx + ry * ry), q, k, t };
95
+ for (let i = 0; i < 4; i++) {
96
+ // minimize g(t) = |B(t) - p|²/2: g' = r·B', g'' = B'·B' + r·B''
97
+ const g1 = rx * dq[0] + ry * dq[1];
98
+ const g2 = dq[0] * dq[0] + dq[1] * dq[1] + rx * ddq[0] + ry * ddq[1];
99
+ if (g2 <= 0) {
100
+ break;
101
+ }
102
+ let t_ = t - g1 / g2;
103
+ if (t_ < 0) {
104
+ t_ = 0;
105
+ }
106
+ else if (t_ > 1) {
107
+ t_ = 1;
108
+ }
109
+ if (t_ === t) {
110
+ break;
111
+ }
112
+ t = t_;
113
+ [q, dq, ddq] = evalWithDerivatives(ps, t);
114
+ rx = q[0] - p[0];
115
+ ry = q[1] - p[1];
116
+ const d = sqrt(rx * rx + ry * ry);
117
+ if (d < best.d) {
118
+ best = { d, q, k, t };
119
+ }
120
+ }
121
+ return best;
122
+ }
123
+ /**
124
+ * Returns the maximum distance from the point `q` to the control points of
125
+ * `ps` - an upper bound on the distance from `q` to any point on the bezier
126
+ * curve `ps` (which lies within the convex hull of its control points).
127
+ *
128
+ * @internal
129
+ */
130
+ function maxDistanceToControlPoints(ps, q) {
131
+ let m = 0;
132
+ for (let i = 0; i < ps.length; i++) {
133
+ const c = ps[i];
134
+ const dd = (c[0] - q[0]) ** 2 + (c[1] - q[1]) ** 2;
135
+ if (dd > m) {
136
+ m = dd;
137
+ }
138
+ }
139
+ return sqrt(m);
140
+ }
141
+ /**
142
+ * Returns `true` if the one-sided Hausdorff distance from the bezier curve `A`
143
+ * to the piecewise bezier curve `B` exceeds `tolerance` and `false` otherwise.
144
+ *
145
+ * * this is a *decision procedure* and is thus much cheaper than computing the
146
+ * distance (e.g. via `hausdorffDistanceOneSided` from `flo-bezier3`) and then
147
+ * comparing it: it stops as soon as either a point on `A` further than
148
+ * `tolerance` from `B` is found (a certified *lower* bound exceeding the
149
+ * tolerance) or every piece of `A` is certified to be within `tolerance`
150
+ * (a certified *upper* bound)
151
+ * * `A` is bisected into parameter intervals; the upper bound on an interval
152
+ * `[tS,tE]` is the smaller of
153
+ * * `(hS + hE + L)/2` where `hS`, `hE` are (upper bounds on) the
154
+ * distances from its endpoints to `B` and `L` is the control polygon
155
+ * length of `A` restricted to the interval (an upper bound on its arc
156
+ * length): any point on the interval is within `L` of both endpoints so
157
+ * its distance to `B` is at most `min(hS + l, hE + (L - l))` with `l`
158
+ * the arc length from the start, maximized at `(hS + hE + L)/2`
159
+ * * the maximum distance from the foot (on `B`) of either endpoint to the
160
+ * control points of `A` restricted to the interval (the sub-curve lies
161
+ * within the convex hull of its control points, within which the
162
+ * distance to a fixed point is maximized at a vertex)
163
+ * * the distances from sample points on `A` to `B` are found cheaply by
164
+ * Newton iteration from the feet of the neighboring samples - these are upper
165
+ * bounds (any point on `B` gives one) which suffice for certifying the
166
+ * acceptance of an interval; only when such a bound exceeds the tolerance is
167
+ * the certified (and expensive) closest point computed to decide whether the
168
+ * tolerance is really exceeded
169
+ * * `B` need not be smooth, nor need its pieces be connected
170
+ * * the result is approximate only to the extent that the floating point
171
+ * evaluations are, i.e. a decision is only taken once it is certain up to
172
+ * roundoff
173
+ *
174
+ * @param A the 'from' bezier curve given by its control points
175
+ * @param B the 'to' piecewise bezier curve given as an array of bezier curves
176
+ * @param tolerance the distance to compare against
177
+ * @param maxIterations the maximum number of interval bisections (each
178
+ * costing one cheap closest point calculation) before giving up, in which
179
+ * case `true` is returned (the conservative answer for simplification
180
+ * purposes); defaults to `1000` (curves only just within tolerance may
181
+ * need many bisections, especially where they run nearly parallel to `B`)
182
+ *
183
+ * @internal
184
+ */
185
+ function hausdorffDistanceOneSidedExceeds(A, B, tolerance, maxIterations = 1000) {
186
+ const fS = closestPointOnCurves(A[0], B);
187
+ if (fS.d > tolerance) {
188
+ return true;
189
+ }
190
+ const fE = closestPointOnCurves(A[A.length - 1], B);
191
+ if (fE.d > tolerance) {
192
+ return true;
193
+ }
194
+ if (A.length <= 2) {
195
+ // A point or a line: if `B` is a single line (a convex set) the
196
+ // distance is convex along `A` and thus maximal at an endpoint.
197
+ if (A.length === 1 || (B.length === 1 && B[0].length <= 2)) {
198
+ return false;
199
+ }
200
+ }
201
+ // Depth first; the stack never holds more than about `2*log2(iterations)`
202
+ // intervals.
203
+ const stack = [{ tS: 0, tE: 1, fS, fE }];
204
+ let iterations = 0;
205
+ while (stack.length > 0) {
206
+ const { tS, tE, fS, fE } = stack.pop();
207
+ const ps = tS === 0 && tE === 1 ? A : fromTo(A, tS, tE);
208
+ // the entire interval is certified within tolerance if either upper
209
+ // bound says so
210
+ if ((fS.d + fE.d + controlPointLinesLength(ps)) / 2 <= tolerance) {
211
+ continue;
212
+ }
213
+ if (maxDistanceToControlPoints(ps, fS.q) <= tolerance ||
214
+ maxDistanceToControlPoints(ps, fE.q) <= tolerance) {
215
+ continue;
216
+ }
217
+ if (iterations++ >= maxIterations) {
218
+ return true; // undecided - be conservative
219
+ }
220
+ const tM = (tS + tE) / 2;
221
+ const pM = evalDeCasteljau(A, tM);
222
+ // a cheap upper bound on the distance from `pM` to `B` - by Newton
223
+ // iteration from the feet of the endpoints
224
+ let fM = newtonFoot(pM, B, fS.k, fS.k === fE.k ? (fS.t + fE.t) / 2 : fS.t);
225
+ if (fS.k !== fE.k) {
226
+ const fM_ = newtonFoot(pM, B, fE.k, fE.t);
227
+ if (fM_.d < fM.d) {
228
+ fM = fM_;
229
+ }
230
+ }
231
+ if (fM.d > tolerance) {
232
+ // possibly exceeds - now get the certified closest point
233
+ fM = closestPointOnCurves(pM, B);
234
+ if (fM.d > tolerance) {
235
+ return true;
236
+ }
237
+ }
238
+ // push the half with the larger lower bound last so it is tried first
239
+ if (max(fS.d, fM.d) >= max(fM.d, fE.d)) {
240
+ stack.push({ tS: tM, tE, fS: fM, fE });
241
+ stack.push({ tS, tE: tM, fS, fE: fM });
242
+ }
243
+ else {
244
+ stack.push({ tS, tE: tM, fS, fE: fM });
245
+ stack.push({ tS: tM, tE, fS: fM, fE });
246
+ }
247
+ }
248
+ return false;
249
+ }
250
+ export { hausdorffDistanceOneSidedExceeds, distanceToCurves, closestPointOnCurves };
251
+ //# sourceMappingURL=hausdorff-distance-one-sided-exceeds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hausdorff-distance-one-sided-exceeds.js","sourceRoot":"","sources":["../../src/mat/hausdorff-distance-one-sided-exceeds.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,10 @@
1
1
  import type { Loop } from 'flo-boolean';
2
2
  import type { CpNode } from '../cp-node/cp-node.js';
3
- import type { Curve } from 'flo-boolean';
4
3
  import { RbTree } from 'flo-ll-rb-tree';
5
4
  interface MatMeta {
6
5
  /** The minimum power of 2 such that `2**maxCoordPowerOf2 >= "the max coordinate"` */
7
6
  readonly maxCoordPowerOf2: number;
8
7
  readonly squaredDiagonalLength: number;
9
- readonly looseBoundingBoxes: number[][][];
10
- readonly tightBoundingBoxes: number[][][];
11
- readonly boundingHulls: number[][][];
12
- readonly sharpCorners: Curve[];
13
- readonly dullCorners: Curve[];
14
8
  readonly loops: Loop[];
15
9
  /**
16
10
  * Primarily for internal use. A tree structure storing the
@@ -3,14 +3,31 @@ import type { Mat } from './mat.js';
3
3
  * Returns a new simplified MAT of the given one by replacing the piecewise
4
4
  * quad beziers composing the MAT with fewer ones to within a given tolerance.
5
5
  *
6
- * @param cpNode a representation of the MAT
7
- * @param anlgeTolerance tolerance given as the degrees difference of the unit
8
- * direction vectors at the interface between curves. A tolerance of zero means
9
- * perfect smoothness is required - defaults to 15
10
- * @param hausdorffTolerance the approximate maximum Hausdorff Distance tolerance -
11
- * defaults to `2**-3`
12
- * @param maxIterations the max iterations of the Hausdorff Distance calculation,
13
- * defaults to `50`
6
+ * * the vertices of the simplified MAT are a subset of those of the given one
7
+ * (so the endpoints of each new curve are endpoints of existing ones) and all
8
+ * 'special' vertices (leaves, 3-prongs and higher, hole-closers) are kept
9
+ * * each branch is simplified Douglas-Peucker style: the single curve from the
10
+ * start to the end of a span of edges is tried and, if some edge deviates from
11
+ * it by more than the tolerance, the span is split at the vertex of worst
12
+ * deviation and both halves are tried in turn; this is `O(n log n)` (in the
13
+ * number of edges `n` of a branch) Hausdorff distance checks as opposed to the
14
+ * `O(n²)` of greedily extending spans one vertex at a time
15
+ * * the deviation of an edge from the single curve is checked first by cheap
16
+ * sampled *lower* bounds (which already find most splits) and only then by
17
+ * the certified `hausdorffDistanceOneSidedExceeds`
18
+ * * the tolerance is a certified upper bound on the one-sided Hausdorff
19
+ * distance from the original MAT curves to the simplified ones (up to
20
+ * floating point roundoff)
21
+ *
22
+ * @param mat the MAT to simplify (it is not modified)
23
+ * @param hausdorffTolerance the maximum one-sided Hausdorff distance (in
24
+ * coordinate units) from the original to the simplified MAT - defaults to
25
+ * `2**-3`
26
+ * @param maxIterations the max bisections of each Hausdorff distance check
27
+ * (see `hausdorffDistanceOneSidedExceeds`) after which the check conservatively
28
+ * fails (so that the span is split rather than accepted) - defaults to `1000`;
29
+ * lower values trade simplification quality for a bound on the time spent on
30
+ * curves that are only just within tolerance
14
31
  */
15
32
  declare function simplifyMat(mat: Mat, hausdorffTolerance?: number, maxIterations?: number): Mat;
16
33
  export { simplifyMat };
@@ -1,84 +1,213 @@
1
- import { hausdorffDistanceOneSided } from 'flo-bezier3';
1
+ import { evalDeCasteljau } from 'flo-bezier3';
2
2
  import { removeVertex } from '../vertex/remove-vertex.js';
3
3
  import { getBranches } from './get-branches.js';
4
4
  import { getMatCurveToNext } from '../cp-node/fs/get-mat-curve-to-next.js';
5
5
  import { getMatCurveBetween } from '../cp-node/fs/get-mat-curve-between.js';
6
6
  import { createNewCpTrees } from './create-new-cp-trees.js';
7
7
  import { clone } from '../cp-node/fs/clone.js';
8
- import { findFirst } from '../cp-node/fs/find-first.js';
9
8
  import { isTerminating } from '../cp-node/fs/is-terminating.js';
10
- import { isVertex } from '../cp-node/fs/is-vertex.js';
9
+ import { isSpecial } from '../cp-node/fs/is-special.js';
11
10
  import { getProngCount } from '../cp-node/fs/get-prong-count.js';
12
- const { max } = Math;
13
- // FUTURE could be made faster by binary "search" on hausdorff curves?
11
+ import { distanceToCurves, hausdorffDistanceOneSidedExceeds } from './hausdorff-distance-one-sided-exceeds.js';
12
+ const { abs } = Math;
13
+ /**
14
+ * Spans of at least this many edges whose worst vertex lies within
15
+ * `END_FRACTION` of either end are additionally split at their middle - this
16
+ * guards against the degenerate case where each split peels off only a few
17
+ * edges at an end (making the recursion depth, and the total work, quadratic
18
+ * in the branch length) at the cost of at most one extra curve per occurrence.
19
+ *
20
+ * @internal
21
+ */
22
+ const MIN_EDGES_FOR_BALANCED_SPLIT = 32;
23
+ /** @internal */
24
+ const END_FRACTION = 1 / 8;
14
25
  /**
15
26
  * Returns a new simplified MAT of the given one by replacing the piecewise
16
27
  * quad beziers composing the MAT with fewer ones to within a given tolerance.
17
28
  *
18
- * @param cpNode a representation of the MAT
19
- * @param anlgeTolerance tolerance given as the degrees difference of the unit
20
- * direction vectors at the interface between curves. A tolerance of zero means
21
- * perfect smoothness is required - defaults to 15
22
- * @param hausdorffTolerance the approximate maximum Hausdorff Distance tolerance -
23
- * defaults to `2**-3`
24
- * @param maxIterations the max iterations of the Hausdorff Distance calculation,
25
- * defaults to `50`
29
+ * * the vertices of the simplified MAT are a subset of those of the given one
30
+ * (so the endpoints of each new curve are endpoints of existing ones) and all
31
+ * 'special' vertices (leaves, 3-prongs and higher, hole-closers) are kept
32
+ * * each branch is simplified Douglas-Peucker style: the single curve from the
33
+ * start to the end of a span of edges is tried and, if some edge deviates from
34
+ * it by more than the tolerance, the span is split at the vertex of worst
35
+ * deviation and both halves are tried in turn; this is `O(n log n)` (in the
36
+ * number of edges `n` of a branch) Hausdorff distance checks as opposed to the
37
+ * `O(n²)` of greedily extending spans one vertex at a time
38
+ * * the deviation of an edge from the single curve is checked first by cheap
39
+ * sampled *lower* bounds (which already find most splits) and only then by
40
+ * the certified `hausdorffDistanceOneSidedExceeds`
41
+ * * the tolerance is a certified upper bound on the one-sided Hausdorff
42
+ * distance from the original MAT curves to the simplified ones (up to
43
+ * floating point roundoff)
44
+ *
45
+ * @param mat the MAT to simplify (it is not modified)
46
+ * @param hausdorffTolerance the maximum one-sided Hausdorff distance (in
47
+ * coordinate units) from the original to the simplified MAT - defaults to
48
+ * `2**-3`
49
+ * @param maxIterations the max bisections of each Hausdorff distance check
50
+ * (see `hausdorffDistanceOneSidedExceeds`) after which the check conservatively
51
+ * fails (so that the span is split rather than accepted) - defaults to `1000`;
52
+ * lower values trade simplification quality for a bound on the time spent on
53
+ * curves that are only just within tolerance
26
54
  */
27
- function simplifyMat(mat, hausdorffTolerance = 2 ** -3, maxIterations = 50) {
55
+ function simplifyMat(mat, hausdorffTolerance = 2 ** -3, maxIterations = 1000) {
28
56
  let cpNode = clone(mat.cpNode);
29
- // Start from a leaf
57
+ // The clone gets its own `cpTrees` (removing vertices below must not
58
+ // touch the trees of the given `mat`) - they are kept up to date by
59
+ // `removeVertex`.
60
+ const meta = { ...mat.meta, cpTrees: createNewCpTrees(cpNode) };
61
+ // Start from a leaf (which is never removed so it can be returned)
30
62
  while (!isTerminating(cpNode)) {
31
63
  cpNode = cpNode.next;
32
64
  }
33
65
  const branches = getBranches(cpNode);
34
- const canDeletes = new Set();
66
+ const toRemove = [];
35
67
  for (let k = 0; k < branches.length; k++) {
36
- const branch = branches[k];
37
- // Try to remove some
38
- let j = 0;
39
- while (j < branch.length) {
40
- const i = j;
41
- while (true) {
42
- j++;
43
- if (j === branch.length) {
44
- break;
45
- }
46
- const hd = getTotalHausdorffDistance(i, j, branch, maxIterations);
47
- if (hd > hausdorffTolerance) {
48
- break;
68
+ simplifyBranch(branches[k], hausdorffTolerance, maxIterations, toRemove);
69
+ }
70
+ for (const cpNode of toRemove) {
71
+ removeVertex(cpNode, meta);
72
+ }
73
+ return { cpNode, meta };
74
+ }
75
+ /**
76
+ * Simplifies the given branch by adding the `CpNode`s of the vertices that
77
+ * can be removed to `toRemove`.
78
+ *
79
+ * * edge `k` of the branch runs from `branch[k]` to `branch[k].next`; vertex
80
+ * `k` (for `0 < k < branch.length`) is the interior vertex `branch[k]` between
81
+ * edges `k-1` and `k`
82
+ * * a span of edges `i..j` is simplified to the single curve from the start
83
+ * of edge `i` to the end of edge `j`, removing the interior vertices `i+1..j`
84
+ *
85
+ * @internal
86
+ */
87
+ function simplifyBranch(branch, tolerance, maxIterations, toRemove) {
88
+ const n = branch.length; // the number of edges
89
+ if (n < 2) {
90
+ return;
91
+ }
92
+ // the MAT curves of the edges of the branch - computed once per branch
93
+ const curves = branch.map(getMatCurveToNext);
94
+ const vertexPoints = branch.map(cpNode => cpNode.pointOnShape.circle.center);
95
+ // The spans still to be processed; interior vertices that cannot be
96
+ // removed must be kept so the branch is pre-split there: the 'special'
97
+ // ones (e.g. hole-closers) and those whose circle carries more than 2
98
+ // `CpNode`s (e.g. a 2-prong having a terminating sharp corner contact,
99
+ // which `getBranch` passes through but `removeVertex` cannot remove).
100
+ const spans = [];
101
+ let a = 0;
102
+ for (let k = 1; k < n; k++) {
103
+ if (isSpecial(branch[k]) || getProngCount(branch[k]) !== 2) {
104
+ spans.push([a, k - 1]);
105
+ a = k;
106
+ }
107
+ }
108
+ spans.push([a, n - 1]);
109
+ while (spans.length > 0) {
110
+ const [i, j] = spans.pop();
111
+ if (j <= i) {
112
+ continue;
113
+ } // a single edge - nothing to remove
114
+ const longCurves = getMatCurveBetween(branch[i], branch[j].next);
115
+ //------------------------------------------------------------------
116
+ // 1. Cheap pass: sampled lower bounds on the deviation of each edge -
117
+ // the interior vertices and the piece midpoints.
118
+ //------------------------------------------------------------------
119
+ let worstD = 0;
120
+ let worstV = -1;
121
+ for (let k = i; k <= j; k++) {
122
+ if (k > i) {
123
+ const d = distanceToCurves(vertexPoints[k], longCurves);
124
+ if (d > worstD) {
125
+ worstD = d;
126
+ worstV = k;
49
127
  }
50
- else {
51
- canDeletes.add(branch[j]);
128
+ }
129
+ const pieces = curves[k];
130
+ for (let m = 0; m < pieces.length; m++) {
131
+ const d = distanceToCurves(evalDeCasteljau(pieces[m], 0.5), longCurves);
132
+ if (d > worstD) {
133
+ worstD = d;
134
+ worstV = getSplitVertexForEdge(i, j, k, m, pieces.length);
52
135
  }
53
136
  }
54
- if (i + 1 === j) {
55
- continue; // no simplification occured
137
+ }
138
+ if (worstD > tolerance) {
139
+ split(spans, i, j, worstV);
140
+ continue;
141
+ }
142
+ //------------------------------------------------------------------
143
+ // 2. Certified pass - split at the first edge found to exceed the
144
+ // tolerance.
145
+ //------------------------------------------------------------------
146
+ let splitV = -1;
147
+ outer: for (let k = i; k <= j; k++) {
148
+ const pieces = curves[k];
149
+ for (let m = 0; m < pieces.length; m++) {
150
+ if (hausdorffDistanceOneSidedExceeds(pieces[m], longCurves, tolerance, maxIterations)) {
151
+ splitV = getSplitVertexForEdge(i, j, k, m, pieces.length);
152
+ break outer;
153
+ }
56
154
  }
57
155
  }
58
- }
59
- // cpNode = findFirst(cpNode_ => isTerminating(cpNode_) ? cpNode_ : undefined, cpNode)!;
60
- cpNode = findFirst(isTerminating, cpNode);
61
- for (const cpNode of canDeletes) {
62
- if (!isVertex(cpNode => (getProngCount(cpNode) !== 2) &&
63
- !cpNode.isHoleClosing)(cpNode)) {
64
- removeVertex(cpNode, mat.meta);
156
+ if (splitV !== -1) {
157
+ split(spans, i, j, splitV);
158
+ continue;
65
159
  }
66
- }
67
- return {
68
- cpNode,
69
- meta: {
70
- ...mat.meta,
71
- cpTrees: createNewCpTrees(cpNode)
160
+ //------------------------------------------------------------------
161
+ // 3. Accept the span.
162
+ //------------------------------------------------------------------
163
+ for (let k = i + 1; k <= j; k++) {
164
+ toRemove.push(branch[k]);
72
165
  }
73
- };
166
+ }
167
+ }
168
+ /**
169
+ * Returns the vertex (in `(i,j]`) at which to split the span of edges `i..j`
170
+ * given that piece `m` (of `numPieces`) of edge `k` deviates too much: one of
171
+ * the edge's two endpoint vertices - the one on the side of the piece if the
172
+ * edge has 2 pieces, else the one nearer the middle of the span (for a more
173
+ * balanced recursion).
174
+ *
175
+ * @internal
176
+ */
177
+ function getSplitVertexForEdge(i, j, k, m, numPieces) {
178
+ const canUseStart = k > i;
179
+ const canUseEnd = k + 1 <= j;
180
+ if (!canUseStart) {
181
+ return k + 1;
182
+ }
183
+ if (!canUseEnd) {
184
+ return k;
185
+ }
186
+ if (numPieces === 2) {
187
+ return m === 0 ? k : k + 1;
188
+ }
189
+ const mid = (i + 1 + j) / 2; // middle of the interior vertices `i+1..j`
190
+ return abs(k - mid) <= abs(k + 1 - mid) ? k : k + 1;
74
191
  }
75
- function getTotalHausdorffDistance(i, j, branch, hausdorffSpacing) {
76
- const hds = [];
77
- const longCurve = getMatCurveBetween(branch[i], branch[j].next);
78
- for (; i < j + 1; i++) {
79
- hds.push(hausdorffDistanceOneSided(getMatCurveToNext(branch[i]), longCurve, hausdorffSpacing));
192
+ /**
193
+ * Splits the span of edges `i..j` at the vertex `v` (in `(i,j]`) and pushes
194
+ * the resulting spans (for very long spans with `v` near an end also split at
195
+ * the middle - see `MIN_EDGES_FOR_BALANCED_SPLIT`).
196
+ *
197
+ * @internal
198
+ */
199
+ function split(spans, i, j, v) {
200
+ const numEdges = j - i + 1;
201
+ if (numEdges >= MIN_EDGES_FOR_BALANCED_SPLIT) {
202
+ const margin = numEdges * END_FRACTION;
203
+ if (v - i < margin || j + 1 - v < margin) {
204
+ const vMid = (i + j + 1) >>> 1; // an interior vertex near the middle
205
+ const [v1, v2] = v < vMid ? [v, vMid] : [vMid, v];
206
+ spans.push([v2, j], [v1, v2 - 1], [i, v1 - 1]);
207
+ return;
208
+ }
80
209
  }
81
- return max(...hds);
210
+ spans.push([v, j], [i, v - 1]);
82
211
  }
83
212
  export { simplifyMat };
84
213
  //# sourceMappingURL=simplify-mat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"simplify-mat.js","sourceRoot":"","sources":["../../src/mat/simplify-mat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simplify-mat.js","sourceRoot":"","sources":["../../src/mat/simplify-mat.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@ import type { Mat } from './mat.js';
3
3
  * Trims the given Medial Axis Transform so that only cycles remain. Similar to
4
4
  * toScaleAxis(mat, Infinity).
5
5
  *
6
- * @param mat The MAT to trim.
6
+ * * returns `undefined` if the MAT has no cycles (i.e. the shape has no holes)
7
+ *
8
+ * @param mat The MAT to trim (it is not modified).
7
9
  */
8
- declare function trimMat(mat: Mat): Mat;
10
+ declare function trimMat(mat: Mat): Mat | undefined;
9
11
  export { trimMat };
@@ -5,7 +5,9 @@ import { clone } from '../cp-node/fs/clone.js';
5
5
  * Trims the given Medial Axis Transform so that only cycles remain. Similar to
6
6
  * toScaleAxis(mat, Infinity).
7
7
  *
8
- * @param mat The MAT to trim.
8
+ * * returns `undefined` if the MAT has no cycles (i.e. the shape has no holes)
9
+ *
10
+ * @param mat The MAT to trim (it is not modified).
9
11
  */
10
12
  function trimMat(mat) {
11
13
  // FUTURE - clone entire `Mat` instead (the function already exists)