@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.
Files changed (69) hide show
  1. package/lib/cjs/core-geometry.d.ts +2 -0
  2. package/lib/cjs/core-geometry.d.ts.map +1 -1
  3. package/lib/cjs/core-geometry.js +2 -0
  4. package/lib/cjs/core-geometry.js.map +1 -1
  5. package/lib/cjs/curve/CurvePrimitive.d.ts +5 -0
  6. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  7. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  8. package/lib/cjs/geometry3d/PolygonOps.d.ts +5 -0
  9. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  10. package/lib/cjs/geometry3d/PolygonOps.js +29 -19
  11. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  12. package/lib/cjs/polyface/PolyfaceQuery.d.ts +25 -7
  13. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  14. package/lib/cjs/polyface/PolyfaceQuery.js +61 -8
  15. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  16. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
  17. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
  18. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
  19. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  20. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
  21. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
  22. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
  23. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  24. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
  25. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
  26. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
  27. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  28. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
  29. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
  30. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  31. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
  32. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  33. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +30 -5
  34. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  35. package/lib/esm/core-geometry.d.ts +2 -0
  36. package/lib/esm/core-geometry.d.ts.map +1 -1
  37. package/lib/esm/core-geometry.js +2 -0
  38. package/lib/esm/core-geometry.js.map +1 -1
  39. package/lib/esm/curve/CurvePrimitive.d.ts +5 -0
  40. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  41. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  42. package/lib/esm/geometry3d/PolygonOps.d.ts +5 -0
  43. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  44. package/lib/esm/geometry3d/PolygonOps.js +29 -19
  45. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  46. package/lib/esm/polyface/PolyfaceQuery.d.ts +25 -7
  47. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  48. package/lib/esm/polyface/PolyfaceQuery.js +62 -9
  49. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  50. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts +27 -19
  51. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.d.ts.map +1 -1
  52. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js +30 -12
  53. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  54. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts +12 -8
  55. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.d.ts.map +1 -1
  56. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +18 -4
  57. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  58. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts +3 -4
  59. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.d.ts.map +1 -1
  60. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js +3 -5
  61. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  62. package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts +15 -12
  63. package/lib/esm/polyface/multiclip/Range2dSearchInterface.d.ts.map +1 -1
  64. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  65. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts +27 -0
  66. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
  67. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +30 -6
  68. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  69. 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
- Point3dArrayPolygonOps.polygonPlaneCrossings(this.edgePlane, polygon, this._crossingPoints);
124
- // process a convex polygon (or non-convex if lucky)
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.73",
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.73"
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.73"
42
+ "@itwin/core-bentley": "4.1.0-dev.75"
43
43
  },
44
44
  "nyc": {
45
45
  "extends": "./node_modules/@itwin/build-tools/.nycrc",