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,38 +1,41 @@
1
+ import type { CurvePiece } from "../mat/curve-piece.js";
1
2
  import { evalDeCasteljau } from 'flo-bezier3';
2
3
  import { squaredDistanceBetween } from 'flo-vector2d';
3
- import { CurvePiece } from "../mat/curve-piece.js";
4
+
5
+ const { min } = Math;
6
+
7
+
8
+ const TOLERANCE = 1 + 2**-20;
4
9
 
5
10
 
6
11
  /**
7
- * @internal
8
12
  * Finds an initial distance such that the closest point can not be further than
9
13
  * this distance away.
14
+ *
15
+ * @internal
10
16
  */
11
17
  function getBestDistanceSquared(
12
18
  curvePieces: CurvePiece[],
13
- p: number[]) {
19
+ xO: number[]) {
14
20
 
15
- let bestSquaredDistance = Number.POSITIVE_INFINITY;
21
+ let bestSquaredDistance = Infinity;
16
22
  for (let i=0; i<curvePieces.length; i++) {
17
23
  const curvePiece = curvePieces[i];
18
24
 
19
- const ps = curvePiece.curve.ps;
25
+ const { curve: { ps }, ts } = curvePiece;
20
26
 
21
- const p1 = evalDeCasteljau(ps, curvePiece.ts[0]);
22
- const p2 = evalDeCasteljau(ps, curvePiece.ts[1]);
27
+ const p1 = evalDeCasteljau(ps, ts[0]);
28
+ const p2 = evalDeCasteljau(ps, ts[1]);
23
29
 
24
- const d = Math.min(
25
- squaredDistanceBetween(p, p1),
26
- squaredDistanceBetween(p, p2)
30
+ bestSquaredDistance = min(
31
+ bestSquaredDistance,
32
+ squaredDistanceBetween(xO, p1),
33
+ squaredDistanceBetween(xO, p2)
27
34
  );
28
-
29
- if (d < bestSquaredDistance) {
30
- bestSquaredDistance = d;
31
- }
32
35
  }
33
36
 
34
37
  // The extra multiplier is to account for floating point precision.
35
- return (1 + 2**-10)*bestSquaredDistance;
38
+ return TOLERANCE*bestSquaredDistance;
36
39
  }
37
40
 
38
41
 
@@ -1,58 +1,44 @@
1
- import type { Curve } from 'flo-boolean';
2
1
  import type { CurvePiece } from '../mat/curve-piece.js';
3
2
  import type { FootAndEndpointInfo } from './foot-and-endpoint-info.js';
4
- import type { PointOnShape } from '../point-on-shape/point-on-shape.js';
5
- import { createPos } from '../point-on-shape/create-pos.js';
3
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
6
4
  import { getPotentialClosestPointsOnCurveCertified } from './get-potential-closest-points-on-curve-certified.js';
7
- import { cullCurvePieces1 } from './cull-bezier-pieces.js';
5
+ import { cullCurvePieces1 } from './cull-bezier-pieces-1.js';
6
+ import { toP } from '../point-on-shape/to-p.js';
8
7
 
9
8
 
10
9
  /**
11
- * @internal
12
10
  * Returns the closest boundary point to the given point, limited to the given
13
11
  * bezier pieces, including the beziers actually checked after culling.
14
12
  *
15
- * @param pow
13
+ * @param maxCoordPowerOf2
16
14
  * @param curvePieces
17
15
  * @param x
18
- * @param touchedCurve
19
- * @param t
20
- * @param for1Prong defaults to `false`;
21
- * @param angle defaults to `0`
16
+ *
17
+ * @internal
22
18
  */
23
19
  function getCloseBoundaryPointsCertified(
24
- pow: number,
25
20
  curvePieces: CurvePiece[],
26
- x: number[],
27
- touchedCurve: Curve | undefined = undefined,
28
- t: number | undefined = undefined,
29
- for1Prong = false,
30
- angle = 0): PointOnShape[] {
21
+ x: number[]): PrePointOnShape[] {
31
22
 
32
23
  curvePieces = cullCurvePieces1(curvePieces, x);
33
24
 
34
- const pInfoss: FootAndEndpointInfo[] = [];
25
+ const pInfos: FootAndEndpointInfo[] = [];
35
26
  for (let i=0; i<curvePieces.length; i++) {
36
27
  const curvePiece = curvePieces[i];
37
28
 
38
- const pInfos = getPotentialClosestPointsOnCurveCertified(
39
- pow,
29
+ const _pInfos = getPotentialClosestPointsOnCurveCertified(
40
30
  curvePiece.curve,
41
31
  x,
42
- curvePiece.ts,
43
- touchedCurve,
44
- t,
45
- for1Prong,
46
- angle
32
+ curvePiece.ts as [number,number]
47
33
  );
48
34
 
49
- pInfoss.push(...pInfos);
35
+ pInfos.push(..._pInfos);
50
36
  }
51
37
 
52
38
  /** the minimum max interval value */
53
- let minMax = Number.POSITIVE_INFINITY;
54
- for (let i=0; i<pInfoss.length; i++) {
55
- const diMax = pInfoss[i].dSquaredI[1];
39
+ let minMax = Infinity;
40
+ for (let i=0; i<pInfos.length; i++) {
41
+ const diMax = pInfos[i].dSquaredI[1];
56
42
  if (diMax < minMax) {
57
43
  minMax = diMax;
58
44
  }
@@ -60,14 +46,22 @@ function getCloseBoundaryPointsCertified(
60
46
 
61
47
  const closestPointInfos: FootAndEndpointInfo[] = [];
62
48
 
63
- for (let i=0; i<pInfoss.length; i++) {
64
- const info = pInfoss[i];
49
+ for (let i=0; i<pInfos.length; i++) {
50
+ const info = pInfos[i];
65
51
  if (info.dSquaredI[0] <= minMax) {
66
52
  closestPointInfos.push(info);
67
53
  }
68
54
  }
69
55
 
70
- return closestPointInfos.map(info => createPos(info.curve, info.t, false));
56
+ return closestPointInfos.map(info => {
57
+ const { curve, t } = info;
58
+ const { ps } = curve;
59
+ const p = toP(ps, t);
60
+
61
+ return {
62
+ p, t, curve, isSource: false
63
+ };
64
+ });
71
65
  }
72
66
 
73
67
 
@@ -1,139 +1,78 @@
1
1
  import type { Curve } from "flo-boolean";
2
2
  import type { FootAndEndpointInfo } from './foot-and-endpoint-info.js';
3
- import { allRootsCertified } from 'flo-poly';
4
- import { eDeflate } from 'flo-poly';
5
- import { getFootPointsOnBezierPolysCertified, getIntervalBox } from 'flo-bezier3';
6
- import { ddDeflateWithRunningError } from './dd-deflate-with-running-error.js';
7
- import { γγ } from '../error-analysis/gamma.js';
3
+ import { roots } from 'flo-poly';
4
+ import { evalDeCasteljauDd, getFootPointsOnBezierPolysCertified, getIntervalBox } from 'flo-bezier3';
8
5
  import { rootIntervalToDistanceSquaredInterval } from './root-interval-to-distance-squared-interval.js';
9
- import { getPFromBox } from './get-p-from-box.js';
10
-
11
-
12
- const γγ3 = γγ(3);
13
-
14
- const { sqrt } = Math;
6
+ import { squaredDistanceBetweenDd } from "../find-2-prong/squared-distance-between-dd.js";
7
+ import { eps } from '../error-analysis/gamma.js';
15
8
 
16
9
 
17
10
  /**
18
11
  * @internal
19
12
  *
20
- * @param pow
21
- * @param curve The curve
22
- * @param x The point from which to check
13
+ * @param curve the curve
14
+ * @param x the point from which to check
23
15
  * @param tRange The allowed t range
24
- * @param touchedCurve The bezier on which p is located
25
- * @param t The t value of the bezier that locates p
26
- * @param for1Prong defaults to `false;
27
- * @param angle defaults to `0`;
28
16
  */
29
17
  function getPotentialClosestPointsOnCurveCertified(
30
- pow: number,
31
18
  curve: Curve,
32
19
  x: number[],
33
- tRange: number[] = [0,1],
34
- touchedCurve: Curve | undefined = undefined,
35
- t: number | undefined = undefined,
36
- for1Prong = false,
37
- angle = 0): FootAndEndpointInfo[] {
20
+ tRange: [number, number]): FootAndEndpointInfo[] {
38
21
 
39
22
  const [tS,tE] = tRange;
40
- const ps = curve.ps;
23
+ const { ps } = curve;
41
24
 
42
- const shouldDeflate = angle === 0 && curve === touchedCurve;
25
+ const infos: FootAndEndpointInfo[] = [];
43
26
 
44
- let { polyDd: polyDdO, polyE: polyEO, getPolyExact: getPolyExactO } =
45
- getFootPointsOnBezierPolysCertified(ps, x);
27
+ if (tS !== tE) {
28
+ const { polyDd: pDd, polyE: pDd_, getPolyExact } =
29
+ getFootPointsOnBezierPolysCertified(ps, x);
46
30
 
47
- const def = shouldDeflate
48
- ? ddDeflateWithRunningError(polyDdO, polyEO.map(e => e/γγ3), t!)
49
- : undefined;
50
-
51
- const def2 = for1Prong && shouldDeflate
52
- ? ddDeflateWithRunningError(def!.coeffs, def!.errBound.map(e => e/γγ3), t!)
53
- : undefined;
31
+ const ris = roots(pDd, tS, tE, pDd_, getPolyExact) || [];
54
32
 
55
- const def3 = for1Prong && shouldDeflate
56
- ? ddDeflateWithRunningError(def2!.coeffs, def2!.errBound.map(e => e/γγ3), t!)
57
- : undefined;
58
-
59
- const { polyDd, polyE, getPolyExact } =
60
- def3 !== undefined
61
- ? {
62
- polyDd: def3.coeffs,
63
- polyE: def3.errBound,
64
- getPolyExact: () => eDeflate(eDeflate(eDeflate(getPolyExactO(), t!), t!), t!)
65
- }
66
- : def !== undefined
67
- ? {
68
- polyDd: def.coeffs,
69
- polyE: def.errBound,
70
- getPolyExact: () => eDeflate(getPolyExactO(), t!)
33
+ infos.push(...ris.map(ri => {
34
+ const { tS: ts, tE: te, t: _t } = ri;
35
+
36
+ const t = _t < 0 ? 0 : _t > 1 ? 1 : _t;
37
+
38
+ const box = getIntervalBox(ps, [ts, te]);
39
+
40
+ const dSquaredI = rootIntervalToDistanceSquaredInterval(box, x);
41
+
42
+ const t_ = t === 0 ? 1 : t;
43
+ const curve_ = t === 0 ? curve.prev : curve;
44
+
45
+ return {
46
+ curve: curve_,
47
+ t: t_,
48
+ dSquaredI
71
49
  }
72
- : {
73
- polyDd: polyDdO,
74
- polyE: polyEO,
75
- getPolyExact: getPolyExactO
76
- };
77
-
78
- const ris = allRootsCertified(polyDd, tS, tE, polyE, getPolyExact);
79
-
80
- const dontPush0 = (
81
- (t === 1 && curve === touchedCurve!.next) ||
82
- (t === 0 && curve === touchedCurve)
83
- );
84
- const dontPush1 = (
85
- (t === 0 && curve === touchedCurve!.prev) ||
86
- (t === 1 && curve === touchedCurve)
87
- );
88
-
89
- if (tS === 0) {
90
- if (!dontPush0) { ris.push({ t: 0, tS: 0, tE: 0, multiplicity: 1 }); }
91
- } else if (tS === 1) {
92
- if (!dontPush1) { ris.push({ t: 1, tS: 1, tE: 1, multiplicity: 1 }); }
93
- } else {
94
- ris.push({ t: tS, tS: tS, tE: tS, multiplicity: 1 });
50
+ }));
95
51
  }
96
52
 
97
- if (tE === 0) {
98
- if (!dontPush0) { ris.push({ t: 0, tS: 0, tE: 0, multiplicity: 1 }); }
99
- } else if (tE === 1) {
100
- if (!dontPush1) { ris.push({ t: 1, tS: 1, tE: 1, multiplicity: 1 }); }
101
- } else {
102
- ris.push({ t: tE, tS: tE, tE: tE, multiplicity: 1 });
53
+ const ts = tRange.slice();
54
+ if (tS === tE) {
55
+ ts.push(tS);
103
56
  }
57
+
58
+ infos.push(...ts.map(t => {
59
+ const p = evalDeCasteljauDd(ps, [0,t]).map(v => v[0] + v[1]);
104
60
 
105
- const infos = ris
106
- .map(ri => {
107
- const { tS: ts, tE: te } = ri;
108
-
109
- if (te < tS || ts > tE) {
110
- return undefined;
111
- }
112
-
113
- const _t = (ts + te)/2;
114
- const t = _t < 0 ? 0 : _t > 1 ? 1 : _t;
61
+ const d = squaredDistanceBetweenDd(p, x);
115
62
 
116
- const box = getIntervalBox(ps, [ts, te]);
117
- const p_ = getPFromBox(box);
118
-
119
- const dSquaredI = rootIntervalToDistanceSquaredInterval(pow, box, x);
63
+ const dSquaredI = [d*(1 - eps), d*(1 + eps)];
120
64
 
121
65
  const t_ = t === 0 ? 1 : t;
122
66
  const curve_ = t === 0 ? curve.prev : curve;
123
67
 
124
68
  return {
125
69
  curve: curve_,
126
- p: p_,
127
70
  t: t_,
128
- d: (sqrt(dSquaredI[0]) + sqrt(dSquaredI[1]))/2,
129
- dSquaredI,
130
- box,
71
+ dSquaredI
131
72
  }
132
- });
133
-
134
- const infos_ = infos.filter(info => info !== undefined) as FootAndEndpointInfo[];
73
+ }));
135
74
 
136
- return infos_;
75
+ return infos;
137
76
  }
138
77
 
139
78
 
@@ -1,12 +1,6 @@
1
- import { twoDiff, eEstimate, eMult, eAdd } from 'big-float-ts';
2
- import { ddMultDd, ddAddDd } from 'double-double';
1
+ import { twoDiff, ddMultDd, ddAddDd } from 'double-double';
3
2
 
4
-
5
- // We *have* to do the below to improve performance with bundlers❗ The assignee is a getter❗ The assigned is a pure function❗
6
- const estimate = eEstimate;
7
3
  const td = twoDiff;
8
- // const emult = eMult;
9
- // const eadd = eAdd;
10
4
  const qmq = ddMultDd;
11
5
  const qaq = ddAddDd;
12
6
 
@@ -25,7 +19,6 @@ const eps = Number.EPSILON;
25
19
  * @internal
26
20
  */
27
21
  function rootIntervalToDistanceSquaredInterval(
28
- pow: number,
29
22
  box: number[][],
30
23
  p: number[]) {
31
24
 
@@ -39,8 +32,8 @@ function rootIntervalToDistanceSquaredInterval(
39
32
  const x = p[0]; // <0>
40
33
  const y = p[1]; // <0>
41
34
 
42
- let minDSquared = Number.POSITIVE_INFINITY;
43
- let maxDSquared = Number.NEGATIVE_INFINITY;
35
+ let minDSquared = +Infinity;
36
+ let maxDSquared = -Infinity;
44
37
 
45
38
  // for each corner of the interval box
46
39
  for (const [a,b] of [[minX,minY],[minX,maxY],[maxX,minY],[maxX,maxY]]) {
@@ -62,8 +55,10 @@ function rootIntervalToDistanceSquaredInterval(
62
55
  const dc1Dd = qaq(qmq(ax,ax),qmq(by,by)); // ax**2 + bx**2
63
56
  const dc1 = dc1Dd[1];
64
57
 
65
- const dc1Min = dc1*(1 - 2**pow*eps); // distance minus max error
66
- const dc1Max = dc1*(1 + 2**pow*eps); // distance plus max error
58
+ // const dc1Min = dc1*(1 - 2**maxCoordPowerOf2*eps); // distance minus max error
59
+ // const dc1Max = dc1*(1 + 2**maxCoordPowerOf2*eps); // distance plus max error
60
+ const dc1Min = dc1*(1 - eps); // distance minus max error
61
+ const dc1Max = dc1*(1 + eps); // distance plus max error
67
62
 
68
63
  if (dc1Min <= minDSquared) {
69
64
  minDSquared = dc1Min;
@@ -13,7 +13,7 @@ const { sign } = Math;
13
13
  * Precondition: The point psI evaluated at zero must === the point psO
14
14
  * evaluated at zero.
15
15
  *
16
- * // TODO - is this correct?
16
+ * // FUTURE - is this correct?
17
17
  * Exact: Returns the exact result if the bithlength of all
18
18
  * coordinates <= 53 - 5 === 48 and are bit-aligned.
19
19
  *
@@ -1,39 +1,40 @@
1
1
 
2
2
  /**
3
- * @internal
4
3
  * Represents a corner on the shape boundary, i.e. a point where two bezier
5
4
  * curves meet. Typically used internally only.
5
+ *
6
+ * @internal
6
7
  */
7
8
  interface Corner {
8
9
  /**
9
10
  * The unit tangents at the points t === 1 of the first curve and at
10
11
  * t === 0 of the second respectively.
11
12
  */
12
- tangents: number[][];
13
+ readonly tangents: number[][];
13
14
  /** The cross of the unit tangents. */
14
15
  // crossTangents: number;
15
16
  /**
16
17
  * True if the corner is sharp, i.e. > 0 radians as one goes in a positive
17
18
  * direction around the shape boundary.
18
19
  */
19
- isSharp: boolean;
20
+ readonly isSharp: boolean;
20
21
  /**
21
22
  * True if the corner is dull, i.e. < 0 radians as one goes in a positive
22
23
  * direction around the shape boundary.
23
24
  */
24
- isDull: boolean;
25
+ readonly isDull: boolean;
25
26
  /**
26
27
  * True if the corner is quite sharp, i.e. > δ radians as one goes in a
27
28
  * positive direction around the shape boundary where δ is some
28
29
  * pre-determined parameter.
29
30
  */
30
- isQuiteSharp: boolean;
31
+ readonly isQuiteSharp: boolean;
31
32
  /**
32
33
  * True if the corner is quite dull, i.e. < δ radians as one goes in a
33
34
  * positive direction around the shape boundary where δ is some
34
35
  * pre-determined parameter.
35
36
  */
36
- isQuiteDull: boolean;
37
+ readonly isQuiteDull: boolean;
37
38
  }
38
39
 
39
40
 
@@ -1,5 +1,5 @@
1
- import { cross, dot, toUnitVector } from "flo-vector2d";
2
- import { Corner } from "./corner.js";
1
+ import type { Corner } from "./corner.js";
2
+ import { cross, toUnitVector } from "flo-vector2d";
3
3
  import { getInterfaceCcw } from './get-interface-ccw.js';
4
4
 
5
5
 
@@ -26,11 +26,6 @@ const DEGREE_LIMIT = DEGREES[4];
26
26
  * @internal
27
27
  * Returns a new corner with properties.
28
28
  *
29
- * PRECONDITION: The beziers has control points with max bit-length of 26 and
30
- * aligned to a 'grid' to have the same exponent. This is so the vectors between
31
- * control points can be calculated exactly without resorting to adaptive
32
- * infinite precision floating point operations.
33
- *
34
29
  * @param psI The incoming bezier that ends in the corner
35
30
  * @param psO The outgoing bezier that starts at the corner
36
31
  */
@@ -38,8 +33,8 @@ function getCorner(
38
33
  psI: number[][],
39
34
  psO: number[][]): Corner {
40
35
 
41
- // getInterfaceCcw must return a number !== 0 if psI and psO are not the
42
- // same as seen as a curve extension with t ∈ [-∞,+∞]
36
+ // `getInterfaceCcw` must return a number !== 0 if `psI` and `psO` are not
37
+ // the same up to a curve extension with `t ∈ [-∞,+∞]`
43
38
  const { ccw, tangentI, tangentO, dotTangents } = getInterfaceCcw(psI, psO);
44
39
  const isSharp = ccw < 0;
45
40
  const isDull = ccw > 0;
@@ -56,7 +51,6 @@ function getCorner(
56
51
 
57
52
  let isQuiteSharp: boolean;
58
53
  let isQuiteDull: boolean;
59
- // const dotTangents = dot(tangentAtIncoming, tangentAtOutgoing);
60
54
  if (dotTangents > 0) {
61
55
  // Curves go in same direction
62
56
  isQuiteSharp = crossTangents < -DEGREE_LIMIT;
@@ -68,7 +62,6 @@ function getCorner(
68
62
 
69
63
  return {
70
64
  tangents: unitTangents,
71
- // crossTangents,
72
65
  isSharp,
73
66
  isDull,
74
67
  isQuiteSharp,
@@ -15,8 +15,8 @@ import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.
15
15
  * Preconditions (for robustness):
16
16
  * * The bezier does not have infinite curvature at either endpoint
17
17
  *
18
- * @param psI The incoming bezier that ends at the interface
19
- * @param psO The outgoing bezier that starts at the interface
18
+ * @param psI the incoming bezier that ends at the interface
19
+ * @param psO the outgoing bezier that starts at the interface
20
20
  */
21
21
  function getInterfaceCcw(
22
22
  psI: number[][],
@@ -72,9 +72,9 @@ function getInterfaceCcw(
72
72
 
73
73
  // Look at curvature
74
74
 
75
- // TODO2
75
+ // FUTURE
76
76
  // The line below is probably not working correctly for infinite
77
- // curvature but it should be rare to get here - investiagte.
77
+ // curvature but it should be rare to get here - investigate.
78
78
  // Probably need to resort to length of tangents and then if this is
79
79
  // also the same simply look at the last point's ccw wrt the 1st or
80
80
  // the second?
@@ -82,7 +82,6 @@ function getInterfaceCcw(
82
82
  ccw: compareCurvaturesAtInterface(psI.slice().reverse(), psO),
83
83
  tangentI,
84
84
  tangentO,
85
- // crossTangents,
86
85
  dotTangents
87
86
  }
88
87
  }
@@ -95,6 +94,7 @@ function pointsEqual(
95
94
  return p1[0] === p2[0] && p1[1] === p2[1];
96
95
  }
97
96
 
97
+
98
98
  /**
99
99
  * The input is two exact double-double coefficient vectors
100
100
  *
@@ -1,7 +1,4 @@
1
- import { CpNode } from "./cp-node.js";
2
1
  import { getHoleClosers } from "./fs/get-hole-closers.js";
3
- import { getSpeed } from "./fs/get-speed.js";
4
- import { getSmoothedSpeed$ } from "./fs/get-smoothed-speed.js";
5
2
  import { enhanceCpNode } from "./fs/enhance-cp-node.js";
6
3
  import { traverseCp } from './fs/traverse-cp.js';
7
4
  import { traverseEdges } from './fs/traverse-edges.js';
@@ -221,8 +218,6 @@ const CpNodeFs = {
221
218
  getBoundaryBeziersBetween,
222
219
  getMatCurvesBetween,
223
220
  getHoleClosers,
224
- getSpeed,
225
- getSmoothedSpeed$,
226
221
  getInitialDegAngleBetweenMatCurves,
227
222
  getAllVertices
228
223
  }
@@ -1,4 +1,5 @@
1
- import { ContactPoint } from '../contact-point/contact-point.js';
1
+ // import { ContactPoint } from '../contact-point/contact-point.js';
2
+ import { PointOnShape } from '../point-on-shape/point-on-shape.js';
2
3
 
3
4
 
4
5
  /**
@@ -51,39 +52,40 @@ import { ContactPoint } from '../contact-point/contact-point.js';
51
52
  */
52
53
  interface CpNode {
53
54
  /** For debugging / easy identification only */
54
- id: number;
55
+ readonly id: number;
55
56
 
56
57
  /** The shape boundary contact point, i.e. a `CpNode` without its edges. */
57
- cp: ContactPoint;
58
+ // cp: ContactPoint;
59
+ readonly pointOnShape: PointOnShape;
58
60
  /** If true, this `CpNode` belongs to a hole-closing maximal disk. */
59
- isHoleClosing: boolean;
61
+ readonly isHoleClosing: boolean;
60
62
  /** true if this `CpNode` is at a shape boundary intersection point, false otherwise */
61
- isIntersection: boolean;
63
+ readonly isIntersection: boolean;
62
64
 
63
65
  //------------------------
64
66
  // EDGES TO OTHER CpNodes
65
67
  //------------------------
66
68
 
67
69
  /** The previous (going clockwise around the boundary) contact point `CpNode`. */
68
- prev: CpNode;
70
+ readonly prev: CpNode;
69
71
  /** The next (going anti-clockwise around the boundary) contact point `CpNode`. */
70
- next: CpNode;
72
+ readonly next: CpNode;
71
73
  /**
72
74
  * The previous `CpNode` (going clockwise around the inscribed circle
73
75
  * defined by the maximal disk).
74
76
  */
75
- prevOnCircle: CpNode;
77
+ readonly prevOnCircle: CpNode;
76
78
  /**
77
79
  * The next `CpNode` (going anti-clockwise around
78
80
  * the inscribed circle defined by the maximal disk).
79
81
  */
80
- nextOnCircle: CpNode;
82
+ readonly nextOnCircle: CpNode;
81
83
  /**
82
84
  * For hole closers only - the twin `CpNode` at the same point, e.g.
83
85
  * use `cpNode.holeCloserTwin.next` to skip the hole closer and get to the
84
86
  * next `CpNode` on the same loop.
85
87
  */
86
- holeCloserTwin?: CpNode | undefined;
88
+ readonly holeCloserTwin?: CpNode | undefined;
87
89
  }
88
90
 
89
91
 
@@ -3,7 +3,6 @@
3
3
  //------------------------------
4
4
 
5
5
  // import { getTAtLength, length } from "flo-bezier3";
6
- // import { createPos } from "../../point-on-shape/create-pos.js";
7
6
  // import { CpNode } from "../cp-node.js";
8
7
 
9
8
 
@@ -40,7 +39,7 @@
40
39
 
41
40
  // const t = getTAtLength(curve.ps, l);
42
41
 
43
- // const posE = createPos(curve, t);
42
+ // const posE: PrePointOnShape = { curve, t ;
44
43
 
45
44
  // return posE;
46
45
  // }
@@ -1,3 +1,4 @@
1
+ import { Mutable } from "../../utils/mutable.js";
1
2
  import type { CpNode } from "../cp-node.js";
2
3
 
3
4
 
@@ -49,7 +50,7 @@ function clone(
49
50
  nodeMap.set(node, node_);
50
51
  cpStack.push({ cpNode: node, newCpNode: node_ });
51
52
  }
52
- (newCpNode as CpNode)[edge] = node_ as CpNode;
53
+ (newCpNode as Mutable<CpNode>)[edge] = node_ as CpNode;
53
54
  }
54
55
  }
55
56
 
@@ -1,5 +1,5 @@
1
1
  import type { CpNode } from "../cp-node.js";
2
- import { compareCps } from "../../contact-point/contact-point.js";
2
+ import { comparePoss } from "../../point-on-shape/compare-poss.js";
3
3
 
4
4
 
5
5
  /**
@@ -12,7 +12,7 @@ function cpNodeComparator(
12
12
  a: CpNode,
13
13
  b: CpNode) {
14
14
 
15
- return compareCps(a.cp, b.cp);
15
+ return comparePoss(a.pointOnShape, b.pointOnShape);
16
16
  }
17
17
 
18
18
 
@@ -12,15 +12,15 @@ import { isTerminating } from "./is-terminating.js";
12
12
  * @param cpNode
13
13
  */
14
14
  function enhanceCpNode(cpNode: CpNode) {
15
- const cp = cpNode.cp;
16
- const pos = cp.pointOnShape;
15
+ // const cp = cpNode.cp;
16
+ const pos = cpNode.pointOnShape;
17
17
  const curve = pos.curve;
18
18
 
19
19
  return {
20
20
  ...cpNode,
21
- pos: cpNode.cp.pointOnShape,
22
- p: cpNode.cp.pointOnShape.p,
23
- t: cpNode.cp.pointOnShape.t,
21
+ pos,//: cpNode.cp.pointOnShape,
22
+ p: pos.p,
23
+ t: pos.t,
24
24
  isTerminating: isTerminating(cpNode),
25
25
  isFullyTerminating: isFullyTerminating(cpNode),
26
26
  isSharp: isSharp(cpNode),