flo-mat 3.0.12 → 3.0.14
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 +188 -50
- package/browser/index.min.js +1 -1
- package/node/cp-node/cp-node-fs.d.ts +4 -4
- package/node/cp-node/cp-node-fs.js +4 -4
- package/node/cp-node/cp-node.d.ts +8 -10
- package/node/cp-node/fs/clone.d.ts +1 -1
- package/node/cp-node/fs/clone.js +14 -10
- package/node/cp-node/fs/clone.js.map +1 -1
- package/node/cp-node/fs/cp-node-comparator.d.ts +6 -0
- package/node/cp-node/fs/cp-node-comparator.js +6 -0
- package/node/cp-node/fs/cp-node-comparator.js.map +1 -1
- package/node/cp-node/fs/enhance-cp-node.d.ts +5 -2
- package/node/cp-node/fs/enhance-cp-node.js +4 -0
- package/node/cp-node/fs/enhance-cp-node.js.map +1 -1
- package/node/cp-node/fs/get-all-on-circle.d.ts +4 -4
- package/node/cp-node/fs/get-all-on-circle.js +4 -4
- package/node/cp-node/fs/get-all-on-loop.d.ts +4 -0
- package/node/cp-node/fs/get-all-on-loop.js +4 -0
- package/node/cp-node/fs/get-all-on-loop.js.map +1 -1
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.d.ts +5 -4
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js +5 -4
- package/node/cp-node/fs/get-boundary-bezier-parts-to-next.js.map +1 -1
- package/node/cp-node/fs/get-boundary-beziers-to-next.d.ts +4 -8
- package/node/cp-node/fs/get-boundary-beziers-to-next.js +4 -8
- package/node/cp-node/fs/get-boundary-beziers-to-next.js.map +1 -1
- package/node/cp-node/fs/get-children.d.ts +6 -0
- package/node/cp-node/fs/get-children.js +6 -0
- package/node/cp-node/fs/get-children.js.map +1 -1
- package/node/cp-node/fs/get-edge-direction.d.ts +6 -0
- package/node/cp-node/fs/get-edge-direction.js +6 -0
- package/node/cp-node/fs/get-edge-direction.js.map +1 -1
- package/node/cp-node/fs/get-first-exit.d.ts +4 -0
- package/node/cp-node/fs/get-first-exit.js +4 -0
- package/node/cp-node/fs/get-first-exit.js.map +1 -1
- package/node/cp-node/fs/get-mat-curve-between.d.ts +6 -0
- package/node/cp-node/fs/get-mat-curve-between.js +6 -0
- package/node/cp-node/fs/get-mat-curve-between.js.map +1 -1
- package/node/cp-node/fs/get-mat-curve-to-next.d.ts +6 -0
- package/node/cp-node/fs/get-mat-curve-to-next.js +6 -0
- package/node/cp-node/fs/get-mat-curve-to-next.js.map +1 -1
- package/node/cp-node/fs/get-prong-count.d.ts +8 -0
- package/node/cp-node/fs/get-prong-count.js +8 -0
- package/node/cp-node/fs/get-prong-count.js.map +1 -1
- package/node/cp-node/fs/get-real-prong-count.d.ts +6 -0
- package/node/cp-node/fs/get-real-prong-count.js +6 -0
- package/node/cp-node/fs/get-real-prong-count.js.map +1 -1
- package/node/cp-node/fs/get-vertex-forward-children.d.ts +8 -0
- package/node/cp-node/fs/get-vertex-forward-children.js +8 -0
- package/node/cp-node/fs/get-vertex-forward-children.js.map +1 -1
- package/node/cp-node/fs/is-fully-terminating.d.ts +2 -5
- package/node/cp-node/fs/is-fully-terminating.js +2 -5
- package/node/cp-node/fs/is-fully-terminating.js.map +1 -1
- package/node/cp-node/fs/is-on-same-circle.d.ts +6 -0
- package/node/cp-node/fs/is-on-same-circle.js +6 -0
- package/node/cp-node/fs/is-on-same-circle.js.map +1 -1
- package/node/cp-node/fs/is-one-prong.d.ts +8 -0
- package/node/cp-node/fs/is-one-prong.js +8 -0
- package/node/cp-node/fs/is-one-prong.js.map +1 -1
- package/node/cp-node/fs/is-order-correct.d.ts +1 -1
- package/node/cp-node/fs/is-order-correct.js +1 -4
- package/node/cp-node/fs/is-order-correct.js.map +1 -1
- package/node/cp-node/fs/is-sharp.d.ts +7 -0
- package/node/cp-node/fs/is-sharp.js +7 -0
- package/node/cp-node/fs/is-sharp.js.map +1 -1
- package/node/cp-node/fs/is-special.d.ts +1 -1
- package/node/cp-node/fs/is-special.js +1 -3
- package/node/cp-node/fs/is-special.js.map +1 -1
- package/node/cp-node/fs/is-terminating.d.ts +22 -0
- package/node/cp-node/fs/is-terminating.js +22 -0
- package/node/cp-node/fs/is-terminating.js.map +1 -1
- package/node/cp-node/fs/traverse-cp.d.ts +9 -0
- package/node/cp-node/fs/traverse-cp.js +9 -0
- package/node/cp-node/fs/traverse-cp.js.map +1 -1
- package/node/cp-node/fs/traverse-edges.d.ts +7 -0
- package/node/cp-node/fs/traverse-edges.js +7 -0
- package/node/cp-node/fs/traverse-edges.js.map +1 -1
- package/node/cp-node/fs/traverse-vertices.d.ts +9 -0
- package/node/cp-node/fs/traverse-vertices.js +9 -0
- package/node/cp-node/fs/traverse-vertices.js.map +1 -1
- package/node/find-2-prong/add-2-prong.js +5 -3
- package/node/find-2-prong/add-2-prong.js.map +1 -1
- package/node/floyd-warshall/get-graph.d.ts +1 -1
- package/node/floyd-warshall/get-graph.js +2 -2
- package/node/floyd-warshall/get-graph.js.map +1 -1
- package/node/floyd-warshall/get-hole-closer-pairs.d.ts +6 -1
- package/node/floyd-warshall/get-hole-closer-pairs.js +8 -0
- package/node/floyd-warshall/get-hole-closer-pairs.js.map +1 -1
- package/node/mat/add-to-cp-tree.js +1 -3
- package/node/mat/add-to-cp-tree.js.map +1 -1
- package/node/vertex/remove-vertex.d.ts +5 -0
- package/node/vertex/remove-vertex.js +5 -0
- package/node/vertex/remove-vertex.js.map +1 -1
- package/package.json +1 -1
- package/src/cp-node/cp-node-fs.ts +4 -4
- package/src/cp-node/cp-node.ts +8 -10
- package/src/cp-node/fs/clone.ts +20 -14
- package/src/cp-node/fs/cp-node-comparator.ts +6 -0
- package/src/cp-node/fs/enhance-cp-node.ts +4 -0
- package/src/cp-node/fs/get-all-on-circle.ts +4 -4
- package/src/cp-node/fs/get-all-on-loop.ts +5 -1
- package/src/cp-node/fs/get-boundary-bezier-parts-to-next.ts +6 -5
- package/src/cp-node/fs/get-boundary-beziers-to-next.ts +4 -8
- package/src/cp-node/fs/get-children.ts +6 -0
- package/src/cp-node/fs/get-edge-direction.ts +6 -0
- package/src/cp-node/fs/get-first-exit.ts +4 -0
- package/src/cp-node/fs/get-mat-curve-between.ts +6 -0
- package/src/cp-node/fs/get-mat-curve-to-next.ts +6 -0
- package/src/cp-node/fs/get-prong-count.ts +8 -0
- package/src/cp-node/fs/get-real-prong-count.ts +6 -0
- package/src/cp-node/fs/get-vertex-forward-children.ts +8 -0
- package/src/cp-node/fs/is-fully-terminating.ts +2 -5
- package/src/cp-node/fs/is-on-same-circle.ts +6 -0
- package/src/cp-node/fs/is-one-prong.ts +8 -0
- package/src/cp-node/fs/is-order-correct.ts +1 -4
- package/src/cp-node/fs/is-sharp.ts +7 -0
- package/src/cp-node/fs/is-special.ts +2 -3
- package/src/cp-node/fs/is-terminating.ts +22 -0
- package/src/cp-node/fs/traverse-cp.ts +9 -0
- package/src/cp-node/fs/traverse-edges.ts +7 -0
- package/src/cp-node/fs/traverse-vertices.ts +9 -0
- package/src/find-2-prong/add-2-prong.ts +4 -1
- package/src/floyd-warshall/get-graph.ts +3 -3
- package/src/floyd-warshall/get-hole-closer-pairs.ts +9 -1
- package/src/mat/add-to-cp-tree.ts +1 -2
- package/src/vertex/remove-vertex.ts +5 -0
- package/src/cp-node/fs/create-cp-node.ts +0 -21
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { isTerminating } from "./is-terminating.js";
|
|
2
|
+
/**
|
|
3
|
+
* Similar to `getChildren` but returns the child nodes of the tree when
|
|
4
|
+
* `CpNode` is seen as a MAT vertex point (as opposed to edge). In this
|
|
5
|
+
* way the dual graph of the tree can easily be traversed - see e.g.
|
|
6
|
+
* `traverseVertices`. Generally, however, traversing the edges is
|
|
7
|
+
* preferred as it returns the entire Medial Axis (by utilizing
|
|
8
|
+
* `getMatCurveToNext` on each returned edge).
|
|
9
|
+
*/
|
|
2
10
|
function getVertexForwardChildren(cpNode) {
|
|
3
11
|
const children = [];
|
|
4
12
|
const cpStart = cpNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-vertex-forward-children.js","sourceRoot":"","sources":["../../../src/cp-node/fs/get-vertex-forward-children.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,SAAS,wBAAwB,CAAC,MAAc;IAC5C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC;IAEvB,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,OAAO,OAAO,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"get-vertex-forward-children.js","sourceRoot":"","sources":["../../../src/cp-node/fs/get-vertex-forward-children.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,MAAc;IAC5C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC;IAEvB,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,OAAO,OAAO,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,wBAAwB,EAAE,CAAA"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import type { CpNode } from "../cp-node.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `false` otherwise.
|
|
6
|
-
*
|
|
7
|
-
* @param cpNode
|
|
3
|
+
* Like isTerminating() but only returns true if all cpNodes on the circle
|
|
4
|
+
* (except this.prevOnCircle) is terminating.
|
|
8
5
|
*/
|
|
9
6
|
declare function isFullyTerminating(cpNode: CpNode): boolean;
|
|
10
7
|
export { isFullyTerminating };
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { getAllOnCircle } from "./get-all-on-circle.js";
|
|
2
2
|
import { isTerminating } from "./is-terminating.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* `false` otherwise.
|
|
7
|
-
*
|
|
8
|
-
* @param cpNode
|
|
4
|
+
* Like isTerminating() but only returns true if all cpNodes on the circle
|
|
5
|
+
* (except this.prevOnCircle) is terminating.
|
|
9
6
|
*/
|
|
10
7
|
function isFullyTerminating(cpNode) {
|
|
11
8
|
const otherOnCircle = getAllOnCircle(cpNode.prevOnCircle, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-fully-terminating.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-fully-terminating.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD
|
|
1
|
+
{"version":3,"file":"is-fully-terminating.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-fully-terminating.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;GAGG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACtC,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEhE,OAAO,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { CpNode } from "../cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if the 2 given `CpNode`s are on the same maximal disk
|
|
4
|
+
* circle.
|
|
5
|
+
* @param cpNode1 A `CpNode`.
|
|
6
|
+
* @param cpNode2 Another `CpNode`
|
|
7
|
+
*/
|
|
2
8
|
declare function isOnSameCircle(cpNode1: CpNode, cpNode2: CpNode): boolean;
|
|
3
9
|
export { isOnSameCircle };
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { getAllOnCircle } from "./get-all-on-circle.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if the 2 given `CpNode`s are on the same maximal disk
|
|
4
|
+
* circle.
|
|
5
|
+
* @param cpNode1 A `CpNode`.
|
|
6
|
+
* @param cpNode2 Another `CpNode`
|
|
7
|
+
*/
|
|
2
8
|
function isOnSameCircle(cpNode1, cpNode2) {
|
|
3
9
|
// const cpNodes = getAllOnCircle(cpNode1, true);
|
|
4
10
|
const cpNodes = getAllOnCircle(cpNode1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-on-same-circle.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-on-same-circle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,SAAS,cAAc,CACf,OAAe,EACf,OAAe;IAEnB,iDAAiD;IACjD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"is-on-same-circle.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-on-same-circle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD;;;;;GAKG;AACH,SAAS,cAAc,CACf,OAAe,EACf,OAAe;IAEnB,iDAAiD;IACjD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import { CpNode } from "../cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if this `CpNode`'s maximal disk has only one contact point
|
|
4
|
+
* on the shape boundary (up to planar coordinates). These includes sharp
|
|
5
|
+
* corners.
|
|
6
|
+
*
|
|
7
|
+
* Note, however, that two `CpNode`s are stored for each such point to
|
|
8
|
+
* preserve symmetry - see `isTerminating` for more details.
|
|
9
|
+
*/
|
|
2
10
|
declare function isOneProng(cpNode: CpNode): boolean;
|
|
3
11
|
export { isOneProng };
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if this `CpNode`'s maximal disk has only one contact point
|
|
3
|
+
* on the shape boundary (up to planar coordinates). These includes sharp
|
|
4
|
+
* corners.
|
|
5
|
+
*
|
|
6
|
+
* Note, however, that two `CpNode`s are stored for each such point to
|
|
7
|
+
* preserve symmetry - see `isTerminating` for more details.
|
|
8
|
+
*/
|
|
1
9
|
// TODO2 - remove - or replace with `getRealProngCount === 1`
|
|
2
10
|
function isOneProng(cpNode) {
|
|
3
11
|
const cp1 = cpNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-one-prong.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-one-prong.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,SAAS,UAAU,CAAC,MAAc;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC;IAEnB,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC;IAE7B,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"is-one-prong.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-one-prong.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,6DAA6D;AAC7D,SAAS,UAAU,CAAC,MAAc;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC;IAEnB,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC;IAE7B,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEjC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { CpNode } from "../cp-node.js";
|
|
1
2
|
import { LlRbTree } from "flo-ll-rb-tree";
|
|
2
3
|
import { ContactPoint } from "../../contact-point/contact-point.js";
|
|
3
|
-
import { CpNode } from "../cp-node.js";
|
|
4
4
|
declare function isOrderCorrect(cpTree: LlRbTree<CpNode>, cp: ContactPoint, next: CpNode): boolean;
|
|
5
5
|
export { isOrderCorrect };
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { compareCps } from "../../contact-point/contact-point.js";
|
|
2
|
-
function isOrderCorrect(
|
|
3
|
-
// isHoleClosing: boolean,
|
|
4
|
-
cpTree, cp, next) {
|
|
5
|
-
// if (isHoleClosing) { return true; }
|
|
2
|
+
function isOrderCorrect(cpTree, cp, next) {
|
|
6
3
|
// TODO2
|
|
7
4
|
const c = compareCps(cp, next.cp);
|
|
8
5
|
if (c < 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-order-correct.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-order-correct.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"is-order-correct.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-order-correct.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAgB,MAAM,sCAAsC,CAAC;AAGhF,SAAS,cAAc,CACf,MAAwB,EACxB,EAAgB,EAChB,IAAY;IAEhB,QAAQ;IACR,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACV,QAAQ;QACR,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC,CAAE,oBAAoB;QAC9C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAG,CAAC,KAAK,CAAC;IAEvC,2CAA2C;IAC3C,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AACvD,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { CpNode } from "../cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if this `CpNode` represents a sharp corner, i.e. the
|
|
4
|
+
* limiting case of a two-prong having zero radius.
|
|
5
|
+
*
|
|
6
|
+
* Note that two `CpNode`s are stored for each sharp corner, one being
|
|
7
|
+
* terminating and one not. See `isTerminating` for more details.
|
|
8
|
+
*/
|
|
2
9
|
declare function isSharp(cpNode: CpNode): boolean;
|
|
3
10
|
export { isSharp };
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if this `CpNode` represents a sharp corner, i.e. the
|
|
3
|
+
* limiting case of a two-prong having zero radius.
|
|
4
|
+
*
|
|
5
|
+
* Note that two `CpNode`s are stored for each sharp corner, one being
|
|
6
|
+
* terminating and one not. See `isTerminating` for more details.
|
|
7
|
+
*/
|
|
1
8
|
function isSharp(cpNode) {
|
|
2
9
|
return cpNode.cp.circle.radius === 0;
|
|
3
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-sharp.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-sharp.ts"],"names":[],"mappings":"AAGA,SAAS,OAAO,CAAC,MAAc;IAC3B,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AACzC,CAAC;AAGD,OAAO,EAAE,OAAO,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"is-sharp.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-sharp.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,MAAc;IAC3B,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AACzC,CAAC;AAGD,OAAO,EAAE,OAAO,EAAE,CAAA"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { getRealProngCount } from "./get-real-prong-count.js";
|
|
2
2
|
function isSpecial(cpNode) {
|
|
3
3
|
return ((getRealProngCount(cpNode) !== 2) &&
|
|
4
|
-
!cpNode.isHoleClosing
|
|
5
|
-
// !cpNode.isHoleClosing && cpNode.cp.circle.radius !== 0 // TODO2
|
|
6
|
-
);
|
|
4
|
+
!cpNode.isHoleClosing);
|
|
7
5
|
}
|
|
8
6
|
export { isSpecial };
|
|
9
7
|
//# sourceMappingURL=is-special.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-special.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-special.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,SAAS,SAAS,CACV,MAAc;IAElB,OAAO,CACH,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,MAAM,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"is-special.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-special.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,SAAS,SAAS,CACV,MAAc;IAElB,OAAO,CACH,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,MAAM,CAAC,aAAa,CACxB,CAAA;AACL,CAAC;AAGD,OAAO,EAAE,SAAS,EAAE,CAAA"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
1
|
import type { CpNode } from "../cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
* Returns `true` if this `CpNode` is terminating, i.e. implies a leaf MAT
|
|
4
|
+
* vertex.
|
|
5
|
+
*
|
|
6
|
+
* The following are some instances where this is the case:
|
|
7
|
+
*
|
|
8
|
+
* * Sharp corners.
|
|
9
|
+
*
|
|
10
|
+
* * Half of Hole-closers, i.e. `CpNode`s whose next `CpNode` is on a different
|
|
11
|
+
* loop
|
|
12
|
+
*
|
|
13
|
+
* * Maximal disks with a single contact point.
|
|
14
|
+
* Note, however, that even in these cases there are two contact points stored
|
|
15
|
+
* (sitting 'on top' of each other) for the maximal disk. It can be seen as a
|
|
16
|
+
* limiting case of a two-prong where the distance between two of the contact
|
|
17
|
+
* points tend to zero. One point (represented by a `CpNode` of course) will
|
|
18
|
+
* be terminating with the other point being its `next`, whereas the other
|
|
19
|
+
* point will *not* be terminating and 'points' back into the shape.
|
|
20
|
+
*
|
|
21
|
+
* * Some 3-prongs may also become terminating if the Scale Axis Transform is
|
|
22
|
+
* applied to the shape.
|
|
23
|
+
*/
|
|
2
24
|
declare function isTerminating(cpNode: CpNode): boolean;
|
|
3
25
|
export { isTerminating };
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns `true` if this `CpNode` is terminating, i.e. implies a leaf MAT
|
|
3
|
+
* vertex.
|
|
4
|
+
*
|
|
5
|
+
* The following are some instances where this is the case:
|
|
6
|
+
*
|
|
7
|
+
* * Sharp corners.
|
|
8
|
+
*
|
|
9
|
+
* * Half of Hole-closers, i.e. `CpNode`s whose next `CpNode` is on a different
|
|
10
|
+
* loop
|
|
11
|
+
*
|
|
12
|
+
* * Maximal disks with a single contact point.
|
|
13
|
+
* Note, however, that even in these cases there are two contact points stored
|
|
14
|
+
* (sitting 'on top' of each other) for the maximal disk. It can be seen as a
|
|
15
|
+
* limiting case of a two-prong where the distance between two of the contact
|
|
16
|
+
* points tend to zero. One point (represented by a `CpNode` of course) will
|
|
17
|
+
* be terminating with the other point being its `next`, whereas the other
|
|
18
|
+
* point will *not* be terminating and 'points' back into the shape.
|
|
19
|
+
*
|
|
20
|
+
* * Some 3-prongs may also become terminating if the Scale Axis Transform is
|
|
21
|
+
* applied to the shape.
|
|
22
|
+
*/
|
|
1
23
|
function isTerminating(cpNode) {
|
|
2
24
|
return cpNode === cpNode.next.prevOnCircle;
|
|
3
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-terminating.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-terminating.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CAAC,MAAc;IACjC,OAAO,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/C,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"is-terminating.js","sourceRoot":"","sources":["../../../src/cp-node/fs/is-terminating.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAS,aAAa,CAAC,MAAc;IACjC,OAAO,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/C,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import { CpNode } from "../cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*
|
|
5
|
+
* Traverses the shape from the given `CpNode` going around the shortest path
|
|
6
|
+
* so that only a piece of the shape is traversed and returns the visited
|
|
7
|
+
* `CpNode`s (starting from the given `CpNode`).
|
|
8
|
+
*
|
|
9
|
+
* @param cpStart The `CpNode` from where to start the traversal.
|
|
10
|
+
*/
|
|
2
11
|
declare function traverseCp(cpStart: CpNode): CpNode[];
|
|
3
12
|
export { traverseCp };
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { isTerminating } from "./is-terminating.js";
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*
|
|
5
|
+
* Traverses the shape from the given `CpNode` going around the shortest path
|
|
6
|
+
* so that only a piece of the shape is traversed and returns the visited
|
|
7
|
+
* `CpNode`s (starting from the given `CpNode`).
|
|
8
|
+
*
|
|
9
|
+
* @param cpStart The `CpNode` from where to start the traversal.
|
|
10
|
+
*/
|
|
2
11
|
function traverseCp(cpStart) {
|
|
3
12
|
let cpNode = cpStart;
|
|
4
13
|
if (isTerminating(cpNode)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-cp.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-cp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,SAAS,UAAU,CACX,OAAe;IAEnB,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,mBAAmB;IACzC,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,GAAG,CAAC;QACA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,MAAM,GAAG,MAAM,KAAK,IAAI;YAChB,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAC9C,CAAC,CAAC,MAAM,GAAG,IAAI,CAAA,CAAS,iBAAiB;IAErD,CAAC,QAAQ,MAAM,KAAK,OAAO,EAAE;IAE7B,OAAO,UAAU,CAAC;AACtB,CAAC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"traverse-cp.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-cp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;;;;;GAQG;AACH,SAAS,UAAU,CACX,OAAe;IAEnB,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAE,mBAAmB;IACzC,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,GAAG,CAAC;QACA,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,MAAM,GAAG,MAAM,KAAK,IAAI;YAChB,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAC9C,CAAC,CAAC,MAAM,GAAG,IAAI,CAAA,CAAS,iBAAiB;IAErD,CAAC,QAAQ,MAAM,KAAK,OAAO,EAAE;IAE7B,OAAO,UAAU,CAAC;AACtB,CAAC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { CpNode } from '../cp-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* Traverses all edges (depth first) of the given MAT tree starting at the given
|
|
4
|
+
* vertex (represented by a `CpNode`).
|
|
5
|
+
* @param cpNode Any `CpNode` representing the start vertex.
|
|
6
|
+
* @param traverseEdgesCallback A callback function for each CpNode representing the vertex at the
|
|
7
|
+
* start of an edge.
|
|
8
|
+
*/
|
|
2
9
|
declare function traverseEdges(cpNode: CpNode, traverseEdgesCallback: (cpNode: CpNode) => void): void;
|
|
3
10
|
export { traverseEdges };
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { isTerminating } from './is-terminating.js';
|
|
2
2
|
import { getAllOnLoop } from './get-all-on-loop.js';
|
|
3
|
+
/**
|
|
4
|
+
* Traverses all edges (depth first) of the given MAT tree starting at the given
|
|
5
|
+
* vertex (represented by a `CpNode`).
|
|
6
|
+
* @param cpNode Any `CpNode` representing the start vertex.
|
|
7
|
+
* @param traverseEdgesCallback A callback function for each CpNode representing the vertex at the
|
|
8
|
+
* start of an edge.
|
|
9
|
+
*/
|
|
3
10
|
function traverseEdges(cpNode, traverseEdgesCallback) {
|
|
4
11
|
const cpNodes = getAllOnLoop(cpNode);
|
|
5
12
|
const seen = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-edges.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-edges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,SAAS,aAAa,CACd,MAAc,EACd,qBAA+C;IAEnD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"traverse-edges.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-edges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD;;;;;;GAMG;AACH,SAAS,aAAa,CACd,MAAc,EACd,qBAA+C;IAEnD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import { CpNode } from '../cp-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* Traverses the MAT tree and calls the given callback function for each vertex
|
|
4
|
+
* (represented by a `CpNode`) on the MAT.
|
|
5
|
+
*
|
|
6
|
+
* It is usually preferable to use `traverseEdges` as it allows for the
|
|
7
|
+
* traversal of all the smooth curves representing the MAT.
|
|
8
|
+
* @param cpNode Any `CpNode` representing the start vertex.
|
|
9
|
+
* @param traverseVerticesCallback A callback function taking a single `CpNode` as parameter.
|
|
10
|
+
*/
|
|
2
11
|
declare function traverseVertices(cpStart: CpNode, traverseVerticesCallback: (cpNode: CpNode) => void): void;
|
|
3
12
|
export { traverseVertices };
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { getAllOnCircle } from './get-all-on-circle.js';
|
|
2
2
|
import { isTerminating } from './is-terminating.js';
|
|
3
3
|
import { getVertexForwardChildren } from './get-vertex-forward-children.js';
|
|
4
|
+
/**
|
|
5
|
+
* Traverses the MAT tree and calls the given callback function for each vertex
|
|
6
|
+
* (represented by a `CpNode`) on the MAT.
|
|
7
|
+
*
|
|
8
|
+
* It is usually preferable to use `traverseEdges` as it allows for the
|
|
9
|
+
* traversal of all the smooth curves representing the MAT.
|
|
10
|
+
* @param cpNode Any `CpNode` representing the start vertex.
|
|
11
|
+
* @param traverseVerticesCallback A callback function taking a single `CpNode` as parameter.
|
|
12
|
+
*/
|
|
4
13
|
function traverseVertices(cpStart, traverseVerticesCallback) {
|
|
5
14
|
traverseVerticesCallback(cpStart);
|
|
6
15
|
// Since the tree is unrooted we must iterate in all directions from the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-vertices.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-vertices.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAG5E,SAAS,gBAAgB,CACjB,OAAe,EACf,wBAAkD;IAEtD,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,wEAAwE;IACxE,gBAAgB;IAChB,MAAM,OAAO,GACT,cAAc,CAAC,OAAO,CAAC;SACtB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SACxC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAG,CAAC;YACtB,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"traverse-vertices.js","sourceRoot":"","sources":["../../../src/cp-node/fs/traverse-vertices.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAG5E;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACjB,OAAe,EACf,wBAAkD;IAEtD,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,wEAAwE;IACxE,gBAAgB;IAChB,MAAM,OAAO,GACT,cAAc,CAAC,OAAO,CAAC;SACtB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SACxC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,EAAG,CAAC;YACtB,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -44,16 +44,18 @@ function add2Prong(meta, circle, poss, isHoleClosing) {
|
|
|
44
44
|
}
|
|
45
45
|
return cpNodes[0]; // return the source `CpNode`
|
|
46
46
|
}
|
|
47
|
-
function closeHole(meta,
|
|
48
|
-
// cpTrees: Map<Loop, LlRbTree<CpNode>>,
|
|
49
|
-
cpNodes) {
|
|
47
|
+
function closeHole(meta, cpNodes) {
|
|
50
48
|
const { cpTrees } = meta;
|
|
51
49
|
const [cpNodeA, cpNodeB] = cpNodes;
|
|
52
50
|
// Duplicate ContactPoints
|
|
53
51
|
// const antipodeCpNode = cpNodeB[0];
|
|
54
52
|
const cpAntipode = cpNodeB.cp;
|
|
55
53
|
const cpNodeB2 = insertCpNode(true, true, false, cpTrees.get(cpAntipode.pointOnShape.curve.loop), { ...cpAntipode, order2: +1 }, cpNodeB, meta.lastInsertId);
|
|
54
|
+
cpNodeB2.holeCloserTwin = cpNodeB;
|
|
55
|
+
cpNodeB.holeCloserTwin = cpNodeB2;
|
|
56
56
|
const cpNodeB1 = insertCpNode(true, true, false, cpTrees.get(cpNodeA.cp.pointOnShape.curve.loop), { ...cpNodeA.cp, order2: -1 }, cpNodeA.prev, meta.lastInsertId);
|
|
57
|
+
cpNodeB1.holeCloserTwin = cpNodeA;
|
|
58
|
+
cpNodeA.holeCloserTwin = cpNodeB1;
|
|
57
59
|
// Connect graph
|
|
58
60
|
cpNodeB1.prevOnCircle = cpNodeB2;
|
|
59
61
|
cpNodeB1.nextOnCircle = cpNodeB2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-2-prong.js","sourceRoot":"","sources":["../../src/find-2-prong/add-2-prong.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D;;;;;;;;;;;GAWG;AACH,SAAS,SAAS,CACV,IAAa,EACb,MAAc,EACd,IAAoB,EACpB,aAAsB;IAE1B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAE1D,uEAAuE;IACvE,mCAAmC;IACnC,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,WAAW,CACtC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAC3D,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,8DAA8D;IAC9D,+BAA+B;IAE/B,IAAI,aAAa,EAAE,CAAC;QAChB,SAAS,CAAC,IAAI,EAAE,OAAmB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,6BAA6B;AACrD,CAAC;AAGD,SAAS,SAAS,CACV,IAAa
|
|
1
|
+
{"version":3,"file":"add-2-prong.js","sourceRoot":"","sources":["../../src/find-2-prong/add-2-prong.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ function getGraph(specialVertices, holeClosers) {
|
|
|
26
26
|
}
|
|
27
27
|
if (child.isHoleClosing) {
|
|
28
28
|
// Hole closer found - don't go around loop
|
|
29
|
-
child =
|
|
29
|
+
child = getHoleCloserNext(pairs, child);
|
|
30
30
|
continue;
|
|
31
31
|
}
|
|
32
32
|
if (isVertexSpecial(child)) {
|
|
@@ -47,7 +47,7 @@ function getGraph(specialVertices, holeClosers) {
|
|
|
47
47
|
}
|
|
48
48
|
return graph;
|
|
49
49
|
}
|
|
50
|
-
function
|
|
50
|
+
function getHoleCloserNext(pairs, holeCloser) {
|
|
51
51
|
return pairs.get(holeCloser).next;
|
|
52
52
|
}
|
|
53
53
|
export { getGraph };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-graph.js","sourceRoot":"","sources":["../../src/floyd-warshall/get-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,SAAS,QAAQ,CACT,eAAyB,EACzB,WAAqB;IAEzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;IAEjC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACV,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,SAAS;YACb,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACpC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;oBACV,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;wBACjC,MAAM,CAAE,yBAAyB;oBACrC,CAAC;oBACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;wBACtB,4CAA4C;wBAC5C,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"get-graph.js","sourceRoot":"","sources":["../../src/floyd-warshall/get-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,SAAS,QAAQ,CACT,eAAyB,EACzB,WAAqB;IAEzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;IAEjC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACV,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,SAAS;YACb,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACpC,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;gBACzB,OAAO,IAAI,EAAE,CAAC;oBACV,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;wBACjC,MAAM,CAAE,yBAAyB;oBACrC,CAAC;oBACD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;wBACtB,4CAA4C;wBAC5C,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;wBACxC,SAAS;oBACb,CAAC;oBACD,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,+CAA+C;wBAC/C,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;wBAC7B,MAAM,CAAE,2CAA2C;oBACvD,CAAC;oBAED,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;oBAClC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;gBACvB,CAAC;gBAED,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;oBAAC,IAAI,GAAG,CAAC,CAAC;gBAAC,CAAC;YAC/B,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAGD,SAAS,iBAAiB,CAClB,KAAyB,EACzB,UAAkB;IAEtB,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC;AACvC,CAAC;AAGD,OAAO,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
import { CpNode } from "../cp-node/cp-node.js";
|
|
1
|
+
import type { CpNode } from "../cp-node/cp-node.js";
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param holeClosers
|
|
5
|
+
* @returns
|
|
6
|
+
*/
|
|
2
7
|
declare function getHoleCloserPairs(holeClosers: CpNode[]): Map<CpNode, CpNode>;
|
|
3
8
|
export { getHoleCloserPairs };
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param holeClosers
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
// TODO - this function is currently O(n^2) but could be made O(n).
|
|
7
|
+
// TODO - only `pointOnShape.p` is checked but `pointOnShape.t` should also be checked
|
|
8
|
+
// or better yet, `CpNode.cp.order` and `CpNode.cp.order2`, etc.
|
|
1
9
|
function getHoleCloserPairs(holeClosers) {
|
|
2
10
|
const pairs = new Map();
|
|
3
11
|
for (let hcA of holeClosers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-hole-closer-pairs.js","sourceRoot":"","sources":["../../src/floyd-warshall/get-hole-closer-pairs.ts"],"names":[],"mappings":"AAGA,SAAS,kBAAkB,CACnB,WAAqB;IAEzB,MAAM,KAAK,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC5C,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC1B,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,GAAG;gBACX,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"get-hole-closer-pairs.js","sourceRoot":"","sources":["../../src/floyd-warshall/get-hole-closer-pairs.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,mEAAmE;AACnE,sFAAsF;AACtF,gEAAgE;AAChE,SAAS,kBAAkB,CACnB,WAAqB;IAEzB,MAAM,KAAK,GAAuB,IAAI,GAAG,EAAE,CAAC;IAC5C,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC1B,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,GAAG;gBACX,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -10,9 +10,7 @@ import { joinSpokes } from '../add-n-prong.ts/join-spokes.js';
|
|
|
10
10
|
*
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
|
-
function addToCpTree(insertIfOrderIsWrong, isHoleClosing, circle, orders,
|
|
14
|
-
// cpTrees: Map<Loop,LlRbTree<CpNode>>,
|
|
15
|
-
meta, poss, neighbors) {
|
|
13
|
+
function addToCpTree(insertIfOrderIsWrong, isHoleClosing, circle, orders, meta, poss, neighbors) {
|
|
16
14
|
const { cpTrees } = meta;
|
|
17
15
|
let anyFailed = false;
|
|
18
16
|
const cpNodes = poss.map((pos, i) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-to-cp-tree.js","sourceRoot":"","sources":["../../src/mat/add-to-cp-tree.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAG9D;;;;;;;;GAQG;AACH,SAAS,WAAW,CACZ,oBAA6B,EAC7B,aAAsB,EACtB,MAAc,EACd,MAAgB
|
|
1
|
+
{"version":3,"file":"add-to-cp-tree.js","sourceRoot":"","sources":["../../src/mat/add-to-cp-tree.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAG9D;;;;;;;;GAQG;AACH,SAAS,WAAW,CACZ,oBAA6B,EAC7B,aAAsB,EACtB,MAAc,EACd,MAAgB,EAChB,IAAa,EACb,IAAoB,EACpB,SAAoB;IAExB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;QAC5C,MAAM,EAAE,GAAiB,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAEzE,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS;YAChC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAG,YAAY,CACvB,oBAAoB,EACpB,aAAa,EACb,KAAK,EACL,MAAM,EACN,EAAE,EACF,IAAI,EACJ,IAAI,CAAC,YAAY,CACpB,CAAC;QAEF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QAE/C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,UAAU,CAAC,MAAM,EAAE,OAAmB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { CpNode } from "../cp-node/cp-node.js";
|
|
2
2
|
import type { MatMeta } from '../mat/mat-meta.js';
|
|
3
|
+
/**
|
|
4
|
+
* Removes a cpNode from the MAT.
|
|
5
|
+
* @param cpTree The tree graph holding the `CpNodes` of the MAT.
|
|
6
|
+
* @param cpNode The `CpNode` to remove.
|
|
7
|
+
*/
|
|
3
8
|
declare function removeVertex(cpNode: CpNode, meta: MatMeta): void;
|
|
4
9
|
export { removeVertex };
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { getAllOnCircle } from '../cp-node/fs/get-all-on-circle.js';
|
|
2
2
|
import { getProngCount } from '../cp-node/fs/get-prong-count.js';
|
|
3
3
|
import { removeCpNode } from '../cp-node/fs/remove-cp-node.js';
|
|
4
|
+
/**
|
|
5
|
+
* Removes a cpNode from the MAT.
|
|
6
|
+
* @param cpTree The tree graph holding the `CpNodes` of the MAT.
|
|
7
|
+
* @param cpNode The `CpNode` to remove.
|
|
8
|
+
*/
|
|
4
9
|
function removeVertex(cpNode, meta) {
|
|
5
10
|
// cpTrees: Map<Loop, LlRbTree<CpNode>>): void {
|
|
6
11
|
const prongCount = getProngCount(cpNode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-vertex.js","sourceRoot":"","sources":["../../src/vertex/remove-vertex.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,SAAS,YAAY,CACb,MAAc,EACd,IAAa;IACb,gDAAgD;IAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,QAAQ,CAAC,CAAA;IACtE,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"remove-vertex.js","sourceRoot":"","sources":["../../src/vertex/remove-vertex.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D;;;;GAIG;AACH,SAAS,YAAY,CACb,MAAc,EACd,IAAa;IACb,gDAAgD;IAEpD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,QAAQ,CAAC,CAAA;IACtE,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -176,20 +176,20 @@ const CpNodeFs = {
|
|
|
176
176
|
*/
|
|
177
177
|
clone,
|
|
178
178
|
/**
|
|
179
|
-
* Returns the ordered bezier curves from this CpNode to the next CpNode
|
|
179
|
+
* Returns the ordered bezier curves from this `CpNode` to the next `CpNode`
|
|
180
180
|
* on the boundary.
|
|
181
181
|
* @param cpNode
|
|
182
182
|
*/
|
|
183
183
|
getBoundaryBezierPartsToNext,
|
|
184
184
|
/**
|
|
185
|
-
* Returns the ordered bezier curves from this CpNode to the next CpNode
|
|
185
|
+
* Returns the ordered bezier curves from this `CpNode` to the next `CpNode`
|
|
186
186
|
* on the boundary.
|
|
187
187
|
* @param cpNode
|
|
188
188
|
*/
|
|
189
189
|
getBoundaryBeziersToNext,
|
|
190
190
|
/**
|
|
191
|
-
* Removes a
|
|
192
|
-
* @param cpTree The tree graph holding the `
|
|
191
|
+
* Removes a `CpNode` from the MAT.
|
|
192
|
+
* @param cpTree The tree graph holding the `CpNode`s of the MAT.
|
|
193
193
|
* @param cpNode The `CpNode` to remove.
|
|
194
194
|
*/
|
|
195
195
|
removeVertex,
|
package/src/cp-node/cp-node.ts
CHANGED
|
@@ -54,11 +54,11 @@ interface CpNode {
|
|
|
54
54
|
cp: ContactPoint;
|
|
55
55
|
/** If true, this `CpNode` belongs to a hole-closing maximal disk. */
|
|
56
56
|
isHoleClosing: boolean;
|
|
57
|
-
/** true if this
|
|
57
|
+
/** true if this `CpNode` is at a shape boundary intersection point, false otherwise */
|
|
58
58
|
isIntersection: boolean;
|
|
59
|
-
/** The previous (going clockwise around the boundary) contact point
|
|
59
|
+
/** The previous (going clockwise around the boundary) contact point `CpNode`. */
|
|
60
60
|
prev: CpNode;
|
|
61
|
-
/** The next (going anti-clockwise around the boundary) contact point
|
|
61
|
+
/** The next (going anti-clockwise around the boundary) contact point `CpNode`. */
|
|
62
62
|
next: CpNode;
|
|
63
63
|
/**
|
|
64
64
|
* The previous `CpNode` (going clockwise around the inscribed circle
|
|
@@ -71,15 +71,13 @@ interface CpNode {
|
|
|
71
71
|
*/
|
|
72
72
|
nextOnCircle: CpNode;
|
|
73
73
|
/**
|
|
74
|
-
* For hole closers only - the
|
|
74
|
+
* For hole closers only - the twin `CpNode` at the same point, e.g.
|
|
75
|
+
* use `cpNode.holeCloserTwin.next` to skip the hole closer and get to the
|
|
76
|
+
* next `CpNode` on the same loop.
|
|
75
77
|
*/
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* For hole closers only - the prev `CpNode` ignoring the hole closer
|
|
79
|
-
*/
|
|
80
|
-
holeCloserPrev?: CpNode | undefined;
|
|
78
|
+
holeCloserTwin?: CpNode | undefined;
|
|
81
79
|
|
|
82
|
-
/**
|
|
80
|
+
/** For debugging / easy identification only */
|
|
83
81
|
id: number;
|
|
84
82
|
}
|
|
85
83
|
|