flo-mat 3.0.15 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/__tests__/cp-node/compare-cp-nodes-by-value.ts +5 -3
  2. package/__tests__/cp-node/compare-poss-by-value.ts +7 -7
  3. package/__tests__/cp-node/fs/get-all-on-circle.spec.ts +8 -8
  4. package/__tests__/cp-node/fs/is-one-prong.spec.ts +3 -3
  5. package/__tests__/cp-node/fs/is-sharp.spec.ts +1 -1
  6. package/__tests__/get-mats1.ts +29 -32
  7. package/__tests__/helpers/close-to.ts +71 -0
  8. package/__tests__/helpers/jest-extend-nearly.ts +39 -0
  9. package/__tests__/helpers/jest.setup.ts +6 -0
  10. package/__tests__/helpers/obj-or-array.ts +8 -0
  11. package/__tests__/jest-extensions.d.ts +26 -0
  12. package/__tests__/lib-load.spec.ts +1 -1
  13. package/browser/index.js +14846 -12124
  14. package/browser/index.min.js +1 -1
  15. package/jest.config.cjs +1 -0
  16. package/node/add-n-prong.ts/join-spokes.d.ts +2 -2
  17. package/node/add-n-prong.ts/join-spokes.js +5 -4
  18. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  19. package/node/closest-boundary-point/cull-bezier-pieces-1.d.ts +9 -0
  20. package/node/closest-boundary-point/{cull-bezier-pieces.js → cull-bezier-pieces-1.js} +6 -7
  21. package/node/closest-boundary-point/cull-bezier-pieces-1.js.map +1 -0
  22. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +7 -5
  23. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +12 -10
  24. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
  25. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +2 -2
  26. package/node/closest-boundary-point/foot-and-endpoint-info.d.ts +9 -9
  27. package/node/closest-boundary-point/get-best-distance-squared.d.ts +4 -3
  28. package/node/closest-boundary-point/get-best-distance-squared.js +11 -11
  29. package/node/closest-boundary-point/get-best-distance-squared.js.map +1 -1
  30. package/node/closest-boundary-point/get-close-boundary-points-certified.d.ts +5 -9
  31. package/node/closest-boundary-point/get-close-boundary-points-certified.js +22 -18
  32. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  33. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.d.ts +4 -8
  34. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js +12 -79
  35. package/node/closest-boundary-point/get-potential-closest-points-on-curve-certified.js.map +1 -1
  36. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.d.ts +1 -1
  37. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js +5 -5
  38. package/node/closest-boundary-point/root-interval-to-distance-squared-interval.js.map +1 -1
  39. package/node/corner/compare-curvatures-at-interface.d.ts +1 -1
  40. package/node/corner/compare-curvatures-at-interface.js +1 -1
  41. package/node/corner/corner.d.ts +7 -6
  42. package/node/corner/get-corner.d.ts +1 -6
  43. package/node/corner/get-corner.js +2 -9
  44. package/node/corner/get-corner.js.map +1 -1
  45. package/node/corner/get-interface-ccw.d.ts +2 -2
  46. package/node/corner/get-interface-ccw.js +4 -5
  47. package/node/corner/get-interface-ccw.js.map +1 -1
  48. package/node/cp-node/cp-node-fs.d.ts +0 -15
  49. package/node/cp-node/cp-node-fs.js +0 -4
  50. package/node/cp-node/cp-node-fs.js.map +1 -1
  51. package/node/cp-node/cp-node.d.ts +10 -10
  52. package/node/cp-node/fs/clone.js.map +1 -1
  53. package/node/cp-node/fs/cp-node-comparator.js +2 -2
  54. package/node/cp-node/fs/cp-node-comparator.js.map +1 -1
  55. package/node/cp-node/fs/enhance-cp-node.d.ts +1 -1
  56. package/node/cp-node/fs/enhance-cp-node.js +5 -5
  57. package/node/cp-node/fs/enhance-cp-node.js.map +1 -1
  58. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +2 -2
  59. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
  60. package/node/cp-node/fs/get-cp-node-ordering.js +4 -4
  61. package/node/cp-node/fs/get-cp-node-ordering.js.map +1 -1
  62. package/node/cp-node/fs/get-edge-direction.js +3 -3
  63. package/node/cp-node/fs/get-edge-direction.js.map +1 -1
  64. package/node/cp-node/fs/get-hole-closers.d.ts +1 -1
  65. package/node/cp-node/fs/get-implied-boundary-bezier-between.js +2 -2
  66. package/node/cp-node/fs/get-implied-boundary-bezier-between.js.map +1 -1
  67. package/node/cp-node/fs/get-mat-curve-between.d.ts +1 -1
  68. package/node/cp-node/fs/get-mat-curve-between.js +6 -5
  69. package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
  70. package/node/cp-node/fs/get-salience.d.ts +1 -1
  71. package/node/cp-node/fs/get-salience.js +3 -3
  72. package/node/cp-node/fs/get-salience.js.map +1 -1
  73. package/node/cp-node/fs/insert-cp-node.d.ts +3 -3
  74. package/node/cp-node/fs/insert-cp-node.js +3 -4
  75. package/node/cp-node/fs/insert-cp-node.js.map +1 -1
  76. package/node/cp-node/fs/is-one-prong.d.ts +1 -1
  77. package/node/cp-node/fs/is-one-prong.js +2 -9
  78. package/node/cp-node/fs/is-one-prong.js.map +1 -1
  79. package/node/cp-node/fs/is-order-correct.d.ts +2 -2
  80. package/node/cp-node/fs/is-order-correct.js +5 -8
  81. package/node/cp-node/fs/is-order-correct.js.map +1 -1
  82. package/node/cp-node/fs/is-sharp.js +1 -1
  83. package/node/cp-node/fs/is-sharp.js.map +1 -1
  84. package/node/cp-node/fs/remove-cp-node.js +1 -2
  85. package/node/cp-node/fs/remove-cp-node.js.map +1 -1
  86. package/node/debug/debug-elem-types.d.ts +1 -2
  87. package/node/debug/debug-elem-types.js +1 -2
  88. package/node/debug/debug-elem-types.js.map +1 -1
  89. package/node/debug/functions/draw-elem/draw-cp-node.js +2 -2
  90. package/node/debug/functions/draw-elem/draw-cp-node.js.map +1 -1
  91. package/node/debug/functions/draw-elem/draw-elem.js +1 -5
  92. package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
  93. package/node/debug/functions/draw-elem/draw-leaves.js +2 -2
  94. package/node/debug/functions/draw-elem/draw-leaves.js.map +1 -1
  95. package/node/debug/functions/draw-elem/draw-max-vertex.d.ts +1 -1
  96. package/node/debug/functions/draw-elem/draw-max-vertex.js +1 -1
  97. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +1 -1
  98. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js +12 -3
  99. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +1 -1
  100. package/node/debug/functions/draw-elem/draw-one-prong.d.ts +2 -2
  101. package/node/debug/functions/draw-elem/draw-one-prong.js +8 -7
  102. package/node/debug/functions/draw-elem/draw-one-prong.js.map +1 -1
  103. package/node/debug/functions/draw-elem/draw-three-prong.js +2 -2
  104. package/node/debug/functions/draw-elem/draw-three-prong.js.map +1 -1
  105. package/node/debug/functions/draw-elem/draw-two-prong.js +4 -3
  106. package/node/debug/functions/draw-elem/draw-two-prong.js.map +1 -1
  107. package/node/debug/functions/draw-elem/draw-vertex.js +1 -1
  108. package/node/debug/functions/draw-elem/draw-vertex.js.map +1 -1
  109. package/node/debug/functions/general.js +1 -1
  110. package/node/debug/functions/general.js.map +1 -1
  111. package/node/find-2-prong/add-1-prong.d.ts +3 -3
  112. package/node/find-2-prong/add-1-prong.js +4 -4
  113. package/node/find-2-prong/add-1-prong.js.map +1 -1
  114. package/node/find-2-prong/add-2-prong.d.ts +10 -11
  115. package/node/find-2-prong/add-2-prong.js +42 -37
  116. package/node/find-2-prong/add-2-prong.js.map +1 -1
  117. package/node/find-2-prong/calc-seperation-tolerance.js +4 -7
  118. package/node/find-2-prong/calc-seperation-tolerance.js.map +1 -1
  119. package/node/find-2-prong/cull-bezier-pieces.d.ts +9 -7
  120. package/node/find-2-prong/cull-bezier-pieces.js +30 -15
  121. package/node/find-2-prong/cull-bezier-pieces.js.map +1 -1
  122. package/node/find-2-prong/find-2-prong.d.ts +12 -13
  123. package/node/find-2-prong/find-2-prong.js +73 -116
  124. package/node/find-2-prong/find-2-prong.js.map +1 -1
  125. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.d.ts +4 -4
  126. package/node/find-2-prong/find-and-add-2-prongs-on-all-loops.js.map +1 -1
  127. package/node/find-2-prong/find-and-add-2-prongs.d.ts +5 -4
  128. package/node/find-2-prong/find-and-add-2-prongs.js +28 -24
  129. package/node/find-2-prong/find-and-add-2-prongs.js.map +1 -1
  130. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.d.ts +6 -8
  131. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js +11 -12
  132. package/node/find-2-prong/find-and-add-hole-closing-2-prongs.js.map +1 -1
  133. package/node/find-2-prong/get-initial-bezier-pieces.d.ts +5 -6
  134. package/node/find-2-prong/get-initial-bezier-pieces.js +8 -11
  135. package/node/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
  136. package/node/find-2-prong/get-initial-x.d.ts +12 -0
  137. package/node/find-2-prong/get-initial-x.js +35 -0
  138. package/node/find-2-prong/get-initial-x.js.map +1 -0
  139. package/node/find-2-prong/get-medial/antipodal-point.d.ts +8 -0
  140. package/node/find-2-prong/get-medial/antipodal-point.js +2 -0
  141. package/node/find-2-prong/get-medial/antipodal-point.js.map +1 -0
  142. package/node/find-2-prong/get-medial/get-antipodal-points.d.ts +18 -0
  143. package/node/find-2-prong/get-medial/get-antipodal-points.js +41 -0
  144. package/node/find-2-prong/get-medial/get-antipodal-points.js.map +1 -0
  145. package/node/find-2-prong/get-medial/get-closest-points.d.ts +15 -0
  146. package/node/find-2-prong/get-medial/get-closest-points.js +163 -0
  147. package/node/find-2-prong/get-medial/get-closest-points.js.map +1 -0
  148. package/node/find-2-prong/reduce-radius.d.ts +4 -4
  149. package/node/find-2-prong/reduce-radius.js +30 -50
  150. package/node/find-2-prong/reduce-radius.js.map +1 -1
  151. package/node/find-3-prong/calc-better-x.d.ts +22 -0
  152. package/node/{find-3-prong.ts → find-3-prong}/calc-better-x.js +8 -5
  153. package/node/find-3-prong/calc-better-x.js.map +1 -0
  154. package/node/find-3-prong/calc-initial-3-prong-center.d.ts +15 -0
  155. package/node/find-3-prong/calc-initial-3-prong-center.js +26 -0
  156. package/node/find-3-prong/calc-initial-3-prong-center.js.map +1 -0
  157. package/node/find-3-prong/find-3-prong-for-delta3s.d.ts +19 -0
  158. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.js +32 -34
  159. package/node/find-3-prong/find-3-prong-for-delta3s.js.map +1 -0
  160. package/node/find-3-prong/find-3-prong.d.ts +13 -0
  161. package/node/{find-3-prong.ts → find-3-prong}/find-3-prong.js +14 -9
  162. package/node/find-3-prong/find-3-prong.js.map +1 -0
  163. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.js +2 -2
  164. package/node/find-3-prong/find-and-add-3-prong.js.map +1 -0
  165. package/node/find-3-prong/find-and-add-3-prongs-on-loop.js.map +1 -0
  166. package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.js +1 -1
  167. package/node/find-3-prong/find-and-add-3-prongs.js.map +1 -0
  168. package/node/find-3-prong/get-closest-points.d.ts +10 -0
  169. package/node/{find-3-prong.ts → find-3-prong}/get-closest-points.js +5 -5
  170. package/node/find-3-prong/get-closest-points.js.map +1 -0
  171. package/node/find-3-prong/three-prong-info.d.ts +9 -0
  172. package/node/find-3-prong/three-prong-info.js +2 -0
  173. package/node/find-3-prong/three-prong-info.js.map +1 -0
  174. package/node/find-mat/clip-options.d.ts +2 -2
  175. package/node/find-mat/clip-options.js +7 -14
  176. package/node/find-mat/clip-options.js.map +1 -1
  177. package/node/find-mat/create-initial-cp-tree.d.ts +8 -7
  178. package/node/find-mat/create-initial-cp-tree.js +16 -19
  179. package/node/find-mat/create-initial-cp-tree.js.map +1 -1
  180. package/node/find-mat/find-mat.d.ts +1 -1
  181. package/node/find-mat/find-mat.js +6 -12
  182. package/node/find-mat/find-mat.js.map +1 -1
  183. package/node/find-mat/find-mats.js +7 -12
  184. package/node/find-mat/find-mats.js.map +1 -1
  185. package/node/find-mat/get-dull-corners-on-loop.d.ts +3 -3
  186. package/node/find-mat/get-dull-corners-on-loop.js +5 -4
  187. package/node/find-mat/get-dull-corners-on-loop.js.map +1 -1
  188. package/node/find-mat/get-for-1-prongs-on-loop.d.ts +7 -7
  189. package/node/find-mat/get-for-1-prongs-on-loop.js +9 -21
  190. package/node/find-mat/get-for-1-prongs-on-loop.js.map +1 -1
  191. package/node/find-mat/get-for-2-prongs-on-loop.d.ts +5 -4
  192. package/node/find-mat/get-for-2-prongs-on-loop.js +4 -6
  193. package/node/find-mat/get-for-2-prongs-on-loop.js.map +1 -1
  194. package/node/find-mat/get-meta.d.ts +1 -1
  195. package/node/find-mat/get-meta.js +12 -12
  196. package/node/find-mat/get-meta.js.map +1 -1
  197. package/node/find-mat/get-sharp-corners.d.ts +3 -3
  198. package/node/find-mat/get-sharp-corners.js +2 -3
  199. package/node/find-mat/get-sharp-corners.js.map +1 -1
  200. package/node/find-mat/mat-options.d.ts +15 -15
  201. package/node/find-mat/mat-options.js +7 -4
  202. package/node/find-mat/mat-options.js.map +1 -1
  203. package/node/floyd-warshall/floyd-warshall.js +1 -1
  204. package/node/floyd-warshall/floyd-warshall.js.map +1 -1
  205. package/node/floyd-warshall/get-graph.js +2 -2
  206. package/node/floyd-warshall/get-graph.js.map +1 -1
  207. package/node/floyd-warshall/get-hole-closer-pairs.js +6 -6
  208. package/node/floyd-warshall/get-hole-closer-pairs.js.map +1 -1
  209. package/node/geometry/circle.d.ts +1 -0
  210. package/node/geometry/circle.js +1 -0
  211. package/node/geometry/circle.js.map +1 -1
  212. package/node/geometry/get-closest-square-distance-to-rect.js +1 -4
  213. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  214. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js +2 -1
  215. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  216. package/node/index.d.ts +0 -7
  217. package/node/index.js +0 -5
  218. package/node/index.js.map +1 -1
  219. package/node/loop/get-max-coordinate.d.ts +2 -1
  220. package/node/loop/get-max-coordinate.js +6 -8
  221. package/node/loop/get-max-coordinate.js.map +1 -1
  222. package/node/mat/add-to-cp-tree.d.ts +3 -3
  223. package/node/mat/add-to-cp-tree.js +5 -5
  224. package/node/mat/add-to-cp-tree.js.map +1 -1
  225. package/node/mat/create-new-cp-trees.d.ts +10 -0
  226. package/node/mat/create-new-cp-trees.js +24 -0
  227. package/node/mat/create-new-cp-trees.js.map +1 -0
  228. package/node/mat/curve-piece.d.ts +1 -1
  229. package/node/mat/get-boundary-piece-beziers.d.ts +3 -3
  230. package/node/mat/get-boundary-piece-beziers.js +125 -20
  231. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  232. package/node/mat/get-branches.d.ts +1 -1
  233. package/node/mat/get-closeby-cp-if-exist.d.ts +5 -5
  234. package/node/mat/get-closeby-cp-if-exist.js +6 -5
  235. package/node/mat/get-closeby-cp-if-exist.js.map +1 -1
  236. package/node/mat/get-cp-node-to-left-or-same.d.ts +3 -3
  237. package/node/mat/get-cp-node-to-left-or-same.js +2 -2
  238. package/node/mat/get-cp-node-to-left-or-same.js.map +1 -1
  239. package/node/mat/get-largest-vertex.d.ts +1 -1
  240. package/node/mat/get-largest-vertex.js +1 -1
  241. package/node/mat/get-largest-vertex.js.map +1 -1
  242. package/node/mat/mat-meta.d.ts +2 -3
  243. package/node/mat/mat.d.ts +5 -5
  244. package/node/mat/simplify-mat.js +5 -4
  245. package/node/mat/simplify-mat.js.map +1 -1
  246. package/node/mat/trim-mat.d.ts +3 -2
  247. package/node/mat/trim-mat.js +5 -3
  248. package/node/mat/trim-mat.js.map +1 -1
  249. package/node/point-on-shape/calc-pos-order.d.ts +8 -5
  250. package/node/point-on-shape/calc-pos-order.js +7 -7
  251. package/node/point-on-shape/calc-pos-order.js.map +1 -1
  252. package/node/point-on-shape/compare-poss.d.ts +4 -0
  253. package/node/point-on-shape/compare-poss.js +12 -0
  254. package/node/point-on-shape/compare-poss.js.map +1 -1
  255. package/node/point-on-shape/get-osculating-circle.d.ts +5 -6
  256. package/node/point-on-shape/get-osculating-circle.js +17 -20
  257. package/node/point-on-shape/get-osculating-circle.js.map +1 -1
  258. package/node/point-on-shape/get-pos-corner.d.ts +18 -4
  259. package/node/point-on-shape/get-pos-corner.js +6 -6
  260. package/node/point-on-shape/get-pos-corner.js.map +1 -1
  261. package/node/point-on-shape/is-pos-corner.d.ts +3 -2
  262. package/node/point-on-shape/is-pos-corner.js.map +1 -1
  263. package/node/point-on-shape/is-pos-sharp-corner.d.ts +1 -12
  264. package/node/point-on-shape/is-pos-sharp-corner.js +4 -5
  265. package/node/point-on-shape/is-pos-sharp-corner.js.map +1 -1
  266. package/node/point-on-shape/point-on-shape.d.ts +39 -6
  267. package/node/point-on-shape/pos-to-human-string.d.ts +1 -1
  268. package/node/point-on-shape/pos-to-human-string.js.map +1 -1
  269. package/node/point-on-shape/to-p.d.ts +9 -0
  270. package/node/point-on-shape/to-p.js +13 -0
  271. package/node/point-on-shape/to-p.js.map +1 -0
  272. package/node/sat/add-debug-info.d.ts +2 -1
  273. package/node/sat/add-debug-info.js +2 -1
  274. package/node/sat/add-debug-info.js.map +1 -1
  275. package/node/sat/cull-non-cycles.d.ts +2 -1
  276. package/node/sat/cull-non-cycles.js +5 -3
  277. package/node/sat/cull-non-cycles.js.map +1 -1
  278. package/node/sat/cull.js +3 -4
  279. package/node/sat/cull.js.map +1 -1
  280. package/node/sat/get-leaves.d.ts +1 -1
  281. package/node/sat/get-leaves.js +1 -2
  282. package/node/sat/get-leaves.js.map +1 -1
  283. package/node/sat/get-sat-culls.d.ts +2 -2
  284. package/node/sat/get-sat-culls.js +3 -3
  285. package/node/sat/get-sat-culls.js.map +1 -1
  286. package/node/sat/to-scale-axis.d.ts +1 -1
  287. package/node/sat/to-scale-axis.js +2 -2
  288. package/node/sat/to-scale-axis.js.map +1 -1
  289. package/node/svg/get-loop-bounds.d.ts +7 -7
  290. package/node/svg/get-loop-bounds.js +33 -70
  291. package/node/svg/get-loop-bounds.js.map +1 -1
  292. package/node/svg/get-min-y-pos.d.ts +2 -3
  293. package/node/svg/get-min-y-pos.js +2 -2
  294. package/node/svg/get-min-y-pos.js.map +1 -1
  295. package/node/svg/get-shape-bounds.d.ts +6 -6
  296. package/node/svg/get-shape-bounds.js +6 -6
  297. package/node/svg/get-shape-bounds.js.map +1 -1
  298. package/node/utils/mutable.d.ts +4 -0
  299. package/node/utils/mutable.js +2 -0
  300. package/node/utils/mutable.js.map +1 -0
  301. package/node/utils/sum.js.map +1 -1
  302. package/node/utils/time-function-call.d.ts +14 -0
  303. package/node/utils/time-function-call.js +32 -0
  304. package/node/utils/time-function-call.js.map +1 -0
  305. package/node/vertex/remove-vertex.d.ts +1 -0
  306. package/node/vertex/remove-vertex.js +1 -1
  307. package/node/vertex/remove-vertex.js.map +1 -1
  308. package/package.json +3 -5
  309. package/src/add-n-prong.ts/join-spokes.ts +8 -6
  310. package/src/closest-boundary-point/{cull-bezier-pieces.ts → cull-bezier-pieces-1.ts} +7 -7
  311. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +15 -14
  312. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +2 -2
  313. package/src/closest-boundary-point/foot-and-endpoint-info.ts +8 -10
  314. package/src/closest-boundary-point/get-best-distance-squared.ts +18 -15
  315. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +27 -31
  316. package/src/closest-boundary-point/get-potential-closest-points-on-curve-certified.ts +13 -88
  317. package/src/closest-boundary-point/root-interval-to-distance-squared-interval.ts +5 -5
  318. package/src/corner/compare-curvatures-at-interface.ts +1 -1
  319. package/src/corner/corner.ts +7 -6
  320. package/src/corner/get-corner.ts +4 -11
  321. package/src/corner/get-interface-ccw.ts +5 -5
  322. package/src/cp-node/cp-node-fs.ts +0 -5
  323. package/src/cp-node/cp-node.ts +12 -10
  324. package/src/cp-node/fs/add-distance-from.ts +1 -2
  325. package/src/cp-node/fs/clone.ts +2 -1
  326. package/src/cp-node/fs/cp-node-comparator.ts +2 -2
  327. package/src/cp-node/fs/enhance-cp-node.ts +5 -5
  328. package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +2 -2
  329. package/src/cp-node/fs/get-cp-node-ordering.ts +4 -4
  330. package/src/cp-node/fs/get-edge-direction.ts +3 -3
  331. package/src/cp-node/fs/get-hole-closers.ts +1 -1
  332. package/src/cp-node/fs/get-implied-boundary-bezier-between.ts +2 -2
  333. package/src/cp-node/fs/get-mat-curve-between.ts +8 -6
  334. package/src/cp-node/fs/get-salience.ts +4 -4
  335. package/src/cp-node/fs/insert-cp-node.ts +10 -10
  336. package/src/cp-node/fs/is-one-prong.ts +3 -14
  337. package/src/cp-node/fs/is-order-correct.ts +6 -8
  338. package/src/cp-node/fs/is-sharp.ts +1 -1
  339. package/src/cp-node/fs/remove-cp-node.ts +4 -6
  340. package/src/cp-node/stringification/cp-node-stringifyable.ts +7 -16
  341. package/src/cp-node/stringification/from-stringifyable.ts +6 -6
  342. package/src/cp-node/stringification/to-stringifyable.ts +5 -9
  343. package/src/debug/debug-elem-types.ts +2 -3
  344. package/src/{mat → debug}/elem-type-two-prong.ts +1 -1
  345. package/src/debug/functions/check-ordering.ts +13 -16
  346. package/src/debug/functions/cmp-cp-on-delta.ts +3 -3
  347. package/src/debug/functions/draw-elem/draw-cp-node.ts +2 -2
  348. package/src/debug/functions/draw-elem/draw-elem.ts +1 -5
  349. package/src/debug/functions/draw-elem/draw-leaves.ts +2 -2
  350. package/src/debug/functions/draw-elem/draw-max-vertex.ts +3 -3
  351. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +17 -3
  352. package/src/debug/functions/draw-elem/draw-one-prong.ts +10 -8
  353. package/src/debug/functions/draw-elem/draw-three-prong.ts +2 -2
  354. package/src/debug/functions/draw-elem/draw-two-prong.ts +4 -3
  355. package/src/debug/functions/draw-elem/draw-vertex.ts +1 -1
  356. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +2 -2
  357. package/src/debug/functions/general.ts +1 -1
  358. package/src/debug/functions/three-prong.ts +220 -220
  359. package/src/find-2-prong/add-1-prong.ts +8 -8
  360. package/src/find-2-prong/add-2-prong.ts +64 -58
  361. package/src/find-2-prong/calc-seperation-tolerance.ts +4 -8
  362. package/src/find-2-prong/cull-bezier-pieces.ts +41 -21
  363. package/src/find-2-prong/find-2-prong.ts +102 -151
  364. package/src/find-2-prong/find-and-add-2-prong.ts +23 -23
  365. package/src/find-2-prong/find-and-add-2-prongs-on-all-loops.ts +4 -6
  366. package/src/find-2-prong/find-and-add-2-prongs.ts +44 -29
  367. package/src/find-2-prong/find-and-add-hole-closing-2-prongs.ts +15 -15
  368. package/src/find-2-prong/get-initial-bezier-pieces.ts +21 -24
  369. package/src/find-2-prong/get-initial-x.ts +52 -0
  370. package/src/find-2-prong/get-medial/antipodal-point.ts +12 -0
  371. package/src/find-2-prong/get-medial/get-antipodal-points.ts +63 -0
  372. package/src/find-2-prong/get-medial/get-closest-points.ts +213 -0
  373. package/src/find-2-prong/reduce-radius.ts +38 -61
  374. package/src/find-2-prong/x-for-debugging.ts +9 -9
  375. package/src/{find-3-prong.ts → find-3-prong}/calc-better-x.ts +18 -11
  376. package/src/{find-3-prong.ts → find-3-prong}/calc-initial-3-prong-center.ts +12 -14
  377. package/src/{find-3-prong.ts → find-3-prong}/find-3-prong-for-delta3s.ts +46 -51
  378. package/src/find-3-prong/find-3-prong.ts +52 -0
  379. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.ts +2 -2
  380. package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.ts +1 -1
  381. package/src/{find-3-prong.ts → find-3-prong}/get-closest-points.ts +8 -5
  382. package/src/find-3-prong/three-prong-info.ts +13 -0
  383. package/src/find-mat/clip-options.ts +11 -16
  384. package/src/find-mat/create-initial-cp-tree.ts +28 -33
  385. package/src/find-mat/find-mat.ts +10 -17
  386. package/src/find-mat/find-mats.ts +9 -13
  387. package/src/find-mat/fix-ordering.ts +58 -58
  388. package/src/find-mat/get-dull-corners-on-loop.ts +12 -10
  389. package/src/find-mat/get-for-1-prongs-on-loop.ts +11 -33
  390. package/src/find-mat/get-for-2-prongs-on-loop.ts +9 -12
  391. package/src/find-mat/get-meta.ts +16 -14
  392. package/src/find-mat/get-sharp-corners.ts +7 -8
  393. package/src/find-mat/mat-options.ts +22 -19
  394. package/src/floyd-warshall/floyd-warshall.ts +1 -1
  395. package/src/floyd-warshall/get-graph.ts +2 -2
  396. package/src/floyd-warshall/get-hole-closer-pairs.ts +6 -6
  397. package/src/geometry/circle.ts +1 -0
  398. package/src/geometry/get-closest-square-distance-to-rect.ts +3 -8
  399. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +3 -2
  400. package/src/index.ts +0 -7
  401. package/src/loop/get-max-coordinate.ts +8 -9
  402. package/src/mat/add-to-cp-tree.ts +10 -11
  403. package/src/mat/clone-mat.ts +8 -4
  404. package/src/mat/clone-meta.ts +22 -10
  405. package/src/mat/create-new-cp-trees.ts +35 -0
  406. package/src/mat/curve-piece.ts +1 -1
  407. package/src/mat/get-boundary-piece-beziers.ts +153 -37
  408. package/src/mat/get-branches.ts +1 -1
  409. package/src/mat/get-closeby-cp-if-exist.ts +11 -12
  410. package/src/mat/get-cp-node-to-left-or-same.ts +5 -5
  411. package/src/mat/get-largest-3-prong.ts +2 -2
  412. package/src/mat/get-largest-vertex.ts +2 -2
  413. package/src/mat/mat-meta.ts +3 -2
  414. package/src/mat/mat.ts +5 -5
  415. package/src/mat/simplify-mat.ts +5 -4
  416. package/src/mat/trim-mat.ts +6 -4
  417. package/src/point-on-shape/calc-pos-order.ts +10 -11
  418. package/src/point-on-shape/compare-poss.ts +11 -1
  419. package/src/point-on-shape/get-osculating-circle.ts +25 -28
  420. package/src/point-on-shape/get-pos-corner.ts +14 -12
  421. package/src/point-on-shape/is-pos-corner.ts +1 -4
  422. package/src/point-on-shape/is-pos-dull-corner.ts +9 -9
  423. package/src/point-on-shape/is-pos-quite-dull-corner.ts +7 -6
  424. package/src/point-on-shape/is-pos-quite-sharp-corner.ts +7 -6
  425. package/src/point-on-shape/is-pos-sharp-corner.ts +6 -5
  426. package/src/point-on-shape/point-on-shape.ts +44 -6
  427. package/src/point-on-shape/pos-to-human-string.ts +4 -2
  428. package/src/point-on-shape/to-p.ts +19 -0
  429. package/src/sat/add-debug-info.ts +3 -3
  430. package/src/sat/cull-non-cycles.ts +8 -6
  431. package/src/sat/cull.ts +7 -8
  432. package/src/sat/get-leaves.ts +2 -4
  433. package/src/sat/get-sat-culls.ts +6 -5
  434. package/src/sat/to-scale-axis.ts +4 -5
  435. package/src/svg/get-loop-bounds.ts +61 -86
  436. package/src/svg/get-min-y-pos.ts +3 -4
  437. package/src/svg/get-shape-bounds.ts +12 -12
  438. package/src/sweep-line/are-boxes-intersecting.ts +3 -2
  439. package/src/utils/mutable.ts +7 -0
  440. package/src/utils/rad-to-deg.ts +1 -1
  441. package/src/utils/smart-log.ts +20 -0
  442. package/src/utils/sum.ts +3 -1
  443. package/src/utils/time-function-call.ts +53 -0
  444. package/src/vertex/remove-vertex.ts +1 -3
  445. package/.eslintrc.cjs +0 -69
  446. package/__tests__/cp-node/fs/get-avg-speed.spec.ts +0 -7
  447. package/__tests__/cp-node/fs/get-smoothed-speed.spec.ts +0 -7
  448. package/__tests__/cp-node/fs/get-smoothed.spec.ts +0 -7
  449. package/__tests__/cp-node/fs/get-speed.spec.ts +0 -7
  450. package/__tests__/cp-node/fs/is-order-correct.spec.ts +0 -7
  451. package/node/bezier/fit-quads-to-cubic.d.ts +0 -19
  452. package/node/bezier/fit-quads-to-cubic.js +0 -83
  453. package/node/bezier/fit-quads-to-cubic.js.map +0 -1
  454. package/node/bezier/total-curvature.d.ts +0 -14
  455. package/node/bezier/total-curvature.js +0 -5
  456. package/node/bezier/total-curvature.js.map +0 -1
  457. package/node/bezier/total-length.d.ts +0 -14
  458. package/node/bezier/total-length.js +0 -5
  459. package/node/bezier/total-length.js.map +0 -1
  460. package/node/closest-boundary-point/cull-bezier-pieces.d.ts +0 -10
  461. package/node/closest-boundary-point/cull-bezier-pieces.js.map +0 -1
  462. package/node/closest-boundary-point/dd-deflate-with-running-error.d.ts +0 -25
  463. package/node/closest-boundary-point/dd-deflate-with-running-error.js +0 -68
  464. package/node/closest-boundary-point/dd-deflate-with-running-error.js.map +0 -1
  465. package/node/contact-point/contact-point.d.ts +0 -26
  466. package/node/contact-point/contact-point.js +0 -22
  467. package/node/contact-point/contact-point.js.map +0 -1
  468. package/node/cp-node/fs/get-smoothed-speed.d.ts +0 -14
  469. package/node/cp-node/fs/get-smoothed-speed.js +0 -75
  470. package/node/cp-node/fs/get-smoothed-speed.js.map +0 -1
  471. package/node/cp-node/fs/get-speed.d.ts +0 -15
  472. package/node/cp-node/fs/get-speed.js +0 -39
  473. package/node/cp-node/fs/get-speed.js.map +0 -1
  474. package/node/debug/cp-node-for-debugging.d.ts +0 -11
  475. package/node/debug/cp-node-for-debugging.js +0 -2
  476. package/node/debug/cp-node-for-debugging.js.map +0 -1
  477. package/node/debug/functions/draw-elem/draw-speed.d.ts +0 -4
  478. package/node/debug/functions/draw-elem/draw-speed.js +0 -21
  479. package/node/debug/functions/draw-elem/draw-speed.js.map +0 -1
  480. package/node/error-analysis/gamma.d.ts +0 -26
  481. package/node/error-analysis/gamma.js +0 -35
  482. package/node/error-analysis/gamma.js.map +0 -1
  483. package/node/find-2-prong/find-and-add-2-prong.d.ts +0 -11
  484. package/node/find-2-prong/find-and-add-2-prong.js +0 -19
  485. package/node/find-2-prong/find-and-add-2-prong.js.map +0 -1
  486. package/node/find-2-prong/find-equidistant-point-on-line-dd.d.ts +0 -10
  487. package/node/find-2-prong/find-equidistant-point-on-line-dd.js +0 -56
  488. package/node/find-2-prong/find-equidistant-point-on-line-dd.js.map +0 -1
  489. package/node/find-3-prong.ts/calc-better-x.d.ts +0 -19
  490. package/node/find-3-prong.ts/calc-better-x.js.map +0 -1
  491. package/node/find-3-prong.ts/calc-initial-3-prong-center.d.ts +0 -13
  492. package/node/find-3-prong.ts/calc-initial-3-prong-center.js +0 -27
  493. package/node/find-3-prong.ts/calc-initial-3-prong-center.js.map +0 -1
  494. package/node/find-3-prong.ts/find-3-prong-for-delta3s.d.ts +0 -22
  495. package/node/find-3-prong.ts/find-3-prong-for-delta3s.js.map +0 -1
  496. package/node/find-3-prong.ts/find-3-prong.d.ts +0 -16
  497. package/node/find-3-prong.ts/find-3-prong.js.map +0 -1
  498. package/node/find-3-prong.ts/find-and-add-3-prong.js.map +0 -1
  499. package/node/find-3-prong.ts/find-and-add-3-prongs-on-loop.js.map +0 -1
  500. package/node/find-3-prong.ts/find-and-add-3-prongs.js.map +0 -1
  501. package/node/find-3-prong.ts/get-closest-points.d.ts +0 -9
  502. package/node/find-3-prong.ts/get-closest-points.js.map +0 -1
  503. package/node/mat/connect-hole-closers.d.ts +0 -3
  504. package/node/mat/connect-hole-closers.js +0 -5
  505. package/node/mat/connect-hole-closers.js.map +0 -1
  506. package/node/mat/create-new-cp-tree.d.ts +0 -9
  507. package/node/mat/create-new-cp-tree.js +0 -23
  508. package/node/mat/create-new-cp-tree.js.map +0 -1
  509. package/node/memoize-primitive.d.ts +0 -11
  510. package/node/memoize-primitive.js +0 -25
  511. package/node/memoize-primitive.js.map +0 -1
  512. package/node/point-on-shape/create-pos.d.ts +0 -4
  513. package/node/point-on-shape/create-pos.js +0 -11
  514. package/node/point-on-shape/create-pos.js.map +0 -1
  515. package/node/point-on-shape/is-pos-quite-sharp-corner.d.ts +0 -17
  516. package/node/point-on-shape/is-pos-quite-sharp-corner.js +0 -14
  517. package/node/point-on-shape/is-pos-quite-sharp-corner.js.map +0 -1
  518. package/src/bezier/fit-quads-to-cubic.ts +0 -103
  519. package/src/bezier/total-curvature.ts +0 -8
  520. package/src/bezier/total-length.ts +0 -8
  521. package/src/closest-boundary-point/closest-points-on-curve-precise.ts +0 -75
  522. package/src/closest-boundary-point/closest-points-on-curve.ts +0 -72
  523. package/src/closest-boundary-point/dd-deflate-with-running-error.ts +0 -88
  524. package/src/contact-point/contact-point.ts +0 -42
  525. package/src/cp-node/fs/get-avg-speed.ts +0 -31
  526. package/src/cp-node/fs/get-smoothed-speed.ts +0 -97
  527. package/src/cp-node/fs/get-smoothed.ts +0 -62
  528. package/src/cp-node/fs/get-speed.ts +0 -56
  529. package/src/curve/curve.ts +0 -35
  530. package/src/dbscan/dbscan.ts +0 -91
  531. package/src/debug/cp-node-for-debugging.ts +0 -15
  532. package/src/debug/functions/draw-elem/draw-speed.ts +0 -35
  533. package/src/debug/three-prong-for-debugging.ts +0 -58
  534. package/src/debug/two-prong-for-debugging.ts +0 -30
  535. package/src/dijkstra/dijkstra.ts +0 -418
  536. package/src/find-2-prong/find-and-add-2-prongs-on-all-paths.ts +0 -38
  537. package/src/find-2-prong/find-equidistant-point-on-line-dd.ts +0 -77
  538. package/src/find-2-prong/find-equidistant-point-on-line.ts +0 -40
  539. package/src/find-2-prong/pyth-trips.ts +0 -146
  540. package/src/find-3-prong.ts/add-3-prong.ts +0 -113
  541. package/src/find-3-prong.ts/array-set.ts +0 -47
  542. package/src/find-3-prong.ts/find-3-prong.ts +0 -48
  543. package/src/find-3-prong.ts/find-and-add-all-3-prongs.ts +0 -109
  544. package/src/find-mat/add-2-prongs-by-error.ts +0 -122
  545. package/src/find-mat/add-debug-info.ts +0 -93
  546. package/src/find-mat/cp-node-for-insertion.ts +0 -13
  547. package/src/find-mat/get-dull-corners.ts +0 -34
  548. package/src/find-mat/get-half-angles.ts +0 -95
  549. package/src/find-mat/get-size-params.ts +0 -34
  550. package/src/find-mat/get-total-by.ts +0 -27
  551. package/src/get-curve/get-curve-between.ts +0 -80
  552. package/src/get-curve/get-edge-direction.ts +0 -70
  553. package/src/mat/add-to-cp-graph.ts +0 -60
  554. package/src/mat/cmp-cp-on-delta.ts +0 -56
  555. package/src/mat/connect-hole-closers.ts +0 -9
  556. package/src/mat/create-new-cp-tree.ts +0 -32
  557. package/src/mat/get-edges-as-array.ts +0 -18
  558. package/src/mat/get-largest-three-prong.ts +0 -14
  559. package/src/mat/get-neighboring-cps.ts +0 -49
  560. package/src/mat/is-another-cp-closeby.ts +0 -69
  561. package/src/mat/simplify-mat-map-only.ts +0 -110
  562. package/src/memoize-primitive.ts +0 -31
  563. package/src/point-on-shape/create-pos.ts +0 -20
  564. package/src/sat/cull-by-salience.ts +0 -115
  565. package/src/svg/get-extreme.ts +0 -23
  566. package/src/utils/bezier-piece-to-bezier.ts +0 -13
  567. package/src/utils/sleep.ts +0 -7
  568. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prong.d.ts +0 -0
  569. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.d.ts +0 -0
  570. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.js +0 -0
  571. /package/node/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs.d.ts +0 -0
  572. /package/src/{find-3-prong.ts → find-3-prong}/find-and-add-3-prongs-on-loop.ts +0 -0
@@ -1,11 +1,11 @@
1
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
2
+ import type { Circle } from '../geometry/circle.js';
3
+ import type { MatMeta } from '../mat/mat-meta.js';
1
4
  import { addToCpTree } from '../mat/add-to-cp-tree.js';
2
5
  import { getCloseByCpIfExist } from '../mat/get-closeby-cp-if-exist.js';
3
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
4
6
  import { calcPosOrder } from '../point-on-shape/calc-pos-order.js';
5
- import { Circle } from '../geometry/circle.js';
6
- import { MatMeta } from '../mat/mat-meta.js';
7
7
  import { isPosCorner } from '../point-on-shape/is-pos-corner.js';
8
- import { getPosCorner } from '../point-on-shape/get-pos-corner.js';
8
+ import { getPosCorner$ } from '../point-on-shape/get-pos-corner.js';
9
9
 
10
10
 
11
11
  /**
@@ -18,12 +18,12 @@ function add1Prong(
18
18
  meta: MatMeta,
19
19
  radius: number,
20
20
  center: number[],
21
- pos: PointOnShape) {
21
+ pos: PrePointOnShape) {
22
22
 
23
- if (isPosCorner(pos) && getPosCorner(pos).isDull) {
23
+ if (isPosCorner(pos) && getPosCorner$(pos).isDull) {
24
24
  // This is a 1-prong at a dull corner.
25
25
 
26
- // TODO IMPORTANT
26
+ // FUTURE
27
27
  // Remove this line, uncomment piece below it and implement the
28
28
  // following strategy to find the 3-prongs: if deltas are conjoined due
29
29
  // to dull corner, split the conjoinment by inserting successively
@@ -43,7 +43,7 @@ function add1Prong(
43
43
 
44
44
  const circle: Circle = { radius, center };
45
45
 
46
- const order = calcPosOrder(circle, pos);
46
+ const order = calcPosOrder(circle.center, pos);
47
47
  // Make sure there isn't already a ContactPoint close by - it can cause
48
48
  // floating point stability issues.
49
49
  if (getCloseByCpIfExist(meta, pos, circle, order, 0, 1)) {
@@ -1,51 +1,61 @@
1
- import { LlRbTree } from 'flo-ll-rb-tree';
2
- import { Loop } from 'flo-boolean';
3
- import { CpNode } from '../cp-node/cp-node.js';
4
- import { Circle } from '../geometry/circle.js';
5
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
1
+ import type { CpNode } from '../cp-node/cp-node.js';
2
+ import type { Circle } from '../geometry/circle.js';
3
+ import type { PointOnShape, PrePointOnShape } from '../point-on-shape/point-on-shape.js';
4
+ import type { MatMeta } from '../mat/mat-meta.js';
5
+ import type { Mutable } from '../utils/mutable.js';
6
6
  import { calcPosOrder } from '../point-on-shape/calc-pos-order.js';
7
- import { createPos } from '../point-on-shape/create-pos.js';
8
7
  import { getCloseByCpIfExist } from '../mat/get-closeby-cp-if-exist.js';
9
- import { MatMeta } from '../mat/mat-meta.js';
10
8
  import { insertCpNode } from '../cp-node/fs/insert-cp-node.js';
11
9
  import { addToCpTree } from '../mat/add-to-cp-tree.js';
12
10
  import { removeCpNode } from '../cp-node/fs/remove-cp-node.js';
13
11
 
14
12
 
15
13
  /**
16
- * @internal
17
14
  * Adds a 2-prong contact circle to the shape.
18
15
  *
19
- * @param cpTrees
16
+ * @param meta
20
17
  * @param circle Circle containing the 2 contact points
21
- * @param posSource The source point on shape
22
- * @param posAntipode The found antipodal point on shape
18
+ * @param pposSource The source point on shape
19
+ * @param pposAntipode The found antipodal point on shape
23
20
  * @param isHoleClosing True if this is a hole-closing 2-prong, false otherwise
24
- * @param maxCoordinate The maximum coordinate value used to calculate floating point
25
- * tolerances.
21
+ *
22
+ * @internal
26
23
  */
27
24
  function add2Prong(
28
25
  meta: MatMeta,
29
26
  circle: Circle,
30
- poss: PointOnShape[],
27
+ pposSource: PrePointOnShape,
28
+ pposAntipode: PrePointOnShape,
31
29
  isHoleClosing: boolean): CpNode | undefined {
32
30
 
33
- poss[0] = poss[0].t === 0
34
- ? createPos(poss[0].curve.prev, 1, true)
35
- : poss[0];
31
+ pposSource = pposSource.t === 0
32
+ ? { ...pposSource, curve: pposSource.curve.prev, t: 1 }
33
+ : pposSource;
36
34
 
37
- const orders = poss.map(pos => calcPosOrder(circle, pos));
35
+ const orderSource = calcPosOrder(circle.center, pposSource);
36
+ const orderAntipode = calcPosOrder(circle.center, pposAntipode);
37
+
38
+ const posAntipode: PointOnShape = {
39
+ ...pposAntipode, circle, order: orderAntipode, order2: 0
40
+ };
41
+ const posSource: PointOnShape = {
42
+ ...pposSource, circle, order: orderSource, order2: 0
43
+ }
38
44
 
39
45
  // Make sure there isn't already a ContactPoint close by - it can cause
40
46
  // floating point stability issues.
41
- for (let i=0; i<poss.length; i++) {
42
- if (!!getCloseByCpIfExist(meta, poss[i], circle, orders[i], 0, 2)) {
43
- return undefined;
44
- }
47
+ if (!!getCloseByCpIfExist(meta, pposSource, circle, orderSource, 0, 2)) {
48
+ return undefined;
49
+ }
50
+ if (!!getCloseByCpIfExist(meta, pposAntipode, circle, orderAntipode, 0, 2)) {
51
+ return undefined;
45
52
  }
46
53
 
47
54
  const { anyFailed, cpNodes } = addToCpTree(
48
- isHoleClosing, isHoleClosing, circle, orders, meta, poss
55
+ isHoleClosing, isHoleClosing, circle,
56
+ [orderSource, orderAntipode],
57
+ meta,
58
+ [posSource, posAntipode]
49
59
  );
50
60
 
51
61
  if (anyFailed) {
@@ -57,9 +67,6 @@ function add2Prong(
57
67
  return undefined;
58
68
  }
59
69
 
60
- // Get points ordered according to their angle with the x-axis
61
- // joinSpokes(circle, cpNodes);
62
-
63
70
  if (isHoleClosing) {
64
71
  closeHole(meta, cpNodes as CpNode[]);
65
72
  }
@@ -74,44 +81,43 @@ function closeHole(
74
81
 
75
82
  const { cpTrees } = meta;
76
83
 
77
- const [cpNodeA, cpNodeB] = cpNodes;
78
- // Duplicate ContactPoints
79
- // const antipodeCpNode = cpNodeB[0];
80
- const cpAntipode = cpNodeB.cp;
81
-
82
- const cpNodeB2 = insertCpNode(
83
- true,
84
- true, false,
85
- cpTrees.get(cpAntipode.pointOnShape.curve.loop)!,
86
- { ...cpAntipode, order2: +1 },
87
- cpNodeB,
84
+ const [cpNodeSource, cpNodeAntipode] = cpNodes as Mutable<CpNode>[];
85
+
86
+ // Antipode - create and insert twin
87
+ const posAntipode = cpNodeAntipode.pointOnShape;
88
+ const cpNodeAntipodeTwin = insertCpNode(
89
+ true, true, false,
90
+ cpTrees.get(posAntipode.curve.loop)!,
91
+ { ...posAntipode, order2: +1 },
92
+ cpNodeAntipode,
88
93
  meta.lastInsertId
89
- )!;
90
- cpNodeB2.holeCloserTwin = cpNodeB;
91
- cpNodeB.holeCloserTwin = cpNodeB2;
92
-
93
- const cpNodeB1 = insertCpNode(
94
- true,
95
- true, false,
96
- cpTrees.get(cpNodeA.cp.pointOnShape.curve.loop)!,
97
- { ...cpNodeA.cp, order2: -1 },
98
- cpNodeA.prev,
94
+ )! as Mutable<CpNode>;
95
+ cpNodeAntipodeTwin.holeCloserTwin = cpNodeAntipode;
96
+ cpNodeAntipode.holeCloserTwin = cpNodeAntipodeTwin;
97
+
98
+ // Source - create and insert twin
99
+ const posSource = cpNodeSource.pointOnShape;
100
+ const cpNodeSourceTwin = insertCpNode(
101
+ true, true, false,
102
+ cpTrees.get(posSource.curve.loop)!,
103
+ { ...cpNodeSource.pointOnShape!, order2: -1 },
104
+ cpNodeSource.prev,
99
105
  meta.lastInsertId
100
- )!;
101
- cpNodeB1.holeCloserTwin = cpNodeA;
102
- cpNodeA.holeCloserTwin = cpNodeB1;
106
+ )! as Mutable<CpNode>;
107
+ cpNodeSourceTwin.holeCloserTwin = cpNodeSource;
108
+ cpNodeSource.holeCloserTwin = cpNodeSourceTwin;
103
109
 
104
110
  // Connect graph
105
- cpNodeB1.prevOnCircle = cpNodeB2;
106
- cpNodeB1.nextOnCircle = cpNodeB2;
107
- cpNodeB2.prevOnCircle = cpNodeB1;
108
- cpNodeB2.nextOnCircle = cpNodeB1;
111
+ cpNodeSourceTwin.prevOnCircle = cpNodeAntipodeTwin;
112
+ cpNodeSourceTwin.nextOnCircle = cpNodeAntipodeTwin;
113
+ cpNodeAntipodeTwin.prevOnCircle = cpNodeSourceTwin;
114
+ cpNodeAntipodeTwin.nextOnCircle = cpNodeSourceTwin;
109
115
 
110
- cpNodeB.next = cpNodeA;
111
- cpNodeA.prev = cpNodeB;
116
+ cpNodeAntipode.next = cpNodeSource;
117
+ cpNodeSource.prev = cpNodeAntipode;
112
118
 
113
- cpNodeB1.next = cpNodeB2;
114
- cpNodeB2.prev = cpNodeB1;
119
+ cpNodeSourceTwin.next = cpNodeAntipodeTwin;
120
+ cpNodeAntipodeTwin.prev = cpNodeSourceTwin;
115
121
  }
116
122
 
117
123
 
@@ -1,14 +1,11 @@
1
- import { ddAddDd, ddMultDd, twoSum, twoProduct, ddDiffDd, ddDivDd, twoDiff, ddMultDouble1 } from 'double-double';
1
+ import { ddAddDd, twoProduct, ddDiffDd, ddDivDd, twoDiff, ddMultDouble1 } from 'double-double';
2
2
 
3
- const ts = twoSum;
4
3
  const tp = twoProduct;
5
- const td = twoDiff;
6
4
  const qaq = ddAddDd;
7
- const qmq = ddMultDd;
8
5
  const qdq = ddDiffDd;
9
6
  const qmd = ddMultDouble1;
10
7
 
11
- const { asin, acos, cos, sqrt, PI: π } = Math;
8
+ const { acos } = Math;
12
9
 
13
10
 
14
11
  /**
@@ -25,10 +22,9 @@ function calcSeperationTolerance(
25
22
 
26
23
  const a = r + δ;
27
24
  if (a >= R) {
28
- return Number.POSITIVE_INFINITY;
25
+ return Infinity;
29
26
  }
30
27
 
31
-
32
28
  const R_r_ = twoDiff(R,r);
33
29
  const A_ = qmd(r,R_r_);
34
30
  const N_ = qdq(qdq(A_, tp(r,δ)), tp(δ,δ/2));
@@ -70,7 +66,7 @@ export { calcSeperationTolerance }
70
66
 
71
67
  // const a = r + δ;
72
68
  // if (a >= R) {
73
- // return Number.POSITIVE_INFINITY;
69
+ // return Infinity;
74
70
  // }
75
71
 
76
72
  // const b = R - r;
@@ -1,41 +1,61 @@
1
+ import type { CurvePiece } from '../mat/curve-piece.js';
1
2
  import { getClosestSquareDistanceToRect } from '../geometry/get-closest-square-distance-to-rect.js';
2
- import { CurvePiece } from '../mat/curve-piece.js';
3
3
  import { getBoundingBox$ } from '../geometry/get-bounding-box-.js';
4
+ import { memoize } from 'flo-memoize';
5
+ import { getBoundingBoxTight } from 'flo-bezier3';
6
+ import { getClosestSquaredDistanceToRotatedRect } from '../geometry/get-closest-squared-distance-to-rotated-rect.js';
7
+
8
+
9
+ const TOLERANCE = 1 + 2**-20;
10
+ const getBoundingBoxTight$ = memoize(getBoundingBoxTight);
4
11
 
5
12
 
6
13
  /**
7
- * @internal
8
- * Cull all curvePieces not within given radius of a given point.
14
+ * Cull all `curvePieces` not within the given radius of a given point.
15
+ *
9
16
  * @param extreme
10
17
  * @param curvePieces
11
- * @param p
12
- * @param rSquared
18
+ * @param xO
19
+ * @param xy2
20
+ *
21
+ * @internal
13
22
  */
14
- function cullCurvePieces2(
23
+ function cullCurvePieces(
15
24
  curvePieces: CurvePiece[],
16
- p: number[],
17
- rSquared: number) {
25
+ xO: number[],
26
+ xy2: number): CurvePiece[] {
18
27
 
19
- const TOLERANCE = 1 + 2**-10;
20
-
21
- if (curvePieces.length <= 1) {
22
- return curvePieces;
28
+ if (curvePieces.length <= 2) {
29
+ // Curve pieces can never be less than 2 at this stage since a curve
30
+ // endpoint will be shared between 2 curves
31
+ return curvePieces as CurvePiece[];
23
32
  }
24
33
 
25
-
26
- const newPieces = [];
27
- for (const curvePiece of curvePieces) {
28
- const ps = curvePiece.curve.ps;
34
+ let lastIdx = 0;
35
+ for (let i=0; i<curvePieces.length; i++) {
36
+ const curvePiece = curvePieces[i];
37
+ const { ps } = curvePiece.curve;
29
38
 
30
39
  const rect = getBoundingBox$(ps);
31
- const bd = getClosestSquareDistanceToRect(rect, p);
32
- if (bd <= TOLERANCE*rSquared) {
33
- newPieces.push(curvePiece);
40
+ const d = getClosestSquareDistanceToRect(rect, xO);
41
+ if (d <= TOLERANCE*xy2) {
42
+ const tightBoundingBox = getBoundingBoxTight$(ps);
43
+ const d2 = getClosestSquaredDistanceToRotatedRect(
44
+ tightBoundingBox,
45
+ xO
46
+ );
47
+
48
+ if (d2 <= TOLERANCE*xy2) {
49
+ curvePieces[lastIdx] = curvePiece;
50
+ lastIdx++;
51
+ }
34
52
  }
35
53
  }
36
54
 
37
- return newPieces;
55
+ curvePieces.length = lastIdx;
56
+
57
+ return curvePieces;
38
58
  }
39
59
 
40
60
 
41
- export { cullCurvePieces2 }
61
+ export { cullCurvePieces }
@@ -1,24 +1,24 @@
1
- import { distanceBetween, fromTo, interpolate, rotate, translate } from 'flo-vector2d';
2
- import { Circle } from '../geometry/circle.js';
3
- import { PointOnShape } from '../point-on-shape/point-on-shape.js';
4
- import { getOsculatingCircle } from '../point-on-shape/get-osculating-circle.js';
5
- import { findEquidistantPointOnLineDd } from './find-equidistant-point-on-line-dd.js';
1
+ import type { Circle } from '../geometry/circle.js';
2
+ import type { PrePointOnShape } from '../point-on-shape/point-on-shape.js';
3
+ import type { MatMeta } from '../mat/mat-meta.js';
4
+ import type { AntipodalPoint } from './get-medial/antipodal-point.js';
6
5
  import { getInitialCurvePieces } from './get-initial-bezier-pieces.js';
7
- import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-close-boundary-points-certified.js';
6
+ import { getAntipodalPoints } from './get-medial/get-antipodal-points.js';
8
7
  import { reduceRadius } from './reduce-radius.js';
9
8
  import { squaredDistanceBetweenDd } from './squared-distance-between-dd.js';
10
- import { cullCurvePieces2 } from './cull-bezier-pieces.js';
9
+ import { cullCurvePieces } from './cull-bezier-pieces.js';
11
10
  import { add1Prong } from './add-1-prong.js';
12
- import { createPos } from '../point-on-shape/create-pos.js';
13
- import { MatMeta } from '../mat/mat-meta.js';
11
+ import { toP } from '../point-on-shape/to-p.js';
14
12
  import { calcSeperationTolerance } from './calc-seperation-tolerance.js';
13
+ import { getInitialX } from './get-initial-x.js';
14
+ import { ddNormal } from 'flo-bezier3';
15
+ import { rotate } from 'flo-vector2d';
15
16
 
16
17
 
17
- const { ceil, log2, max, sqrt, abs, sin, cos } = Math;
18
+ const { sin, cos, max, sqrt } = Math;
18
19
 
19
20
 
20
21
  /**
21
- * @internal
22
22
  * Adds a 2-prong to the MAT. The first point on the shape boundary is given and
23
23
  * the second one is found by the algorithm.
24
24
  *
@@ -33,175 +33,126 @@ const { ceil, log2, max, sqrt, abs, sin, cos } = Math;
33
33
  * d of dΩ as in Fig. 19."
34
34
  * In fact, we (and they) start by fixing one point on the boundary beforehand.
35
35
  *
36
- * @param loops A shape represented by path loops
37
- * @param maxCoordinate The extreme coordinate value of the shape
38
- * @param squaredDiagonalLength The squared diagonal length of the shape
39
- * bounding box.
40
- * @param y The source point of the 2-prong to be found
41
- * @param isHoleClosing True if this is a hole-closing two-prong, false otherwise
42
- * @param loopIdx The loop array index
36
+ * @param meta
37
+ * @param isHoleClosing `true` if this is a hole-closing two-prong, `false` otherwise
38
+ * @param for1Prong
39
+ * @param angle
40
+ * @param yPos the source point of the 2-prong to be found
41
+ *
42
+ * @internal
43
43
  */
44
44
  function find2Prong(
45
- meta: MatMeta,
46
- isHoleClosing: boolean,
47
- for1Prong: boolean,
48
- angle: number,
49
- y: PointOnShape): { circle: Circle, zs: PointOnShape[] } | undefined {
45
+ meta: MatMeta) {
50
46
 
51
- const { loops, maxCoordinate, squaredDiagonalLength } = meta;
47
+ const { loops, maxCoordPowerOf2, squaredDiagonalLength } = meta;
52
48
 
53
- const loop = y.curve.loop;
54
-
55
- const MAX_ITERATIONS = 25;
56
- const minSquaredSeperationTolerance = ((2**-21)*maxCoordinate)**2;
57
- const errorTolerance = (2**-46)*maxCoordinate;
58
- // const errorTolerance = (2**-28)*maxCoordinate;
49
+ //----------------------------
50
+ // Initialize some tolerances
51
+ //----------------------------
52
+ const minSquaredSeperationTolerance = (2**(maxCoordPowerOf2 - 21))**2;
53
+ const errorTolerance = 2**(maxCoordPowerOf2 - 46);
59
54
  const maxOsculatingCircleRadius = sqrt(squaredDiagonalLength);
60
- const minCurvature = 1/maxOsculatingCircleRadius;
61
- const oneProngTolerance = (2**-16)*maxCoordinate;
62
-
63
- const [xO,rO] = getO(
64
- angle, isHoleClosing, maxOsculatingCircleRadius, minCurvature, y
65
- );
66
-
67
- const p = y.p;
55
+ const oneProngTolerance = 2**(maxCoordPowerOf2 - 32);
56
+
57
+ return function find2ProngInner(
58
+ isHoleClosing: boolean,
59
+ for1Prong: boolean,
60
+ angle: number,
61
+ yPos: PrePointOnShape): { circle: Circle, z: PrePointOnShape } | undefined {
62
+
63
+ const { curve: { loop, ps }, t, p: y } = yPos;
64
+ const normDd = ddNormal(ps, t);
65
+ const _nnorm = [-normDd[0][1], -normDd[1][1]]; // Left-handed system (sorry)
66
+ const nnorm = isHoleClosing
67
+ ? [0, -maxOsculatingCircleRadius]
68
+ : (angle !== 0 ? rotate(sin(angle), cos(angle))(_nnorm) : _nnorm);
69
+
70
+ // Get initial kissing circle guess
71
+ let [xO,rO] = getInitialX(
72
+ angle, isHoleClosing, maxOsculatingCircleRadius, yPos, nnorm
73
+ );
74
+
75
+
76
+ // The boundary piece that should contain the other point of
77
+ // the 2-prong circle. (Defined by start and end points).
78
+ const curvePieces = getInitialCurvePieces(
79
+ angle, isHoleClosing, loop, loops, meta, yPos, xO
80
+ );
81
+
82
+ // The lines below is an optimization.
83
+ const xy2 = reduceRadius(maxCoordPowerOf2, curvePieces, y, nnorm);
84
+ const xy = sqrt(xy2);
85
+
86
+ if (for1Prong && rO < (1 - oneProngTolerance)*xy) {
87
+ add1Prong(meta, rO, xO, yPos);
88
+ return undefined;
89
+ }
68
90
 
69
- // The boundary piece that should contain the other point of
70
- // the 2-prong circle. (Defined by start and end points).
71
- let curvePieces = getInitialCurvePieces(
72
- angle, isHoleClosing, loop, loops, meta, y, { center: xO, radius: rO }
73
- );
74
- // console.log(curvePieces.length);
91
+ const l = sqrt(nnorm[0]**2 + nnorm[1]**2);
92
+ xO = [y[0] + nnorm[0]/l*xy, y[1] + nnorm[1]/l*xy];
75
93
 
76
- /** The center of the two-prong (successively refined) */
77
- let x = xO;
94
+ cullCurvePieces(curvePieces, xO, xy2);
78
95
 
79
- // The lines below is an optimization.
80
- const r_ = sqrt(reduceRadius(maxCoordinate, curvePieces, p, xO));
81
- if (rO > r_) {
82
- x = interpolate(p, xO, r_/rO);
83
- }
96
+ const antipodalPoints = getAntipodalPoints(
97
+ maxCoordPowerOf2, nnorm, yPos,
98
+ for1Prong, angle,
99
+ curvePieces
100
+ );
84
101
 
85
- /** The antipode of the two-prong (successively refined) */
86
- let zs: PointOnShape[] = undefined!;
87
- let z: PointOnShape = undefined!;
88
-
89
- let i = 0;
90
- while (i < MAX_ITERATIONS) {
91
- const xy = squaredDistanceBetweenDd(x, y.p);
92
-
93
- if (i < 2) { curvePieces = cullCurvePieces2(curvePieces, x, xy); }
94
- const pow = max(0,ceil(log2(maxCoordinate/xy))) + 1; // determines accuracy
95
- // console.log(pow);
96
- const _zs = getCloseBoundaryPointsCertified(
97
- pow, curvePieces, x, y.curve, y.t,
98
- for1Prong && i == 0 && rO !== 1/minCurvature,
99
- angle
100
- ).map(info => createPos(info.curve, info.t, false));
101
-
102
- let maxD = Number.NEGATIVE_INFINITY;
103
- let maxPos: PointOnShape = undefined!;
104
- zs = [];
105
- for (const z of _zs) {
106
- if (z === undefined) { continue; }
107
- const _yz = squaredDistanceBetweenDd(y.p, z.p);
108
- if (_yz > maxD) {
109
- maxD = _yz;
110
- maxPos = z;
111
- }
112
- if (_yz !== 0) {
113
- zs.push(z);
102
+ if (antipodalPoints.length !== 1) {
103
+ if (antipodalPoints.length === 0) { return undefined; }
104
+ if (!areAllAntipodesSame(antipodalPoints)) {
105
+ // At this point there is multiple antipodal points (zs) for the given
106
+ // source point so do not add the 2-prong, it will be caught when
107
+ // adding 3+-prongs.
108
+ return undefined;
114
109
  }
115
110
  }
116
- // z = zs[0];
117
- const yz = maxD;
118
- z = maxPos;
119
111
 
120
- if (z === undefined || yz === 0) {
121
- // addDebugInfo2(isHoleClosing);
122
- return undefined;
123
- }
112
+ const { x, d, curve, s } = antipodalPoints[0];
113
+ const z: PrePointOnShape = {
114
+ curve, t: s, isSource: false,
115
+ p: toP(curve.ps, s)
116
+ };
124
117
 
125
- const xz = squaredDistanceBetweenDd(x, z.p);
118
+ const circle = { center: x, radius: d };
126
119
 
127
- // if on first try
128
- if (i === 0) {
129
- if (rO < (1 - oneProngTolerance)*sqrt(xz)) {
130
- // console.log('1prong');
131
- add1Prong(meta, rO, xO, y);
132
- return undefined;
133
- }
134
- }
135
-
136
- // if (typeof _debug_ !== 'undefined') { xs.push({ x, y, z: createPos(z.curve, z.t, false), t: y.t }); }
120
+ const yz = squaredDistanceBetweenDd(yPos.p, z.p);
121
+ const xz = squaredDistanceBetweenDd(x, z.p);
137
122
 
138
-
139
123
  if (!isHoleClosing) {
140
- const squaredSeperationTolerance = max(calcSeperationTolerance(
141
- rO, sqrt(xz), 2**2*errorTolerance
142
- ), minSquaredSeperationTolerance);
124
+ if (yz === 0) { return undefined; }
125
+
126
+ // The lines below eliminate cases where the found 2-prong is too
127
+ // close to a one-prong
128
+ const squaredSeperationTolerance = max(
129
+ calcSeperationTolerance(rO, sqrt(xz), 2**2*errorTolerance),
130
+ minSquaredSeperationTolerance
131
+ );
143
132
  if (yz <= squaredSeperationTolerance) {
144
- // if (typeof _debug_ !== 'undefined') { console.log(`failed: seperation too small - ${sqrt(yz)}`); }
145
133
  return undefined;
146
134
  }
147
135
  }
148
136
 
149
- // Find the point on the line connecting y with x that is
150
- // equidistant from y and z. This will be our next x.
151
- const nextX = findEquidistantPointOnLineDd(x, y.p, z.p);
152
- const error = abs(sqrt(xy) - sqrt(xz));
153
- // if (xy < xz) { return undefined; }
154
-
155
- x = nextX;
156
-
157
- if (error < errorTolerance) {
158
- break;
159
- }
160
-
161
- i++;
162
-
163
- if (i === MAX_ITERATIONS) {
164
- // Convergence was too slow.
165
- // if (typeof _debug_ !== 'undefined') { console.log('failed (slow): max iterations reached'); }
166
- return undefined;
167
- }
137
+ return { circle, z };
168
138
  }
139
+ }
169
140
 
170
- const circle = { center: x, radius: distanceBetween(x, z.p) };
171
-
172
- // if (typeof _debug_ !== 'undefined') { addDebugInfo(curvePieces, false, x, y, z, circle!, δ!, xs, isHoleClosing); }
173
141
 
174
- // return { circle, zs };
175
- // zs = zs.filter(z => z !== undefined)
176
- return { circle, zs: [z] };
177
- }
142
+ /** @internal */
143
+ function areAllAntipodesSame(
144
+ app: AntipodalPoint[]): boolean {
178
145
 
146
+ const { curve, s: t } = app[0];
147
+ for (let i=1; i<app.length; i++) {
148
+ const { curve: curve_, s: t_ } = app[i];
179
149
 
180
- function getO(
181
- angle: number,
182
- isHoleClosing: boolean,
183
- maxOsculatingCircleRadius: number,
184
- minCurvature: number,
185
- y: PointOnShape) {
186
-
187
- let xO: number[]; // the original x to mitigate drift
188
- const p = y.p;
189
- let rO: number;
190
- if (isHoleClosing) {
191
- xO = [p[0], p[1] - maxOsculatingCircleRadius];
192
- rO = maxOsculatingCircleRadius;
193
- } else {
194
- if (angle === 0) {
195
- ({ center: xO, radius: rO } = getOsculatingCircle(minCurvature, y));
196
- } else {
197
- ({ center: xO, radius: rO } = getOsculatingCircle(minCurvature, y, true));
198
- const v = fromTo(y.p, xO);
199
- const v_ = rotate(sin(angle), cos(angle))(v);
200
- xO = translate(y.p)(v_);
150
+ if (curve !== curve_ || t !== t_) {
151
+ return false;
201
152
  }
202
153
  }
203
154
 
204
- return [xO,rO] as [number[],number];
155
+ return true;
205
156
  }
206
157
 
207
158