flo-mat 3.0.9 → 3.0.10
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 +193 -190
- package/browser/index.min.js +1 -1
- package/node/closest-boundary-point/cull-bezier-pieces.d.ts +5 -4
- package/node/closest-boundary-point/cull-bezier-pieces.js +9 -8
- package/node/closest-boundary-point/cull-bezier-pieces.js.map +1 -1
- package/node/closest-boundary-point/cull-by-loose-bounding-box.d.ts +2 -2
- package/node/closest-boundary-point/cull-by-loose-bounding-box.js +8 -8
- package/node/closest-boundary-point/cull-by-loose-bounding-box.js.map +1 -1
- package/node/closest-boundary-point/cull-by-tight-boundary-box.d.ts +2 -2
- package/node/closest-boundary-point/cull-by-tight-boundary-box.js +8 -8
- package/node/closest-boundary-point/cull-by-tight-boundary-box.js.map +1 -1
- package/node/closest-boundary-point/get-best-distance-squared.d.ts +1 -1
- package/node/closest-boundary-point/get-best-distance-squared.js +6 -6
- package/node/closest-boundary-point/get-best-distance-squared.js.map +1 -1
- package/node/closest-boundary-point/get-close-boundary-points-certified.d.ts +2 -2
- package/node/closest-boundary-point/get-close-boundary-points-certified.js +7 -7
- package/node/closest-boundary-point/get-close-boundary-points-certified.js.map +1 -1
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.d.ts +1 -1
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +11 -16
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
- package/node/cp-node/fs/get-boundary-beziers-between.js +4 -6
- package/node/cp-node/fs/get-boundary-beziers-between.js.map +1 -1
- package/node/cp-node/fs/get-boundary-beziers-to-next.d.ts +10 -1
- package/node/cp-node/fs/get-boundary-beziers-to-next.js +70 -35
- package/node/cp-node/fs/get-boundary-beziers-to-next.js.map +1 -1
- package/node/cp-node/fs/get-salience.js +2 -2
- package/node/cp-node/fs/get-salience.js.map +1 -1
- package/node/cp-node/fs/get-speed.js +0 -1
- package/node/cp-node/fs/get-speed.js.map +1 -1
- package/node/find-2-prong/cull-bezier-pieces.d.ts +4 -4
- package/node/find-2-prong/cull-bezier-pieces.js +9 -9
- package/node/find-2-prong/cull-bezier-pieces.js.map +1 -1
- package/node/find-2-prong/find-2-prong.js +8 -8
- package/node/find-2-prong/find-2-prong.js.map +1 -1
- package/node/find-2-prong/get-initial-bezier-pieces.d.ts +2 -2
- package/node/find-2-prong/get-initial-bezier-pieces.js +2 -2
- package/node/find-2-prong/get-initial-bezier-pieces.js.map +1 -1
- package/node/find-2-prong/reduce-radius.d.ts +1 -1
- package/node/find-2-prong/reduce-radius.js +5 -5
- package/node/find-2-prong/reduce-radius.js.map +1 -1
- package/node/find-3-prong.ts/calc-better-x.d.ts +2 -2
- package/node/find-3-prong.ts/calc-better-x.js +3 -3
- package/node/find-3-prong.ts/calc-better-x.js.map +1 -1
- package/node/find-3-prong.ts/calc-initial-3-prong-center.d.ts +2 -2
- package/node/find-3-prong.ts/calc-initial-3-prong-center.js +3 -3
- package/node/find-3-prong.ts/calc-initial-3-prong-center.js.map +1 -1
- package/node/find-3-prong.ts/find-3-prong-for-delta3s.d.ts +2 -2
- package/node/find-3-prong.ts/find-3-prong-for-delta3s.js +16 -16
- package/node/find-3-prong.ts/find-3-prong-for-delta3s.js.map +1 -1
- package/node/find-3-prong.ts/find-3-prong.js +2 -2
- package/node/find-3-prong.ts/find-3-prong.js.map +1 -1
- package/node/find-3-prong.ts/get-closest-points.d.ts +2 -2
- package/node/find-3-prong.ts/get-closest-points.js +4 -4
- package/node/find-3-prong.ts/get-closest-points.js.map +1 -1
- package/node/mat/get-boundary-piece-beziers.js +7 -7
- package/node/mat/get-boundary-piece-beziers.js.map +1 -1
- package/node/sat/cull.d.ts +7 -5
- package/node/sat/cull.js +7 -4
- package/node/sat/cull.js.map +1 -1
- package/node/sat/to-scale-axis.d.ts +3 -2
- package/node/sat/to-scale-axis.js +3 -2
- package/node/sat/to-scale-axis.js.map +1 -1
- package/package.json +5 -5
- package/src/closest-boundary-point/cull-bezier-pieces.ts +12 -11
- package/src/closest-boundary-point/cull-by-loose-bounding-box.ts +8 -8
- package/src/closest-boundary-point/cull-by-tight-boundary-box.ts +8 -8
- package/src/closest-boundary-point/get-best-distance-squared.ts +6 -6
- package/src/closest-boundary-point/get-close-boundary-points-certified.ts +8 -8
- package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +12 -18
- package/src/cp-node/fs/get-boundary-beziers-between.ts +6 -7
- package/src/cp-node/fs/get-boundary-beziers-to-next.ts +79 -53
- package/src/cp-node/fs/get-salience.ts +2 -2
- package/src/cp-node/fs/get-speed.ts +1 -6
- package/src/curve/curve.ts +5 -5
- package/src/debug/functions/draw-elem/two-prong.ts +40 -40
- package/src/debug/functions/two-prong.ts +195 -195
- package/src/debug/two-prong-for-debugging.ts +26 -26
- package/src/find-2-prong/add-debug-info.ts +38 -38
- package/src/find-2-prong/cull-bezier-pieces.ts +10 -10
- package/src/find-2-prong/find-2-prong.ts +8 -8
- package/src/find-2-prong/get-initial-bezier-pieces.ts +2 -2
- package/src/find-2-prong/reduce-radius.ts +5 -5
- package/src/find-3-prong.ts/calc-better-x.ts +3 -3
- package/src/find-3-prong.ts/calc-initial-3-prong-center.ts +3 -3
- package/src/find-3-prong.ts/find-3-prong-for-delta3s.ts +16 -16
- package/src/find-3-prong.ts/find-3-prong.ts +2 -2
- package/src/find-3-prong.ts/get-closest-points.ts +4 -4
- package/src/find-mat/add-2-prongs-by-error.ts +7 -7
- package/src/index.ts +1 -1
- package/src/mat/get-boundary-piece-beziers.ts +7 -7
- package/src/mat/get-two-prong-type.ts +8 -8
- package/src/sat/cull.ts +10 -7
- package/src/sat/to-scale-axis.ts +18 -17
- package/src/utils/bezier-piece-to-bezier.ts +7 -7
- package/node/cp-node/fs/cp-nodes-to-boundary-beziers.d.ts +0 -3
- package/node/cp-node/fs/cp-nodes-to-boundary-beziers.js +0 -6
- package/node/cp-node/fs/cp-nodes-to-boundary-beziers.js.map +0 -1
- package/src/closest-boundary-point/get-closest-boundary-point-certified.ts +0 -70
- package/src/cp-node/fs/cp-nodes-to-boundary-beziers.ts +0 -10
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { distanceBetween, fromTo, interpolate, rotate, translate } from 'flo-vector2d';
|
|
2
2
|
import { getOsculatingCircle } from '../point-on-shape/get-osculating-circle.js';
|
|
3
3
|
import { findEquidistantPointOnLineDd } from './find-equidistant-point-on-line-dd.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getInitialCurvePieces } from './get-initial-bezier-pieces.js';
|
|
5
5
|
import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-close-boundary-points-certified.js';
|
|
6
6
|
import { reduceRadius } from './reduce-radius.js';
|
|
7
7
|
import { squaredDistanceBetweenDd } from './squared-distance-between-dd.js';
|
|
8
|
-
import {
|
|
8
|
+
import { cullCurvePieces2 } from './cull-bezier-pieces.js';
|
|
9
9
|
import { add1Prong } from './add-1-prong.js';
|
|
10
10
|
import { createPos } from '../point-on-shape/create-pos.js';
|
|
11
11
|
import { calcSeperationTolerance } from './calc-seperation-tolerance.js';
|
|
@@ -47,12 +47,12 @@ function find2Prong(meta, isHoleClosing, for1Prong, angle, y) {
|
|
|
47
47
|
const p = y.p;
|
|
48
48
|
// The boundary piece that should contain the other point of
|
|
49
49
|
// the 2-prong circle. (Defined by start and end points).
|
|
50
|
-
let
|
|
51
|
-
// console.log(
|
|
50
|
+
let curvePieces = getInitialCurvePieces(angle, isHoleClosing, loop, loops, meta, y, { center: xO, radius: rO });
|
|
51
|
+
// console.log(curvePieces.length);
|
|
52
52
|
/** The center of the two-prong (successively refined) */
|
|
53
53
|
let x = xO;
|
|
54
54
|
// The lines below is an optimization.
|
|
55
|
-
const r_ = sqrt(reduceRadius(maxCoordinate,
|
|
55
|
+
const r_ = sqrt(reduceRadius(maxCoordinate, curvePieces, p, xO));
|
|
56
56
|
if (rO > r_) {
|
|
57
57
|
x = interpolate(p, xO, r_ / rO);
|
|
58
58
|
}
|
|
@@ -63,11 +63,11 @@ function find2Prong(meta, isHoleClosing, for1Prong, angle, y) {
|
|
|
63
63
|
while (i < MAX_ITERATIONS) {
|
|
64
64
|
const xy = squaredDistanceBetweenDd(x, y.p);
|
|
65
65
|
if (i < 2) {
|
|
66
|
-
|
|
66
|
+
curvePieces = cullCurvePieces2(curvePieces, x, xy);
|
|
67
67
|
}
|
|
68
68
|
const pow = max(0, ceil(log2(maxCoordinate / xy))) + 1; // determines accuracy
|
|
69
69
|
// console.log(pow);
|
|
70
|
-
const _zs = getCloseBoundaryPointsCertified(pow,
|
|
70
|
+
const _zs = getCloseBoundaryPointsCertified(pow, curvePieces, x, y.curve, y.t, for1Prong && i == 0 && rO !== 1 / minCurvature, angle).map(info => createPos(info.curve, info.t, false));
|
|
71
71
|
let maxD = Number.NEGATIVE_INFINITY;
|
|
72
72
|
let maxPos = undefined;
|
|
73
73
|
zs = [];
|
|
@@ -125,7 +125,7 @@ function find2Prong(meta, isHoleClosing, for1Prong, angle, y) {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
const circle = { center: x, radius: distanceBetween(x, z.p) };
|
|
128
|
-
// if (typeof _debug_ !== 'undefined') { addDebugInfo(
|
|
128
|
+
// if (typeof _debug_ !== 'undefined') { addDebugInfo(curvePieces, false, x, y, z, circle!, δ!, xs, isHoleClosing); }
|
|
129
129
|
// return { circle, zs };
|
|
130
130
|
// zs = zs.filter(z => z !== undefined)
|
|
131
131
|
return { circle, zs: [z] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-2-prong.js","sourceRoot":"","sources":["../../src/find-2-prong/find-2-prong.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"find-2-prong.js","sourceRoot":"","sources":["../../src/find-2-prong/find-2-prong.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@ import { PointOnShape } from '../point-on-shape/point-on-shape.js';
|
|
|
4
4
|
import { Circle } from '../geometry/circle.js';
|
|
5
5
|
import { MatMeta } from '../index.js';
|
|
6
6
|
/** @internal */
|
|
7
|
-
declare function
|
|
8
|
-
export {
|
|
7
|
+
declare function getInitialCurvePieces(angle: number, isHoleClosing: boolean, loop: Loop, loops: Loop[], meta: MatMeta, y: PointOnShape, circle: Circle): CurvePiece[];
|
|
8
|
+
export { getInitialCurvePieces };
|
|
@@ -4,7 +4,7 @@ import { calcPosOrder } from '../point-on-shape/calc-pos-order.js';
|
|
|
4
4
|
import { isPosCorner } from '../point-on-shape/is-pos-corner.js';
|
|
5
5
|
import { getPosCorner } from '../point-on-shape/get-pos-corner.js';
|
|
6
6
|
/** @internal */
|
|
7
|
-
function
|
|
7
|
+
function getInitialCurvePieces(angle, isHoleClosing, loop, loops,
|
|
8
8
|
// cpTrees: Map<Loop,LlRbTree<CpNode>>,
|
|
9
9
|
meta, y, circle) {
|
|
10
10
|
const { cpTrees } = meta;
|
|
@@ -31,5 +31,5 @@ meta, y, circle) {
|
|
|
31
31
|
}
|
|
32
32
|
return getBoundaryPieceBeziers([cpNode, cpNode]);
|
|
33
33
|
}
|
|
34
|
-
export {
|
|
34
|
+
export { getInitialCurvePieces };
|
|
35
35
|
//# sourceMappingURL=get-initial-bezier-pieces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-initial-bezier-pieces.js","sourceRoot":"","sources":["../../src/find-2-prong/get-initial-bezier-pieces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAI/E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAInE,gBAAgB;AAChB,SAAS,
|
|
1
|
+
{"version":3,"file":"get-initial-bezier-pieces.js","sourceRoot":"","sources":["../../src/find-2-prong/get-initial-bezier-pieces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAI/E,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAInE,gBAAgB;AAChB,SAAS,qBAAqB,CACtB,KAAa,EACb,aAAsB,EACtB,IAAU,EACV,KAAa;AACb,uCAAuC;AACvC,IAAa,EACb,CAAe,EACf,MAAc;IAElB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzB,IAAI,aAAa,EAAE,CAAC;QAChB,OAAO,KAAK;aACX,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;aAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM;aACvB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM;QAClD,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;YACtB,CAAC,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACX,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QACP,8DAA8D;QAC9D,kEAAkE;QAClE,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAC/B,CAAC;QACC,OAAO,IAAI,CAAC,MAAM;aACjB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,uBAAuB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAGD,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
|
|
@@ -4,5 +4,5 @@ import { CurvePiece } from '../mat/curve-piece.js';
|
|
|
4
4
|
*
|
|
5
5
|
* Reduces the circle radius initially as an optimization step.
|
|
6
6
|
*/
|
|
7
|
-
declare function reduceRadius(extreme: number,
|
|
7
|
+
declare function reduceRadius(extreme: number, curvePieces: CurvePiece[], p: number[], x: number[]): number;
|
|
8
8
|
export { reduceRadius };
|
|
@@ -5,16 +5,16 @@ import { dot, lineLineIntersection, squaredDistanceBetween } from "flo-vector2d"
|
|
|
5
5
|
*
|
|
6
6
|
* Reduces the circle radius initially as an optimization step.
|
|
7
7
|
*/
|
|
8
|
-
function reduceRadius(extreme,
|
|
8
|
+
function reduceRadius(extreme, curvePieces, p, x) {
|
|
9
9
|
const TOLERANCE = 1 + 2 ** -10;
|
|
10
10
|
let minRadius = Number.POSITIVE_INFINITY;
|
|
11
|
-
for (let i = 0; i <
|
|
12
|
-
const
|
|
13
|
-
const ps =
|
|
11
|
+
for (let i = 0; i < curvePieces.length; i++) {
|
|
12
|
+
const curvePiece = curvePieces[i];
|
|
13
|
+
const ps = curvePiece.curve.ps;
|
|
14
14
|
// let min = Number.POSITIVE_INFINITY;
|
|
15
15
|
const num = 2;
|
|
16
16
|
for (let j = 0; j < (num + 1); j++) {
|
|
17
|
-
const p_ = evalDeCasteljau(ps,
|
|
17
|
+
const p_ = evalDeCasteljau(ps, curvePiece.ts[j / num]);
|
|
18
18
|
const cc = getCircleCenterFrom2PointsAndNormal(extreme, p, x, p_);
|
|
19
19
|
if (cc) {
|
|
20
20
|
let r = squaredDistanceBetween(p, cc);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reduce-radius.js","sourceRoot":"","sources":["../../src/find-2-prong/reduce-radius.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAIjF;;;;GAIG;AACH,SAAS,YAAY,CACb,OAAe,EACf,
|
|
1
|
+
{"version":3,"file":"reduce-radius.js","sourceRoot":"","sources":["../../src/find-2-prong/reduce-radius.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,13 +5,13 @@ import { CurvePiece } from '../mat/curve-piece.js';
|
|
|
5
5
|
* Find new x and ps that are a better estimate of the 3-prong circle.
|
|
6
6
|
* The potential function, V, is defined as the distance to the actual 3 prong
|
|
7
7
|
* circle center.
|
|
8
|
-
* @param
|
|
8
|
+
* @param curvePiece3s The three boundary pieces, each of which should contain
|
|
9
9
|
* a point of the 3-prong to be found.
|
|
10
10
|
* @param x The currently best guess at the center of the 3-prong circle.
|
|
11
11
|
* @param vectorToZeroV
|
|
12
12
|
* @param extreme
|
|
13
13
|
*/
|
|
14
|
-
declare function calcBetterX(
|
|
14
|
+
declare function calcBetterX(curvePiece3s: CurvePiece[][], x: number[], vectorToZeroV: number[]): {
|
|
15
15
|
newX: number[];
|
|
16
16
|
newV: number;
|
|
17
17
|
newPoss: PointOnShape[];
|
|
@@ -5,13 +5,13 @@ import { getClosestPoints } from './get-closest-points.js';
|
|
|
5
5
|
* Find new x and ps that are a better estimate of the 3-prong circle.
|
|
6
6
|
* The potential function, V, is defined as the distance to the actual 3 prong
|
|
7
7
|
* circle center.
|
|
8
|
-
* @param
|
|
8
|
+
* @param curvePiece3s The three boundary pieces, each of which should contain
|
|
9
9
|
* a point of the 3-prong to be found.
|
|
10
10
|
* @param x The currently best guess at the center of the 3-prong circle.
|
|
11
11
|
* @param vectorToZeroV
|
|
12
12
|
* @param extreme
|
|
13
13
|
*/
|
|
14
|
-
function calcBetterX(
|
|
14
|
+
function calcBetterX(curvePiece3s, x, vectorToZeroV) {
|
|
15
15
|
const V = len(vectorToZeroV);
|
|
16
16
|
let nu = 1;
|
|
17
17
|
let better;
|
|
@@ -22,7 +22,7 @@ function calcBetterX(bezierPiece3s, x, vectorToZeroV) {
|
|
|
22
22
|
do {
|
|
23
23
|
const shift = scale(vectorToZeroV, nu);
|
|
24
24
|
newX = translate(shift, x);
|
|
25
|
-
newPoss = getClosestPoints(newX,
|
|
25
|
+
newPoss = getClosestPoints(newX, curvePiece3s);
|
|
26
26
|
// Point of zero V
|
|
27
27
|
const newCircleCenter = circumCenter(newPoss.map(pos => pos.p));
|
|
28
28
|
const newVectorToZeroV = fromTo(newX, newCircleCenter);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calc-better-x.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/calc-better-x.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CACZ,
|
|
1
|
+
{"version":3,"file":"calc-better-x.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/calc-better-x.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D;;;;;;;;;;GAUG;AACH,SAAS,WAAW,CACZ,YAA4B,EAC5B,CAAW,EACX,aAAuB;IAE3B,MAAM,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IAE7B,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,MAAM,CAAC;IACX,IAAI,IAAI,CAAC;IACT,IAAI,OAAuB,CAAC;IAC5B,IAAI,IAAI,CAAC;IACT,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;IACvB,GAAG,CAAC;QACA,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAG3B,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAE/C,kBAAkB;QAClB,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACvD,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE7B,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;QAElB,EAAE,GAAG,EAAE,GAAC,CAAC,CAAC;QAEV,CAAC,EAAE,CAAC;IACR,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;IAE3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAClC,CAAC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -6,8 +6,8 @@ import { CurvePiece } from '../mat/curve-piece.js';
|
|
|
6
6
|
* must be within the shape.
|
|
7
7
|
* @param δ3s - The three boundary pieces of which we need to find the three
|
|
8
8
|
* 3-prong points.
|
|
9
|
-
* @param
|
|
9
|
+
* @param curvePiece3s
|
|
10
10
|
* @param extreme
|
|
11
11
|
*/
|
|
12
|
-
declare function calcInitial3ProngCenter(maxCoordinate: number, δ3s: CpNode[][],
|
|
12
|
+
declare function calcInitial3ProngCenter(maxCoordinate: number, δ3s: CpNode[][], curvePiece3s: CurvePiece[][]): number[];
|
|
13
13
|
export { calcInitial3ProngCenter };
|
|
@@ -8,14 +8,14 @@ const { max, ceil, log2 } = Math;
|
|
|
8
8
|
* must be within the shape.
|
|
9
9
|
* @param δ3s - The three boundary pieces of which we need to find the three
|
|
10
10
|
* 3-prong points.
|
|
11
|
-
* @param
|
|
11
|
+
* @param curvePiece3s
|
|
12
12
|
* @param extreme
|
|
13
13
|
*/
|
|
14
|
-
function calcInitial3ProngCenter(maxCoordinate, δ3s,
|
|
14
|
+
function calcInitial3ProngCenter(maxCoordinate, δ3s, curvePiece3s) {
|
|
15
15
|
const circle = δ3s[0][0].cp.circle;
|
|
16
16
|
const twoProngCircleCenter = circle.center;
|
|
17
17
|
const pow = max(0, ceil(log2(maxCoordinate / circle.radius))) + 1; // determines accuracy;
|
|
18
|
-
const pos = getCloseBoundaryPointsCertified(pow,
|
|
18
|
+
const pos = getCloseBoundaryPointsCertified(pow, curvePiece3s[1], twoProngCircleCenter)[0];
|
|
19
19
|
const meanPoints = [
|
|
20
20
|
δ3s[0][0].cp.pointOnShape.p,
|
|
21
21
|
pos.p,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calc-initial-3-prong-center.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/calc-initial-3-prong-center.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AAGnH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAEjC;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CACxB,aAAqB,EACrB,GAAe,EACf,
|
|
1
|
+
{"version":3,"file":"calc-initial-3-prong-center.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/calc-initial-3-prong-center.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EAAE,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AAGnH,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAEjC;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CACxB,aAAqB,EACrB,GAAe,EACf,YAA4B;IAEhC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;IACnC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IAE3C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,aAAa,GAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,uBAAuB;IACxF,MAAM,GAAG,GAAG,+BAA+B,CACvC,GAAG,EACH,YAAY,CAAC,CAAC,CAAC,EACf,oBAAoB,CACvB,CAAC,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG;QACf,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC3B,GAAG,CAAC,CAAC;QACL,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;KAC9B,CAAC;IAEF,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAGD,OAAO,EAAE,uBAAuB,EAAE,CAAA"}
|
|
@@ -6,11 +6,11 @@ import { PointOnShape } from '../point-on-shape/point-on-shape.js';
|
|
|
6
6
|
* Finds a 3-prong using only the 3 given δs.
|
|
7
7
|
* @param δs The boundary pieces
|
|
8
8
|
* @param idx δ identifier
|
|
9
|
-
* @param
|
|
9
|
+
* @param curvePiecess
|
|
10
10
|
* @param maxCoordinate The maximum coordinate value used to calculate floating point
|
|
11
11
|
* tolerances.
|
|
12
12
|
*/
|
|
13
|
-
declare function find3ProngForDelta3s(δs: CpNode[][], idx: number, k: number,
|
|
13
|
+
declare function find3ProngForDelta3s(δs: CpNode[][], idx: number, k: number, curvePiecess: CurvePiece[][], maxCoordinate: number): {
|
|
14
14
|
poss: PointOnShape[];
|
|
15
15
|
circle: {
|
|
16
16
|
center: number[];
|
|
@@ -16,11 +16,11 @@ const calcVectorToZeroV_StraightToIt = fromTo;
|
|
|
16
16
|
* Finds a 3-prong using only the 3 given δs.
|
|
17
17
|
* @param δs The boundary pieces
|
|
18
18
|
* @param idx δ identifier
|
|
19
|
-
* @param
|
|
19
|
+
* @param curvePiecess
|
|
20
20
|
* @param maxCoordinate The maximum coordinate value used to calculate floating point
|
|
21
21
|
* tolerances.
|
|
22
22
|
*/
|
|
23
|
-
function find3ProngForDelta3s(δs, idx, k,
|
|
23
|
+
function find3ProngForDelta3s(δs, idx, k, curvePiecess, maxCoordinate) {
|
|
24
24
|
const TOLERANCE = 2 ** -32 * maxCoordinate;
|
|
25
25
|
const MAX_ITERATIONS = 10;
|
|
26
26
|
const δs_ = [
|
|
@@ -28,34 +28,34 @@ function find3ProngForDelta3s(δs, idx, k, bezierPiecess, maxCoordinate) {
|
|
|
28
28
|
δs[idx],
|
|
29
29
|
δs[δs.length - 1]
|
|
30
30
|
];
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
const curvePieces_ = [
|
|
32
|
+
curvePiecess[0],
|
|
33
|
+
curvePiecess[idx],
|
|
34
|
+
curvePiecess[δs.length - 1]
|
|
35
35
|
];
|
|
36
36
|
const δ3ss = [
|
|
37
37
|
[δs_[0], δs_[1], δs_[2]],
|
|
38
38
|
[δs_[1], δs_[2], δs_[0]],
|
|
39
39
|
[δs_[2], δs_[0], δs_[1]],
|
|
40
40
|
];
|
|
41
|
-
const
|
|
42
|
-
[
|
|
43
|
-
[
|
|
44
|
-
[
|
|
41
|
+
const curvePiecess_ = [
|
|
42
|
+
[curvePieces_[0], curvePieces_[1], curvePieces_[2]],
|
|
43
|
+
[curvePieces_[1], curvePieces_[2], curvePieces_[0]],
|
|
44
|
+
[curvePieces_[2], curvePieces_[0], curvePieces_[1]],
|
|
45
45
|
];
|
|
46
46
|
const δ3s = δ3ss[k];
|
|
47
|
-
const
|
|
47
|
+
const curvePiece3s = curvePiecess_[k];
|
|
48
48
|
if (isSharp(δ3s[0][0])) {
|
|
49
49
|
return undefined;
|
|
50
50
|
}
|
|
51
51
|
let poss = undefined;
|
|
52
52
|
let circumCenter_;
|
|
53
53
|
let j = 0; // Safeguard for slow convergence
|
|
54
|
-
let x = calcInitial3ProngCenter(maxCoordinate, δ3s,
|
|
54
|
+
let x = calcInitial3ProngCenter(maxCoordinate, δ3s, curvePiece3s);
|
|
55
55
|
let tolerance = Number.POSITIVE_INFINITY;
|
|
56
56
|
while (tolerance > TOLERANCE && j < MAX_ITERATIONS) {
|
|
57
57
|
j++;
|
|
58
|
-
poss = getClosestPoints(x,
|
|
58
|
+
poss = getClosestPoints(x, curvePiece3s);
|
|
59
59
|
if (!Number.isFinite(x[0]) || !Number.isFinite(x[1])) {
|
|
60
60
|
// TODO - the code can be cleaned up and sped up a lot if we don't
|
|
61
61
|
// use this function as is but instead use δs[0] and δs[2] as is
|
|
@@ -72,7 +72,7 @@ function find3ProngForDelta3s(δs, idx, k, bezierPiecess, maxCoordinate) {
|
|
|
72
72
|
// loop. This check, for instance, would be eliminated completely.
|
|
73
73
|
return undefined;
|
|
74
74
|
}
|
|
75
|
-
const upds = calcBetterX(
|
|
75
|
+
const upds = calcBetterX(curvePiece3s, x, vectorToZeroV);
|
|
76
76
|
x = upds.newX;
|
|
77
77
|
poss = upds.newPoss;
|
|
78
78
|
const V = len(vectorToZeroV); // The 'potential'
|
|
@@ -133,9 +133,9 @@ function find3ProngForDelta3s(δs, idx, k, bezierPiecess, maxCoordinate) {
|
|
|
133
133
|
// candidate for the 3-prong.
|
|
134
134
|
//-------------------------------------------------------------------------
|
|
135
135
|
const closestDs = [];
|
|
136
|
-
for (let i = 0; i <
|
|
136
|
+
for (let i = 0; i < curvePiecess.length; i++) {
|
|
137
137
|
const p = getCloseBoundaryPointsCertified(5, // TODO - see find-2-prong
|
|
138
|
-
|
|
138
|
+
curvePiecess[i], x)[0];
|
|
139
139
|
closestDs.push(distanceBetween(p.p, x));
|
|
140
140
|
}
|
|
141
141
|
const closestD = Math.min(...closestDs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-3-prong-for-delta3s.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/find-3-prong-for-delta3s.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EACzE,KAAK,EACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AACnH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;AAG7B,gBAAgB;AAChB,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAG9C;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CACrB,EAAc,EACd,GAAW,EACX,CAAS,EACT,
|
|
1
|
+
{"version":3,"file":"find-3-prong-for-delta3s.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/find-3-prong-for-delta3s.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,13 @@ import { getBoundaryPieceBeziers } from '../mat/get-boundary-piece-beziers.js';
|
|
|
8
8
|
* tolerances.
|
|
9
9
|
*/
|
|
10
10
|
function find3Prong(δs, extreme) {
|
|
11
|
-
const
|
|
11
|
+
const curvePiecess = δs.map(getBoundaryPieceBeziers);
|
|
12
12
|
// The best candidate amongst the different 'permutations' of the given δs.
|
|
13
13
|
let threeProng;
|
|
14
14
|
let smallestError = Number.POSITIVE_INFINITY;
|
|
15
15
|
for (let i = 1; i < δs.length - 1; i++) {
|
|
16
16
|
for (let k = 0; k < 3; k++) {
|
|
17
|
-
const threeProngInfo = find3ProngForDelta3s(δs, i, k,
|
|
17
|
+
const threeProngInfo = find3ProngForDelta3s(δs, i, k, curvePiecess, extreme);
|
|
18
18
|
if (!threeProngInfo) {
|
|
19
19
|
continue;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-3-prong.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/find-3-prong.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,EAAc,EAAE,OAAe;IAEhC,MAAM,
|
|
1
|
+
{"version":3,"file":"find-3-prong.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/find-3-prong.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,EAAc,EAAE,OAAe;IAEhC,MAAM,YAAY,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAErD,2EAA2E;IAC3E,IAAI,UAIA,CAAC;IACL,IAAI,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,EAAE,CAAC,MAAM,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,cAAc,GACnB,oBAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,cAAc,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAElC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC;YAE1D,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;gBAC3B,aAAa,GAAG,KAAK,CAAC;gBAEtB,UAAU,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAsB,EAAE,GAAG,EAAE,CAAC;YAC5D,CAAC;QACF,CAAC;IACF,CAAC;IAGD,OAAO,UAAW,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -2,8 +2,8 @@ import { CurvePiece } from '../mat/curve-piece.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* @internal
|
|
4
4
|
* @param x
|
|
5
|
-
* @param
|
|
5
|
+
* @param curvePiece3s
|
|
6
6
|
* @param extreme
|
|
7
7
|
*/
|
|
8
|
-
declare function getClosestPoints(x: number[],
|
|
8
|
+
declare function getClosestPoints(x: number[], curvePiece3s: CurvePiece[][]): import("../index.js").PointOnShape[];
|
|
9
9
|
export { getClosestPoints };
|
|
@@ -2,13 +2,13 @@ import { getCloseBoundaryPointsCertified } from '../closest-boundary-point/get-c
|
|
|
2
2
|
/**
|
|
3
3
|
* @internal
|
|
4
4
|
* @param x
|
|
5
|
-
* @param
|
|
5
|
+
* @param curvePiece3s
|
|
6
6
|
* @param extreme
|
|
7
7
|
*/
|
|
8
|
-
function getClosestPoints(x,
|
|
9
|
-
return
|
|
8
|
+
function getClosestPoints(x, curvePiece3s) {
|
|
9
|
+
return curvePiece3s.map(curvePieces => {
|
|
10
10
|
return getCloseBoundaryPointsCertified(5, // TODO - see find-2-prong
|
|
11
|
-
|
|
11
|
+
curvePieces, x)[0];
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
14
|
export { getClosestPoints };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-closest-points.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/get-closest-points.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AAGnH;;;;;GAKG;AACH,SAAS,gBAAgB,CACjB,CAAW,EACX,
|
|
1
|
+
{"version":3,"file":"get-closest-points.js","sourceRoot":"","sources":["../../src/find-3-prong.ts/get-closest-points.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kEAAkE,CAAC;AAGnH;;;;;GAKG;AACH,SAAS,gBAAgB,CACjB,CAAW,EACX,YAA4B;IAEhC,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;QAClC,OAAO,+BAA+B,CAClC,CAAC,EAAG,0BAA0B;QAC9B,WAAW,EAAE,CAAC,CACjB,CAAC,CAAC,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;AACP,CAAC;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -11,7 +11,7 @@ import { compareCps } from '../contact-point/contact-point.js';
|
|
|
11
11
|
function getBoundaryPieceBeziers(cpNodes) {
|
|
12
12
|
let cpThis = cpNodes[0];
|
|
13
13
|
const cpEnd = cpNodes[1];
|
|
14
|
-
const
|
|
14
|
+
const curvePieces = [];
|
|
15
15
|
// As opposed to going around the circle and taking the last exit
|
|
16
16
|
let goStraight = true;
|
|
17
17
|
do {
|
|
@@ -30,28 +30,28 @@ function getBoundaryPieceBeziers(cpNodes) {
|
|
|
30
30
|
}
|
|
31
31
|
else if (posNext.curve === posThis.curve &&
|
|
32
32
|
compareCps(cpThis.next.cp, cpThis.cp) > 0) {
|
|
33
|
-
|
|
33
|
+
curvePieces.push({ curve: posThis.curve, ts: [posThis.t, posNext.t] });
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
|
-
|
|
36
|
+
curvePieces.push({ curve: posThis.curve, ts: [posThis.t, 1] });
|
|
37
37
|
if (posThis.curve.loop === posNext.curve.loop) {
|
|
38
|
-
addSkippedBeziers(
|
|
38
|
+
addSkippedBeziers(curvePieces, posThis.curve, posNext.curve, posNext.t);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
cpThis = cpThis.next;
|
|
42
42
|
} while (cpThis !== cpEnd);
|
|
43
|
-
return
|
|
43
|
+
return curvePieces;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* @internal
|
|
47
47
|
* Adds pieces of skipped beziers
|
|
48
48
|
*/
|
|
49
|
-
function addSkippedBeziers(
|
|
49
|
+
function addSkippedBeziers(curvePieces, curveStart, curveEnd, t1) {
|
|
50
50
|
let curveThis = curveStart;
|
|
51
51
|
do {
|
|
52
52
|
curveThis = curveThis.next;
|
|
53
53
|
const tEnd = curveThis === curveEnd ? t1 : 1;
|
|
54
|
-
|
|
54
|
+
curvePieces.push({ curve: curveThis, ts: [0, tEnd] });
|
|
55
55
|
} while (curveThis !== curveEnd);
|
|
56
56
|
}
|
|
57
57
|
export { getBoundaryPieceBeziers };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-boundary-piece-beziers.js","sourceRoot":"","sources":["../../src/mat/get-boundary-piece-beziers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAG/D;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,OAAiB;IAC9C,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"get-boundary-piece-beziers.js","sourceRoot":"","sources":["../../src/mat/get-boundary-piece-beziers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAG/D;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,OAAiB;IAC9C,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1B,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,iEAAiE;IACjE,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC;QACA,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,UAAU,GAAG,IAAI,CAAC;YAClB,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB;YAC/C,SAAS;QACb,CAAC;QAED,UAAU,GAAG,KAAK,CAAC;QAEnB,MAAM,OAAO,GAAG,MAAM,CAAM,EAAE,CAAC,YAAY,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;QAE5C,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YAC/B,qBAAqB,CAAC,OAAO,CAAC;YAC9B,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YAEjC,aAAa;QACjB,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YAC/B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAEnD,WAAW,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,WAAW,CAAC,IAAI,CACZ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAC/C,CAAC;YAEF,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5C,iBAAiB,CACT,WAAW,EACX,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,CAAC,CAChB,CAAC;YACN,CAAC;QACL,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC,QAAQ,MAAM,KAAK,KAAK,EAAE;IAG3B,OAAO,WAAW,CAAC;AACvB,CAAC;AAGD;;;GAGG;AACH,SAAS,iBAAiB,CAClB,WAAyB,EACzB,UAAiB,EACjB,QAAe,EACf,EAAU;IAEd,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,GAAG,CAAC;QACA,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,QAAQ,SAAS,KAAK,QAAQ,EAAE;AACrC,CAAC;AAGD,OAAO,EAAE,uBAAuB,EAAE,CAAA"}
|
package/node/sat/cull.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { CpNode } from '../cp-node/cp-node.js';
|
|
2
|
-
import { DualSet } from '../utils/dual-set.js';
|
|
1
|
+
import type { CpNode } from '../cp-node/cp-node.js';
|
|
2
|
+
import type { DualSet } from '../utils/dual-set.js';
|
|
3
3
|
/**
|
|
4
|
-
* @internal
|
|
5
4
|
* Returns the set of Vertices passing the following test: walk the MAT tree and
|
|
6
5
|
* keep all Vertices not in the current cull set and any Vertices that have a
|
|
7
6
|
* non-culled node further down the line toward the tree leaves.
|
|
8
|
-
*
|
|
9
|
-
* @param
|
|
7
|
+
*
|
|
8
|
+
* @param culls the `CpNode`s (referred to by circles) that should be culled
|
|
9
|
+
* @param maxCpNode the start `CpNode` which must represent the maximal vertex
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
10
12
|
*/
|
|
11
13
|
declare function cull(culls: DualSet<number, number>, maxCpNode: CpNode): void;
|
|
12
14
|
export { cull };
|
package/node/sat/cull.js
CHANGED
|
@@ -4,8 +4,9 @@ import { isTerminating } from '../cp-node/fs/is-terminating.js';
|
|
|
4
4
|
import { DualSetFs } from '../utils/dual-set.js';
|
|
5
5
|
const { isOnSameCircle } = CpNodeFs;
|
|
6
6
|
/**
|
|
7
|
+
* Returns the set of non-trivial forward edges starting from the given `CpNode`.
|
|
7
8
|
*
|
|
8
|
-
* @param cpStart
|
|
9
|
+
* @param cpStart the start `CpNode`
|
|
9
10
|
*/
|
|
10
11
|
function getNonTrivialForwardEdges(cpStart) {
|
|
11
12
|
let cpNode = cpStart;
|
|
@@ -23,12 +24,14 @@ function getNonTrivialForwardEdges(cpStart) {
|
|
|
23
24
|
return cps;
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
|
-
* @internal
|
|
27
27
|
* Returns the set of Vertices passing the following test: walk the MAT tree and
|
|
28
28
|
* keep all Vertices not in the current cull set and any Vertices that have a
|
|
29
29
|
* non-culled node further down the line toward the tree leaves.
|
|
30
|
-
*
|
|
31
|
-
* @param
|
|
30
|
+
*
|
|
31
|
+
* @param culls the `CpNode`s (referred to by circles) that should be culled
|
|
32
|
+
* @param maxCpNode the start `CpNode` which must represent the maximal vertex
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
32
35
|
*/
|
|
33
36
|
function cull(culls, maxCpNode) {
|
|
34
37
|
const leaves = getLeaves(maxCpNode);
|
package/node/sat/cull.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/sat/cull.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cull.js","sourceRoot":"","sources":["../../src/sat/cull.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,9 @@ import { Mat } from '../mat/mat.js';
|
|
|
8
8
|
* boundary of the shape. The SAT is a simplification of the MAT that preserves
|
|
9
9
|
* less detail the higher the applied scale factor. The severity at which noise
|
|
10
10
|
* are removed depends on the local scale of the shape.
|
|
11
|
-
*
|
|
12
|
-
* @param
|
|
11
|
+
*
|
|
12
|
+
* @param mat the Medial Axis Transform (MAT) on which to apply the SAT
|
|
13
|
+
* @param s the scale factor >= 1 (e.g. 1.3)
|
|
13
14
|
*/
|
|
14
15
|
declare function toScaleAxis(mat: Mat, s: number): Mat;
|
|
15
16
|
export { toScaleAxis };
|
|
@@ -13,8 +13,9 @@ import { getSatCulls } from './get-sat-culls.js';
|
|
|
13
13
|
* boundary of the shape. The SAT is a simplification of the MAT that preserves
|
|
14
14
|
* less detail the higher the applied scale factor. The severity at which noise
|
|
15
15
|
* are removed depends on the local scale of the shape.
|
|
16
|
-
*
|
|
17
|
-
* @param
|
|
16
|
+
*
|
|
17
|
+
* @param mat the Medial Axis Transform (MAT) on which to apply the SAT
|
|
18
|
+
* @param s the scale factor >= 1 (e.g. 1.3)
|
|
18
19
|
*/
|
|
19
20
|
function toScaleAxis(mat, s) {
|
|
20
21
|
let timingStart = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-scale-axis.js","sourceRoot":"","sources":["../../src/sat/to-scale-axis.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD
|
|
1
|
+
{"version":3,"file":"to-scale-axis.js","sourceRoot":"","sources":["../../src/sat/to-scale-axis.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;;;;;;;;;;;GAYG;AACH,SAAS,WAAW,CACZ,GAAQ,EACR,CAAS;IAEb,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACjC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEpB,MAAM,GAAG,GAAQ;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACF,GAAG,GAAG,CAAC,IAAI;YACX,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;SACnC;KACJ,CAAC;IAGF,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,OAAO,GAAG,CAAC;AACf,CAAC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|