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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @
|
|
2
|
-
declare
|
|
1
|
+
/** @internal */
|
|
2
|
+
declare const _debug_: Debug;
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
5
|
fromTo, circumCenter, len, distanceBetween, toUnitVector, rotate90Degrees,
|
|
@@ -40,33 +40,33 @@ function find3ProngForDelta3s(
|
|
|
40
40
|
const TOLERANCE = extreme * 1e-10;
|
|
41
41
|
const MAX_ITERATIONS = 10;
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
const δs_ = [
|
|
44
44
|
δs[0],
|
|
45
45
|
δs[idx],
|
|
46
46
|
δs[δs.length-1]
|
|
47
47
|
];
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
const bezierPieces_ = [
|
|
50
50
|
bezierPiecess[0],
|
|
51
51
|
bezierPiecess[idx],
|
|
52
52
|
bezierPiecess[δs.length-1]
|
|
53
53
|
];
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
const δ3ss = [
|
|
56
56
|
[δs_[0], δs_[1], δs_[2]],
|
|
57
57
|
[δs_[1], δs_[2], δs_[0]],
|
|
58
58
|
[δs_[2], δs_[0], δs_[1]],
|
|
59
59
|
];
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
const bezierPiecess_ = [
|
|
62
62
|
[bezierPieces_[0], bezierPieces_[1], bezierPieces_[2]],
|
|
63
63
|
[bezierPieces_[1], bezierPieces_[2], bezierPieces_[0]],
|
|
64
64
|
[bezierPieces_[2], bezierPieces_[0], bezierPieces_[1]],
|
|
65
65
|
]
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
const δ3s = δ3ss[k];
|
|
69
|
+
const bezierPiece3s = bezierPiecess_[k];
|
|
70
70
|
|
|
71
71
|
if (δ3s[0][0].isSharp()) { return undefined; }
|
|
72
72
|
|
|
@@ -77,9 +77,9 @@ function find3ProngForDelta3s(
|
|
|
77
77
|
let x = calcInitial3ProngCenter(δ3s, bezierPiece3s);
|
|
78
78
|
|
|
79
79
|
if (typeof _debug_ !== 'undefined') {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
81
|
+
const d = threeProngs[threeProngs.length-1];
|
|
82
|
+
const trace = d.traces[d.traces.length-1];
|
|
83
83
|
trace.push(x);
|
|
84
84
|
}
|
|
85
85
|
|
|
@@ -99,7 +99,7 @@ function find3ProngForDelta3s(
|
|
|
99
99
|
|
|
100
100
|
circumCenter_ = circumCenter(ps.map(x => x.p));
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
const vectorToZeroV = calcVectorToZeroV_StraightToIt(x, circumCenter_);
|
|
103
103
|
|
|
104
104
|
if (!Number.isFinite(vectorToZeroV[0]) || !Number.isFinite(vectorToZeroV[1])) {
|
|
105
105
|
|
|
@@ -109,27 +109,27 @@ function find3ProngForDelta3s(
|
|
|
109
109
|
// loop. This check, for instance, would be eliminated completely.
|
|
110
110
|
return undefined;
|
|
111
111
|
}
|
|
112
|
-
|
|
112
|
+
const upds = calcBetterX(bezierPiece3s, x, vectorToZeroV);
|
|
113
113
|
x = upds.newX;
|
|
114
114
|
ps = upds.newPs;
|
|
115
115
|
|
|
116
116
|
if (typeof _debug_ !== 'undefined') {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
118
|
+
const d = threeProngs[threeProngs.length-1];
|
|
119
|
+
const trace = d.traces[d.traces.length-1];
|
|
120
120
|
trace.push(x);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
const V = len(vectorToZeroV); // The 'potential'
|
|
124
124
|
|
|
125
125
|
tolerance = Math.abs(V - upds.newV);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
const radius = (distanceBetween(x, ps[0].p) +
|
|
129
129
|
distanceBetween(x, ps[1].p) +
|
|
130
130
|
distanceBetween(x, ps[2].p)) / 3;
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
const circle = { center: x, radius };
|
|
133
133
|
|
|
134
134
|
//-------------------------------------------------------------------------
|
|
135
135
|
// Calculate the unit tangent vector at 3-prong circle points - they should
|
|
@@ -138,12 +138,12 @@ function find3ProngForDelta3s(
|
|
|
138
138
|
//-------------------------------------------------------------------------
|
|
139
139
|
let totalAngleError = 0;
|
|
140
140
|
for (let i=0; i<3; i++) {
|
|
141
|
-
|
|
141
|
+
const p = ps[i];
|
|
142
142
|
//----------------------------
|
|
143
143
|
// Tangent of circle at point
|
|
144
144
|
//----------------------------
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
const v = toUnitVector(fromTo(p.p, x));
|
|
146
|
+
const v1 = rotate90Degrees(v);
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
//-----------------------------------
|
|
@@ -151,13 +151,13 @@ function find3ProngForDelta3s(
|
|
|
151
151
|
//-----------------------------------
|
|
152
152
|
//if (PointOnShape.isDullCorner(p)) {
|
|
153
153
|
if (isPosDullCorner(p)) {
|
|
154
|
-
//
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
154
|
+
//const corner = Curve.getCornerAtEnd(p.curve);
|
|
155
|
+
const corner = getCornerAtEnd(p.curve);
|
|
156
|
+
const tans = corner.tangents;
|
|
157
|
+
const perps = tans.map( rotate90Degrees );
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
const angleError1 = Math.asin( cross( perps[0], v ) );
|
|
160
|
+
const angleError2 = Math.asin( cross( v, perps[1] ) );
|
|
161
161
|
|
|
162
162
|
let angleError = 0;
|
|
163
163
|
if (angleError1 > 0) { angleError += angleError1; }
|
|
@@ -168,7 +168,7 @@ function find3ProngForDelta3s(
|
|
|
168
168
|
//---------------------------
|
|
169
169
|
// Tangent of curve at point
|
|
170
170
|
//---------------------------
|
|
171
|
-
|
|
171
|
+
const v2 = toUnitVector( tangent(p.curve.ps, p.t) );
|
|
172
172
|
|
|
173
173
|
// Cross is more numerically stable than Vector.dot at angles a
|
|
174
174
|
// multiple of Math.PI **and** is close to the actual angle value
|
|
@@ -176,7 +176,7 @@ function find3ProngForDelta3s(
|
|
|
176
176
|
// tolerance.
|
|
177
177
|
|
|
178
178
|
// Should be close to zero and is close to the actual angle.
|
|
179
|
-
|
|
179
|
+
const cross_ = Math.abs( Math.asin( cross(v1, v2) ) );
|
|
180
180
|
|
|
181
181
|
totalAngleError += cross_;
|
|
182
182
|
}
|
|
@@ -187,21 +187,21 @@ function find3ProngForDelta3s(
|
|
|
187
187
|
// point to the 3-prong. It should be around 0. If not, this is not a good
|
|
188
188
|
// candidate for the 3-prong.
|
|
189
189
|
//-------------------------------------------------------------------------
|
|
190
|
-
|
|
190
|
+
const closestDs = [];
|
|
191
191
|
for (let i=0; i<bezierPiecess.length; i++) {
|
|
192
|
-
|
|
192
|
+
const p = getClosestBoundaryPoint(
|
|
193
193
|
bezierPiecess[i], x, undefined, undefined
|
|
194
194
|
);
|
|
195
195
|
|
|
196
196
|
closestDs.push( distanceBetween(p.pos.p, x) );
|
|
197
197
|
}
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
const closestD = Math.min(...closestDs);
|
|
199
|
+
const radiusDelta = Math.abs(radius - closestD);
|
|
200
200
|
|
|
201
201
|
// Weights below still need to be optimized.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
const W1 = 1;
|
|
203
|
+
const W2 = 1;
|
|
204
|
+
const error = W1*radiusDelta + W2*totalAngleError;
|
|
205
205
|
|
|
206
206
|
return { ps, circle, error, δ3s };
|
|
207
207
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @
|
|
2
|
-
declare
|
|
1
|
+
/** @internal */
|
|
2
|
+
declare const _debug_: Debug;
|
|
3
3
|
|
|
4
4
|
import { fromTo } from 'flo-bezier3';
|
|
5
5
|
import { Debug } from '../../../debug/debug.js';
|
|
@@ -19,18 +19,18 @@ import { getBoundaryPieceBeziers } from '../../get-boundary-piece-beziers.js';
|
|
|
19
19
|
* tolerances.
|
|
20
20
|
*/
|
|
21
21
|
function find3Prong(δs: CpNode[][], extreme: number) {
|
|
22
|
-
|
|
22
|
+
const bezierPiecess = δs.map(getBoundaryPieceBeziers);
|
|
23
23
|
|
|
24
24
|
if (typeof _debug_ !== 'undefined') {
|
|
25
|
-
|
|
25
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
26
26
|
threeProngs.push(createEmptyThreeProngForDebugging());
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const d = threeProngs[threeProngs.length-1];
|
|
29
29
|
d.boundaries = [];
|
|
30
|
-
for (
|
|
31
|
-
|
|
30
|
+
for (const bezierPieces of bezierPiecess) {
|
|
31
|
+
const boundary: number[][][] = [];
|
|
32
32
|
d.boundaries.push(boundary);
|
|
33
|
-
for (
|
|
33
|
+
for (const bezierPiece of bezierPieces) {
|
|
34
34
|
/* qqq
|
|
35
35
|
let bezier = fromTo(bezierPiece.curve.ps)(
|
|
36
36
|
bezierPiece.ts[0], bezierPiece.ts[1]
|
|
@@ -46,7 +46,7 @@ function find3Prong(δs: CpNode[][], extreme: number) {
|
|
|
46
46
|
d.traces = [];
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
const candidateThreeProngs = [];
|
|
50
50
|
|
|
51
51
|
// The best candidate amongst the different 'permutations' of the given δs.
|
|
52
52
|
let threeProng: {
|
|
@@ -59,17 +59,17 @@ function find3Prong(δs: CpNode[][], extreme: number) {
|
|
|
59
59
|
for (let i=1; i<δs.length-1; i++) {
|
|
60
60
|
for (let k=0; k<3; k++) {
|
|
61
61
|
if (typeof _debug_ !== 'undefined') {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
63
|
+
const d = threeProngs[threeProngs.length-1];
|
|
64
|
+
const trace: number[][] = [];
|
|
65
65
|
d.traces.push(trace);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
const threeProngInfo =
|
|
69
69
|
find3ProngForDelta3s(δs, i, k, bezierPiecess, extreme);
|
|
70
70
|
if (!threeProngInfo) { continue; }
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
const { circle, ps, error, δ3s } = threeProngInfo;
|
|
73
73
|
|
|
74
74
|
if (typeof _debug_ !== 'undefined') {
|
|
75
75
|
candidateThreeProngs.push({ circle, ps });
|
|
@@ -87,8 +87,8 @@ function find3Prong(δs: CpNode[][], extreme: number) {
|
|
|
87
87
|
//threeProng.δ3s = [δs[0], δs[bestIndx+1], δs[δs.length-1]];
|
|
88
88
|
|
|
89
89
|
if (typeof _debug_ !== 'undefined') {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
91
|
+
const d = threeProngs[threeProngs.length-1];
|
|
92
92
|
|
|
93
93
|
d.generated = _debug_.generated;
|
|
94
94
|
d.circle = threeProng.circle;
|
|
@@ -23,8 +23,8 @@ function findAndAdd2ProngsOnAllPaths(
|
|
|
23
23
|
let cpNode;
|
|
24
24
|
|
|
25
25
|
for (let k=0; k<for2Prongss.length; k++) {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const for2Prongs = for2Prongss[k];
|
|
27
|
+
const _cpNode = findAndAdd2Prongs(loops, cpGraphs, k, for2Prongs, extreme);
|
|
28
28
|
cpNode = cpNode || _cpNode;
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -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';
|
|
@@ -29,28 +29,26 @@ function findAndAdd2Prongs(
|
|
|
29
29
|
for2Prongs: IPointOnShape[],
|
|
30
30
|
extreme: number) {
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
//
|
|
32
|
+
const len = for2Prongs.length;
|
|
33
|
+
const index = indexLinear(len);
|
|
34
|
+
//const index = indexInterlaced(len); // Keep for possible future use.
|
|
35
35
|
let cpNode_;
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const bounds = getShapeBounds(loops);
|
|
38
|
+
const squaredDiagonalLength =
|
|
39
39
|
(bounds.maxX.p[0] - bounds.minX.p[0])**2 +
|
|
40
40
|
(bounds.maxY.p[1] - bounds.minY.p[1])**2;
|
|
41
41
|
|
|
42
42
|
for (let i=0; i<len; i++) {
|
|
43
|
-
|
|
43
|
+
const pos = for2Prongs[index[i]];
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
twoProngInfo = find2Prong(
|
|
45
|
+
const twoProngInfo: { circle: Circle, zs: { pos: IPointOnShape, d: number }[] } = find2Prong(
|
|
48
46
|
loops, extreme, squaredDiagonalLength, cpGraphs, pos, false, k
|
|
49
47
|
);
|
|
50
48
|
|
|
51
49
|
if (twoProngInfo) {
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
const { circle, zs } = twoProngInfo;
|
|
51
|
+
const cpNode = add2Prong(cpGraphs, circle, pos, zs, false, extreme);
|
|
54
52
|
cpNode_ = cpNode_ || cpNode;
|
|
55
53
|
}
|
|
56
54
|
|
|
@@ -71,7 +69,7 @@ function findAndAdd2Prongs(
|
|
|
71
69
|
* @param n
|
|
72
70
|
*/
|
|
73
71
|
function indexLinear(n: number) {
|
|
74
|
-
|
|
72
|
+
const arr = [];
|
|
75
73
|
for (let i=0; i<n; i++) {
|
|
76
74
|
arr.push(i);
|
|
77
75
|
}
|
|
@@ -86,8 +84,8 @@ function indexLinear(n: number) {
|
|
|
86
84
|
* @param n
|
|
87
85
|
*/
|
|
88
86
|
function indexInterlaced(n: number) {
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
const source: { [index:number]: boolean } = {};
|
|
88
|
+
const arr = [];
|
|
91
89
|
// l is the lowest power of 2 so that 2^l > n
|
|
92
90
|
let l = Math.pow(2, Math.floor(Math.log2(n)));
|
|
93
91
|
|
|
@@ -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';
|
|
@@ -27,22 +27,22 @@ function findAndAddAll3Prongs(
|
|
|
27
27
|
// Don't change this function to be recursive, the call stack may overflow
|
|
28
28
|
// if there are too many two-prongs.
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
const visitedEdges = new Map<CpNode, Set<CpNode>>();
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
const edgesToCheck = [{ fromCpNode: undefined as CpNode, cpStart }];
|
|
33
33
|
|
|
34
34
|
while (edgesToCheck.length) {
|
|
35
|
-
|
|
35
|
+
const { fromCpNode, cpStart } = edgesToCheck.shift();
|
|
36
36
|
|
|
37
37
|
markEdgeAsTaken(visitedEdges, fromCpNode, cpStart);
|
|
38
38
|
|
|
39
|
-
for (
|
|
39
|
+
for (const cpNode of cpStart.getCpNodesOnCircle()) {
|
|
40
40
|
|
|
41
41
|
//if (!PointOnShape.isSharpCorner(cpNode.cp.pointOnShape)) {
|
|
42
42
|
if (!isPosSharpCorner(cpNode.cp.pointOnShape)) {
|
|
43
43
|
if (findAndAdd3Prongs(cpGraphs, cpNode, extreme) === undefined) {
|
|
44
44
|
return; // only for debugging purposes
|
|
45
|
-
}
|
|
45
|
+
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
if (hasEdgeBeenTaken(visitedEdges, cpNode, cpNode.next)) {
|
|
@@ -89,10 +89,10 @@ function hasEdgeBeenTaken(
|
|
|
89
89
|
let cps: Set<CpNode>;
|
|
90
90
|
|
|
91
91
|
cps = visitedEdges.get(cp1);
|
|
92
|
-
|
|
92
|
+
const takenForward = cps && cps.has(cp2);
|
|
93
93
|
|
|
94
94
|
cps = visitedEdges.get(cp2);
|
|
95
|
-
|
|
95
|
+
const takenBackwards = cps && cps.has(cp1);
|
|
96
96
|
|
|
97
97
|
return takenForward || takenBackwards;
|
|
98
98
|
}
|
|
@@ -112,11 +112,11 @@ function traverseShape(cpStart: CpNode) {
|
|
|
112
112
|
return [cpNode];
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
const visitedCps = [];
|
|
116
116
|
do {
|
|
117
117
|
visitedCps.push(cpNode);
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
const next = cpNode.next.prevOnCircle;
|
|
120
120
|
cpNode = cpNode === next
|
|
121
121
|
? cpNode = cpNode.next.next // Terminal vertex
|
|
122
122
|
: cpNode = next // Take last exit
|
|
@@ -179,14 +179,14 @@ function findAndAdd3Prong(
|
|
|
179
179
|
visitedCps : CpNode[],
|
|
180
180
|
extreme : number) {
|
|
181
181
|
|
|
182
|
-
|
|
183
|
-
for (
|
|
182
|
+
const δs = [];
|
|
183
|
+
for (const visitedCp of visitedCps) {
|
|
184
184
|
δs.push([visitedCp, visitedCp.next]);
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
|
|
187
|
+
const threeProng = find3Prong(δs, extreme);
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
const orders = [];
|
|
190
190
|
for (let i=0; i<3; i++) {
|
|
191
191
|
orders.push(
|
|
192
192
|
//PointOnShape.calcOrder(threeProng.circle, threeProng.ps[i])
|
|
@@ -194,7 +194,7 @@ function findAndAdd3Prong(
|
|
|
194
194
|
);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
const circle = add3Prong(cpGraphs, orders, threeProng);
|
|
198
198
|
|
|
199
199
|
if (typeof _debug_ !== 'undefined') {
|
|
200
200
|
add3ProngDebugInfo(circle, visitedCps);
|
|
@@ -207,9 +207,9 @@ function add3ProngDebugInfo(
|
|
|
207
207
|
circle: Circle,
|
|
208
208
|
visitedCps: CpNode[]) {
|
|
209
209
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
const threeProngs = _debug_.generated.elems.threeProng;
|
|
211
|
+
const len = threeProngs.length;
|
|
212
|
+
const data = threeProngs[len-1];
|
|
213
213
|
data.visitedCps = visitedCps;
|
|
214
214
|
data.circle = circle;
|
|
215
215
|
}
|
|
@@ -21,19 +21,19 @@ function findAndAddHoleClosing2Prongs(
|
|
|
21
21
|
cpTrees: Map<Loop,LlRbTree<CpNode>>,
|
|
22
22
|
extreme: number) {
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const bounds = getShapeBounds(loops);
|
|
25
|
+
const squaredDiagonalLength =
|
|
26
26
|
(bounds.maxX.p[0] - bounds.minX.p[0])**2 +
|
|
27
27
|
(bounds.maxY.p[1] - bounds.minY.p[1])**2;
|
|
28
28
|
|
|
29
29
|
// Find the topmost points on each loop.
|
|
30
|
-
|
|
30
|
+
const minYs = loops.map(getMinYPos);
|
|
31
31
|
|
|
32
32
|
// We start at 1 since 0 is the outer (root) loop
|
|
33
33
|
for (let k=1; k<minYs.length; k++) {
|
|
34
|
-
|
|
34
|
+
const posSource = minYs[k];
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
const holeClosingTwoProng = find2Prong(
|
|
37
37
|
loops, extreme, squaredDiagonalLength, cpTrees, posSource, true, k
|
|
38
38
|
);
|
|
39
39
|
|
|
@@ -43,7 +43,7 @@ function findAndAddHoleClosing2Prongs(
|
|
|
43
43
|
|
|
44
44
|
// TODO important - handle case of n-prong, i.e. more than one antipode
|
|
45
45
|
// - currently we only handle case of single antipode (the general case)
|
|
46
|
-
|
|
46
|
+
const { circle, zs: posAntipodes } = holeClosingTwoProng;
|
|
47
47
|
|
|
48
48
|
add2Prong(cpTrees, circle, posSource, [posAntipodes[0]], true, extreme);
|
|
49
49
|
}
|
|
@@ -3,12 +3,12 @@ import { IPointOnShape, isPosQuiteSharpCorner } from '../../point-on-shape.js';
|
|
|
3
3
|
|
|
4
4
|
/** @hidden */
|
|
5
5
|
function getPotential2Prongs(possPerLoop: IPointOnShape[][]) {
|
|
6
|
-
|
|
6
|
+
const for2ProngsArray = [];
|
|
7
7
|
|
|
8
|
-
for (
|
|
9
|
-
|
|
8
|
+
for (const poss of possPerLoop) {
|
|
9
|
+
const for2Prongs = [];
|
|
10
10
|
|
|
11
|
-
for (
|
|
11
|
+
for (const pos of poss) {
|
|
12
12
|
if (!isPosQuiteSharpCorner(pos)) {
|
|
13
13
|
for2Prongs.push(pos);
|
|
14
14
|
}
|
|
@@ -3,12 +3,12 @@ import { IPointOnShape, isPosQuiteSharpCorner } from '../../point-on-shape.js';
|
|
|
3
3
|
|
|
4
4
|
/** @hidden */
|
|
5
5
|
function getSharpCorners(possPerLoop: IPointOnShape[][]) {
|
|
6
|
-
|
|
6
|
+
const sharpCornersPerLoop = [];
|
|
7
7
|
|
|
8
|
-
for (
|
|
9
|
-
|
|
8
|
+
for (const poss of possPerLoop) {
|
|
9
|
+
const sharpCorners = [];
|
|
10
10
|
|
|
11
|
-
for (
|
|
11
|
+
for (const pos of poss) {
|
|
12
12
|
//if (PointOnShape.isQuiteSharpCorner(pos)) {
|
|
13
13
|
if (isPosQuiteSharpCorner(pos)) {
|
|
14
14
|
sharpCorners.push(pos);
|
|
@@ -6,7 +6,7 @@ import { getTotalBy } from './get-total-by.js';
|
|
|
6
6
|
/**
|
|
7
7
|
* @hidden
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
const getTotalAbsoluteCurvature = getTotalBy(
|
|
10
10
|
curve => (
|
|
11
11
|
totalAbsoluteCurvature(curve.ps, [0,1]) +
|
|
12
12
|
Math.abs(getCurvatureAtInterface(curve))
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
* @hidden
|
|
8
8
|
*/
|
|
9
9
|
function getClosestSquaredDistanceToRotatedRect(ps: number[][], p: number[]) {
|
|
10
|
-
|
|
10
|
+
const ds = [0,1,2,3].map(i => squaredDistanceBetweenPointAndLineSegment(
|
|
11
11
|
p,
|
|
12
12
|
[ps[i], ps[(i+1) % 4]]
|
|
13
13
|
)
|
|
14
14
|
);
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const width = squaredDistanceBetween(ps[0], ps[1]);
|
|
17
|
+
const height = squaredDistanceBetween(ps[0], ps[3]);
|
|
18
18
|
|
|
19
19
|
if (ds[0] <= height && ds[2] <= height &&
|
|
20
20
|
ds[1] <= width && ds[3] <= width) {
|
|
@@ -14,9 +14,9 @@ import { compareCps } from '../contact-point.js';
|
|
|
14
14
|
*/
|
|
15
15
|
function getBoundaryPieceBeziers(cpNodes: CpNode[]): BezierPiece[] {
|
|
16
16
|
let cpThis = cpNodes[0];
|
|
17
|
-
|
|
17
|
+
const cpEnd = cpNodes[1];
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
const bezierPieces = [];
|
|
20
20
|
|
|
21
21
|
// As opposed to going around the circle and taking the last exit
|
|
22
22
|
let goStraight = true;
|
|
@@ -29,8 +29,8 @@ function getBoundaryPieceBeziers(cpNodes: CpNode[]): BezierPiece[] {
|
|
|
29
29
|
|
|
30
30
|
goStraight = false;
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const posThis = cpThis .cp.pointOnShape;
|
|
33
|
+
const posNext = cpThis.next.cp.pointOnShape;
|
|
34
34
|
|
|
35
35
|
if (posNext.curve === posThis.curve &&
|
|
36
36
|
//PointOnShape.isQuiteSharpCorner(posThis) &&
|
|
@@ -81,7 +81,7 @@ function addSkippedBeziers(
|
|
|
81
81
|
let curveThis = curveStart;
|
|
82
82
|
do {
|
|
83
83
|
curveThis = curveThis.next;
|
|
84
|
-
|
|
84
|
+
const tEnd = curveThis === curveEnd ? t1 : 1;
|
|
85
85
|
bezierPieces.push({ curve: curveThis, ts: [0, tEnd] });
|
|
86
86
|
} while (curveThis !== curveEnd);
|
|
87
87
|
}
|
|
@@ -8,7 +8,7 @@ import { IPointOnShape } from '../point-on-shape.js';
|
|
|
8
8
|
* @param curve
|
|
9
9
|
*/
|
|
10
10
|
function getContactCirclesAtInterface(curve: Curve): IPointOnShape[] {
|
|
11
|
-
|
|
11
|
+
const { isQuiteSharp, isQuiteDull } = getCornerAtEnd(curve);
|
|
12
12
|
|
|
13
13
|
if (isQuiteSharp) {
|
|
14
14
|
return [new PointOnShape(curve, 1)];
|
|
@@ -2,9 +2,9 @@ import { CpNode } from '../cp-node.js';
|
|
|
2
2
|
import { traverseEdges } from '../traverse-edges.js';
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
/** @
|
|
5
|
+
/** @internal */
|
|
6
6
|
function getEdgesAsArray(cpNode: CpNode) {
|
|
7
|
-
|
|
7
|
+
const cpNodes: CpNode[] = [];
|
|
8
8
|
|
|
9
9
|
traverseEdges(
|
|
10
10
|
cpNode,
|
package/src/mat/get-leaves.ts
CHANGED
|
@@ -3,9 +3,9 @@ import { CpNode } from '../cp-node.js';
|
|
|
3
3
|
|
|
4
4
|
/** @hidden */
|
|
5
5
|
function getLeaves(cpNode: CpNode) {
|
|
6
|
-
|
|
6
|
+
const leaves: CpNode[] = [];
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const cps = cpNode.getAllOnLoop();
|
|
9
9
|
cps.forEach(function(cp) {
|
|
10
10
|
if (cp.isTerminating()) {
|
|
11
11
|
leaves.push(cp);
|
|
@@ -48,28 +48,28 @@ function isAnotherCpCloseby(
|
|
|
48
48
|
// It seems this can be zero else the ordering should be correct
|
|
49
49
|
//const DISTANCE_THRESHOLD = 0;
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const cpTree = cpTrees.get(pos.curve.loop);
|
|
52
|
+
const cpNodes = getNeighbouringPoints(cpTree, pos, order, order2);
|
|
53
53
|
if (!cpNodes[0]) { return false }
|
|
54
54
|
|
|
55
|
-
for (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
for (const cpNode of cpNodes) {
|
|
56
|
+
const pos2 = cpNode.cp.pointOnShape;
|
|
57
|
+
const p1 = pos.p;
|
|
58
|
+
const p2 = pos2.p;
|
|
59
59
|
|
|
60
60
|
if (distanceBetween(p1,p2) > DISTANCE_THRESHOLD) {
|
|
61
61
|
continue;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
const v1 = toUnitVector(fromTo(
|
|
65
65
|
cpNode.cp.pointOnShape.p,
|
|
66
66
|
cpNode.cp.circle.center
|
|
67
67
|
));
|
|
68
|
-
|
|
68
|
+
const v2 = toUnitVector(fromTo(
|
|
69
69
|
p1,
|
|
70
70
|
circle.center
|
|
71
71
|
));
|
|
72
|
-
|
|
72
|
+
const cosTheta = dot(v1,v2);
|
|
73
73
|
|
|
74
74
|
if (cosTheta > ANGLE_THRESHOLD) {
|
|
75
75
|
//console.log(`%c${cosTheta} - ${distanceBetween(p1,p2)}`, `color: ${color}`);
|