flo-mat 2.0.2 → 2.0.3

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 (216) hide show
  1. package/browser/index.js +8230 -8229
  2. package/browser/index.min.js +1 -1
  3. package/node/circle.d.ts +20 -20
  4. package/node/circle.js +31 -31
  5. package/node/compare-curvatures-at-interface.d.ts +19 -19
  6. package/node/compare-curvatures-at-interface.js +124 -124
  7. package/node/contact-point.d.ts +26 -26
  8. package/node/contact-point.js +25 -25
  9. package/node/cp-node/clone.d.ts +8 -8
  10. package/node/cp-node/clone.js +31 -31
  11. package/node/cp-node/remove.d.ts +9 -9
  12. package/node/cp-node/remove.js +19 -19
  13. package/node/cp-node.d.ts +202 -202
  14. package/node/cp-node.js +320 -320
  15. package/node/curve.d.ts +46 -46
  16. package/node/curve.js +88 -88
  17. package/node/debug/cp-node-for-debugging.d.ts +11 -11
  18. package/node/debug/cp-node-for-debugging.js +1 -1
  19. package/node/debug/debug-elem-types.d.ts +32 -32
  20. package/node/debug/debug-elem-types.js +1 -1
  21. package/node/debug/debug.d.ts +50 -50
  22. package/node/debug/debug.js +75 -75
  23. package/node/debug/functions/draw-elem/bounding-hull.d.ts +3 -3
  24. package/node/debug/functions/draw-elem/bounding-hull.js +7 -7
  25. package/node/debug/functions/draw-elem/branch.d.ts +4 -4
  26. package/node/debug/functions/draw-elem/branch.js +22 -22
  27. package/node/debug/functions/draw-elem/culls.d.ts +4 -4
  28. package/node/debug/functions/draw-elem/culls.js +21 -21
  29. package/node/debug/functions/draw-elem/draw-circle-percent.d.ts +3 -3
  30. package/node/debug/functions/draw-elem/draw-circle-percent.js +12 -12
  31. package/node/debug/functions/draw-elem/draw-elem.d.ts +8 -8
  32. package/node/debug/functions/draw-elem/draw-elem.js +45 -45
  33. package/node/debug/functions/draw-elem/dull-corner.d.ts +4 -4
  34. package/node/debug/functions/draw-elem/dull-corner.js +10 -10
  35. package/node/debug/functions/draw-elem/leaves.d.ts +4 -4
  36. package/node/debug/functions/draw-elem/leaves.js +12 -12
  37. package/node/debug/functions/draw-elem/loop.d.ts +4 -4
  38. package/node/debug/functions/draw-elem/loop.js +11 -11
  39. package/node/debug/functions/draw-elem/loops.d.ts +4 -4
  40. package/node/debug/functions/draw-elem/loops.js +6 -6
  41. package/node/debug/functions/draw-elem/loose-bounding-box.d.ts +3 -3
  42. package/node/debug/functions/draw-elem/loose-bounding-box.js +9 -9
  43. package/node/debug/functions/draw-elem/mat.d.ts +4 -4
  44. package/node/debug/functions/draw-elem/mat.js +30 -30
  45. package/node/debug/functions/draw-elem/max-vertex.d.ts +4 -4
  46. package/node/debug/functions/draw-elem/max-vertex.js +8 -8
  47. package/node/debug/functions/draw-elem/min-y.d.ts +4 -4
  48. package/node/debug/functions/draw-elem/min-y.js +13 -13
  49. package/node/debug/functions/draw-elem/one-prong-at-dull-corner.d.ts +4 -4
  50. package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js +12 -12
  51. package/node/debug/functions/draw-elem/one-prong.d.ts +4 -4
  52. package/node/debug/functions/draw-elem/one-prong.js +16 -16
  53. package/node/debug/functions/draw-elem/sharp-corner.d.ts +4 -4
  54. package/node/debug/functions/draw-elem/sharp-corner.js +9 -9
  55. package/node/debug/functions/draw-elem/three-prong.d.ts +4 -4
  56. package/node/debug/functions/draw-elem/three-prong.js +16 -16
  57. package/node/debug/functions/draw-elem/tight-bounding-box.d.ts +3 -3
  58. package/node/debug/functions/draw-elem/tight-bounding-box.js +7 -7
  59. package/node/debug/functions/draw-elem/two-prong.d.ts +4 -4
  60. package/node/debug/functions/draw-elem/two-prong.js +36 -36
  61. package/node/debug/functions/draw-elem/vertex.d.ts +4 -4
  62. package/node/debug/functions/draw-elem/vertex.js +27 -27
  63. package/node/debug/functions/general.d.ts +48 -48
  64. package/node/debug/functions/general.js +52 -52
  65. package/node/debug/functions/three-prong.d.ts +11 -11
  66. package/node/debug/functions/three-prong.js +184 -184
  67. package/node/debug/functions/two-prong.d.ts +13 -13
  68. package/node/debug/functions/two-prong.js +117 -117
  69. package/node/debug/three-prong-for-debugging.d.ts +31 -31
  70. package/node/debug/three-prong-for-debugging.js +20 -20
  71. package/node/debug/two-prong-for-debugging.d.ts +26 -26
  72. package/node/debug/two-prong-for-debugging.js +1 -1
  73. package/node/find-mats.d.ts +26 -26
  74. package/node/find-mats.js +122 -122
  75. package/node/get-boundary-bezier-parts-to-next.d.ts +9 -9
  76. package/node/get-boundary-bezier-parts-to-next.js +42 -42
  77. package/node/get-boundary-beziers-to-next.d.ts +8 -8
  78. package/node/get-boundary-beziers-to-next.js +44 -44
  79. package/node/get-bounding-box-.d.ts +2 -2
  80. package/node/get-bounding-box-.js +4 -4
  81. package/node/get-branches.d.ts +12 -12
  82. package/node/get-branches.js +68 -68
  83. package/node/get-curve/get-curve-between.d.ts +9 -9
  84. package/node/get-curve/get-curve-between.js +56 -56
  85. package/node/get-curve/get-edge-direction.d.ts +9 -9
  86. package/node/get-curve/get-edge-direction.js +53 -53
  87. package/node/get-curve-to-next.d.ts +9 -9
  88. package/node/get-curve-to-next.js +11 -11
  89. package/node/get-interface-ccw.d.ts +24 -24
  90. package/node/get-interface-ccw.js +97 -97
  91. package/node/index.d.ts +36 -36
  92. package/node/index.js +32 -32
  93. package/node/loop/get-max-coordinate.d.ts +10 -10
  94. package/node/loop/get-max-coordinate.js +43 -43
  95. package/node/loop.d.ts +16 -16
  96. package/node/loop.js +34 -34
  97. package/node/mat/add-to-cp-graph.d.ts +16 -16
  98. package/node/mat/add-to-cp-graph.js +30 -30
  99. package/node/mat/bezier-piece.d.ts +12 -12
  100. package/node/mat/bezier-piece.js +1 -1
  101. package/node/mat/closest-boundary-point/closest-points-on-curve.d.ts +14 -14
  102. package/node/mat/closest-boundary-point/closest-points-on-curve.js +72 -72
  103. package/node/mat/closest-boundary-point/cull-bezier-pieces.d.ts +9 -9
  104. package/node/mat/closest-boundary-point/cull-bezier-pieces.js +19 -19
  105. package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.d.ts +11 -11
  106. package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js +24 -24
  107. package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.d.ts +11 -11
  108. package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js +26 -26
  109. package/node/mat/closest-boundary-point/get-best-distance-squared.d.ts +8 -8
  110. package/node/mat/closest-boundary-point/get-best-distance-squared.js +24 -24
  111. package/node/mat/closest-boundary-point/get-close-boundary-points.d.ts +17 -17
  112. package/node/mat/closest-boundary-point/get-close-boundary-points.js +80 -80
  113. package/node/mat/closest-boundary-point/get-closest-boundary-point.d.ts +18 -18
  114. package/node/mat/closest-boundary-point/get-closest-boundary-point.js +40 -40
  115. package/node/mat/corner.d.ts +37 -37
  116. package/node/mat/corner.js +1 -1
  117. package/node/mat/create-new-cp-tree.d.ts +9 -9
  118. package/node/mat/create-new-cp-tree.js +23 -23
  119. package/node/mat/elem-type-two-prong.d.ts +3 -3
  120. package/node/mat/elem-type-two-prong.js +1 -1
  121. package/node/mat/find-mat/add-1-prong.d.ts +12 -12
  122. package/node/mat/find-mat/add-1-prong.js +42 -42
  123. package/node/mat/find-mat/add-2-prong.d.ts +21 -21
  124. package/node/mat/find-mat/add-2-prong.js +192 -192
  125. package/node/mat/find-mat/add-3-prong.d.ts +19 -19
  126. package/node/mat/find-mat/add-3-prong.js +54 -54
  127. package/node/mat/find-mat/add-debug-info.d.ts +9 -9
  128. package/node/mat/find-mat/add-debug-info.js +67 -67
  129. package/node/mat/find-mat/create-get-interesting-points-on-loop.d.ts +11 -11
  130. package/node/mat/find-mat/create-get-interesting-points-on-loop.js +51 -51
  131. package/node/mat/find-mat/create-initial-cp-graph.d.ts +12 -12
  132. package/node/mat/find-mat/create-initial-cp-graph.js +40 -40
  133. package/node/mat/find-mat/find-2-prong/add-debug-info.d.ts +8 -8
  134. package/node/mat/find-mat/find-2-prong/add-debug-info.js +21 -21
  135. package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.d.ts +11 -11
  136. package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js +29 -29
  137. package/node/mat/find-mat/find-2-prong/find-2-prong.d.ts +37 -37
  138. package/node/mat/find-mat/find-2-prong/find-2-prong.js +232 -232
  139. package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.d.ts +9 -9
  140. package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js +39 -39
  141. package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.d.ts +11 -11
  142. package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js +37 -37
  143. package/node/mat/find-mat/find-2-prong/x-for-debugging.d.ts +9 -9
  144. package/node/mat/find-mat/find-2-prong/x-for-debugging.js +1 -1
  145. package/node/mat/find-mat/find-3-prong/calc-better-x.d.ts +19 -19
  146. package/node/mat/find-mat/find-3-prong/calc-better-x.js +36 -36
  147. package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.d.ts +13 -13
  148. package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js +25 -25
  149. package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.d.ts +22 -22
  150. package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js +159 -159
  151. package/node/mat/find-mat/find-3-prong/find-3-prong.d.ts +16 -16
  152. package/node/mat/find-mat/find-3-prong/find-3-prong.js +76 -76
  153. package/node/mat/find-mat/find-3-prong/get-closest-points.d.ts +9 -9
  154. package/node/mat/find-mat/find-3-prong/get-closest-points.js +16 -16
  155. package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.d.ts +15 -15
  156. package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js +20 -20
  157. package/node/mat/find-mat/find-and-add-2-prongs.d.ts +16 -16
  158. package/node/mat/find-mat/find-and-add-2-prongs.js +73 -73
  159. package/node/mat/find-mat/find-and-add-3-prongs.d.ts +13 -13
  160. package/node/mat/find-mat/find-and-add-3-prongs.js +146 -146
  161. package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.d.ts +14 -14
  162. package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js +33 -33
  163. package/node/mat/find-mat/get-potential-2-prongs.d.ts +4 -4
  164. package/node/mat/find-mat/get-potential-2-prongs.js +16 -16
  165. package/node/mat/find-mat/get-sharp-corners.d.ts +4 -4
  166. package/node/mat/find-mat/get-sharp-corners.js +17 -17
  167. package/node/mat/geometry/get-closest-square-distance-to-rect.d.ts +5 -5
  168. package/node/mat/geometry/get-closest-square-distance-to-rect.js +49 -49
  169. package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +5 -5
  170. package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js +15 -15
  171. package/node/mat/get-boundary-piece-beziers.d.ts +11 -11
  172. package/node/mat/get-boundary-piece-beziers.js +58 -58
  173. package/node/mat/get-contact-circles-at-interface.d.ts +8 -8
  174. package/node/mat/get-contact-circles-at-interface.js +20 -20
  175. package/node/mat/get-largest-vertex.d.ts +4 -4
  176. package/node/mat/get-largest-vertex.js +9 -9
  177. package/node/mat/get-leaves.d.ts +4 -4
  178. package/node/mat/get-leaves.js +12 -12
  179. package/node/mat/get-neighboring-cps.d.ts +14 -14
  180. package/node/mat/get-neighboring-cps.js +30 -30
  181. package/node/mat/get-two-prong-type.d.ts +5 -5
  182. package/node/mat/get-two-prong-type.js +8 -8
  183. package/node/mat/is-another-cp-closeby.d.ts +20 -20
  184. package/node/mat/is-another-cp-closeby.js +55 -55
  185. package/node/mat/simplify-mat-map-only.d.ts +23 -23
  186. package/node/mat/simplify-mat-map-only.js +80 -80
  187. package/node/mat/to-scale-axis/add-debug-info.d.ts +7 -7
  188. package/node/mat/to-scale-axis/add-debug-info.js +13 -13
  189. package/node/mat/to-scale-axis/cull-non-cycles.d.ts +9 -9
  190. package/node/mat/to-scale-axis/cull-non-cycles.js +51 -51
  191. package/node/mat/to-scale-axis/cull.d.ts +12 -12
  192. package/node/mat/to-scale-axis/cull.js +132 -132
  193. package/node/mat/trim-mat.d.ts +8 -8
  194. package/node/mat/trim-mat.js +16 -16
  195. package/node/mat.d.ts +22 -22
  196. package/node/mat.js +1 -1
  197. package/node/point-on-shape.d.ts +73 -73
  198. package/node/point-on-shape.js +167 -167
  199. package/node/simplify-mat.d.ts +16 -16
  200. package/node/simplify-mat.js +71 -71
  201. package/node/svg/get-loop-bounds.d.ts +12 -12
  202. package/node/svg/get-loop-bounds.js +80 -80
  203. package/node/svg/get-min-y-pos.d.ts +8 -8
  204. package/node/svg/get-min-y-pos.js +9 -9
  205. package/node/svg/get-shape-bounds.d.ts +9 -9
  206. package/node/svg/get-shape-bounds.js +35 -35
  207. package/node/sweep-line/sweep-line.d.ts +18 -18
  208. package/node/sweep-line/sweep-line.js +72 -72
  209. package/node/to-scale-axis.d.ts +16 -16
  210. package/node/to-scale-axis.js +74 -74
  211. package/node/traverse-edges.d.ts +10 -10
  212. package/node/traverse-edges.js +21 -21
  213. package/node/traverse-vertices.d.ts +12 -12
  214. package/node/traverse-vertices.js +27 -27
  215. package/package.json +11 -11
  216. package/tsconfig.json +0 -1
@@ -1,45 +1,45 @@
1
- // qqq import { fromTo, fromTTo1, from0ToT } from 'flo-bezier3';
2
- import { fromTo } from 'flo-bezier3';
3
- /**
4
- * Returns the ordered bezier curves from this CpNode to the next CpNode
5
- * on the boundary.
6
- * @param cpNode
7
- */
8
- function getBoundaryBeziersToNext(cpNode) {
9
- const cpThis = cpNode;
10
- const cpNext = cpNode.next;
11
- const posThis = cpThis.cp.pointOnShape;
12
- const posNext = cpNext.cp.pointOnShape;
13
- const curveThis = posThis.curve;
14
- const curveNext = posNext.curve;
15
- if (curveThis.loop !== curveNext.loop) {
16
- // It is a hole-closer going over to the other loop - a kind of terminal
17
- // CpNode.
18
- return undefined;
19
- }
20
- const beziers = [];
21
- if (curveNext === curveThis) {
22
- beziers.push(fromTo(posThis.curve.ps, posThis.t, posNext.t));
23
- }
24
- else {
25
- beziers.push(fromTo(posThis.curve.ps, posThis.t, 1));
26
- addSkippedBeziers(beziers, posThis.curve, posNext.curve, posNext.t);
27
- }
28
- return beziers;
29
- }
30
- /**
31
- * Adds pieces of skipped beziers.
32
- * @hidden
33
- */
34
- function addSkippedBeziers(beziers, curveStart, curveEnd, t1) {
35
- let curveThis = curveStart;
36
- do {
37
- curveThis = curveThis.next;
38
- const tEnd = curveThis === curveEnd ? t1 : 1;
39
- beziers.push(
40
- // qqq from0ToT(curveThis.ps, tEnd)
41
- fromTo(curveThis.ps, 0, tEnd));
42
- } while (curveThis !== curveEnd);
43
- }
44
- export { getBoundaryBeziersToNext };
1
+ // qqq import { fromTo, fromTTo1, from0ToT } from 'flo-bezier3';
2
+ import { fromTo } from 'flo-bezier3';
3
+ /**
4
+ * Returns the ordered bezier curves from this CpNode to the next CpNode
5
+ * on the boundary.
6
+ * @param cpNode
7
+ */
8
+ function getBoundaryBeziersToNext(cpNode) {
9
+ const cpThis = cpNode;
10
+ const cpNext = cpNode.next;
11
+ const posThis = cpThis.cp.pointOnShape;
12
+ const posNext = cpNext.cp.pointOnShape;
13
+ const curveThis = posThis.curve;
14
+ const curveNext = posNext.curve;
15
+ if (curveThis.loop !== curveNext.loop) {
16
+ // It is a hole-closer going over to the other loop - a kind of terminal
17
+ // CpNode.
18
+ return undefined;
19
+ }
20
+ const beziers = [];
21
+ if (curveNext === curveThis) {
22
+ beziers.push(fromTo(posThis.curve.ps, posThis.t, posNext.t));
23
+ }
24
+ else {
25
+ beziers.push(fromTo(posThis.curve.ps, posThis.t, 1));
26
+ addSkippedBeziers(beziers, posThis.curve, posNext.curve, posNext.t);
27
+ }
28
+ return beziers;
29
+ }
30
+ /**
31
+ * Adds pieces of skipped beziers.
32
+ * @hidden
33
+ */
34
+ function addSkippedBeziers(beziers, curveStart, curveEnd, t1) {
35
+ let curveThis = curveStart;
36
+ do {
37
+ curveThis = curveThis.next;
38
+ const tEnd = curveThis === curveEnd ? t1 : 1;
39
+ beziers.push(
40
+ // qqq from0ToT(curveThis.ps, tEnd)
41
+ fromTo(curveThis.ps, 0, tEnd));
42
+ } while (curveThis !== curveEnd);
43
+ }
44
+ export { getBoundaryBeziersToNext };
45
45
  //# sourceMappingURL=get-boundary-beziers-to-next.js.map
@@ -1,2 +1,2 @@
1
- declare const getBoundingBox_: (a: number[][]) => number[][];
2
- export { getBoundingBox_ };
1
+ declare const getBoundingBox_: (a: number[][]) => number[][];
2
+ export { getBoundingBox_ };
@@ -1,5 +1,5 @@
1
- import { getBoundingBox } from "flo-bezier3";
2
- import { memoize } from "flo-memoize";
3
- const getBoundingBox_ = memoize(getBoundingBox);
4
- export { getBoundingBox_ };
1
+ import { getBoundingBox } from "flo-bezier3";
2
+ import { memoize } from "flo-memoize";
3
+ const getBoundingBox_ = memoize(getBoundingBox);
4
+ export { getBoundingBox_ };
5
5
  //# sourceMappingURL=get-bounding-box-.js.map
@@ -1,12 +1,12 @@
1
- import { CpNode } from './cp-node.js';
2
- /**
3
- * Traverses all edges (depth first) of the given MAT tree starting at the given
4
- * vertex (represented by a [[CpNode]]). Returns the result as an array of
5
- * smooth branches, where smoothness is total or within a given tolerance.
6
- * @param cpNode Any [[CpNode]] representing the start vertex.
7
- * @param tolerance Tolerance given as the degrees difference of the unit
8
- * direction vectors at the interface between curves. A tolerance of zero means
9
- * perfect smoothness is required.
10
- */
11
- declare function getBranches(cpNode: CpNode, tolerance?: number): CpNode[][];
12
- export { getBranches };
1
+ import { CpNode } from './cp-node.js';
2
+ /**
3
+ * Traverses all edges (depth first) of the given MAT tree starting at the given
4
+ * vertex (represented by a [[CpNode]]). Returns the result as an array of
5
+ * smooth branches, where smoothness is total or within a given tolerance.
6
+ * @param cpNode Any [[CpNode]] representing the start vertex.
7
+ * @param tolerance Tolerance given as the degrees difference of the unit
8
+ * direction vectors at the interface between curves. A tolerance of zero means
9
+ * perfect smoothness is required.
10
+ */
11
+ declare function getBranches(cpNode: CpNode, tolerance?: number): CpNode[][];
12
+ export { getBranches };
@@ -1,69 +1,69 @@
1
- import { tangent } from 'flo-bezier3';
2
- import { cross, toUnitVector } from 'flo-vector2d';
3
- import { getCurveToNext } from './get-curve-to-next.js';
4
- /** @hidden */
5
- const defaultTolerance = 1; // 1 degree
6
- /**
7
- * Traverses all edges (depth first) of the given MAT tree starting at the given
8
- * vertex (represented by a [[CpNode]]). Returns the result as an array of
9
- * smooth branches, where smoothness is total or within a given tolerance.
10
- * @param cpNode Any [[CpNode]] representing the start vertex.
11
- * @param tolerance Tolerance given as the degrees difference of the unit
12
- * direction vectors at the interface between curves. A tolerance of zero means
13
- * perfect smoothness is required.
14
- */
15
- function getBranches(cpNode, tolerance = defaultTolerance) {
16
- // Start from a leaf
17
- while (!cpNode.isFullyTerminating()) {
18
- cpNode = cpNode.next;
19
- }
20
- const branches = [];
21
- // Since the tree is unrooted we must iterate in all directions from the
22
- // given vertex.
23
- const cps = [cpNode.prevOnCircle];
24
- let branchCpNodes = [];
25
- while (cps.length) {
26
- const cp = cps.pop();
27
- branchCpNodes.push(cp);
28
- let children = cp.getChildren();
29
- if (cp.isFullyTerminating()) {
30
- if (branchCpNodes.length > 1) {
31
- branches.push(branchCpNodes);
32
- }
33
- branchCpNodes = [];
34
- continue;
35
- }
36
- if (children.length === 1) {
37
- cps.push(children[0]);
38
- continue;
39
- }
40
- children = children.filter(cpNode => !cpNode.isTerminating());
41
- if (children.length === 0) {
42
- branches.push(branchCpNodes);
43
- branchCpNodes = [];
44
- continue;
45
- }
46
- if (children.length > 1) {
47
- // More than one branch comes together
48
- branches.push(branchCpNodes);
49
- branchCpNodes = [];
50
- cps.push(...children);
51
- continue;
52
- }
53
- const backPointingTan = toUnitVector(tangent(getCurveToNext(cp.next.prevOnCircle), 0));
54
- const forwardPointingTan = toUnitVector(tangent(getCurveToNext(children[0]), 0));
55
- const cross_ = cross(backPointingTan, forwardPointingTan);
56
- const angle = Math.abs(Math.asin(cross_) * (180 / Math.PI));
57
- if (angle > tolerance) {
58
- branches.push(branchCpNodes);
59
- branchCpNodes = [];
60
- }
61
- cps.push(children[0]);
62
- }
63
- if (branchCpNodes.length) {
64
- branches.push(branchCpNodes);
65
- }
66
- return branches;
67
- }
68
- export { getBranches };
1
+ import { tangent } from 'flo-bezier3';
2
+ import { cross, toUnitVector } from 'flo-vector2d';
3
+ import { getCurveToNext } from './get-curve-to-next.js';
4
+ /** @hidden */
5
+ const defaultTolerance = 1; // 1 degree
6
+ /**
7
+ * Traverses all edges (depth first) of the given MAT tree starting at the given
8
+ * vertex (represented by a [[CpNode]]). Returns the result as an array of
9
+ * smooth branches, where smoothness is total or within a given tolerance.
10
+ * @param cpNode Any [[CpNode]] representing the start vertex.
11
+ * @param tolerance Tolerance given as the degrees difference of the unit
12
+ * direction vectors at the interface between curves. A tolerance of zero means
13
+ * perfect smoothness is required.
14
+ */
15
+ function getBranches(cpNode, tolerance = defaultTolerance) {
16
+ // Start from a leaf
17
+ while (!cpNode.isFullyTerminating()) {
18
+ cpNode = cpNode.next;
19
+ }
20
+ const branches = [];
21
+ // Since the tree is unrooted we must iterate in all directions from the
22
+ // given vertex.
23
+ const cps = [cpNode.prevOnCircle];
24
+ let branchCpNodes = [];
25
+ while (cps.length) {
26
+ const cp = cps.pop();
27
+ branchCpNodes.push(cp);
28
+ let children = cp.getChildren();
29
+ if (cp.isFullyTerminating()) {
30
+ if (branchCpNodes.length > 1) {
31
+ branches.push(branchCpNodes);
32
+ }
33
+ branchCpNodes = [];
34
+ continue;
35
+ }
36
+ if (children.length === 1) {
37
+ cps.push(children[0]);
38
+ continue;
39
+ }
40
+ children = children.filter(cpNode => !cpNode.isTerminating());
41
+ if (children.length === 0) {
42
+ branches.push(branchCpNodes);
43
+ branchCpNodes = [];
44
+ continue;
45
+ }
46
+ if (children.length > 1) {
47
+ // More than one branch comes together
48
+ branches.push(branchCpNodes);
49
+ branchCpNodes = [];
50
+ cps.push(...children);
51
+ continue;
52
+ }
53
+ const backPointingTan = toUnitVector(tangent(getCurveToNext(cp.next.prevOnCircle), 0));
54
+ const forwardPointingTan = toUnitVector(tangent(getCurveToNext(children[0]), 0));
55
+ const cross_ = cross(backPointingTan, forwardPointingTan);
56
+ const angle = Math.abs(Math.asin(cross_) * (180 / Math.PI));
57
+ if (angle > tolerance) {
58
+ branches.push(branchCpNodes);
59
+ branchCpNodes = [];
60
+ }
61
+ cps.push(children[0]);
62
+ }
63
+ if (branchCpNodes.length) {
64
+ branches.push(branchCpNodes);
65
+ }
66
+ return branches;
67
+ }
68
+ export { getBranches };
69
69
  //# sourceMappingURL=get-branches.js.map
@@ -1,9 +1,9 @@
1
- import { CpNode } from '../cp-node.js';
2
- /**
3
- * Returns the bezier curve from the maximal disk of one [[CpNode]] to another
4
- * [[CpNode]]'s maximal disk.
5
- * @param cpNodeFrom
6
- * @param cpNodeTo
7
- */
8
- declare function getCurveBetween(cpNodeFrom: CpNode, cpNodeTo: CpNode): number[][];
9
- export { getCurveBetween };
1
+ import { CpNode } from '../cp-node.js';
2
+ /**
3
+ * Returns the bezier curve from the maximal disk of one [[CpNode]] to another
4
+ * [[CpNode]]'s maximal disk.
5
+ * @param cpNodeFrom
6
+ * @param cpNodeTo
7
+ */
8
+ declare function getCurveBetween(cpNodeFrom: CpNode, cpNodeTo: CpNode): number[][];
9
+ export { getCurveBetween };
@@ -1,57 +1,57 @@
1
- import { fromTo, dot, cross, rotate90Degrees, interpolate, translate, lineLineIntersection } from 'flo-vector2d';
2
- import { getEdgeDirection } from './get-edge-direction.js';
3
- /** @hidden */
4
- const TOLERANCE_ADD_2PRONG = 0.01;
5
- /** @hidden */
6
- const TOLERANCE_USE_LINE = 0.0001; // else cubic
7
- /**
8
- * Returns the bezier curve from the maximal disk of one [[CpNode]] to another
9
- * [[CpNode]]'s maximal disk.
10
- * @param cpNodeFrom
11
- * @param cpNodeTo
12
- */
13
- function getCurveBetween(cpNodeFrom, cpNodeTo) {
14
- const fromCc = cpNodeFrom.cp.circle.center;
15
- const fromL = getEdgeDirection(cpNodeFrom);
16
- const toCc = cpNodeTo.cp.circle.center;
17
- const toL = getEdgeDirection(cpNodeTo.prevOnCircle);
18
- const mid = lineLineIntersection(fromL, toL);
19
- const c = fromTo(fromCc, toCc);
20
- let twisted;
21
- if (!mid) {
22
- twisted = true;
23
- }
24
- else {
25
- const a = fromTo(fromCc, mid);
26
- const b = fromTo(toCc, mid);
27
- twisted = dot(a, c) < 0 || dot(b, c) > 0;
28
- }
29
- if (!twisted) {
30
- return [fromCc, mid, toCc];
31
- }
32
- const r = rotate90Degrees(c);
33
- const w1 = fromTo(fromL[0], fromL[1]); // This is a unit vector
34
- const w2 = fromTo(toL[0], toL[1]); // This is a unit vector
35
- const d1 = Math.abs(cross(c, w1)) / (3 * 3);
36
- const d2 = Math.abs(cross(c, w2)) / (3 * 3);
37
- if (d1 > TOLERANCE_ADD_2PRONG || d2 > TOLERANCE_ADD_2PRONG) {
38
- // TODO - not within tolerance - must add additional 2-prong
39
- return [fromCc, toCc];
40
- }
41
- if (d1 > TOLERANCE_USE_LINE || d2 > TOLERANCE_USE_LINE) {
42
- // approximate with cubic bezier
43
- const m1 = interpolate(fromCc, toCc, 1 / 3);
44
- const m2 = interpolate(fromCc, toCc, 2 / 3);
45
- const v1 = translate(r, m1);
46
- const v2 = translate(r, m2);
47
- const l1 = [m1, v1];
48
- const l2 = [m2, v2];
49
- const mid1 = lineLineIntersection(fromL, l1);
50
- const mid2 = lineLineIntersection(toL, l2);
51
- return [fromCc, mid1, mid2, toCc];
52
- }
53
- // Within tolerance - approximate with a straight line.
54
- return [fromCc, toCc];
55
- }
56
- export { getCurveBetween };
1
+ import { fromTo, dot, cross, rotate90Degrees, interpolate, translate, lineLineIntersection } from 'flo-vector2d';
2
+ import { getEdgeDirection } from './get-edge-direction.js';
3
+ /** @hidden */
4
+ const TOLERANCE_ADD_2PRONG = 0.01;
5
+ /** @hidden */
6
+ const TOLERANCE_USE_LINE = 0.0001; // else cubic
7
+ /**
8
+ * Returns the bezier curve from the maximal disk of one [[CpNode]] to another
9
+ * [[CpNode]]'s maximal disk.
10
+ * @param cpNodeFrom
11
+ * @param cpNodeTo
12
+ */
13
+ function getCurveBetween(cpNodeFrom, cpNodeTo) {
14
+ const fromCc = cpNodeFrom.cp.circle.center;
15
+ const fromL = getEdgeDirection(cpNodeFrom);
16
+ const toCc = cpNodeTo.cp.circle.center;
17
+ const toL = getEdgeDirection(cpNodeTo.prevOnCircle);
18
+ const mid = lineLineIntersection(fromL, toL);
19
+ const c = fromTo(fromCc, toCc);
20
+ let twisted;
21
+ if (!mid) {
22
+ twisted = true;
23
+ }
24
+ else {
25
+ const a = fromTo(fromCc, mid);
26
+ const b = fromTo(toCc, mid);
27
+ twisted = dot(a, c) < 0 || dot(b, c) > 0;
28
+ }
29
+ if (!twisted) {
30
+ return [fromCc, mid, toCc];
31
+ }
32
+ const r = rotate90Degrees(c);
33
+ const w1 = fromTo(fromL[0], fromL[1]); // This is a unit vector
34
+ const w2 = fromTo(toL[0], toL[1]); // This is a unit vector
35
+ const d1 = Math.abs(cross(c, w1)) / (3 * 3);
36
+ const d2 = Math.abs(cross(c, w2)) / (3 * 3);
37
+ if (d1 > TOLERANCE_ADD_2PRONG || d2 > TOLERANCE_ADD_2PRONG) {
38
+ // TODO - not within tolerance - must add additional 2-prong
39
+ return [fromCc, toCc];
40
+ }
41
+ if (d1 > TOLERANCE_USE_LINE || d2 > TOLERANCE_USE_LINE) {
42
+ // approximate with cubic bezier
43
+ const m1 = interpolate(fromCc, toCc, 1 / 3);
44
+ const m2 = interpolate(fromCc, toCc, 2 / 3);
45
+ const v1 = translate(r, m1);
46
+ const v2 = translate(r, m2);
47
+ const l1 = [m1, v1];
48
+ const l2 = [m2, v2];
49
+ const mid1 = lineLineIntersection(fromL, l1);
50
+ const mid2 = lineLineIntersection(toL, l2);
51
+ return [fromCc, mid1, mid2, toCc];
52
+ }
53
+ // Within tolerance - approximate with a straight line.
54
+ return [fromCc, toCc];
55
+ }
56
+ export { getCurveBetween };
57
57
  //# sourceMappingURL=get-curve-between.js.map
@@ -1,9 +1,9 @@
1
- import { CpNode } from '../cp-node.js';
2
- /**
3
- * @hidden
4
- * Returns a line segment of unit length starting in the given Vertex center and
5
- * pointing in the direction of the medial axis (viewed as a rooted tree).
6
- * @param cpNode
7
- */
8
- declare function getEdgeDirection(cpNode: CpNode): number[][];
9
- export { getEdgeDirection };
1
+ import { CpNode } from '../cp-node.js';
2
+ /**
3
+ * @hidden
4
+ * Returns a line segment of unit length starting in the given Vertex center and
5
+ * pointing in the direction of the medial axis (viewed as a rooted tree).
6
+ * @param cpNode
7
+ */
8
+ declare function getEdgeDirection(cpNode: CpNode): number[][];
9
+ export { getEdgeDirection };
@@ -1,54 +1,54 @@
1
- import { toUnitVector, fromTo, rotate, translate, rotate90Degrees, reverse, dot } from 'flo-vector2d';
2
- import { tangent } from 'flo-bezier3';
3
- import { isPosSharpCorner } from '../point-on-shape.js';
4
- /**
5
- * @hidden
6
- * Returns a line segment of unit length starting in the given Vertex center and
7
- * pointing in the direction of the medial axis (viewed as a rooted tree).
8
- * @param cpNode
9
- */
10
- function getEdgeDirection(cpNode) {
11
- const circleCenter = cpNode.cp.circle.center;
12
- const cp1 = cpNode;
13
- const cp2 = cpNode.nextOnCircle;
14
- const pos1 = cp1.cp.pointOnShape;
15
- const pos2 = cp2.cp.pointOnShape;
16
- const p1 = pos1.p;
17
- const p2 = pos2.p;
18
- let vDir;
19
- //if (!PointOnShape.isSharpCorner(pos1)) {
20
- if (!isPosSharpCorner(pos1)) {
21
- if (p1[0] === p2[0] && p1[1] === p2[1]) {
22
- vDir = fromTo(p1, circleCenter); // A 1-prong
23
- }
24
- else {
25
- vDir = rotate90Degrees(fromTo(p1, p2)); // not a 1-prong.
26
- }
27
- }
28
- else {
29
- let curve1;
30
- let curve2;
31
- // TODO - test if pos1.t can ever be 0 - it is terminating
32
- if (pos1.t === 0) {
33
- curve1 = pos1.curve;
34
- curve2 = pos1.curve.prev;
35
- }
36
- else if (pos1.t === 1) {
37
- curve1 = pos1.curve.next;
38
- curve2 = pos1.curve;
39
- }
40
- const tan1 = toUnitVector(tangent(curve1.ps, 0));
41
- const tan2 = reverse(toUnitVector(tangent(curve2.ps, 1)));
42
- const x = dot(tan1, tan2);
43
- // Recall the identities sin(acos(x)) = sqrt(1-x^2), etc. Also
44
- // recall the half angle formulas. Then the rotation matrix, R, can
45
- // be calculated.
46
- const cosθ = Math.sqrt((1 + x) / 2);
47
- const sinθ = Math.sqrt((1 - x) / 2);
48
- vDir = rotate(sinθ, cosθ, tan2);
49
- }
50
- const v = translate(toUnitVector(vDir), circleCenter);
51
- return [circleCenter, v];
52
- }
53
- export { getEdgeDirection };
1
+ import { toUnitVector, fromTo, rotate, translate, rotate90Degrees, reverse, dot } from 'flo-vector2d';
2
+ import { tangent } from 'flo-bezier3';
3
+ import { isPosSharpCorner } from '../point-on-shape.js';
4
+ /**
5
+ * @hidden
6
+ * Returns a line segment of unit length starting in the given Vertex center and
7
+ * pointing in the direction of the medial axis (viewed as a rooted tree).
8
+ * @param cpNode
9
+ */
10
+ function getEdgeDirection(cpNode) {
11
+ const circleCenter = cpNode.cp.circle.center;
12
+ const cp1 = cpNode;
13
+ const cp2 = cpNode.nextOnCircle;
14
+ const pos1 = cp1.cp.pointOnShape;
15
+ const pos2 = cp2.cp.pointOnShape;
16
+ const p1 = pos1.p;
17
+ const p2 = pos2.p;
18
+ let vDir;
19
+ //if (!PointOnShape.isSharpCorner(pos1)) {
20
+ if (!isPosSharpCorner(pos1)) {
21
+ if (p1[0] === p2[0] && p1[1] === p2[1]) {
22
+ vDir = fromTo(p1, circleCenter); // A 1-prong
23
+ }
24
+ else {
25
+ vDir = rotate90Degrees(fromTo(p1, p2)); // not a 1-prong.
26
+ }
27
+ }
28
+ else {
29
+ let curve1;
30
+ let curve2;
31
+ // TODO - test if pos1.t can ever be 0 - it is terminating
32
+ if (pos1.t === 0) {
33
+ curve1 = pos1.curve;
34
+ curve2 = pos1.curve.prev;
35
+ }
36
+ else if (pos1.t === 1) {
37
+ curve1 = pos1.curve.next;
38
+ curve2 = pos1.curve;
39
+ }
40
+ const tan1 = toUnitVector(tangent(curve1.ps, 0));
41
+ const tan2 = reverse(toUnitVector(tangent(curve2.ps, 1)));
42
+ const x = dot(tan1, tan2);
43
+ // Recall the identities sin(acos(x)) = sqrt(1-x^2), etc. Also
44
+ // recall the half angle formulas. Then the rotation matrix, R, can
45
+ // be calculated.
46
+ const cosθ = Math.sqrt((1 + x) / 2);
47
+ const sinθ = Math.sqrt((1 - x) / 2);
48
+ vDir = rotate(sinθ, cosθ, tan2);
49
+ }
50
+ const v = translate(toUnitVector(vDir), circleCenter);
51
+ return [circleCenter, v];
52
+ }
53
+ export { getEdgeDirection };
54
54
  //# sourceMappingURL=get-edge-direction.js.map
@@ -1,9 +1,9 @@
1
- import { CpNode } from './cp-node.js';
2
- /**
3
- * Returns the bezier curve from the maximal disk of the given [[CpNode]] to the
4
- * next [[CpNode]]'s maximal disk and thus directly represents a piece of the
5
- * medial axis.
6
- * @param cpNode
7
- */
8
- declare function getCurveToNext(cpNode: CpNode): number[][];
9
- export { getCurveToNext };
1
+ import { CpNode } from './cp-node.js';
2
+ /**
3
+ * Returns the bezier curve from the maximal disk of the given [[CpNode]] to the
4
+ * next [[CpNode]]'s maximal disk and thus directly represents a piece of the
5
+ * medial axis.
6
+ * @param cpNode
7
+ */
8
+ declare function getCurveToNext(cpNode: CpNode): number[][];
9
+ export { getCurveToNext };
@@ -1,12 +1,12 @@
1
- import { getCurveBetween } from './get-curve/get-curve-between.js';
2
- /**
3
- * Returns the bezier curve from the maximal disk of the given [[CpNode]] to the
4
- * next [[CpNode]]'s maximal disk and thus directly represents a piece of the
5
- * medial axis.
6
- * @param cpNode
7
- */
8
- function getCurveToNext(cpNode) {
9
- return getCurveBetween(cpNode, cpNode.next);
10
- }
11
- export { getCurveToNext };
1
+ import { getCurveBetween } from './get-curve/get-curve-between.js';
2
+ /**
3
+ * Returns the bezier curve from the maximal disk of the given [[CpNode]] to the
4
+ * next [[CpNode]]'s maximal disk and thus directly represents a piece of the
5
+ * medial axis.
6
+ * @param cpNode
7
+ */
8
+ function getCurveToNext(cpNode) {
9
+ return getCurveBetween(cpNode, cpNode.next);
10
+ }
11
+ export { getCurveToNext };
12
12
  //# sourceMappingURL=get-curve-to-next.js.map
@@ -1,24 +1,24 @@
1
- /**
2
- * Returns a positive value if the second bezier (of order 1, 2 or 3) curves
3
- * anti-clockwise with respect to the first at the point where the first bezier
4
- * ends and the second one starts. Returns a negative number if the turn is
5
- * clockwise. Returns 0 otherwise.
6
- *
7
- * The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
8
- *
9
- * The above obviously necessitates that their endpoints coincide as described.
10
- *
11
- * Preconditions (for robustness):
12
- * * The beziers has control points with max bit-length of 25 and bit-aligned.
13
- * * The bezier does not have infinite curvature at either endpoint
14
- *
15
- * This is so the vectors between control points can be
16
- * calculated exactly without resorting to adaptive infinite precision floating
17
- * point operations. Note: aligned to 'grid' here means if you bitwise-and all
18
- * values together the resulting bitlength === the max bithlength of any value.
19
- *
20
- * @param psI The incoming bezier that ends at the interface
21
- * @param psO The outgoing bezier that starts at the interface
22
- */
23
- declare function getInterfaceCcw(psI: number[][], psO: number[][]): number;
24
- export { getInterfaceCcw };
1
+ /**
2
+ * Returns a positive value if the second bezier (of order 1, 2 or 3) curves
3
+ * anti-clockwise with respect to the first at the point where the first bezier
4
+ * ends and the second one starts. Returns a negative number if the turn is
5
+ * clockwise. Returns 0 otherwise.
6
+ *
7
+ * The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
8
+ *
9
+ * The above obviously necessitates that their endpoints coincide as described.
10
+ *
11
+ * Preconditions (for robustness):
12
+ * * The beziers has control points with max bit-length of 25 and bit-aligned.
13
+ * * The bezier does not have infinite curvature at either endpoint
14
+ *
15
+ * This is so the vectors between control points can be
16
+ * calculated exactly without resorting to adaptive infinite precision floating
17
+ * point operations. Note: aligned to 'grid' here means if you bitwise-and all
18
+ * values together the resulting bitlength === the max bithlength of any value.
19
+ *
20
+ * @param psI The incoming bezier that ends at the interface
21
+ * @param psO The outgoing bezier that starts at the interface
22
+ */
23
+ declare function getInterfaceCcw(psI: number[][], psO: number[][]): number;
24
+ export { getInterfaceCcw };