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.
- package/browser/index.js +8230 -8229
- package/browser/index.min.js +1 -1
- package/node/circle.d.ts +20 -20
- package/node/circle.js +31 -31
- package/node/compare-curvatures-at-interface.d.ts +19 -19
- package/node/compare-curvatures-at-interface.js +124 -124
- package/node/contact-point.d.ts +26 -26
- package/node/contact-point.js +25 -25
- package/node/cp-node/clone.d.ts +8 -8
- package/node/cp-node/clone.js +31 -31
- package/node/cp-node/remove.d.ts +9 -9
- package/node/cp-node/remove.js +19 -19
- package/node/cp-node.d.ts +202 -202
- package/node/cp-node.js +320 -320
- package/node/curve.d.ts +46 -46
- package/node/curve.js +88 -88
- package/node/debug/cp-node-for-debugging.d.ts +11 -11
- package/node/debug/cp-node-for-debugging.js +1 -1
- package/node/debug/debug-elem-types.d.ts +32 -32
- package/node/debug/debug-elem-types.js +1 -1
- package/node/debug/debug.d.ts +50 -50
- package/node/debug/debug.js +75 -75
- package/node/debug/functions/draw-elem/bounding-hull.d.ts +3 -3
- package/node/debug/functions/draw-elem/bounding-hull.js +7 -7
- package/node/debug/functions/draw-elem/branch.d.ts +4 -4
- package/node/debug/functions/draw-elem/branch.js +22 -22
- package/node/debug/functions/draw-elem/culls.d.ts +4 -4
- package/node/debug/functions/draw-elem/culls.js +21 -21
- package/node/debug/functions/draw-elem/draw-circle-percent.d.ts +3 -3
- package/node/debug/functions/draw-elem/draw-circle-percent.js +12 -12
- package/node/debug/functions/draw-elem/draw-elem.d.ts +8 -8
- package/node/debug/functions/draw-elem/draw-elem.js +45 -45
- package/node/debug/functions/draw-elem/dull-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/dull-corner.js +10 -10
- package/node/debug/functions/draw-elem/leaves.d.ts +4 -4
- package/node/debug/functions/draw-elem/leaves.js +12 -12
- package/node/debug/functions/draw-elem/loop.d.ts +4 -4
- package/node/debug/functions/draw-elem/loop.js +11 -11
- package/node/debug/functions/draw-elem/loops.d.ts +4 -4
- package/node/debug/functions/draw-elem/loops.js +6 -6
- package/node/debug/functions/draw-elem/loose-bounding-box.d.ts +3 -3
- package/node/debug/functions/draw-elem/loose-bounding-box.js +9 -9
- package/node/debug/functions/draw-elem/mat.d.ts +4 -4
- package/node/debug/functions/draw-elem/mat.js +30 -30
- package/node/debug/functions/draw-elem/max-vertex.d.ts +4 -4
- package/node/debug/functions/draw-elem/max-vertex.js +8 -8
- package/node/debug/functions/draw-elem/min-y.d.ts +4 -4
- package/node/debug/functions/draw-elem/min-y.js +13 -13
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js +12 -12
- package/node/debug/functions/draw-elem/one-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/one-prong.js +16 -16
- package/node/debug/functions/draw-elem/sharp-corner.d.ts +4 -4
- package/node/debug/functions/draw-elem/sharp-corner.js +9 -9
- package/node/debug/functions/draw-elem/three-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/three-prong.js +16 -16
- package/node/debug/functions/draw-elem/tight-bounding-box.d.ts +3 -3
- package/node/debug/functions/draw-elem/tight-bounding-box.js +7 -7
- package/node/debug/functions/draw-elem/two-prong.d.ts +4 -4
- package/node/debug/functions/draw-elem/two-prong.js +36 -36
- package/node/debug/functions/draw-elem/vertex.d.ts +4 -4
- package/node/debug/functions/draw-elem/vertex.js +27 -27
- package/node/debug/functions/general.d.ts +48 -48
- package/node/debug/functions/general.js +52 -52
- package/node/debug/functions/three-prong.d.ts +11 -11
- package/node/debug/functions/three-prong.js +184 -184
- package/node/debug/functions/two-prong.d.ts +13 -13
- package/node/debug/functions/two-prong.js +117 -117
- package/node/debug/three-prong-for-debugging.d.ts +31 -31
- package/node/debug/three-prong-for-debugging.js +20 -20
- package/node/debug/two-prong-for-debugging.d.ts +26 -26
- package/node/debug/two-prong-for-debugging.js +1 -1
- package/node/find-mats.d.ts +26 -26
- package/node/find-mats.js +122 -122
- package/node/get-boundary-bezier-parts-to-next.d.ts +9 -9
- package/node/get-boundary-bezier-parts-to-next.js +42 -42
- package/node/get-boundary-beziers-to-next.d.ts +8 -8
- package/node/get-boundary-beziers-to-next.js +44 -44
- package/node/get-bounding-box-.d.ts +2 -2
- package/node/get-bounding-box-.js +4 -4
- package/node/get-branches.d.ts +12 -12
- package/node/get-branches.js +68 -68
- package/node/get-curve/get-curve-between.d.ts +9 -9
- package/node/get-curve/get-curve-between.js +56 -56
- package/node/get-curve/get-edge-direction.d.ts +9 -9
- package/node/get-curve/get-edge-direction.js +53 -53
- package/node/get-curve-to-next.d.ts +9 -9
- package/node/get-curve-to-next.js +11 -11
- package/node/get-interface-ccw.d.ts +24 -24
- package/node/get-interface-ccw.js +97 -97
- package/node/index.d.ts +36 -36
- package/node/index.js +32 -32
- package/node/loop/get-max-coordinate.d.ts +10 -10
- package/node/loop/get-max-coordinate.js +43 -43
- package/node/loop.d.ts +16 -16
- package/node/loop.js +34 -34
- package/node/mat/add-to-cp-graph.d.ts +16 -16
- package/node/mat/add-to-cp-graph.js +30 -30
- package/node/mat/bezier-piece.d.ts +12 -12
- package/node/mat/bezier-piece.js +1 -1
- package/node/mat/closest-boundary-point/closest-points-on-curve.d.ts +14 -14
- package/node/mat/closest-boundary-point/closest-points-on-curve.js +72 -72
- package/node/mat/closest-boundary-point/cull-bezier-pieces.d.ts +9 -9
- package/node/mat/closest-boundary-point/cull-bezier-pieces.js +19 -19
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.d.ts +11 -11
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js +24 -24
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.d.ts +11 -11
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js +26 -26
- package/node/mat/closest-boundary-point/get-best-distance-squared.d.ts +8 -8
- package/node/mat/closest-boundary-point/get-best-distance-squared.js +24 -24
- package/node/mat/closest-boundary-point/get-close-boundary-points.d.ts +17 -17
- package/node/mat/closest-boundary-point/get-close-boundary-points.js +80 -80
- package/node/mat/closest-boundary-point/get-closest-boundary-point.d.ts +18 -18
- package/node/mat/closest-boundary-point/get-closest-boundary-point.js +40 -40
- package/node/mat/corner.d.ts +37 -37
- package/node/mat/corner.js +1 -1
- package/node/mat/create-new-cp-tree.d.ts +9 -9
- package/node/mat/create-new-cp-tree.js +23 -23
- package/node/mat/elem-type-two-prong.d.ts +3 -3
- package/node/mat/elem-type-two-prong.js +1 -1
- package/node/mat/find-mat/add-1-prong.d.ts +12 -12
- package/node/mat/find-mat/add-1-prong.js +42 -42
- package/node/mat/find-mat/add-2-prong.d.ts +21 -21
- package/node/mat/find-mat/add-2-prong.js +192 -192
- package/node/mat/find-mat/add-3-prong.d.ts +19 -19
- package/node/mat/find-mat/add-3-prong.js +54 -54
- package/node/mat/find-mat/add-debug-info.d.ts +9 -9
- package/node/mat/find-mat/add-debug-info.js +67 -67
- package/node/mat/find-mat/create-get-interesting-points-on-loop.d.ts +11 -11
- package/node/mat/find-mat/create-get-interesting-points-on-loop.js +51 -51
- package/node/mat/find-mat/create-initial-cp-graph.d.ts +12 -12
- package/node/mat/find-mat/create-initial-cp-graph.js +40 -40
- package/node/mat/find-mat/find-2-prong/add-debug-info.d.ts +8 -8
- package/node/mat/find-mat/find-2-prong/add-debug-info.js +21 -21
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.d.ts +11 -11
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js +29 -29
- package/node/mat/find-mat/find-2-prong/find-2-prong.d.ts +37 -37
- package/node/mat/find-mat/find-2-prong/find-2-prong.js +232 -232
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.d.ts +9 -9
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js +39 -39
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.d.ts +11 -11
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js +37 -37
- package/node/mat/find-mat/find-2-prong/x-for-debugging.d.ts +9 -9
- package/node/mat/find-mat/find-2-prong/x-for-debugging.js +1 -1
- package/node/mat/find-mat/find-3-prong/calc-better-x.d.ts +19 -19
- package/node/mat/find-mat/find-3-prong/calc-better-x.js +36 -36
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.d.ts +13 -13
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js +25 -25
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.d.ts +22 -22
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js +159 -159
- package/node/mat/find-mat/find-3-prong/find-3-prong.d.ts +16 -16
- package/node/mat/find-mat/find-3-prong/find-3-prong.js +76 -76
- package/node/mat/find-mat/find-3-prong/get-closest-points.d.ts +9 -9
- package/node/mat/find-mat/find-3-prong/get-closest-points.js +16 -16
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.d.ts +15 -15
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js +20 -20
- package/node/mat/find-mat/find-and-add-2-prongs.d.ts +16 -16
- package/node/mat/find-mat/find-and-add-2-prongs.js +73 -73
- package/node/mat/find-mat/find-and-add-3-prongs.d.ts +13 -13
- package/node/mat/find-mat/find-and-add-3-prongs.js +146 -146
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.d.ts +14 -14
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js +33 -33
- package/node/mat/find-mat/get-potential-2-prongs.d.ts +4 -4
- package/node/mat/find-mat/get-potential-2-prongs.js +16 -16
- package/node/mat/find-mat/get-sharp-corners.d.ts +4 -4
- package/node/mat/find-mat/get-sharp-corners.js +17 -17
- package/node/mat/geometry/get-closest-square-distance-to-rect.d.ts +5 -5
- package/node/mat/geometry/get-closest-square-distance-to-rect.js +49 -49
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.d.ts +5 -5
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js +15 -15
- package/node/mat/get-boundary-piece-beziers.d.ts +11 -11
- package/node/mat/get-boundary-piece-beziers.js +58 -58
- package/node/mat/get-contact-circles-at-interface.d.ts +8 -8
- package/node/mat/get-contact-circles-at-interface.js +20 -20
- package/node/mat/get-largest-vertex.d.ts +4 -4
- package/node/mat/get-largest-vertex.js +9 -9
- package/node/mat/get-leaves.d.ts +4 -4
- package/node/mat/get-leaves.js +12 -12
- package/node/mat/get-neighboring-cps.d.ts +14 -14
- package/node/mat/get-neighboring-cps.js +30 -30
- package/node/mat/get-two-prong-type.d.ts +5 -5
- package/node/mat/get-two-prong-type.js +8 -8
- package/node/mat/is-another-cp-closeby.d.ts +20 -20
- package/node/mat/is-another-cp-closeby.js +55 -55
- package/node/mat/simplify-mat-map-only.d.ts +23 -23
- package/node/mat/simplify-mat-map-only.js +80 -80
- package/node/mat/to-scale-axis/add-debug-info.d.ts +7 -7
- package/node/mat/to-scale-axis/add-debug-info.js +13 -13
- package/node/mat/to-scale-axis/cull-non-cycles.d.ts +9 -9
- package/node/mat/to-scale-axis/cull-non-cycles.js +51 -51
- package/node/mat/to-scale-axis/cull.d.ts +12 -12
- package/node/mat/to-scale-axis/cull.js +132 -132
- package/node/mat/trim-mat.d.ts +8 -8
- package/node/mat/trim-mat.js +16 -16
- package/node/mat.d.ts +22 -22
- package/node/mat.js +1 -1
- package/node/point-on-shape.d.ts +73 -73
- package/node/point-on-shape.js +167 -167
- package/node/simplify-mat.d.ts +16 -16
- package/node/simplify-mat.js +71 -71
- package/node/svg/get-loop-bounds.d.ts +12 -12
- package/node/svg/get-loop-bounds.js +80 -80
- package/node/svg/get-min-y-pos.d.ts +8 -8
- package/node/svg/get-min-y-pos.js +9 -9
- package/node/svg/get-shape-bounds.d.ts +9 -9
- package/node/svg/get-shape-bounds.js +35 -35
- package/node/sweep-line/sweep-line.d.ts +18 -18
- package/node/sweep-line/sweep-line.js +72 -72
- package/node/to-scale-axis.d.ts +16 -16
- package/node/to-scale-axis.js +74 -74
- package/node/traverse-edges.d.ts +10 -10
- package/node/traverse-edges.js +21 -21
- package/node/traverse-vertices.d.ts +12 -12
- package/node/traverse-vertices.js +27 -27
- package/package.json +11 -11
- 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
|
package/node/get-branches.d.ts
CHANGED
|
@@ -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 };
|
package/node/get-branches.js
CHANGED
|
@@ -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 };
|