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,56 +1,56 @@
|
|
|
1
|
-
import { distanceBetween, toUnitVector, fromTo, dot } from 'flo-vector2d';
|
|
2
|
-
import { getNeighbouringPoints } from './get-neighboring-cps.js';
|
|
3
|
-
/** @hidden */
|
|
4
|
-
//const ANGLE_THRESHOLD = Math.cos(3 * (Math.PI / 180)); // 3 degrees
|
|
5
|
-
const ANGLE_THRESHOLD = 0.9986295347545738; // === Math.cos(3 degrees)
|
|
6
|
-
//const ANGLE_THRESHOLD = 0.9848077530122080; // === Math.cos(10 degrees)
|
|
7
|
-
//const ANGLE_THRESHOLD = 0.9998476951563913; // === Math.cos(1 degrees)
|
|
8
|
-
//const ANGLE_THRESHOLD = 0.9999984769132877; // === Math.cos(0.1 degrees)
|
|
9
|
-
//const ANGLE_THRESHOLD = 0.9999999847691291 // === Math.cos(0.01 degrees)
|
|
10
|
-
/**
|
|
11
|
-
* @hidden
|
|
12
|
-
* Returns true if another CpNode is close to the given implied (via pos, order
|
|
13
|
-
* and order2) CpNode.
|
|
14
|
-
* @param cpTrees
|
|
15
|
-
* @param pos
|
|
16
|
-
* @param circle
|
|
17
|
-
* @param order
|
|
18
|
-
* @param order2
|
|
19
|
-
* @param extreme The maximum coordinate value used to calculate floating point
|
|
20
|
-
* tolerances.
|
|
21
|
-
* @param color Used for debugging only
|
|
22
|
-
*/
|
|
23
|
-
function isAnotherCpCloseby(cpTrees, pos, circle, order, order2, extreme, color) {
|
|
24
|
-
//console.log(extreme)
|
|
25
|
-
//const DISTANCE_THRESHOLD = extreme * 1e-1;
|
|
26
|
-
//const DISTANCE_THRESHOLD = extreme * 1e-1;
|
|
27
|
-
const DISTANCE_THRESHOLD = extreme * 1e-4;
|
|
28
|
-
//const DISTANCE_THRESHOLD = extreme * 1e-4; - was this
|
|
29
|
-
//const DISTANCE_THRESHOLD = extreme * 1e-6;
|
|
30
|
-
//const DISTANCE_THRESHOLD = extreme * 1e-12;
|
|
31
|
-
// It seems this can be zero else the ordering should be correct
|
|
32
|
-
//const DISTANCE_THRESHOLD = 0;
|
|
33
|
-
const cpTree = cpTrees.get(pos.curve.loop);
|
|
34
|
-
const cpNodes = getNeighbouringPoints(cpTree, pos, order, order2);
|
|
35
|
-
if (!cpNodes[0]) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
for (const cpNode of cpNodes) {
|
|
39
|
-
const pos2 = cpNode.cp.pointOnShape;
|
|
40
|
-
const p1 = pos.p;
|
|
41
|
-
const p2 = pos2.p;
|
|
42
|
-
if (distanceBetween(p1, p2) > DISTANCE_THRESHOLD) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
const v1 = toUnitVector(fromTo(cpNode.cp.pointOnShape.p, cpNode.cp.circle.center));
|
|
46
|
-
const v2 = toUnitVector(fromTo(p1, circle.center));
|
|
47
|
-
const cosTheta = dot(v1, v2);
|
|
48
|
-
if (cosTheta > ANGLE_THRESHOLD) {
|
|
49
|
-
//console.log(`%c${cosTheta} - ${distanceBetween(p1,p2)}`, `color: ${color}`);
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
export { isAnotherCpCloseby };
|
|
1
|
+
import { distanceBetween, toUnitVector, fromTo, dot } from 'flo-vector2d';
|
|
2
|
+
import { getNeighbouringPoints } from './get-neighboring-cps.js';
|
|
3
|
+
/** @hidden */
|
|
4
|
+
//const ANGLE_THRESHOLD = Math.cos(3 * (Math.PI / 180)); // 3 degrees
|
|
5
|
+
const ANGLE_THRESHOLD = 0.9986295347545738; // === Math.cos(3 degrees)
|
|
6
|
+
//const ANGLE_THRESHOLD = 0.9848077530122080; // === Math.cos(10 degrees)
|
|
7
|
+
//const ANGLE_THRESHOLD = 0.9998476951563913; // === Math.cos(1 degrees)
|
|
8
|
+
//const ANGLE_THRESHOLD = 0.9999984769132877; // === Math.cos(0.1 degrees)
|
|
9
|
+
//const ANGLE_THRESHOLD = 0.9999999847691291 // === Math.cos(0.01 degrees)
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
* Returns true if another CpNode is close to the given implied (via pos, order
|
|
13
|
+
* and order2) CpNode.
|
|
14
|
+
* @param cpTrees
|
|
15
|
+
* @param pos
|
|
16
|
+
* @param circle
|
|
17
|
+
* @param order
|
|
18
|
+
* @param order2
|
|
19
|
+
* @param extreme The maximum coordinate value used to calculate floating point
|
|
20
|
+
* tolerances.
|
|
21
|
+
* @param color Used for debugging only
|
|
22
|
+
*/
|
|
23
|
+
function isAnotherCpCloseby(cpTrees, pos, circle, order, order2, extreme, color) {
|
|
24
|
+
//console.log(extreme)
|
|
25
|
+
//const DISTANCE_THRESHOLD = extreme * 1e-1;
|
|
26
|
+
//const DISTANCE_THRESHOLD = extreme * 1e-1;
|
|
27
|
+
const DISTANCE_THRESHOLD = extreme * 1e-4;
|
|
28
|
+
//const DISTANCE_THRESHOLD = extreme * 1e-4; - was this
|
|
29
|
+
//const DISTANCE_THRESHOLD = extreme * 1e-6;
|
|
30
|
+
//const DISTANCE_THRESHOLD = extreme * 1e-12;
|
|
31
|
+
// It seems this can be zero else the ordering should be correct
|
|
32
|
+
//const DISTANCE_THRESHOLD = 0;
|
|
33
|
+
const cpTree = cpTrees.get(pos.curve.loop);
|
|
34
|
+
const cpNodes = getNeighbouringPoints(cpTree, pos, order, order2);
|
|
35
|
+
if (!cpNodes[0]) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
for (const cpNode of cpNodes) {
|
|
39
|
+
const pos2 = cpNode.cp.pointOnShape;
|
|
40
|
+
const p1 = pos.p;
|
|
41
|
+
const p2 = pos2.p;
|
|
42
|
+
if (distanceBetween(p1, p2) > DISTANCE_THRESHOLD) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const v1 = toUnitVector(fromTo(cpNode.cp.pointOnShape.p, cpNode.cp.circle.center));
|
|
46
|
+
const v2 = toUnitVector(fromTo(p1, circle.center));
|
|
47
|
+
const cosTheta = dot(v1, v2);
|
|
48
|
+
if (cosTheta > ANGLE_THRESHOLD) {
|
|
49
|
+
//console.log(`%c${cosTheta} - ${distanceBetween(p1,p2)}`, `color: ${color}`);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
export { isAnotherCpCloseby };
|
|
56
56
|
//# sourceMappingURL=is-another-cp-closeby.js.map
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { CpNode } from '../cp-node.js';
|
|
2
|
-
/**
|
|
3
|
-
* Simplifies the given MAT by replacing the piecewise quad beziers composing
|
|
4
|
-
* the MAT with fewer ones to within a given tolerance. Returns the map of
|
|
5
|
-
* to be deleted nodes only - does not actually delete them. Use simplifyMat
|
|
6
|
-
* instead if you want to delete the nodes.
|
|
7
|
-
* @param cpNode A representation of the MAT
|
|
8
|
-
* @param anlgeTolerance Tolerance given as the degrees difference of the unit
|
|
9
|
-
* direction vectors at the interface between curves. A tolerance of zero means
|
|
10
|
-
* perfect smoothness is required - defaults to 15.
|
|
11
|
-
* @param hausdorffTolerance The approximate maximum Hausdorff Distance tolerance -
|
|
12
|
-
* defaults to 0.1
|
|
13
|
-
* @param hausdorffSpacing The spacing on the curves used to calculate the Hausdorff
|
|
14
|
-
* Distance - defaults to 1
|
|
15
|
-
*/
|
|
16
|
-
declare function simplifyMatMapOnly(cpNode: CpNode, anlgeTolerance?: number, hausdorffTolerance?: number, hausdorffSpacing?: number): {
|
|
17
|
-
simpleMap: Map<CpNode, {
|
|
18
|
-
ps: number[][];
|
|
19
|
-
ts: number[];
|
|
20
|
-
}>;
|
|
21
|
-
cpNode: CpNode;
|
|
22
|
-
};
|
|
23
|
-
export { simplifyMatMapOnly };
|
|
1
|
+
import { CpNode } from '../cp-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* Simplifies the given MAT by replacing the piecewise quad beziers composing
|
|
4
|
+
* the MAT with fewer ones to within a given tolerance. Returns the map of
|
|
5
|
+
* to be deleted nodes only - does not actually delete them. Use simplifyMat
|
|
6
|
+
* instead if you want to delete the nodes.
|
|
7
|
+
* @param cpNode A representation of the MAT
|
|
8
|
+
* @param anlgeTolerance Tolerance given as the degrees difference of the unit
|
|
9
|
+
* direction vectors at the interface between curves. A tolerance of zero means
|
|
10
|
+
* perfect smoothness is required - defaults to 15.
|
|
11
|
+
* @param hausdorffTolerance The approximate maximum Hausdorff Distance tolerance -
|
|
12
|
+
* defaults to 0.1
|
|
13
|
+
* @param hausdorffSpacing The spacing on the curves used to calculate the Hausdorff
|
|
14
|
+
* Distance - defaults to 1
|
|
15
|
+
*/
|
|
16
|
+
declare function simplifyMatMapOnly(cpNode: CpNode, anlgeTolerance?: number, hausdorffTolerance?: number, hausdorffSpacing?: number): {
|
|
17
|
+
simpleMap: Map<CpNode, {
|
|
18
|
+
ps: number[][];
|
|
19
|
+
ts: number[];
|
|
20
|
+
}>;
|
|
21
|
+
cpNode: CpNode;
|
|
22
|
+
};
|
|
23
|
+
export { simplifyMatMapOnly };
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { closestPointOnBezier, hausdorffDistance, toCubic } from 'flo-bezier3';
|
|
2
|
-
import { getBranches } from '../get-branches.js';
|
|
3
|
-
import { getCurveToNext } from '../get-curve-to-next.js';
|
|
4
|
-
import { getCurveBetween } from '../get-curve/get-curve-between.js';
|
|
5
|
-
/**
|
|
6
|
-
* Simplifies the given MAT by replacing the piecewise quad beziers composing
|
|
7
|
-
* the MAT with fewer ones to within a given tolerance. Returns the map of
|
|
8
|
-
* to be deleted nodes only - does not actually delete them. Use simplifyMat
|
|
9
|
-
* instead if you want to delete the nodes.
|
|
10
|
-
* @param cpNode A representation of the MAT
|
|
11
|
-
* @param anlgeTolerance 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 - defaults to 15.
|
|
14
|
-
* @param hausdorffTolerance The approximate maximum Hausdorff Distance tolerance -
|
|
15
|
-
* defaults to 0.1
|
|
16
|
-
* @param hausdorffSpacing The spacing on the curves used to calculate the Hausdorff
|
|
17
|
-
* Distance - defaults to 1
|
|
18
|
-
*/
|
|
19
|
-
function simplifyMatMapOnly(cpNode, anlgeTolerance = 15, hausdorffTolerance = 1e-1, hausdorffSpacing = 1e0) {
|
|
20
|
-
const simpleMap = new Map();
|
|
21
|
-
// Start from a leaf
|
|
22
|
-
while (!cpNode.isTerminating()) {
|
|
23
|
-
cpNode = cpNode.next;
|
|
24
|
-
}
|
|
25
|
-
const branches = getBranches(cpNode, anlgeTolerance);
|
|
26
|
-
const canDeletes = [];
|
|
27
|
-
for (let k = 0; k < branches.length; k++) {
|
|
28
|
-
const branch = branches[k];
|
|
29
|
-
// Try to remove some
|
|
30
|
-
let j = 0;
|
|
31
|
-
while (j < branch.length) {
|
|
32
|
-
const i = j;
|
|
33
|
-
while (true) {
|
|
34
|
-
j++;
|
|
35
|
-
if (j === branch.length) {
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
const hd = getTotalHausdorffDistance(i, j, branch, hausdorffSpacing);
|
|
39
|
-
if (hd > hausdorffTolerance) {
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
canDeletes.push(branch[j]);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (i + 1 === j) {
|
|
47
|
-
// no simplification occured
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const branStart = branch[i];
|
|
51
|
-
const branEnd = branch[j - 1];
|
|
52
|
-
const medial = toCubic(getCurveBetween(branStart, branEnd.next));
|
|
53
|
-
const rev = medial.slice().reverse();
|
|
54
|
-
let curCpNode = branStart;
|
|
55
|
-
let prevT = 0;
|
|
56
|
-
while (curCpNode !== branEnd) {
|
|
57
|
-
const t = closestPointOnBezier(medial, curCpNode.next.cp.circle.center).t;
|
|
58
|
-
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, t] });
|
|
59
|
-
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
60
|
-
simpleMap.set(oppositeCpNode, { ps: rev, ts: [1 - t, 1 - prevT] });
|
|
61
|
-
prevT = t;
|
|
62
|
-
curCpNode = curCpNode.next;
|
|
63
|
-
}
|
|
64
|
-
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, 1] });
|
|
65
|
-
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
66
|
-
simpleMap.set(oppositeCpNode, { ps: rev, ts: [0, 1 - prevT] });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return { simpleMap, cpNode };
|
|
71
|
-
}
|
|
72
|
-
function getTotalHausdorffDistance(i, j, branch, hausdorffSpacing) {
|
|
73
|
-
const hds = [];
|
|
74
|
-
const longCurve = getCurveBetween(branch[i], branch[j].next);
|
|
75
|
-
for (let m = i; m < j + 1; m++) {
|
|
76
|
-
hds.push(hausdorffDistance(getCurveToNext(branch[m]), longCurve, hausdorffSpacing));
|
|
77
|
-
}
|
|
78
|
-
return Math.max(...hds);
|
|
79
|
-
}
|
|
80
|
-
export { simplifyMatMapOnly };
|
|
1
|
+
import { closestPointOnBezier, hausdorffDistance, toCubic } from 'flo-bezier3';
|
|
2
|
+
import { getBranches } from '../get-branches.js';
|
|
3
|
+
import { getCurveToNext } from '../get-curve-to-next.js';
|
|
4
|
+
import { getCurveBetween } from '../get-curve/get-curve-between.js';
|
|
5
|
+
/**
|
|
6
|
+
* Simplifies the given MAT by replacing the piecewise quad beziers composing
|
|
7
|
+
* the MAT with fewer ones to within a given tolerance. Returns the map of
|
|
8
|
+
* to be deleted nodes only - does not actually delete them. Use simplifyMat
|
|
9
|
+
* instead if you want to delete the nodes.
|
|
10
|
+
* @param cpNode A representation of the MAT
|
|
11
|
+
* @param anlgeTolerance 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 - defaults to 15.
|
|
14
|
+
* @param hausdorffTolerance The approximate maximum Hausdorff Distance tolerance -
|
|
15
|
+
* defaults to 0.1
|
|
16
|
+
* @param hausdorffSpacing The spacing on the curves used to calculate the Hausdorff
|
|
17
|
+
* Distance - defaults to 1
|
|
18
|
+
*/
|
|
19
|
+
function simplifyMatMapOnly(cpNode, anlgeTolerance = 15, hausdorffTolerance = 1e-1, hausdorffSpacing = 1e0) {
|
|
20
|
+
const simpleMap = new Map();
|
|
21
|
+
// Start from a leaf
|
|
22
|
+
while (!cpNode.isTerminating()) {
|
|
23
|
+
cpNode = cpNode.next;
|
|
24
|
+
}
|
|
25
|
+
const branches = getBranches(cpNode, anlgeTolerance);
|
|
26
|
+
const canDeletes = [];
|
|
27
|
+
for (let k = 0; k < branches.length; k++) {
|
|
28
|
+
const branch = branches[k];
|
|
29
|
+
// Try to remove some
|
|
30
|
+
let j = 0;
|
|
31
|
+
while (j < branch.length) {
|
|
32
|
+
const i = j;
|
|
33
|
+
while (true) {
|
|
34
|
+
j++;
|
|
35
|
+
if (j === branch.length) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
const hd = getTotalHausdorffDistance(i, j, branch, hausdorffSpacing);
|
|
39
|
+
if (hd > hausdorffTolerance) {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
canDeletes.push(branch[j]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (i + 1 === j) {
|
|
47
|
+
// no simplification occured
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const branStart = branch[i];
|
|
51
|
+
const branEnd = branch[j - 1];
|
|
52
|
+
const medial = toCubic(getCurveBetween(branStart, branEnd.next));
|
|
53
|
+
const rev = medial.slice().reverse();
|
|
54
|
+
let curCpNode = branStart;
|
|
55
|
+
let prevT = 0;
|
|
56
|
+
while (curCpNode !== branEnd) {
|
|
57
|
+
const t = closestPointOnBezier(medial, curCpNode.next.cp.circle.center).t;
|
|
58
|
+
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, t] });
|
|
59
|
+
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
60
|
+
simpleMap.set(oppositeCpNode, { ps: rev, ts: [1 - t, 1 - prevT] });
|
|
61
|
+
prevT = t;
|
|
62
|
+
curCpNode = curCpNode.next;
|
|
63
|
+
}
|
|
64
|
+
simpleMap.set(curCpNode, { ps: medial, ts: [prevT, 1] });
|
|
65
|
+
const oppositeCpNode = curCpNode.nextOnCircle.prev;
|
|
66
|
+
simpleMap.set(oppositeCpNode, { ps: rev, ts: [0, 1 - prevT] });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { simpleMap, cpNode };
|
|
71
|
+
}
|
|
72
|
+
function getTotalHausdorffDistance(i, j, branch, hausdorffSpacing) {
|
|
73
|
+
const hds = [];
|
|
74
|
+
const longCurve = getCurveBetween(branch[i], branch[j].next);
|
|
75
|
+
for (let m = i; m < j + 1; m++) {
|
|
76
|
+
hds.push(hausdorffDistance(getCurveToNext(branch[m]), longCurve, hausdorffSpacing));
|
|
77
|
+
}
|
|
78
|
+
return Math.max(...hds);
|
|
79
|
+
}
|
|
80
|
+
export { simplifyMatMapOnly };
|
|
81
81
|
//# sourceMappingURL=simplify-mat-map-only.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Mat } from '../../mat.js';
|
|
2
|
-
/**
|
|
3
|
-
* @hidden
|
|
4
|
-
* @param sat
|
|
5
|
-
*/
|
|
6
|
-
declare function addDebugInfo(sat: Mat, timingStart: number): void;
|
|
7
|
-
export { addDebugInfo };
|
|
1
|
+
import { Mat } from '../../mat.js';
|
|
2
|
+
/**
|
|
3
|
+
* @hidden
|
|
4
|
+
* @param sat
|
|
5
|
+
*/
|
|
6
|
+
declare function addDebugInfo(sat: Mat, timingStart: number): void;
|
|
7
|
+
export { addDebugInfo };
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @hidden
|
|
3
|
-
* @param sat
|
|
4
|
-
*/
|
|
5
|
-
function addDebugInfo(sat, timingStart) {
|
|
6
|
-
if (typeof _debug_ === 'undefined') {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
_debug_.generated.elems.sat.push(sat);
|
|
10
|
-
const timing = _debug_.generated.timing;
|
|
11
|
-
timing.sats = performance.now() - timingStart;
|
|
12
|
-
}
|
|
13
|
-
export { addDebugInfo };
|
|
1
|
+
/**
|
|
2
|
+
* @hidden
|
|
3
|
+
* @param sat
|
|
4
|
+
*/
|
|
5
|
+
function addDebugInfo(sat, timingStart) {
|
|
6
|
+
if (typeof _debug_ === 'undefined') {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
_debug_.generated.elems.sat.push(sat);
|
|
10
|
+
const timing = _debug_.generated.timing;
|
|
11
|
+
timing.sats = performance.now() - timingStart;
|
|
12
|
+
}
|
|
13
|
+
export { addDebugInfo };
|
|
14
14
|
//# sourceMappingURL=add-debug-info.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { CpNode } from '../../cp-node.js';
|
|
2
|
-
/**
|
|
3
|
-
* @hidden
|
|
4
|
-
* Cull all edges not part of a cycle in the MAT planar graph.
|
|
5
|
-
* @param cpStart The start CpNode which must reprsesent the maximal 3-prong
|
|
6
|
-
* vertex.
|
|
7
|
-
*/
|
|
8
|
-
declare function cullNonCycles(cpStart: CpNode): CpNode;
|
|
9
|
-
export { cullNonCycles };
|
|
1
|
+
import { CpNode } from '../../cp-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* @hidden
|
|
4
|
+
* Cull all edges not part of a cycle in the MAT planar graph.
|
|
5
|
+
* @param cpStart The start CpNode which must reprsesent the maximal 3-prong
|
|
6
|
+
* vertex.
|
|
7
|
+
*/
|
|
8
|
+
declare function cullNonCycles(cpStart: CpNode): CpNode;
|
|
9
|
+
export { cullNonCycles };
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { getLeaves } from '../get-leaves.js';
|
|
2
|
-
import { CpNode } from '../../cp-node.js';
|
|
3
|
-
/**
|
|
4
|
-
* @hidden
|
|
5
|
-
* Cull all edges not part of a cycle in the MAT planar graph.
|
|
6
|
-
* @param cpStart The start CpNode which must reprsesent the maximal 3-prong
|
|
7
|
-
* vertex.
|
|
8
|
-
*/
|
|
9
|
-
function cullNonCycles(cpStart) {
|
|
10
|
-
let cpNodeKept = cpStart;
|
|
11
|
-
const leaves = getLeaves(cpStart);
|
|
12
|
-
while (leaves.length) {
|
|
13
|
-
const leaf = leaves.pop();
|
|
14
|
-
// Preserve topology - keep cycles.
|
|
15
|
-
if (leaf.isHoleClosing || leaf.isIntersection) {
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
let cpNode = leaf.next; // Turn around
|
|
19
|
-
while (true) {
|
|
20
|
-
cpNode = cpNode.next;
|
|
21
|
-
let cut = false;
|
|
22
|
-
const cp1 = cpNode.prevOnCircle;
|
|
23
|
-
if (cpNode.getProngCount() > 2) {
|
|
24
|
-
//const cp2 = cp1.prevOnCircle;
|
|
25
|
-
const cp2 = cpNode.nextOnCircle;
|
|
26
|
-
//if (cpStart === cpNode || cpStart === cp1 || cpStart === cp2) {
|
|
27
|
-
if (CpNode.isOnSameCircle(cpNode, cpStart)) {
|
|
28
|
-
cut = true; // We are at the max disk - cut whole edge
|
|
29
|
-
}
|
|
30
|
-
else if (cpNode.next === cp2) {
|
|
31
|
-
cpNode = cp2;
|
|
32
|
-
}
|
|
33
|
-
else if (cp2.next !== cp1) {
|
|
34
|
-
cut = true; // Cut whole edge
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else if (cpNode.isTerminating() && !cpNode.isIntersection) {
|
|
38
|
-
cpNodeKept = cpNode;
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
if (cut) {
|
|
42
|
-
cp1.next = cpNode;
|
|
43
|
-
cpNode.prev = cp1;
|
|
44
|
-
cpNodeKept = cpNode;
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return cpNodeKept;
|
|
50
|
-
}
|
|
51
|
-
export { cullNonCycles };
|
|
1
|
+
import { getLeaves } from '../get-leaves.js';
|
|
2
|
+
import { CpNode } from '../../cp-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* @hidden
|
|
5
|
+
* Cull all edges not part of a cycle in the MAT planar graph.
|
|
6
|
+
* @param cpStart The start CpNode which must reprsesent the maximal 3-prong
|
|
7
|
+
* vertex.
|
|
8
|
+
*/
|
|
9
|
+
function cullNonCycles(cpStart) {
|
|
10
|
+
let cpNodeKept = cpStart;
|
|
11
|
+
const leaves = getLeaves(cpStart);
|
|
12
|
+
while (leaves.length) {
|
|
13
|
+
const leaf = leaves.pop();
|
|
14
|
+
// Preserve topology - keep cycles.
|
|
15
|
+
if (leaf.isHoleClosing || leaf.isIntersection) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
let cpNode = leaf.next; // Turn around
|
|
19
|
+
while (true) {
|
|
20
|
+
cpNode = cpNode.next;
|
|
21
|
+
let cut = false;
|
|
22
|
+
const cp1 = cpNode.prevOnCircle;
|
|
23
|
+
if (cpNode.getProngCount() > 2) {
|
|
24
|
+
//const cp2 = cp1.prevOnCircle;
|
|
25
|
+
const cp2 = cpNode.nextOnCircle;
|
|
26
|
+
//if (cpStart === cpNode || cpStart === cp1 || cpStart === cp2) {
|
|
27
|
+
if (CpNode.isOnSameCircle(cpNode, cpStart)) {
|
|
28
|
+
cut = true; // We are at the max disk - cut whole edge
|
|
29
|
+
}
|
|
30
|
+
else if (cpNode.next === cp2) {
|
|
31
|
+
cpNode = cp2;
|
|
32
|
+
}
|
|
33
|
+
else if (cp2.next !== cp1) {
|
|
34
|
+
cut = true; // Cut whole edge
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (cpNode.isTerminating() && !cpNode.isIntersection) {
|
|
38
|
+
cpNodeKept = cpNode;
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (cut) {
|
|
42
|
+
cp1.next = cpNode;
|
|
43
|
+
cpNode.prev = cp1;
|
|
44
|
+
cpNodeKept = cpNode;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return cpNodeKept;
|
|
50
|
+
}
|
|
51
|
+
export { cullNonCycles };
|
|
52
52
|
//# sourceMappingURL=cull-non-cycles.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { Circle } from '../../circle.js';
|
|
2
|
-
import { CpNode } from '../../cp-node.js';
|
|
3
|
-
/**
|
|
4
|
-
* @hidden
|
|
5
|
-
* Returns the set of Vertices passing the following test: walk the MAT tree and
|
|
6
|
-
* keep all Vertices not in the current cull set and any Vertices that have a
|
|
7
|
-
* non-culled node further down the line toward the tree leaves.
|
|
8
|
-
* @param culls The CpNodes (referred to by circles) that should be culled.
|
|
9
|
-
* @param maxCpNode The start CpNode which must reprsesent the maximal vertex.
|
|
10
|
-
*/
|
|
11
|
-
declare function cull(culls: Set<Circle>, maxCpNode: CpNode): void;
|
|
12
|
-
export { cull };
|
|
1
|
+
import { Circle } from '../../circle.js';
|
|
2
|
+
import { CpNode } from '../../cp-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* @hidden
|
|
5
|
+
* Returns the set of Vertices passing the following test: walk the MAT tree and
|
|
6
|
+
* keep all Vertices not in the current cull set and any Vertices that have a
|
|
7
|
+
* non-culled node further down the line toward the tree leaves.
|
|
8
|
+
* @param culls The CpNodes (referred to by circles) that should be culled.
|
|
9
|
+
* @param maxCpNode The start CpNode which must reprsesent the maximal vertex.
|
|
10
|
+
*/
|
|
11
|
+
declare function cull(culls: Set<Circle>, maxCpNode: CpNode): void;
|
|
12
|
+
export { cull };
|