@itwin/core-geometry 5.12.0-dev.8 → 5.12.0
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/CHANGELOG.md +22 -1
- package/lib/cjs/bspline/AkimaCurve3d.d.ts +5 -0
- package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js +8 -0
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts +5 -0
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js +8 -0
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +2 -0
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +5 -0
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +2 -0
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +5 -0
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +3 -3
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +6 -6
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +69 -8
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +257 -86
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts +2 -3
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +5 -6
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +82 -58
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +3 -7
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js +48 -53
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +1 -4
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +1 -4
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.d.ts +3 -3
- package/lib/cjs/numerics/Polynomials.js +5 -5
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +5 -2
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +5 -2
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.d.ts +5 -0
- package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js +8 -0
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.d.ts +5 -0
- package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js +8 -0
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +2 -0
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +5 -0
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +2 -0
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +5 -0
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +3 -3
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +6 -6
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +69 -8
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +257 -86
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts +2 -3
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +5 -6
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +82 -58
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +3 -7
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js +48 -53
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +1 -4
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js +1 -4
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/numerics/Polynomials.d.ts +3 -3
- package/lib/esm/numerics/Polynomials.js +5 -5
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +5 -2
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +5 -2
- package/lib/esm/topology/Graph.js.map +1 -1
- package/package.json +5 -5
|
@@ -21,8 +21,6 @@ export declare class MultiChainCollector {
|
|
|
21
21
|
private _chains;
|
|
22
22
|
/** Largest gap distance to close. */
|
|
23
23
|
private _gapTolerance;
|
|
24
|
-
/** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
|
|
25
|
-
private _snapTolerance;
|
|
26
24
|
/** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
|
|
27
25
|
private _planeTolerance;
|
|
28
26
|
private static _staticPointA;
|
|
@@ -31,13 +29,12 @@ export declare class MultiChainCollector {
|
|
|
31
29
|
private _xyzWork1?;
|
|
32
30
|
/** Initialize with an empty array of chains.
|
|
33
31
|
* @param gapTolerance distance tolerance for calling endpoints identical
|
|
34
|
-
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
32
|
+
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within this tolerance of a plane.
|
|
35
33
|
*/
|
|
36
34
|
constructor(gapTolerance?: number, planeTolerance?: number);
|
|
37
35
|
/**
|
|
38
36
|
* Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
|
|
39
37
|
* @param xyz endpoint to check
|
|
40
|
-
* @param distanceTol absolute distance tolerance for equating endpoints
|
|
41
38
|
* @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
|
|
42
39
|
*/
|
|
43
40
|
private findAnyChainToConnect;
|
|
@@ -56,16 +53,15 @@ export declare class MultiChainCollector {
|
|
|
56
53
|
*/
|
|
57
54
|
captureCurve(candidate: AnyCurve): void;
|
|
58
55
|
/** If allowed by the geometry type, move an endpoint. */
|
|
59
|
-
private
|
|
56
|
+
private simpleEndPointMove;
|
|
60
57
|
/**
|
|
61
58
|
* Try to move the end of curve0 and/or the start of curve1 to a common point.
|
|
62
59
|
* * All z-coordinates are ignored.
|
|
63
60
|
* @param curve0 first curve, assumed to end close to the start of curve1
|
|
64
61
|
* @param curve1 second curve, assumed to start close to the end of curve0
|
|
65
|
-
* @param gapTolerance max distance to move a curve start/end point
|
|
66
62
|
* @returns whether curve start/end point(s) moved
|
|
67
63
|
*/
|
|
68
|
-
private
|
|
64
|
+
private moveHeadOrTail;
|
|
69
65
|
/** Announce a curve primitive
|
|
70
66
|
* * If a "nearby" connection is possible, insert the candidate in the chain and force endpoint match.
|
|
71
67
|
* * Otherwise start a new chain.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,gIAAgI;IAChI,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAU;IAE5B;;;OAGG;gBACgB,YAAY,SAA+B,EAAE,cAAc,CAAC,EAAE,MAAM;IAKvF;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;OAKG;IACI,qBAAqB,CAAC,SAAS,EAAE,cAAc;IAKtD;;;;;OAKG;IACI,YAAY,CAAC,SAAS,EAAE,QAAQ;IAQvC,yDAAyD;IACzD,OAAO,CAAC,kBAAkB;IAe1B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAuCtB;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA8CjC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAYjC,wCAAwC;IACxC,OAAO,CAAC,YAAY;IAMpB,qGAAqG;IACrG,OAAO,CAAC,wBAAwB;IAuBhC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA+B5B,wEAAwE;IACxE,OAAO,CAAC,mBAAmB;IAS3B,8EAA8E;IACvE,UAAU,CAAC,gBAAgB,GAAE,OAAe,GAAG,QAAQ,GAAG,SAAS;IAa1E;;;MAGE;IACK,4BAA4B,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;CAc9G"}
|
|
@@ -35,8 +35,6 @@ export class MultiChainCollector {
|
|
|
35
35
|
_chains;
|
|
36
36
|
/** Largest gap distance to close. */
|
|
37
37
|
_gapTolerance;
|
|
38
|
-
/** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
|
|
39
|
-
_snapTolerance;
|
|
40
38
|
/** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
|
|
41
39
|
_planeTolerance;
|
|
42
40
|
static _staticPointA;
|
|
@@ -45,30 +43,28 @@ export class MultiChainCollector {
|
|
|
45
43
|
_xyzWork1;
|
|
46
44
|
/** Initialize with an empty array of chains.
|
|
47
45
|
* @param gapTolerance distance tolerance for calling endpoints identical
|
|
48
|
-
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
46
|
+
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within this tolerance of a plane.
|
|
49
47
|
*/
|
|
50
48
|
constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance) {
|
|
51
49
|
this._chains = [];
|
|
52
50
|
this._gapTolerance = gapTolerance;
|
|
53
|
-
this._snapTolerance = Geometry.smallMetricDistance;
|
|
54
51
|
this._planeTolerance = planeTolerance;
|
|
55
52
|
}
|
|
56
53
|
/**
|
|
57
54
|
* Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
|
|
58
55
|
* @param xyz endpoint to check
|
|
59
|
-
* @param distanceTol absolute distance tolerance for equating endpoints
|
|
60
56
|
* @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
|
|
61
57
|
*/
|
|
62
|
-
findAnyChainToConnect(xyz,
|
|
58
|
+
findAnyChainToConnect(xyz, exceptChainIndex = -1) {
|
|
63
59
|
for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {
|
|
64
60
|
if (exceptChainIndex === chainIndexA)
|
|
65
61
|
continue;
|
|
66
62
|
const chain = this._chains[chainIndexA];
|
|
67
63
|
this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);
|
|
68
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
64
|
+
if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))
|
|
69
65
|
return { chainIndex: chainIndexA, atEnd: true };
|
|
70
66
|
this._xyzWork1 = chain[0].startPoint(this._xyzWork1);
|
|
71
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
67
|
+
if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))
|
|
72
68
|
return { chainIndex: chainIndexA, atEnd: false };
|
|
73
69
|
}
|
|
74
70
|
return undefined;
|
|
@@ -80,11 +76,7 @@ export class MultiChainCollector {
|
|
|
80
76
|
* @param candidate curve to add to the context
|
|
81
77
|
*/
|
|
82
78
|
captureCurvePrimitive(candidate) {
|
|
83
|
-
if (this.
|
|
84
|
-
if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))
|
|
79
|
+
if (this.attachPrimitiveToAnyChain(candidate))
|
|
88
80
|
return;
|
|
89
81
|
this._chains.push([candidate]);
|
|
90
82
|
}
|
|
@@ -103,7 +95,7 @@ export class MultiChainCollector {
|
|
|
103
95
|
}
|
|
104
96
|
}
|
|
105
97
|
/** If allowed by the geometry type, move an endpoint. */
|
|
106
|
-
|
|
98
|
+
simpleEndPointMove(curve, atEnd, to) {
|
|
107
99
|
if (curve instanceof (LineSegment3d)) {
|
|
108
100
|
if (atEnd) {
|
|
109
101
|
curve.point1Ref.setFrom(to);
|
|
@@ -125,89 +117,92 @@ export class MultiChainCollector {
|
|
|
125
117
|
* * All z-coordinates are ignored.
|
|
126
118
|
* @param curve0 first curve, assumed to end close to the start of curve1
|
|
127
119
|
* @param curve1 second curve, assumed to start close to the end of curve0
|
|
128
|
-
* @param gapTolerance max distance to move a curve start/end point
|
|
129
120
|
* @returns whether curve start/end point(s) moved
|
|
130
121
|
*/
|
|
131
|
-
|
|
122
|
+
moveHeadOrTail(curve0, curve1) {
|
|
132
123
|
const xyz0 = curve0.endPoint();
|
|
133
124
|
const xyz1 = curve1.startPoint();
|
|
134
125
|
const minShift = Geometry.smallMetricDistance * 0.001;
|
|
135
|
-
|
|
136
|
-
if (
|
|
126
|
+
let dist2 = xyz0.distanceSquaredXY(xyz1);
|
|
127
|
+
if (dist2 <= minShift * minShift)
|
|
128
|
+
return false; // if the move would be miniscule, don't bother
|
|
129
|
+
const gap2 = this._gapTolerance * this._gapTolerance;
|
|
130
|
+
if (dist2 > gap2)
|
|
137
131
|
return false;
|
|
138
132
|
// try lines and linestrings
|
|
139
|
-
if (
|
|
140
|
-
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
133
|
+
if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))
|
|
134
|
+
return true;
|
|
143
135
|
// try other primitive types
|
|
136
|
+
if (!(curve0 instanceof Arc3d && curve1 instanceof Arc3d))
|
|
137
|
+
return false; // currently we only consider 2 arcs
|
|
144
138
|
const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
if (
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);
|
|
155
|
-
const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);
|
|
156
|
-
curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
// TODO: other combinations of types
|
|
139
|
+
let iClosest = -1;
|
|
140
|
+
let minDist2 = Infinity;
|
|
141
|
+
for (let i = 0; i < intersections.length; ++i) { // find intersection closest to the joint
|
|
142
|
+
const dist20 = intersections[i].detailA.point.distanceSquaredXY(xyz0);
|
|
143
|
+
const dist21 = intersections[i].detailB.point.distanceSquaredXY(xyz1);
|
|
144
|
+
dist2 = dist20 + dist21;
|
|
145
|
+
if (dist20 <= gap2 && dist21 <= gap2 && dist2 < minDist2) {
|
|
146
|
+
minDist2 = dist2;
|
|
147
|
+
iClosest = i;
|
|
160
148
|
}
|
|
161
149
|
}
|
|
150
|
+
if (iClosest >= 0) { // move arc ends to the intersection point
|
|
151
|
+
const radians0End = curve0.sweep.fractionToRadians(intersections[iClosest].detailA.fraction);
|
|
152
|
+
curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);
|
|
153
|
+
const radians1Start = curve1.sweep.fractionToRadians(intersections[iClosest].detailB.fraction);
|
|
154
|
+
curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
162
157
|
return false;
|
|
163
158
|
}
|
|
164
159
|
/** Announce a curve primitive
|
|
165
160
|
* * If a "nearby" connection is possible, insert the candidate in the chain and force endpoint match.
|
|
166
161
|
* * Otherwise start a new chain.
|
|
167
162
|
*/
|
|
168
|
-
attachPrimitiveToAnyChain(candidate
|
|
169
|
-
if (candidate.curveLength() <
|
|
163
|
+
attachPrimitiveToAnyChain(candidate) {
|
|
164
|
+
if (candidate.curveLength() < this._gapTolerance) {
|
|
170
165
|
return true;
|
|
171
166
|
}
|
|
172
167
|
else {
|
|
173
168
|
this._xyzWork0 = candidate.startPoint(this._xyzWork0);
|
|
174
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0
|
|
169
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0);
|
|
175
170
|
if (connect) {
|
|
176
171
|
if (connect.atEnd) {
|
|
177
172
|
const chain = this._chains[connect.chainIndex];
|
|
178
173
|
const index0 = chain.length - 1;
|
|
179
174
|
this._chains[connect.chainIndex].push(candidate);
|
|
180
|
-
|
|
181
|
-
this.searchAndMergeChainIndex(connect.chainIndex
|
|
175
|
+
this.moveHeadOrTail(chain[index0], chain[index0 + 1]);
|
|
176
|
+
this.searchAndMergeChainIndex(connect.chainIndex);
|
|
182
177
|
return true;
|
|
183
178
|
}
|
|
184
179
|
else {
|
|
185
180
|
candidate.reverseInPlace();
|
|
186
181
|
const chain = this._chains[connect.chainIndex];
|
|
187
182
|
chain.splice(0, 0, candidate);
|
|
188
|
-
|
|
189
|
-
this.searchAndMergeChainIndex(connect.chainIndex
|
|
183
|
+
this.moveHeadOrTail(chain[0], chain[1]);
|
|
184
|
+
this.searchAndMergeChainIndex(connect.chainIndex);
|
|
190
185
|
return true;
|
|
191
186
|
}
|
|
192
187
|
}
|
|
193
188
|
else {
|
|
194
189
|
this._xyzWork0 = candidate.endPoint(this._xyzWork0);
|
|
195
|
-
connect = this.findAnyChainToConnect(this._xyzWork0
|
|
190
|
+
connect = this.findAnyChainToConnect(this._xyzWork0);
|
|
196
191
|
if (connect) {
|
|
197
192
|
if (connect.atEnd) {
|
|
198
193
|
candidate.reverseInPlace();
|
|
199
194
|
const chain = this._chains[connect.chainIndex];
|
|
200
195
|
const index0 = chain.length - 1;
|
|
201
196
|
this._chains[connect.chainIndex].push(candidate);
|
|
202
|
-
|
|
203
|
-
this.searchAndMergeChainIndex(connect.chainIndex
|
|
197
|
+
this.moveHeadOrTail(chain[index0], chain[index0 + 1]);
|
|
198
|
+
this.searchAndMergeChainIndex(connect.chainIndex);
|
|
204
199
|
return true;
|
|
205
200
|
}
|
|
206
201
|
else {
|
|
207
202
|
const chain = this._chains[connect.chainIndex];
|
|
208
203
|
chain.splice(0, 0, candidate);
|
|
209
|
-
|
|
210
|
-
this.searchAndMergeChainIndex(connect.chainIndex
|
|
204
|
+
this.moveHeadOrTail(chain[0], chain[1]);
|
|
205
|
+
this.searchAndMergeChainIndex(connect.chainIndex);
|
|
211
206
|
return true;
|
|
212
207
|
}
|
|
213
208
|
}
|
|
@@ -244,13 +239,13 @@ export class MultiChainCollector {
|
|
|
244
239
|
p.reverseInPlace();
|
|
245
240
|
}
|
|
246
241
|
/** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */
|
|
247
|
-
searchAndMergeChainIndex(chainIndex
|
|
242
|
+
searchAndMergeChainIndex(chainIndex) {
|
|
248
243
|
// ASSUME valid index of non-empty chain
|
|
249
244
|
const chain = this._chains[chainIndex];
|
|
250
245
|
const lastIndexInChain = chain.length - 1;
|
|
251
246
|
this._xyzWork0 = chain[0].startPoint(this._xyzWork0);
|
|
252
247
|
// try start with any other chain
|
|
253
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
248
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);
|
|
254
249
|
if (connect) {
|
|
255
250
|
if (!connect.atEnd)
|
|
256
251
|
this.reverseChain(connect.chainIndex);
|
|
@@ -259,7 +254,7 @@ export class MultiChainCollector {
|
|
|
259
254
|
}
|
|
260
255
|
// try end with any other chain
|
|
261
256
|
this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);
|
|
262
|
-
connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
257
|
+
connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);
|
|
263
258
|
if (connect) {
|
|
264
259
|
if (connect.atEnd)
|
|
265
260
|
this.reverseChain(connect.chainIndex);
|
|
@@ -281,7 +276,7 @@ export class MultiChainCollector {
|
|
|
281
276
|
const primitiveN = curves[curves.length - 1];
|
|
282
277
|
MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);
|
|
283
278
|
MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);
|
|
284
|
-
if (
|
|
279
|
+
if (this.moveHeadOrTail(primitiveN, primitive0)) {
|
|
285
280
|
// get the corrected coordinates
|
|
286
281
|
MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);
|
|
287
282
|
MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { RegionOps } from \"../RegionOps\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\n * * The caller makes a sequence of calls to announce individual primitives.\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\n * * Usage pattern is\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\n * * many times:\n * * `context.captureCurve(anyCurve)`\n * * `context.captureCurvePrimitive(primitive)`\n * * end: `result = context.grabResult(makeLoopIfClosed)`\n * @internal\n */\nexport class MultiChainCollector {\n /** Accumulated chains. */\n private _chains: CurvePrimitive[][];\n /** Largest gap distance to close. */\n private _gapTolerance: number;\n /** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */\n private _snapTolerance: number;\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\n private _planeTolerance: number | undefined;\n\n private static _staticPointA: Point3d;\n private static _staticPointB: Point3d;\n private _xyzWork0?: Point3d;\n private _xyzWork1?: Point3d;\n\n /** Initialize with an empty array of chains.\n * @param gapTolerance distance tolerance for calling endpoints identical\n * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.\n */\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\n this._chains = [];\n this._gapTolerance = gapTolerance;\n this._snapTolerance = Geometry.smallMetricDistance;\n this._planeTolerance = planeTolerance;\n }\n /**\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\n * @param xyz endpoint to check\n * @param distanceTol absolute distance tolerance for equating endpoints\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\n */\n private findAnyChainToConnect(xyz: Point3d, distanceTol: number, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\n if (exceptChainIndex === chainIndexA)\n continue;\n const chain = this._chains[chainIndexA];\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\n return { chainIndex: chainIndexA, atEnd: true };\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))\n return { chainIndex: chainIndexA, atEnd: false };\n }\n return undefined;\n }\n /**\n * Insert a single curve primitive into the active chains.\n * * The primitive is captured (not cloned)\n * * The primitive may be reversed in place\n * @param candidate curve to add to the context\n */\n public captureCurvePrimitive(candidate: CurvePrimitive) {\n if (this._snapTolerance < this._gapTolerance) {\n if (this.attachPrimitiveToAnyChain(candidate, this._snapTolerance))\n return;\n }\n if (this.attachPrimitiveToAnyChain(candidate, this._gapTolerance))\n return;\n this._chains.push([candidate]);\n }\n /**\n * Insert any curve into the collection.\n * * This recurses into Path, Loop, BagOfCurves etc\n * * All primitives are captured, and may be reversed in place.\n * @param candidate curve to add to the context\n */\n public captureCurve(candidate: AnyCurve) {\n if (candidate instanceof CurvePrimitive)\n this.captureCurvePrimitive(candidate);\n else if (candidate instanceof CurveCollection) {\n for (const c of candidate.children)\n this.captureCurve(c);\n }\n }\n /** If allowed by the geometry type, move an endpoint. */\n private static simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\n if (curve instanceof (LineSegment3d)) {\n if (atEnd) {\n curve.point1Ref.setFrom(to);\n } else {\n curve.point0Ref.setFrom(to);\n }\n return true;\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\n const i = atEnd ? curve.numPoints() - 1 : 0;\n curve.packedPoints.setAtCheckedPointIndex(i, to);\n return true;\n }\n return false;\n }\n /**\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\n * * All z-coordinates are ignored.\n * @param curve0 first curve, assumed to end close to the start of curve1\n * @param curve1 second curve, assumed to start close to the end of curve0\n * @param gapTolerance max distance to move a curve start/end point\n * @returns whether curve start/end point(s) moved\n */\n private static moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive, gapTolerance: number): boolean {\n const xyz0 = curve0.endPoint();\n const xyz1 = curve1.startPoint();\n const minShift = Geometry.smallMetricDistance * 0.001;\n const d01 = xyz0.distanceXY(xyz1);\n if (d01 < minShift)\n return false;\n // try lines and linestrings\n if (d01 < gapTolerance) {\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\n return true;\n }\n // try other primitive types\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\n const shiftFactor = 5.0;\n for (const pair of intersections) {\n const detail0 = pair.detailA;\n const detail1 = pair.detailB;\n const distance0 = detail0.point.distanceXY(xyz0);\n const distance1 = detail1.point.distanceXY(xyz1);\n if (distance0 < shiftFactor * gapTolerance && distance1 < shiftFactor * gapTolerance) {\n if (curve0 instanceof Arc3d && curve1 instanceof Arc3d) {\n const radians0End = curve0.sweep.fractionToRadians(detail0.fraction);\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\n const radians1Start = curve1.sweep.fractionToRadians(detail1.fraction);\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\n return true;\n }\n // TODO: other combinations of types\n }\n }\n return false;\n }\n /** Announce a curve primitive\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\n * * Otherwise start a new chain.\n */\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive, distanceTol: number): boolean {\n if (candidate.curveLength() < distanceTol) {\n return true;\n } else {\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\n if (connect) {\n if (connect.atEnd) {\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n } else {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n }\n } else {\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);\n if (connect) {\n if (connect.atEnd) {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n } else {\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);\n this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);\n return true;\n }\n }\n }\n }\n return false;\n }\n /**\n * Merge two entries in the chain array.\n * * Move each primitive from chainB to the end of chainA.\n * * Clear chainB.\n * * Move the final chain to chainB index.\n * * Decrement the array length.\n * @param chainIndexA index of chainA\n * @param chainIndexB index of chainB\n */\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\n const chainA = this._chains[chainIndexA];\n const chainB = this._chains[chainIndexB];\n for (const p of chainB) {\n chainA.push(p);\n }\n chainB.length = 0; // chainIndexB is unused\n const lastChainIndex = this._chains.length - 1;\n if (chainIndexB !== lastChainIndex)\n this._chains[chainIndexB] = this._chains[lastChainIndex];\n this._chains.pop();\n }\n /** Reverse the curve chain in place. */\n private reverseChain(chainIndex: number) {\n const chain = this._chains[chainIndex];\n chain.reverse();\n for (const p of chain)\n p.reverseInPlace();\n }\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\n private searchAndMergeChainIndex(chainIndex: number, distanceTol: number): void {\n // ASSUME valid index of non-empty chain\n const chain = this._chains[chainIndex];\n const lastIndexInChain = chain.length - 1;\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\n // try start with any other chain\n let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\n if (connect) {\n if (!connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\n return;\n }\n // try end with any other chain\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);\n if (connect) {\n if (connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\n return;\n }\n }\n /**\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\n */\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\n if (curves.length === 0)\n return undefined;\n if (makeLoopIfClosed) {\n const primitive0 = curves[0];\n const primitiveN = curves[curves.length - 1];\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n if (MultiChainCollector.moveHeadOrTail(primitiveN, primitive0, this._gapTolerance)) {\n // get the corrected coordinates\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n }\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\n if (localToWorld) {\n const worldToLocal = localToWorld.inverse();\n if (worldToLocal) {\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\n return Loop.createArray(curves);\n }\n }\n }\n return Path.createArray(curves);\n }\n }\n if (curves.length === 1)\n return curves[0];\n return Path.createArray(curves);\n }\n /** Stroke the curve chain to a line string, de-duplicate the points. */\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\n if (chain.length === 0)\n return undefined;\n const linestring = LineString3d.create();\n for (const curve of chain)\n curve.emitStrokes(linestring, options);\n linestring.removeDuplicatePoints(this._gapTolerance);\n return linestring;\n }\n /** Return the collected results, structured as the simplest possible type. */\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\n const chains = this._chains;\n if (chains.length === 0)\n return undefined;\n if (chains.length === 1)\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\n const bag = BagOfCurves.create();\n for (const chain of chains) {\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\n bag.tryAddChild(q);\n }\n return bag;\n }\n /**\n * Return chains as individual calls to announceChain.\n * * Does not use planeTolerance.\n */\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\n const chains = this._chains;\n if (chains.length === 1) {\n const ls = this.chainToLineString3d(chains[0], options);\n if (ls)\n announceChain(ls);\n } else if (chains.length > 1) {\n for (const chain of chains) {\n const ls = this.chainToLineString3d(chain, options);\n if (ls)\n announceChain(ls);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module Curve\n */\n\nimport { Geometry } from \"../../Geometry\";\nimport { FrameBuilder } from \"../../geometry3d/FrameBuilder\";\nimport { Point3d } from \"../../geometry3d/Point3dVector3d\";\nimport { XYAndZ } from \"../../geometry3d/XYZProps\";\nimport { Arc3d } from \"../Arc3d\";\nimport { BagOfCurves, CurveCollection } from \"../CurveCollection\";\nimport { CurveCurve } from \"../CurveCurve\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { AnyChain, AnyCurve } from \"../CurveTypes\";\nimport { LineSegment3d } from \"../LineSegment3d\";\nimport { LineString3d } from \"../LineString3d\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { RegionOps } from \"../RegionOps\";\nimport { StrokeOptions } from \"../StrokeOptions\";\n\n/**\n * Manage a growing array of arrays of curve primitives that are to be joined \"head to tail\" in paths.\n * * The caller makes a sequence of calls to announce individual primitives.\n * * This collector (unlike the simpler [[ChainCollectorContext]]) expects to have inputs arriving in random order, leaving multiple open chains in play at any time.\n * * When all curves have been announced, the call to `grabResult` restructures the various active chains into Paths (and optionally, Loops).\n * * Chain formation is dependent upon input fragment order, as a greedy algorithm is employed.\n * * Usage pattern is\n * * initialization: `context = new MultiChainCollector(gapTol, planeTol)`\n * * many times:\n * * `context.captureCurve(anyCurve)`\n * * `context.captureCurvePrimitive(primitive)`\n * * end: `result = context.grabResult(makeLoopIfClosed)`\n * @internal\n */\nexport class MultiChainCollector {\n /** Accumulated chains. */\n private _chains: CurvePrimitive[][];\n /** Largest gap distance to close. */\n private _gapTolerance: number;\n /** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */\n private _planeTolerance: number | undefined;\n\n private static _staticPointA: Point3d;\n private static _staticPointB: Point3d;\n private _xyzWork0?: Point3d;\n private _xyzWork1?: Point3d;\n\n /** Initialize with an empty array of chains.\n * @param gapTolerance distance tolerance for calling endpoints identical\n * @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within this tolerance of a plane.\n */\n public constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance?: number) {\n this._chains = [];\n this._gapTolerance = gapTolerance;\n this._planeTolerance = planeTolerance;\n }\n /**\n * Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz\n * @param xyz endpoint to check\n * @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.\n */\n private findAnyChainToConnect(xyz: Point3d, exceptChainIndex: number = -1): { chainIndex: number, atEnd: boolean } | undefined {\n for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {\n if (exceptChainIndex === chainIndexA)\n continue;\n const chain = this._chains[chainIndexA];\n this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))\n return { chainIndex: chainIndexA, atEnd: true };\n this._xyzWork1 = chain[0].startPoint(this._xyzWork1);\n if (this._xyzWork1.isAlmostEqual(xyz, this._gapTolerance))\n return { chainIndex: chainIndexA, atEnd: false };\n }\n return undefined;\n }\n /**\n * Insert a single curve primitive into the active chains.\n * * The primitive is captured (not cloned)\n * * The primitive may be reversed in place\n * @param candidate curve to add to the context\n */\n public captureCurvePrimitive(candidate: CurvePrimitive) {\n if (this.attachPrimitiveToAnyChain(candidate))\n return;\n this._chains.push([candidate]);\n }\n /**\n * Insert any curve into the collection.\n * * This recurses into Path, Loop, BagOfCurves etc\n * * All primitives are captured, and may be reversed in place.\n * @param candidate curve to add to the context\n */\n public captureCurve(candidate: AnyCurve) {\n if (candidate instanceof CurvePrimitive)\n this.captureCurvePrimitive(candidate);\n else if (candidate instanceof CurveCollection) {\n for (const c of candidate.children)\n this.captureCurve(c);\n }\n }\n /** If allowed by the geometry type, move an endpoint. */\n private simpleEndPointMove(curve: CurvePrimitive, atEnd: boolean, to: XYAndZ): boolean {\n if (curve instanceof (LineSegment3d)) {\n if (atEnd) {\n curve.point1Ref.setFrom(to);\n } else {\n curve.point0Ref.setFrom(to);\n }\n return true;\n } else if (curve instanceof LineString3d && curve.numPoints() > 0) {\n const i = atEnd ? curve.numPoints() - 1 : 0;\n curve.packedPoints.setAtCheckedPointIndex(i, to);\n return true;\n }\n return false;\n }\n /**\n * Try to move the end of curve0 and/or the start of curve1 to a common point.\n * * All z-coordinates are ignored.\n * @param curve0 first curve, assumed to end close to the start of curve1\n * @param curve1 second curve, assumed to start close to the end of curve0\n * @returns whether curve start/end point(s) moved\n */\n private moveHeadOrTail(curve0: CurvePrimitive, curve1: CurvePrimitive): boolean {\n const xyz0 = curve0.endPoint();\n const xyz1 = curve1.startPoint();\n const minShift = Geometry.smallMetricDistance * 0.001;\n let dist2 = xyz0.distanceSquaredXY(xyz1);\n if (dist2 <= minShift * minShift)\n return false; // if the move would be miniscule, don't bother\n const gap2 = this._gapTolerance * this._gapTolerance;\n if (dist2 > gap2)\n return false;\n // try lines and linestrings\n if (this.simpleEndPointMove(curve1, false, xyz0) || this.simpleEndPointMove(curve0, true, xyz1))\n return true;\n\n // try other primitive types\n if (!(curve0 instanceof Arc3d && curve1 instanceof Arc3d))\n return false; // currently we only consider 2 arcs\n\n const intersections = CurveCurve.intersectionXYPairs(curve0, true, curve1, true);\n let iClosest = -1;\n let minDist2 = Infinity;\n for (let i = 0; i < intersections.length; ++i) { // find intersection closest to the joint\n const dist20 = intersections[i].detailA.point.distanceSquaredXY(xyz0);\n const dist21 = intersections[i].detailB.point.distanceSquaredXY(xyz1);\n dist2 = dist20 + dist21;\n if (dist20 <= gap2 && dist21 <= gap2 && dist2 < minDist2) {\n minDist2 = dist2;\n iClosest = i;\n }\n }\n if (iClosest >= 0) { // move arc ends to the intersection point\n const radians0End = curve0.sweep.fractionToRadians(intersections[iClosest].detailA.fraction);\n curve0.sweep.setStartEndRadians(curve0.sweep.startRadians, radians0End);\n const radians1Start = curve1.sweep.fractionToRadians(intersections[iClosest].detailB.fraction);\n curve1.sweep.setStartEndRadians(radians1Start, curve1.sweep.endRadians);\n return true;\n }\n return false;\n }\n /** Announce a curve primitive\n * * If a \"nearby\" connection is possible, insert the candidate in the chain and force endpoint match.\n * * Otherwise start a new chain.\n */\n private attachPrimitiveToAnyChain(candidate: CurvePrimitive): boolean {\n if (candidate.curveLength() < this._gapTolerance) {\n return true;\n } else {\n this._xyzWork0 = candidate.startPoint(this._xyzWork0);\n let connect = this.findAnyChainToConnect(this._xyzWork0);\n if (connect) {\n if (connect.atEnd) {\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n this.moveHeadOrTail(chain[index0], chain[index0 + 1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n } else {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n this.moveHeadOrTail(chain[0], chain[1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n }\n } else {\n this._xyzWork0 = candidate.endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0);\n if (connect) {\n if (connect.atEnd) {\n candidate.reverseInPlace();\n const chain = this._chains[connect.chainIndex];\n const index0 = chain.length - 1;\n this._chains[connect.chainIndex].push(candidate);\n this.moveHeadOrTail(chain[index0], chain[index0 + 1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n } else {\n const chain = this._chains[connect.chainIndex];\n chain.splice(0, 0, candidate);\n this.moveHeadOrTail(chain[0], chain[1]);\n this.searchAndMergeChainIndex(connect.chainIndex);\n return true;\n }\n }\n }\n }\n return false;\n }\n /**\n * Merge two entries in the chain array.\n * * Move each primitive from chainB to the end of chainA.\n * * Clear chainB.\n * * Move the final chain to chainB index.\n * * Decrement the array length.\n * @param chainIndexA index of chainA\n * @param chainIndexB index of chainB\n */\n private mergeChainsForwardForward(chainIndexA: number, chainIndexB: number) {\n const chainA = this._chains[chainIndexA];\n const chainB = this._chains[chainIndexB];\n for (const p of chainB) {\n chainA.push(p);\n }\n chainB.length = 0; // chainIndexB is unused\n const lastChainIndex = this._chains.length - 1;\n if (chainIndexB !== lastChainIndex)\n this._chains[chainIndexB] = this._chains[lastChainIndex];\n this._chains.pop();\n }\n /** Reverse the curve chain in place. */\n private reverseChain(chainIndex: number) {\n const chain = this._chains[chainIndex];\n chain.reverse();\n for (const p of chain)\n p.reverseInPlace();\n }\n /** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */\n private searchAndMergeChainIndex(chainIndex: number): void {\n // ASSUME valid index of non-empty chain\n const chain = this._chains[chainIndex];\n const lastIndexInChain = chain.length - 1;\n this._xyzWork0 = chain[0].startPoint(this._xyzWork0);\n // try start with any other chain\n let connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);\n if (connect) {\n if (!connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(connect.chainIndex, chainIndex);\n return;\n }\n // try end with any other chain\n this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);\n connect = this.findAnyChainToConnect(this._xyzWork0, chainIndex);\n if (connect) {\n if (connect.atEnd)\n this.reverseChain(connect.chainIndex);\n this.mergeChainsForwardForward(chainIndex, connect.chainIndex);\n return;\n }\n }\n /**\n * Convert an array of curve primitives into the simplest possible strongly typed curve structure.\n * @param curves input array, assembled correctly into a single contiguous path, captured by returned object\n * @param makeLoopIfClosed whether to return a Loop from physically closed coplanar curves, otherwise Path\n * @return Loop or Path if multiple curves; the primitive if only one curve; undefined if no curves\n */\n private promoteArrayToCurves(curves: CurvePrimitive[], makeLoopIfClosed: boolean): CurvePrimitive | Path | Loop | undefined {\n if (curves.length === 0)\n return undefined;\n if (makeLoopIfClosed) {\n const primitive0 = curves[0];\n const primitiveN = curves[curves.length - 1];\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n if (this.moveHeadOrTail(primitiveN, primitive0)) {\n // get the corrected coordinates\n MultiChainCollector._staticPointA = primitive0.startPoint(MultiChainCollector._staticPointA);\n MultiChainCollector._staticPointB = primitiveN.endPoint(MultiChainCollector._staticPointB);\n }\n if (MultiChainCollector._staticPointA.isAlmostEqual(MultiChainCollector._staticPointB, this._gapTolerance)) {\n const localToWorld = FrameBuilder.createRightHandedLocalToWorld(curves);\n if (localToWorld) {\n const worldToLocal = localToWorld.inverse();\n if (worldToLocal) {\n const range = RegionOps.curveArrayRange(curves, worldToLocal);\n if (this._planeTolerance !== undefined && range.zLength() <= this._planeTolerance) {\n return Loop.createArray(curves);\n }\n }\n }\n return Path.createArray(curves);\n }\n }\n if (curves.length === 1)\n return curves[0];\n return Path.createArray(curves);\n }\n /** Stroke the curve chain to a line string, de-duplicate the points. */\n private chainToLineString3d(chain: CurvePrimitive[], options?: StrokeOptions): LineString3d | undefined {\n if (chain.length === 0)\n return undefined;\n const linestring = LineString3d.create();\n for (const curve of chain)\n curve.emitStrokes(linestring, options);\n linestring.removeDuplicatePoints(this._gapTolerance);\n return linestring;\n }\n /** Return the collected results, structured as the simplest possible type. */\n public grabResult(makeLoopIfClosed: boolean = false): AnyChain | undefined {\n const chains = this._chains;\n if (chains.length === 0)\n return undefined;\n if (chains.length === 1)\n return this.promoteArrayToCurves(chains[0], makeLoopIfClosed);\n const bag = BagOfCurves.create();\n for (const chain of chains) {\n const q = this.promoteArrayToCurves(chain, makeLoopIfClosed);\n bag.tryAddChild(q);\n }\n return bag;\n }\n /**\n * Return chains as individual calls to announceChain.\n * * Does not use planeTolerance.\n */\n public announceChainsAsLineString3d(announceChain: (ls: LineString3d) => void, options?: StrokeOptions): void {\n const chains = this._chains;\n if (chains.length === 1) {\n const ls = this.chainToLineString3d(chains[0], options);\n if (ls)\n announceChain(ls);\n } else if (chains.length > 1) {\n for (const chain of chains) {\n const ls = this.chainToLineString3d(chain, options);\n if (ls)\n announceChain(ls);\n }\n }\n }\n}\n"]}
|
|
@@ -195,10 +195,7 @@ export declare class Transform implements BeJSONFunctions {
|
|
|
195
195
|
* Return as a new point or in the pre-allocated result (if result is given).
|
|
196
196
|
*/
|
|
197
197
|
multiplyPoint3d(point: XYAndZ, result?: Point3d): Point3d;
|
|
198
|
-
/**
|
|
199
|
-
* Transform the input 3d point in place (using `Tp = M*p + o`).
|
|
200
|
-
* Return as a new point or in the pre-allocated result (if result is given).
|
|
201
|
-
*/
|
|
198
|
+
/** Transform the input 3d point in place (using `Tp = M*p + o`). */
|
|
202
199
|
multiplyXYAndZInPlace(point: XYAndZ): void;
|
|
203
200
|
/**
|
|
204
201
|
* Transform the input 3d point (using `Tp = M*p + o`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Transform.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Transform.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Transform.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -373,10 +373,7 @@ export class Transform {
|
|
|
373
373
|
// Tx = Mx + o so we return Mx + o
|
|
374
374
|
return Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, result);
|
|
375
375
|
}
|
|
376
|
-
/**
|
|
377
|
-
* Transform the input 3d point in place (using `Tp = M*p + o`).
|
|
378
|
-
* Return as a new point or in the pre-allocated result (if result is given).
|
|
379
|
-
*/
|
|
376
|
+
/** Transform the input 3d point in place (using `Tp = M*p + o`). */
|
|
380
377
|
multiplyXYAndZInPlace(point) {
|
|
381
378
|
return Matrix3d.xyzPlusMatrixTimesXYZInPlace(this._origin, this._matrix, point);
|
|
382
379
|
}
|