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,86 +1,63 @@
1
- import { evalDeCasteljau } from "flo-bezier3";
2
- import { dot, lineLineIntersection, squaredDistanceBetween } from "flo-vector2d";
3
- import { CurvePiece } from '../mat/curve-piece.js';
1
+ import type { CurvePiece } from '../mat/curve-piece.js';
2
+ import { getMedialPointCoeffsBez0 } from "flo-bezier3";
3
+ import { lengthSquared, squaredDistanceBetween } from "flo-vector2d";
4
+
5
+ const { abs } = Math;
6
+
7
+
8
+ const TOLERANCE = 1 + 2**-20;
4
9
 
5
10
 
6
11
  /**
7
- * @internal
8
- *
9
12
  * Reduces the circle radius initially as an optimization step.
13
+ *
14
+ * @internal
10
15
  */
11
16
  function reduceRadius(
12
- extreme: number,
17
+ maxCoordPowerOf2: number,
13
18
  curvePieces: CurvePiece[],
14
- p: number[],
15
- x: number[]) {
19
+ y: number[],
20
+ nnorm: number[]): number {
16
21
 
17
- const TOLERANCE = 1 + 2**-10;
22
+ let minRadius = Infinity;
23
+ let x = [y[0] + nnorm[0], y[1] + nnorm[1]];
18
24
 
19
- let minRadius = Number.POSITIVE_INFINITY;
20
25
  for (let i=0; i<curvePieces.length; i++) {
21
26
  const curvePiece = curvePieces[i];
22
27
 
23
- const ps = curvePiece.curve.ps;
24
-
25
- // let min = Number.POSITIVE_INFINITY;
26
- const num = 2;
27
- for (let j=0; j<(num + 1); j++) {
28
- const p_ = evalDeCasteljau(ps, curvePiece.ts[j/num]);
29
- const cc = getCircleCenterFrom2PointsAndNormal(extreme, p, x, p_);
30
- if (cc) {
31
- let r = squaredDistanceBetween(p, cc);
32
- if (r < minRadius) {
33
- minRadius = r;
34
- }
35
- }
36
- }
37
- }
38
-
39
- // The extra bit is to account for floating point precision.
40
- return TOLERANCE*minRadius;
41
- }
28
+ const { ps } = curvePiece.curve;
42
29
 
30
+ const pS = ps[0];
31
+ const pE = ps[ps.length - 1];
43
32
 
44
- /**
45
- * @internal
46
- * @param p A point on the circle with normal pointing to x towards the center
47
- * of the circle.
48
- * @param x
49
- * @param p1 Another point on the circle.
50
- */
51
- function getCircleCenterFrom2PointsAndNormal(
52
- extreme: number,
53
- p: number[],
54
- x: number[],
55
- p1: number[]) {
33
+ for (const P of [pS,pE]) {
34
+ if (squaredDistanceBetween(x,P) > minRadius) {
35
+ continue; // short-circuit
36
+ }
56
37
 
57
- const TOLERANCE = (2**-14*extreme)**2;
38
+ const { a0, b0 } = getMedialPointCoeffsBez0(y, nnorm, P);
58
39
 
59
- // Ignore if p and p1 are too close together
60
- if (squaredDistanceBetween(p,p1) < TOLERANCE) {
61
- return undefined;
62
- }
40
+ if (abs(a0) <= 2**-40 || abs(b0) <= 2**-40) {
41
+ continue;
42
+ }
63
43
 
64
- /** The perpindicular bisector between the two given points on the circle */
65
- const pb = [
66
- (p[0] + p1[0]) / 2,
67
- (p[1] + p1[1]) / 2,
68
- ];
69
- const tan = [p1[0] - p[0], p1[1] - p[1]];
70
- const norm = [-tan[1], tan[0]]; // Rotate by 90 degrees
71
- const pb2 = [pb[0] + norm[0], pb[1] + norm[1]];
44
+ const w = -b0 / a0;
72
45
 
73
- const res = lineLineIntersection([p,x], [pb, pb2]);
46
+ // too close to point of origin *or* negative;
47
+ if (w < 2**-40) { continue; }
74
48
 
75
- if (!res) { return undefined; }
49
+ const N = [w*nnorm[0], w*nnorm[1]];
50
+ const r = lengthSquared(N);
76
51
 
77
- const resO = [res[0] - p[0], res[1] - p[1]];
78
- const xO = [x[0] - p[0], x[1] - p[1]];
79
- if (dot(resO, xO) < 0) {
80
- return undefined;
52
+ if (r < minRadius) {
53
+ minRadius = r;
54
+ x = [y[0] + N[0], y[1] + N[1]];
55
+ }
56
+ }
81
57
  }
82
58
 
83
- return res;
59
+ // The extra bit is to account for floating point precision.
60
+ return TOLERANCE*minRadius;
84
61
  }
85
62
 
86
63
 
@@ -1,13 +1,13 @@
1
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
1
+ // import { PointOnShape } from '../point-on-shape/point-on-shape.js';
2
2
 
3
3
 
4
- /** @internal */
5
- type TXForDebugging = {
6
- x: number[];
7
- y: PointOnShape;
8
- z: PointOnShape;
9
- t: number;
10
- }
4
+ // /** @internal */
5
+ // type TXForDebugging = {
6
+ // x: number[];
7
+ // y: PointOnShape;
8
+ // z: PointOnShape;
9
+ // t: number;
10
+ // }
11
11
 
12
12
 
13
- export { TXForDebugging }
13
+ // export { TXForDebugging }
@@ -1,39 +1,49 @@
1
- import { fromTo, circumCenter, len, scale, translate } from 'flo-vector2d';
2
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
3
- import { CurvePiece } from '../mat/curve-piece.js';
4
- import { getClosestPoints } from './get-closest-points.js';
1
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
2
+ import type { CurvePiece } from '../mat/curve-piece.js';
3
+ // import { fromTo, circumCenter, len, scale, translate } from 'flo-vector2d';
4
+ import { fromTo, len, scale, translate } from 'flo-vector2d';
5
+ import { circumCenter } from './timed-cc.js'; // TODO - testing - restore
6
+ import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-close-boundary-points-certified.js';
5
7
 
6
8
 
7
9
  /**
8
- * @internal
9
- * Find new x and ps that are a better estimate of the 3-prong circle.
10
+ * Find new `x` and `ps` that are better estimates of the 3-prong circle.
11
+ *
10
12
  * The potential function, V, is defined as the distance to the actual 3 prong
11
13
  * circle center.
14
+ *
15
+ * @param maxCoordPowerOf2
12
16
  * @param curvePiece3s The three boundary pieces, each of which should contain
13
17
  * a point of the 3-prong to be found.
14
18
  * @param x The currently best guess at the center of the 3-prong circle.
15
19
  * @param vectorToZeroV
16
- * @param extreme
20
+ *
21
+ * @internal
17
22
  */
18
23
  function calcBetterX(
19
24
  curvePiece3s: CurvePiece[][],
20
25
  x: number[],
21
- vectorToZeroV: number[]) {
26
+ vectorToZeroV: number[]): {
27
+ newX: number[];
28
+ newV: number;
29
+ newPoss: PrePointOnShape[];
30
+ } {
22
31
 
23
32
  const V = len(vectorToZeroV);
24
33
 
25
34
  let nu = 1;
26
35
  let better;
27
36
  let newX;
28
- let newPoss: PointOnShape[];
37
+ let newPoss: PrePointOnShape[];
29
38
  let newV;
30
- let i = 0; // Safeguard
39
+ let i = 0; // Safeguard
31
40
  do {
32
41
  const shift = scale(vectorToZeroV, nu);
33
42
  newX = translate(shift, x);
34
-
35
-
36
- newPoss = getClosestPoints(newX, curvePiece3s);
43
+
44
+ newPoss = curvePiece3s.map(curvePieces =>
45
+ getCloseBoundaryPointsCertified(curvePieces, x)[0]
46
+ );
37
47
 
38
48
  // Point of zero V
39
49
  const newCircleCenter = circumCenter(newPoss.map(pos => pos!.p));
@@ -1,40 +1,37 @@
1
- /** @internal */
2
- import { circumCenter } from 'flo-vector2d';
3
- import { CpNode } from '../cp-node/cp-node.js';
4
- import { CurvePiece } from '../mat/curve-piece.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { CurvePiece } from '../mat/curve-piece.js';
3
+ // import { circumCenter } from 'flo-vector2d';
4
+ import { circumCenter } from './timed-cc.js'; // TODO - testing - restore
5
5
  import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-close-boundary-points-certified.js';
6
- import { createPos } from '../point-on-shape/create-pos.js';
7
6
 
8
- const { max, ceil, log2 } = Math;
9
7
 
10
8
  /**
11
- * @internal
12
9
  * Finds an initial 3-prong circle center point from which to iterate. The point
13
10
  * must be within the shape.
14
- * @param δ3s - The three boundary pieces of which we need to find the three
11
+ *
12
+ * @param maxCoordPowerOf2
13
+ * @param δ3s the three boundary pieces of which we need to find the three
15
14
  * 3-prong points.
16
15
  * @param curvePiece3s
17
- * @param extreme
16
+ *
17
+ * @internal
18
18
  */
19
19
  function calcInitial3ProngCenter(
20
- maxCoordinate: number,
21
20
  δ3s: CpNode[][],
22
21
  curvePiece3s: CurvePiece[][]) {
23
22
 
24
- const circle = δ3s[0][0].cp.circle;
23
+ const circle = δ3s[0][0].pointOnShape.circle;
25
24
  const twoProngCircleCenter = circle.center;
26
25
 
27
- const pow = max(0,ceil(log2(maxCoordinate/circle.radius))) + 1; // determines accuracy;
28
26
  const pos = getCloseBoundaryPointsCertified(
29
- pow,
30
27
  curvePiece3s[1],
31
28
  twoProngCircleCenter
32
29
  )[0];
33
30
 
34
31
  const meanPoints = [
35
- δ3s[0][0].cp.pointOnShape.p,
32
+ δ3s[0][0].pointOnShape.p,
36
33
  pos.p,
37
- δ3s[2][1].cp.pointOnShape.p,
34
+ δ3s[2][1].pointOnShape.p,
38
35
  ];
39
36
 
40
37
  return circumCenter(meanPoints);
@@ -1,44 +1,42 @@
1
- import {
2
- fromTo, circumCenter, len, distanceBetween, toUnitVector, rotate90Degrees,
3
- cross
4
- } from 'flo-vector2d';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { CurvePiece } from '../mat/curve-piece.js';
3
+ import type { ThreeProngInfo } from './three-prong-info.js';
4
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
5
+ // import { fromTo, circumCenter as getCircumCenter, len, distanceBetween, toUnitVector, rotate90Degrees, cross } from 'flo-vector2d';
6
+ import { fromTo, len, distanceBetween, toUnitVector, rotate90Degrees, cross } from 'flo-vector2d';
7
+ import { circumCenter as getCircumCenter } from './timed-cc.js'; // TODO - testing - restore
5
8
  import { tangent } from 'flo-bezier3';
6
- import { CpNode } from '../cp-node/cp-node.js';
7
- import { CpNodeFs } from '../cp-node/cp-node-fs.js';
8
- import { CurvePiece } from '../mat/curve-piece.js';
9
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
10
9
  import { calcInitial3ProngCenter } from './calc-initial-3-prong-center.js';
11
10
  import { getClosestPoints } from './get-closest-points.js';
12
11
  import { calcBetterX } from './calc-better-x.js';
13
12
  import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-close-boundary-points-certified.js';
14
13
  import { getCorner } from '../corner/get-corner.js';
15
14
  import { isPosCorner } from '../point-on-shape/is-pos-corner.js';
16
- import { getPosCorner } from '../point-on-shape/get-pos-corner.js';
15
+ import { getPosCorner$ } from '../point-on-shape/get-pos-corner.js';
16
+ import { isSharp } from '../cp-node/fs/is-sharp.js';
17
17
 
18
- const { isSharp } = CpNodeFs;
19
-
20
-
21
- /** @internal */
22
- const calcVectorToZeroV_StraightToIt = fromTo;
18
+ const { min, abs, asin } = Math;
23
19
 
24
20
 
25
21
  /**
26
- * @internal
27
22
  * Finds a 3-prong using only the 3 given δs.
28
- * @param δs The boundary pieces
23
+ *
24
+ * @param δs the boundary pieces
29
25
  * @param idx δ identifier
26
+ * @param k δs identifier
30
27
  * @param curvePiecess
31
- * @param maxCoordinate The maximum coordinate value used to calculate floating point
32
- * tolerances.
28
+ * @param maxCoordPowerOf2
29
+ *
30
+ * @internal
33
31
  */
34
32
  function find3ProngForDelta3s(
35
33
  δs: CpNode[][],
36
34
  idx: number,
37
35
  k: number,
38
36
  curvePiecess: CurvePiece[][],
39
- maxCoordinate: number) {
37
+ maxCoordPowerOf2: number): { error: number, threeProngInfo: ThreeProngInfo } | undefined {
40
38
 
41
- const TOLERANCE = 2**-32*maxCoordinate;
39
+ const TOLERANCE = 2**(maxCoordPowerOf2 - 32);
42
40
  const MAX_ITERATIONS = 10;
43
41
 
44
42
  const δs_ = [
@@ -71,33 +69,48 @@ function find3ProngForDelta3s(
71
69
 
72
70
  if (isSharp(δ3s[0][0])) { return undefined; }
73
71
 
74
-
75
- let poss: PointOnShape[] = undefined!;
76
- let circumCenter_;
77
- let j = 0; // Safeguard for slow convergence
78
- let x = calcInitial3ProngCenter(maxCoordinate, δ3s, curvePiece3s);
79
-
80
- let tolerance = Number.POSITIVE_INFINITY;
72
+ // TODO
73
+ //----------------------------
74
+ // const l1 = curvePiece3s[0].length;
75
+ // const l2 = curvePiece3s[1].length;
76
+ // const l3 = curvePiece3s[2].length;
77
+ // if (l1 === 1 && l2 == 1 && l3 === 1) {
78
+ // // console.log('aaa');
79
+ // const A = curvePiece3s[0][0].curve.ps;
80
+ // const B = curvePiece3s[1][0].curve.ps;
81
+ // const C = curvePiece3s[2][0].curve.ps;
82
+
83
+ // console.log(A.length, B.length, C.length);
84
+ // } else {
85
+ // // console.log('bbb');
86
+ // }
87
+ //----------------------------
88
+
89
+
90
+ let poss: PrePointOnShape[] = undefined!;
91
+ let j = 0; // Safeguard for slow convergence
92
+ let x = calcInitial3ProngCenter(δ3s, curvePiece3s);
93
+
94
+ let tolerance = Infinity;
81
95
  while (tolerance > TOLERANCE && j < MAX_ITERATIONS) {
82
96
  j++;
83
97
 
84
98
  poss = getClosestPoints(x, curvePiece3s);
85
99
  if (!Number.isFinite(x[0]) || !Number.isFinite(x[1])) {
86
100
 
87
- // TODO - the code can be cleaned up and sped up a lot if we don't
101
+ // FUTURE - the code can be cleaned up and sped up a lot if we don't
88
102
  // use this function as is but instead use δs[0] and δs[2] as is
89
103
  // and make δs[1] include all the rest of the beziers around the
90
104
  // loop. This check, for instance, would be eliminated completely.
91
105
  return undefined;
92
106
  }
93
107
 
94
- circumCenter_ = circumCenter(poss.map(x => x!.p));
95
-
96
- const vectorToZeroV = calcVectorToZeroV_StraightToIt(x, circumCenter_);
108
+ const circumCenter = getCircumCenter(poss.map(x => x.p));
109
+ const vectorToZeroV = fromTo(x, circumCenter);
97
110
 
98
111
  if (!Number.isFinite(vectorToZeroV[0]) || !Number.isFinite(vectorToZeroV[1])) {
99
112
 
100
- // TODO - the code can be cleaned up and sped up a lot if we don't
113
+ // FUTURE - the code can be cleaned up and sped up a lot if we don't
101
114
  // use this function as is but instead use δs[0] and δs[2] as is
102
115
  // and make δs[1] include all the rest of the beziers around the
103
116
  // loop. This check, for instance, would be eliminated completely.
@@ -109,7 +122,7 @@ function find3ProngForDelta3s(
109
122
 
110
123
  const V = len(vectorToZeroV); // The 'potential'
111
124
 
112
- tolerance = Math.abs(V - upds.newV);
125
+ tolerance = abs(V - upds.newV);
113
126
  }
114
127
 
115
128
  const radius = (distanceBetween(x, poss[0].p) +
@@ -121,28 +134,28 @@ function find3ProngForDelta3s(
121
134
  //-------------------------------------------------------------------------
122
135
  // Calculate the unit tangent vector at 3-prong circle points - they should
123
136
  // be very close to tangent to the boundary piece tangents at those points
124
- // (up to sign). Sharp corners are a common special case.
137
+ // (up to sign). Dull corners is a common special case.
125
138
  //-------------------------------------------------------------------------
126
139
  let totalAngleError = 0;
127
140
  for (let i=0; i<3; i++) {
128
- const pos = poss![i];
141
+ const pos = poss[i];
129
142
  //----------------------------
130
143
  // Tangent of circle at point
131
144
  //----------------------------
132
- const v = toUnitVector(fromTo(pos!.p, x));
145
+ const v = toUnitVector(fromTo(pos.p, x));
133
146
  const v1 = rotate90Degrees(v);
134
147
 
135
148
 
136
149
  //-----------------------------------
137
150
  // Check if point is on dull crorner
138
151
  //-----------------------------------
139
- if (isPosCorner(pos!) && getPosCorner(pos!).isDull) {
140
- const corner = getCorner(pos!.curve.ps, pos!.curve.next.ps);
152
+ if (isPosCorner(pos) && getPosCorner$(pos).isDull) {
153
+ const corner = getCorner(pos.curve.ps, pos.curve.next.ps);
141
154
  const tans = corner.tangents;
142
155
  const perps = tans.map( rotate90Degrees );
143
156
 
144
- const angleError1 = Math.asin( cross( perps[0], v ) );
145
- const angleError2 = Math.asin( cross( v, perps[1] ) );
157
+ const angleError1 = asin( cross( perps[0], v ) );
158
+ const angleError2 = asin( cross( v, perps[1] ) );
146
159
 
147
160
  let angleError = 0;
148
161
  if (angleError1 > 0) { angleError += angleError1; }
@@ -153,18 +166,18 @@ function find3ProngForDelta3s(
153
166
  //---------------------------
154
167
  // Tangent of curve at point
155
168
  //---------------------------
156
- const v2 = toUnitVector( tangent(pos!.curve.ps, pos!.t) );
169
+ const v2 = toUnitVector( tangent(pos.curve.ps, pos.t) );
157
170
 
158
171
  // Cross is more numerically stable than Vector.dot at angles a
159
- // multiple of Math.PI **and** is close to the actual angle value
172
+ // multiple of `Math.PI` **and** is close to the actual angle value
160
173
  // and can thus just be added to cone method of looking at
161
174
  // tolerance.
162
175
 
163
176
  // Should be close to zero and is close to the actual angle.
164
- const cross_ = Math.abs( Math.asin( cross(v1, v2) ) );
177
+ const cross_ = abs( asin( cross(v1, v2) ) );
165
178
 
166
179
  totalAngleError += cross_;
167
- }
180
+ }
168
181
  }
169
182
 
170
183
  //-------------------------------------------------------------------------
@@ -174,22 +187,22 @@ function find3ProngForDelta3s(
174
187
  //-------------------------------------------------------------------------
175
188
  const closestDs = [];
176
189
  for (let i=0; i<curvePiecess.length; i++) {
177
- const p = getCloseBoundaryPointsCertified(
178
- 5, // TODO - see find-2-prong
179
- curvePiecess[i], x
190
+ const pos = getCloseBoundaryPointsCertified(
191
+ curvePiecess[i],
192
+ x
180
193
  )[0];
181
194
 
182
- closestDs.push( distanceBetween(p.p, x) );
195
+ closestDs.push( distanceBetween(pos.p, x) );
183
196
  }
184
- const closestD = Math.min(...closestDs);
185
- const radiusDelta = Math.abs(radius - closestD);
197
+ const closestD = min(...closestDs);
198
+ const radiusDelta = abs(radius - closestD);
186
199
 
187
200
  // Weights below still need to be optimized.
188
201
  const W1 = 1;
189
202
  const W2 = 1;
190
203
  const error = W1*radiusDelta + W2*totalAngleError;
191
204
 
192
- return { poss: poss!, circle, error, δ3s };
205
+ return { threeProngInfo: { poss, circle, δ3s }, error };
193
206
  }
194
207
 
195
208
 
@@ -0,0 +1,52 @@
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { ThreeProngInfo } from './three-prong-info.js';
3
+ import { find3ProngForDelta3s } from './find-3-prong-for-delta3s.js';
4
+ import { getBoundaryPieceBeziers } from '../mat/get-boundary-piece-beziers.js';
5
+ import { timeFunctionCalls } from '../utils/time-function-call.js';
6
+
7
+
8
+ /**
9
+ * Find and return a 3-prong from the given boundary piece.
10
+ *
11
+ * @param δs A boundary piece
12
+ * @param maxCoordPowerOf2 The maximum coordinate power of 2 value used to
13
+ * calculate floating point tolerances.
14
+ *
15
+ * @internal
16
+ */
17
+ function find3Prong(
18
+ δs: CpNode[][],
19
+ maxCoordPowerOf2: number): ThreeProngInfo {
20
+
21
+ // FUTURE if `δs.length > (some threshold (say 4 or 5))` then add two-prongs
22
+ // to reduced the number of permutations required
23
+ // if (δs.length > 3) { console.log(δs.length); }
24
+
25
+ const curvePiecess = δs.map(getBoundaryPieceBeziers);
26
+
27
+ // The best candidate amongst the different 'permutations' of the given δs.
28
+ let threeProng: ThreeProngInfo;
29
+
30
+ let smallestError = Infinity;
31
+ for (let i=1; i<δs.length - 1; i++) {
32
+ for (let k=0; k<3; k++) {
33
+ const r = find3ProngForDelta3s(
34
+ δs, i, k, curvePiecess, maxCoordPowerOf2
35
+ );
36
+
37
+ if (r === undefined) { continue; }
38
+
39
+ const { error, threeProngInfo } = r;
40
+
41
+ if (error < smallestError) {
42
+ smallestError = error;
43
+ threeProng = threeProngInfo;
44
+ }
45
+ }
46
+ }
47
+
48
+ return threeProng!;
49
+ }
50
+
51
+
52
+ export { find3Prong }
@@ -1,14 +1,13 @@
1
- import { CpNode } from '../cp-node/cp-node.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { MatMeta } from '../mat/mat-meta.js';
2
3
  import { calcPosOrder } from '../point-on-shape/calc-pos-order.js';
3
4
  import { find3Prong } from './find-3-prong.js';
4
- import { MatMeta } from '../mat/mat-meta.js';
5
5
  import { addToCpTree } from '../mat/add-to-cp-tree.js';
6
6
  import { getCloseByCpIfExist } from '../mat/get-closeby-cp-if-exist.js';
7
- import { getRealProngCount } from '../cp-node/fs/get-real-prong-count.js';
8
- import { removeVertex } from '../vertex/remove-vertex.js';
9
7
  import { getProngCount } from '../cp-node/fs/get-prong-count.js';
10
8
 
11
9
 
10
+ let ii = 0;
12
11
  /**
13
12
  * @internal
14
13
  * Finds and add a 3-prong MAT circle to the given shape.
@@ -25,14 +24,29 @@ function findAndAdd3Prong(
25
24
  for (const visitedCp of visitedCps) {
26
25
  δs.push([visitedCp, visitedCp.next]);
27
26
  }
27
+
28
+ // TODO - remove - debugging
29
+ //-------------------------
30
+ // ii++;
31
+ // if (ii === 13) {
32
+ // //@ts-ignore
33
+ // if (_debug_.temp === undefined) { _debug_.temp = []; }
34
+ // //@ts-ignore
35
+ // _debug_.temp.push(δs);
36
+ // }
37
+ // //@ts-ignore
38
+ // if (_debug_.temp2 === undefined) { _debug_.temp2 = []; }
39
+ // //@ts-ignore
40
+ // _debug_.temp2.push(δs.length);
41
+ //-------------------------
28
42
 
29
- const threeProngInfo = find3Prong(δs, meta.maxCoordinate);
43
+ const threeProngInfo = find3Prong(δs, meta.maxCoordPowerOf2);
30
44
 
31
45
  const { circle, poss, δ3s } = threeProngInfo;
32
46
 
33
47
  const orders: number[] = [];
34
48
  for (let i=0; i<3; i++) {
35
- orders.push(calcPosOrder(circle, poss[i]));
49
+ orders.push(calcPosOrder(circle.center, poss[i]));
36
50
  }
37
51
 
38
52
  const closeBysFor3Prong: CpNode[] = [];
@@ -3,9 +3,6 @@ import type { MatMeta } from '../mat/mat-meta.js';
3
3
  import { findAndAdd3Prongs } from './find-and-add-3-prongs.js';
4
4
  import { getAllOnLoop } from '../cp-node/fs/get-all-on-loop.js';
5
5
  import { removeVertex } from '../vertex/remove-vertex.js';
6
- // import { LlRbTree } from 'flo-ll-rb-tree';
7
- // import { Loop } from 'flo-boolean';
8
- // import { drawFs } from 'flo-draw';
9
6
  import { getAllOnCircle } from '../cp-node/fs/get-all-on-circle.js';
10
7
 
11
8
 
@@ -28,7 +25,6 @@ function findAndAdd3ProngsOnLoop(
28
25
  reLoop = false;
29
26
  const cpNodeSet = new Set(getAllOnLoop(cpStart));
30
27
  for (const cpNode of cpNodeSet) {
31
-
32
28
  const { closeBysFor3Prong, addedCpNodes } =
33
29
  findAndAdd3Prongs(meta, cpNode);
34
30
 
@@ -46,7 +42,7 @@ function findAndAdd3ProngsOnLoop(
46
42
  cpStart = getFirstItemOfSet(cpNodeGoodSet)!;
47
43
  }
48
44
 
49
- return getFirstItemOfSet(cpNodeGoodSet);
45
+ return cpStart;
50
46
  }
51
47
 
52
48
 
@@ -60,30 +56,18 @@ function getFirstItemOfSet<T>(set: Set<T>) {
60
56
  }
61
57
 
62
58
 
63
- // Unfortunately O(n) until Javascript gives us the simple ability to
64
- // retrieve the first or last item of a set
65
- function getLastItemOfSet<T>(set: Set<T>) {
66
- let item;
67
- for (item of set) {}
68
-
69
- return item;
70
- }
71
-
72
-
73
59
  function replaceCloseBys(
74
- // cpTrees: Map<Loop,LlRbTree<CpNode>>,
75
60
  meta: MatMeta,
76
61
  closeBysFor3Prong: CpNode[],
77
62
  cpNodeSet: Set<CpNode>,
78
63
  cpNodeGoodSet: Set<CpNode>) {
79
64
 
80
- for (const closeBy of [closeBysFor3Prong[0]]) {
81
- getAllOnCircle(closeBy).forEach(v => {
82
- cpNodeSet.delete(v);
83
- cpNodeGoodSet.delete(v);
84
- });
85
- removeVertex(closeBy, meta);
86
- }
65
+ const closeBy = closeBysFor3Prong[0];
66
+ getAllOnCircle(closeBy).forEach(v => {
67
+ cpNodeSet.delete(v);
68
+ cpNodeGoodSet.delete(v);
69
+ });
70
+ removeVertex(closeBy, meta);
87
71
  }
88
72
 
89
73