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,98 +1,98 @@
|
|
|
1
|
-
import { orient2d } from 'big-float-ts';
|
|
2
|
-
import { dot } from "flo-vector2d";
|
|
3
|
-
import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.js";
|
|
4
|
-
/**
|
|
5
|
-
* Returns a positive value if the second bezier (of order 1, 2 or 3) curves
|
|
6
|
-
* anti-clockwise with respect to the first at the point where the first bezier
|
|
7
|
-
* ends and the second one starts. Returns a negative number if the turn is
|
|
8
|
-
* clockwise. Returns 0 otherwise.
|
|
9
|
-
*
|
|
10
|
-
* The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
|
|
11
|
-
*
|
|
12
|
-
* The above obviously necessitates that their endpoints coincide as described.
|
|
13
|
-
*
|
|
14
|
-
* Preconditions (for robustness):
|
|
15
|
-
* * The beziers has control points with max bit-length of 25 and bit-aligned.
|
|
16
|
-
* * The bezier does not have infinite curvature at either endpoint
|
|
17
|
-
*
|
|
18
|
-
* This is so the vectors between control points can be
|
|
19
|
-
* calculated exactly without resorting to adaptive infinite precision floating
|
|
20
|
-
* point operations. Note: aligned to 'grid' here means if you bitwise-and all
|
|
21
|
-
* values together the resulting bitlength === the max bithlength of any value.
|
|
22
|
-
*
|
|
23
|
-
* @param psI The incoming bezier that ends at the interface
|
|
24
|
-
* @param psO The outgoing bezier that starts at the interface
|
|
25
|
-
*/
|
|
26
|
-
// TODO - improve and make at least 46-bitlength precondition
|
|
27
|
-
function getInterfaceCcw(psI, psO) {
|
|
28
|
-
const lenI = psI.length;
|
|
29
|
-
// second last control point of incoming curve
|
|
30
|
-
const p0 = psI[lenI - 2];
|
|
31
|
-
// last control point of incoming curve / first control point of outgoing
|
|
32
|
-
const p1 = psO[0];
|
|
33
|
-
// second control point of outgoing curve
|
|
34
|
-
const p2 = psO[1];
|
|
35
|
-
/*
|
|
36
|
-
if (typeof _bez_debug_ !== 'undefined') {
|
|
37
|
-
let maxBitLength = 25;
|
|
38
|
-
let p1_ = psI[lenI-1];
|
|
39
|
-
// ---- precondition: does endpoints coincide
|
|
40
|
-
if (p1_[0] !== p1[0] || p1_[1] !== p1[1]) {
|
|
41
|
-
throw new Error('Curve endpoints must coincide.');
|
|
42
|
-
}
|
|
43
|
-
// ---- precondition: are coordinates grid-aligned
|
|
44
|
-
// Get all coordinate values into an array
|
|
45
|
-
let xs: number[] = [];
|
|
46
|
-
[psI, psO].forEach(ps => ps.forEach(p => p.forEach(x => {
|
|
47
|
-
xs.push(x);
|
|
48
|
-
})));
|
|
49
|
-
|
|
50
|
-
let msb = xs.reduce((prevX, x) => Math.max(prevX, msbExponent(x)), Number.NEGATIVE_INFINITY);
|
|
51
|
-
let lsb = xs.reduce((prevX, x) => Math.min(prevX, lsbExponent(x)), Number.POSITIVE_INFINITY);
|
|
52
|
-
let bitlengthAll = msb - lsb + 1;
|
|
53
|
-
if (bitlengthAll > maxBitLength) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
`Curve control point coordinates must be bit-aligned and <= ${maxBitLength}. bitlength === ${bitlengthAll}, coordinates: ${xs}`
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
*/
|
|
60
|
-
// Max one bit can be added in the calculations below due to bit-alignment
|
|
61
|
-
const xE = p1[0] - p0[0]; // tangent x-coordinate
|
|
62
|
-
const yE = p1[1] - p0[1]; // tangent y-coordinate
|
|
63
|
-
const xS = p2[0] - p1[0]; // tangent x-coordinate
|
|
64
|
-
const yS = p2[1] - p1[1]; // tangent y-coordinate
|
|
65
|
-
// If the tangent is to be found at t === 0 or t === 1 then using a basic
|
|
66
|
-
// property of bezier curves we can find the tangents easily as below
|
|
67
|
-
// (non-normalized) tangent of incoming curve at t === 1
|
|
68
|
-
const tangentAtEnd = [xE, yE];
|
|
69
|
-
// (non-normalized) tangent of outgoing curve at t === 0
|
|
70
|
-
const tangentAtStart = [xS, yS];
|
|
71
|
-
// The cross calculated below will have a max bitlength of
|
|
72
|
-
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
73
|
-
// If the preconditions are met it is exact
|
|
74
|
-
//let crossTangents = cross(tangentAtEnd, tangentAtStart);
|
|
75
|
-
// The cross below is exact by adaptive infinite precision
|
|
76
|
-
const crossTangents = orient2d(p0, p1, p2);
|
|
77
|
-
if (crossTangents !== 0) {
|
|
78
|
-
return crossTangents;
|
|
79
|
-
}
|
|
80
|
-
// The dot calculated below will have a max bitlength of
|
|
81
|
-
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
82
|
-
// If the preconditions are met it is exact
|
|
83
|
-
const dotTangents = dot(tangentAtEnd, tangentAtStart);
|
|
84
|
-
if (dotTangents > 0) {
|
|
85
|
-
// Curves go in same direction at interface - neither clock or
|
|
86
|
-
// anti-clockwise.
|
|
87
|
-
// Note: The above comment is not strictly true but as this case is not
|
|
88
|
-
// important for the algorithm we return 0
|
|
89
|
-
return 0;
|
|
90
|
-
}
|
|
91
|
-
// Curves go in opposite directions at interface starting off with the exact
|
|
92
|
-
// same tangent - look now at curvature to see which has the largest
|
|
93
|
-
// curvature so we can base the clock or anti-clockwise result on that
|
|
94
|
-
// Look at curvature
|
|
95
|
-
return compareCurvaturesAtInterface(psI.slice().reverse(), psO);
|
|
96
|
-
}
|
|
97
|
-
export { getInterfaceCcw };
|
|
1
|
+
import { orient2d } from 'big-float-ts';
|
|
2
|
+
import { dot } from "flo-vector2d";
|
|
3
|
+
import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.js";
|
|
4
|
+
/**
|
|
5
|
+
* Returns a positive value if the second bezier (of order 1, 2 or 3) curves
|
|
6
|
+
* anti-clockwise with respect to the first at the point where the first bezier
|
|
7
|
+
* ends and the second one starts. Returns a negative number if the turn is
|
|
8
|
+
* clockwise. Returns 0 otherwise.
|
|
9
|
+
*
|
|
10
|
+
* The algorithm is a generalization of `ccw`, a.k.a `orient2d`.
|
|
11
|
+
*
|
|
12
|
+
* The above obviously necessitates that their endpoints coincide as described.
|
|
13
|
+
*
|
|
14
|
+
* Preconditions (for robustness):
|
|
15
|
+
* * The beziers has control points with max bit-length of 25 and bit-aligned.
|
|
16
|
+
* * The bezier does not have infinite curvature at either endpoint
|
|
17
|
+
*
|
|
18
|
+
* This is so the vectors between control points can be
|
|
19
|
+
* calculated exactly without resorting to adaptive infinite precision floating
|
|
20
|
+
* point operations. Note: aligned to 'grid' here means if you bitwise-and all
|
|
21
|
+
* values together the resulting bitlength === the max bithlength of any value.
|
|
22
|
+
*
|
|
23
|
+
* @param psI The incoming bezier that ends at the interface
|
|
24
|
+
* @param psO The outgoing bezier that starts at the interface
|
|
25
|
+
*/
|
|
26
|
+
// TODO - improve and make at least 46-bitlength precondition
|
|
27
|
+
function getInterfaceCcw(psI, psO) {
|
|
28
|
+
const lenI = psI.length;
|
|
29
|
+
// second last control point of incoming curve
|
|
30
|
+
const p0 = psI[lenI - 2];
|
|
31
|
+
// last control point of incoming curve / first control point of outgoing
|
|
32
|
+
const p1 = psO[0];
|
|
33
|
+
// second control point of outgoing curve
|
|
34
|
+
const p2 = psO[1];
|
|
35
|
+
/*
|
|
36
|
+
if (typeof _bez_debug_ !== 'undefined') {
|
|
37
|
+
let maxBitLength = 25;
|
|
38
|
+
let p1_ = psI[lenI-1];
|
|
39
|
+
// ---- precondition: does endpoints coincide
|
|
40
|
+
if (p1_[0] !== p1[0] || p1_[1] !== p1[1]) {
|
|
41
|
+
throw new Error('Curve endpoints must coincide.');
|
|
42
|
+
}
|
|
43
|
+
// ---- precondition: are coordinates grid-aligned
|
|
44
|
+
// Get all coordinate values into an array
|
|
45
|
+
let xs: number[] = [];
|
|
46
|
+
[psI, psO].forEach(ps => ps.forEach(p => p.forEach(x => {
|
|
47
|
+
xs.push(x);
|
|
48
|
+
})));
|
|
49
|
+
|
|
50
|
+
let msb = xs.reduce((prevX, x) => Math.max(prevX, msbExponent(x)), Number.NEGATIVE_INFINITY);
|
|
51
|
+
let lsb = xs.reduce((prevX, x) => Math.min(prevX, lsbExponent(x)), Number.POSITIVE_INFINITY);
|
|
52
|
+
let bitlengthAll = msb - lsb + 1;
|
|
53
|
+
if (bitlengthAll > maxBitLength) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
`Curve control point coordinates must be bit-aligned and <= ${maxBitLength}. bitlength === ${bitlengthAll}, coordinates: ${xs}`
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
*/
|
|
60
|
+
// Max one bit can be added in the calculations below due to bit-alignment
|
|
61
|
+
const xE = p1[0] - p0[0]; // tangent x-coordinate
|
|
62
|
+
const yE = p1[1] - p0[1]; // tangent y-coordinate
|
|
63
|
+
const xS = p2[0] - p1[0]; // tangent x-coordinate
|
|
64
|
+
const yS = p2[1] - p1[1]; // tangent y-coordinate
|
|
65
|
+
// If the tangent is to be found at t === 0 or t === 1 then using a basic
|
|
66
|
+
// property of bezier curves we can find the tangents easily as below
|
|
67
|
+
// (non-normalized) tangent of incoming curve at t === 1
|
|
68
|
+
const tangentAtEnd = [xE, yE];
|
|
69
|
+
// (non-normalized) tangent of outgoing curve at t === 0
|
|
70
|
+
const tangentAtStart = [xS, yS];
|
|
71
|
+
// The cross calculated below will have a max bitlength of
|
|
72
|
+
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
73
|
+
// If the preconditions are met it is exact
|
|
74
|
+
//let crossTangents = cross(tangentAtEnd, tangentAtStart);
|
|
75
|
+
// The cross below is exact by adaptive infinite precision
|
|
76
|
+
const crossTangents = orient2d(p0, p1, p2);
|
|
77
|
+
if (crossTangents !== 0) {
|
|
78
|
+
return crossTangents;
|
|
79
|
+
}
|
|
80
|
+
// The dot calculated below will have a max bitlength of
|
|
81
|
+
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
82
|
+
// If the preconditions are met it is exact
|
|
83
|
+
const dotTangents = dot(tangentAtEnd, tangentAtStart);
|
|
84
|
+
if (dotTangents > 0) {
|
|
85
|
+
// Curves go in same direction at interface - neither clock or
|
|
86
|
+
// anti-clockwise.
|
|
87
|
+
// Note: The above comment is not strictly true but as this case is not
|
|
88
|
+
// important for the algorithm we return 0
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
// Curves go in opposite directions at interface starting off with the exact
|
|
92
|
+
// same tangent - look now at curvature to see which has the largest
|
|
93
|
+
// curvature so we can base the clock or anti-clockwise result on that
|
|
94
|
+
// Look at curvature
|
|
95
|
+
return compareCurvaturesAtInterface(psI.slice().reverse(), psO);
|
|
96
|
+
}
|
|
97
|
+
export { getInterfaceCcw };
|
|
98
98
|
//# sourceMappingURL=get-interface-ccw.js.map
|
package/node/index.d.ts
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
|
|
2
|
-
import { Mat } from './mat.js';
|
|
3
|
-
import { Loop } from './loop.js';
|
|
4
|
-
import { Curve } from './curve.js';
|
|
5
|
-
import { CpNode } from './cp-node.js';
|
|
6
|
-
import { PointOnShape, IPointOnShape } from './point-on-shape.js';
|
|
7
|
-
import { Circle } from './circle.js';
|
|
8
|
-
import { ContactPoint } from './contact-point.js';
|
|
9
|
-
import { BezierPiece } from './mat/bezier-piece.js';
|
|
10
|
-
import { findMats } from './find-mats.js';
|
|
11
|
-
import { trimMat } from './mat/trim-mat.js';
|
|
12
|
-
import { toScaleAxis } from './to-scale-axis.js';
|
|
13
|
-
import { traverseEdges } from './traverse-edges.js';
|
|
14
|
-
import { getBranches } from './get-branches.js';
|
|
15
|
-
import { traverseVertices } from './traverse-vertices.js';
|
|
16
|
-
import { Debug, enableDebugForMat } from './debug/debug.js';
|
|
17
|
-
import { drawBranch } from './debug/functions/draw-elem/branch.js';
|
|
18
|
-
import { drawMat } from './debug/functions/draw-elem/mat.js';
|
|
19
|
-
import { IDebugElems } from './debug/debug-elem-types.js';
|
|
20
|
-
import { TDrawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
21
|
-
import { ICpNodeForDebugging } from './debug/cp-node-for-debugging.js';
|
|
22
|
-
import { ITiming } from './debug/debug.js';
|
|
23
|
-
import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
|
|
24
|
-
import { getShapeBounds } from './svg/get-shape-bounds.js';
|
|
25
|
-
import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
|
|
26
|
-
import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
|
|
27
|
-
import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
|
|
28
|
-
import { simplifyMat } from './simplify-mat.js';
|
|
29
|
-
import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
|
|
30
|
-
import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
31
|
-
import { getCurveToNext } from './get-curve-to-next.js';
|
|
32
|
-
import { getCurveBetween } from './get-curve/get-curve-between.js';
|
|
33
|
-
import { sweepLine } from './sweep-line/sweep-line.js';
|
|
34
|
-
import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
|
|
35
|
-
import { loopFromBeziers } from './loop.js';
|
|
36
|
-
export { Mat, PointOnShape, IPointOnShape, Curve, Loop, CpNode, Circle, ContactPoint, BezierPiece, findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly, beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat, getClosestBoundaryPoint, getCurveToNext, getCurveBetween, Debug, IDebugElems, TDrawElemFunctions, ICpNodeForDebugging, ITiming, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
|
|
1
|
+
import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
|
|
2
|
+
import { Mat } from './mat.js';
|
|
3
|
+
import { Loop } from './loop.js';
|
|
4
|
+
import { Curve } from './curve.js';
|
|
5
|
+
import { CpNode } from './cp-node.js';
|
|
6
|
+
import { PointOnShape, IPointOnShape } from './point-on-shape.js';
|
|
7
|
+
import { Circle } from './circle.js';
|
|
8
|
+
import { ContactPoint } from './contact-point.js';
|
|
9
|
+
import { BezierPiece } from './mat/bezier-piece.js';
|
|
10
|
+
import { findMats } from './find-mats.js';
|
|
11
|
+
import { trimMat } from './mat/trim-mat.js';
|
|
12
|
+
import { toScaleAxis } from './to-scale-axis.js';
|
|
13
|
+
import { traverseEdges } from './traverse-edges.js';
|
|
14
|
+
import { getBranches } from './get-branches.js';
|
|
15
|
+
import { traverseVertices } from './traverse-vertices.js';
|
|
16
|
+
import { Debug, enableDebugForMat } from './debug/debug.js';
|
|
17
|
+
import { drawBranch } from './debug/functions/draw-elem/branch.js';
|
|
18
|
+
import { drawMat } from './debug/functions/draw-elem/mat.js';
|
|
19
|
+
import { IDebugElems } from './debug/debug-elem-types.js';
|
|
20
|
+
import { TDrawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
21
|
+
import { ICpNodeForDebugging } from './debug/cp-node-for-debugging.js';
|
|
22
|
+
import { ITiming } from './debug/debug.js';
|
|
23
|
+
import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
|
|
24
|
+
import { getShapeBounds } from './svg/get-shape-bounds.js';
|
|
25
|
+
import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
|
|
26
|
+
import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
|
|
27
|
+
import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
|
|
28
|
+
import { simplifyMat } from './simplify-mat.js';
|
|
29
|
+
import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
|
|
30
|
+
import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
31
|
+
import { getCurveToNext } from './get-curve-to-next.js';
|
|
32
|
+
import { getCurveBetween } from './get-curve/get-curve-between.js';
|
|
33
|
+
import { sweepLine } from './sweep-line/sweep-line.js';
|
|
34
|
+
import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
|
|
35
|
+
import { loopFromBeziers } from './loop.js';
|
|
36
|
+
export { Mat, PointOnShape, IPointOnShape, Curve, Loop, CpNode, Circle, ContactPoint, BezierPiece, findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly, beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat, getClosestBoundaryPoint, getCurveToNext, getCurveBetween, Debug, IDebugElems, TDrawElemFunctions, ICpNodeForDebugging, ITiming, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
|
package/node/index.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
|
|
2
|
-
import { CpNode } from './cp-node.js';
|
|
3
|
-
import { PointOnShape } from './point-on-shape.js';
|
|
4
|
-
import { findMats } from './find-mats.js';
|
|
5
|
-
import { trimMat } from './mat/trim-mat.js';
|
|
6
|
-
import { toScaleAxis } from './to-scale-axis.js';
|
|
7
|
-
import { traverseEdges } from './traverse-edges.js';
|
|
8
|
-
import { getBranches } from './get-branches.js';
|
|
9
|
-
import { traverseVertices } from './traverse-vertices.js';
|
|
10
|
-
import { enableDebugForMat } from './debug/debug.js';
|
|
11
|
-
import { drawBranch } from './debug/functions/draw-elem/branch.js';
|
|
12
|
-
import { drawMat } from './debug/functions/draw-elem/mat.js';
|
|
13
|
-
import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
|
|
14
|
-
import { getShapeBounds } from './svg/get-shape-bounds.js';
|
|
15
|
-
import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
|
|
16
|
-
import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
|
|
17
|
-
import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
|
|
18
|
-
import { simplifyMat } from './simplify-mat.js';
|
|
19
|
-
import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
|
|
20
|
-
import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
21
|
-
import { getCurveToNext } from './get-curve-to-next.js';
|
|
22
|
-
import { getCurveBetween } from './get-curve/get-curve-between.js';
|
|
23
|
-
import { sweepLine } from './sweep-line/sweep-line.js';
|
|
24
|
-
import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
|
|
25
|
-
import { loopFromBeziers } from './loop.js';
|
|
26
|
-
export { PointOnShape, CpNode,
|
|
27
|
-
// Main functions
|
|
28
|
-
findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly,
|
|
29
|
-
// SVG functions
|
|
30
|
-
beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat,
|
|
31
|
-
// Other functions
|
|
32
|
-
getClosestBoundaryPoint, getCurveToNext, getCurveBetween, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
|
|
1
|
+
import { beziersToSvgPathStr, getPathsFromStr } from 'flo-boolean';
|
|
2
|
+
import { CpNode } from './cp-node.js';
|
|
3
|
+
import { PointOnShape } from './point-on-shape.js';
|
|
4
|
+
import { findMats } from './find-mats.js';
|
|
5
|
+
import { trimMat } from './mat/trim-mat.js';
|
|
6
|
+
import { toScaleAxis } from './to-scale-axis.js';
|
|
7
|
+
import { traverseEdges } from './traverse-edges.js';
|
|
8
|
+
import { getBranches } from './get-branches.js';
|
|
9
|
+
import { traverseVertices } from './traverse-vertices.js';
|
|
10
|
+
import { enableDebugForMat } from './debug/debug.js';
|
|
11
|
+
import { drawBranch } from './debug/functions/draw-elem/branch.js';
|
|
12
|
+
import { drawMat } from './debug/functions/draw-elem/mat.js';
|
|
13
|
+
import { getClosestBoundaryPoint } from './mat/closest-boundary-point/get-closest-boundary-point.js';
|
|
14
|
+
import { getShapeBounds } from './svg/get-shape-bounds.js';
|
|
15
|
+
import { getBoundaryBeziersToNext } from './get-boundary-beziers-to-next.js';
|
|
16
|
+
import { getBoundaryBezierPartsToNext } from './get-boundary-bezier-parts-to-next.js';
|
|
17
|
+
import { getBoundaryPieceBeziers } from './mat/get-boundary-piece-beziers.js';
|
|
18
|
+
import { simplifyMat } from './simplify-mat.js';
|
|
19
|
+
import { simplifyMatMapOnly } from './mat/simplify-mat-map-only.js';
|
|
20
|
+
import { drawElemFunctions } from './debug/functions/draw-elem/draw-elem.js';
|
|
21
|
+
import { getCurveToNext } from './get-curve-to-next.js';
|
|
22
|
+
import { getCurveBetween } from './get-curve/get-curve-between.js';
|
|
23
|
+
import { sweepLine } from './sweep-line/sweep-line.js';
|
|
24
|
+
import { getClosestSquareDistanceToRect } from './mat/geometry/get-closest-square-distance-to-rect.js';
|
|
25
|
+
import { loopFromBeziers } from './loop.js';
|
|
26
|
+
export { PointOnShape, CpNode,
|
|
27
|
+
// Main functions
|
|
28
|
+
findMats, toScaleAxis, trimMat, traverseVertices, traverseEdges, getBranches, getBoundaryBeziersToNext, getBoundaryBezierPartsToNext, simplifyMat, simplifyMatMapOnly,
|
|
29
|
+
// SVG functions
|
|
30
|
+
beziersToSvgPathStr, getPathsFromStr, getShapeBounds, drawBranch, drawMat,
|
|
31
|
+
// Other functions
|
|
32
|
+
getClosestBoundaryPoint, getCurveToNext, getCurveBetween, getBoundaryPieceBeziers, drawElemFunctions, sweepLine, getClosestSquareDistanceToRect, loopFromBeziers, enableDebugForMat };
|
|
33
33
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @hidden
|
|
3
|
-
* Returns the maximum control point coordinate value (x or y) within any loop.
|
|
4
|
-
* @param loops The array of loops
|
|
5
|
-
*/
|
|
6
|
-
declare function getLoopsMetrics(loops: number[][][][]): {
|
|
7
|
-
maxCoordinate: number;
|
|
8
|
-
maxRadius: number;
|
|
9
|
-
};
|
|
10
|
-
export { getLoopsMetrics };
|
|
1
|
+
/**
|
|
2
|
+
* @hidden
|
|
3
|
+
* Returns the maximum control point coordinate value (x or y) within any loop.
|
|
4
|
+
* @param loops The array of loops
|
|
5
|
+
*/
|
|
6
|
+
declare function getLoopsMetrics(loops: number[][][][]): {
|
|
7
|
+
maxCoordinate: number;
|
|
8
|
+
maxRadius: number;
|
|
9
|
+
};
|
|
10
|
+
export { getLoopsMetrics };
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
const max = Math.max;
|
|
2
|
-
const abs = Math.abs;
|
|
3
|
-
/**
|
|
4
|
-
* @hidden
|
|
5
|
-
* Returns the maximum control point coordinate value (x or y) within any loop.
|
|
6
|
-
* @param loops The array of loops
|
|
7
|
-
*/
|
|
8
|
-
function getLoopsMetrics(loops) {
|
|
9
|
-
let maxCoordinate = 0;
|
|
10
|
-
let minX = Number.POSITIVE_INFINITY;
|
|
11
|
-
let maxX = Number.NEGATIVE_INFINITY;
|
|
12
|
-
let minY = Number.POSITIVE_INFINITY;
|
|
13
|
-
let maxY = Number.NEGATIVE_INFINITY;
|
|
14
|
-
for (const loop of loops) {
|
|
15
|
-
for (const ps of loop) {
|
|
16
|
-
for (const p of ps) {
|
|
17
|
-
const x = p[0];
|
|
18
|
-
const y = p[1];
|
|
19
|
-
const c = max(abs(x), abs(y));
|
|
20
|
-
if (c > maxCoordinate) {
|
|
21
|
-
maxCoordinate = c;
|
|
22
|
-
}
|
|
23
|
-
if (x < minX) {
|
|
24
|
-
minX = x;
|
|
25
|
-
}
|
|
26
|
-
if (x > maxX) {
|
|
27
|
-
maxX = x;
|
|
28
|
-
}
|
|
29
|
-
if (y < minY) {
|
|
30
|
-
minY = y;
|
|
31
|
-
}
|
|
32
|
-
if (y > maxY) {
|
|
33
|
-
maxY = y;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
const width = maxX - minX;
|
|
39
|
-
const height = maxY - minY;
|
|
40
|
-
const maxRadius = max(width, height);
|
|
41
|
-
return { maxCoordinate, maxRadius };
|
|
42
|
-
}
|
|
43
|
-
export { getLoopsMetrics };
|
|
1
|
+
const max = Math.max;
|
|
2
|
+
const abs = Math.abs;
|
|
3
|
+
/**
|
|
4
|
+
* @hidden
|
|
5
|
+
* Returns the maximum control point coordinate value (x or y) within any loop.
|
|
6
|
+
* @param loops The array of loops
|
|
7
|
+
*/
|
|
8
|
+
function getLoopsMetrics(loops) {
|
|
9
|
+
let maxCoordinate = 0;
|
|
10
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
11
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
12
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
13
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
14
|
+
for (const loop of loops) {
|
|
15
|
+
for (const ps of loop) {
|
|
16
|
+
for (const p of ps) {
|
|
17
|
+
const x = p[0];
|
|
18
|
+
const y = p[1];
|
|
19
|
+
const c = max(abs(x), abs(y));
|
|
20
|
+
if (c > maxCoordinate) {
|
|
21
|
+
maxCoordinate = c;
|
|
22
|
+
}
|
|
23
|
+
if (x < minX) {
|
|
24
|
+
minX = x;
|
|
25
|
+
}
|
|
26
|
+
if (x > maxX) {
|
|
27
|
+
maxX = x;
|
|
28
|
+
}
|
|
29
|
+
if (y < minY) {
|
|
30
|
+
minY = y;
|
|
31
|
+
}
|
|
32
|
+
if (y > maxY) {
|
|
33
|
+
maxY = y;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const width = maxX - minX;
|
|
39
|
+
const height = maxY - minY;
|
|
40
|
+
const maxRadius = max(width, height);
|
|
41
|
+
return { maxCoordinate, maxRadius };
|
|
42
|
+
}
|
|
43
|
+
export { getLoopsMetrics };
|
|
44
44
|
//# sourceMappingURL=get-max-coordinate.js.map
|
package/node/loop.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { Curve } from './curve.js';
|
|
2
|
-
/**
|
|
3
|
-
* Represents a two-way linked loop of [[ICurve]]s - mostly used internally to
|
|
4
|
-
* conveniently represent shape boundaries.
|
|
5
|
-
*/
|
|
6
|
-
interface Loop {
|
|
7
|
-
/** The curves that represent the shape boundary as an array. */
|
|
8
|
-
curves: Curve[];
|
|
9
|
-
/** A pre-ordered array of bezier curves to add initially.*/
|
|
10
|
-
beziers: number[][][];
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
14
|
-
*/
|
|
15
|
-
declare function loopFromBeziers(beziers?: number[][][]): Loop;
|
|
16
|
-
export { Loop, loopFromBeziers };
|
|
1
|
+
import { Curve } from './curve.js';
|
|
2
|
+
/**
|
|
3
|
+
* Represents a two-way linked loop of [[ICurve]]s - mostly used internally to
|
|
4
|
+
* conveniently represent shape boundaries.
|
|
5
|
+
*/
|
|
6
|
+
interface Loop {
|
|
7
|
+
/** The curves that represent the shape boundary as an array. */
|
|
8
|
+
curves: Curve[];
|
|
9
|
+
/** A pre-ordered array of bezier curves to add initially.*/
|
|
10
|
+
beziers: number[][][];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
14
|
+
*/
|
|
15
|
+
declare function loopFromBeziers(beziers?: number[][][]): Loop;
|
|
16
|
+
export { Loop, loopFromBeziers };
|
package/node/loop.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
3
|
-
*/
|
|
4
|
-
function loopFromBeziers(beziers = []) {
|
|
5
|
-
const curves = [];
|
|
6
|
-
const loop = {
|
|
7
|
-
beziers,
|
|
8
|
-
curves
|
|
9
|
-
};
|
|
10
|
-
if (!beziers.length) {
|
|
11
|
-
return loop;
|
|
12
|
-
}
|
|
13
|
-
let prev;
|
|
14
|
-
for (let i = 0; i < beziers.length; i++) {
|
|
15
|
-
const curve = {
|
|
16
|
-
loop,
|
|
17
|
-
ps: beziers[i],
|
|
18
|
-
prev,
|
|
19
|
-
next: undefined,
|
|
20
|
-
idx: i
|
|
21
|
-
};
|
|
22
|
-
if (prev) {
|
|
23
|
-
prev.next = curve;
|
|
24
|
-
}
|
|
25
|
-
prev = curve;
|
|
26
|
-
curves.push(curve);
|
|
27
|
-
}
|
|
28
|
-
// close loop
|
|
29
|
-
const lastCurve = curves[curves.length - 1];
|
|
30
|
-
curves[0].prev = lastCurve;
|
|
31
|
-
lastCurve.next = curves[0];
|
|
32
|
-
return loop;
|
|
33
|
-
}
|
|
34
|
-
export { loopFromBeziers };
|
|
1
|
+
/**
|
|
2
|
+
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
3
|
+
*/
|
|
4
|
+
function loopFromBeziers(beziers = []) {
|
|
5
|
+
const curves = [];
|
|
6
|
+
const loop = {
|
|
7
|
+
beziers,
|
|
8
|
+
curves
|
|
9
|
+
};
|
|
10
|
+
if (!beziers.length) {
|
|
11
|
+
return loop;
|
|
12
|
+
}
|
|
13
|
+
let prev;
|
|
14
|
+
for (let i = 0; i < beziers.length; i++) {
|
|
15
|
+
const curve = {
|
|
16
|
+
loop,
|
|
17
|
+
ps: beziers[i],
|
|
18
|
+
prev,
|
|
19
|
+
next: undefined,
|
|
20
|
+
idx: i
|
|
21
|
+
};
|
|
22
|
+
if (prev) {
|
|
23
|
+
prev.next = curve;
|
|
24
|
+
}
|
|
25
|
+
prev = curve;
|
|
26
|
+
curves.push(curve);
|
|
27
|
+
}
|
|
28
|
+
// close loop
|
|
29
|
+
const lastCurve = curves[curves.length - 1];
|
|
30
|
+
curves[0].prev = lastCurve;
|
|
31
|
+
lastCurve.next = curves[0];
|
|
32
|
+
return loop;
|
|
33
|
+
}
|
|
34
|
+
export { loopFromBeziers };
|
|
35
35
|
//# sourceMappingURL=loop.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { LlRbTree } from 'flo-ll-rb-tree';
|
|
2
|
-
import { Loop } from '../loop.js';
|
|
3
|
-
import { Circle } from '../circle.js';
|
|
4
|
-
import { IPointOnShape } from '../point-on-shape.js';
|
|
5
|
-
import { CpNode } from '../cp-node.js';
|
|
6
|
-
/**
|
|
7
|
-
* @hidden
|
|
8
|
-
* @param circle
|
|
9
|
-
* @param orders
|
|
10
|
-
* @param cpTrees
|
|
11
|
-
* @param poss
|
|
12
|
-
* @param neighbors
|
|
13
|
-
* @hidden
|
|
14
|
-
*/
|
|
15
|
-
declare function addToCpGraph(circle: Circle, orders: number[], cpTrees: Map<Loop, LlRbTree<CpNode>>, poss: IPointOnShape[], neighbors?: CpNode[][]): void;
|
|
16
|
-
export { addToCpGraph };
|
|
1
|
+
import { LlRbTree } from 'flo-ll-rb-tree';
|
|
2
|
+
import { Loop } from '../loop.js';
|
|
3
|
+
import { Circle } from '../circle.js';
|
|
4
|
+
import { IPointOnShape } from '../point-on-shape.js';
|
|
5
|
+
import { CpNode } from '../cp-node.js';
|
|
6
|
+
/**
|
|
7
|
+
* @hidden
|
|
8
|
+
* @param circle
|
|
9
|
+
* @param orders
|
|
10
|
+
* @param cpTrees
|
|
11
|
+
* @param poss
|
|
12
|
+
* @param neighbors
|
|
13
|
+
* @hidden
|
|
14
|
+
*/
|
|
15
|
+
declare function addToCpGraph(circle: Circle, orders: number[], cpTrees: Map<Loop, LlRbTree<CpNode>>, poss: IPointOnShape[], neighbors?: CpNode[][]): void;
|
|
16
|
+
export { addToCpGraph };
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { CpNode } from '../cp-node.js';
|
|
2
|
-
import { getNeighbouringPoints } from './get-neighboring-cps.js';
|
|
3
|
-
/**
|
|
4
|
-
* @hidden
|
|
5
|
-
* @param circle
|
|
6
|
-
* @param orders
|
|
7
|
-
* @param cpTrees
|
|
8
|
-
* @param poss
|
|
9
|
-
* @param neighbors
|
|
10
|
-
* @hidden
|
|
11
|
-
*/
|
|
12
|
-
function addToCpGraph(circle, orders, cpTrees, poss, neighbors) {
|
|
13
|
-
const newCps = poss.map((pos, i) => {
|
|
14
|
-
const cpTree = cpTrees.get(pos.curve.loop);
|
|
15
|
-
const newCp_ = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
|
|
16
|
-
const neighboringCp = neighbors
|
|
17
|
-
? neighbors[i]
|
|
18
|
-
: getNeighbouringPoints(cpTree, pos, orders[i], 0);
|
|
19
|
-
const newCp = CpNode.insert(false, false, cpTree, newCp_, neighboringCp[0]);
|
|
20
|
-
return newCp;
|
|
21
|
-
});
|
|
22
|
-
const len = poss.length;
|
|
23
|
-
for (let i = 0; i < len; i++) {
|
|
24
|
-
const indxPrev = i === 0 ? len - 1 : i - 1;
|
|
25
|
-
const indxNext = i === len - 1 ? 0 : i + 1;
|
|
26
|
-
newCps[i].prevOnCircle = newCps[indxPrev];
|
|
27
|
-
newCps[i].nextOnCircle = newCps[indxNext];
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export { addToCpGraph };
|
|
1
|
+
import { CpNode } from '../cp-node.js';
|
|
2
|
+
import { getNeighbouringPoints } from './get-neighboring-cps.js';
|
|
3
|
+
/**
|
|
4
|
+
* @hidden
|
|
5
|
+
* @param circle
|
|
6
|
+
* @param orders
|
|
7
|
+
* @param cpTrees
|
|
8
|
+
* @param poss
|
|
9
|
+
* @param neighbors
|
|
10
|
+
* @hidden
|
|
11
|
+
*/
|
|
12
|
+
function addToCpGraph(circle, orders, cpTrees, poss, neighbors) {
|
|
13
|
+
const newCps = poss.map((pos, i) => {
|
|
14
|
+
const cpTree = cpTrees.get(pos.curve.loop);
|
|
15
|
+
const newCp_ = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
|
|
16
|
+
const neighboringCp = neighbors
|
|
17
|
+
? neighbors[i]
|
|
18
|
+
: getNeighbouringPoints(cpTree, pos, orders[i], 0);
|
|
19
|
+
const newCp = CpNode.insert(false, false, cpTree, newCp_, neighboringCp[0]);
|
|
20
|
+
return newCp;
|
|
21
|
+
});
|
|
22
|
+
const len = poss.length;
|
|
23
|
+
for (let i = 0; i < len; i++) {
|
|
24
|
+
const indxPrev = i === 0 ? len - 1 : i - 1;
|
|
25
|
+
const indxNext = i === len - 1 ? 0 : i + 1;
|
|
26
|
+
newCps[i].prevOnCircle = newCps[indxPrev];
|
|
27
|
+
newCps[i].nextOnCircle = newCps[indxNext];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export { addToCpGraph };
|
|
31
31
|
//# sourceMappingURL=add-to-cp-graph.js.map
|