flo-mat 3.0.15 → 4.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 (601) hide show
  1. package/README.md +1 -1
  2. package/__tests__/cp-node/compare-cp-nodes-by-value.ts +5 -3
  3. package/__tests__/cp-node/compare-poss-by-value.ts +7 -7
  4. package/__tests__/cp-node/fs/get-all-on-circle.spec.ts +8 -8
  5. package/__tests__/cp-node/fs/is-one-prong.spec.ts +3 -3
  6. package/__tests__/cp-node/fs/is-sharp.spec.ts +1 -1
  7. package/__tests__/find-2-prong/get-medial/get-closest-points.spec.ts +49 -0
  8. package/__tests__/get-mats1.ts +29 -32
  9. package/__tests__/helpers/close-to.ts +71 -0
  10. package/__tests__/helpers/jest-extend-nearly.ts +39 -0
  11. package/__tests__/helpers/jest.setup.ts +6 -0
  12. package/__tests__/helpers/obj-or-array.ts +8 -0
  13. package/__tests__/jest-extensions.d.ts +26 -0
  14. package/__tests__/lib-load.spec.ts +1 -1
  15. package/browser/index.js +20280 -17610
  16. package/browser/index.min.js +1 -1
  17. package/jest.config.cjs +1 -0
  18. package/node/add-n-prong.ts/join-spokes.d.ts +2 -2
  19. package/node/add-n-prong.ts/join-spokes.js +5 -4
  20. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  21. package/node/closest-boundary-point/cull-bezier-pieces-1.d.ts +9 -0
  22. package/node/closest-boundary-point/{cull-bezier-pieces.js → cull-bezier-pieces-1.js} +6 -7
  23. package/node/closest-boundary-point/cull-bezier-pieces-1.js.map +1 -0
  24. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +7 -5
  25. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +12 -10
  26. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
  27. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +2 -2
  28. package/node/closest-boundary-point/foot-and-endpoint-info.d.ts +6 -9
  29. package/node/closest-boundary-point/get-best-distance-squared.d.ts +4 -3
  30. package/node/closest-boundary-point/get-best-distance-squared.js +11 -11
  31. package/node/closest-boundary-point/get-best-distance-squared.js.map +1 -1
  32. package/node/closest-boundary-point/get-close-boundary-points-certified.d.ts +5 -9
  33. package/node/closest-boundary-point/get-close-boundary-points-certified.js +22 -18
  34. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  35. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.d.ts +3 -8
  36. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js +34 -91
  37. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js.map +1 -1
  38. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.d.ts +1 -1
  39. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js +8 -11
  40. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js.map +1 -1
  41. package/node/corner/compare-curvatures-at-interface.d.ts +1 -1
  42. package/node/corner/compare-curvatures-at-interface.js +1 -1
  43. package/node/corner/corner.d.ts +7 -6
  44. package/node/corner/get-corner.d.ts +1 -6
  45. package/node/corner/get-corner.js +2 -9
  46. package/node/corner/get-corner.js.map +1 -1
  47. package/node/corner/get-interface-ccw.d.ts +2 -2
  48. package/node/corner/get-interface-ccw.js +4 -5
  49. package/node/corner/get-interface-ccw.js.map +1 -1
  50. package/node/cp-node/cp-node-fs.d.ts +0 -15
  51. package/node/cp-node/cp-node-fs.js +0 -4
  52. package/node/cp-node/cp-node-fs.js.map +1 -1
  53. package/node/cp-node/cp-node.d.ts +10 -10
  54. package/node/cp-node/fs/clone.js.map +1 -1
  55. package/node/cp-node/fs/cp-node-comparator.js +2 -2
  56. package/node/cp-node/fs/cp-node-comparator.js.map +1 -1
  57. package/node/cp-node/fs/enhance-cp-node.d.ts +1 -1
  58. package/node/cp-node/fs/enhance-cp-node.js +5 -5
  59. package/node/cp-node/fs/enhance-cp-node.js.map +1 -1
  60. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +2 -2
  61. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
  62. package/node/cp-node/fs/get-cp-node-ordering.js +4 -4
  63. package/node/cp-node/fs/get-cp-node-ordering.js.map +1 -1
  64. package/node/cp-node/fs/get-edge-direction.js +3 -3
  65. package/node/cp-node/fs/get-edge-direction.js.map +1 -1
  66. package/node/cp-node/fs/get-hole-closers.d.ts +1 -1
  67. package/node/cp-node/fs/get-implied-boundary-bezier-between.js +2 -2
  68. package/node/cp-node/fs/get-implied-boundary-bezier-between.js.map +1 -1
  69. package/node/cp-node/fs/get-mat-curve-between.d.ts +1 -1
  70. package/node/cp-node/fs/get-mat-curve-between.js +6 -5
  71. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  72. package/node/cp-node/fs/get-salience.d.ts +1 -1
  73. package/node/cp-node/fs/get-salience.js +3 -3
  74. package/node/cp-node/fs/get-salience.js.map +1 -1
  75. package/node/cp-node/fs/insert-cp-node.d.ts +4 -4
  76. package/node/cp-node/fs/insert-cp-node.js +3 -4
  77. package/node/cp-node/fs/insert-cp-node.js.map +1 -1
  78. package/node/cp-node/fs/is-one-prong.d.ts +1 -1
  79. package/node/cp-node/fs/is-one-prong.js +2 -9
  80. package/node/cp-node/fs/is-one-prong.js.map +1 -1
  81. package/node/cp-node/fs/is-order-correct.d.ts +3 -3
  82. package/node/cp-node/fs/is-order-correct.js +5 -8
  83. package/node/cp-node/fs/is-order-correct.js.map +1 -1
  84. package/node/cp-node/fs/is-sharp.js +1 -1
  85. package/node/cp-node/fs/is-sharp.js.map +1 -1
  86. package/node/cp-node/fs/remove-cp-node.js +1 -2
  87. package/node/cp-node/fs/remove-cp-node.js.map +1 -1
  88. package/node/cp-node/fs/traverse-cp.js.map +1 -1
  89. package/node/cp-node/fs/traverse-vertices.d.ts +1 -1
  90. package/node/cp-node/fs/traverse-vertices.js.map +1 -1
  91. package/node/debug/debug-elem-types.d.ts +1 -2
  92. package/node/debug/debug-elem-types.js +1 -2
  93. package/node/debug/debug-elem-types.js.map +1 -1
  94. package/node/debug/functions/draw-elem/draw-branch.d.ts +1 -1
  95. package/node/debug/functions/draw-elem/draw-branch.js.map +1 -1
  96. package/node/debug/functions/draw-elem/draw-cp-node.d.ts +1 -1
  97. package/node/debug/functions/draw-elem/draw-cp-node.js +4 -4
  98. package/node/debug/functions/draw-elem/draw-cp-node.js.map +1 -1
  99. package/node/debug/functions/draw-elem/draw-elem.js +1 -5
  100. package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
  101. package/node/debug/functions/draw-elem/draw-leaves.d.ts +1 -1
  102. package/node/debug/functions/draw-elem/draw-leaves.js +4 -4
  103. package/node/debug/functions/draw-elem/draw-leaves.js.map +1 -1
  104. package/node/debug/functions/draw-elem/draw-mat.d.ts +1 -1
  105. package/node/debug/functions/draw-elem/draw-mat.js +1 -2
  106. package/node/debug/functions/draw-elem/draw-mat.js.map +1 -1
  107. package/node/debug/functions/draw-elem/draw-max-vertex.d.ts +1 -1
  108. package/node/debug/functions/draw-elem/draw-max-vertex.js +1 -1
  109. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +1 -1
  110. package/node/debug/functions/draw-elem/draw-min-y.d.ts +1 -1
  111. package/node/debug/functions/draw-elem/draw-min-y.js.map +1 -1
  112. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js +12 -3
  113. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +1 -1
  114. package/node/debug/functions/draw-elem/draw-one-prong.d.ts +2 -2
  115. package/node/debug/functions/draw-elem/draw-one-prong.js +8 -7
  116. package/node/debug/functions/draw-elem/draw-one-prong.js.map +1 -1
  117. package/node/debug/functions/draw-elem/draw-three-prong.d.ts +1 -1
  118. package/node/debug/functions/draw-elem/draw-three-prong.js +4 -4
  119. package/node/debug/functions/draw-elem/draw-three-prong.js.map +1 -1
  120. package/node/debug/functions/draw-elem/draw-two-prong.js +4 -3
  121. package/node/debug/functions/draw-elem/draw-two-prong.js.map +1 -1
  122. package/node/debug/functions/draw-elem/draw-vertex.d.ts +1 -1
  123. package/node/debug/functions/draw-elem/draw-vertex.js +1 -3
  124. package/node/debug/functions/draw-elem/draw-vertex.js.map +1 -1
  125. package/node/debug/functions/general.js +1 -1
  126. package/node/debug/functions/general.js.map +1 -1
  127. package/node/error-analysis/gamma.d.ts +7 -1
  128. package/node/error-analysis/gamma.js +6 -2
  129. package/node/error-analysis/gamma.js.map +1 -1
  130. package/node/find-2-prong/add-1-prong.d.ts +3 -3
  131. package/node/find-2-prong/add-1-prong.js +4 -4
  132. package/node/find-2-prong/add-1-prong.js.map +1 -1
  133. package/node/find-2-prong/add-2-prong.d.ts +10 -11
  134. package/node/find-2-prong/add-2-prong.js +42 -37
  135. package/node/find-2-prong/add-2-prong.js.map +1 -1
  136. package/node/find-2-prong/calc-seperation-tolerance.js +4 -7
  137. package/node/find-2-prong/calc-seperation-tolerance.js.map +1 -1
  138. package/node/find-2-prong/cull-bezier-pieces.d.ts +9 -7
  139. package/node/find-2-prong/cull-bezier-pieces.js +30 -15
  140. package/node/find-2-prong/cull-bezier-pieces.js.map +1 -1
  141. package/node/find-2-prong/find-2-prong.d.ts +12 -13
  142. package/node/find-2-prong/find-2-prong.js +73 -116
  143. package/node/find-2-prong/find-2-prong.js.map +1 -1
  144. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.d.ts +4 -4
  145. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.js.map +1 -1
  146. package/node/find-2-prong/find-and-add-2-prongs.d.ts +5 -4
  147. package/node/find-2-prong/find-and-add-2-prongs.js +28 -24
  148. package/node/find-2-prong/find-and-add-2-prongs.js.map +1 -1
  149. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.d.ts +6 -8
  150. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js +11 -12
  151. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js.map +1 -1
  152. package/node/find-2-prong/get-initial-bezier-pieces.d.ts +5 -6
  153. package/node/find-2-prong/get-initial-bezier-pieces.js +8 -11
  154. package/node/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
  155. package/node/find-2-prong/get-initial-x.d.ts +12 -0
  156. package/node/find-2-prong/get-initial-x.js +35 -0
  157. package/node/find-2-prong/get-initial-x.js.map +1 -0
  158. package/node/find-2-prong/get-medial/antipodal-point.d.ts +8 -0
  159. package/node/find-2-prong/get-medial/antipodal-point.js +2 -0
  160. package/node/find-2-prong/get-medial/antipodal-point.js.map +1 -0
  161. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +18 -0
  162. package/node/find-2-prong/get-medial/get-antipodal-points.js +41 -0
  163. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -0
  164. package/node/find-2-prong/get-medial/get-closest-points.d.ts +15 -0
  165. package/node/find-2-prong/get-medial/get-closest-points.js +167 -0
  166. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -0
  167. package/node/find-2-prong/reduce-radius.d.ts +4 -4
  168. package/node/find-2-prong/reduce-radius.js +30 -50
  169. package/node/find-2-prong/reduce-radius.js.map +1 -1
  170. package/node/{find-3-prong.ts → find-3-prong}/calc-better-x.d.ts +9 -6
  171. package/node/{find-3-prong.ts → find-3-prong}/calc-better-x.js +11 -6
  172. package/node/find-3-prong/calc-better-x.js.map +1 -0
  173. package/node/find-3-prong/calc-initial-3-prong-center.d.ts +15 -0
  174. package/node/find-3-prong/calc-initial-3-prong-center.js +27 -0
  175. package/node/find-3-prong/calc-initial-3-prong-center.js.map +1 -0
  176. package/node/find-3-prong/find-3-prong-for-delta3s.d.ts +19 -0
  177. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.js +47 -32
  178. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -0
  179. package/node/find-3-prong/find-3-prong.d.ts +13 -0
  180. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong.js +14 -9
  181. package/node/find-3-prong/find-3-prong.js.map +1 -0
  182. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.d.ts +2 -2
  183. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.js +17 -2
  184. package/node/find-3-prong/find-and-add-3-prong.js.map +1 -0
  185. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.js +8 -21
  186. package/node/find-3-prong/find-and-add-3-prongs-on-loop.js.map +1 -0
  187. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.d.ts +1 -4
  188. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.js +2 -3
  189. package/node/find-3-prong/find-and-add-3-prongs.js.map +1 -0
  190. package/node/find-3-prong/get-closest-points.d.ts +10 -0
  191. package/node/{find-3-prong.ts → find-3-prong}/get-closest-points.js +4 -4
  192. package/node/find-3-prong/get-closest-points.js.map +1 -0
  193. package/node/find-3-prong/three-prong-info.d.ts +9 -0
  194. package/node/find-3-prong/three-prong-info.js +2 -0
  195. package/node/find-3-prong/three-prong-info.js.map +1 -0
  196. package/node/find-3-prong/timed-cc.d.ts +3 -0
  197. package/node/find-3-prong/timed-cc.js +5 -0
  198. package/node/find-3-prong/timed-cc.js.map +1 -0
  199. package/node/find-mat/clip-options.d.ts +2 -2
  200. package/node/find-mat/clip-options.js +7 -14
  201. package/node/find-mat/clip-options.js.map +1 -1
  202. package/node/find-mat/create-initial-cp-tree.d.ts +9 -8
  203. package/node/find-mat/create-initial-cp-tree.js +17 -20
  204. package/node/find-mat/create-initial-cp-tree.js.map +1 -1
  205. package/node/find-mat/find-mat.d.ts +5 -5
  206. package/node/find-mat/find-mat.js +6 -12
  207. package/node/find-mat/find-mat.js.map +1 -1
  208. package/node/find-mat/find-mats.js +7 -12
  209. package/node/find-mat/find-mats.js.map +1 -1
  210. package/node/find-mat/get-dull-corners-on-loop.d.ts +3 -3
  211. package/node/find-mat/get-dull-corners-on-loop.js +5 -4
  212. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  213. package/node/find-mat/get-for-1-prongs-on-loop.d.ts +7 -7
  214. package/node/find-mat/get-for-1-prongs-on-loop.js +9 -21
  215. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  216. package/node/find-mat/get-for-2-prongs-on-loop.d.ts +5 -4
  217. package/node/find-mat/get-for-2-prongs-on-loop.js +4 -6
  218. package/node/find-mat/get-for-2-prongs-on-loop.js.map +1 -1
  219. package/node/find-mat/get-meta.d.ts +3 -3
  220. package/node/find-mat/get-meta.js +13 -12
  221. package/node/find-mat/get-meta.js.map +1 -1
  222. package/node/find-mat/get-sharp-corners.d.ts +3 -3
  223. package/node/find-mat/get-sharp-corners.js +2 -3
  224. package/node/find-mat/get-sharp-corners.js.map +1 -1
  225. package/node/find-mat/mat-options.d.ts +15 -15
  226. package/node/find-mat/mat-options.js +7 -4
  227. package/node/find-mat/mat-options.js.map +1 -1
  228. package/node/floyd-warshall/floyd-warshall.js +1 -1
  229. package/node/floyd-warshall/floyd-warshall.js.map +1 -1
  230. package/node/floyd-warshall/get-graph.js +2 -2
  231. package/node/floyd-warshall/get-graph.js.map +1 -1
  232. package/node/floyd-warshall/get-hole-closer-pairs.js +6 -6
  233. package/node/floyd-warshall/get-hole-closer-pairs.js.map +1 -1
  234. package/node/geometry/circle.d.ts +1 -0
  235. package/node/geometry/circle.js +1 -0
  236. package/node/geometry/circle.js.map +1 -1
  237. package/node/geometry/get-closest-square-distance-to-rect.js +1 -4
  238. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  239. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js +2 -1
  240. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  241. package/node/index.d.ts +1 -7
  242. package/node/index.js +1 -5
  243. package/node/index.js.map +1 -1
  244. package/node/loop/get-max-coordinate.d.ts +2 -1
  245. package/node/loop/get-max-coordinate.js +6 -8
  246. package/node/loop/get-max-coordinate.js.map +1 -1
  247. package/node/mat/add-to-cp-tree.d.ts +3 -3
  248. package/node/mat/add-to-cp-tree.js +5 -5
  249. package/node/mat/add-to-cp-tree.js.map +1 -1
  250. package/node/mat/create-new-cp-trees.d.ts +10 -0
  251. package/node/mat/create-new-cp-trees.js +24 -0
  252. package/node/mat/create-new-cp-trees.js.map +1 -0
  253. package/node/mat/curve-piece.d.ts +1 -1
  254. package/node/mat/get-boundary-piece-beziers.d.ts +3 -3
  255. package/node/mat/get-boundary-piece-beziers.js +125 -20
  256. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  257. package/node/mat/get-branches.d.ts +1 -1
  258. package/node/mat/get-closeby-cp-if-exist.d.ts +5 -5
  259. package/node/mat/get-closeby-cp-if-exist.js +6 -5
  260. package/node/mat/get-closeby-cp-if-exist.js.map +1 -1
  261. package/node/mat/get-cp-node-to-left-or-same.d.ts +4 -4
  262. package/node/mat/get-cp-node-to-left-or-same.js +4 -3
  263. package/node/mat/get-cp-node-to-left-or-same.js.map +1 -1
  264. package/node/mat/get-largest-vertex.d.ts +1 -1
  265. package/node/mat/get-largest-vertex.js +1 -1
  266. package/node/mat/get-largest-vertex.js.map +1 -1
  267. package/node/mat/mat-meta.d.ts +4 -5
  268. package/node/mat/mat.d.ts +5 -5
  269. package/node/mat/simplify-mat.js +5 -4
  270. package/node/mat/simplify-mat.js.map +1 -1
  271. package/node/mat/trim-mat.d.ts +3 -2
  272. package/node/mat/trim-mat.js +5 -3
  273. package/node/mat/trim-mat.js.map +1 -1
  274. package/node/point-on-shape/calc-pos-order.d.ts +8 -5
  275. package/node/point-on-shape/calc-pos-order.js +7 -7
  276. package/node/point-on-shape/calc-pos-order.js.map +1 -1
  277. package/node/point-on-shape/compare-poss.d.ts +4 -0
  278. package/node/point-on-shape/compare-poss.js +12 -0
  279. package/node/point-on-shape/compare-poss.js.map +1 -1
  280. package/node/point-on-shape/get-osculating-circle.d.ts +5 -6
  281. package/node/point-on-shape/get-osculating-circle.js +18 -20
  282. package/node/point-on-shape/get-osculating-circle.js.map +1 -1
  283. package/node/point-on-shape/get-pos-corner.d.ts +18 -4
  284. package/node/point-on-shape/get-pos-corner.js +6 -6
  285. package/node/point-on-shape/get-pos-corner.js.map +1 -1
  286. package/node/point-on-shape/is-pos-corner.d.ts +3 -2
  287. package/node/point-on-shape/is-pos-corner.js.map +1 -1
  288. package/node/point-on-shape/is-pos-sharp-corner.d.ts +1 -12
  289. package/node/point-on-shape/is-pos-sharp-corner.js +4 -5
  290. package/node/point-on-shape/is-pos-sharp-corner.js.map +1 -1
  291. package/node/point-on-shape/point-on-shape.d.ts +39 -6
  292. package/node/point-on-shape/pos-to-human-string.d.ts +1 -1
  293. package/node/point-on-shape/pos-to-human-string.js.map +1 -1
  294. package/node/point-on-shape/to-p.d.ts +9 -0
  295. package/node/point-on-shape/to-p.js +13 -0
  296. package/node/point-on-shape/to-p.js.map +1 -0
  297. package/node/sat/add-debug-info.d.ts +2 -1
  298. package/node/sat/add-debug-info.js +2 -1
  299. package/node/sat/add-debug-info.js.map +1 -1
  300. package/node/sat/cull-non-cycles.d.ts +2 -1
  301. package/node/sat/cull-non-cycles.js +5 -3
  302. package/node/sat/cull-non-cycles.js.map +1 -1
  303. package/node/sat/cull.js +3 -4
  304. package/node/sat/cull.js.map +1 -1
  305. package/node/sat/get-leaves.d.ts +1 -1
  306. package/node/sat/get-leaves.js +1 -2
  307. package/node/sat/get-leaves.js.map +1 -1
  308. package/node/sat/get-sat-culls.d.ts +2 -2
  309. package/node/sat/get-sat-culls.js +3 -3
  310. package/node/sat/get-sat-culls.js.map +1 -1
  311. package/node/sat/to-scale-axis.d.ts +1 -1
  312. package/node/sat/to-scale-axis.js +2 -2
  313. package/node/sat/to-scale-axis.js.map +1 -1
  314. package/node/svg/get-loop-bounds.d.ts +7 -7
  315. package/node/svg/get-loop-bounds.js +33 -70
  316. package/node/svg/get-loop-bounds.js.map +1 -1
  317. package/node/svg/get-min-y-pos.d.ts +2 -3
  318. package/node/svg/get-min-y-pos.js +2 -2
  319. package/node/svg/get-min-y-pos.js.map +1 -1
  320. package/node/svg/get-shape-bounds.d.ts +6 -6
  321. package/node/svg/get-shape-bounds.js +6 -6
  322. package/node/svg/get-shape-bounds.js.map +1 -1
  323. package/node/utils/mutable.d.ts +4 -0
  324. package/node/utils/mutable.js +2 -0
  325. package/node/utils/mutable.js.map +1 -0
  326. package/node/utils/sum.js.map +1 -1
  327. package/node/utils/time-function-call.d.ts +14 -0
  328. package/node/utils/time-function-call.js +32 -0
  329. package/node/utils/time-function-call.js.map +1 -0
  330. package/node/vertex/remove-vertex.d.ts +1 -0
  331. package/node/vertex/remove-vertex.js +1 -1
  332. package/node/vertex/remove-vertex.js.map +1 -1
  333. package/package.json +6 -9
  334. package/src/add-n-prong.ts/join-spokes.ts +8 -6
  335. package/src/closest-boundary-point/{cull-bezier-pieces.ts → cull-bezier-pieces-1.ts} +7 -7
  336. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +15 -14
  337. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +2 -2
  338. package/src/closest-boundary-point/foot-and-endpoint-info.ts +5 -10
  339. package/src/closest-boundary-point/get-best-distance-squared.ts +18 -15
  340. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +25 -31
  341. package/src/closest-boundary-point/get-potential-closest-points-on-curve-certified.ts +41 -102
  342. package/src/closest-boundary-point/root-interval-to-distance-squared-interval.ts +7 -12
  343. package/src/corner/compare-curvatures-at-interface.ts +1 -1
  344. package/src/corner/corner.ts +7 -6
  345. package/src/corner/get-corner.ts +4 -11
  346. package/src/corner/get-interface-ccw.ts +5 -5
  347. package/src/cp-node/cp-node-fs.ts +0 -5
  348. package/src/cp-node/cp-node.ts +12 -10
  349. package/src/cp-node/fs/add-distance-from.ts +1 -2
  350. package/src/cp-node/fs/clone.ts +2 -1
  351. package/src/cp-node/fs/cp-node-comparator.ts +2 -2
  352. package/src/cp-node/fs/enhance-cp-node.ts +5 -5
  353. package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +2 -2
  354. package/src/cp-node/fs/get-cp-node-ordering.ts +4 -4
  355. package/src/cp-node/fs/get-edge-direction.ts +3 -3
  356. package/src/cp-node/fs/get-hole-closers.ts +1 -1
  357. package/src/cp-node/fs/get-implied-boundary-bezier-between.ts +2 -2
  358. package/src/cp-node/fs/get-mat-curve-between.ts +8 -6
  359. package/src/cp-node/fs/get-salience.ts +4 -4
  360. package/src/cp-node/fs/insert-cp-node.ts +12 -12
  361. package/src/cp-node/fs/is-one-prong.ts +3 -14
  362. package/src/cp-node/fs/is-order-correct.ts +8 -10
  363. package/src/cp-node/fs/is-sharp.ts +1 -1
  364. package/src/cp-node/fs/remove-cp-node.ts +4 -6
  365. package/src/cp-node/fs/traverse-cp.ts +1 -1
  366. package/src/cp-node/fs/traverse-vertices.ts +1 -2
  367. package/src/cp-node/stringification/cp-node-stringifyable.ts +7 -16
  368. package/src/cp-node/stringification/from-stringifyable.ts +6 -6
  369. package/src/cp-node/stringification/to-stringifyable.ts +5 -9
  370. package/src/debug/debug-elem-types.ts +2 -3
  371. package/src/{mat → debug}/elem-type-two-prong.ts +1 -1
  372. package/src/debug/functions/check-ordering.ts +13 -17
  373. package/src/debug/functions/cmp-cp-on-delta.ts +3 -3
  374. package/src/debug/functions/draw-elem/draw-branch.ts +1 -3
  375. package/src/debug/functions/draw-elem/draw-cp-node.ts +5 -6
  376. package/src/debug/functions/draw-elem/draw-elem.ts +1 -5
  377. package/src/debug/functions/draw-elem/draw-leaves.ts +5 -5
  378. package/src/debug/functions/draw-elem/draw-mat.ts +2 -5
  379. package/src/debug/functions/draw-elem/draw-max-vertex.ts +3 -3
  380. package/src/debug/functions/draw-elem/draw-min-y.ts +2 -2
  381. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +17 -3
  382. package/src/debug/functions/draw-elem/draw-one-prong.ts +10 -8
  383. package/src/debug/functions/draw-elem/draw-three-prong.ts +5 -5
  384. package/src/debug/functions/draw-elem/draw-two-prong.ts +4 -3
  385. package/src/debug/functions/draw-elem/draw-vertex.ts +2 -5
  386. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +2 -2
  387. package/src/debug/functions/general.ts +1 -1
  388. package/src/debug/functions/three-prong.ts +220 -220
  389. package/src/error-analysis/gamma.ts +9 -2
  390. package/src/find-2-prong/add-1-prong.ts +8 -8
  391. package/src/find-2-prong/add-2-prong.ts +64 -58
  392. package/src/find-2-prong/calc-seperation-tolerance.ts +4 -8
  393. package/src/find-2-prong/cull-bezier-pieces.ts +41 -21
  394. package/src/find-2-prong/find-2-prong.ts +105 -153
  395. package/src/find-2-prong/find-and-add-2-prong.ts +23 -23
  396. package/src/find-2-prong/find-and-add-2-prongs-on-all-loops.ts +4 -6
  397. package/src/find-2-prong/find-and-add-2-prongs.ts +44 -29
  398. package/src/find-2-prong/find-and-add-hole-closing-2-prongs.ts +15 -15
  399. package/src/find-2-prong/get-initial-bezier-pieces.ts +21 -24
  400. package/src/find-2-prong/get-initial-x.ts +52 -0
  401. package/src/find-2-prong/get-medial/antipodal-point.ts +12 -0
  402. package/src/find-2-prong/get-medial/get-antipodal-points.ts +63 -0
  403. package/src/find-2-prong/get-medial/get-closest-points.ts +211 -0
  404. package/src/find-2-prong/reduce-radius.ts +38 -61
  405. package/src/find-2-prong/x-for-debugging.ts +9 -9
  406. package/src/{find-3-prong.ts → find-3-prong}/calc-better-x.ts +23 -13
  407. package/src/{find-3-prong.ts → find-3-prong}/calc-initial-3-prong-center.ts +12 -15
  408. package/src/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.ts +64 -51
  409. package/src/find-3-prong/find-3-prong.ts +52 -0
  410. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.ts +20 -6
  411. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.ts +7 -23
  412. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.ts +6 -4
  413. package/src/{find-3-prong.ts → find-3-prong}/get-closest-points.ts +6 -5
  414. package/src/find-3-prong/three-prong-info.ts +13 -0
  415. package/src/find-3-prong/timed-cc.ts +9 -0
  416. package/src/find-mat/clip-options.ts +11 -16
  417. package/src/find-mat/create-initial-cp-tree.ts +29 -34
  418. package/src/find-mat/find-mat.ts +15 -23
  419. package/src/find-mat/find-mats.ts +11 -13
  420. package/src/find-mat/fix-ordering.ts +58 -58
  421. package/src/find-mat/get-dull-corners-on-loop.ts +12 -10
  422. package/src/find-mat/get-for-1-prongs-on-loop.ts +11 -33
  423. package/src/find-mat/get-for-2-prongs-on-loop.ts +9 -12
  424. package/src/find-mat/get-meta.ts +18 -16
  425. package/src/find-mat/get-sharp-corners.ts +7 -8
  426. package/src/find-mat/mat-options.ts +22 -19
  427. package/src/floyd-warshall/floyd-warshall.ts +1 -1
  428. package/src/floyd-warshall/get-graph.ts +2 -2
  429. package/src/floyd-warshall/get-hole-closer-pairs.ts +6 -6
  430. package/src/geometry/circle.ts +1 -0
  431. package/src/geometry/get-closest-square-distance-to-rect.ts +3 -8
  432. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +3 -2
  433. package/src/index.ts +2 -8
  434. package/src/loop/get-max-coordinate.ts +8 -9
  435. package/src/mat/add-to-cp-tree.ts +10 -11
  436. package/src/mat/clone-mat.ts +8 -4
  437. package/src/mat/clone-meta.ts +22 -10
  438. package/src/mat/create-new-cp-trees.ts +35 -0
  439. package/src/mat/curve-piece.ts +1 -1
  440. package/src/mat/get-boundary-piece-beziers.ts +153 -37
  441. package/src/mat/get-branches.ts +1 -1
  442. package/src/mat/get-closeby-cp-if-exist.ts +11 -12
  443. package/src/mat/get-cp-node-to-left-or-same.ts +9 -8
  444. package/src/mat/get-largest-3-prong.ts +2 -2
  445. package/src/mat/get-largest-vertex.ts +2 -2
  446. package/src/mat/mat-meta.ts +5 -4
  447. package/src/mat/mat.ts +5 -5
  448. package/src/mat/simplify-mat.ts +5 -4
  449. package/src/mat/trim-mat.ts +6 -4
  450. package/src/point-on-shape/calc-pos-order.ts +10 -11
  451. package/src/point-on-shape/compare-poss.ts +11 -1
  452. package/src/point-on-shape/get-osculating-circle.ts +26 -28
  453. package/src/point-on-shape/get-pos-corner.ts +14 -12
  454. package/src/point-on-shape/is-pos-corner.ts +1 -4
  455. package/src/point-on-shape/is-pos-dull-corner.ts +9 -9
  456. package/src/point-on-shape/is-pos-quite-dull-corner.ts +7 -6
  457. package/src/point-on-shape/is-pos-quite-sharp-corner.ts +7 -6
  458. package/src/point-on-shape/is-pos-sharp-corner.ts +6 -5
  459. package/src/point-on-shape/point-on-shape.ts +44 -6
  460. package/src/point-on-shape/pos-to-human-string.ts +4 -2
  461. package/src/point-on-shape/to-p.ts +19 -0
  462. package/src/sat/add-debug-info.ts +3 -3
  463. package/src/sat/cull-non-cycles.ts +8 -6
  464. package/src/sat/cull.ts +7 -8
  465. package/src/sat/get-leaves.ts +2 -4
  466. package/src/sat/get-sat-culls.ts +6 -5
  467. package/src/sat/to-scale-axis.ts +4 -5
  468. package/src/svg/get-loop-bounds.ts +61 -86
  469. package/src/svg/get-min-y-pos.ts +3 -4
  470. package/src/svg/get-shape-bounds.ts +12 -12
  471. package/src/sweep-line/are-boxes-intersecting.ts +3 -2
  472. package/src/utils/mutable.ts +7 -0
  473. package/src/utils/rad-to-deg.ts +1 -1
  474. package/src/utils/smart-log.ts +20 -0
  475. package/src/utils/sum.ts +3 -1
  476. package/src/utils/time-function-call.ts +53 -0
  477. package/src/vertex/remove-vertex.ts +1 -3
  478. package/wallaby.mjs +1 -0
  479. package/.eslintrc.cjs +0 -69
  480. package/__tests__/cp-node/fs/get-avg-speed.spec.ts +0 -7
  481. package/__tests__/cp-node/fs/get-smoothed-speed.spec.ts +0 -7
  482. package/__tests__/cp-node/fs/get-smoothed.spec.ts +0 -7
  483. package/__tests__/cp-node/fs/get-speed.spec.ts +0 -7
  484. package/__tests__/cp-node/fs/is-order-correct.spec.ts +0 -7
  485. package/node/bezier/fit-quads-to-cubic.d.ts +0 -19
  486. package/node/bezier/fit-quads-to-cubic.js +0 -83
  487. package/node/bezier/fit-quads-to-cubic.js.map +0 -1
  488. package/node/bezier/total-curvature.d.ts +0 -14
  489. package/node/bezier/total-curvature.js +0 -5
  490. package/node/bezier/total-curvature.js.map +0 -1
  491. package/node/bezier/total-length.d.ts +0 -14
  492. package/node/bezier/total-length.js +0 -5
  493. package/node/bezier/total-length.js.map +0 -1
  494. package/node/closest-boundary-point/cull-bezier-pieces.d.ts +0 -10
  495. package/node/closest-boundary-point/cull-bezier-pieces.js.map +0 -1
  496. package/node/closest-boundary-point/dd-deflate-with-running-error.d.ts +0 -25
  497. package/node/closest-boundary-point/dd-deflate-with-running-error.js +0 -68
  498. package/node/closest-boundary-point/dd-deflate-with-running-error.js.map +0 -1
  499. package/node/closest-boundary-point/get-p-from-box.d.ts +0 -3
  500. package/node/closest-boundary-point/get-p-from-box.js +0 -11
  501. package/node/closest-boundary-point/get-p-from-box.js.map +0 -1
  502. package/node/contact-point/contact-point.d.ts +0 -26
  503. package/node/contact-point/contact-point.js +0 -22
  504. package/node/contact-point/contact-point.js.map +0 -1
  505. package/node/cp-node/fs/get-smoothed-speed.d.ts +0 -14
  506. package/node/cp-node/fs/get-smoothed-speed.js +0 -75
  507. package/node/cp-node/fs/get-smoothed-speed.js.map +0 -1
  508. package/node/cp-node/fs/get-speed.d.ts +0 -15
  509. package/node/cp-node/fs/get-speed.js +0 -39
  510. package/node/cp-node/fs/get-speed.js.map +0 -1
  511. package/node/debug/cp-node-for-debugging.d.ts +0 -11
  512. package/node/debug/cp-node-for-debugging.js +0 -2
  513. package/node/debug/cp-node-for-debugging.js.map +0 -1
  514. package/node/debug/functions/draw-elem/draw-speed.d.ts +0 -4
  515. package/node/debug/functions/draw-elem/draw-speed.js +0 -21
  516. package/node/debug/functions/draw-elem/draw-speed.js.map +0 -1
  517. package/node/find-2-prong/find-and-add-2-prong.d.ts +0 -11
  518. package/node/find-2-prong/find-and-add-2-prong.js +0 -19
  519. package/node/find-2-prong/find-and-add-2-prong.js.map +0 -1
  520. package/node/find-2-prong/find-equidistant-point-on-line-dd.d.ts +0 -10
  521. package/node/find-2-prong/find-equidistant-point-on-line-dd.js +0 -56
  522. package/node/find-2-prong/find-equidistant-point-on-line-dd.js.map +0 -1
  523. package/node/find-3-prong.ts/calc-better-x.js.map +0 -1
  524. package/node/find-3-prong.ts/calc-initial-3-prong-center.d.ts +0 -13
  525. package/node/find-3-prong.ts/calc-initial-3-prong-center.js +0 -27
  526. package/node/find-3-prong.ts/calc-initial-3-prong-center.js.map +0 -1
  527. package/node/find-3-prong.ts/find-3-prong-for-delta3s.d.ts +0 -22
  528. package/node/find-3-prong.ts/find-3-prong-for-delta3s.js.map +0 -1
  529. package/node/find-3-prong.ts/find-3-prong.d.ts +0 -16
  530. package/node/find-3-prong.ts/find-3-prong.js.map +0 -1
  531. package/node/find-3-prong.ts/find-and-add-3-prong.js.map +0 -1
  532. package/node/find-3-prong.ts/find-and-add-3-prongs-on-loop.js.map +0 -1
  533. package/node/find-3-prong.ts/find-and-add-3-prongs.js.map +0 -1
  534. package/node/find-3-prong.ts/get-closest-points.d.ts +0 -9
  535. package/node/find-3-prong.ts/get-closest-points.js.map +0 -1
  536. package/node/mat/connect-hole-closers.d.ts +0 -3
  537. package/node/mat/connect-hole-closers.js +0 -5
  538. package/node/mat/connect-hole-closers.js.map +0 -1
  539. package/node/mat/create-new-cp-tree.d.ts +0 -9
  540. package/node/mat/create-new-cp-tree.js +0 -23
  541. package/node/mat/create-new-cp-tree.js.map +0 -1
  542. package/node/memoize-primitive.d.ts +0 -11
  543. package/node/memoize-primitive.js +0 -25
  544. package/node/memoize-primitive.js.map +0 -1
  545. package/node/point-on-shape/create-pos.d.ts +0 -4
  546. package/node/point-on-shape/create-pos.js +0 -11
  547. package/node/point-on-shape/create-pos.js.map +0 -1
  548. package/node/point-on-shape/is-pos-quite-sharp-corner.d.ts +0 -17
  549. package/node/point-on-shape/is-pos-quite-sharp-corner.js +0 -14
  550. package/node/point-on-shape/is-pos-quite-sharp-corner.js.map +0 -1
  551. package/src/bezier/fit-quads-to-cubic.ts +0 -103
  552. package/src/bezier/total-curvature.ts +0 -8
  553. package/src/bezier/total-length.ts +0 -8
  554. package/src/closest-boundary-point/closest-points-on-curve-precise.ts +0 -75
  555. package/src/closest-boundary-point/closest-points-on-curve.ts +0 -72
  556. package/src/closest-boundary-point/dd-deflate-with-running-error.ts +0 -88
  557. package/src/contact-point/contact-point.ts +0 -42
  558. package/src/cp-node/fs/get-avg-speed.ts +0 -31
  559. package/src/cp-node/fs/get-smoothed-speed.ts +0 -97
  560. package/src/cp-node/fs/get-smoothed.ts +0 -62
  561. package/src/cp-node/fs/get-speed.ts +0 -56
  562. package/src/curve/curve.ts +0 -35
  563. package/src/dbscan/dbscan.ts +0 -91
  564. package/src/debug/cp-node-for-debugging.ts +0 -15
  565. package/src/debug/functions/draw-elem/draw-speed.ts +0 -35
  566. package/src/debug/three-prong-for-debugging.ts +0 -58
  567. package/src/debug/two-prong-for-debugging.ts +0 -30
  568. package/src/dijkstra/dijkstra.ts +0 -418
  569. package/src/find-2-prong/find-and-add-2-prongs-on-all-paths.ts +0 -38
  570. package/src/find-2-prong/find-equidistant-point-on-line-dd.ts +0 -77
  571. package/src/find-2-prong/find-equidistant-point-on-line.ts +0 -40
  572. package/src/find-2-prong/pyth-trips.ts +0 -146
  573. package/src/find-3-prong.ts/add-3-prong.ts +0 -113
  574. package/src/find-3-prong.ts/array-set.ts +0 -47
  575. package/src/find-3-prong.ts/find-3-prong.ts +0 -48
  576. package/src/find-3-prong.ts/find-and-add-all-3-prongs.ts +0 -109
  577. package/src/find-mat/add-2-prongs-by-error.ts +0 -122
  578. package/src/find-mat/add-debug-info.ts +0 -93
  579. package/src/find-mat/cp-node-for-insertion.ts +0 -13
  580. package/src/find-mat/get-dull-corners.ts +0 -34
  581. package/src/find-mat/get-half-angles.ts +0 -95
  582. package/src/find-mat/get-size-params.ts +0 -34
  583. package/src/find-mat/get-total-by.ts +0 -27
  584. package/src/get-curve/get-curve-between.ts +0 -80
  585. package/src/get-curve/get-edge-direction.ts +0 -70
  586. package/src/mat/add-to-cp-graph.ts +0 -60
  587. package/src/mat/cmp-cp-on-delta.ts +0 -56
  588. package/src/mat/connect-hole-closers.ts +0 -9
  589. package/src/mat/create-new-cp-tree.ts +0 -32
  590. package/src/mat/get-edges-as-array.ts +0 -18
  591. package/src/mat/get-largest-three-prong.ts +0 -14
  592. package/src/mat/get-neighboring-cps.ts +0 -49
  593. package/src/mat/is-another-cp-closeby.ts +0 -69
  594. package/src/mat/simplify-mat-map-only.ts +0 -110
  595. package/src/memoize-primitive.ts +0 -31
  596. package/src/point-on-shape/create-pos.ts +0 -20
  597. package/src/sat/cull-by-salience.ts +0 -115
  598. package/src/svg/get-extreme.ts +0 -23
  599. package/src/utils/bezier-piece-to-bezier.ts +0 -13
  600. package/src/utils/sleep.ts +0 -7
  601. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.d.ts +0 -0
@@ -1,67 +1,182 @@
1
1
  import type { Curve } from 'flo-boolean';
2
2
  import type { CpNode } from '../cp-node/cp-node.js';
3
3
  import type { CurvePiece } from './curve-piece.js';
4
- import { isPosQuiteSharpCorner } from '../point-on-shape/is-pos-quite-sharp-corner.js';
5
- import { compareCps } from '../contact-point/contact-point.js';
4
+ import { comparePoss } from '../point-on-shape/compare-poss.js';
6
5
 
7
6
 
8
7
  /**
9
- * @internal
10
- * Returns the ordered cubic bezier pieces (i.e a bezier with a t range)
11
- * from the given boundary piece.
8
+ * Returns the ordered bezier pieces between from the given boundary piece.
12
9
  *
13
10
  * @param cpNodes - An ordered pair that represents the start and end points of
14
11
  * the boundary piece
12
+ *
13
+ * @internal
15
14
  */
16
- function getBoundaryPieceBeziers(cpNodes: CpNode[]): CurvePiece[] {
15
+ function getBoundaryPieceBeziers(
16
+ cpNodes: CpNode[]): CurvePiece[] {
17
+
17
18
  let cpThis = cpNodes[0];
18
19
  const cpEnd = cpNodes[1];
19
20
 
20
21
  const curvePieces: CurvePiece[] = [];
21
22
 
23
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
24
+ // later in `find2Prong`; KEEP for possible future use.
25
+ // We have to stich curves together if they're at a hole closer or at the
26
+ // endpoints of a loop to avoid duplicates later within the code; the map
27
+ // is from curves
28
+ // const stichables: Map<Curve, number[]> = new Map();
29
+
22
30
  // As opposed to going around the circle and taking the last exit
23
31
  let goStraight = true;
24
32
  do {
33
+ const posThis = cpThis .pointOnShape;
34
+ const posNext = cpThis.next.pointOnShape;
35
+ const curveThis = posThis.curve;
36
+ const curveNext = posNext.curve;
37
+
25
38
  if (!goStraight) {
26
39
  goStraight = true;
27
- cpThis = cpThis.prevOnCircle; // take last exit
40
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
41
+ // later in `find2Prong`; KEEP for possible future use.
42
+ // const { loop: loopThis } = curveThis;
43
+ // const cpPrevOnCircle = cpThis.prevOnCircle;
44
+ // const curvePrevOnCircle = cpPrevOnCircle.pointOnShape.curve;
45
+ // const { loop: loopNext } = cpPrevOnCircle.pointOnShape.curve;
46
+
47
+
48
+ // if (loopThis !== loopNext) {
49
+ // let idxsThis = stichables.get(curveThis);
50
+ // if (idxsThis === undefined) {
51
+ // idxsThis = [];
52
+ // stichables.set(curveThis, idxsThis);
53
+ // }
54
+ // idxsThis.push(curvePieces.length - 1); // last `CurvePiece` idx
55
+
56
+ // let idxsNext = stichables.get(curvePrevOnCircle);
57
+ // if (idxsNext === undefined) {
58
+ // idxsNext = [];
59
+ // stichables.set(curvePrevOnCircle, idxsNext);
60
+ // }
61
+ // idxsNext.push(curvePieces.length); // upcoming `CurvePiece` idx
62
+ // }
63
+
64
+ // cpThis = cpPrevOnCircle; // take last exit
65
+ cpThis = cpThis.prevOnCircle; // take last exit
28
66
  continue;
29
67
  }
30
68
 
31
69
  goStraight = false;
32
-
33
- const posThis = cpThis .cp.pointOnShape;
34
- const posNext = cpThis.next.cp.pointOnShape;
35
-
36
- if (posNext.curve === posThis.curve &&
37
- isPosQuiteSharpCorner(posThis) &&
38
- isPosQuiteSharpCorner(posNext)) {
39
-
40
- // Do nothing
41
- } else if (posNext.curve === posThis.curve &&
42
- compareCps(cpThis.next.cp, cpThis.cp) > 0) {
43
-
44
- curvePieces.push(
45
- { curve: posThis.curve, ts: [posThis.t, posNext.t] }
46
- );
47
- } else {
48
- curvePieces.push(
49
- { curve: posThis.curve, ts: [posThis.t, 1] }
50
- );
51
-
52
- if (posThis.curve.loop === posNext.curve.loop) {
53
- addSkippedBeziers(
54
- curvePieces,
55
- posThis.curve,
56
- posNext.curve,
57
- posNext.t
58
- );
59
- }
70
+
71
+ if (curveNext === curveThis &&
72
+ comparePoss(posNext, posThis) > 0) {
73
+
74
+ // The boundary stays on the same curve segment *and* the next pos
75
+ // is further along the *linear* boundary. If it is *not* further
76
+ // on the *linear* boundary then this pos precedes the abrupt break
77
+ // in the ordering and next pos comes after the break so the code in
78
+ // the next `else` statement is called to skip over the break.
79
+ // The other case in which `comparePoss(posNext, posThis) <= 0` is
80
+ // possible for hole closers where the oderering of this and next
81
+ // are the same except for `order2`
82
+ curvePieces.push({
83
+ curve: curveThis, ts: [posThis.t, posNext.t]
84
+ });
85
+
86
+ cpThis = cpThis.next;
87
+ continue;
60
88
  }
61
-
89
+
90
+ // The segment crosses a curve boundary because either:
91
+ // 1. `this` and `next` are not on the same curve OR
92
+ // 2. `this` comes after `next` by ordering
93
+ // so split at t = 1.
94
+
95
+ if (curveThis.loop === curveNext.loop) {
96
+ const initialCurvePiece = {
97
+ curve: curveThis, ts: [posThis.t, 1]
98
+ };
99
+ curvePieces.push(initialCurvePiece);
100
+
101
+ // Fill in any curves skipped between the two points.
102
+ addSkippedBeziers(curvePieces, curveThis, curveNext, posNext.t);
103
+
104
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
105
+ // later in `find2Prong`; KEEP for possible future use.
106
+ // const finalCurvePiece = curvePieces[curvePieces.length - 1];
107
+ // if (initialCurvePiece.curve === finalCurvePiece!.curve) {
108
+ // const { ts: tsS } = initialCurvePiece;
109
+ // const { ts: tsE } = finalCurvePiece!;
110
+
111
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
112
+ // // antipodal points later
113
+ // if (tsS[0] === tsE[1]) {
114
+ // initialCurvePiece.ts[0] = tsE[0];
115
+
116
+ // if (curvePieces.length > 1) {
117
+ // curvePieces.pop();
118
+ // }
119
+ // // console.log('was inner closed loop')
120
+ // }
121
+ // }
122
+ }
123
+
62
124
  cpThis = cpThis.next;
63
125
  } while (cpThis !== cpEnd);
64
126
 
127
+ // NOTE❗ Currently removed stichables; we're just checking for duplicates
128
+ // later in `find2Prong`; KEEP for possible future use.
129
+ // if (stichables.size > 0) {
130
+ // for (const [loop,idxs] of stichables.entries()) {
131
+ // if (idxs.length === 2) {
132
+ // const curvePieceS = curvePieces[idxs[0]]!;
133
+ // const curvePieceE = curvePieces[idxs[1]]!;
134
+
135
+ // if (curvePieceS === undefined || curvePieceE === undefined) {
136
+ // console.log(curvePieceS);
137
+ // console.log(curvePieceE);
138
+ // continue;
139
+ // }
140
+
141
+ // const { curve: curveS, ts: tsS } = curvePieceS;
142
+ // const { curve: curveE, ts: tsE } = curvePieceE;
143
+ // if (curveS !== curveE) {
144
+ // continue;
145
+ // }
146
+
147
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
148
+ // // antipodal points later
149
+ // if (tsS[0] === tsE[1]) {
150
+ // curvePieceS.ts[0] = tsE[0];
151
+ // // console.log('was closed loop 1')
152
+ // } else if (tsE[0] === tsS[1]) {
153
+ // curvePieceS.ts[1] = tsE[1];
154
+ // // console.log('was closed loop 2')
155
+ // }
156
+ // if (idxs[0] !== idxs[1]) {
157
+ // curvePieces[idxs[1]] = undefined;
158
+ // }
159
+ // }
160
+ // }
161
+ // }
162
+
163
+ // NOTE❗ The below endcurve check is not enough for specific cases involving
164
+ // multiple hole closers; KEEP for now but must use stichables instead
165
+ // if (curvePieces[0]!.curve === curvePieces[curvePieces.length - 1]!.curve) {
166
+ // const { ts: tsS } = curvePieces[0]!;
167
+ // const { ts: tsE } = curvePieces[curvePieces.length - 1]!;
168
+
169
+ // // If it is a closed loop we must join the endpoints to prevent duplicate
170
+ // // antipodal points later
171
+ // if (tsS[0] === tsE[1]) {
172
+ // curvePieces[0]!.ts[0] = tsE[0];
173
+
174
+ // if (curvePieces.length > 1) {
175
+ // curvePieces.pop();
176
+ // }
177
+ // // console.log('was closed loop')
178
+ // }
179
+ // }
65
180
 
66
181
  return curvePieces;
67
182
  }
@@ -72,11 +187,12 @@ function getBoundaryPieceBeziers(cpNodes: CpNode[]): CurvePiece[] {
72
187
  * Adds pieces of skipped beziers
73
188
  */
74
189
  function addSkippedBeziers(
75
- curvePieces: CurvePiece[],
190
+ curvePieces: (CurvePiece | undefined)[],
76
191
  curveStart: Curve,
77
192
  curveEnd: Curve,
78
193
  t1: number) {
79
194
 
195
+ // Walk forward through the loop until the end curve is reached.
80
196
  let curveThis = curveStart;
81
197
  do {
82
198
  curveThis = curveThis.next;
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getBranch } from '../cp-node/fs/get-branch.js';
3
3
  import { getNonTerminatingOnCircle } from '../cp-node/fs/get-non-terminating-on-circle.js';
4
4
 
@@ -1,11 +1,9 @@
1
- import { LlRbTree } from 'flo-ll-rb-tree';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
3
+ import type { Circle } from '../geometry/circle.js';
4
+ import type { MatMeta } from './mat-meta.js';
2
5
  import { distanceBetween, toUnitVector, fromTo, dot } from 'flo-vector2d';
3
- import { Loop } from 'flo-boolean';
4
- import { CpNode } from '../cp-node/cp-node.js';
5
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
6
- import { Circle } from '../geometry/circle.js';
7
6
  import { getCpNodeToLeftOrSame } from './get-cp-node-to-left-or-same.js';
8
- import { MatMeta } from './mat-meta.js';
9
7
 
10
8
 
11
9
  /** @internal */
@@ -26,16 +24,16 @@ const ANGLE_THRESHOLD = Math.cos(DEGREES * (Math.PI / 180));
26
24
  */
27
25
  function getCloseByCpIfExist(
28
26
  meta: MatMeta,
29
- pos: PointOnShape,
27
+ pos: PrePointOnShape,
30
28
  circle: Circle,
31
29
  order: number,
32
30
  order2: number,
33
31
  forProngCount?: number): CpNode | undefined {
34
32
 
35
- const { cpTrees, maxCoordinate } = meta;
33
+ const { cpTrees, maxCoordPowerOf2 } = meta;
36
34
 
37
- const DISTANCE_THRESHOLD = maxCoordinate * 2e-14;
38
- const DISTANCE_THRESHOLD_2 = DISTANCE_THRESHOLD * 2e-2;
35
+ const DISTANCE_THRESHOLD = 2**(maxCoordPowerOf2 - 40); // approx. 1e-9 for 1024 x 1024 shapes
36
+ const DISTANCE_THRESHOLD_2 = 2**(maxCoordPowerOf2 - 46);
39
37
 
40
38
  const cpTree = cpTrees.get(pos.curve.loop)!;
41
39
  const cur = getCpNodeToLeftOrSame(cpTree, pos, order, order2);
@@ -44,14 +42,15 @@ function getCloseByCpIfExist(
44
42
 
45
43
  const { p, t } = pos;
46
44
  for (const cpNode of cpNodes) {
47
- const pos2 = cpNode.cp.pointOnShape;
45
+ const pos2 = cpNode.pointOnShape;
48
46
  const p2 = pos2.p;
49
47
  const d = distanceBetween(p,p2);
50
48
  if (d > DISTANCE_THRESHOLD) {
51
49
  continue;
52
50
  }
51
+ // return cpNode;
53
52
 
54
- const v1 = toUnitVector(fromTo(p2, cpNode.cp.circle.center));
53
+ const v1 = toUnitVector(fromTo(p2, cpNode.pointOnShape.circle.center));
55
54
  const v2 = toUnitVector(fromTo(p, circle.center));
56
55
  const cosTheta = dot(v1,v2);
57
56
 
@@ -1,6 +1,6 @@
1
- import { LlRbTree } from 'flo-ll-rb-tree';
2
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
3
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
2
+ import type { CpNode } from '../cp-node/cp-node.js';
3
+ import { RbTree } from 'flo-ll-rb-tree';
4
4
 
5
5
 
6
6
  /**
@@ -17,13 +17,13 @@ import { CpNode } from '../cp-node/cp-node.js';
17
17
  * @param order2
18
18
  */
19
19
  function getCpNodeToLeftOrSame(
20
- cpTree: LlRbTree<CpNode>,
21
- pos: PointOnShape,
20
+ cpTree: RbTree<CpNode>,
21
+ pos: PrePointOnShape,
22
22
  order: number,
23
23
  order2: number): CpNode | undefined {
24
24
 
25
- const cp = { pointOnShape: pos, order, order2 };
26
- const cps = cpTree.findBounds({ cp } as unknown as CpNode);
25
+ const pointOnShape = { ...pos, order, order2 };
26
+ const cps = cpTree.findBounds({ pointOnShape } as CpNode);
27
27
 
28
28
  if (cps[0] === undefined && cps[1] === undefined) {
29
29
  // The tree is still empty
@@ -33,7 +33,8 @@ function getCpNodeToLeftOrSame(
33
33
  if (cps[0] === undefined || cps[1] === undefined) {
34
34
  // Smaller than all -> cptree.min() === cps[1].data OR
35
35
  // Larger than all -> cptree.max() === cps[0].data
36
- return cpTree.max(cpTree.root);
36
+ // return cpTree.max(cpTree.root);
37
+ return cpTree.getMaxNode()?.datum;
37
38
  }
38
39
 
39
40
  return cps[0].datum;
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
3
3
  import { getRealProngCount } from '../cp-node/fs/get-real-prong-count.js';
4
4
 
@@ -11,7 +11,7 @@ function getLargest3Prong(cpNode: CpNode) {
11
11
  if (cpNodes.length === 0) { return undefined; }
12
12
 
13
13
  return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
14
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
14
+ return maxCpNode.pointOnShape.circle.radius >= cpNode.pointOnShape.circle.radius
15
15
  ? maxCpNode
16
16
  : cpNode
17
17
  }, cpNodes[0]);
@@ -1,4 +1,4 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
2
  import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
3
3
 
4
4
 
@@ -7,7 +7,7 @@ function getLargestVertex(cpNode: CpNode) {
7
7
  const cpNodes = getAllOnLoop(cpNode);
8
8
 
9
9
  return cpNodes.reduce(function(maxCpNode: CpNode, cpNode: CpNode) {
10
- return maxCpNode.cp.circle.radius >= cpNode.cp.circle.radius
10
+ return maxCpNode.pointOnShape.circle.radius >= cpNode.pointOnShape.circle.radius
11
11
  ? maxCpNode
12
12
  : cpNode
13
13
  }, cpNodes[0]);
@@ -2,11 +2,12 @@ import type { Loop } from 'flo-boolean';
2
2
  import type { CpNode } from '../cp-node/cp-node.js';
3
3
  import type { Curve } from 'flo-boolean';
4
4
  import type { TriMap } from '../utils/tri-map.js';
5
- import { LlRbTree } from 'flo-ll-rb-tree';
5
+ import { RbTree } from 'flo-ll-rb-tree';
6
6
 
7
7
 
8
8
  interface MatMeta {
9
- readonly maxCoordinate: number;
9
+ /** The minimum power of 2 such that `2**maxCoordPowerOf2 >= "the max coordinate"` */
10
+ readonly maxCoordPowerOf2: number;
10
11
  readonly squaredDiagonalLength: number;
11
12
  readonly looseBoundingBoxes: number[][][];
12
13
  readonly tightBoundingBoxes: number[][][];
@@ -22,9 +23,9 @@ interface MatMeta {
22
23
  * `CpNode`s of the MAT by their compare order, i.e. their cyclic order
23
24
  * around the shape boundary.
24
25
  */
25
- readonly cpTrees: Map<Loop, LlRbTree<CpNode>>;
26
+ readonly cpTrees: Map<Loop, RbTree<CpNode>>;
26
27
  /** A map from a bezier and t value to a `PointOnShape` */
27
- readonly pointToCpNode: TriMap<Loop,number,number,CpNode>;
28
+ // readonly pointToCpNode: TriMap<Loop,number,number,CpNode>;
28
29
  /**
29
30
  * Stores the last insert id so each `CpNode` can have a unique id for
30
31
  * debugging purposes
package/src/mat/mat.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
2
- import { MatMeta } from './mat-meta.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { MatMeta } from './mat-meta.js';
3
3
 
4
4
 
5
5
  /**
@@ -12,15 +12,15 @@ import { MatMeta } from './mat-meta.js';
12
12
  */
13
13
  interface Mat {
14
14
  /** A complete representation of the MAT. See `CpNode`. */
15
- cpNode: CpNode;
15
+ readonly cpNode: CpNode;
16
16
  /**
17
17
  * Stores additional info about the shape that could be useful for various
18
18
  * purposes in post-processing.
19
19
  *
20
20
  * Most meta items have a CpNode property to link back to the MAT.
21
21
  */
22
- meta: MatMeta;
22
+ readonly meta: MatMeta;
23
23
  }
24
24
 
25
25
 
26
- export { Mat }
26
+ export type { Mat }
@@ -5,16 +5,17 @@ import { removeVertex } from '../vertex/remove-vertex.js';
5
5
  import { getBranches } from './get-branches.js';
6
6
  import { getMatCurveToNext } from '../cp-node/fs/get-mat-curve-to-next.js';
7
7
  import { getMatCurveBetween } from '../cp-node/fs/get-mat-curve-between.js';
8
- import { createNewCpTree } from './create-new-cp-tree.js';
8
+ import { createNewCpTrees } from './create-new-cp-trees.js';
9
9
  import { clone } from '../cp-node/fs/clone.js';
10
10
  import { findFirst } from '../cp-node/fs/find-first.js';
11
11
  import { isTerminating } from '../cp-node/fs/is-terminating.js';
12
12
  import { isVertex } from '../cp-node/fs/is-vertex.js';
13
13
  import { getProngCount } from '../cp-node/fs/get-prong-count.js';
14
14
 
15
+ const { max } = Math;
15
16
 
16
17
 
17
- // TODO2 could be made faster by binary "search" on hausdorff curves
18
+ // FUTURE could be made faster by binary "search" on hausdorff curves?
18
19
  /**
19
20
  * Returns a new simplified MAT of the given one by replacing the piecewise
20
21
  * quad beziers composing the MAT with fewer ones to within a given tolerance.
@@ -86,7 +87,7 @@ function simplifyMat(
86
87
  cpNode,
87
88
  meta: {
88
89
  ...mat.meta,
89
- cpTrees: createNewCpTree(cpNode)
90
+ cpTrees: createNewCpTrees(cpNode)
90
91
  }
91
92
  }
92
93
  }
@@ -108,7 +109,7 @@ function getTotalHausdorffDistance(
108
109
  ));
109
110
  }
110
111
 
111
- return Math.max(...hds);
112
+ return max(...hds);
112
113
  }
113
114
 
114
115
 
@@ -1,15 +1,17 @@
1
- import { Mat } from './mat.js';
2
- import { createNewCpTree } from './create-new-cp-tree.js';
1
+ import type { Mat } from './mat.js';
2
+ import { createNewCpTrees } from './create-new-cp-trees.js';
3
3
  import { cullNonCycles } from '../sat/cull-non-cycles.js';
4
4
  import { clone } from '../cp-node/fs/clone.js';
5
5
 
6
6
 
7
7
  /**
8
8
  * Trims the given Medial Axis Transform so that only cycles remain. Similar to
9
- * toScaleAxis(mat, Number.POSITIVE_INFINITY).
9
+ * toScaleAxis(mat, Infinity).
10
+ *
10
11
  * @param mat The MAT to trim.
11
12
  */
12
13
  function trimMat(mat: Mat): Mat {
14
+ // FUTURE - clone entire `Mat` instead (the function already exists)
13
15
  const cpNode = cullNonCycles(clone(mat.cpNode));
14
16
 
15
17
  if (!cpNode) { return undefined!; }
@@ -18,7 +20,7 @@ function trimMat(mat: Mat): Mat {
18
20
  cpNode,
19
21
  meta: {
20
22
  ...mat.meta,
21
- cpTrees: createNewCpTree(cpNode)
23
+ cpTrees: createNewCpTrees(cpNode)
22
24
  }
23
25
  }
24
26
  }
@@ -1,31 +1,30 @@
1
+ import type { Curve } from "flo-boolean";
1
2
  import { dot, fromTo, rotateNeg90Degrees, toUnitVector } from "flo-vector2d";
2
- import { Circle } from "../geometry/circle.js";
3
- import { PointOnShape } from "./point-on-shape.js";
4
3
  import { isPosCorner } from './is-pos-corner.js';
5
- import { getPosCorner } from './get-pos-corner.js';
6
-
4
+ import { getPosCorner$ } from './get-pos-corner.js';
7
5
 
8
6
 
9
7
  /**
10
- * @internal
11
- *
12
8
  * Calculates the order (to distinguish between points lying on top of each
13
9
  * other) of the contact point if it is a dull corner.
14
10
  *
15
11
  * @param circle
16
12
  * @param pos
13
+ *
14
+ * @internal
17
15
  */
18
16
  function calcPosOrder(
19
- circle: Circle,
20
- pos: PointOnShape): number {
17
+ circleCenter: number[],
18
+ pos: { t: number, curve: Curve, p: number[] }): number {
21
19
 
22
20
  if (!isPosCorner(pos)) { return 0; }
23
- if (!getPosCorner(pos).isDull) { return 0; }
24
21
 
25
- const corner = getPosCorner(pos);
22
+ const corner = getPosCorner$(pos);
23
+
24
+ if (!corner.isDull) { return 0; }
26
25
 
27
26
  const n = rotateNeg90Degrees(corner.tangents[0]);
28
- const v = toUnitVector( fromTo(pos.p, circle.center) );
27
+ const v = toUnitVector( fromTo(pos.p, circleCenter) );
29
28
 
30
29
  return -dot(n, v);
31
30
  }
@@ -3,9 +3,13 @@ import { PointOnShape } from "./point-on-shape.js";
3
3
 
4
4
  /**
5
5
  * Compares two `PointOnShape`s according to their cyclic ordering imposed
6
- * by their relative positions on the shape boundary.
6
+ * by their relative positions on the shape boundary.
7
+ *
8
+ * * Returns a +tive value if `a` is "further along" the loop
9
+ *
7
10
  * @param a The first `PointOnShape`.
8
11
  * @param b The second `PointOnShape`.
12
+ *
9
13
  * @internal
10
14
  */
11
15
  function comparePoss(
@@ -18,6 +22,12 @@ function comparePoss(
18
22
  if (res !== 0) { return res; }
19
23
 
20
24
  res = a.t - b.t;
25
+ if (res !== 0) { return res; }
26
+
27
+ res = a.order - b.order;
28
+ if (res !== 0) { return res; }
29
+
30
+ res = a.order2 - b.order2;
21
31
 
22
32
  return res;
23
33
  }
@@ -1,41 +1,39 @@
1
- import { tangentExact, ddCurvature } from 'flo-bezier3';
2
- import { Circle } from '../geometry/circle.js';
3
- import { PointOnShape } from './point-on-shape.js';
1
+ import type { PrePointOnShape } from './point-on-shape.js';
2
+ import { ddCurvature } from 'flo-bezier3';
4
3
 
4
+ const { sqrt } = Math;
5
5
 
6
6
 
7
7
  /**
8
8
  * Returns the osculating circle at this point of the curve.
9
9
  *
10
- * @param minCurvature If not Number.POSITIVE_INFINITY then the
11
- * circle radius will be limited to this value.
12
- * @param pos The `PointOnShape` identifying the point.
10
+ * @param minCurvature if not `Infinity` then the circle radius will be limited
11
+ * to this value
12
+ * @param pos the `PointOnShape` identifying the point
13
13
  * @param useMaxRadius
14
14
  */
15
15
  function getOsculatingCircle(
16
- minCurvature: number,
17
- pos: PointOnShape,
18
- // pos: { p: number[], t: number },
19
- useMaxRadius = false): Circle {
20
-
21
- const ps = pos.curve.ps;
22
- const { p, t } = pos;
23
-
24
- let k = -ddCurvature(ps, t);
25
-
26
- if (k < minCurvature || useMaxRadius) {
27
- k = minCurvature;
28
- }
29
-
30
- const tangent_ = tangentExact(ps,t).map(c => c[c.length-1]);
31
- const normal_ = [-tangent_[1],tangent_[0]];
32
- const l = Math.sqrt(normal_[0]**2 + normal_[1]**2);
33
- const circleCenter = [
34
- p[0] - normal_[0]/(k*l),
35
- p[1] - normal_[1]/(k*l)
36
- ];
16
+ maxOsculatingCircleRadius: number,
17
+ pos: PrePointOnShape,
18
+ norm: number[]): [number[],number] {
19
+
20
+ const { curve, p, t } = pos;
21
+ const { ps } = curve;
22
+
23
+ const minCurvature = 1/maxOsculatingCircleRadius;
37
24
 
38
- return { center: circleCenter, radius: 1/k };
25
+ const kDd = ddCurvature(ps, t);
26
+ const k_ = -(kDd[0] + kDd[1]);
27
+ const k = k_ < minCurvature ? minCurvature : k_;
28
+
29
+ const [tx, ty] = norm;
30
+ const l = sqrt(tx*tx + ty*ty);
31
+ const scale = l*k;
32
+
33
+ return [
34
+ [p[0] + tx/scale, p[1] + ty/scale],
35
+ 1/k
36
+ ];
39
37
  }
40
38
 
41
39
 
@@ -1,20 +1,22 @@
1
- import { memoize } from "flo-memoize";
2
- import { Corner } from "../corner/corner.js";
1
+ import type { Corner } from "../corner/corner.js";
2
+ import type { Curve } from "flo-boolean";
3
+ import { memoize } from 'flo-memoize';
3
4
  import { getCorner } from "../corner/get-corner.js";
4
- import { PointOnShape } from "./point-on-shape.js";
5
5
 
6
6
 
7
7
  /**
8
8
  * @internal
9
9
  */
10
- // const getPosCorner$ = memoize(
11
- function getPosCorner(pos: PointOnShape): Corner {
12
- return getCorner(
13
- pos.t === 1 ? pos.curve.ps : pos.curve.prev.ps,
14
- pos.t === 1 ? pos.curve.next.ps : pos.curve.ps,
15
- );
16
- }
17
- // );
10
+ const getPosCorner$ = memoize(function(
11
+ pos: { t: number, curve: Curve}): Corner {
18
12
 
13
+ const { t, curve } = pos;
19
14
 
20
- export { getPosCorner }
15
+ return getCorner(
16
+ t === 1 ? curve.ps : curve.prev.ps,
17
+ t === 1 ? curve.next.ps : curve.ps,
18
+ );
19
+ });
20
+
21
+
22
+ export { getPosCorner$ }