@itwin/core-geometry 4.1.0-dev.73 → 4.1.0-dev.75
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/lib/cjs/core-geometry.d.ts +2 -0
- package/lib/cjs/core-geometry.d.ts.map +1 -1
- package/lib/cjs/core-geometry.js +2 -0
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +5 -0
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +5 -0
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +29 -19
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +25 -7
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +61 -8
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +30 -5
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/core-geometry.d.ts +2 -0
- package/lib/esm/core-geometry.d.ts.map +1 -1
- package/lib/esm/core-geometry.js +2 -0
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +5 -0
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +5 -0
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +29 -19
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +25 -7
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +62 -9
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +30 -6
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -12,7 +12,8 @@ import { Range3d } from "../../geometry3d/Range";
|
|
|
12
12
|
import { Geometry } from "../../Geometry";
|
|
13
13
|
import { ClipPlane } from "../../clipping/ClipPlane";
|
|
14
14
|
import { ConvexClipPlaneSet } from "../../clipping/ConvexClipPlaneSet";
|
|
15
|
-
import { Point3dArrayPolygonOps } from "../../geometry3d/PolygonOps";
|
|
15
|
+
import { IndexedXYZCollectionPolygonOps, Point3dArrayPolygonOps } from "../../geometry3d/PolygonOps";
|
|
16
|
+
import { Matrix3d } from "../../geometry3d/Matrix3d";
|
|
16
17
|
export class SweepLineStringToFacetContext {
|
|
17
18
|
constructor(spacePoints) {
|
|
18
19
|
// temporaries reused over multiple calls to process a single facet . ..
|
|
@@ -94,7 +95,7 @@ export class SweepLineStringToFacetContext {
|
|
|
94
95
|
* Context for sweeping a line segment onto a convex polygon.
|
|
95
96
|
* @internal
|
|
96
97
|
*/
|
|
97
|
-
class EdgeClipData {
|
|
98
|
+
export class EdgeClipData {
|
|
98
99
|
/** CAPTURE the planes */
|
|
99
100
|
constructor(edgePlane, clip) {
|
|
100
101
|
this.edgePlane = edgePlane;
|
|
@@ -118,10 +119,13 @@ class EdgeClipData {
|
|
|
118
119
|
}
|
|
119
120
|
return undefined;
|
|
120
121
|
}
|
|
122
|
+
/** Intersect this edge plane with the given convex polygon and announce the intersection segment to the callback. */
|
|
121
123
|
processPolygon(polygon, announceEdge) {
|
|
122
124
|
this._crossingPoints.length = 0;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
if (Array.isArray(polygon))
|
|
126
|
+
Point3dArrayPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);
|
|
127
|
+
else
|
|
128
|
+
IndexedXYZCollectionPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);
|
|
125
129
|
if (this._crossingPoints.length === 2) {
|
|
126
130
|
// use the end planes to clip the [0,1] swept edge to [f0,f1]
|
|
127
131
|
this.clip.announceClippedSegmentIntervals(0, 1, this._crossingPoints[0], this._crossingPoints[1], (f0, f1) => {
|
|
@@ -135,8 +139,13 @@ class EdgeClipData {
|
|
|
135
139
|
* @internal
|
|
136
140
|
*/
|
|
137
141
|
export class ClipSweptLineStringContext {
|
|
138
|
-
constructor(edgeData) {
|
|
142
|
+
constructor(edgeData, localData) {
|
|
139
143
|
this._edgeClippers = edgeData;
|
|
144
|
+
if (localData !== undefined) {
|
|
145
|
+
this._localToWorld = localData.localToWorld;
|
|
146
|
+
this._worldToLocal = localData.worldToLocal;
|
|
147
|
+
this._localRange = localData.localRange;
|
|
148
|
+
}
|
|
140
149
|
}
|
|
141
150
|
static create(xyz, sweepVector) {
|
|
142
151
|
if (sweepVector === undefined)
|
|
@@ -146,6 +155,12 @@ export class ClipSweptLineStringContext {
|
|
|
146
155
|
const newPoint = Point3d.createZero();
|
|
147
156
|
const edgeData = [];
|
|
148
157
|
xyz.getPoint3dAtUncheckedPointIndex(0, point);
|
|
158
|
+
let localToWorldMatrix = Matrix3d.createRigidHeadsUp(sweepVector);
|
|
159
|
+
if (localToWorldMatrix === undefined)
|
|
160
|
+
localToWorldMatrix = Matrix3d.createIdentity();
|
|
161
|
+
const localToWorld = Transform.createOriginAndMatrix(point, localToWorldMatrix);
|
|
162
|
+
const worldToLocal = localToWorld.inverse();
|
|
163
|
+
const localRange = xyz.getRange(worldToLocal);
|
|
149
164
|
for (let i = 1; i < xyz.length; i++) {
|
|
150
165
|
xyz.getPoint3dAtUncheckedPointIndex(i, newPoint);
|
|
151
166
|
const clipper = EdgeClipData.createPointPointSweep(point, newPoint, sweepVector);
|
|
@@ -154,11 +169,20 @@ export class ClipSweptLineStringContext {
|
|
|
154
169
|
edgeData.push(clipper);
|
|
155
170
|
}
|
|
156
171
|
}
|
|
157
|
-
return new ClipSweptLineStringContext(edgeData);
|
|
172
|
+
return new ClipSweptLineStringContext(edgeData, { localToWorld, worldToLocal, localRange });
|
|
158
173
|
}
|
|
159
174
|
return undefined;
|
|
160
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Intersect a polygon with each of the edgeClippers.
|
|
178
|
+
* * If transforms and local range are defined, test the polygon's local range to see if it offers a quick exit.
|
|
179
|
+
*/
|
|
161
180
|
processPolygon(polygon, announceEdge) {
|
|
181
|
+
if (this._worldToLocal !== undefined && this._localRange !== undefined) {
|
|
182
|
+
const polygonRange = Range3d.createTransformedArray(this._worldToLocal, polygon);
|
|
183
|
+
if (!polygonRange.intersectsRangeXY(this._localRange))
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
162
186
|
for (const clipper of this._edgeClippers) {
|
|
163
187
|
clipper.processPolygon(polygon, announceEdge);
|
|
164
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SweepLineStringToFacetContext.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/SweepLineStringToFacetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Polyface\r\n */\r\n\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { GrowableXYZArray } from \"../../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\r\nimport { AnnounceDrapePanel } from \"../PolyfaceQuery\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Polyface } from \"../Polyface\";\r\nimport { ClipPlane } from \"../../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../../clipping/ConvexClipPlaneSet\";\r\nimport { Point3dArrayPolygonOps } from \"../../geometry3d/PolygonOps\";\r\n\r\nexport class SweepLineStringToFacetContext {\r\n private _spacePoints: GrowableXYZArray;\r\n private _spacePointsRange: Range3d;\r\n private _numSpacePoints: number;\r\n private constructor(spacePoints: GrowableXYZArray) {\r\n this._spacePoints = spacePoints;\r\n this._spacePointsRange = new Range3d();\r\n spacePoints.setRange(this._spacePointsRange);\r\n this._numSpacePoints = this._spacePoints.length;\r\n }\r\n public static create(xyz: GrowableXYZArray): SweepLineStringToFacetContext | undefined {\r\n if (xyz.length > 1) {\r\n return new SweepLineStringToFacetContext(xyz.clone());\r\n }\r\n return undefined;\r\n }\r\n\r\n // temporaries reused over multiple calls to process a single facet . ..\r\n private _segmentPoint0 = Point3d.create();\r\n private _segmentPoint1 = Point3d.create();\r\n private _localSegmentPoint0 = Point3d.create();\r\n private _localSegmentPoint1 = Point3d.create();\r\n private _clipFractions = Segment1d.create(0, 1);\r\n private _localFrame = Transform.createIdentity();\r\n private _polygonRange = Range3d.create();\r\n\r\n /** process a single polygon.\r\n * @returns number crudely indicating how much work was done.\r\n */\r\n public projectToPolygon(polygon: GrowableXYZArray, announce: AnnounceDrapePanel, polyface: Polyface, readIndex: number): number {\r\n polygon.setRange(this._polygonRange);\r\n let workCounter = 0;\r\n if (!this._polygonRange.intersectsRangeXY(this._spacePointsRange))\r\n return workCounter;\r\n // numTest++;\r\n // For each triangle within the facet ...\r\n // remark: this loop only runs once in triangle mesh, twice in quads ...\r\n for (let k1 = 1; k1 + 1 < polygon.length; k1++) {\r\n workCounter++;\r\n const frame = polygon.fillLocalXYTriangleFrame(0, k1, k1 + 1, this._localFrame);\r\n if (frame) {\r\n // For each stroke of the linestring ...\r\n for (let i1 = 1; i1 < this._numSpacePoints; i1++) {\r\n workCounter++;\r\n this._spacePoints.getPoint3dAtCheckedPointIndex(i1 - 1, this._segmentPoint0);\r\n this._spacePoints.getPoint3dAtCheckedPointIndex(i1, this._segmentPoint1);\r\n frame.multiplyInversePoint3d(this._segmentPoint0, this._localSegmentPoint0);\r\n frame.multiplyInversePoint3d(this._segmentPoint1, this._localSegmentPoint1);\r\n this._clipFractions.set(0, 1);\r\n /** (x,y,1-x-y) are barycentric coordinates in the triangle !!! */\r\n if (this._clipFractions.clipBy01FunctionValuesPositive(this._localSegmentPoint0.x, this._localSegmentPoint1.x)\r\n && this._clipFractions.clipBy01FunctionValuesPositive(this._localSegmentPoint0.y, this._localSegmentPoint1.y)\r\n && this._clipFractions.clipBy01FunctionValuesPositive(\r\n 1 - this._localSegmentPoint0.x - this._localSegmentPoint0.y,\r\n 1 - this._localSegmentPoint1.x - this._localSegmentPoint1.y)) {\r\n /* project the local segment point to the plane. */\r\n workCounter++;\r\n const localClippedPointA = this._localSegmentPoint0.interpolate(this._clipFractions.x0, this._localSegmentPoint1);\r\n const localClippedPointB = this._localSegmentPoint0.interpolate(this._clipFractions.x1, this._localSegmentPoint1);\r\n const worldClippedPointA = this._localFrame.multiplyPoint3d(localClippedPointA)!;\r\n const worldClippedPointB = this._localFrame.multiplyPoint3d(localClippedPointB)!;\r\n const planePointA = this._localFrame.multiplyXYZ(localClippedPointA.x, localClippedPointA.y, 0.0)!;\r\n const planePointB = this._localFrame.multiplyXYZ(localClippedPointB.x, localClippedPointB.y, 0.0)!;\r\n const splitParameter = Geometry.inverseInterpolate01(this._localSegmentPoint0.z, this._localSegmentPoint1.z);\r\n // emit 1 or 2 panels, oriented so panel normal is always to the left of the line.\r\n if (splitParameter !== undefined && splitParameter > this._clipFractions.x0 && splitParameter < this._clipFractions.x1) {\r\n workCounter++;\r\n const piercePointX = this._segmentPoint0.interpolate(splitParameter, this._segmentPoint1);\r\n const piercePointY = piercePointX.clone(); // so points are distinct for the two triangle announcements.\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointA, piercePointX, planePointA], 2, 1);\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointB, piercePointY, planePointB], 1, 2);\r\n } else if (this._localSegmentPoint0.z > 0) { // segment is entirely above\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointA, worldClippedPointB, planePointB, planePointA], 3, 2);\r\n } else // segment is entirely under\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointB, worldClippedPointA, planePointA, planePointB], 2, 3);\r\n }\r\n }\r\n }\r\n }\r\n return workCounter;\r\n }\r\n}\r\n\r\n/**\r\n * Context for sweeping a line segment onto a convex polygon.\r\n * @internal\r\n */\r\nclass EdgeClipData {\r\n /** Plane containing the edge and sweep vector */\r\n public edgePlane: ClipPlane;\r\n /** Two clip planes facing each other at each end of the edge */\r\n public clip: ConvexClipPlaneSet;\r\n /** work array for clipper method */\r\n private _crossingPoints: Point3d[];\r\n\r\n /** CAPTURE the planes */\r\n public constructor(edgePlane: ClipPlane, clip: ConvexClipPlaneSet) {\r\n this.edgePlane = edgePlane;\r\n this.clip = clip;\r\n this._crossingPoints = [];\r\n }\r\n /** create object from segment and sweep. Inputs are not captured. */\r\n public static createPointPointSweep(pointA: Point3d, pointB: Point3d, sweep: Vector3d): EdgeClipData | undefined {\r\n const edgeVector = Vector3d.createStartEnd(pointA, pointB);\r\n const fraction = edgeVector.fractionOfProjectionToVector(sweep);\r\n // The unbounded plane of the swept edge will intersect facets in lines that may extend beyond the swept bounded line.\r\n // That linework will be clipped between two facing planes with normal along the perpendicular dropped from the edge vector to the sweep vector.\r\n const clipNormal = edgeVector.plusScaled(sweep, -fraction);\r\n const planeA = ClipPlane.createNormalAndPoint(clipNormal, pointA);\r\n const planeB = ClipPlane.createNormalAndPoint(clipNormal, pointB);\r\n const edgePlane = ClipPlane.createOriginAndVectors(pointA, edgeVector, sweep);\r\n if (planeA !== undefined && planeB !== undefined && edgePlane !== undefined) {\r\n planeB.negateInPlace();\r\n const clipper = ConvexClipPlaneSet.createPlanes([planeA, planeB]);\r\n return new EdgeClipData(edgePlane, clipper);\r\n }\r\n return undefined;\r\n }\r\n\r\n public processPolygon(polygon: Point3d[], announceEdge: (pointA: Point3d, pointB: Point3d) => void) {\r\n this._crossingPoints.length = 0;\r\n Point3dArrayPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);\r\n // process a convex polygon (or non-convex if lucky)\r\n if (this._crossingPoints.length === 2) {\r\n // use the end planes to clip the [0,1] swept edge to [f0,f1]\r\n this.clip.announceClippedSegmentIntervals(0, 1, this._crossingPoints[0], this._crossingPoints[1],\r\n (f0: number, f1: number) => {\r\n announceEdge(this._crossingPoints[0].interpolate(f0, this._crossingPoints[1]),\r\n this._crossingPoints[0].interpolate(f1, this._crossingPoints[1]));\r\n },\r\n );\r\n }\r\n }\r\n}\r\n/**\r\n * Context for sweeping a line string onto a convex polygon.\r\n * @internal\r\n */\r\nexport class ClipSweptLineStringContext {\r\n private _edgeClippers: EdgeClipData[];\r\n private constructor(edgeData: EdgeClipData[]) {\r\n this._edgeClippers = edgeData;\r\n }\r\n public static create(xyz: GrowableXYZArray, sweepVector: Vector3d | undefined): ClipSweptLineStringContext | undefined {\r\n if (sweepVector === undefined)\r\n sweepVector = Vector3d.create(0, 0, 1);\r\n if (xyz.length > 1) {\r\n const point = Point3d.createZero();\r\n const newPoint = Point3d.createZero();\r\n const edgeData: EdgeClipData[] = [];\r\n xyz.getPoint3dAtUncheckedPointIndex(0, point);\r\n for (let i = 1; i < xyz.length; i++) {\r\n xyz.getPoint3dAtUncheckedPointIndex(i, newPoint);\r\n const clipper = EdgeClipData.createPointPointSweep(point, newPoint, sweepVector);\r\n if (clipper !== undefined) {\r\n point.setFrom(newPoint);\r\n edgeData.push(clipper);\r\n }\r\n }\r\n return new ClipSweptLineStringContext(edgeData);\r\n }\r\n return undefined;\r\n }\r\n public processPolygon(polygon: Point3d[], announceEdge: (pointA: Point3d, pointB: Point3d) => void) {\r\n for (const clipper of this._edgeClippers) {\r\n clipper.processPolygon(polygon, announceEdge);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SweepLineStringToFacetContext.js","sourceRoot":"","sources":["../../../../src/polyface/multiclip/SweepLineStringToFacetContext.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Polyface\r\n */\r\n\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { GrowableXYZArray } from \"../../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Segment1d } from \"../../geometry3d/Segment1d\";\r\nimport { AnnounceDrapePanel } from \"../PolyfaceQuery\";\r\nimport { Range3d } from \"../../geometry3d/Range\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Polyface } from \"../Polyface\";\r\nimport { ClipPlane } from \"../../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../../clipping/ConvexClipPlaneSet\";\r\nimport { IndexedXYZCollectionPolygonOps, Point3dArrayPolygonOps } from \"../../geometry3d/PolygonOps\";\r\nimport { Matrix3d } from \"../../geometry3d/Matrix3d\";\r\n\r\nexport class SweepLineStringToFacetContext {\r\n private _spacePoints: GrowableXYZArray;\r\n private _spacePointsRange: Range3d;\r\n private _numSpacePoints: number;\r\n private constructor(spacePoints: GrowableXYZArray) {\r\n this._spacePoints = spacePoints;\r\n this._spacePointsRange = new Range3d();\r\n spacePoints.setRange(this._spacePointsRange);\r\n this._numSpacePoints = this._spacePoints.length;\r\n }\r\n public static create(xyz: GrowableXYZArray): SweepLineStringToFacetContext | undefined {\r\n if (xyz.length > 1) {\r\n return new SweepLineStringToFacetContext(xyz.clone());\r\n }\r\n return undefined;\r\n }\r\n\r\n // temporaries reused over multiple calls to process a single facet . ..\r\n private _segmentPoint0 = Point3d.create();\r\n private _segmentPoint1 = Point3d.create();\r\n private _localSegmentPoint0 = Point3d.create();\r\n private _localSegmentPoint1 = Point3d.create();\r\n private _clipFractions = Segment1d.create(0, 1);\r\n private _localFrame = Transform.createIdentity();\r\n private _polygonRange = Range3d.create();\r\n\r\n /** process a single polygon.\r\n * @returns number crudely indicating how much work was done.\r\n */\r\n public projectToPolygon(polygon: GrowableXYZArray, announce: AnnounceDrapePanel, polyface: Polyface, readIndex: number): number {\r\n polygon.setRange(this._polygonRange);\r\n let workCounter = 0;\r\n if (!this._polygonRange.intersectsRangeXY(this._spacePointsRange))\r\n return workCounter;\r\n // numTest++;\r\n // For each triangle within the facet ...\r\n // remark: this loop only runs once in triangle mesh, twice in quads ...\r\n for (let k1 = 1; k1 + 1 < polygon.length; k1++) {\r\n workCounter++;\r\n const frame = polygon.fillLocalXYTriangleFrame(0, k1, k1 + 1, this._localFrame);\r\n if (frame) {\r\n // For each stroke of the linestring ...\r\n for (let i1 = 1; i1 < this._numSpacePoints; i1++) {\r\n workCounter++;\r\n this._spacePoints.getPoint3dAtCheckedPointIndex(i1 - 1, this._segmentPoint0);\r\n this._spacePoints.getPoint3dAtCheckedPointIndex(i1, this._segmentPoint1);\r\n frame.multiplyInversePoint3d(this._segmentPoint0, this._localSegmentPoint0);\r\n frame.multiplyInversePoint3d(this._segmentPoint1, this._localSegmentPoint1);\r\n this._clipFractions.set(0, 1);\r\n /** (x,y,1-x-y) are barycentric coordinates in the triangle !!! */\r\n if (this._clipFractions.clipBy01FunctionValuesPositive(this._localSegmentPoint0.x, this._localSegmentPoint1.x)\r\n && this._clipFractions.clipBy01FunctionValuesPositive(this._localSegmentPoint0.y, this._localSegmentPoint1.y)\r\n && this._clipFractions.clipBy01FunctionValuesPositive(\r\n 1 - this._localSegmentPoint0.x - this._localSegmentPoint0.y,\r\n 1 - this._localSegmentPoint1.x - this._localSegmentPoint1.y)) {\r\n /* project the local segment point to the plane. */\r\n workCounter++;\r\n const localClippedPointA = this._localSegmentPoint0.interpolate(this._clipFractions.x0, this._localSegmentPoint1);\r\n const localClippedPointB = this._localSegmentPoint0.interpolate(this._clipFractions.x1, this._localSegmentPoint1);\r\n const worldClippedPointA = this._localFrame.multiplyPoint3d(localClippedPointA)!;\r\n const worldClippedPointB = this._localFrame.multiplyPoint3d(localClippedPointB)!;\r\n const planePointA = this._localFrame.multiplyXYZ(localClippedPointA.x, localClippedPointA.y, 0.0)!;\r\n const planePointB = this._localFrame.multiplyXYZ(localClippedPointB.x, localClippedPointB.y, 0.0)!;\r\n const splitParameter = Geometry.inverseInterpolate01(this._localSegmentPoint0.z, this._localSegmentPoint1.z);\r\n // emit 1 or 2 panels, oriented so panel normal is always to the left of the line.\r\n if (splitParameter !== undefined && splitParameter > this._clipFractions.x0 && splitParameter < this._clipFractions.x1) {\r\n workCounter++;\r\n const piercePointX = this._segmentPoint0.interpolate(splitParameter, this._segmentPoint1);\r\n const piercePointY = piercePointX.clone(); // so points are distinct for the two triangle announcements.\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointA, piercePointX, planePointA], 2, 1);\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointB, piercePointY, planePointB], 1, 2);\r\n } else if (this._localSegmentPoint0.z > 0) { // segment is entirely above\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointA, worldClippedPointB, planePointB, planePointA], 3, 2);\r\n } else // segment is entirely under\r\n announce(this._spacePoints, i1 - 1, polyface, readIndex, [worldClippedPointB, worldClippedPointA, planePointA, planePointB], 2, 3);\r\n }\r\n }\r\n }\r\n }\r\n return workCounter;\r\n }\r\n}\r\n\r\n/**\r\n * Context for sweeping a line segment onto a convex polygon.\r\n * @internal\r\n */\r\nexport class EdgeClipData {\r\n /** Plane containing the edge and sweep vector */\r\n public edgePlane: ClipPlane;\r\n /** Two clip planes facing each other at each end of the edge */\r\n public clip: ConvexClipPlaneSet;\r\n /** work array for clipper method */\r\n private _crossingPoints: Point3d[];\r\n\r\n /** CAPTURE the planes */\r\n public constructor(edgePlane: ClipPlane, clip: ConvexClipPlaneSet) {\r\n this.edgePlane = edgePlane;\r\n this.clip = clip;\r\n this._crossingPoints = [];\r\n }\r\n /** create object from segment and sweep. Inputs are not captured. */\r\n public static createPointPointSweep(pointA: Point3d, pointB: Point3d, sweep: Vector3d): EdgeClipData | undefined {\r\n const edgeVector = Vector3d.createStartEnd(pointA, pointB);\r\n const fraction = edgeVector.fractionOfProjectionToVector(sweep);\r\n // The unbounded plane of the swept edge will intersect facets in lines that may extend beyond the swept bounded line.\r\n // That linework will be clipped between two facing planes with normal along the perpendicular dropped from the edge vector to the sweep vector.\r\n const clipNormal = edgeVector.plusScaled(sweep, -fraction);\r\n const planeA = ClipPlane.createNormalAndPoint(clipNormal, pointA);\r\n const planeB = ClipPlane.createNormalAndPoint(clipNormal, pointB);\r\n const edgePlane = ClipPlane.createOriginAndVectors(pointA, edgeVector, sweep);\r\n if (planeA !== undefined && planeB !== undefined && edgePlane !== undefined) {\r\n planeB.negateInPlace();\r\n const clipper = ConvexClipPlaneSet.createPlanes([planeA, planeB]);\r\n return new EdgeClipData(edgePlane, clipper);\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Intersect this edge plane with the given convex polygon and announce the intersection segment to the callback. */\r\n public processPolygon(polygon: Point3d[] | GrowableXYZArray, announceEdge: (pointA: Point3d, pointB: Point3d) => void) {\r\n this._crossingPoints.length = 0;\r\n if (Array.isArray(polygon))\r\n Point3dArrayPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);\r\n else\r\n IndexedXYZCollectionPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);\r\n if (this._crossingPoints.length === 2) {\r\n // use the end planes to clip the [0,1] swept edge to [f0,f1]\r\n this.clip.announceClippedSegmentIntervals(0, 1, this._crossingPoints[0], this._crossingPoints[1],\r\n (f0: number, f1: number) => {\r\n announceEdge(this._crossingPoints[0].interpolate(f0, this._crossingPoints[1]),\r\n this._crossingPoints[0].interpolate(f1, this._crossingPoints[1]));\r\n },\r\n );\r\n }\r\n }\r\n}\r\n/**\r\n * Context for sweeping a line string onto a convex polygon.\r\n * @internal\r\n */\r\nexport class ClipSweptLineStringContext {\r\n private _edgeClippers: EdgeClipData[];\r\n private _localToWorld?: Transform;\r\n private _worldToLocal?: Transform;\r\n private _localRange?: Range3d;\r\n private constructor(edgeData: EdgeClipData[], localData: undefined | { localToWorld: Transform, worldToLocal: Transform, localRange: Range3d }) {\r\n this._edgeClippers = edgeData;\r\n if (localData !== undefined) {\r\n this._localToWorld = localData.localToWorld;\r\n this._worldToLocal = localData.worldToLocal;\r\n this._localRange = localData.localRange;\r\n }\r\n }\r\n public static create(xyz: GrowableXYZArray, sweepVector: Vector3d | undefined): ClipSweptLineStringContext | undefined {\r\n if (sweepVector === undefined)\r\n sweepVector = Vector3d.create(0, 0, 1);\r\n if (xyz.length > 1) {\r\n const point = Point3d.createZero();\r\n const newPoint = Point3d.createZero();\r\n const edgeData: EdgeClipData[] = [];\r\n xyz.getPoint3dAtUncheckedPointIndex(0, point);\r\n\r\n let localToWorldMatrix = Matrix3d.createRigidHeadsUp(sweepVector);\r\n if (localToWorldMatrix === undefined)\r\n localToWorldMatrix = Matrix3d.createIdentity();\r\n const localToWorld = Transform.createOriginAndMatrix(point, localToWorldMatrix);\r\n const worldToLocal = localToWorld.inverse()!;\r\n const localRange = xyz.getRange(worldToLocal);\r\n for (let i = 1; i < xyz.length; i++) {\r\n xyz.getPoint3dAtUncheckedPointIndex(i, newPoint);\r\n const clipper = EdgeClipData.createPointPointSweep(point, newPoint, sweepVector);\r\n if (clipper !== undefined) {\r\n point.setFrom(newPoint);\r\n edgeData.push(clipper);\r\n }\r\n }\r\n return new ClipSweptLineStringContext(edgeData, { localToWorld, worldToLocal, localRange });\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Intersect a polygon with each of the edgeClippers.\r\n * * If transforms and local range are defined, test the polygon's local range to see if it offers a quick exit.\r\n */\r\n public processPolygon(polygon: Point3d[], announceEdge: (pointA: Point3d, pointB: Point3d) => void) {\r\n if (this._worldToLocal !== undefined && this._localRange !== undefined) {\r\n const polygonRange = Range3d.createTransformedArray(this._worldToLocal, polygon);\r\n if (!polygonRange.intersectsRangeXY(this._localRange))\r\n return;\r\n }\r\n for (const clipper of this._edgeClippers) {\r\n clipper.processPolygon(polygon, announceEdge);\r\n }\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-geometry",
|
|
3
|
-
"version": "4.1.0-dev.
|
|
3
|
+
"version": "4.1.0-dev.75",
|
|
4
4
|
"description": "iTwin.js Core Geometry library",
|
|
5
5
|
"main": "lib/cjs/core-geometry.js",
|
|
6
6
|
"module": "lib/esm/core-geometry.js",
|
|
@@ -35,11 +35,11 @@
|
|
|
35
35
|
"nyc": "^15.1.0",
|
|
36
36
|
"rimraf": "^3.0.2",
|
|
37
37
|
"typescript": "~5.0.2",
|
|
38
|
-
"@itwin/build-tools": "4.1.0-dev.
|
|
38
|
+
"@itwin/build-tools": "4.1.0-dev.75"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"flatbuffers": "~1.12.0",
|
|
42
|
-
"@itwin/core-bentley": "4.1.0-dev.
|
|
42
|
+
"@itwin/core-bentley": "4.1.0-dev.75"
|
|
43
43
|
},
|
|
44
44
|
"nyc": {
|
|
45
45
|
"extends": "./node_modules/@itwin/build-tools/.nycrc",
|