flo-mat 4.1.5 → 5.0.2

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 (356) 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/fs/get-all-on-loop-by-loop.spec.ts +55 -0
  4. package/__tests__/cp-node/fs/get-angle-between-mat-curves.spec.ts +39 -3
  5. package/__tests__/cp-node/fs/get-boundary-bezier-parts-to-next.spec.ts +87 -3
  6. package/__tests__/cp-node/fs/get-boundary-beziers-between.spec.ts +68 -3
  7. package/__tests__/cp-node/fs/get-boundary-beziers-to-next.spec.ts +41 -3
  8. package/__tests__/cp-node/fs/get-boundary-distance-to-next.spec.ts +20 -3
  9. package/__tests__/cp-node/fs/get-branch-beziers.spec.ts +42 -3
  10. package/__tests__/cp-node/fs/get-branch.spec.ts +60 -3
  11. package/__tests__/cp-node/fs/get-cp-node-ordering.spec.ts +19 -3
  12. package/__tests__/cp-node/fs/get-distance-to-next.spec.ts +37 -4
  13. package/__tests__/cp-node/fs/get-edge-direction.spec.ts +50 -3
  14. package/__tests__/cp-node/fs/get-first-exit.spec.ts +78 -3
  15. package/__tests__/cp-node/fs/get-hole-closers.spec.ts +32 -3
  16. package/__tests__/cp-node/fs/get-implied-boundary-bezier-between.spec.ts +48 -3
  17. package/__tests__/cp-node/fs/get-mat-curve-between.spec.ts +77 -3
  18. package/__tests__/cp-node/fs/get-mat-curve-to-next.spec.ts +17 -4
  19. package/__tests__/cp-node/fs/get-mat-curves-between.spec.ts +38 -3
  20. package/__tests__/cp-node/fs/get-salience.spec.ts +68 -3
  21. package/__tests__/cp-node/fs/get-vertex-forward-children.spec.ts +40 -3
  22. package/__tests__/cp-node/fs/insert-cp-node.spec.ts +87 -3
  23. package/__tests__/cp-node/fs/is-special.spec.ts +1 -1
  24. package/__tests__/cp-node/fs/remove-cp-node.spec.ts +42 -3
  25. package/__tests__/find-2-prong/calc-seperation-tolerance.spec.ts +46 -0
  26. package/__tests__/find-2-prong/get-medial/get-closest-points.spec.ts +1 -1
  27. package/__tests__/floyd-warshall/get-graph.spec.ts +100 -0
  28. package/__tests__/get-mats-with-hole.ts +28 -0
  29. package/__tests__/get-mats1.spec.ts +61 -0
  30. package/__tests__/get-mats1.ts +75 -67
  31. package/__tests__/helpers/cp-node-by-id.ts +27 -0
  32. package/__tests__/helpers/expect-point-close.ts +42 -0
  33. package/__tests__/mat/hausdorff-distance-one-sided-exceeds.spec.ts +129 -0
  34. package/__tests__/mat/simplify-mat.spec.ts +85 -0
  35. package/__tests__/reconstruct-from-mat/reconstruct-from-mat.spec.ts +39 -0
  36. package/__tests__/specific-cases/test-svgs/achispado.svg +14 -0
  37. package/__tests__/utils/get-beziers-from-tangents.spec.ts +142 -0
  38. package/browser/index.js +12985 -9965
  39. package/browser/index.min.js +1 -1
  40. package/node/closest-boundary-point/cull-curve-pieces.d.ts +21 -0
  41. package/node/closest-boundary-point/cull-curve-pieces.js +40 -0
  42. package/node/closest-boundary-point/cull-curve-pieces.js.map +1 -0
  43. package/node/closest-boundary-point/get-close-boundary-points-certified.js +5 -2
  44. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  45. package/node/closest-boundary-point/get-endpoint-info.d.ts +39 -0
  46. package/node/closest-boundary-point/get-endpoint-info.js +78 -0
  47. package/node/closest-boundary-point/get-endpoint-info.js.map +1 -0
  48. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js +5 -19
  49. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js.map +1 -1
  50. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.d.ts +17 -5
  51. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js +37 -50
  52. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js.map +1 -1
  53. package/node/corner/get-corner.d.ts +18 -1
  54. package/node/corner/get-corner.js +8 -1
  55. package/node/corner/get-corner.js.map +1 -1
  56. package/node/corner/get-interface-ccw.js.map +1 -1
  57. package/node/cp-node/cp-node.d.ts +4 -3
  58. package/node/cp-node/fs/get-all-on-loop-by-loop.js +0 -4
  59. package/node/cp-node/fs/get-all-on-loop-by-loop.js.map +1 -1
  60. package/node/cp-node/fs/get-angle-between-mat-curves.js +6 -4
  61. package/node/cp-node/fs/get-angle-between-mat-curves.js.map +1 -1
  62. package/node/cp-node/fs/get-boundary-beziers-between.d.ts +6 -4
  63. package/node/cp-node/fs/get-boundary-beziers-between.js +6 -4
  64. package/node/cp-node/fs/get-boundary-beziers-between.js.map +1 -1
  65. package/node/cp-node/fs/get-branch-beziers.d.ts +2 -1
  66. package/node/cp-node/fs/get-branch-beziers.js +3 -2
  67. package/node/cp-node/fs/get-branch-beziers.js.map +1 -1
  68. package/node/cp-node/fs/get-branch.js +1 -2
  69. package/node/cp-node/fs/get-branch.js.map +1 -1
  70. package/node/cp-node/fs/get-distance-to-next.js +4 -2
  71. package/node/cp-node/fs/get-distance-to-next.js.map +1 -1
  72. package/node/cp-node/fs/get-first-exit.d.ts +7 -3
  73. package/node/cp-node/fs/get-first-exit.js +13 -11
  74. package/node/cp-node/fs/get-first-exit.js.map +1 -1
  75. package/node/cp-node/fs/get-implied-boundary-bezier-between.d.ts +9 -1
  76. package/node/cp-node/fs/get-implied-boundary-bezier-between.js +11 -55
  77. package/node/cp-node/fs/get-implied-boundary-bezier-between.js.map +1 -1
  78. package/node/cp-node/fs/get-mat-curve-between.d.ts +4 -3
  79. package/node/cp-node/fs/get-mat-curve-between.js +5 -49
  80. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  81. package/node/cp-node/fs/get-mat-curve-to-next.d.ts +1 -1
  82. package/node/cp-node/fs/get-mat-curves-between.d.ts +8 -0
  83. package/node/cp-node/fs/get-mat-curves-between.js +9 -2
  84. package/node/cp-node/fs/get-mat-curves-between.js.map +1 -1
  85. package/node/cp-node/fs/get-real-prong-count.d.ts +2 -1
  86. package/node/cp-node/fs/get-real-prong-count.js +11 -5
  87. package/node/cp-node/fs/get-real-prong-count.js.map +1 -1
  88. package/node/cp-node/fs/get-salience.d.ts +10 -0
  89. package/node/cp-node/fs/get-salience.js +17 -1
  90. package/node/cp-node/fs/get-salience.js.map +1 -1
  91. package/node/cp-node/fs/is-fully-terminating.d.ts +4 -2
  92. package/node/cp-node/fs/is-fully-terminating.js +6 -15
  93. package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
  94. package/node/cp-node/fs/is-on-same-loop.d.ts +1 -1
  95. package/node/cp-node/fs/is-special.d.ts +7 -0
  96. package/node/cp-node/fs/is-special.js +9 -2
  97. package/node/cp-node/fs/is-special.js.map +1 -1
  98. package/node/cp-node/fs/is-vertex.d.ts +1 -1
  99. package/node/cp-node/fs/traverse-edges.d.ts +7 -3
  100. package/node/cp-node/fs/traverse-edges.js +7 -3
  101. package/node/cp-node/fs/traverse-edges.js.map +1 -1
  102. package/node/cp-node/stringification/from-stringifyable.d.ts +2 -2
  103. package/node/cp-node/stringification/from-stringifyable.js +1 -1
  104. package/node/cp-node/stringification/from-stringifyable.js.map +1 -1
  105. package/node/cp-node/stringification/to-stringifyable.d.ts +3 -3
  106. package/node/cp-node/stringification/to-stringifyable.js +3 -3
  107. package/node/debug/debug.d.ts +26 -3
  108. package/node/debug/debug.js +16 -5
  109. package/node/debug/debug.js.map +1 -1
  110. package/node/find-2-prong/add-2-prong.js +1 -7
  111. package/node/find-2-prong/add-2-prong.js.map +1 -1
  112. package/node/find-2-prong/calc-seperation-tolerance.d.ts +28 -5
  113. package/node/find-2-prong/calc-seperation-tolerance.js +32 -89
  114. package/node/find-2-prong/calc-seperation-tolerance.js.map +1 -1
  115. package/node/find-2-prong/find-2-prong.js +8 -10
  116. package/node/find-2-prong/find-2-prong.js.map +1 -1
  117. package/node/find-2-prong/find-and-add-2-prongs.js +2 -2
  118. package/node/find-2-prong/find-and-add-2-prongs.js.map +1 -1
  119. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +1 -2
  120. package/node/find-2-prong/get-medial/get-antipodal-points.js +2 -3
  121. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -1
  122. package/node/find-2-prong/get-medial/get-closest-points.d.ts +1 -8
  123. package/node/find-2-prong/get-medial/get-closest-points.js +4 -40
  124. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -1
  125. package/node/find-2-prong/reduce-radius.d.ts +1 -1
  126. package/node/find-2-prong/reduce-radius.js +6 -3
  127. package/node/find-2-prong/reduce-radius.js.map +1 -1
  128. package/node/find-3-prong/calc-better-x.js +1 -1
  129. package/node/find-3-prong/calc-better-x.js.map +1 -1
  130. package/node/find-3-prong/find-3-prong-for-delta3s.d.ts +3 -2
  131. package/node/find-3-prong/find-3-prong-for-delta3s.js +35 -41
  132. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -1
  133. package/node/find-3-prong/find-3-prong.js +3 -1
  134. package/node/find-3-prong/find-3-prong.js.map +1 -1
  135. package/node/find-3-prong/find-and-add-3-prongs.js +16 -0
  136. package/node/find-3-prong/find-and-add-3-prongs.js.map +1 -1
  137. package/node/find-mat/create-initial-cp-tree.js +2 -2
  138. package/node/find-mat/create-initial-cp-tree.js.map +1 -1
  139. package/node/find-mat/find-mat.js +3 -4
  140. package/node/find-mat/find-mat.js.map +1 -1
  141. package/node/find-mat/find-mats.d.ts +6 -12
  142. package/node/find-mat/find-mats.js +10 -27
  143. package/node/find-mat/find-mats.js.map +1 -1
  144. package/node/find-mat/get-dull-corners-on-loop.js +2 -2
  145. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  146. package/node/find-mat/get-for-1-prongs-on-loop.js +36 -8
  147. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  148. package/node/find-mat/get-meta.d.ts +14 -4
  149. package/node/find-mat/get-meta.js +30 -24
  150. package/node/find-mat/get-meta.js.map +1 -1
  151. package/node/find-mat/get-sharp-corners.js +2 -2
  152. package/node/find-mat/get-sharp-corners.js.map +1 -1
  153. package/node/find-mat/mat-options.d.ts +2 -2
  154. package/node/floyd-warshall/get-graph.d.ts +12 -1
  155. package/node/floyd-warshall/get-graph.js +41 -38
  156. package/node/floyd-warshall/get-graph.js.map +1 -1
  157. package/node/geometry/get-bounding-box-.d.ts +16 -2
  158. package/node/geometry/get-bounding-box-.js +5 -2
  159. package/node/geometry/get-bounding-box-.js.map +1 -1
  160. package/node/geometry/get-closest-square-distance-to-rect.d.ts +3 -0
  161. package/node/geometry/get-closest-square-distance-to-rect.js +7 -5
  162. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  163. package/node/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +4 -0
  164. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js +11 -5
  165. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  166. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js +1 -2
  167. package/node/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.js.map +1 -1
  168. package/node/index.d.ts +3 -2
  169. package/node/index.js +2 -1
  170. package/node/index.js.map +1 -1
  171. package/node/mat/clone-mat.d.ts +9 -0
  172. package/node/mat/clone-mat.js +17 -0
  173. package/node/mat/clone-mat.js.map +1 -0
  174. package/node/mat/clone-meta.d.ts +12 -0
  175. package/node/mat/clone-meta.js +24 -0
  176. package/node/mat/clone-meta.js.map +1 -0
  177. package/node/mat/get-boundary-piece-beziers.d.ts +5 -0
  178. package/node/mat/get-boundary-piece-beziers.js +7 -93
  179. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  180. package/node/mat/get-largest-3-prong.d.ts +6 -0
  181. package/node/mat/get-largest-3-prong.js +8 -5
  182. package/node/mat/get-largest-3-prong.js.map +1 -1
  183. package/node/mat/get-largest-vertex.d.ts +15 -1
  184. package/node/mat/get-largest-vertex.js +20 -7
  185. package/node/mat/get-largest-vertex.js.map +1 -1
  186. package/node/mat/hausdorff-distance-one-sided-exceeds.d.ts +79 -0
  187. package/node/mat/hausdorff-distance-one-sided-exceeds.js +251 -0
  188. package/node/mat/hausdorff-distance-one-sided-exceeds.js.map +1 -0
  189. package/node/mat/mat-meta.d.ts +0 -6
  190. package/node/mat/simplify-mat.d.ts +25 -8
  191. package/node/mat/simplify-mat.js +182 -53
  192. package/node/mat/simplify-mat.js.map +1 -1
  193. package/node/mat/trim-mat.d.ts +4 -2
  194. package/node/mat/trim-mat.js +3 -1
  195. package/node/mat/trim-mat.js.map +1 -1
  196. package/node/point-on-shape/get-boundary-tangent-line.d.ts +19 -0
  197. package/node/point-on-shape/get-boundary-tangent-line.js +33 -0
  198. package/node/point-on-shape/get-boundary-tangent-line.js.map +1 -0
  199. package/node/point-on-shape/get-osculating-circle.d.ts +6 -4
  200. package/node/point-on-shape/get-osculating-circle.js +6 -4
  201. package/node/point-on-shape/get-osculating-circle.js.map +1 -1
  202. package/node/point-on-shape/get-pos-corner.js +2 -2
  203. package/node/point-on-shape/get-pos-corner.js.map +1 -1
  204. package/node/reconstruct-from-mat/reconstruct-from-mat.js +20 -80
  205. package/node/reconstruct-from-mat/reconstruct-from-mat.js.map +1 -1
  206. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.d.ts +4 -0
  207. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js +4 -0
  208. package/node/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.js.map +1 -1
  209. package/node/sat/cull.d.ts +7 -6
  210. package/node/sat/cull.js +13 -16
  211. package/node/sat/cull.js.map +1 -1
  212. package/node/sat/get-sat-culls.d.ts +12 -2
  213. package/node/sat/get-sat-culls.js +21 -16
  214. package/node/sat/get-sat-culls.js.map +1 -1
  215. package/node/svg/get-shape-bounds.d.ts +1 -12
  216. package/node/svg/get-shape-bounds.js +2 -3
  217. package/node/svg/get-shape-bounds.js.map +1 -1
  218. package/node/sweep-line/sweep-line.js.map +1 -1
  219. package/node/utils/get-beziers-from-tangents.d.ts +28 -0
  220. package/node/utils/get-beziers-from-tangents.js +92 -0
  221. package/node/utils/get-beziers-from-tangents.js.map +1 -0
  222. package/node/vertex/remove-vertex.d.ts +5 -3
  223. package/node/vertex/remove-vertex.js +5 -3
  224. package/node/vertex/remove-vertex.js.map +1 -1
  225. package/package.json +9 -9
  226. package/qv-infinite-loop.md +120 -0
  227. package/src/closest-boundary-point/cull-curve-pieces.ts +49 -0
  228. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +5 -2
  229. package/src/closest-boundary-point/get-endpoint-info.ts +96 -0
  230. package/src/closest-boundary-point/get-potential-closest-points-on-curve-certified.ts +5 -23
  231. package/src/closest-boundary-point/root-interval-to-distance-squared-interval.ts +42 -60
  232. package/src/corner/get-corner.ts +10 -1
  233. package/src/corner/get-interface-ccw.ts +2 -2
  234. package/src/cp-node/cp-node.ts +4 -3
  235. package/src/cp-node/fs/get-all-on-loop-by-loop.ts +0 -4
  236. package/src/cp-node/fs/get-angle-between-mat-curves.ts +6 -4
  237. package/src/cp-node/fs/get-boundary-beziers-between.ts +10 -8
  238. package/src/cp-node/fs/get-branch-beziers.ts +3 -2
  239. package/src/cp-node/fs/get-branch.ts +1 -2
  240. package/src/cp-node/fs/get-distance-to-next.ts +4 -2
  241. package/src/cp-node/fs/get-first-exit.ts +15 -14
  242. package/src/cp-node/fs/get-implied-boundary-bezier-between.ts +17 -69
  243. package/src/cp-node/fs/get-mat-curve-between.ts +9 -67
  244. package/src/cp-node/fs/get-mat-curves-between.ts +9 -2
  245. package/src/cp-node/fs/get-real-prong-count.ts +11 -7
  246. package/src/cp-node/fs/get-salience.ts +15 -2
  247. package/src/cp-node/fs/is-fully-terminating.ts +6 -18
  248. package/src/cp-node/fs/is-on-same-loop.ts +2 -2
  249. package/src/cp-node/fs/is-special.ts +11 -6
  250. package/src/cp-node/fs/is-vertex.ts +1 -1
  251. package/src/cp-node/fs/traverse-edges.ts +8 -4
  252. package/src/cp-node/stringification/from-stringifyable.ts +75 -75
  253. package/src/cp-node/stringification/to-stringifyable.ts +3 -3
  254. package/src/debug/debug.ts +44 -8
  255. package/src/find-2-prong/add-2-prong.ts +2 -9
  256. package/src/find-2-prong/calc-seperation-tolerance.ts +34 -115
  257. package/src/find-2-prong/find-2-prong.ts +9 -11
  258. package/src/find-2-prong/find-and-add-2-prongs.ts +2 -2
  259. package/src/find-2-prong/get-medial/get-antipodal-points.ts +1 -3
  260. package/src/find-2-prong/get-medial/get-closest-points.ts +6 -51
  261. package/src/find-2-prong/reduce-radius.ts +6 -4
  262. package/src/find-3-prong/calc-better-x.ts +2 -2
  263. package/src/find-3-prong/find-3-prong-for-delta3s.ts +197 -214
  264. package/src/find-3-prong/find-3-prong.ts +54 -51
  265. package/src/find-3-prong/find-and-add-3-prongs.ts +20 -1
  266. package/src/find-mat/create-initial-cp-tree.ts +2 -2
  267. package/src/find-mat/find-mat.ts +4 -6
  268. package/src/find-mat/find-mats.ts +83 -105
  269. package/src/find-mat/get-dull-corners-on-loop.ts +2 -2
  270. package/src/find-mat/get-for-1-prongs-on-loop.ts +40 -8
  271. package/src/find-mat/get-meta.ts +34 -39
  272. package/src/find-mat/get-sharp-corners.ts +2 -2
  273. package/src/find-mat/mat-options.ts +2 -2
  274. package/src/floyd-warshall/get-graph.ts +46 -47
  275. package/src/geometry/get-bounding-box-.ts +5 -2
  276. package/src/geometry/get-closest-square-distance-to-rect.ts +7 -7
  277. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +12 -10
  278. package/src/get-medial-points/double-double/dd-get-medial-point-coeffs-bez3.ts +1 -2
  279. package/src/index.ts +3 -2
  280. package/src/mat/clone-mat.ts +9 -3
  281. package/src/mat/clone-meta.ts +8 -0
  282. package/src/mat/get-boundary-piece-beziers.ts +16 -117
  283. package/src/mat/get-largest-3-prong.ts +9 -6
  284. package/src/mat/get-largest-vertex.ts +25 -9
  285. package/src/mat/hausdorff-distance-one-sided-exceeds.ts +314 -0
  286. package/src/mat/mat-meta.ts +0 -9
  287. package/src/mat/simplify-mat.ts +254 -116
  288. package/src/mat/trim-mat.ts +6 -4
  289. package/src/point-on-shape/get-boundary-tangent-line.ts +36 -0
  290. package/src/point-on-shape/get-osculating-circle.ts +7 -5
  291. package/src/point-on-shape/get-pos-corner.ts +2 -2
  292. package/src/reconstruct-from-mat/reconstruct-from-mat.ts +22 -111
  293. package/src/reconstruct-from-mat/remove-sat-induced-trivial-3prongs.ts +4 -0
  294. package/src/sat/cull.ts +16 -20
  295. package/src/sat/get-sat-culls.ts +28 -23
  296. package/src/svg/get-shape-bounds.ts +2 -3
  297. package/src/sweep-line/sweep-line.ts +1 -1
  298. package/src/utils/get-beziers-from-tangents.ts +110 -0
  299. package/src/utils/map-map.ts +1 -1
  300. package/src/vertex/remove-vertex.ts +5 -3
  301. package/__tests__/cp-node/fs/get-distance-between.spec.ts +0 -7
  302. package/__tests__/cp-node/fs/get-terminating-on-circle.spec.ts +0 -24
  303. package/__tests__/cp-node/fs/is-single-3-prong.spec.ts +0 -17
  304. package/__tests__/cp-node/fs/iterate-all-on-loop.spec.ts +0 -17
  305. package/__tests__/cp-node/fs/traverse-all-forward.spec.ts +0 -14
  306. package/node/closest-boundary-point/cull-bezier-pieces-1.d.ts +0 -9
  307. package/node/closest-boundary-point/cull-bezier-pieces-1.js +0 -17
  308. package/node/closest-boundary-point/cull-bezier-pieces-1.js.map +0 -1
  309. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +0 -13
  310. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +0 -27
  311. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +0 -1
  312. package/node/closest-boundary-point/cull-by-tight-boundary-box.d.ts +0 -11
  313. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +0 -27
  314. package/node/closest-boundary-point/cull-by-tight-boundary-box.js.map +0 -1
  315. package/node/cp-node/fs/find-first.d.ts +0 -10
  316. package/node/cp-node/fs/find-first.js +0 -19
  317. package/node/cp-node/fs/find-first.js.map +0 -1
  318. package/node/debug/functions/check-ordering.d.ts +0 -4
  319. package/node/debug/functions/check-ordering.js +0 -43
  320. package/node/debug/functions/check-ordering.js.map +0 -1
  321. package/node/find-2-prong/cull-bezier-pieces.d.ts +0 -13
  322. package/node/find-2-prong/cull-bezier-pieces.js +0 -43
  323. package/node/find-2-prong/cull-bezier-pieces.js.map +0 -1
  324. package/node/floyd-warshall/get-hole-closer-pairs.d.ts +0 -8
  325. package/node/floyd-warshall/get-hole-closer-pairs.js +0 -27
  326. package/node/floyd-warshall/get-hole-closer-pairs.js.map +0 -1
  327. package/node/utils/dual-set.d.ts +0 -27
  328. package/node/utils/dual-set.js +0 -55
  329. package/node/utils/dual-set.js.map +0 -1
  330. package/node/utils/tri-map.d.ts +0 -27
  331. package/node/utils/tri-map.js +0 -49
  332. package/node/utils/tri-map.js.map +0 -1
  333. package/src/closest-boundary-point/cull-bezier-pieces-1.ts +0 -36
  334. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +0 -42
  335. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +0 -43
  336. package/src/closest-boundary-point/get-p-from-box.ts +0 -14
  337. package/src/cp-node/fs/add-distance-from.ts +0 -49
  338. package/src/cp-node/fs/get-distance-between.ts +0 -16
  339. package/src/cp-node/fs/get-terminating-on-circle.ts +0 -24
  340. package/src/cp-node/fs/is-single-3-prong.ts +0 -15
  341. package/src/cp-node/fs/iterate-all-on-loop.ts +0 -15
  342. package/src/cp-node/fs/traverse-all-forward.ts +0 -24
  343. package/src/debug/functions/draw/draw-beziers-as-single-path.ts +0 -40
  344. package/src/debug/functions/draw/draw-disk.ts +0 -34
  345. package/src/debug/functions/draw/xmlns.ts +0 -5
  346. package/src/find-2-prong/cull-bezier-pieces.ts +0 -61
  347. package/src/find-2-prong/find-and-add-2-prong.ts +0 -30
  348. package/src/find-2-prong/get-medial/get-closest-points-d.ts +0 -213
  349. package/src/find-2-prong/x-for-debugging.ts +0 -13
  350. package/src/floyd-warshall/get-hole-closer-pairs.ts +0 -35
  351. package/src/mat/get-two-prong-type.ts +0 -13
  352. package/src/point-on-shape/is-pos-dull-corner.ts +0 -18
  353. package/src/point-on-shape/is-pos-quite-dull-corner.ts +0 -18
  354. package/src/point-on-shape/is-pos-quite-sharp-corner.ts +0 -18
  355. package/src/point-on-shape/pos-to-human-string.ts +0 -18
  356. package/src/sweep-line/are-boxes-intersecting.ts +0 -37
@@ -1,6 +1,6 @@
1
1
  import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import type { Circle } from '../geometry/circle.js';
3
- import type { PointOnShape, PrePointOnShape } from '../point-on-shape/point-on-shape.js';
3
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
4
4
  import type { MatMeta } from '../mat/mat-meta.js';
5
5
  import type { Mutable } from '../utils/mutable.js';
6
6
  import { calcPosOrder } from '../point-on-shape/calc-pos-order.js';
@@ -35,13 +35,6 @@ function add2Prong(
35
35
  const orderSource = calcPosOrder(circle.center, pposSource);
36
36
  const orderAntipode = calcPosOrder(circle.center, pposAntipode);
37
37
 
38
- const posAntipode: PointOnShape = {
39
- ...pposAntipode, circle, order: orderAntipode, order2: 0
40
- };
41
- const posSource: PointOnShape = {
42
- ...pposSource, circle, order: orderSource, order2: 0
43
- }
44
-
45
38
  // Make sure there isn't already a ContactPoint close by - it can cause
46
39
  // floating point stability issues.
47
40
  if (!!getCloseByCpIfExist(meta, pposSource, circle, orderSource, 0, 2)) {
@@ -55,7 +48,7 @@ function add2Prong(
55
48
  isHoleClosing, isHoleClosing, circle,
56
49
  [orderSource, orderAntipode],
57
50
  meta,
58
- [posSource, posAntipode]
51
+ [pposSource, pposAntipode]
59
52
  );
60
53
 
61
54
  if (anyFailed) {
@@ -1,127 +1,46 @@
1
- import { ddAddDd, twoProduct, ddDiffDd, ddDivDd, twoDiff, ddMultDouble1 } from 'double-double';
2
-
3
- const tp = twoProduct;
4
- const qaq = ddAddDd;
5
- const qdq = ddDiffDd;
6
- const qmd = ddMultDouble1;
7
-
8
- const { acos } = Math;
9
-
10
-
11
1
  /**
12
- * Calculates and returns an appropriate seperation tolerance between `CpNode`s.
13
- *
14
- * @param R radius of the circle implied by the curvature at the boundary
2
+ * Returns the *squared* separation tolerance between the two contact points
3
+ * `y` (the source point) and `z` (the antipode) of a candidate 2-prong: if
4
+ * `|yz|²` is below it the antipode is indistinguishable (to within the error
5
+ * tolerance `δ`) from the circle merely grazing the boundary at `y` - the
6
+ * near-1-prong case - and the 2-prong should be rejected.
7
+ *
8
+ * Derivation: the MAT circle (radius `r`) is tangent to the boundary at `y`
9
+ * and so is the osculating circle there (radius `R`), both centers lying on
10
+ * the inward normal at `y`. Approximating the boundary near `y` by the
11
+ * osculating circle, the MAT circle enlarged by `δ` crosses it at the angle
12
+ * `θ` (at the MAT center, measured from `y`) given by the law of cosines:
13
+ *
14
+ * cos θ = (r(R-r) - rδ - δ²/2) / ((R-r)(r+δ))
15
+ *
16
+ * Points of the MAT circle within that angle of `y` are within `δ` of the
17
+ * boundary. The chord `|yz|` subtending `θ` is `2r·sin(θ/2)`, and since
18
+ * `2sin²(θ/2) = 1 - cos θ = (Rδ + δ²/2) / ((R-r)(r+δ))` the squared chord is
19
+ *
20
+ * |yz|² = r²(2Rδ + δ²) / ((R-r)(r+δ))
21
+ *
22
+ * which is what is returned - in closed form, without the cancellation that
23
+ * recovering a tiny `θ` from `cos θ` suffers from.
24
+ *
25
+ * @param R radius of the osculating circle of the boundary at `y`
15
26
  * @param r radius of the MAT circle
16
- * @param θ angle between point...
27
+ * @param δ the error tolerance on distances
28
+ *
29
+ * @internal
17
30
  */
18
- function calcSeperationTolerance(
31
+ function calcSquaredSeperationTolerance(
19
32
  R: number,
20
33
  r: number,
21
- δ: number) {
34
+ δ: number): number {
22
35
 
23
- const a = r + δ;
24
- if (a >= R) {
36
+ if (r + δ >= R) {
37
+ // The enlarged MAT circle is at least as large as the osculating
38
+ // circle: every point on it is within tolerance of the boundary.
25
39
  return Infinity;
26
40
  }
27
41
 
28
- const R_r_ = twoDiff(R,r);
29
- const A_ = qmd(r,R_r_);
30
- const N_ = qdq(qdq(A_, tp(r,δ)), tp(δ,δ/2));
31
- const D_ = qaq(A_,qmd(δ,R_r_));
32
-
33
- const R_r = R - r;
34
- const A = r*R_r;
35
- const N = A - r*δ - (δ*δ)/2;
36
- const D = A + R_r*δ;
37
- const cosC = N/D;
38
- const Q = ddDivDd(N_,D_)[1];
39
- // const Q = N_[1]/D_[1];
40
- const C = acos(cosC);
41
- const CC = acos(Q)
42
-
43
- const θ = CC;
44
-
45
- // return r*θ;
46
- return r*θ;
42
+ return r*r*(2*R*δ + δ*δ) / ((R - r)*(r + δ));
47
43
  }
48
44
 
49
45
 
50
- export { calcSeperationTolerance }
51
-
52
-
53
- // Quokka tests
54
-
55
- // /**
56
- // * Calculates and returns an appropriate seperation tolerance between `CpNode`s.
57
- // *
58
- // * @param R radius of the circle implied by the curvature at the boundary
59
- // * @param r radius of the MAT circle
60
- // * @param θ angle between point...
61
- // */
62
- // function calcSeperationTolerance2(
63
- // R: number,
64
- // r: number,
65
- // δ: number) {
66
-
67
- // const a = r + δ;
68
- // if (a >= R) {
69
- // return Infinity;
70
- // }
71
-
72
- // const b = R - r;
73
- // const c = R;
74
-
75
- // const N = c*c - a*a - b*b;
76
- // const N_ = qdq(qdq(tp(c,c), tp(a,a)), tp(b,b));
77
- // const D = 2*a*b;
78
- // const D_ = tp(-2*a,b);
79
- // const Q = ddDivDd(N_,D_)[1];
80
- // const cosC = -N/D;
81
- // const C = acos(cosC);
82
- // const CC = acos(Q);
83
-
84
- // const θ = π - CC;
85
-
86
- // return θ;
87
- // // return r*θ; // approximate arc with line
88
- // }
89
-
90
-
91
- // function degToRad(degrees: number) {
92
- // return degrees/360*2*PI;
93
- // }
94
- // function radToDeg(rad: number) {
95
- // return rad*360/2/PI;
96
- // }
97
-
98
-
99
- // const R = 699;
100
- // const r = 698;
101
- // const δ = 1000*2**-46;
102
- // calcSeperationTolerance(R,r,δ);
103
- // calcSeperationTolerance2(R,r,δ);
104
- // calcSeperationTolerance3(R,r,δ);
105
-
106
- // // * see https://en.wikipedia.org/wiki/Law_of_cosines, Version suited to small angles
107
- // function calcSeperationTolerance3(
108
- // R: number,
109
- // r: number,
110
- // δ: number) {
111
-
112
- // const a = r + δ;
113
- // const c = R - r;
114
- // const b = R;
115
-
116
- // // c² = (a - b)² + 4ab*sin²(θ/2) OR
117
- // // (c² - (a - b)²)/4ab = sin²(θ/2)
118
- // const cc = c*c;
119
- // const abc = a*a + b*b - 2*a*b;
120
- // const A = cc - abc;
121
- // const B = sqrt(A/(4*a*b));
122
-
123
- // const θ = 2*asin(B);
124
-
125
- // return θ;
126
- // // return r*θ; // approximate arc with line
127
- // }
46
+ export { calcSquaredSeperationTolerance }
@@ -6,10 +6,10 @@ import { getInitialCurvePieces } from './get-initial-bezier-pieces.js';
6
6
  import { getAntipodalPoints } from './get-medial/get-antipodal-points.js';
7
7
  import { reduceRadius } from './reduce-radius.js';
8
8
  import { squaredDistanceBetweenDd } from './squared-distance-between-dd.js';
9
- import { cullCurvePieces } from './cull-bezier-pieces.js';
9
+ import { cullCurvePieces } from '../closest-boundary-point/cull-curve-pieces.js';
10
10
  import { add1Prong } from './add-1-prong.js';
11
11
  import { toP } from '../point-on-shape/to-p.js';
12
- import { calcSeperationTolerance } from './calc-seperation-tolerance.js';
12
+ import { calcSquaredSeperationTolerance } from './calc-seperation-tolerance.js';
13
13
  import { getInitialX } from './get-initial-x.js';
14
14
  import { ddNormal } from 'flo-bezier3';
15
15
  import { rotate } from 'flo-vector2d';
@@ -85,26 +85,24 @@ function find2Prong(
85
85
  );
86
86
 
87
87
  // The lines below is an optimization.
88
- const xy2 = reduceRadius(maxCoordPowerOf2, rO, curvePieces, y, nnorm);
88
+ const xy2 = reduceRadius(rO, curvePieces, y, nnorm);
89
89
  const xy = sqrt(xy2);
90
90
 
91
91
  const l = sqrt(nnorm[0]**2 + nnorm[1]**2);
92
92
  xO = [y[0] + nnorm[0]/l*xy, y[1] + nnorm[1]/l*xy];
93
93
 
94
- cullCurvePieces(curvePieces, xO, xy2);
94
+ // (the extra multiplier accounts for floating point error)
95
+ const culledCurvePieces = cullCurvePieces(curvePieces, xO, (1 + 2**-20)*xy2);
95
96
 
96
97
  const antipodalPoints = getAntipodalPoints(
97
- maxCoordPowerOf2, nnorm, nnormDd, yPos,
98
+ maxCoordPowerOf2, nnormDd, yPos,
98
99
  for1Prong, angle,
99
- curvePieces
100
+ culledCurvePieces
100
101
  );
101
102
 
102
103
  // FUTURE - if antipodalPoints.length > 1 let's just add an n-prong;
103
104
  if (antipodalPoints.length !== 1) {
104
105
  if (antipodalPoints.length === 0) {
105
- if (isHoleClosing) {
106
- console.log(yPos)
107
- }
108
106
  return undefined;
109
107
  }
110
108
  if (!isHoleClosing && !areAllAntipodesSame(antipodalPoints, maxCoordPowerOf2)) {
@@ -144,7 +142,7 @@ function find2Prong(
144
142
  // The lines below eliminate cases where the found 2-prong is too
145
143
  // close to a one-prong
146
144
  const squaredSeperationTolerance = max(
147
- calcSeperationTolerance(rO, sqrt(xz), (2**2)*errorTolerance),
145
+ calcSquaredSeperationTolerance(rO, sqrt(xz), (2**2)*errorTolerance),
148
146
  minSquaredSeperationTolerance
149
147
  );
150
148
  if (yz <= squaredSeperationTolerance) {
@@ -171,7 +169,7 @@ function areAllAntipodesSame(
171
169
  // }
172
170
 
173
171
  const { x: x_ } = point[i];
174
- if (abs(x[0] - x_[0]) > tol || abs(x[0] - x_[0]) > tol) {
172
+ if (abs(x[0] - x_[0]) > tol || abs(x[1] - x_[1]) > tol) {
175
173
  return false;
176
174
  }
177
175
  }
@@ -7,7 +7,7 @@ import type { MatMeta } from '../mat/mat-meta.js';
7
7
  import { find2Prong } from './find-2-prong.js';
8
8
  import { add2Prong } from './add-2-prong.js';
9
9
  import { rotateNeg90Degrees } from 'flo-vector2d';
10
- import { getCorner } from '../corner/get-corner.js';
10
+ import { getCorner$ } from '../corner/get-corner.js';
11
11
 
12
12
 
13
13
  const { PI, atan2 } = Math;
@@ -67,7 +67,7 @@ function getValidAngles(
67
67
  const angles = [0];
68
68
  if (ppos.t === 1) {
69
69
  const { curve } = ppos;
70
- const corner = getCorner(curve.ps, curve.next.ps);
70
+ const corner = getCorner$(curve.ps, curve.next.ps);
71
71
  if (corner.isQuiteDull) {
72
72
  const tangentI = rotateNeg90Degrees(corner.tangents[0]);
73
73
  const tangentO = rotateNeg90Degrees(corner.tangents[1]);
@@ -9,7 +9,6 @@ import { getClosestPoint } from './get-closest-points.js';
9
9
  * bezier pieces, including the beziers actually checked after culling.
10
10
  *
11
11
  * @param maxCoordPowerOf2
12
- * @param nnorm
13
12
  * @param yPos
14
13
  * @param for1Prong defaults to `false`;
15
14
  * @param angle angle from normal
@@ -19,7 +18,6 @@ import { getClosestPoint } from './get-closest-points.js';
19
18
  */
20
19
  function getAntipodalPoints(
21
20
  maxCoordPowerOf2: number,
22
- nnorm: number[],
23
21
  nnormDd: number[][],
24
22
  yPos: PrePointOnShape,
25
23
  for1Prong: boolean,
@@ -31,7 +29,7 @@ function getAntipodalPoints(
31
29
  const curvePiece = curvePieces[i];
32
30
 
33
31
  const pInfos = getClosestPoint(
34
- maxCoordPowerOf2, nnorm, nnormDd, yPos, for1Prong, angle,
32
+ maxCoordPowerOf2, nnormDd, yPos, for1Prong, angle,
35
33
  curvePiece
36
34
  );
37
35
 
@@ -4,21 +4,20 @@ import type { PrePointOnShape } from "../../point-on-shape/point-on-shape.js";
4
4
  import type { AntipodalPoint } from './antipodal-point.js';
5
5
  import { ddMultDouble1 } from 'double-double';
6
6
  import { lengthSquared } from "flo-vector2d";
7
- import { roots, Horner, ddHorner } from 'flo-poly';
8
- import { evalDeCasteljau, getMedialPointCoeffs, getMedialPointCoeffsBez0 } from 'flo-bezier3';
7
+ import { roots, ddHorner } from 'flo-poly';
8
+ import { evalDeCasteljau } from 'flo-bezier3';
9
9
  import { ddGetMedialPointCoeffs } from '../../get-medial-points/double-double/dd-get-medial-point-coeffs.js';
10
10
  import { ddGetMedialPointCoeffsBez2_SameCurve } from '../../get-medial-points/double-double/dd-get-medial-point-coeffs-bez2-same-curve.js';
11
11
  import { ddGetMedialPointCoeffsBez3_SameCurve } from '../../get-medial-points/double-double/dd-get-medial-point-coeffs-bez3-same-curve.js';
12
12
  import { ddGetMedialPointCoeffsBez0 } from '../../get-medial-points/double-double/dd-get-medial-point-coeffs-bez0.js';
13
13
 
14
- const { sqrt, abs, max } = Math;
14
+ const { sqrt, abs } = Math;
15
15
 
16
16
  const qmd = ddMultDouble1;
17
17
 
18
18
 
19
19
  /**
20
20
  * @param maxCoordPowerOf2
21
- * @param nnorm
22
21
  * @param yPos The point on the shape
23
22
  * @param for1Prong defaults to `false`;
24
23
  * @param angle defaults to `0`;
@@ -28,7 +27,6 @@ const qmd = ddMultDouble1;
28
27
  */
29
28
  function getClosestPoint(
30
29
  maxCoordPowerOf2: number,
31
- nnorm: number[],
32
30
  nnormDd: number[][],
33
31
  yPos: PrePointOnShape,
34
32
  for1Prong: boolean,
@@ -90,8 +88,7 @@ function getClosestPoint(
90
88
  const _AS = abs(AS);
91
89
  // const _CS = abs(CS);
92
90
 
93
- // if (max(_AS, _CS) < 2**-40) { continue; }
94
- if (max(_AS) < 2**-40) { continue; }
91
+ if (_AS < 2**-40) { continue; }
95
92
 
96
93
  // const w = _AS > _CS
97
94
  // ? -BS / AS
@@ -144,7 +141,7 @@ function getClosestPoint(
144
141
  //------------------------------------------
145
142
  const pLast = ps[ps.length - 1];
146
143
 
147
- let dontPush1 = (
144
+ const dontPush1 = (
148
145
  (t === 0 && curve === touchedCurve!.prev) ||
149
146
  (t === 1 && curve === touchedCurve)
150
147
  );
@@ -177,7 +174,7 @@ function getClosestPoint(
177
174
  // which cannot be culled if this curve`s `t === 0` is included
178
175
  } else if (tE === 1) {
179
176
  if (!dontPush1 && !endPushed) {
180
- PS.push({ P: pLast, t: 1 }); dontPush1 = true;
177
+ PS.push({ P: pLast, t: 1 });
181
178
  }
182
179
  } else {
183
180
  if (!endPushed) {
@@ -228,45 +225,3 @@ function getClosestPoint(
228
225
 
229
226
 
230
227
  export { getClosestPoint }
231
-
232
-
233
-
234
- /**
235
- * Recovers a numerically stable ray parameter `t` from linear equations
236
- * `A*t + B = 0` and (optionally) `C*t + D = 0` evaluated at a fixed `s`.
237
- *
238
- * If `C,D` are unavailable, this falls back to `-B/A`.
239
- */
240
- // function chooseStableT(
241
- // A: number,
242
- // B: number,
243
- // C: number,
244
- // D: number) {
245
-
246
- // const epsScale = max(1, abs(A), abs(B), abs(C), abs(D));
247
- // const eps = Number.EPSILON * epsScale;
248
-
249
- // const denomAB = abs(A);
250
- // const hasAB = denomAB > eps;
251
- // const denomCD = abs(C);
252
- // const hasCD = denomCD > eps;
253
-
254
- // if (!hasAB && !hasCD) {
255
- // return undefined;
256
- // }
257
- // if (hasAB && !hasCD) {
258
- // return -B / A;
259
- // }
260
- // if (!hasAB && hasCD) {
261
- // return -D / C;
262
- // }
263
-
264
- // const tAB = -B / A;
265
- // const tCD = -D / C;
266
-
267
- // // Score each candidate by how well it satisfies the *other* equation.
268
- // const scoreAB = abs(C*tAB + D) / (abs(C) + abs(D) + eps);
269
- // const scoreCD = abs(A*tCD + B) / (abs(A) + abs(B) + eps);
270
-
271
- // return scoreAB <= scoreCD ? tAB : tCD;
272
- // }
@@ -2,7 +2,7 @@ import type { CurvePiece } from '../mat/curve-piece.js';
2
2
  import { getMedialPointCoeffsBez0 } from "flo-bezier3";
3
3
  import { lengthSquared, squaredDistanceBetween } from "flo-vector2d";
4
4
 
5
- const { abs } = Math;
5
+ const { abs, sqrt } = Math;
6
6
 
7
7
 
8
8
  const TOLERANCE = 1 + 2**-20;
@@ -16,14 +16,16 @@ const TOLERANCE = 1 + 2**-20;
16
16
  * @internal
17
17
  */
18
18
  function reduceRadius(
19
- maxCoordPowerOf2: number,
20
19
  rO: number,
21
- curvePieces: CurvePiece[],
20
+ curvePieces: CurvePiece[],
22
21
  y: number[],
23
22
  nnorm: number[]): number {
24
23
 
25
24
  let minRadiusSqrd = rO**2;
26
- let x = [y[0] + nnorm[0], y[1] + nnorm[1]];
25
+ // the center of the initial circle (radius `rO`) - `nnorm` is not
26
+ // necessarily of unit length so scale it
27
+ const s = rO / sqrt(lengthSquared(nnorm));
28
+ let x = [y[0] + s*nnorm[0], y[1] + s*nnorm[1]];
27
29
 
28
30
  for (let i=0; i<curvePieces.length; i++) {
29
31
  const curvePiece = curvePieces[i];
@@ -31,7 +31,7 @@ function calcBetterX(
31
31
 
32
32
  let nu = 1;
33
33
  let better;
34
- let newX;
34
+ let newX: number[];
35
35
  let newPoss: PrePointOnShape[];
36
36
  let newV;
37
37
  let i = 0; // Safeguard
@@ -40,7 +40,7 @@ function calcBetterX(
40
40
  newX = translate(shift, x);
41
41
 
42
42
  newPoss = curvePiece3s.map(curvePieces =>
43
- getCloseBoundaryPointsCertified(curvePieces, x)[0]
43
+ getCloseBoundaryPointsCertified(curvePieces, newX)[0]
44
44
  );
45
45
 
46
46
  // Point of zero V