flo-mat 2.0.1 → 2.0.2
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/.eslintrc.cjs +69 -0
- package/README.md +9 -27
- package/browser/index.js +29720 -7125
- package/browser/index.min.js +1 -2
- package/node/circle.js +3 -3
- package/node/circle.js.map +1 -1
- package/node/compare-curvatures-at-interface.js +36 -36
- package/node/compare-curvatures-at-interface.js.map +1 -1
- package/node/cp-node/clone.js +6 -6
- package/node/cp-node/clone.js.map +1 -1
- package/node/cp-node/remove.js +4 -4
- package/node/cp-node/remove.js.map +1 -1
- package/node/cp-node.js +18 -18
- package/node/cp-node.js.map +1 -1
- package/node/curve.d.ts +1 -1
- package/node/curve.js +19 -19
- package/node/curve.js.map +1 -1
- package/node/debug/debug.d.ts +1 -1
- package/node/debug/functions/draw-elem/bounding-hull.js +1 -1
- package/node/debug/functions/draw-elem/bounding-hull.js.map +1 -1
- package/node/debug/functions/draw-elem/branch.js +4 -4
- package/node/debug/functions/draw-elem/branch.js.map +1 -1
- package/node/debug/functions/draw-elem/culls.js +4 -4
- package/node/debug/functions/draw-elem/culls.js.map +1 -1
- package/node/debug/functions/draw-elem/draw-circle-percent.js +1 -1
- package/node/debug/functions/draw-elem/draw-circle-percent.js.map +1 -1
- package/node/debug/functions/draw-elem/draw-elem.d.ts +2 -2
- package/node/debug/functions/draw-elem/draw-elem.js +1 -1
- package/node/debug/functions/draw-elem/draw-elem.js.map +1 -1
- package/node/debug/functions/draw-elem/dull-corner.js +3 -3
- package/node/debug/functions/draw-elem/dull-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/leaves.js +4 -4
- package/node/debug/functions/draw-elem/leaves.js.map +1 -1
- package/node/debug/functions/draw-elem/loose-bounding-box.js +2 -2
- package/node/debug/functions/draw-elem/loose-bounding-box.js.map +1 -1
- package/node/debug/functions/draw-elem/mat.js +4 -4
- package/node/debug/functions/draw-elem/mat.js.map +1 -1
- package/node/debug/functions/draw-elem/max-vertex.js +2 -2
- package/node/debug/functions/draw-elem/max-vertex.js.map +1 -1
- package/node/debug/functions/draw-elem/min-y.js +3 -3
- package/node/debug/functions/draw-elem/min-y.js.map +1 -1
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js +4 -4
- package/node/debug/functions/draw-elem/one-prong-at-dull-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/one-prong.js +4 -4
- package/node/debug/functions/draw-elem/one-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/sharp-corner.js +2 -2
- package/node/debug/functions/draw-elem/sharp-corner.js.map +1 -1
- package/node/debug/functions/draw-elem/three-prong.js +7 -7
- package/node/debug/functions/draw-elem/three-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/tight-bounding-box.js +1 -1
- package/node/debug/functions/draw-elem/tight-bounding-box.js.map +1 -1
- package/node/debug/functions/draw-elem/two-prong.js +1 -1
- package/node/debug/functions/draw-elem/two-prong.js.map +1 -1
- package/node/debug/functions/draw-elem/vertex.js +13 -13
- package/node/debug/functions/draw-elem/vertex.js.map +1 -1
- package/node/debug/functions/general.d.ts +1 -1
- package/node/debug/functions/general.js +1 -1
- package/node/debug/functions/general.js.map +1 -1
- package/node/debug/functions/three-prong.d.ts +1 -1
- package/node/debug/functions/three-prong.js +37 -37
- package/node/debug/functions/three-prong.js.map +1 -1
- package/node/debug/functions/two-prong.d.ts +1 -1
- package/node/debug/functions/two-prong.js +15 -15
- package/node/debug/functions/two-prong.js.map +1 -1
- package/node/find-mats.js +16 -19
- package/node/find-mats.js.map +1 -1
- package/node/get-boundary-bezier-parts-to-next.js +8 -8
- package/node/get-boundary-bezier-parts-to-next.js.map +1 -1
- package/node/get-boundary-beziers-to-next.js +8 -8
- package/node/get-boundary-beziers-to-next.js.map +1 -1
- package/node/get-branches.js +7 -7
- package/node/get-branches.js.map +1 -1
- package/node/get-curve/get-curve-between.js +21 -21
- package/node/get-curve/get-curve-between.js.map +1 -1
- package/node/get-curve/get-edge-direction.js +13 -13
- package/node/get-curve/get-edge-direction.js.map +1 -1
- package/node/get-interface-ccw.js +12 -12
- package/node/get-interface-ccw.js.map +1 -1
- package/node/loop/get-max-coordinate.js +9 -9
- package/node/loop/get-max-coordinate.js.map +1 -1
- package/node/loop.js +4 -4
- package/node/loop.js.map +1 -1
- package/node/mat/add-to-cp-graph.js +8 -8
- package/node/mat/add-to-cp-graph.js.map +1 -1
- package/node/mat/closest-boundary-point/closest-points-on-curve.js +5 -6
- package/node/mat/closest-boundary-point/closest-points-on-curve.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-bezier-pieces.js +1 -1
- package/node/mat/closest-boundary-point/cull-bezier-pieces.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js +5 -5
- package/node/mat/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js +5 -5
- package/node/mat/closest-boundary-point/cull-by-tight-boundary-box.js.map +1 -1
- package/node/mat/closest-boundary-point/get-best-distance-squared.js +5 -5
- package/node/mat/closest-boundary-point/get-best-distance-squared.js.map +1 -1
- package/node/mat/closest-boundary-point/get-close-boundary-points.js +15 -15
- package/node/mat/closest-boundary-point/get-close-boundary-points.js.map +1 -1
- package/node/mat/closest-boundary-point/get-closest-boundary-point.js +4 -4
- package/node/mat/closest-boundary-point/get-closest-boundary-point.js.map +1 -1
- package/node/mat/create-new-cp-tree.js +3 -3
- package/node/mat/create-new-cp-tree.js.map +1 -1
- package/node/mat/elem-type-two-prong.d.ts +1 -1
- package/node/mat/find-mat/add-1-prong.js +3 -3
- package/node/mat/find-mat/add-1-prong.js.map +1 -1
- package/node/mat/find-mat/add-2-prong.js +40 -40
- package/node/mat/find-mat/add-2-prong.js.map +1 -1
- package/node/mat/find-mat/add-3-prong.js +1 -1
- package/node/mat/find-mat/add-3-prong.js.map +1 -1
- package/node/mat/find-mat/add-debug-info.js +16 -18
- package/node/mat/find-mat/add-debug-info.js.map +1 -1
- package/node/mat/find-mat/create-get-interesting-points-on-loop.js +4 -4
- package/node/mat/find-mat/create-get-interesting-points-on-loop.js.map +1 -1
- package/node/mat/find-mat/create-initial-cp-graph.js +11 -11
- package/node/mat/find-mat/create-initial-cp-graph.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/add-debug-info.js +2 -2
- package/node/mat/find-mat/find-2-prong/add-debug-info.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js +5 -5
- package/node/mat/find-mat/find-2-prong/cull-bezier-pieces.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/find-2-prong.js +25 -25
- package/node/mat/find-mat/find-2-prong/find-2-prong.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js +7 -7
- package/node/mat/find-mat/find-2-prong/find-equidistant-point-on-line.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js +4 -4
- package/node/mat/find-mat/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
- package/node/mat/find-mat/find-2-prong/x-for-debugging.d.ts +1 -1
- package/node/mat/find-mat/find-3-prong/calc-better-x.js +4 -4
- package/node/mat/find-mat/find-3-prong/calc-better-x.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js +3 -3
- package/node/mat/find-mat/find-3-prong/calc-initial-3-prong-center.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js +35 -35
- package/node/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/find-3-prong.js +14 -14
- package/node/mat/find-mat/find-3-prong/find-3-prong.js.map +1 -1
- package/node/mat/find-mat/find-3-prong/get-closest-points.js +1 -1
- package/node/mat/find-mat/find-3-prong/get-closest-points.js.map +1 -1
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js +2 -2
- package/node/mat/find-mat/find-and-add-2-prongs-on-all-paths.js.map +1 -1
- package/node/mat/find-mat/find-and-add-2-prongs.js +12 -13
- package/node/mat/find-mat/find-and-add-2-prongs.js.map +1 -1
- package/node/mat/find-mat/find-and-add-3-prongs.js +16 -17
- package/node/mat/find-mat/find-and-add-3-prongs.js.map +1 -1
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js +6 -6
- package/node/mat/find-mat/find-and-add-hole-closing-2-prongs.js.map +1 -1
- package/node/mat/find-mat/get-potential-2-prongs.js +4 -4
- package/node/mat/find-mat/get-potential-2-prongs.js.map +1 -1
- package/node/mat/find-mat/get-sharp-corners.js +4 -4
- package/node/mat/find-mat/get-sharp-corners.js.map +1 -1
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js +3 -3
- package/node/mat/geometry/get-closest-squared-distance-to-rotated-rect.js.map +1 -1
- package/node/mat/get-boundary-piece-beziers.js +5 -5
- package/node/mat/get-boundary-piece-beziers.js.map +1 -1
- package/node/mat/get-contact-circles-at-interface.js +1 -1
- package/node/mat/get-contact-circles-at-interface.js.map +1 -1
- package/node/mat/get-leaves.js +2 -2
- package/node/mat/get-leaves.js.map +1 -1
- package/node/mat/get-neighboring-cps.js +1 -1
- package/node/mat/get-neighboring-cps.js.map +1 -1
- package/node/mat/is-another-cp-closeby.js +9 -9
- package/node/mat/is-another-cp-closeby.js.map +1 -1
- package/node/mat/simplify-mat-map-only.js +15 -15
- package/node/mat/simplify-mat-map-only.js.map +1 -1
- package/node/mat/to-scale-axis/add-debug-info.js +1 -1
- package/node/mat/to-scale-axis/add-debug-info.js.map +1 -1
- package/node/mat/to-scale-axis/cull-non-cycles.js +5 -5
- package/node/mat/to-scale-axis/cull-non-cycles.js.map +1 -1
- package/node/mat/to-scale-axis/cull.js +5 -5
- package/node/mat/to-scale-axis/cull.js.map +1 -1
- package/node/mat/trim-mat.js +1 -1
- package/node/mat/trim-mat.js.map +1 -1
- package/node/point-on-shape.d.ts +4 -4
- package/node/point-on-shape.js +16 -16
- package/node/point-on-shape.js.map +1 -1
- package/node/simplify-mat.js +10 -10
- package/node/simplify-mat.js.map +1 -1
- package/node/svg/get-loop-bounds.d.ts +1 -1
- package/node/svg/get-loop-bounds.js +13 -13
- package/node/svg/get-loop-bounds.js.map +1 -1
- package/node/svg/get-shape-bounds.d.ts +2 -2
- package/node/svg/get-shape-bounds.js +4 -4
- package/node/svg/get-shape-bounds.js.map +1 -1
- package/node/sweep-line/sweep-line.js +8 -8
- package/node/sweep-line/sweep-line.js.map +1 -1
- package/node/to-scale-axis.js +16 -15
- package/node/to-scale-axis.js.map +1 -1
- package/node/traverse-edges.js +2 -2
- package/node/traverse-edges.js.map +1 -1
- package/node/traverse-vertices.js +2 -2
- package/node/traverse-vertices.js.map +1 -1
- package/package.json +28 -23
- package/src/circle.ts +3 -3
- package/src/compare-curvatures-at-interface.ts +36 -36
- package/src/cp-node/clone.ts +6 -6
- package/src/cp-node/remove.ts +4 -4
- package/src/cp-node.ts +20 -20
- package/src/curve.ts +19 -19
- package/src/debug/functions/draw-elem/bounding-hull.ts +2 -2
- package/src/debug/functions/draw-elem/branch.ts +4 -4
- package/src/debug/functions/draw-elem/culls.ts +4 -4
- package/src/debug/functions/draw-elem/draw-circle-percent.ts +2 -2
- package/src/debug/functions/draw-elem/draw-elem.ts +1 -1
- package/src/debug/functions/draw-elem/dull-corner.ts +3 -3
- package/src/debug/functions/draw-elem/leaves.ts +4 -4
- package/src/debug/functions/draw-elem/loose-bounding-box.ts +2 -2
- package/src/debug/functions/draw-elem/mat.ts +4 -4
- package/src/debug/functions/draw-elem/max-vertex.ts +2 -2
- package/src/debug/functions/draw-elem/min-y.ts +3 -3
- package/src/debug/functions/draw-elem/one-prong-at-dull-corner.ts +4 -4
- package/src/debug/functions/draw-elem/one-prong.ts +4 -4
- package/src/debug/functions/draw-elem/sharp-corner.ts +2 -2
- package/src/debug/functions/draw-elem/three-prong.ts +7 -7
- package/src/debug/functions/draw-elem/tight-bounding-box.ts +1 -1
- package/src/debug/functions/draw-elem/two-prong.ts +1 -1
- package/src/debug/functions/draw-elem/vertex.ts +20 -14
- package/src/debug/functions/general.ts +3 -3
- package/src/debug/functions/three-prong.ts +37 -37
- package/src/debug/functions/two-prong.ts +15 -15
- package/src/find-mats.ts +19 -19
- package/src/get-boundary-bezier-parts-to-next.ts +8 -8
- package/src/get-boundary-beziers-to-next.ts +8 -8
- package/src/get-branches.ts +7 -7
- package/src/get-curve/get-curve-between.ts +21 -21
- package/src/get-curve/get-edge-direction.ts +13 -14
- package/src/get-interface-ccw.ts +12 -12
- package/src/loop/get-max-coordinate.ts +7 -7
- package/src/loop.ts +4 -4
- package/src/mat/add-to-cp-graph.ts +8 -8
- package/src/mat/closest-boundary-point/closest-points-on-curve.ts +5 -6
- package/src/mat/closest-boundary-point/cull-bezier-pieces.ts +1 -1
- package/src/mat/closest-boundary-point/cull-by-loose-bounding-box.ts +5 -5
- package/src/mat/closest-boundary-point/cull-by-tight-boundary-box.ts +5 -5
- package/src/mat/closest-boundary-point/get-best-distance-squared.ts +5 -5
- package/src/mat/closest-boundary-point/get-close-boundary-points.ts +15 -15
- package/src/mat/closest-boundary-point/get-closest-boundary-point.ts +4 -4
- package/src/mat/cmp-cp-on-delta.ts +5 -5
- package/src/mat/create-new-cp-tree.ts +3 -3
- package/src/mat/find-mat/add-1-prong.ts +5 -5
- package/src/mat/find-mat/add-2-prong.ts +42 -42
- package/src/mat/find-mat/add-3-prong.ts +1 -1
- package/src/mat/find-mat/add-debug-info.ts +18 -20
- package/src/mat/find-mat/create-get-interesting-points-on-loop.ts +4 -4
- package/src/mat/find-mat/create-initial-cp-graph.ts +11 -11
- package/src/mat/find-mat/find-2-prong/add-debug-info.ts +4 -4
- package/src/mat/find-mat/find-2-prong/cull-bezier-pieces.ts +5 -5
- package/src/mat/find-mat/find-2-prong/find-2-prong.ts +27 -27
- package/src/mat/find-mat/find-2-prong/find-equidistant-point-on-line.ts +7 -7
- package/src/mat/find-mat/find-2-prong/get-initial-bezier-pieces.ts +4 -4
- package/src/mat/find-mat/find-3-prong/calc-better-x.ts +4 -4
- package/src/mat/find-mat/find-3-prong/calc-initial-3-prong-center.ts +3 -3
- package/src/mat/find-mat/find-3-prong/find-3-prong-for-delta3s.ts +37 -37
- package/src/mat/find-mat/find-3-prong/find-3-prong.ts +16 -16
- package/src/mat/find-mat/find-3-prong/get-closest-points.ts +1 -1
- package/src/mat/find-mat/find-and-add-2-prongs-on-all-paths.ts +2 -2
- package/src/mat/find-mat/find-and-add-2-prongs.ts +14 -16
- package/src/mat/find-mat/find-and-add-3-prongs.ts +19 -19
- package/src/mat/find-mat/find-and-add-hole-closing-2-prongs.ts +6 -6
- package/src/mat/find-mat/get-potential-2-prongs.ts +4 -4
- package/src/mat/find-mat/get-sharp-corners.ts +4 -4
- package/src/mat/find-mat/get-total-abs-curvature.ts +1 -1
- package/src/mat/geometry/get-closest-squared-distance-to-rotated-rect.ts +3 -3
- package/src/mat/get-boundary-piece-beziers.ts +5 -5
- package/src/mat/get-contact-circles-at-interface.ts +1 -1
- package/src/mat/get-edges-as-array.ts +2 -2
- package/src/mat/get-leaves.ts +2 -2
- package/src/mat/get-neighboring-cps.ts +1 -1
- package/src/mat/is-another-cp-closeby.ts +9 -9
- package/src/mat/simplify-mat-map-only.ts +15 -15
- package/src/mat/to-scale-axis/add-debug-info.ts +6 -3
- package/src/mat/to-scale-axis/add-to-tree.ts +10 -10
- package/src/mat/to-scale-axis/calc-groups.ts +19 -19
- package/src/mat/to-scale-axis/create-spacial-tree.ts +4 -4
- package/src/mat/to-scale-axis/cull-non-cycles.ts +5 -5
- package/src/mat/to-scale-axis/cull.ts +5 -5
- package/src/mat/to-scale-axis/get-engulfed-vertices.ts +18 -18
- package/src/mat/trim-mat.ts +1 -1
- package/src/point-on-shape.ts +16 -16
- package/src/simplify-mat.ts +10 -10
- package/src/svg/get-curvature-at-interface.ts +6 -8
- package/src/svg/get-extreme.ts +1 -1
- package/src/svg/get-loop-bounds.ts +13 -13
- package/src/svg/get-shape-bounds.ts +4 -4
- package/src/sweep-line/are-boxes-intersecting.ts +4 -4
- package/src/sweep-line/sweep-line.ts +8 -8
- package/src/to-scale-axis.ts +18 -17
- package/src/traverse-edges.ts +2 -2
- package/src/traverse-vertices.ts +2 -2
- package/webpack.config.cjs +12 -63
- package/browser/index.min.js.LICENSE.txt +0 -2819
- package/browser/index.module.js +0 -7149
- package/browser/index.module.min.js +0 -2
- package/browser/index.module.min.js.LICENSE.txt +0 -2819
|
@@ -25,29 +25,29 @@ function simplifyMatMapOnly(
|
|
|
25
25
|
hausdorffTolerance = 1e-1,
|
|
26
26
|
hausdorffSpacing = 1e0) {
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const simpleMap: Map<CpNode, { ps: number[][], ts: number[] }> = new Map();
|
|
29
29
|
|
|
30
30
|
// Start from a leaf
|
|
31
31
|
while (!cpNode.isTerminating()) {
|
|
32
32
|
cpNode = cpNode.next;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const branches = getBranches(cpNode, anlgeTolerance);
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
const canDeletes: CpNode[] = [];
|
|
38
38
|
for (let k=0; k<branches.length; k++) {
|
|
39
|
-
|
|
39
|
+
const branch = branches[k];
|
|
40
40
|
|
|
41
41
|
// Try to remove some
|
|
42
42
|
let j = 0;
|
|
43
43
|
while (j < branch.length) {
|
|
44
|
-
|
|
44
|
+
const i = j;
|
|
45
45
|
while (true) {
|
|
46
46
|
j++;
|
|
47
47
|
|
|
48
48
|
if (j === branch.length) { break; }
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
const hd = getTotalHausdorffDistance(i, j, branch, hausdorffSpacing);
|
|
51
51
|
|
|
52
52
|
if (hd > hausdorffTolerance) {
|
|
53
53
|
break;
|
|
@@ -59,17 +59,17 @@ function simplifyMatMapOnly(
|
|
|
59
59
|
if (i+1 === j) {
|
|
60
60
|
// no simplification occured
|
|
61
61
|
} else {
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
const branStart = branch[i];
|
|
63
|
+
const branEnd = branch[j-1];
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const medial = toCubic(getCurveBetween(branStart, branEnd.next));
|
|
66
|
+
const rev = medial.slice().reverse();
|
|
67
67
|
let curCpNode = branStart;
|
|
68
68
|
let prevT = 0;
|
|
69
69
|
while (curCpNode !== branEnd) {
|
|
70
|
-
|
|
70
|
+
const t = closestPointOnBezier(medial, curCpNode.next.cp.circle.center).t;
|
|
71
71
|
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, t] });
|
|
72
|
-
|
|
72
|
+
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
73
73
|
simpleMap.set(oppositeCpNode, { ps: rev, ts: [1-t, 1-prevT] });
|
|
74
74
|
|
|
75
75
|
prevT = t;
|
|
@@ -77,7 +77,7 @@ function simplifyMatMapOnly(
|
|
|
77
77
|
}
|
|
78
78
|
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, 1] });
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
81
81
|
simpleMap.set(oppositeCpNode, { ps: rev, ts: [0, 1-prevT] });
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -93,8 +93,8 @@ function getTotalHausdorffDistance(
|
|
|
93
93
|
branch: CpNode[],
|
|
94
94
|
hausdorffSpacing: number) {
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
const hds: number[] = [];
|
|
97
|
+
const longCurve = getCurveBetween(branch[i], branch[j].next);
|
|
98
98
|
for (let m=i; m<j+1; m++) {
|
|
99
99
|
hds.push(hausdorffDistance(
|
|
100
100
|
getCurveToNext(branch[m]),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare
|
|
1
|
+
declare const _debug_: Debug;
|
|
2
2
|
|
|
3
3
|
import { Debug } from '../../debug/debug.js';
|
|
4
4
|
import { Mat } from '../../mat.js';
|
|
@@ -8,12 +8,15 @@ import { Mat } from '../../mat.js';
|
|
|
8
8
|
* @hidden
|
|
9
9
|
* @param sat
|
|
10
10
|
*/
|
|
11
|
-
function addDebugInfo(
|
|
11
|
+
function addDebugInfo(
|
|
12
|
+
sat: Mat,
|
|
13
|
+
timingStart: number) {
|
|
14
|
+
|
|
12
15
|
if (typeof _debug_ === 'undefined') { return; }
|
|
13
16
|
|
|
14
17
|
_debug_.generated.elems.sat.push(sat);
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
const timing = _debug_.generated.timing;
|
|
17
20
|
timing.sats = performance.now() - timingStart;
|
|
18
21
|
}
|
|
19
22
|
|
|
@@ -25,7 +25,7 @@ function addToTree(
|
|
|
25
25
|
circle: Circle,
|
|
26
26
|
depth: number) {
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const { groups, newLimits } = calcGroups(
|
|
29
29
|
s,
|
|
30
30
|
coordinate,
|
|
31
31
|
limits,
|
|
@@ -34,15 +34,15 @@ function addToTree(
|
|
|
34
34
|
|
|
35
35
|
// Create new edge if it does not exist yet.
|
|
36
36
|
if (groups.length === 1 && depth !== DEPTH_LIMIT) {
|
|
37
|
-
|
|
37
|
+
const group = groups[0];
|
|
38
38
|
|
|
39
|
-
if (!tree.trees
|
|
40
|
-
tree.trees
|
|
39
|
+
if (!tree.trees!.get(group)) {
|
|
40
|
+
tree.trees!.set(group, { trees: new Map(), circles: new Set() } );
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
const t = tree.trees!.get(group)!;
|
|
43
43
|
|
|
44
44
|
// Flip coordinates
|
|
45
|
-
|
|
45
|
+
const newCoordinate = coordinate ? 0 : 1;
|
|
46
46
|
addToTree(
|
|
47
47
|
s,
|
|
48
48
|
t,
|
|
@@ -55,11 +55,11 @@ function addToTree(
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
if (!tree.trees
|
|
59
|
-
tree.trees
|
|
58
|
+
if (!tree.trees!.get(5)) {
|
|
59
|
+
tree.trees!.set(5, { trees: new Map(), circles: new Set() } );
|
|
60
60
|
}
|
|
61
|
-
|
|
62
|
-
vertices
|
|
61
|
+
const vertices = tree.trees!.get(5)!.circles;
|
|
62
|
+
vertices!.add(circle);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
|
|
@@ -29,47 +29,47 @@ function calcGroups(
|
|
|
29
29
|
limits: number[][],
|
|
30
30
|
circle: Circle) {
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const limit = limits[coordinate];
|
|
33
|
+
const l1 = limit[0];
|
|
34
|
+
const l2 = limit[1];
|
|
35
35
|
|
|
36
36
|
// Relevant cut-off lines.
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const q = (l2 - l1) / 4;
|
|
38
|
+
const w = q+q;
|
|
39
39
|
|
|
40
40
|
// Shift origin
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
const r = circle.radius;
|
|
42
|
+
const x = circle.center[coordinate] - l1;
|
|
43
|
+
const x0 = x - (r * s);
|
|
44
|
+
const x1 = x + (r * s);
|
|
45
45
|
|
|
46
|
-
let newLimit: number[] = [,];
|
|
47
|
-
|
|
46
|
+
let newLimit: (number | undefined)[] = [,];
|
|
47
|
+
const groups: number[] = []; // Group to which circle belongs;
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
const qStart = Math.floor(x0/q);
|
|
50
|
+
const qEnd = Math.floor(x1/q) + 1;
|
|
51
|
+
const qDiff = qEnd - qStart;
|
|
52
52
|
|
|
53
|
-
let group;
|
|
53
|
+
let group: number;
|
|
54
54
|
if (qDiff === 1) {
|
|
55
55
|
// If contained in sliver.
|
|
56
56
|
group = (2 * Math.floor(qStart/2)) + 1;
|
|
57
57
|
groups.push(group);
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
const lowerLimit = l1 + q*(group-1);
|
|
60
60
|
newLimit = [lowerLimit, lowerLimit + w];
|
|
61
61
|
|
|
62
62
|
} else if (qDiff === 2) {
|
|
63
63
|
group = qStart + 1;
|
|
64
64
|
groups.push(group);
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
const lowerLimit = l1 + q*(group-1);
|
|
67
67
|
newLimit = [lowerLimit, lowerLimit + w];
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
const newLimits: ((number | undefined)[] | undefined)[] = [,];
|
|
71
71
|
if (groups.length === 1) {
|
|
72
|
-
|
|
72
|
+
const otherCoordinate = coordinate ? 0 : 1;
|
|
73
73
|
|
|
74
74
|
newLimits[otherCoordinate] = limits[otherCoordinate];
|
|
75
75
|
newLimits[coordinate] = newLimit;
|
|
@@ -18,12 +18,12 @@ function createSpacialTree(
|
|
|
18
18
|
s: number,
|
|
19
19
|
circles: Circle[]) {
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const coordinate = 0;
|
|
22
|
+
const limits = [[0, width], [0, height]];
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const tree: TTree = { trees: new Map(), circles: new Set() };
|
|
25
25
|
|
|
26
|
-
for (
|
|
26
|
+
for (const circle of circles) {
|
|
27
27
|
addToTree(
|
|
28
28
|
s,
|
|
29
29
|
tree,
|
|
@@ -12,11 +12,11 @@ function cullNonCycles(cpStart: CpNode) {
|
|
|
12
12
|
|
|
13
13
|
let cpNodeKept = cpStart;
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const leaves = getLeaves(cpStart);
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
while (leaves.length) {
|
|
19
|
-
|
|
19
|
+
const leaf = leaves.pop();
|
|
20
20
|
|
|
21
21
|
// Preserve topology - keep cycles.
|
|
22
22
|
if (leaf.isHoleClosing || leaf.isIntersection) { continue; }
|
|
@@ -26,11 +26,11 @@ function cullNonCycles(cpStart: CpNode) {
|
|
|
26
26
|
while (true) {
|
|
27
27
|
cpNode = cpNode.next;
|
|
28
28
|
let cut = false;
|
|
29
|
-
|
|
29
|
+
const cp1 = cpNode.prevOnCircle;
|
|
30
30
|
|
|
31
31
|
if (cpNode.getProngCount() > 2) {
|
|
32
|
-
//
|
|
33
|
-
|
|
32
|
+
//const cp2 = cp1.prevOnCircle;
|
|
33
|
+
const cp2 = cpNode.nextOnCircle;
|
|
34
34
|
|
|
35
35
|
//if (cpStart === cpNode || cpStart === cp1 || cpStart === cp2) {
|
|
36
36
|
if (CpNode.isOnSameCircle(cpNode, cpStart)) {
|
|
@@ -15,12 +15,12 @@ function cull(
|
|
|
15
15
|
culls: Set<Circle>,
|
|
16
16
|
maxCpNode: CpNode) {
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
const leaves = getLeaves(maxCpNode);
|
|
19
19
|
|
|
20
20
|
function getNonTrivialEdges(cpStart: CpNode) {
|
|
21
21
|
let cp = cpStart;
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const cps: CpNode[] = [];
|
|
24
24
|
do {
|
|
25
25
|
if (cp.next !== cp.nextOnCircle) {
|
|
26
26
|
cps.push(cp);
|
|
@@ -32,7 +32,7 @@ function cull(
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
while (leaves.length) {
|
|
35
|
-
|
|
35
|
+
const leaf = leaves.pop();
|
|
36
36
|
|
|
37
37
|
// Preserve topology.
|
|
38
38
|
if (leaf.isHoleClosing || leaf.isIntersection) { continue; }
|
|
@@ -46,7 +46,7 @@ function cull(
|
|
|
46
46
|
while (true) {
|
|
47
47
|
cpNode = cpNode.next;
|
|
48
48
|
let cut = false;
|
|
49
|
-
|
|
49
|
+
const cp1 = cpNode.prevOnCircle;
|
|
50
50
|
|
|
51
51
|
if (!culls.has(cpNode.cp.circle)) {
|
|
52
52
|
// Cut off the edge once a non-cull has been reached.
|
|
@@ -54,7 +54,7 @@ function cull(
|
|
|
54
54
|
} else if (CpNode.isOnSameCircle(cpNode, maxCpNode)) {
|
|
55
55
|
cut = true; // We are at the max disk - cut whole edge
|
|
56
56
|
} else {
|
|
57
|
-
|
|
57
|
+
const cps = getNonTrivialEdges(cpNode);
|
|
58
58
|
|
|
59
59
|
if (cps.length === 1) {
|
|
60
60
|
cpNode = cps[0];
|
|
@@ -22,24 +22,24 @@ function getEngulfedVertices(
|
|
|
22
22
|
tree: TTree,
|
|
23
23
|
circle: Circle) {
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const c1 = scaleCircle(circle, s);
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
const cullNodes: Set<Circle> = new Set();
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const limits = [[0, width], [0, height]];
|
|
30
30
|
f(tree, 0, limits, 0);
|
|
31
31
|
|
|
32
32
|
return cullNodes;
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
function cullBranch5(tree: TTree) {
|
|
36
|
-
|
|
36
|
+
const t = tree.trees!.get(5);
|
|
37
37
|
if (!t) { return; }
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
const circles = t.circles!;
|
|
40
40
|
|
|
41
41
|
circles.forEach(function(circle, key) {
|
|
42
|
-
|
|
42
|
+
const c2 = scaleCircle(circle, s);
|
|
43
43
|
if (engulfsCircle(c1, c2)) {
|
|
44
44
|
cullNodes.add(circle);
|
|
45
45
|
circles.delete(key);
|
|
@@ -51,7 +51,7 @@ function getEngulfedVertices(
|
|
|
51
51
|
function f(
|
|
52
52
|
tree: TTree,
|
|
53
53
|
coordinate: number,
|
|
54
|
-
limits: number[][],
|
|
54
|
+
limits: number[][] | null,
|
|
55
55
|
depth: number) {
|
|
56
56
|
|
|
57
57
|
if (limits === null) {
|
|
@@ -60,7 +60,7 @@ function getEngulfedVertices(
|
|
|
60
60
|
cullBranch5(tree);
|
|
61
61
|
|
|
62
62
|
for (let i=0; i<=4; i++) {
|
|
63
|
-
|
|
63
|
+
const t = tree.trees!.get(i);
|
|
64
64
|
if (t) {
|
|
65
65
|
f(t, 0, null, depth+1);
|
|
66
66
|
}
|
|
@@ -69,7 +69,7 @@ function getEngulfedVertices(
|
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
const { groups, newLimits } = calcGroups(
|
|
73
73
|
s,
|
|
74
74
|
coordinate,
|
|
75
75
|
limits,
|
|
@@ -79,13 +79,13 @@ function getEngulfedVertices(
|
|
|
79
79
|
if (groups.length === 1) {
|
|
80
80
|
cullBranch5(tree);
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const group = groups[0];
|
|
83
|
+
const newCoordinate = coordinate ? 0 : 1;
|
|
84
84
|
|
|
85
85
|
if (group === 1 || group === 3) {
|
|
86
86
|
// One of the higher priority left/top or
|
|
87
87
|
// right/bottom half groups.
|
|
88
|
-
|
|
88
|
+
const t = tree.trees!.get(group);
|
|
89
89
|
|
|
90
90
|
if (t) {
|
|
91
91
|
f(
|
|
@@ -98,12 +98,12 @@ function getEngulfedVertices(
|
|
|
98
98
|
} else {
|
|
99
99
|
// One of the lower priority even groups (0,2 or 4).
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
branches.push(tree.trees
|
|
103
|
-
if (group > 0) { branches.push(tree.trees
|
|
104
|
-
if (group < 4) { branches.push(tree.trees
|
|
101
|
+
const branches: TTree[] = [];
|
|
102
|
+
branches.push(tree.trees!.get(group)!);
|
|
103
|
+
if (group > 0) { branches.push(tree.trees!.get(group-1)!); }
|
|
104
|
+
if (group < 4) { branches.push(tree.trees!.get(group+1)!); }
|
|
105
105
|
|
|
106
|
-
for (
|
|
106
|
+
for (const branch of branches) {
|
|
107
107
|
if (branch) {
|
|
108
108
|
f(
|
|
109
109
|
branch,
|
|
@@ -123,7 +123,7 @@ function getEngulfedVertices(
|
|
|
123
123
|
// Circle spans multiple groups at this level of the tree. Check all
|
|
124
124
|
// circles in all branches.
|
|
125
125
|
for (let i=0; i<=4; i++) {
|
|
126
|
-
|
|
126
|
+
const t = tree.trees!.get(i);
|
|
127
127
|
if (!t) { continue; }
|
|
128
128
|
|
|
129
129
|
f(t, 0, null, depth+1);
|
package/src/mat/trim-mat.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { clone } from '../cp-node/clone.js';
|
|
|
10
10
|
* @param mat The MAT to trim.
|
|
11
11
|
*/
|
|
12
12
|
function trimMat(mat: Mat): Mat {
|
|
13
|
-
|
|
13
|
+
const cpNode = cullNonCycles(clone(mat.cpNode));
|
|
14
14
|
|
|
15
15
|
if (!cpNode) { return undefined; }
|
|
16
16
|
|
package/src/point-on-shape.ts
CHANGED
|
@@ -65,7 +65,7 @@ function getPosCorner(pos: IPointOnShape) {
|
|
|
65
65
|
/**
|
|
66
66
|
* @hidden
|
|
67
67
|
*/
|
|
68
|
-
|
|
68
|
+
const isPosSharpCorner = memoize((pos: IPointOnShape) => {
|
|
69
69
|
if (!isPosCorner(pos)) { return false; }
|
|
70
70
|
|
|
71
71
|
return getPosCorner(pos).isSharp;
|
|
@@ -75,7 +75,7 @@ let isPosSharpCorner = memoize((pos: IPointOnShape) => {
|
|
|
75
75
|
/**
|
|
76
76
|
* @hidden
|
|
77
77
|
*/
|
|
78
|
-
|
|
78
|
+
const isPosDullCorner = memoize((pos: IPointOnShape) => {
|
|
79
79
|
if (!isPosCorner(pos)) { return false; }
|
|
80
80
|
|
|
81
81
|
return getPosCorner(pos).isDull;
|
|
@@ -85,7 +85,7 @@ let isPosDullCorner = memoize((pos: IPointOnShape) => {
|
|
|
85
85
|
/**
|
|
86
86
|
* @hidden
|
|
87
87
|
*/
|
|
88
|
-
|
|
88
|
+
const isPosQuiteSharpCorner = memoize((pos: IPointOnShape) => {
|
|
89
89
|
if (!isPosCorner(pos)) { return false; }
|
|
90
90
|
|
|
91
91
|
return getPosCorner(pos).isQuiteSharp;
|
|
@@ -95,7 +95,7 @@ let isPosQuiteSharpCorner = memoize((pos: IPointOnShape) => {
|
|
|
95
95
|
/**
|
|
96
96
|
* @hidden
|
|
97
97
|
*/
|
|
98
|
-
|
|
98
|
+
const isPosQuiteDullCorner = memoize((pos: IPointOnShape) => {
|
|
99
99
|
if (!isPosCorner(pos)) { return false; }
|
|
100
100
|
|
|
101
101
|
return getPosCorner(pos).isQuiteDull;
|
|
@@ -128,10 +128,10 @@ function calcPosOrder(
|
|
|
128
128
|
if (!isPosDullCorner(pos)) { return 0; }
|
|
129
129
|
//if (!isPosDullCorner(pos)) { return 0; }
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
const corner = getPosCorner(pos);
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
const n = rotateNeg90Degrees(corner.tangents[0]);
|
|
134
|
+
const v = toUnitVector( fromTo(pos.p, circle.center) );
|
|
135
135
|
|
|
136
136
|
return -dot(n, v);
|
|
137
137
|
}
|
|
@@ -168,11 +168,11 @@ function comparePoss(a: IPointOnShape, b: IPointOnShape) {
|
|
|
168
168
|
* @param t
|
|
169
169
|
* @hidden
|
|
170
170
|
*/
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
const calcOsculatingCircleRadius = memoize((pos: IPointOnShape) => {
|
|
172
|
+
const ps = pos.curve.ps;
|
|
173
|
+
const t = pos.t;
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
const c = -curvature(ps, t);
|
|
176
176
|
|
|
177
177
|
// c > 0 => bending inwards
|
|
178
178
|
|
|
@@ -202,13 +202,13 @@ function getOsculatingCircle(
|
|
|
202
202
|
maxOsculatingCircleRadius
|
|
203
203
|
);
|
|
204
204
|
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
const ps = pos.curve.ps;
|
|
206
|
+
const t = pos.t;
|
|
207
207
|
|
|
208
208
|
const tangent_ = tangent(ps,t);
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
209
|
+
const normal_ = toUnitVector([-tangent_[1],tangent_[0]]);
|
|
210
|
+
const p = evalDeCasteljau(ps,t);
|
|
211
|
+
const circleCenter = [
|
|
212
212
|
p[0] - normal_[0]*radius,
|
|
213
213
|
p[1] - normal_[1]*radius
|
|
214
214
|
];
|
package/src/simplify-mat.ts
CHANGED
|
@@ -30,22 +30,22 @@ function simplifyMat(
|
|
|
30
30
|
// Start from a leaf
|
|
31
31
|
while (!cpNode.isTerminating()) { cpNode = cpNode.next; }
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const branches = getBranches(cpNode, anlgeTolerance);
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const canDeletes: CpNode[] = [];
|
|
36
36
|
for (let k=0; k<branches.length; k++) {
|
|
37
|
-
|
|
37
|
+
const branch = branches[k];
|
|
38
38
|
|
|
39
39
|
// Try to remove some
|
|
40
40
|
let j = 0;
|
|
41
41
|
while (j < branch.length) {
|
|
42
|
-
|
|
42
|
+
const i = j;
|
|
43
43
|
while (true) {
|
|
44
44
|
j++;
|
|
45
45
|
|
|
46
46
|
if (j === branch.length) { break; }
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
const hd = getTotalHausdorffDistance(i, j, branch, maxIterations);
|
|
49
49
|
|
|
50
50
|
if (hd > hausdorffTolerance) {
|
|
51
51
|
break;
|
|
@@ -61,9 +61,9 @@ function simplifyMat(
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
for (
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
for (const cpNode of canDeletes) {
|
|
65
|
+
const isTerminating = cpNode.isTerminating();
|
|
66
|
+
const onCircleCount = cpNode.getCpNodesOnCircle().length;
|
|
67
67
|
if (isTerminating || onCircleCount !== 2) {
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
@@ -82,8 +82,8 @@ function getTotalHausdorffDistance(
|
|
|
82
82
|
branch: CpNode[],
|
|
83
83
|
hausdorffSpacing: number) {
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
const hds: number[] = [];
|
|
86
|
+
const longCurve = getCurveBetween(branch[i], branch[j].next);
|
|
87
87
|
for (; i<j+1; i++) {
|
|
88
88
|
hds.push(hausdorffDistance(
|
|
89
89
|
getCurveToNext(branch[i]),
|
|
@@ -11,24 +11,22 @@ import { Curve } from '../curve.js';
|
|
|
11
11
|
* @param curve
|
|
12
12
|
*/
|
|
13
13
|
function getCurvatureAtInterface(curve: Curve) {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
let pss = [
|
|
14
|
+
const pss = [
|
|
17
15
|
curve.ps,
|
|
18
16
|
curve.next.ps
|
|
19
17
|
];
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
const tans = [
|
|
22
20
|
toUnitVector(tangent(pss[0], 1)),
|
|
23
21
|
toUnitVector(tangent(pss[0], 0))
|
|
24
22
|
];
|
|
25
23
|
|
|
26
24
|
// The integral of a kind of Dirac Delta function.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const cosθ = dot (tans[0], tans[1]);
|
|
26
|
+
const sinθ = cross(tans[0], tans[1]);
|
|
27
|
+
const θ = acos(cosθ);
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
const result = sinθ >= 0 ? θ : -θ;
|
|
32
30
|
|
|
33
31
|
return result;
|
|
34
32
|
}
|
package/src/svg/get-extreme.ts
CHANGED
|
@@ -12,13 +12,13 @@ const INF = Number.POSITIVE_INFINITY;
|
|
|
12
12
|
/**
|
|
13
13
|
* @hidden
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
const getLoopBounds = memoize(function(loop: Loop): {
|
|
16
16
|
minX: IPointOnShape;
|
|
17
17
|
minY: IPointOnShape;
|
|
18
18
|
maxX: IPointOnShape;
|
|
19
19
|
maxY: IPointOnShape } {
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
const extremes: {
|
|
22
22
|
bezier: Curve,
|
|
23
23
|
t: number,
|
|
24
24
|
val: number
|
|
@@ -34,15 +34,15 @@ let getLoopBounds = memoize(function(loop: Loop): {
|
|
|
34
34
|
];
|
|
35
35
|
|
|
36
36
|
loop.curves.forEach(function(curve: Curve): void {
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
|
|
37
|
+
const ps = curve.ps;
|
|
38
|
+
// const bounds = getBounds_(ps);
|
|
39
|
+
const bounds = getBounds(ps);
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
{
|
|
43
43
|
{
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
const v = bounds.box[0][0];
|
|
45
|
+
const x = extremes[0][0].val;
|
|
46
46
|
if (v < x || (v === x && bounds.ts[0][0] > extremes[0][0].t)) {
|
|
47
47
|
extremes[0][0] = {
|
|
48
48
|
bezier : curve,
|
|
@@ -53,8 +53,8 @@ let getLoopBounds = memoize(function(loop: Loop): {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
{
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
const v = bounds.box[0][1];
|
|
57
|
+
const x = extremes[0][1].val;
|
|
58
58
|
if (v < x || (v === x && bounds.ts[0][1] > extremes[0][1].t)) {
|
|
59
59
|
extremes[0][1] = {
|
|
60
60
|
bezier : curve,
|
|
@@ -67,8 +67,8 @@ let getLoopBounds = memoize(function(loop: Loop): {
|
|
|
67
67
|
|
|
68
68
|
{
|
|
69
69
|
{
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
const v = bounds.box[1][0];
|
|
71
|
+
const x = extremes[1][0].val;
|
|
72
72
|
if (v > x || (v === x && bounds.ts[1][0] > extremes[1][0].t)) {
|
|
73
73
|
extremes[1][0] = {
|
|
74
74
|
bezier : curve,
|
|
@@ -79,8 +79,8 @@ let getLoopBounds = memoize(function(loop: Loop): {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
{
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const v = bounds.box[1][1];
|
|
83
|
+
const x = extremes[1][1].val;
|
|
84
84
|
if (v > x || (v === x && bounds.ts[1][1] > extremes[1][1].t)) {
|
|
85
85
|
extremes[1][1] = {
|
|
86
86
|
bezier : curve,
|