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
package/src/get-branches.ts
CHANGED
|
@@ -26,15 +26,15 @@ function getBranches(
|
|
|
26
26
|
cpNode = cpNode.next;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const branches: CpNode[][] = [];
|
|
30
30
|
|
|
31
31
|
// Since the tree is unrooted we must iterate in all directions from the
|
|
32
32
|
// given vertex.
|
|
33
|
-
|
|
33
|
+
const cps = [cpNode.prevOnCircle];
|
|
34
34
|
|
|
35
35
|
let branchCpNodes: CpNode[] = [];
|
|
36
36
|
while (cps.length) {
|
|
37
|
-
|
|
37
|
+
const cp = cps.pop();
|
|
38
38
|
branchCpNodes.push(cp);
|
|
39
39
|
|
|
40
40
|
let children = cp.getChildren();
|
|
@@ -68,17 +68,17 @@ function getBranches(
|
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
const backPointingTan = toUnitVector(tangent(
|
|
72
72
|
getCurveToNext(cp.next.prevOnCircle),
|
|
73
73
|
0
|
|
74
74
|
));
|
|
75
|
-
|
|
75
|
+
const forwardPointingTan = toUnitVector(tangent(
|
|
76
76
|
getCurveToNext(children[0]),
|
|
77
77
|
0
|
|
78
78
|
));
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const cross_ = cross(backPointingTan, forwardPointingTan);
|
|
81
|
+
const angle = Math.abs(Math.asin( cross_ ) * (180/Math.PI));
|
|
82
82
|
|
|
83
83
|
if (angle > tolerance) {
|
|
84
84
|
branches.push(branchCpNodes);
|
|
@@ -22,22 +22,22 @@ function getCurveBetween(
|
|
|
22
22
|
cpNodeFrom: CpNode,
|
|
23
23
|
cpNodeTo: CpNode) {
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
const fromCc = cpNodeFrom.cp.circle.center;
|
|
26
|
+
const fromL = getEdgeDirection(cpNodeFrom);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
const toCc = cpNodeTo.cp.circle.center;
|
|
29
|
+
const toL = getEdgeDirection(cpNodeTo.prevOnCircle);
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
const mid = lineLineIntersection(fromL, toL);
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const c = fromTo(fromCc,toCc);
|
|
34
34
|
|
|
35
35
|
let twisted: boolean;
|
|
36
36
|
if (!mid) {
|
|
37
37
|
twisted = true;
|
|
38
38
|
} else {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const a = fromTo(fromCc, mid);
|
|
40
|
+
const b = fromTo(toCc, mid);
|
|
41
41
|
|
|
42
42
|
twisted = dot(a,c) < 0 || dot(b,c) > 0;
|
|
43
43
|
}
|
|
@@ -46,12 +46,12 @@ function getCurveBetween(
|
|
|
46
46
|
return [fromCc, mid, toCc];
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
const r = rotate90Degrees(c);
|
|
50
|
+
const w1 = fromTo(fromL[0], fromL[1]); // This is a unit vector
|
|
51
|
+
const w2 = fromTo(toL[0], toL[1]); // This is a unit vector
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
const d1 = Math.abs(cross(c, w1)) / (3*3);
|
|
54
|
+
const d2 = Math.abs(cross(c, w2)) / (3*3);
|
|
55
55
|
|
|
56
56
|
if (d1 > TOLERANCE_ADD_2PRONG || d2 > TOLERANCE_ADD_2PRONG) {
|
|
57
57
|
// TODO - not within tolerance - must add additional 2-prong
|
|
@@ -60,14 +60,14 @@ function getCurveBetween(
|
|
|
60
60
|
|
|
61
61
|
if (d1 > TOLERANCE_USE_LINE || d2 > TOLERANCE_USE_LINE) {
|
|
62
62
|
// approximate with cubic bezier
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
const m1 = interpolate(fromCc,toCc,1/3);
|
|
64
|
+
const m2 = interpolate(fromCc,toCc,2/3);
|
|
65
|
+
const v1 = translate(r, m1);
|
|
66
|
+
const v2 = translate(r, m2);
|
|
67
|
+
const l1 = [m1,v1];
|
|
68
|
+
const l2 = [m2,v2];
|
|
69
|
+
const mid1 = lineLineIntersection(fromL, l1);
|
|
70
|
+
const mid2 = lineLineIntersection(toL, l2);
|
|
71
71
|
|
|
72
72
|
return [fromCc, mid1, mid2, toCc];
|
|
73
73
|
}
|
|
@@ -13,17 +13,16 @@ import { isPosSharpCorner } from '../point-on-shape.js';
|
|
|
13
13
|
* @param cpNode
|
|
14
14
|
*/
|
|
15
15
|
function getEdgeDirection(cpNode: CpNode) {
|
|
16
|
+
const circleCenter = cpNode.cp.circle.center;
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
const cp1 = cpNode;
|
|
19
|
+
const cp2 = cpNode.nextOnCircle;
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
const pos1 = cp1.cp.pointOnShape;
|
|
22
|
+
const pos2 = cp2.cp.pointOnShape;
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
let p1 = pos1.p;
|
|
26
|
-
let p2 = pos2.p;
|
|
24
|
+
const p1 = pos1.p;
|
|
25
|
+
const p2 = pos2.p;
|
|
27
26
|
|
|
28
27
|
let vDir;
|
|
29
28
|
|
|
@@ -46,20 +45,20 @@ function getEdgeDirection(cpNode: CpNode) {
|
|
|
46
45
|
curve2 = pos1.curve;
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
const tan1 = toUnitVector(tangent(curve1.ps, 0));
|
|
49
|
+
const tan2 = reverse( toUnitVector(tangent(curve2.ps, 1)) );
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
const x = dot(tan1, tan2);
|
|
53
52
|
// Recall the identities sin(acos(x)) = sqrt(1-x^2), etc. Also
|
|
54
53
|
// recall the half angle formulas. Then the rotation matrix, R, can
|
|
55
54
|
// be calculated.
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const cosθ = Math.sqrt((1+x)/2);
|
|
56
|
+
const sinθ = Math.sqrt((1-x)/2);
|
|
58
57
|
|
|
59
58
|
vDir = rotate(sinθ, cosθ, tan2);
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
const v = translate(
|
|
63
62
|
toUnitVector(vDir),
|
|
64
63
|
circleCenter
|
|
65
64
|
);
|
package/src/get-interface-ccw.ts
CHANGED
|
@@ -27,14 +27,14 @@ import { compareCurvaturesAtInterface } from "./compare-curvatures-at-interface.
|
|
|
27
27
|
*/
|
|
28
28
|
// TODO - improve and make at least 46-bitlength precondition
|
|
29
29
|
function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
30
|
-
|
|
30
|
+
const lenI = psI.length;
|
|
31
31
|
|
|
32
32
|
// second last control point of incoming curve
|
|
33
|
-
|
|
33
|
+
const p0 = psI[lenI-2];
|
|
34
34
|
// last control point of incoming curve / first control point of outgoing
|
|
35
|
-
|
|
35
|
+
const p1 = psO[0];
|
|
36
36
|
// second control point of outgoing curve
|
|
37
|
-
|
|
37
|
+
const p2 = psO[1];
|
|
38
38
|
|
|
39
39
|
/*
|
|
40
40
|
if (typeof _bez_debug_ !== 'undefined') {
|
|
@@ -63,18 +63,18 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
63
63
|
*/
|
|
64
64
|
|
|
65
65
|
// Max one bit can be added in the calculations below due to bit-alignment
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
const xE = p1[0] - p0[0]; // tangent x-coordinate
|
|
67
|
+
const yE = p1[1] - p0[1]; // tangent y-coordinate
|
|
68
|
+
const xS = p2[0] - p1[0]; // tangent x-coordinate
|
|
69
|
+
const yS = p2[1] - p1[1]; // tangent y-coordinate
|
|
70
70
|
|
|
71
71
|
// If the tangent is to be found at t === 0 or t === 1 then using a basic
|
|
72
72
|
// property of bezier curves we can find the tangents easily as below
|
|
73
73
|
|
|
74
74
|
// (non-normalized) tangent of incoming curve at t === 1
|
|
75
|
-
|
|
75
|
+
const tangentAtEnd = [xE,yE];
|
|
76
76
|
// (non-normalized) tangent of outgoing curve at t === 0
|
|
77
|
-
|
|
77
|
+
const tangentAtStart = [xS,yS];
|
|
78
78
|
|
|
79
79
|
// The cross calculated below will have a max bitlength of
|
|
80
80
|
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
@@ -82,7 +82,7 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
82
82
|
//let crossTangents = cross(tangentAtEnd, tangentAtStart);
|
|
83
83
|
|
|
84
84
|
// The cross below is exact by adaptive infinite precision
|
|
85
|
-
|
|
85
|
+
const crossTangents = orient2d(p0, p1, p2);
|
|
86
86
|
|
|
87
87
|
if (crossTangents !== 0) {
|
|
88
88
|
return crossTangents;
|
|
@@ -91,7 +91,7 @@ function getInterfaceCcw(psI: number[][], psO: number[][]) {
|
|
|
91
91
|
// The dot calculated below will have a max bitlength of
|
|
92
92
|
// (2*(maxBitLength+1))+1 === e.g. (2*(25+1)) + 1 === 53
|
|
93
93
|
// If the preconditions are met it is exact
|
|
94
|
-
|
|
94
|
+
const dotTangents = dot(tangentAtEnd, tangentAtStart);
|
|
95
95
|
if (dotTangents > 0) {
|
|
96
96
|
// Curves go in same direction at interface - neither clock or
|
|
97
97
|
// anti-clockwise.
|
|
@@ -17,10 +17,10 @@ function getLoopsMetrics(loops: number[][][][]): {
|
|
|
17
17
|
let minY = Number.POSITIVE_INFINITY;
|
|
18
18
|
let maxY = Number.NEGATIVE_INFINITY;
|
|
19
19
|
|
|
20
|
-
for (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
for (const loop of loops) { for (const ps of loop) { for (const p of ps) {
|
|
21
|
+
const x = p[0];
|
|
22
|
+
const y = p[1];
|
|
23
|
+
const c = max(abs(x), abs(y));
|
|
24
24
|
if (c > maxCoordinate) { maxCoordinate = c; }
|
|
25
25
|
if (x < minX) { minX = x; }
|
|
26
26
|
if (x > maxX) { maxX = x; }
|
|
@@ -28,9 +28,9 @@ function getLoopsMetrics(loops: number[][][][]): {
|
|
|
28
28
|
if (y > maxY) { maxY = y; }
|
|
29
29
|
} } }
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const width = maxX - minX;
|
|
32
|
+
const height = maxY - minY;
|
|
33
|
+
const maxRadius = max(width, height);
|
|
34
34
|
|
|
35
35
|
return { maxCoordinate, maxRadius };
|
|
36
36
|
}
|
package/src/loop.ts
CHANGED
|
@@ -17,9 +17,9 @@ interface Loop {
|
|
|
17
17
|
* @param beziers A pre-ordered array of bezier curves to add initially.
|
|
18
18
|
*/
|
|
19
19
|
function loopFromBeziers(beziers: number[][][] = []) {
|
|
20
|
-
|
|
20
|
+
const curves: Curve[] = [];
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const loop: Loop = {
|
|
23
23
|
beziers,
|
|
24
24
|
curves
|
|
25
25
|
};
|
|
@@ -30,7 +30,7 @@ function loopFromBeziers(beziers: number[][][] = []) {
|
|
|
30
30
|
|
|
31
31
|
for (let i=0; i<beziers.length; i++) {
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
const curve: Curve = {
|
|
34
34
|
loop,
|
|
35
35
|
ps: beziers[i],
|
|
36
36
|
prev,
|
|
@@ -45,7 +45,7 @@ function loopFromBeziers(beziers: number[][][] = []) {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// close loop
|
|
48
|
-
|
|
48
|
+
const lastCurve = curves[curves.length-1];
|
|
49
49
|
curves[0].prev = lastCurve;
|
|
50
50
|
lastCurve.next = curves[0];
|
|
51
51
|
|
|
@@ -23,16 +23,16 @@ function addToCpGraph(
|
|
|
23
23
|
poss : IPointOnShape[],
|
|
24
24
|
neighbors? : CpNode[][]) {
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const newCps = poss.map((pos, i) => {
|
|
27
|
+
const cpTree = cpTrees.get(pos.curve.loop);
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
const newCp_: ContactPoint = { pointOnShape: pos, circle, order: orders[i], order2: 0 };
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
const neighboringCp = neighbors
|
|
32
32
|
? neighbors[i]
|
|
33
33
|
: getNeighbouringPoints(cpTree, pos, orders[i], 0);
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
const newCp = CpNode.insert(
|
|
36
36
|
false,
|
|
37
37
|
false,
|
|
38
38
|
cpTree,
|
|
@@ -43,10 +43,10 @@ function addToCpGraph(
|
|
|
43
43
|
return newCp;
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
const len = poss.length;
|
|
47
47
|
for (let i=0; i<len; i++) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const indxPrev = i === 0 ? len-1 : i-1;
|
|
49
|
+
const indxNext = i === len-1 ? 0 : i+1;
|
|
50
50
|
|
|
51
51
|
newCps[i].prevOnCircle = newCps[indxPrev];
|
|
52
52
|
newCps[i].nextOnCircle = newCps[indxNext];
|
|
@@ -33,8 +33,7 @@ function closestPointsOnCurve(
|
|
|
33
33
|
: _poly;
|
|
34
34
|
|
|
35
35
|
// let roots: Omit<RootInterval,'multiplicity'>[] = allRootsMultiWithErrBounds(
|
|
36
|
-
|
|
37
|
-
roots = allRootsCertified(poly, tS, tE);
|
|
36
|
+
const roots: Omit<RootInterval,'multiplicity'>[] = allRootsCertified(poly, tS, tE);
|
|
38
37
|
|
|
39
38
|
// Also test the endpoints
|
|
40
39
|
let push0 = true;
|
|
@@ -64,12 +63,12 @@ function closestPointsOnCurve(
|
|
|
64
63
|
roots.push({ tS: tE, tE: tE });
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
|
|
66
|
+
const ps = roots.map(
|
|
68
67
|
root => {
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
const tS = root.tS;
|
|
69
|
+
const tE = root.tE;
|
|
71
70
|
// TODO - tS, tE should always stay within [0,1] - modify findRootsMulti
|
|
72
|
-
|
|
71
|
+
const t = tS < 0
|
|
73
72
|
? 0
|
|
74
73
|
: tE > 1 ? 1 : (tS + tE)/2;
|
|
75
74
|
// TODO - why does evalDeCasteljau not work here?
|
|
@@ -17,7 +17,7 @@ function cullBezierPieces(
|
|
|
17
17
|
const CULL_THRESHOLD = 0;
|
|
18
18
|
|
|
19
19
|
if (bezierPieces.length > CULL_THRESHOLD) {
|
|
20
|
-
|
|
20
|
+
const bestSquaredDistance = getBestDistanceSquared(
|
|
21
21
|
bezierPieces, p
|
|
22
22
|
);
|
|
23
23
|
bezierPieces = cullByLooseBoundingBox(
|
|
@@ -16,15 +16,15 @@ function cullByLooseBoundingBox(
|
|
|
16
16
|
p: number[],
|
|
17
17
|
dSquared: number) {
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const candidateBezierPieces = [];
|
|
20
20
|
|
|
21
21
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const bezierPiece = bezierPieces[i];
|
|
23
|
+
const ps = bezierPiece.curve.ps;
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const boundingBox = getBoundingBox_(ps);
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
const d = getClosestSquareDistanceToRect(
|
|
28
28
|
boundingBox,
|
|
29
29
|
p
|
|
30
30
|
);
|
|
@@ -20,14 +20,14 @@ function cullByTightBoundingBox(
|
|
|
20
20
|
p: number[],
|
|
21
21
|
bestSquaredDistance: number) {
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const candidateBezierPieces = [];
|
|
24
24
|
|
|
25
25
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const bezierPiece = bezierPieces[i];
|
|
27
|
+
const ps = bezierPiece.curve.ps;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const tightBoundingBox = getBoundingBoxTight_(ps);
|
|
30
|
+
const d = getClosestSquaredDistanceToRotatedRect(
|
|
31
31
|
tightBoundingBox,
|
|
32
32
|
p
|
|
33
33
|
);
|
|
@@ -14,14 +14,14 @@ function getBestDistanceSquared(
|
|
|
14
14
|
|
|
15
15
|
let bestSquaredDistance = Number.POSITIVE_INFINITY;
|
|
16
16
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
17
|
-
|
|
17
|
+
const bezierPiece = bezierPieces[i];
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const ps = bezierPiece.curve.ps;
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
const p1 = evalDeCasteljau(ps, bezierPiece.ts[0]);
|
|
22
|
+
const p2 = evalDeCasteljau(ps, bezierPiece.ts[1]);
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
const d = Math.min(
|
|
25
25
|
squaredDistanceBetween(p, p1),
|
|
26
26
|
squaredDistanceBetween(p, p2)
|
|
27
27
|
);
|
|
@@ -21,20 +21,20 @@ function getCloseBoundaryPoints(
|
|
|
21
21
|
y: IPointOnShape,
|
|
22
22
|
distance: number) {
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const touchedCurve = y.curve;
|
|
25
|
+
const t = y.t;
|
|
26
|
+
const p_ = y.p;
|
|
27
27
|
|
|
28
28
|
bezierPieces = cullBezierPieces(bezierPieces, point);
|
|
29
29
|
|
|
30
30
|
// TODO - integrate with is-another-cp-closeby - we MUST check angle too!
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const DISTANCE_TOLERANCE = 1e-9;
|
|
32
|
+
const posInfos: { pos: IPointOnShape; d: number }[] = [];
|
|
33
33
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
34
|
-
|
|
34
|
+
const bezierPiece = bezierPieces[i];
|
|
35
35
|
|
|
36
36
|
// TOOD - important - should be able to return multiple points
|
|
37
|
-
|
|
37
|
+
const ps = closestPointsOnCurve(
|
|
38
38
|
bezierPiece.curve,
|
|
39
39
|
point,
|
|
40
40
|
bezierPiece.ts,
|
|
@@ -45,8 +45,8 @@ function getCloseBoundaryPoints(
|
|
|
45
45
|
//if (ps === undefined) { continue; }
|
|
46
46
|
|
|
47
47
|
for (let j=0; j<ps.length; j++) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const p = ps[j];
|
|
49
|
+
const d = distanceBetween(p.p, point);
|
|
50
50
|
|
|
51
51
|
let curve = bezierPiece.curve;
|
|
52
52
|
let t_= p.t;
|
|
@@ -67,23 +67,23 @@ function getCloseBoundaryPoints(
|
|
|
67
67
|
// TODO - in future remove all these checks and join n-prongs when they
|
|
68
68
|
// are being added - much simpler and more symmetric. Remeber order when
|
|
69
69
|
// comparing closeness!
|
|
70
|
-
|
|
70
|
+
const indexesToCheck: number[] = [];
|
|
71
71
|
for (let i=0; i<posInfos.length; i++) {
|
|
72
|
-
|
|
72
|
+
const pi = posInfos[i];
|
|
73
73
|
// Only check if they are close to the edges. Why??
|
|
74
74
|
//if (pi.pos.t < 1e-2 || 1-pi.pos.t < 1e-2) {
|
|
75
75
|
indexesToCheck.push(i);
|
|
76
76
|
//}
|
|
77
77
|
}
|
|
78
|
-
|
|
78
|
+
const indexesToRemove: number[] = [];
|
|
79
79
|
for (let i=0; i<indexesToCheck.length; i++) {
|
|
80
80
|
for (let j=i+1; j<indexesToCheck.length; j++) {
|
|
81
81
|
if (i === j) { continue; }
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const p1 = posInfos[indexesToCheck[i]].pos.p;
|
|
83
|
+
const p2 = posInfos[indexesToCheck[j]].pos.p;
|
|
84
84
|
// Below checks for source point too - similar to
|
|
85
85
|
// isAnotherCpCloseBy
|
|
86
|
-
|
|
86
|
+
const p3 = p_;
|
|
87
87
|
if ((Math.abs(p1[0] - p2[0]) < 1e-6 &&
|
|
88
88
|
Math.abs(p1[1] - p2[1]) < 1e-6) ||
|
|
89
89
|
|
|
@@ -27,9 +27,9 @@ function getClosestBoundaryPoint(
|
|
|
27
27
|
let bestDistance = Number.POSITIVE_INFINITY;
|
|
28
28
|
let posInfo: { pos: IPointOnShape; d: number };
|
|
29
29
|
for (let i=0; i<bezierPieces.length; i++) {
|
|
30
|
-
|
|
30
|
+
const bezierPiece = bezierPieces[i];
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const ps = closestPointsOnCurve(
|
|
33
33
|
bezierPiece.curve,
|
|
34
34
|
point,
|
|
35
35
|
bezierPiece.ts,
|
|
@@ -37,11 +37,11 @@ function getClosestBoundaryPoint(
|
|
|
37
37
|
t
|
|
38
38
|
);
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
const p = getObjClosestTo(point, ps, p => p.p)
|
|
41
41
|
|
|
42
42
|
if (p === undefined) { continue; }
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
const d = distanceBetween(p.p, point);
|
|
45
45
|
|
|
46
46
|
let curve = bezierPiece.curve;
|
|
47
47
|
let t_= p.t;
|
|
@@ -20,12 +20,12 @@ function cmpCpOnδ(
|
|
|
20
20
|
return 1;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const cpBef = δ[0].cp;
|
|
24
|
+
const cpAft = δ[1].cp;
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const cmp = compareCps(cpBef, cpAft);
|
|
27
|
+
const cmpPrev = compareCps(cpBef, cp);
|
|
28
|
+
const cmpNext = compareCps(cp, cpAft);
|
|
29
29
|
|
|
30
30
|
if (cmp < 0) {
|
|
31
31
|
if (cmpPrev > 0 || cmpNext > 0) {
|
|
@@ -8,14 +8,14 @@ import { Loop } from '../loop.js';
|
|
|
8
8
|
* @param cpNode
|
|
9
9
|
*/
|
|
10
10
|
function createNewCpTree(cpNode: CpNode) {
|
|
11
|
-
|
|
11
|
+
const newCpTrees: Map<Loop,LlRbTree<CpNode>> = new Map();
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
const cps = cpNode.getAllOnLoop();
|
|
14
14
|
|
|
15
15
|
cps.forEach(f);
|
|
16
16
|
|
|
17
17
|
function f(cpNode: CpNode) {
|
|
18
|
-
|
|
18
|
+
const loop = cpNode.cp.pointOnShape.curve.loop;
|
|
19
19
|
let cpTree = newCpTrees.get(loop);
|
|
20
20
|
if (!cpTree) {
|
|
21
21
|
// qqq cpTree = new LlRbTree(CpNode.comparator, [], true);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @
|
|
2
|
-
declare
|
|
1
|
+
/** @internal */
|
|
2
|
+
declare const _debug_: Debug;
|
|
3
3
|
|
|
4
4
|
import { LlRbTree } from 'flo-ll-rb-tree';
|
|
5
5
|
import { Debug } from '../../debug/debug.js';
|
|
@@ -44,10 +44,10 @@ function add1Prong(
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
//let circle = PointOnShape.getOsculatingCircle(maxOsculatingCircleRadius, pos);
|
|
47
|
-
|
|
47
|
+
const circle = getOsculatingCircle(maxOsculatingCircleRadius, pos);
|
|
48
48
|
|
|
49
|
-
//
|
|
50
|
-
|
|
49
|
+
//const order = PointOnShape.calcOrder(circle, pos);
|
|
50
|
+
const order = calcPosOrder(circle, pos);
|
|
51
51
|
// Make sure there isn't already a ContactPoint close by - it can cause
|
|
52
52
|
// floating point stability issues.
|
|
53
53
|
if (isAnotherCpCloseby(cpGraphs, pos, circle, order, 0, 1000, 'magenta')) {
|