flo-mat 3.0.9 → 3.0.11

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 (261) hide show
  1. package/__tests__/jsog/check-jsog-eql-calc.spec.ts +81 -0
  2. package/__tests__/jsog/decode-jsog.ts +85 -0
  3. package/__tests__/jsog/get-mats1.ts +41 -0
  4. package/__tests__/{cp-node/fs → jsog}/mat-dummys.ts +51 -564
  5. package/__tests__/jsog/to-jsog-breath-first.ts +107 -0
  6. package/__tests__/jsog/to-jsog-depth-first.ts +55 -0
  7. package/browser/index.js +280 -236
  8. package/browser/index.min.js +1 -1
  9. package/node/add-n-prong.ts/join-spokes.js.map +1 -1
  10. package/node/closest-boundary-point/cull-bezier-pieces.d.ts +5 -4
  11. package/node/closest-boundary-point/cull-bezier-pieces.js +9 -8
  12. package/node/closest-boundary-point/cull-bezier-pieces.js.map +1 -1
  13. package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +2 -2
  14. package/node/closest-boundary-point/cull-by-loose-bounding-box.js +8 -8
  15. package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
  16. package/node/closest-boundary-point/cull-by-tight-boundary-box.d.ts +2 -2
  17. package/node/closest-boundary-point/cull-by-tight-boundary-box.js +8 -8
  18. package/node/closest-boundary-point/cull-by-tight-boundary-box.js.map +1 -1
  19. package/node/closest-boundary-point/dd-deflate-with-running-error.js.map +1 -1
  20. package/node/closest-boundary-point/get-best-distance-squared.d.ts +1 -1
  21. package/node/closest-boundary-point/get-best-distance-squared.js +6 -6
  22. package/node/closest-boundary-point/get-best-distance-squared.js.map +1 -1
  23. package/node/closest-boundary-point/get-close-boundary-points-certified.d.ts +2 -2
  24. package/node/closest-boundary-point/get-close-boundary-points-certified.js +7 -7
  25. package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
  26. package/node/contact-point/contact-point.js.map +1 -1
  27. package/node/corner/get-corner.js.map +1 -1
  28. package/node/corner/get-interface-ccw.js.map +1 -1
  29. package/node/cp-node/cp-node-fs.d.ts +2 -1
  30. package/node/cp-node/cp-node-fs.js +1 -2
  31. package/node/cp-node/cp-node-fs.js.map +1 -1
  32. package/node/cp-node/fs/cp-node-comparator.d.ts +3 -0
  33. package/node/cp-node/fs/cp-node-comparator.js +6 -0
  34. package/node/cp-node/fs/cp-node-comparator.js.map +1 -0
  35. package/node/cp-node/fs/find-first.js.map +1 -1
  36. package/node/cp-node/fs/get-all-on-loop.js.map +1 -1
  37. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.d.ts +1 -1
  38. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +11 -16
  39. package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
  40. package/node/cp-node/fs/get-boundary-beziers-between.js +4 -6
  41. package/node/cp-node/fs/get-boundary-beziers-between.js.map +1 -1
  42. package/node/cp-node/fs/get-boundary-beziers-to-next.d.ts +10 -1
  43. package/node/cp-node/fs/get-boundary-beziers-to-next.js +70 -35
  44. package/node/cp-node/fs/get-boundary-beziers-to-next.js.map +1 -1
  45. package/node/cp-node/fs/get-branch-beziers.js.map +1 -1
  46. package/node/cp-node/fs/get-branch.js.map +1 -1
  47. package/node/cp-node/fs/get-children.js.map +1 -1
  48. package/node/cp-node/fs/get-first-exit.js.map +1 -1
  49. package/node/cp-node/fs/get-mat-curve-to-next.js.map +1 -1
  50. package/node/cp-node/fs/get-mat-curves-between.js.map +1 -1
  51. package/node/cp-node/fs/get-prong-count.js.map +1 -1
  52. package/node/cp-node/fs/get-real-prong-count.js.map +1 -1
  53. package/node/cp-node/fs/get-salience.js +2 -2
  54. package/node/cp-node/fs/get-salience.js.map +1 -1
  55. package/node/cp-node/fs/get-speed.js +0 -1
  56. package/node/cp-node/fs/get-speed.js.map +1 -1
  57. package/node/cp-node/fs/get-vertex-forward-children.js.map +1 -1
  58. package/node/cp-node/fs/is-fully-terminating.d.ts +1 -1
  59. package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
  60. package/node/cp-node/fs/is-one-prong.js.map +1 -1
  61. package/node/cp-node/fs/is-sharp.js.map +1 -1
  62. package/node/cp-node/fs/is-terminating.js.map +1 -1
  63. package/node/cp-node/fs/traverse-cp.js.map +1 -1
  64. package/node/cp-node/fs/traverse-edges.js.map +1 -1
  65. package/node/cp-node/fs/traverse-vertices.js.map +1 -1
  66. package/node/debug/functions/draw-elem/bounding-hull.js.map +1 -1
  67. package/node/debug/functions/draw-elem/draw-cp-node.js +1 -1
  68. package/node/debug/functions/draw-elem/draw-cp-node.js.map +1 -1
  69. package/node/debug/functions/draw-elem/draw-cull.js.map +1 -1
  70. package/node/debug/functions/draw-elem/draw-dull-corner.js.map +1 -1
  71. package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
  72. package/node/debug/functions/draw-elem/draw-leaves.js.map +1 -1
  73. package/node/debug/functions/draw-elem/draw-loose-bounding-box.js.map +1 -1
  74. package/node/debug/functions/draw-elem/draw-max-vertex.js.map +1 -1
  75. package/node/debug/functions/draw-elem/draw-min-y.js.map +1 -1
  76. package/node/debug/functions/draw-elem/draw-one-prong-at-dull-corner.js.map +1 -1
  77. package/node/debug/functions/draw-elem/draw-one-prong.js.map +1 -1
  78. package/node/debug/functions/draw-elem/draw-sharp-corner.js.map +1 -1
  79. package/node/debug/functions/draw-elem/draw-speed.js.map +1 -1
  80. package/node/debug/functions/draw-elem/draw-three-prong.js.map +1 -1
  81. package/node/debug/functions/draw-elem/draw-tight-bounding-box.js.map +1 -1
  82. package/node/debug/functions/draw-elem/draw-two-prong.js.map +1 -1
  83. package/node/debug/functions/draw-elem/draw-vertex.js.map +1 -1
  84. package/node/debug/functions/general.js.map +1 -1
  85. package/node/find-2-prong/add-1-prong.js.map +1 -1
  86. package/node/find-2-prong/cull-bezier-pieces.d.ts +4 -4
  87. package/node/find-2-prong/cull-bezier-pieces.js +9 -9
  88. package/node/find-2-prong/cull-bezier-pieces.js.map +1 -1
  89. package/node/find-2-prong/find-2-prong.js +8 -8
  90. package/node/find-2-prong/find-2-prong.js.map +1 -1
  91. package/node/find-2-prong/find-equidistant-point-on-line-dd.js.map +1 -1
  92. package/node/find-2-prong/get-initial-bezier-pieces.d.ts +2 -2
  93. package/node/find-2-prong/get-initial-bezier-pieces.js +2 -2
  94. package/node/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
  95. package/node/find-2-prong/reduce-radius.d.ts +1 -1
  96. package/node/find-2-prong/reduce-radius.js +5 -5
  97. package/node/find-2-prong/reduce-radius.js.map +1 -1
  98. package/node/find-3-prong.ts/calc-better-x.d.ts +2 -2
  99. package/node/find-3-prong.ts/calc-better-x.js +3 -3
  100. package/node/find-3-prong.ts/calc-better-x.js.map +1 -1
  101. package/node/find-3-prong.ts/calc-initial-3-prong-center.d.ts +2 -2
  102. package/node/find-3-prong.ts/calc-initial-3-prong-center.js +3 -3
  103. package/node/find-3-prong.ts/calc-initial-3-prong-center.js.map +1 -1
  104. package/node/find-3-prong.ts/find-3-prong-for-delta3s.d.ts +2 -2
  105. package/node/find-3-prong.ts/find-3-prong-for-delta3s.js +16 -16
  106. package/node/find-3-prong.ts/find-3-prong-for-delta3s.js.map +1 -1
  107. package/node/find-3-prong.ts/find-3-prong.js +2 -2
  108. package/node/find-3-prong.ts/find-3-prong.js.map +1 -1
  109. package/node/find-3-prong.ts/find-and-add-3-prong.js.map +1 -1
  110. package/node/find-3-prong.ts/find-and-add-3-prongs.js.map +1 -1
  111. package/node/find-3-prong.ts/get-closest-points.d.ts +2 -2
  112. package/node/find-3-prong.ts/get-closest-points.js +4 -4
  113. package/node/find-3-prong.ts/get-closest-points.js.map +1 -1
  114. package/node/find-mat/find-mats.js.map +1 -1
  115. package/node/geometry/get-closest-square-distance-to-rect.js.map +1 -1
  116. package/node/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
  117. package/node/index.d.ts +35 -1
  118. package/node/index.js +36 -1
  119. package/node/index.js.map +1 -1
  120. package/node/mat/create-new-cp-tree.js.map +1 -1
  121. package/node/mat/get-boundary-piece-beziers.js +7 -7
  122. package/node/mat/get-boundary-piece-beziers.js.map +1 -1
  123. package/node/mat/get-largest-vertex.js.map +1 -1
  124. package/node/mat/trim-mat.js.map +1 -1
  125. package/node/memoize-primitive.js.map +1 -1
  126. package/node/sat/add-debug-info.js.map +1 -1
  127. package/node/sat/cull.d.ts +7 -5
  128. package/node/sat/cull.js +7 -4
  129. package/node/sat/cull.js.map +1 -1
  130. package/node/sat/get-leaves.js.map +1 -1
  131. package/node/sat/to-scale-axis.d.ts +3 -2
  132. package/node/sat/to-scale-axis.js +3 -2
  133. package/node/sat/to-scale-axis.js.map +1 -1
  134. package/node/svg/get-loop-bounds.js.map +1 -1
  135. package/node/svg/get-min-y-pos.js.map +1 -1
  136. package/node/sweep-line/sweep-line.js.map +1 -1
  137. package/package.json +6 -6
  138. package/src/add-n-prong.ts/join-spokes.ts +11 -11
  139. package/src/closest-boundary-point/cull-bezier-pieces.ts +12 -11
  140. package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +8 -8
  141. package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +8 -8
  142. package/src/closest-boundary-point/dd-deflate-with-running-error.ts +22 -22
  143. package/src/closest-boundary-point/get-best-distance-squared.ts +6 -6
  144. package/src/closest-boundary-point/get-close-boundary-points-certified.ts +41 -41
  145. package/src/contact-point/contact-point.ts +13 -13
  146. package/src/corner/get-corner.ts +39 -39
  147. package/src/corner/get-interface-ccw.ts +3 -3
  148. package/src/cp-node/cp-node-fs.ts +132 -135
  149. package/src/cp-node/cp-node.ts +30 -30
  150. package/src/cp-node/fs/clone.ts +4 -4
  151. package/src/cp-node/fs/cp-node-comparator.ts +13 -0
  152. package/src/cp-node/fs/find-first.ts +6 -6
  153. package/src/cp-node/fs/get-all-on-loop.ts +1 -1
  154. package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +12 -18
  155. package/src/cp-node/fs/get-boundary-beziers-between.ts +6 -7
  156. package/src/cp-node/fs/get-boundary-beziers-to-next.ts +79 -53
  157. package/src/cp-node/fs/get-branch-beziers.ts +1 -1
  158. package/src/cp-node/fs/get-branch.ts +1 -1
  159. package/src/cp-node/fs/get-children.ts +8 -8
  160. package/src/cp-node/fs/get-first-exit.ts +11 -11
  161. package/src/cp-node/fs/get-mat-curve-to-next.ts +1 -1
  162. package/src/cp-node/fs/get-mat-curves-between.ts +1 -1
  163. package/src/cp-node/fs/get-prong-count.ts +8 -8
  164. package/src/cp-node/fs/get-real-prong-count.ts +3 -3
  165. package/src/cp-node/fs/get-salience.ts +2 -2
  166. package/src/cp-node/fs/get-speed.ts +1 -6
  167. package/src/cp-node/fs/get-vertex-forward-children.ts +10 -10
  168. package/src/cp-node/fs/is-fully-terminating.ts +3 -3
  169. package/src/cp-node/fs/is-one-prong.ts +8 -8
  170. package/src/cp-node/fs/is-sharp.ts +1 -1
  171. package/src/cp-node/fs/is-terminating.ts +1 -1
  172. package/src/cp-node/fs/iterate-all-on-loop.ts +6 -6
  173. package/src/cp-node/fs/traverse-all-forward.ts +11 -11
  174. package/src/cp-node/fs/traverse-cp.ts +19 -17
  175. package/src/cp-node/fs/traverse-edges.ts +10 -10
  176. package/src/cp-node/fs/traverse-vertices.ts +17 -17
  177. package/src/curve/curve.ts +26 -26
  178. package/src/debug/functions/cmp-cp-on-delta.ts +1 -1
  179. package/src/debug/functions/draw-elem/bounding-hull.ts +2 -2
  180. package/src/debug/functions/draw-elem/culls.ts +2 -2
  181. package/src/debug/functions/draw-elem/draw-cp-node.ts +30 -30
  182. package/src/debug/functions/draw-elem/draw-cull.ts +2 -2
  183. package/src/debug/functions/draw-elem/draw-dull-corner.ts +7 -7
  184. package/src/debug/functions/draw-elem/draw-elem.ts +28 -28
  185. package/src/debug/functions/draw-elem/draw-leaves.ts +12 -12
  186. package/src/debug/functions/draw-elem/draw-loose-bounding-box.ts +7 -7
  187. package/src/debug/functions/draw-elem/draw-max-vertex.ts +2 -2
  188. package/src/debug/functions/draw-elem/draw-min-y.ts +2 -2
  189. package/src/debug/functions/draw-elem/draw-one-prong-at-dull-corner.ts +1 -1
  190. package/src/debug/functions/draw-elem/draw-one-prong.ts +1 -1
  191. package/src/debug/functions/draw-elem/draw-sharp-corner.ts +6 -6
  192. package/src/debug/functions/draw-elem/draw-speed.ts +2 -2
  193. package/src/debug/functions/draw-elem/draw-three-prong.ts +28 -28
  194. package/src/debug/functions/draw-elem/draw-tight-bounding-box.ts +4 -4
  195. package/src/debug/functions/draw-elem/draw-two-prong.ts +51 -51
  196. package/src/debug/functions/draw-elem/draw-vertex.ts +12 -12
  197. package/src/debug/functions/draw-elem/dull-corner.ts +7 -7
  198. package/src/debug/functions/draw-elem/leaves.ts +2 -2
  199. package/src/debug/functions/draw-elem/loose-bounding-box.ts +7 -7
  200. package/src/debug/functions/draw-elem/max-vertex.ts +2 -2
  201. package/src/debug/functions/draw-elem/min-y.ts +2 -2
  202. package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +1 -1
  203. package/src/debug/functions/draw-elem/one-prong.ts +1 -1
  204. package/src/debug/functions/draw-elem/sharp-corner.ts +6 -6
  205. package/src/debug/functions/draw-elem/three-prong.ts +19 -19
  206. package/src/debug/functions/draw-elem/tight-bounding-box.ts +4 -4
  207. package/src/debug/functions/draw-elem/two-prong.ts +44 -44
  208. package/src/debug/functions/draw-elem/vertex.ts +28 -28
  209. package/src/debug/functions/general.ts +18 -18
  210. package/src/debug/functions/three-prong.ts +184 -184
  211. package/src/debug/functions/two-prong.ts +201 -201
  212. package/src/debug/two-prong-for-debugging.ts +26 -26
  213. package/src/find-2-prong/add-1-prong.ts +25 -25
  214. package/src/find-2-prong/add-debug-info.ts +38 -38
  215. package/src/find-2-prong/cull-bezier-pieces.ts +10 -10
  216. package/src/find-2-prong/find-2-prong.ts +158 -158
  217. package/src/find-2-prong/find-equidistant-point-on-line-dd.ts +50 -50
  218. package/src/find-2-prong/find-equidistant-point-on-line.ts +27 -27
  219. package/src/find-2-prong/get-initial-bezier-pieces.ts +2 -2
  220. package/src/find-2-prong/reduce-radius.ts +5 -5
  221. package/src/find-3-prong.ts/calc-better-x.ts +3 -3
  222. package/src/find-3-prong.ts/calc-initial-3-prong-center.ts +3 -3
  223. package/src/find-3-prong.ts/find-3-prong-for-delta3s.ts +17 -17
  224. package/src/find-3-prong.ts/find-3-prong.ts +23 -23
  225. package/src/find-3-prong.ts/find-and-add-3-prong.ts +37 -37
  226. package/src/find-3-prong.ts/find-and-add-3-prongs.ts +30 -30
  227. package/src/find-3-prong.ts/get-closest-points.ts +4 -4
  228. package/src/find-mat/add-2-prongs-by-error.ts +8 -8
  229. package/src/find-mat/find-mats.ts +49 -49
  230. package/src/find-mat/fix-ordering.ts +2 -2
  231. package/src/find-mat/get-total-by.ts +12 -12
  232. package/src/geometry/get-closest-square-distance-to-rect.ts +37 -37
  233. package/src/geometry/get-closest-squared-distance-to-rotated-rect.ts +14 -14
  234. package/src/get-curve/get-curve-between.ts +1 -1
  235. package/src/index.ts +41 -4
  236. package/src/mat/cmp-cp-on-delta.ts +1 -1
  237. package/src/mat/create-new-cp-tree.ts +12 -12
  238. package/src/mat/get-boundary-piece-beziers.ts +7 -7
  239. package/src/mat/get-edges-as-array.ts +9 -9
  240. package/src/mat/get-largest-3-prong.ts +8 -8
  241. package/src/mat/get-largest-three-prong.ts +5 -5
  242. package/src/mat/get-largest-vertex.ts +6 -6
  243. package/src/mat/get-two-prong-type.ts +9 -9
  244. package/src/mat/trim-mat.ts +1 -1
  245. package/src/memoize-primitive.ts +14 -14
  246. package/src/sat/add-debug-info.ts +4 -4
  247. package/src/sat/cull-by-salience.ts +1 -1
  248. package/src/sat/cull.ts +10 -7
  249. package/src/sat/get-leaves.ts +0 -1
  250. package/src/sat/to-scale-axis.ts +18 -17
  251. package/src/svg/get-extreme.ts +8 -8
  252. package/src/svg/get-loop-bounds.ts +84 -84
  253. package/src/svg/get-min-y-pos.ts +1 -1
  254. package/src/sweep-line/sweep-line.ts +23 -23
  255. package/src/utils/bezier-piece-to-bezier.ts +7 -7
  256. package/__tests__/cp-node/fs/check-jsog-eql-calc.spec.ts +0 -30
  257. package/node/cp-node/fs/cp-nodes-to-boundary-beziers.d.ts +0 -3
  258. package/node/cp-node/fs/cp-nodes-to-boundary-beziers.js +0 -6
  259. package/node/cp-node/fs/cp-nodes-to-boundary-beziers.js.map +0 -1
  260. package/src/closest-boundary-point/get-closest-boundary-point-certified.ts +0 -70
  261. package/src/cp-node/fs/cp-nodes-to-boundary-beziers.ts +0 -10
@@ -1,7 +1,6 @@
1
- import type { BezierPiece } from "flo-bezier3";
2
1
  import type { CpNode } from "../cp-node.js";
3
- import { cpNodesToBoundaryBeziers } from "./cp-nodes-to-boundary-beziers.js";
4
2
  import { getAllBetween } from "./get-all-between.js";
3
+ import { getBoundaryBeziersToNext } from "./get-boundary-beziers-to-next.js";
5
4
 
6
5
 
7
6
  /**
@@ -23,12 +22,12 @@ function getBoundaryBeziersBetween(
23
22
  hasHoleCloser: boolean
24
23
  } {
25
24
 
26
- const allBetween = getAllBetween(cpNode1,cpNode2,inclAllIfEqual);
25
+ const { cpNodes, hasHoleCloser } =
26
+ getAllBetween(cpNode1,cpNode2,inclAllIfEqual);
27
27
 
28
- return {
29
- pss: cpNodesToBoundaryBeziers(allBetween.cpNodes),
30
- hasHoleCloser: allBetween.hasHoleCloser
31
- }
28
+ const pss = cpNodes.flatMap(getBoundaryBeziersToNext);
29
+
30
+ return { pss, hasHoleCloser }
32
31
  }
33
32
 
34
33
 
@@ -1,70 +1,96 @@
1
+ import type { CpNode } from '../cp-node.js';
1
2
  import { fromTo } from 'flo-bezier3';
2
- import { CpNode } from '../cp-node.js';
3
- import { Curve } from '../../curve/curve.js';
3
+ import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
4
4
 
5
5
 
6
+ /**
7
+ // * Returns the boundary beziers between this `CpNode` and the next
8
+ // * one.
9
+ // *
10
+ // * * returns `[]` if the next `CpNode` is on a different loop,
11
+ // * as this is a hole-closer and there are no boundary beziers between them.
12
+ // *
13
+ // * @param cpNode
14
+ // */
6
15
  function getBoundaryBeziersToNext(
7
16
  cpNode: CpNode): number[][][] {
8
17
 
9
- const cpThis = cpNode;
10
- const cpNext = cpNode.next;
18
+ return getBoundaryBezierPartsToNext(cpNode).map(
19
+ bp => fromTo(bp.ps, bp.ts[0], bp.ts[1])
20
+ );
21
+ }
22
+
23
+
24
+ // /**
25
+ // * Returns the boundary beziers between this `CpNode` and the next
26
+ // * one.
27
+ // *
28
+ // * * returns `[]` if the next `CpNode` is on a different loop,
29
+ // * as this is a hole-closer and there are no boundary beziers between them.
30
+ // *
31
+ // * @param cpNode
32
+ // */
33
+ // function getBoundaryBeziersToNext(
34
+ // cpNode: CpNode): number[][][] {
35
+
36
+ // const cpThis = cpNode;
37
+ // const cpNext = cpNode.next;
11
38
 
12
- const posThis = cpThis.cp.pointOnShape;
13
- const posNext = cpNext.cp.pointOnShape;
39
+ // const posThis = cpThis.cp.pointOnShape;
40
+ // const posNext = cpNext.cp.pointOnShape;
14
41
 
15
- const curveThis = posThis.curve;
16
- const curveNext = posNext.curve;
42
+ // const curveThis = posThis.curve;
43
+ // const curveNext = posNext.curve;
17
44
 
18
- if (curveThis.loop !== curveNext.loop) {
19
- // It is a hole-closer going over to the other loop - a kind of terminal
20
- // CpNode.
21
- // return undefined!;
22
- return [];
23
- }
45
+ // if (curveThis.loop !== curveNext.loop) {
46
+ // // It is a hole-closer going over to the other loop - a kind of terminal
47
+ // // CpNode.
48
+ // // return undefined!;
49
+ // return [];
50
+ // }
24
51
 
25
- const beziers = [];
52
+ // const beziers: number[][][] = [];
26
53
 
27
- if (curveNext === curveThis) {
28
- beziers.push(
29
- fromTo(posThis.curve.ps, posThis.t, posNext.t)
30
- );
31
- } else {
32
- beziers.push(
33
- fromTo(posThis.curve.ps, posThis.t, 1)
34
- );
54
+ // if (curveNext === curveThis) {
55
+ // beziers.push(
56
+ // fromTo(posThis.curve.ps, posThis.t, posNext.t)
57
+ // );
58
+ // } else {
59
+ // beziers.push(
60
+ // fromTo(posThis.curve.ps, posThis.t, 1)
61
+ // );
35
62
 
36
- addSkippedBeziers(
37
- beziers,
38
- posThis.curve,
39
- posNext.curve,
40
- posNext.t
41
- );
42
- }
43
-
44
- return beziers;
45
- }
63
+ // addSkippedBeziers(
64
+ // beziers,
65
+ // posThis.curve,
66
+ // posNext.curve,
67
+ // posNext.t
68
+ // );
69
+ // }
46
70
 
71
+ // return beziers;
72
+ // }
47
73
 
48
- /**
49
- * Adds pieces of skipped beziers.
50
- * @internal
51
- */
52
- function addSkippedBeziers(
53
- beziers : number[][][],
54
- curveStart : Curve,
55
- curveEnd : Curve,
56
- t1 : number) {
57
-
58
- let curveThis = curveStart;
59
- do {
60
- curveThis = curveThis.next;
61
- const tEnd = curveThis === curveEnd ? t1 : 1;
62
- beziers.push(
63
- // qqq from0ToT(curveThis.ps, tEnd)
64
- fromTo(curveThis.ps, 0, tEnd)
65
- );
66
- } while (curveThis !== curveEnd);
67
- }
74
+
75
+ // /**
76
+ // * Adds pieces of skipped beziers.
77
+ // * @internal
78
+ // */
79
+ // function addSkippedBeziers(
80
+ // beziers: number[][][],
81
+ // curveStart: Curve,
82
+ // curveEnd: Curve,
83
+ // t1: number) {
84
+
85
+ // let curveThis = curveStart;
86
+ // do {
87
+ // curveThis = curveThis.next;
88
+ // const tEnd = curveThis === curveEnd ? t1 : 1;
89
+ // beziers.push(
90
+ // fromTo(curveThis.ps, 0, tEnd)
91
+ // );
92
+ // } while (curveThis !== curveEnd);
93
+ // }
68
94
 
69
95
 
70
96
  export { getBoundaryBeziersToNext }
@@ -9,7 +9,7 @@ import { getMatCurveToNext } from './get-mat-curve-to-next.js';
9
9
  * @param cpNode `CpNode` representing the start vertex.
10
10
  */
11
11
  function getBranchBeziers(
12
- cpNode: CpNode): number[][][] {
12
+ cpNode: CpNode): number[][][] {
13
13
 
14
14
  return getBranch(cpNode).map(b => getMatCurveToNext(b));
15
15
  }
@@ -13,7 +13,7 @@ import { isTrivial } from './is-trivial.js';
13
13
  * @param cpNode `CpNode` representing the start vertex.
14
14
  */
15
15
  function getBranch(
16
- cpNode: CpNode): CpNode[] {
16
+ cpNode: CpNode): CpNode[] {
17
17
 
18
18
  if (isTrivial(cpNode)) {
19
19
  return [];
@@ -2,16 +2,16 @@ import { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function getChildren(cpNode: CpNode) {
5
- const children: CpNode[] = [];
5
+ const children: CpNode[] = [];
6
6
 
7
- const cp = cpNode.next;
8
- let cpNode_ = cp;
9
- do {
10
- children.push(cpNode_);
11
- cpNode_ = cpNode_.nextOnCircle;
12
- } while (cpNode_.nextOnCircle !== cp);
7
+ const cp = cpNode.next;
8
+ let cpNode_ = cp;
9
+ do {
10
+ children.push(cpNode_);
11
+ cpNode_ = cpNode_.nextOnCircle;
12
+ } while (cpNode_.nextOnCircle !== cp);
13
13
 
14
- return children;
14
+ return children;
15
15
  }
16
16
 
17
17
 
@@ -2,20 +2,20 @@ import { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function getFirstExit(cpNode: CpNode) {
5
- // const startNode = this as CpNode;
6
- const startNode = cpNode;
7
- let cpNode_ = startNode;
5
+ // const startNode = this as CpNode;
6
+ const startNode = cpNode;
7
+ let cpNode_ = startNode;
8
8
 
9
- while (cpNode_.next === cpNode_.prevOnCircle) {
10
- cpNode_ = cpNode_.next;
9
+ while (cpNode_.next === cpNode_.prevOnCircle) {
10
+ cpNode_ = cpNode_.next;
11
11
 
12
- if (cpNode_ === startNode) {
13
- // The very special case the MAT is a single point.
14
- return undefined;
15
- }
16
- }
12
+ if (cpNode_ === startNode) {
13
+ // The very special case the MAT is a single point.
14
+ return undefined;
15
+ }
16
+ }
17
17
 
18
- return cpNode_;
18
+ return cpNode_;
19
19
  }
20
20
 
21
21
 
@@ -4,7 +4,7 @@ import { getMatCurveBetween } from './get-mat-curve-between.js';
4
4
 
5
5
 
6
6
  function getMatCurveToNext(cpNode: CpNode) {
7
- return getMatCurveBetween(cpNode, cpNode.next);
7
+ return getMatCurveBetween(cpNode, cpNode.next);
8
8
  }
9
9
 
10
10
 
@@ -9,7 +9,7 @@ function getMatCurvesBetween(
9
9
  let cpNode = cpNodeS;
10
10
  const pss: number[][][] = [];
11
11
  while (cpNode !== cpNodeE) {
12
- const ps = getMatCurveBetween(cpNode, cpNode.next);
12
+ const ps = getMatCurveBetween(cpNode, cpNode.next);
13
13
  pss.push(ps);
14
14
 
15
15
  cpNode = cpNode.next;
@@ -2,16 +2,16 @@ import { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function getProngCount(cpNode: CpNode) {
5
- const startCpNode = cpNode;
6
- let cpNode_ = startCpNode;
5
+ const startCpNode = cpNode;
6
+ let cpNode_ = startCpNode;
7
7
 
8
- let i = 0;
9
- do {
10
- i++;
11
- cpNode_ = cpNode_.nextOnCircle;
12
- } while (cpNode_ !== startCpNode)
8
+ let i = 0;
9
+ do {
10
+ i++;
11
+ cpNode_ = cpNode_.nextOnCircle;
12
+ } while (cpNode_ !== startCpNode)
13
13
 
14
- return i;
14
+ return i;
15
15
  }
16
16
 
17
17
 
@@ -4,10 +4,10 @@ import { isTerminating } from "./is-terminating.js";
4
4
 
5
5
 
6
6
  function getRealProngCount(cpNode: CpNode) {
7
- const nonTerminatingCpNodes = getAllOnCircle(cpNode)
8
- .filter(cpNode => !isTerminating(cpNode));
7
+ const nonTerminatingCpNodes = getAllOnCircle(cpNode)
8
+ .filter(cpNode => !isTerminating(cpNode));
9
9
 
10
- return nonTerminatingCpNodes.length;
10
+ return nonTerminatingCpNodes.length;
11
11
  }
12
12
 
13
13
 
@@ -17,9 +17,9 @@ function getSalience(cpNode: CpNode) {
17
17
 
18
18
  const d = distanceBetween(bp1, bp2);
19
19
 
20
- const { pss: bps, hasHoleCloser } = getBoundaryBeziersBetween(cpNode1, cpNode2);
20
+ const { pss, hasHoleCloser } = getBoundaryBeziersBetween(cpNode1, cpNode2);
21
21
 
22
- const s = sum(bps.map(ps => totalLength(ps)));
22
+ const s = sum(pss.map(ps => totalLength(ps)));
23
23
 
24
24
  return hasHoleCloser ? Number.POSITIVE_INFINITY : s/d;
25
25
  }
@@ -1,14 +1,9 @@
1
- import { curvature, totalAbsoluteCurvature, totalLength } from "flo-bezier3";
1
+ import { totalAbsoluteCurvature, totalLength } from "flo-bezier3";
2
2
  import { memoize } from "flo-memoize";
3
- import { sum } from "../../utils/sum.js";
4
3
  import { CpNode } from "../cp-node.js";
5
- import { getBoundaryBeziersToNext } from "./get-boundary-beziers-to-next.js";
6
4
  import { getMatCurveToNext } from "./get-mat-curve-to-next.js";
7
5
  import { getRealProngCount } from "./get-real-prong-count.js";
8
6
 
9
- const { min, abs } = Math;
10
-
11
-
12
7
  const getSpeed$ = memoize(getSpeed);
13
8
 
14
9
 
@@ -3,19 +3,19 @@ import { isTerminating } from "./is-terminating.js";
3
3
 
4
4
 
5
5
  function getVertexForwardChildren(cpNode: CpNode) {
6
- const children: CpNode[] = [];
6
+ const children: CpNode[] = [];
7
7
 
8
- const cpStart = cpNode;
8
+ const cpStart = cpNode;
9
9
 
10
- let cpNode_ = cpStart;
11
- while (cpNode_ !== cpStart.prevOnCircle) {
12
- if (!isTerminating(cpNode_)) {
13
- children.push(cpNode_.next);
14
- }
15
- cpNode_ = cpNode_.nextOnCircle;
16
- }
10
+ let cpNode_ = cpStart;
11
+ while (cpNode_ !== cpStart.prevOnCircle) {
12
+ if (!isTerminating(cpNode_)) {
13
+ children.push(cpNode_.next);
14
+ }
15
+ cpNode_ = cpNode_.nextOnCircle;
16
+ }
17
17
 
18
- return children;
18
+ return children;
19
19
  }
20
20
 
21
21
 
@@ -1,4 +1,4 @@
1
- import { CpNode } from "../cp-node.js";
1
+ import type { CpNode } from "../cp-node.js";
2
2
  import { getAllOnCircle } from "./get-all-on-circle.js";
3
3
  import { isTerminating } from "./is-terminating.js";
4
4
 
@@ -11,9 +11,9 @@ import { isTerminating } from "./is-terminating.js";
11
11
  * @param cpNode
12
12
  */
13
13
  function isFullyTerminating(cpNode: CpNode) {
14
- const otherOnCircle = getAllOnCircle(cpNode.prevOnCircle, true);
14
+ const otherOnCircle = getAllOnCircle(cpNode.prevOnCircle, true);
15
15
 
16
- return otherOnCircle.every(isTerminating);
16
+ return otherOnCircle.every(isTerminating);
17
17
  }
18
18
 
19
19
 
@@ -3,18 +3,18 @@ import { CpNode } from "../cp-node.js";
3
3
 
4
4
  // TODO2 - remove - or replace with `getRealProngCount === 1`
5
5
  function isOneProng(cpNode: CpNode) {
6
- const cp1 = cpNode;
6
+ const cp1 = cpNode;
7
7
 
8
- if (cp1.cp.circle.radius === 0) {
9
- return true;
10
- }
8
+ if (cp1.cp.circle.radius === 0) {
9
+ return true;
10
+ }
11
11
 
12
- const cp2 = cp1.nextOnCircle;
12
+ const cp2 = cp1.nextOnCircle;
13
13
 
14
- const p1 = cp1.cp.pointOnShape.p;
15
- const p2 = cp2.cp.pointOnShape.p;
14
+ const p1 = cp1.cp.pointOnShape.p;
15
+ const p2 = cp2.cp.pointOnShape.p;
16
16
 
17
- return (p1[0] === p2[0] && p1[1] === p2[1]);
17
+ return (p1[0] === p2[0] && p1[1] === p2[1]);
18
18
  }
19
19
 
20
20
 
@@ -2,7 +2,7 @@ import { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function isSharp(cpNode: CpNode) {
5
- return cpNode.cp.circle.radius === 0;
5
+ return cpNode.cp.circle.radius === 0;
6
6
  }
7
7
 
8
8
 
@@ -2,7 +2,7 @@ import type { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function isTerminating(cpNode: CpNode) {
5
- return cpNode === cpNode.next.prevOnCircle;
5
+ return cpNode === cpNode.next.prevOnCircle;
6
6
  }
7
7
 
8
8
 
@@ -2,13 +2,13 @@ import { CpNode } from "../cp-node.js";
2
2
 
3
3
 
4
4
  function* iterateAllOnLoop(cpNode: CpNode) {
5
- yield cpNode;
5
+ yield cpNode;
6
6
 
7
- let cpNode_ = cpNode.next;
8
- while (cpNode_ !== cpNode) {
9
- yield cpNode_;
10
- cpNode_ = cpNode_.next;
11
- }
7
+ let cpNode_ = cpNode.next;
8
+ while (cpNode_ !== cpNode) {
9
+ yield cpNode_;
10
+ cpNode_ = cpNode_.next;
11
+ }
12
12
  }
13
13
 
14
14
 
@@ -4,20 +4,20 @@ import { getChildren } from './get-children.js';
4
4
 
5
5
 
6
6
  function traverseAllForward(
7
- cpNode: CpNode,
8
- traverseEdgesCallback: (cpNode: CpNode) => void) {
7
+ cpNode: CpNode,
8
+ traverseEdgesCallback: (cpNode: CpNode) => void) {
9
9
 
10
- // Since the tree is unrooted we must iterate in all directions from the
11
- // given vertex.
12
- const cps = [cpNode];
10
+ // Since the tree is unrooted we must iterate in all directions from the
11
+ // given vertex.
12
+ const cps = [cpNode];
13
13
 
14
- while (cps.length) {
15
- const cp = cps.pop()!;
16
- traverseEdgesCallback(cp);
14
+ while (cps.length) {
15
+ const cp = cps.pop()!;
16
+ traverseEdgesCallback(cp);
17
17
 
18
- if (isTerminating(cp)) { continue; }
19
- cps.push(...getChildren(cp));
20
- }
18
+ if (isTerminating(cp)) { continue; }
19
+ cps.push(...getChildren(cp));
20
+ }
21
21
  }
22
22
 
23
23
 
@@ -2,25 +2,27 @@ import { CpNode } from "../cp-node.js";
2
2
  import { isTerminating } from "./is-terminating.js";
3
3
 
4
4
 
5
- function traverseCp(cpStart: CpNode) {
6
- let cpNode = cpStart;
5
+ function traverseCp(
6
+ cpStart: CpNode) {
7
7
 
8
- if (isTerminating(cpNode)) {
9
- return [cpNode]; // one-sharp corner
10
- }
8
+ let cpNode = cpStart;
11
9
 
12
- const visitedCps: CpNode[] = [];
13
- do {
14
- visitedCps.push(cpNode);
15
-
16
- const next = cpNode.next.prevOnCircle;
17
- cpNode = cpNode === next
18
- ? cpNode = cpNode.next.next // Terminal vertex
19
- : cpNode = next // Take last exit
20
-
21
- } while (cpNode !== cpStart);
22
-
23
- return visitedCps;
10
+ if (isTerminating(cpNode)) {
11
+ return [cpNode]; // one-sharp corner
12
+ }
13
+
14
+ const visitedCps: CpNode[] = [];
15
+ do {
16
+ visitedCps.push(cpNode);
17
+
18
+ const next = cpNode.next.prevOnCircle;
19
+ cpNode = cpNode === next
20
+ ? cpNode = cpNode.next.next // Terminal vertex
21
+ : cpNode = next // Take last exit
22
+
23
+ } while (cpNode !== cpStart);
24
+
25
+ return visitedCps;
24
26
  }
25
27
 
26
28
 
@@ -4,18 +4,18 @@ import { getAllOnLoop } from './get-all-on-loop.js';
4
4
 
5
5
 
6
6
  function traverseEdges(
7
- cpNode: CpNode,
8
- traverseEdgesCallback: (cpNode: CpNode) => void) {
7
+ cpNode: CpNode,
8
+ traverseEdgesCallback: (cpNode: CpNode) => void) {
9
9
 
10
- const cpNodes = getAllOnLoop(cpNode);
11
- const seen = new Set<CpNode>();
10
+ const cpNodes = getAllOnLoop(cpNode);
11
+ const seen = new Set<CpNode>();
12
12
 
13
- for (cpNode of cpNodes) {
14
- if (!isTerminating(cpNode) && !seen.has(cpNode.next.prevOnCircle)) {
15
- traverseEdgesCallback(cpNode);
16
- }
17
- seen.add(cpNode);
18
- }
13
+ for (cpNode of cpNodes) {
14
+ if (!isTerminating(cpNode) && !seen.has(cpNode.next.prevOnCircle)) {
15
+ traverseEdgesCallback(cpNode);
16
+ }
17
+ seen.add(cpNode);
18
+ }
19
19
  }
20
20
 
21
21
 
@@ -6,26 +6,26 @@ import { getVertexForwardChildren } from './get-vertex-forward-children.js';
6
6
 
7
7
 
8
8
  function traverseVertices(
9
- cpStart: CpNode,
10
- traverseVerticesCallback: (cpNode: CpNode) => void) {
9
+ cpStart: CpNode,
10
+ traverseVerticesCallback: (cpNode: CpNode) => void) {
11
11
 
12
- traverseVerticesCallback(cpStart);
12
+ traverseVerticesCallback(cpStart);
13
13
 
14
- // Since the tree is unrooted we must iterate in all directions from the
15
- // given cpNode.
16
- const cpNodes =
17
- getAllOnCircle(cpStart)
18
- .filter(cpNode => !isTerminating(cpNode))
19
- .map(cpNode => cpNode.next);
14
+ // Since the tree is unrooted we must iterate in all directions from the
15
+ // given cpNode.
16
+ const cpNodes =
17
+ getAllOnCircle(cpStart)
18
+ .filter(cpNode => !isTerminating(cpNode))
19
+ .map(cpNode => cpNode.next);
20
20
 
21
- for (const cpNode of cpNodes) {
22
- const cps = [cpNode];
23
- while (cps.length) {
24
- const cp = cps.pop()!;
25
- traverseVerticesCallback(cp);
26
- cps.push(...getVertexForwardChildren(cp));
27
- }
28
- }
21
+ for (const cpNode of cpNodes) {
22
+ const cps = [cpNode];
23
+ while (cps.length) {
24
+ const cp = cps.pop()!;
25
+ traverseVerticesCallback(cp);
26
+ cps.push(...getVertexForwardChildren(cp));
27
+ }
28
+ }
29
29
  }
30
30
 
31
31