@itwin/core-geometry 3.3.0-dev.6 → 3.3.0-dev.62

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 (66) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/lib/cjs/curve/Arc3d.d.ts +2 -2
  3. package/lib/cjs/curve/Arc3d.js +2 -2
  4. package/lib/cjs/curve/Arc3d.js.map +1 -1
  5. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  6. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  7. package/lib/cjs/geometry3d/Point3dVector3d.js +2 -3
  8. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  9. package/lib/cjs/geometry3d/PolygonOps.d.ts +8 -2
  10. package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
  11. package/lib/cjs/geometry3d/PolygonOps.js +40 -3
  12. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  13. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  14. package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
  15. package/lib/cjs/geometry3d/Transform.js +1 -1
  16. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  17. package/lib/cjs/geometry3d/XYZProps.d.ts +10 -3
  18. package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
  19. package/lib/cjs/geometry3d/XYZProps.js +21 -0
  20. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  21. package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
  22. package/lib/cjs/polyface/PolyfaceClip.js +1 -1
  23. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  24. package/lib/cjs/polyface/PolyfaceQuery.d.ts +4 -2
  25. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  26. package/lib/cjs/polyface/PolyfaceQuery.js +10 -6
  27. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  28. package/lib/cjs/topology/Merging.js +3 -3
  29. package/lib/cjs/topology/Merging.js.map +1 -1
  30. package/lib/cjs/topology/Triangulation.d.ts +1 -3
  31. package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
  32. package/lib/cjs/topology/Triangulation.js +31 -21
  33. package/lib/cjs/topology/Triangulation.js.map +1 -1
  34. package/lib/esm/curve/Arc3d.d.ts +2 -2
  35. package/lib/esm/curve/Arc3d.js +2 -2
  36. package/lib/esm/curve/Arc3d.js.map +1 -1
  37. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  38. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  39. package/lib/esm/geometry3d/Point3dVector3d.js +2 -3
  40. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  41. package/lib/esm/geometry3d/PolygonOps.d.ts +8 -2
  42. package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
  43. package/lib/esm/geometry3d/PolygonOps.js +40 -3
  44. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  45. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  46. package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
  47. package/lib/esm/geometry3d/Transform.js +1 -1
  48. package/lib/esm/geometry3d/Transform.js.map +1 -1
  49. package/lib/esm/geometry3d/XYZProps.d.ts +10 -3
  50. package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
  51. package/lib/esm/geometry3d/XYZProps.js +20 -1
  52. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  53. package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
  54. package/lib/esm/polyface/PolyfaceClip.js +1 -1
  55. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  56. package/lib/esm/polyface/PolyfaceQuery.d.ts +4 -2
  57. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  58. package/lib/esm/polyface/PolyfaceQuery.js +10 -6
  59. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  60. package/lib/esm/topology/Merging.js +3 -3
  61. package/lib/esm/topology/Merging.js.map +1 -1
  62. package/lib/esm/topology/Triangulation.d.ts +1 -3
  63. package/lib/esm/topology/Triangulation.d.ts.map +1 -1
  64. package/lib/esm/topology/Triangulation.js +31 -21
  65. package/lib/esm/topology/Triangulation.js.map +1 -1
  66. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/geometry3d/Transform.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\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { Range3d } from \"./Range\";\r\nimport { TransformProps, XAndY, XYAndZ } from \"./XYZProps\";\r\n\r\n/** A transform is an origin and a Matrix3d.\r\n *\r\n * * This describes a coordinate frame with\r\n * this origin, with the columns of the Matrix3d being the\r\n * local x,y,z axis directions.\r\n * * Beware that for common transformations (e.g. scale about point,\r\n * rotate around line, mirror across a plane) the \"fixed point\" that is used\r\n * when describing the transform is NOT the \"origin\" stored in the transform.\r\n * Setup methods (e.g createFixedPointAndMatrix, createScaleAboutPoint)\r\n * take care of determining the appropriate origin coordinates.\r\n * @public\r\n */\r\nexport class Transform implements BeJSONFunctions {\r\n // static (one per class) vars for temporaries in computation.\r\n // ASSUME any user of these vars needs them only within its own scope\r\n // ASSUME no calls to other methods that use the same scratch.\r\n // When Transform was in the same file with Point3d, this was initialized right here.\r\n // But when split, there is a load order issue, so it has to be initialized at point-of-use\r\n private static _scratchPoint: Point3d;\r\n private _origin: XYZ;\r\n private _matrix: Matrix3d;\r\n // Constructor accepts and uses POINTER to content .. no copy here.\r\n private constructor(origin: XYZ, matrix: Matrix3d) { this._origin = origin; this._matrix = matrix; }\r\n\r\n private static _identity?: Transform;\r\n /** The identity Transform. Value is frozen and cannot be modified. */\r\n public static get identity(): Transform {\r\n if (undefined === this._identity) {\r\n this._identity = Transform.createIdentity();\r\n this._identity.freeze();\r\n }\r\n\r\n return this._identity;\r\n }\r\n /** Freeze this instance (and its members) so it is read-only */\r\n public freeze(): Readonly<this> { this._origin.freeze(); this._matrix.freeze(); return Object.freeze(this); }\r\n /**\r\n * Copy contents from other Transform into this Transform\r\n * @param other source transform\r\n */\r\n public setFrom(other: Transform) { this._origin.setFrom(other._origin), this._matrix.setFrom(other._matrix); }\r\n /** Set this Transform to be an identity. */\r\n public setIdentity() { this._origin.setZero(); this._matrix.setIdentity(); }\r\n /** Set this Transform instance from flexible inputs:\r\n * * Any object (such as another Transform) that has `origin` and `matrix` members accepted by Point3d.setFromJSON and Matrix3d.setFromJSON\r\n * * An array of 3 number arrays, each with 4 entries which are rows in a 3x4 matrix.\r\n * * An array of 12 numbers, each block of 4 entries as a row 3x4 matrix.\r\n */\r\n public setFromJSON(json?: TransformProps | Transform): void {\r\n if (json) {\r\n if (json instanceof Object && (json as any).origin && (json as any).matrix) {\r\n this._origin.setFromJSON((json as any).origin);\r\n this._matrix.setFromJSON((json as any).matrix);\r\n return;\r\n }\r\n if (Geometry.isArrayOfNumberArray(json, 3, 4)) {\r\n const data = json as number[][];\r\n this._matrix.setRowValues(\r\n data[0][0], data[0][1], data[0][2],\r\n data[1][0], data[1][1], data[1][2],\r\n data[2][0], data[2][1], data[2][2]);\r\n this._origin.set(data[0][3], data[1][3], data[2][3]);\r\n return;\r\n }\r\n if (Geometry.isNumberArray(json, 12)) {\r\n const data = json as number[];\r\n this._matrix.setRowValues(\r\n data[0], data[1], data[2],\r\n data[4], data[5], data[6],\r\n data[8], data[9], data[10]);\r\n this._origin.set(data[3], data[7], data[11]);\r\n return;\r\n }\r\n }\r\n this.setIdentity();\r\n }\r\n /**\r\n * Test for near equality with other Transform. Comparison uses the isAlmostEqual methods on\r\n * the origin and matrix parts.\r\n * @param other Transform to compare to.\r\n */\r\n public isAlmostEqual(other: Transform): boolean { return this._origin.isAlmostEqual(other._origin) && this._matrix.isAlmostEqual(other._matrix); }\r\n\r\n /**\r\n * Test for near equality with other Transform. Comparison uses the isAlmostEqualAllowZRotation method of Matrix3d\r\n * the origin and matrix parts.\r\n * @param other Transform to compare to.\r\n */\r\n public isAlmostEqualAllowZRotation(other: Transform): boolean { return this._origin.isAlmostEqual(other._origin) && this._matrix.isAlmostEqualAllowZRotation(other._matrix); }\r\n\r\n /** Return a 3 by 4 matrix containing the rows of this Transform\r\n * * This transform's origin is the [3] entry of the json arrays\r\n */\r\n public toJSON(): TransformProps {\r\n return this.toRows();\r\n }\r\n\r\n /** Return a 3 by 4 matrix containing the rows of this Transform\r\n * * This transform's origin is the [3] entry of the json arrays\r\n */\r\n public toRows(): number[][] {\r\n return [\r\n [this._matrix.coffs[0], this._matrix.coffs[1], this._matrix.coffs[2], this._origin.x],\r\n [this._matrix.coffs[3], this._matrix.coffs[4], this._matrix.coffs[5], this._origin.y],\r\n [this._matrix.coffs[6], this._matrix.coffs[7], this._matrix.coffs[8], this._origin.z],\r\n ];\r\n }\r\n\r\n /** Return a new Transform initialized by `setFromJSON (json)` */\r\n public static fromJSON(json?: TransformProps): Transform {\r\n const result = Transform.createIdentity();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** Copy the contents of this transform into a new Transform (or to the result, if specified). */\r\n public clone(result?: Transform): Transform {\r\n if (result) {\r\n result._matrix.setFrom(this._matrix);\r\n result._origin.setFrom(this._origin);\r\n return result;\r\n }\r\n return new Transform(\r\n Point3d.createFrom(this._origin),\r\n this._matrix.clone());\r\n }\r\n /** Return a copy of this Transform, modified so that its axes are rigid\r\n * * The first axis direction named in axisOrder is preserved\r\n * * The plane of the first and second directions is preserved, and its vector in the rigid matrix has positive dot product with the corresponding vector if the instance\r\n * * The third named column is the cross product of the first and second.\r\n */\r\n public cloneRigid(axisOrder: AxisOrder = AxisOrder.XYZ): Transform | undefined {\r\n const axes0 = Matrix3d.createRigidFromMatrix3d(this.matrix, axisOrder);\r\n if (!axes0)\r\n return undefined;\r\n return new Transform(this.origin.cloneAsPoint3d(), axes0);\r\n }\r\n /** Create a copy with the given origin and matrix captured as the Transform origin and Matrix3d. */\r\n public static createRefs(origin: XYZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\r\n if (!origin)\r\n origin = Point3d.createZero();\r\n if (result) {\r\n result._origin = origin;\r\n result._matrix = matrix;\r\n return result;\r\n }\r\n return new Transform(origin, matrix);\r\n }\r\n /** Create a transform with complete contents given */\r\n public static createRowValues(\r\n qxx: number, qxy: number, qxz: number, ax: number,\r\n qyx: number, qyy: number, qyz: number, ay: number,\r\n qzx: number, qzy: number, qzz: number, az: number,\r\n result?: Transform): Transform {\r\n if (result) {\r\n result._origin.set(ax, ay, az);\r\n result._matrix.setRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz);\r\n return result;\r\n }\r\n return new Transform(Point3d.create(ax, ay, az), Matrix3d.createRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz));\r\n }\r\n /** Create a transform with all zeros.\r\n */\r\n public static createZero(result?: Transform): Transform {\r\n return Transform.createRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, result);\r\n }\r\n\r\n /**\r\n * create a Transform with translation provided by x,y,z parts.\r\n * @param x x part of translation\r\n * @param y y part of translation\r\n * @param z z part of translation\r\n * @param result optional result\r\n * @returns new or updated transform.\r\n */\r\n public static createTranslationXYZ(x: number = 0, y: number = 0, z: number = 0, result?: Transform): Transform {\r\n return Transform.createRefs(Vector3d.create(x, y, z), Matrix3d.createIdentity(), result);\r\n }\r\n /** Create a matrix with specified translation part.\r\n * @param XYZ x,y,z parts of the translation.\r\n * @returns new or updated transform.\r\n */\r\n public static createTranslation(translation: XYZ, result?: Transform): Transform {\r\n return Transform.createRefs(translation, Matrix3d.createIdentity(), result);\r\n }\r\n\r\n /** Return a reference to the matrix within the transform. (NOT a copy) */\r\n public get matrix(): Matrix3d { return this._matrix; }\r\n /** Return a reference to the origin within the transform. (NOT a copy) */\r\n public get origin(): XYZ { return this._origin; }\r\n\r\n /** return a (clone of) the origin part of the transform, as a Point3d */\r\n public getOrigin(): Point3d { return Point3d.createFrom(this._origin); }\r\n\r\n /** return a (clone of) the origin part of the transform, as a Vector3d */\r\n public getTranslation(): Vector3d { return Vector3d.createFrom(this._origin); }\r\n\r\n /** test if the transform has 000 origin and identity Matrix3d */\r\n public get isIdentity(): boolean {\r\n return this._matrix.isIdentity && this._origin.isAlmostZero;\r\n }\r\n /** Return an identity transform, optionally filling existing transform. */\r\n public static createIdentity(result?: Transform): Transform {\r\n if (result) {\r\n result._origin.setZero();\r\n result._matrix.setIdentity();\r\n return result;\r\n }\r\n return Transform.createRefs(Point3d.createZero(), Matrix3d.createIdentity());\r\n }\r\n /** Create by directly installing origin and matrix\r\n * this is a the appropriate construction when the columns of the matrix are coordinate axes of a local-to-global mapping\r\n * Note there is a closely related createFixedPointAndMatrix whose point input is the fixed point of the global-to-global transformation.\r\n */\r\n public static createOriginAndMatrix(origin: XYZ | undefined, matrix: Matrix3d | undefined, result?: Transform): Transform {\r\n if (result) {\r\n result._origin.setFromPoint3d(origin);\r\n result._matrix.setFrom(matrix);\r\n return result;\r\n }\r\n return Transform.createRefs(\r\n origin ? origin.cloneAsPoint3d() : Point3d.createZero(),\r\n matrix === undefined ? Matrix3d.createIdentity() : matrix.clone(), result);\r\n }\r\n /** Create by directly installing origin and columns of the matrix\r\n */\r\n public static createOriginAndMatrixColumns(origin: XYZ, vectorX: Vector3d, vectorY: Vector3d, vectorZ: Vector3d, result?: Transform): Transform {\r\n if (result)\r\n result.setOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\r\n else\r\n result = Transform.createRefs(Vector3d.createFrom(origin), Matrix3d.createColumns(vectorX, vectorY, vectorZ));\r\n return result;\r\n }\r\n /** Create by with matrix from Matrix3d.createRigidFromColumns.\r\n * * Has careful logic for building up optional result without allocations.\r\n */\r\n public static createRigidFromOriginAndColumns(origin: XYZ | undefined, vectorX: Vector3d, vectorY: Vector3d, axisOrder: AxisOrder, result?: Transform): Transform | undefined {\r\n const matrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, axisOrder,\r\n result ? result._matrix : undefined);\r\n if (!matrix)\r\n return undefined;\r\n if (result) {\r\n // The matrix was already defined !!!\r\n result._origin.setFrom(origin);\r\n return result;\r\n }\r\n // cleanly capture the matrix and then the point ..\r\n result = Transform.createRefs(undefined, matrix);\r\n result._origin.setFromPoint3d(origin);\r\n return result;\r\n }\r\n\r\n /** Reinitialize by directly installing origin and columns of the matrix\r\n */\r\n public setOriginAndMatrixColumns(origin: XYZ | undefined, vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ: Vector3d | undefined) {\r\n if (origin !== undefined)\r\n this._origin.setFrom(origin);\r\n this._matrix.setColumns(vectorX, vectorY, vectorZ);\r\n }\r\n\r\n /** Create a transform with the specified matrix. Compute an origin (different from the given fixedPoint)\r\n * so that the fixedPoint maps back to itself.\r\n */\r\n public static createFixedPointAndMatrix(fixedPoint: XYAndZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\r\n if (fixedPoint) {\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\r\n return Transform.createRefs(origin, matrix.clone(), result);\r\n }\r\n return Transform.createRefs(undefined, matrix.clone());\r\n }\r\n /** Create a transform with the specified matrix, acting on any `pointX `via\r\n * `pointY = matrix * (pointX - pointA) + pointB`\r\n * so that the fixedPoint maps back to itself.\r\n */\r\n public static createMatrixPickupPutdown(matrix: Matrix3d, pointA: Point3d, pointB: Point3d, result?: Transform): Transform {\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(pointB, matrix, pointA);\r\n return Transform.createRefs(origin, matrix.clone(), result);\r\n }\r\n\r\n /** Create a Transform which leaves the fixedPoint unchanged and\r\n * scales everything else around it by a single scale factor.\r\n */\r\n public static createScaleAboutPoint(fixedPoint: Point3d, scale: number, result?: Transform): Transform {\r\n const matrix = Matrix3d.createScale(scale, scale, scale);\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\r\n return Transform.createRefs(origin, matrix, result);\r\n }\r\n\r\n /** Transform the input 2d point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyPoint2d(source: XAndY, result?: Point2d): Point2d {\r\n return Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, source, result);\r\n }\r\n\r\n /** Transform the input 3d point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyPoint3d(point: XYAndZ, result?: Point3d): Point3d {\r\n return Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, result);\r\n }\r\n\r\n /** Transform the input object with x,y,z members */\r\n public multiplyXYAndZInPlace(point: XYAndZ) {\r\n return Matrix3d.xyzPlusMatrixTimesXYZInPlace(this._origin, this._matrix, point);\r\n }\r\n\r\n /** Transform the input point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZ(x: number, y: number, z: number = 0, result?: Point3d): Point3d {\r\n return Matrix3d.xyzPlusMatrixTimesCoordinates(this._origin, this._matrix, x, y, z, result);\r\n }\r\n /** Multiply a specific row of the transform times xyz. Return the (number). */\r\n public multiplyComponentXYZ(componentIndex: number, x: number, y: number, z: number = 0): number {\r\n const coffs = this._matrix.coffs;\r\n const i0 = 3 * componentIndex;\r\n return this.origin.at(componentIndex) + coffs[i0] * x + coffs[i0 + 1] * y + coffs[i0 + 2] * z;\r\n }\r\n /** Multiply a specific row of the transform times (weighted!) xyzw. Return the (number). */\r\n public multiplyComponentXYZW(componentIndex: number, x: number, y: number, z: number, w: number): number {\r\n const coffs = this._matrix.coffs;\r\n const i0 = 3 * componentIndex;\r\n return this.origin.at(componentIndex) * w +\r\n coffs[i0] * x + coffs[i0 + 1] * y + coffs[i0 + 2] * z;\r\n }\r\n\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\r\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinates(this._origin, this._matrix, x, y, z, w, result);\r\n }\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZWToFloat64Array(x: number, y: number, z: number, w: number, result?: Float64Array): Float64Array {\r\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, w, result);\r\n }\r\n\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZToFloat64Array(x: number, y: number, z: number, result?: Float64Array): Float64Array {\r\n return Matrix3d.xyzPlusMatrixTimesCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, result);\r\n }\r\n /** Multiply the transposed transform (as 4x4 with 0001 row) by Point4d given as xyzw.. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyTransposeXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\r\n const coffs = this._matrix.coffs;\r\n const origin = this._origin;\r\n return Point4d.create(\r\n x * coffs[0] + y * coffs[3] + z * coffs[6],\r\n x * coffs[1] + y * coffs[4] + z * coffs[7],\r\n x * coffs[2] + y * coffs[5] + z * coffs[8],\r\n x * origin.x + y * origin.y + z * origin.z + w,\r\n result);\r\n }\r\n\r\n /** for each point: replace point by Transform*point */\r\n public multiplyPoint3dArrayInPlace(points: Point3d[]) {\r\n let point;\r\n for (point of points)\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, point);\r\n }\r\n\r\n /** for each point: replace point by Transform*point */\r\n public multiplyPoint3dArrayArrayInPlace(chains: Point3d[][]) {\r\n for (const chain of chains)\r\n this.multiplyPoint3dArrayInPlace(chain);\r\n }\r\n /** Return product of the transform's inverse times a point. */\r\n public multiplyInversePoint3d(point: XYAndZ, result?: Point3d): Point3d | undefined {\r\n return this._matrix.multiplyInverseXYZAsPoint3d(\r\n point.x - this._origin.x,\r\n point.y - this._origin.y,\r\n point.z - this._origin.z,\r\n result);\r\n }\r\n /** Inverse transform the input homogeneous point.\r\n * * Return as a new point or in the optional result.\r\n * * returns undefined if the matrix part if this Transform is singular.\r\n */\r\n public multiplyInversePoint4d(weightedPoint: Point4d, result?: Point4d): Point4d | undefined {\r\n const w = weightedPoint.w;\r\n return this._matrix.multiplyInverseXYZW(\r\n weightedPoint.x - w * this.origin.x,\r\n weightedPoint.y - w * this.origin.y,\r\n weightedPoint.z - w * this.origin.z,\r\n w, result);\r\n }\r\n\r\n /** Return product of the transform's inverse times a point (point given as x,y,z) */\r\n public multiplyInverseXYZ(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\r\n return this._matrix.multiplyInverseXYZAsPoint3d(\r\n x - this._origin.x,\r\n y - this._origin.y,\r\n z - this._origin.z,\r\n result);\r\n }\r\n\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyInversePoint3dArray(source: Point3d[], result?: Point3d[]): Point3d[] | undefined {\r\n if (!this._matrix.computeCachedInverse(true))\r\n return undefined;\r\n const originX = this.origin.x;\r\n const originY = this.origin.y;\r\n const originZ = this.origin.z;\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point3d.createZero);\r\n for (let i = 0; i < n; i++)\r\n this._matrix.multiplyInverseXYZAsPoint3d(\r\n source[i].x - originX,\r\n source[i].y - originY,\r\n source[i].z - originZ,\r\n result[i]);\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(this._matrix.multiplyInverseXYZAsPoint3d(\r\n p.x - originX,\r\n p.y - originY,\r\n p.z - originZ)!);\r\n\r\n return result;\r\n }\r\n /**\r\n * * for each point in source: multiply transformInverse * point in place in the point.\r\n * * return false if not invertible.\r\n */\r\n public multiplyInversePoint3dArrayInPlace(source: Point3d[]): boolean {\r\n if (!this._matrix.computeCachedInverse(true))\r\n return false;\r\n const originX = this.origin.x;\r\n const originY = this.origin.y;\r\n const originZ = this.origin.z;\r\n const n = source.length;\r\n for (let i = 0; i < n; i++)\r\n this._matrix.multiplyInverseXYZAsPoint3d(\r\n source[i].x - originX,\r\n source[i].y - originY,\r\n source[i].z - originZ,\r\n source[i]);\r\n return true;\r\n }\r\n /**\r\n * * Compute (if needed) the inverse of the matrix part, thereby ensuring inverse operations can complete.\r\n * * Return true if matrix inverse completes.\r\n * @param useCached If true, accept prior cached inverse if available.\r\n */\r\n public computeCachedInverse(useCached: boolean = true): boolean {\r\n return this._matrix.computeCachedInverse(useCached);\r\n }\r\n /**\r\n * * If destination has more values than source, remove the extras.\r\n * * If destination has fewer values, use the constructionFunction to create new ones.\r\n * @param source array\r\n * @param dest destination array, to be modified to match source length\r\n * @param constructionFunction function to call to create new entries.\r\n */\r\n // modify destination so it has non-null points for the same length as the source.\r\n // (ASSUME existing elements of dest are non-null, and that parameters are given as either Point2d or Point3d arrays)\r\n public static matchArrayLengths(source: any[], dest: any[], constructionFunction: () => any): number {\r\n const numSource = source.length;\r\n const numDest = dest.length;\r\n if (numSource > numDest) {\r\n for (let i = numDest; i < numSource; i++) {\r\n dest.push(constructionFunction());\r\n }\r\n } else if (numDest > numSource) {\r\n dest.length = numSource;\r\n }\r\n return numSource;\r\n }\r\n\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyPoint2dArray(source: Point2d[], result?: Point2d[]): Point2d[] {\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point2d.createZero);\r\n for (let i = 0; i < n; i++)\r\n Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, source[i], result[i]);\r\n return result;\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, p));\r\n\r\n return result;\r\n }\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyPoint3dArray(source: Point3d[], result?: Point3d[]): Point3d[] {\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point3d.createZero);\r\n for (let i = 0; i < n; i++)\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, source[i], result[i]);\r\n return result;\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, p));\r\n\r\n return result;\r\n }\r\n\r\n /** Multiply the vector by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n * * Return as new or result by usual optional result convention\r\n */\r\n public multiplyVector(vector: Vector3d, result?: Vector3d): Vector3d {\r\n return this._matrix.multiplyVector(vector, result);\r\n }\r\n\r\n/** Multiply the vector in place by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n */\r\n public multiplyVectorInPlace(vector: Vector3d): void {\r\n this._matrix.multiplyVectorInPlace(vector);\r\n}\r\n\r\n /** Multiply the vector (x,y,z) by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n * * Return as new or result by usual optional result convention\r\n */\r\n public multiplyVectorXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n return this._matrix.multiplyXYZ(x, y, z, result);\r\n }\r\n /** multiply this Transform times other Transform.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{`this` transform with matrix part }\\bold{A}\\text{ and translation }\\bold{a} & \\blockTransform{A}{a}\\\\\r\n * \\text{`other` transform with matrix part }\\bold{B}\\text{ and translation part }\\bold{b}\\text{ promoted to block transform} & \\blockTransform{B}{b} \\\\\r\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab + a}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand transform for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyTransformTransform(other: Transform, result?: Transform) {\r\n if (!result)\r\n return Transform.createRefs(\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, other._origin),\r\n this._matrix.multiplyMatrixMatrix(other._matrix));\r\n result.setMultiplyTransformTransform(this, other);\r\n return result;\r\n }\r\n /**\r\n * multiply transformA * transformB, store to calling instance.\r\n * @param transformA left operand\r\n * @param transformB right operand\r\n */\r\n public setMultiplyTransformTransform(transformA: Transform, transformB: Transform): void {\r\n if (Transform._scratchPoint === undefined)\r\n Transform._scratchPoint = Point3d.create();\r\n Matrix3d.xyzPlusMatrixTimesXYZ(transformA._origin, transformA._matrix, transformB._origin, Transform._scratchPoint);\r\n this._origin.setFrom(Transform._scratchPoint);\r\n transformA._matrix.multiplyMatrixMatrix(transformB._matrix, this._matrix);\r\n }\r\n // [Q A][R 0] = [QR A]\r\n // [0 1][0 1] [0 1]\r\n /** multiply this Transform times other Matrix3d, with other considered to be a Transform with 0 translation.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{`this` transform with matrix part }\\bold{A}\\text{ and translation }\\bold{b} & \\blockTransform{B}{b}\\\\\r\n * \\text{`other` matrix }\\bold{B}\\text{ promoted to block transform} & \\blockTransform{B}{0} \\\\\r\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{0}=\\blockTransform{AB}{a}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand Matrix3d for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyTransformMatrix3d(other: Matrix3d, result?: Transform): Transform {\r\n if (!result)\r\n return Transform.createRefs(\r\n this._origin.cloneAsPoint3d(),\r\n this._matrix.multiplyMatrixMatrix(other));\r\n this._matrix.multiplyMatrixMatrix(other, result._matrix);\r\n result._origin.setFrom(this._origin);\r\n return result;\r\n }\r\n\r\n /**\r\n * Return the range of the transformed corners.\r\n * * The 8 corners are transformed individually.\r\n * * Note that if there is anything other than translation and principal axis scaling in the transform, the volume of the range rotation will increase.\r\n * * Hence to get a \"tight\" range on rotated geometry, a range computation must be made on the rotated geometry itself.\r\n */\r\n public multiplyRange(range: Range3d, result?: Range3d): Range3d {\r\n if (range.isNull)\r\n return range.clone(result);\r\n\r\n // snag current values to allow aliasing.\r\n const lowX = range.low.x;\r\n const lowY = range.low.y;\r\n const lowZ = range.low.z;\r\n const highX = range.high.x;\r\n const highY = range.high.y;\r\n const highZ = range.high.z;\r\n result = Range3d.createNull(result);\r\n result.extendTransformedXYZ(this, lowX, lowY, lowZ);\r\n result.extendTransformedXYZ(this, highX, lowY, lowZ);\r\n result.extendTransformedXYZ(this, lowX, highY, lowZ);\r\n result.extendTransformedXYZ(this, highX, highY, lowZ);\r\n\r\n result.extendTransformedXYZ(this, lowX, lowY, highZ);\r\n result.extendTransformedXYZ(this, highX, lowY, highZ);\r\n result.extendTransformedXYZ(this, lowX, highY, highZ);\r\n result.extendTransformedXYZ(this, highX, highY, highZ);\r\n return result;\r\n }\r\n /**\r\n * * Return a Transform which is the inverse of this transform.\r\n * * Return undefined if this Transform's matrix is singular.\r\n */\r\n public inverse(): Transform | undefined {\r\n const matrixInverse = this._matrix.inverse();\r\n if (!matrixInverse)\r\n return undefined;\r\n return Transform.createRefs(\r\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z),\r\n matrixInverse);\r\n }\r\n /** Initialize transforms that map each direction of a box (axis aligned) to `[0,1]`.\r\n * * The corner coordinates do _not_ need to be in order in any of the x,y,z directions.\r\n * * The npcToGlobalTransform (if supplied) maps 000 to the point named point000.\r\n * * The npcToGlobalTransform (if supplied) maps 11 to the point named point000.\r\n * * The globalToNpc transform is the inverse.\r\n * @param min the \"000\" corner of the box\r\n * @param max the \"111\" corner of the box\r\n * @param npcToGlobal (object created by caller, re-initialized here) transform that carries 01 coordinates into the min,max box.\r\n * @param globalToNpc (object created by caller, re-initialized here) transform that carries world coordinates into 01\r\n */\r\n public static initFromRange(min: Point3d, max: Point3d, npcToGlobal?: Transform, globalToNpc?: Transform) {\r\n const diag = max.minus(min);\r\n if (diag.x === 0.0) diag.x = 1.0;\r\n if (diag.y === 0.0) diag.y = 1.0;\r\n if (diag.z === 0.0) diag.z = 1.0;\r\n\r\n const rMatrix = new Matrix3d();\r\n if (npcToGlobal) {\r\n Matrix3d.createScale(diag.x, diag.y, diag.z, rMatrix);\r\n Transform.createOriginAndMatrix(min, rMatrix, npcToGlobal);\r\n }\r\n\r\n if (globalToNpc) {\r\n const origin = new Point3d(- min.x / diag.x, - min.y / diag.y, - min.z / diag.z);\r\n Matrix3d.createScale(1.0 / diag.x, 1.0 / diag.y, 1.0 / diag.z, rMatrix);\r\n Transform.createOriginAndMatrix(origin, rMatrix, globalToNpc);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/geometry3d/Transform.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\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { Range3d } from \"./Range\";\r\nimport { TransformProps, XAndY, XYAndZ } from \"./XYZProps\";\r\n\r\n/** A transform is an origin and a Matrix3d.\r\n *\r\n * * This describes a coordinate frame with\r\n * this origin, with the columns of the Matrix3d being the\r\n * local x,y,z axis directions.\r\n * * Beware that for common transformations (e.g. scale about point,\r\n * rotate around line, mirror across a plane) the \"fixed point\" that is used\r\n * when describing the transform is NOT the \"origin\" stored in the transform.\r\n * Setup methods (e.g createFixedPointAndMatrix, createScaleAboutPoint)\r\n * take care of determining the appropriate origin coordinates.\r\n * @public\r\n */\r\nexport class Transform implements BeJSONFunctions {\r\n // static (one per class) vars for temporaries in computation.\r\n // ASSUME any user of these vars needs them only within its own scope\r\n // ASSUME no calls to other methods that use the same scratch.\r\n // When Transform was in the same file with Point3d, this was initialized right here.\r\n // But when split, there is a load order issue, so it has to be initialized at point-of-use\r\n private static _scratchPoint: Point3d;\r\n private _origin: XYZ;\r\n private _matrix: Matrix3d;\r\n // Constructor accepts and uses POINTER to content .. no copy here.\r\n private constructor(origin: XYZ, matrix: Matrix3d) { this._origin = origin; this._matrix = matrix; }\r\n\r\n private static _identity?: Transform;\r\n /** The identity Transform. Value is frozen and cannot be modified. */\r\n public static get identity(): Transform {\r\n if (undefined === this._identity) {\r\n this._identity = Transform.createIdentity();\r\n this._identity.freeze();\r\n }\r\n\r\n return this._identity;\r\n }\r\n /** Freeze this instance (and its members) so it is read-only */\r\n public freeze(): Readonly<this> { this._origin.freeze(); this._matrix.freeze(); return Object.freeze(this); }\r\n /**\r\n * Copy contents from other Transform into this Transform\r\n * @param other source transform\r\n */\r\n public setFrom(other: Transform) { this._origin.setFrom(other._origin), this._matrix.setFrom(other._matrix); }\r\n /** Set this Transform to be an identity. */\r\n public setIdentity() { this._origin.setZero(); this._matrix.setIdentity(); }\r\n /** Set this Transform instance from flexible inputs:\r\n * * Any object (such as another Transform) that has `origin` and `matrix` members accepted by Point3d.setFromJSON and Matrix3d.setFromJSON\r\n * * An array of 3 number arrays, each with 4 entries which are rows in a 3x4 matrix.\r\n * * An array of 12 numbers, each block of 4 entries as a row 3x4 matrix.\r\n */\r\n public setFromJSON(json?: TransformProps | Transform): void {\r\n if (json) {\r\n if (json instanceof Object && (json as any).origin && (json as any).matrix) {\r\n this._origin.setFromJSON((json as any).origin);\r\n this._matrix.setFromJSON((json as any).matrix);\r\n return;\r\n }\r\n if (Geometry.isArrayOfNumberArray(json, 3, 4)) {\r\n const data = json as number[][];\r\n this._matrix.setRowValues(\r\n data[0][0], data[0][1], data[0][2],\r\n data[1][0], data[1][1], data[1][2],\r\n data[2][0], data[2][1], data[2][2]);\r\n this._origin.set(data[0][3], data[1][3], data[2][3]);\r\n return;\r\n }\r\n if (Geometry.isNumberArray(json, 12)) {\r\n const data = json as number[];\r\n this._matrix.setRowValues(\r\n data[0], data[1], data[2],\r\n data[4], data[5], data[6],\r\n data[8], data[9], data[10]);\r\n this._origin.set(data[3], data[7], data[11]);\r\n return;\r\n }\r\n }\r\n this.setIdentity();\r\n }\r\n /**\r\n * Test for near equality with other Transform. Comparison uses the isAlmostEqual methods on\r\n * the origin and matrix parts.\r\n * @param other Transform to compare to.\r\n */\r\n public isAlmostEqual(other: Readonly<Transform>): boolean { return this.origin.isAlmostEqual(other.origin) && this.matrix.isAlmostEqual(other.matrix); }\r\n\r\n /**\r\n * Test for near equality with other Transform. Comparison uses the isAlmostEqualAllowZRotation method of Matrix3d\r\n * the origin and matrix parts.\r\n * @param other Transform to compare to.\r\n */\r\n public isAlmostEqualAllowZRotation(other: Transform): boolean { return this._origin.isAlmostEqual(other._origin) && this._matrix.isAlmostEqualAllowZRotation(other._matrix); }\r\n\r\n /** Return a 3 by 4 matrix containing the rows of this Transform\r\n * * This transform's origin is the [3] entry of the json arrays\r\n */\r\n public toJSON(): TransformProps {\r\n return this.toRows();\r\n }\r\n\r\n /** Return a 3 by 4 matrix containing the rows of this Transform\r\n * * This transform's origin is the [3] entry of the json arrays\r\n */\r\n public toRows(): number[][] {\r\n return [\r\n [this._matrix.coffs[0], this._matrix.coffs[1], this._matrix.coffs[2], this._origin.x],\r\n [this._matrix.coffs[3], this._matrix.coffs[4], this._matrix.coffs[5], this._origin.y],\r\n [this._matrix.coffs[6], this._matrix.coffs[7], this._matrix.coffs[8], this._origin.z],\r\n ];\r\n }\r\n\r\n /** Return a new Transform initialized by `setFromJSON (json)` */\r\n public static fromJSON(json?: TransformProps): Transform {\r\n const result = Transform.createIdentity();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /** Copy the contents of this transform into a new Transform (or to the result, if specified). */\r\n public clone(result?: Transform): Transform {\r\n if (result) {\r\n result._matrix.setFrom(this._matrix);\r\n result._origin.setFrom(this._origin);\r\n return result;\r\n }\r\n return new Transform(\r\n Point3d.createFrom(this._origin),\r\n this._matrix.clone());\r\n }\r\n /** Return a copy of this Transform, modified so that its axes are rigid\r\n * * The first axis direction named in axisOrder is preserved\r\n * * The plane of the first and second directions is preserved, and its vector in the rigid matrix has positive dot product with the corresponding vector if the instance\r\n * * The third named column is the cross product of the first and second.\r\n */\r\n public cloneRigid(axisOrder: AxisOrder = AxisOrder.XYZ): Transform | undefined {\r\n const axes0 = Matrix3d.createRigidFromMatrix3d(this.matrix, axisOrder);\r\n if (!axes0)\r\n return undefined;\r\n return new Transform(this.origin.cloneAsPoint3d(), axes0);\r\n }\r\n /** Create a copy with the given origin and matrix captured as the Transform origin and Matrix3d. */\r\n public static createRefs(origin: XYZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\r\n if (!origin)\r\n origin = Point3d.createZero();\r\n if (result) {\r\n result._origin = origin;\r\n result._matrix = matrix;\r\n return result;\r\n }\r\n return new Transform(origin, matrix);\r\n }\r\n /** Create a transform with complete contents given */\r\n public static createRowValues(\r\n qxx: number, qxy: number, qxz: number, ax: number,\r\n qyx: number, qyy: number, qyz: number, ay: number,\r\n qzx: number, qzy: number, qzz: number, az: number,\r\n result?: Transform): Transform {\r\n if (result) {\r\n result._origin.set(ax, ay, az);\r\n result._matrix.setRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz);\r\n return result;\r\n }\r\n return new Transform(Point3d.create(ax, ay, az), Matrix3d.createRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz));\r\n }\r\n /** Create a transform with all zeros.\r\n */\r\n public static createZero(result?: Transform): Transform {\r\n return Transform.createRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, result);\r\n }\r\n\r\n /**\r\n * create a Transform with translation provided by x,y,z parts.\r\n * @param x x part of translation\r\n * @param y y part of translation\r\n * @param z z part of translation\r\n * @param result optional result\r\n * @returns new or updated transform.\r\n */\r\n public static createTranslationXYZ(x: number = 0, y: number = 0, z: number = 0, result?: Transform): Transform {\r\n return Transform.createRefs(Vector3d.create(x, y, z), Matrix3d.createIdentity(), result);\r\n }\r\n /** Create a matrix with specified translation part.\r\n * @param XYZ x,y,z parts of the translation.\r\n * @returns new or updated transform.\r\n */\r\n public static createTranslation(translation: XYZ, result?: Transform): Transform {\r\n return Transform.createRefs(translation, Matrix3d.createIdentity(), result);\r\n }\r\n\r\n /** Return a reference to the matrix within the transform. (NOT a copy) */\r\n public get matrix(): Matrix3d { return this._matrix; }\r\n /** Return a reference to the origin within the transform. (NOT a copy) */\r\n public get origin(): XYZ { return this._origin; }\r\n\r\n /** return a (clone of) the origin part of the transform, as a Point3d */\r\n public getOrigin(): Point3d { return Point3d.createFrom(this._origin); }\r\n\r\n /** return a (clone of) the origin part of the transform, as a Vector3d */\r\n public getTranslation(): Vector3d { return Vector3d.createFrom(this._origin); }\r\n\r\n /** test if the transform has 000 origin and identity Matrix3d */\r\n public get isIdentity(): boolean {\r\n return this._matrix.isIdentity && this._origin.isAlmostZero;\r\n }\r\n /** Return an identity transform, optionally filling existing transform. */\r\n public static createIdentity(result?: Transform): Transform {\r\n if (result) {\r\n result._origin.setZero();\r\n result._matrix.setIdentity();\r\n return result;\r\n }\r\n return Transform.createRefs(Point3d.createZero(), Matrix3d.createIdentity());\r\n }\r\n /** Create by directly installing origin and matrix\r\n * this is a the appropriate construction when the columns of the matrix are coordinate axes of a local-to-global mapping\r\n * Note there is a closely related createFixedPointAndMatrix whose point input is the fixed point of the global-to-global transformation.\r\n */\r\n public static createOriginAndMatrix(origin: XYZ | undefined, matrix: Matrix3d | undefined, result?: Transform): Transform {\r\n if (result) {\r\n result._origin.setFromPoint3d(origin);\r\n result._matrix.setFrom(matrix);\r\n return result;\r\n }\r\n return Transform.createRefs(\r\n origin ? origin.cloneAsPoint3d() : Point3d.createZero(),\r\n matrix === undefined ? Matrix3d.createIdentity() : matrix.clone(), result);\r\n }\r\n /** Create by directly installing origin and columns of the matrix\r\n */\r\n public static createOriginAndMatrixColumns(origin: XYZ, vectorX: Vector3d, vectorY: Vector3d, vectorZ: Vector3d, result?: Transform): Transform {\r\n if (result)\r\n result.setOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\r\n else\r\n result = Transform.createRefs(Vector3d.createFrom(origin), Matrix3d.createColumns(vectorX, vectorY, vectorZ));\r\n return result;\r\n }\r\n /** Create by with matrix from Matrix3d.createRigidFromColumns.\r\n * * Has careful logic for building up optional result without allocations.\r\n */\r\n public static createRigidFromOriginAndColumns(origin: XYZ | undefined, vectorX: Vector3d, vectorY: Vector3d, axisOrder: AxisOrder, result?: Transform): Transform | undefined {\r\n const matrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, axisOrder,\r\n result ? result._matrix : undefined);\r\n if (!matrix)\r\n return undefined;\r\n if (result) {\r\n // The matrix was already defined !!!\r\n result._origin.setFrom(origin);\r\n return result;\r\n }\r\n // cleanly capture the matrix and then the point ..\r\n result = Transform.createRefs(undefined, matrix);\r\n result._origin.setFromPoint3d(origin);\r\n return result;\r\n }\r\n\r\n /** Reinitialize by directly installing origin and columns of the matrix\r\n */\r\n public setOriginAndMatrixColumns(origin: XYZ | undefined, vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ: Vector3d | undefined) {\r\n if (origin !== undefined)\r\n this._origin.setFrom(origin);\r\n this._matrix.setColumns(vectorX, vectorY, vectorZ);\r\n }\r\n\r\n /** Create a transform with the specified matrix. Compute an origin (different from the given fixedPoint)\r\n * so that the fixedPoint maps back to itself.\r\n */\r\n public static createFixedPointAndMatrix(fixedPoint: XYAndZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\r\n if (fixedPoint) {\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\r\n return Transform.createRefs(origin, matrix.clone(), result);\r\n }\r\n return Transform.createRefs(undefined, matrix.clone());\r\n }\r\n /** Create a transform with the specified matrix, acting on any `pointX `via\r\n * `pointY = matrix * (pointX - pointA) + pointB`\r\n * so that the fixedPoint maps back to itself.\r\n */\r\n public static createMatrixPickupPutdown(matrix: Matrix3d, pointA: Point3d, pointB: Point3d, result?: Transform): Transform {\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(pointB, matrix, pointA);\r\n return Transform.createRefs(origin, matrix.clone(), result);\r\n }\r\n\r\n /** Create a Transform which leaves the fixedPoint unchanged and\r\n * scales everything else around it by a single scale factor.\r\n */\r\n public static createScaleAboutPoint(fixedPoint: Point3d, scale: number, result?: Transform): Transform {\r\n const matrix = Matrix3d.createScale(scale, scale, scale);\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\r\n return Transform.createRefs(origin, matrix, result);\r\n }\r\n\r\n /** Transform the input 2d point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyPoint2d(source: XAndY, result?: Point2d): Point2d {\r\n return Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, source, result);\r\n }\r\n\r\n /** Transform the input 3d point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyPoint3d(point: XYAndZ, result?: Point3d): Point3d {\r\n return Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, result);\r\n }\r\n\r\n /** Transform the input object with x,y,z members */\r\n public multiplyXYAndZInPlace(point: XYAndZ) {\r\n return Matrix3d.xyzPlusMatrixTimesXYZInPlace(this._origin, this._matrix, point);\r\n }\r\n\r\n /** Transform the input point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZ(x: number, y: number, z: number = 0, result?: Point3d): Point3d {\r\n return Matrix3d.xyzPlusMatrixTimesCoordinates(this._origin, this._matrix, x, y, z, result);\r\n }\r\n /** Multiply a specific row of the transform times xyz. Return the (number). */\r\n public multiplyComponentXYZ(componentIndex: number, x: number, y: number, z: number = 0): number {\r\n const coffs = this._matrix.coffs;\r\n const i0 = 3 * componentIndex;\r\n return this.origin.at(componentIndex) + coffs[i0] * x + coffs[i0 + 1] * y + coffs[i0 + 2] * z;\r\n }\r\n /** Multiply a specific row of the transform times (weighted!) xyzw. Return the (number). */\r\n public multiplyComponentXYZW(componentIndex: number, x: number, y: number, z: number, w: number): number {\r\n const coffs = this._matrix.coffs;\r\n const i0 = 3 * componentIndex;\r\n return this.origin.at(componentIndex) * w +\r\n coffs[i0] * x + coffs[i0 + 1] * y + coffs[i0 + 2] * z;\r\n }\r\n\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\r\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinates(this._origin, this._matrix, x, y, z, w, result);\r\n }\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZWToFloat64Array(x: number, y: number, z: number, w: number, result?: Float64Array): Float64Array {\r\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, w, result);\r\n }\r\n\r\n /** Transform the input homogeneous point. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyXYZToFloat64Array(x: number, y: number, z: number, result?: Float64Array): Float64Array {\r\n return Matrix3d.xyzPlusMatrixTimesCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, result);\r\n }\r\n /** Multiply the transposed transform (as 4x4 with 0001 row) by Point4d given as xyzw.. Return as a new point or in the pre-allocated result (if result is given) */\r\n public multiplyTransposeXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\r\n const coffs = this._matrix.coffs;\r\n const origin = this._origin;\r\n return Point4d.create(\r\n x * coffs[0] + y * coffs[3] + z * coffs[6],\r\n x * coffs[1] + y * coffs[4] + z * coffs[7],\r\n x * coffs[2] + y * coffs[5] + z * coffs[8],\r\n x * origin.x + y * origin.y + z * origin.z + w,\r\n result);\r\n }\r\n\r\n /** for each point: replace point by Transform*point */\r\n public multiplyPoint3dArrayInPlace(points: Point3d[]) {\r\n let point;\r\n for (point of points)\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, point);\r\n }\r\n\r\n /** for each point: replace point by Transform*point */\r\n public multiplyPoint3dArrayArrayInPlace(chains: Point3d[][]) {\r\n for (const chain of chains)\r\n this.multiplyPoint3dArrayInPlace(chain);\r\n }\r\n /** Return product of the transform's inverse times a point. */\r\n public multiplyInversePoint3d(point: XYAndZ, result?: Point3d): Point3d | undefined {\r\n return this._matrix.multiplyInverseXYZAsPoint3d(\r\n point.x - this._origin.x,\r\n point.y - this._origin.y,\r\n point.z - this._origin.z,\r\n result);\r\n }\r\n /** Inverse transform the input homogeneous point.\r\n * * Return as a new point or in the optional result.\r\n * * returns undefined if the matrix part if this Transform is singular.\r\n */\r\n public multiplyInversePoint4d(weightedPoint: Point4d, result?: Point4d): Point4d | undefined {\r\n const w = weightedPoint.w;\r\n return this._matrix.multiplyInverseXYZW(\r\n weightedPoint.x - w * this.origin.x,\r\n weightedPoint.y - w * this.origin.y,\r\n weightedPoint.z - w * this.origin.z,\r\n w, result);\r\n }\r\n\r\n /** Return product of the transform's inverse times a point (point given as x,y,z) */\r\n public multiplyInverseXYZ(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\r\n return this._matrix.multiplyInverseXYZAsPoint3d(\r\n x - this._origin.x,\r\n y - this._origin.y,\r\n z - this._origin.z,\r\n result);\r\n }\r\n\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyInversePoint3dArray(source: Point3d[], result?: Point3d[]): Point3d[] | undefined {\r\n if (!this._matrix.computeCachedInverse(true))\r\n return undefined;\r\n const originX = this.origin.x;\r\n const originY = this.origin.y;\r\n const originZ = this.origin.z;\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point3d.createZero);\r\n for (let i = 0; i < n; i++)\r\n this._matrix.multiplyInverseXYZAsPoint3d(\r\n source[i].x - originX,\r\n source[i].y - originY,\r\n source[i].z - originZ,\r\n result[i]);\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(this._matrix.multiplyInverseXYZAsPoint3d(\r\n p.x - originX,\r\n p.y - originY,\r\n p.z - originZ)!);\r\n\r\n return result;\r\n }\r\n /**\r\n * * for each point in source: multiply transformInverse * point in place in the point.\r\n * * return false if not invertible.\r\n */\r\n public multiplyInversePoint3dArrayInPlace(source: Point3d[]): boolean {\r\n if (!this._matrix.computeCachedInverse(true))\r\n return false;\r\n const originX = this.origin.x;\r\n const originY = this.origin.y;\r\n const originZ = this.origin.z;\r\n const n = source.length;\r\n for (let i = 0; i < n; i++)\r\n this._matrix.multiplyInverseXYZAsPoint3d(\r\n source[i].x - originX,\r\n source[i].y - originY,\r\n source[i].z - originZ,\r\n source[i]);\r\n return true;\r\n }\r\n /**\r\n * * Compute (if needed) the inverse of the matrix part, thereby ensuring inverse operations can complete.\r\n * * Return true if matrix inverse completes.\r\n * @param useCached If true, accept prior cached inverse if available.\r\n */\r\n public computeCachedInverse(useCached: boolean = true): boolean {\r\n return this._matrix.computeCachedInverse(useCached);\r\n }\r\n /**\r\n * * If destination has more values than source, remove the extras.\r\n * * If destination has fewer values, use the constructionFunction to create new ones.\r\n * @param source array\r\n * @param dest destination array, to be modified to match source length\r\n * @param constructionFunction function to call to create new entries.\r\n */\r\n // modify destination so it has non-null points for the same length as the source.\r\n // (ASSUME existing elements of dest are non-null, and that parameters are given as either Point2d or Point3d arrays)\r\n public static matchArrayLengths(source: any[], dest: any[], constructionFunction: () => any): number {\r\n const numSource = source.length;\r\n const numDest = dest.length;\r\n if (numSource > numDest) {\r\n for (let i = numDest; i < numSource; i++) {\r\n dest.push(constructionFunction());\r\n }\r\n } else if (numDest > numSource) {\r\n dest.length = numSource;\r\n }\r\n return numSource;\r\n }\r\n\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyPoint2dArray(source: Point2d[], result?: Point2d[]): Point2d[] {\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point2d.createZero);\r\n for (let i = 0; i < n; i++)\r\n Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, source[i], result[i]);\r\n return result;\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, p));\r\n\r\n return result;\r\n }\r\n /**\r\n * * for each point: multiply transform * point\r\n * * if result is given, resize to match source and replace each corresponding pi\r\n * * if result is not given, return a new array.\r\n */\r\n public multiplyPoint3dArray(source: Point3d[], result?: Point3d[]): Point3d[] {\r\n if (result) {\r\n const n = Transform.matchArrayLengths(source, result, Point3d.createZero);\r\n for (let i = 0; i < n; i++)\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, source[i], result[i]);\r\n return result;\r\n }\r\n result = [];\r\n for (const p of source)\r\n result.push(Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, p));\r\n\r\n return result;\r\n }\r\n\r\n /** Multiply the vector by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n * * Return as new or result by usual optional result convention\r\n */\r\n public multiplyVector(vector: Vector3d, result?: Vector3d): Vector3d {\r\n return this._matrix.multiplyVector(vector, result);\r\n }\r\n\r\n/** Multiply the vector in place by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n */\r\n public multiplyVectorInPlace(vector: Vector3d): void {\r\n this._matrix.multiplyVectorInPlace(vector);\r\n}\r\n\r\n /** Multiply the vector (x,y,z) by the Matrix3d part of the transform.\r\n *\r\n * * The transform's origin is not used.\r\n * * Return as new or result by usual optional result convention\r\n */\r\n public multiplyVectorXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n return this._matrix.multiplyXYZ(x, y, z, result);\r\n }\r\n /** multiply this Transform times other Transform.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{`this` transform with matrix part }\\bold{A}\\text{ and translation }\\bold{a} & \\blockTransform{A}{a}\\\\\r\n * \\text{`other` transform with matrix part }\\bold{B}\\text{ and translation part }\\bold{b}\\text{ promoted to block transform} & \\blockTransform{B}{b} \\\\\r\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab + a}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand transform for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyTransformTransform(other: Transform, result?: Transform) {\r\n if (!result)\r\n return Transform.createRefs(\r\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, other._origin),\r\n this._matrix.multiplyMatrixMatrix(other._matrix));\r\n result.setMultiplyTransformTransform(this, other);\r\n return result;\r\n }\r\n /**\r\n * multiply transformA * transformB, store to calling instance.\r\n * @param transformA left operand\r\n * @param transformB right operand\r\n */\r\n public setMultiplyTransformTransform(transformA: Transform, transformB: Transform): void {\r\n if (Transform._scratchPoint === undefined)\r\n Transform._scratchPoint = Point3d.create();\r\n Matrix3d.xyzPlusMatrixTimesXYZ(transformA._origin, transformA._matrix, transformB._origin, Transform._scratchPoint);\r\n this._origin.setFrom(Transform._scratchPoint);\r\n transformA._matrix.multiplyMatrixMatrix(transformB._matrix, this._matrix);\r\n }\r\n // [Q A][R 0] = [QR A]\r\n // [0 1][0 1] [0 1]\r\n /** multiply this Transform times other Matrix3d, with other considered to be a Transform with 0 translation.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{`this` transform with matrix part }\\bold{A}\\text{ and translation }\\bold{b} & \\blockTransform{B}{b}\\\\\r\n * \\text{`other` matrix }\\bold{B}\\text{ promoted to block transform} & \\blockTransform{B}{0} \\\\\r\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{0}=\\blockTransform{AB}{a}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand Matrix3d for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyTransformMatrix3d(other: Matrix3d, result?: Transform): Transform {\r\n if (!result)\r\n return Transform.createRefs(\r\n this._origin.cloneAsPoint3d(),\r\n this._matrix.multiplyMatrixMatrix(other));\r\n this._matrix.multiplyMatrixMatrix(other, result._matrix);\r\n result._origin.setFrom(this._origin);\r\n return result;\r\n }\r\n\r\n /**\r\n * Return the range of the transformed corners.\r\n * * The 8 corners are transformed individually.\r\n * * Note that if there is anything other than translation and principal axis scaling in the transform, the volume of the range rotation will increase.\r\n * * Hence to get a \"tight\" range on rotated geometry, a range computation must be made on the rotated geometry itself.\r\n */\r\n public multiplyRange(range: Range3d, result?: Range3d): Range3d {\r\n if (range.isNull)\r\n return range.clone(result);\r\n\r\n // snag current values to allow aliasing.\r\n const lowX = range.low.x;\r\n const lowY = range.low.y;\r\n const lowZ = range.low.z;\r\n const highX = range.high.x;\r\n const highY = range.high.y;\r\n const highZ = range.high.z;\r\n result = Range3d.createNull(result);\r\n result.extendTransformedXYZ(this, lowX, lowY, lowZ);\r\n result.extendTransformedXYZ(this, highX, lowY, lowZ);\r\n result.extendTransformedXYZ(this, lowX, highY, lowZ);\r\n result.extendTransformedXYZ(this, highX, highY, lowZ);\r\n\r\n result.extendTransformedXYZ(this, lowX, lowY, highZ);\r\n result.extendTransformedXYZ(this, highX, lowY, highZ);\r\n result.extendTransformedXYZ(this, lowX, highY, highZ);\r\n result.extendTransformedXYZ(this, highX, highY, highZ);\r\n return result;\r\n }\r\n /**\r\n * * Return a Transform which is the inverse of this transform.\r\n * * Return undefined if this Transform's matrix is singular.\r\n */\r\n public inverse(): Transform | undefined {\r\n const matrixInverse = this._matrix.inverse();\r\n if (!matrixInverse)\r\n return undefined;\r\n return Transform.createRefs(\r\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z),\r\n matrixInverse);\r\n }\r\n /** Initialize transforms that map each direction of a box (axis aligned) to `[0,1]`.\r\n * * The corner coordinates do _not_ need to be in order in any of the x,y,z directions.\r\n * * The npcToGlobalTransform (if supplied) maps 000 to the point named point000.\r\n * * The npcToGlobalTransform (if supplied) maps 11 to the point named point000.\r\n * * The globalToNpc transform is the inverse.\r\n * @param min the \"000\" corner of the box\r\n * @param max the \"111\" corner of the box\r\n * @param npcToGlobal (object created by caller, re-initialized here) transform that carries 01 coordinates into the min,max box.\r\n * @param globalToNpc (object created by caller, re-initialized here) transform that carries world coordinates into 01\r\n */\r\n public static initFromRange(min: Point3d, max: Point3d, npcToGlobal?: Transform, globalToNpc?: Transform) {\r\n const diag = max.minus(min);\r\n if (diag.x === 0.0) diag.x = 1.0;\r\n if (diag.y === 0.0) diag.y = 1.0;\r\n if (diag.z === 0.0) diag.z = 1.0;\r\n\r\n const rMatrix = new Matrix3d();\r\n if (npcToGlobal) {\r\n Matrix3d.createScale(diag.x, diag.y, diag.z, rMatrix);\r\n Transform.createOriginAndMatrix(min, rMatrix, npcToGlobal);\r\n }\r\n\r\n if (globalToNpc) {\r\n const origin = new Point3d(- min.x / diag.x, - min.y / diag.y, - min.z / diag.z);\r\n Matrix3d.createScale(1.0 / diag.x, 1.0 / diag.y, 1.0 / diag.z, rMatrix);\r\n Transform.createOriginAndMatrix(origin, rMatrix, globalToNpc);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,6 +1,3 @@
1
- /** @packageDocumentation
2
- * @module CartesianGeometry
3
- */
4
1
  /**
5
2
  * interface for class with `x` and `y` as number properties.
6
3
  * @public
@@ -60,6 +57,16 @@ export declare type XAndY = Readonly<WritableXAndY>;
60
57
  * @public
61
58
  */
62
59
  export declare type XYAndZ = Readonly<WritableXYAndZ>;
60
+ /** @public */
61
+ export declare namespace XYAndZ {
62
+ /** Return true if two XYAndZs have equal x,y,z parts within a specified tolerance.
63
+ * @param a The first XYAndZ to compare
64
+ * @param b The second XYAndZ to compare
65
+ * @param The tolerance for comparison. If undefined, [[Geometry.smallMetricDistance]] is used.
66
+ * @returns true if the difference in each coordinate of `a` and `b` is smaller than `tol`.
67
+ */
68
+ function almostEqual(a: XYAndZ, b: XYAndZ, tol?: number): boolean;
69
+ }
63
70
  /**
64
71
  * interface for type with readable `low` and `high` members which have `x` and `y` number members.
65
72
  * @public
@@ -1 +1 @@
1
- {"version":3,"file":"XYZProps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/XYZProps.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;CACX;AACD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;CACX;AACD;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa,EAAE,aAAa;CACnE;AACD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,GAAG,EAAE,aAAa,CAAC;IACnB,6BAA6B;IAC7B,IAAI,EAAE,aAAa,CAAC;CACrB;AACD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,GAAG,EAAE,cAAc,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,cAAc,CAAC;CACtB;AACD;;;GAGG;AACH,oBAAY,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC3C;;;GAGG;AACH,oBAAY,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5C;;;GAGG;AACH,oBAAY,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC9C;;;GAGG;AACH,oBAAY,YAAY,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC1D;;;GAGG;AACH,oBAAY,aAAa,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAC5D;;;;;GAKG;AACH,oBAAY,QAAQ,GAAG;IACrB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,MAAM,EAAE,CAAC;AACb;;;;;GAKG;AACH,oBAAY,OAAO,GAAG;IACpB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,MAAM,EAAE,CAAC;AACb;;;;;;GAMG;AACH,oBAAY,aAAa,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;AAClD;;;;;;GAMG;AACH,oBAAY,cAAc,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG;IACnD,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AACF;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB,GAAG,QAAQ,EAAE,CAAC;AACf;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,EAAE,CAAC;AACd;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"XYZProps.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/XYZProps.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;CACX;AACD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,CAAC,EAAE,MAAM,CAAC;CACX;AACD;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa,EAAE,aAAa;CACnE;AACD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,0BAA0B;IAC1B,GAAG,EAAE,aAAa,CAAC;IACnB,6BAA6B;IAC7B,IAAI,EAAE,aAAa,CAAC;CACrB;AACD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,GAAG,EAAE,cAAc,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,cAAc,CAAC;CACtB;AACD;;;GAGG;AACH,oBAAY,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC3C;;;GAGG;AACH,oBAAY,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5C;;;GAGG;AACH,oBAAY,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAE9C,cAAc;AACd,yBAAiB,MAAM,CAAC;IACtB;;;;;OAKG;IACH,SAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAIvE;CACF;AAED;;;GAGG;AACH,oBAAY,YAAY,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC1D;;;GAGG;AACH,oBAAY,aAAa,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAC5D;;;;;GAKG;AACH,oBAAY,QAAQ,GAAG;IACrB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,MAAM,EAAE,CAAC;AACb;;;;;GAKG;AACH,oBAAY,OAAO,GAAG;IACpB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,GAAG,MAAM,EAAE,CAAC;AACb;;;;;;GAMG;AACH,oBAAY,aAAa,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;AAClD;;;;;;GAMG;AACH,oBAAY,cAAc,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG;IACnD,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AACF;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB,GAAG,QAAQ,EAAE,CAAC;AACf;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,EAAE,CAAC;AACd;;;;;GAKG;AACH,oBAAY,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,EAAE,CAAC"}
@@ -2,5 +2,24 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- export {};
5
+ /** @packageDocumentation
6
+ * @module CartesianGeometry
7
+ */
8
+ import { Geometry } from "../Geometry";
9
+ /** @public */
10
+ export var XYAndZ;
11
+ (function (XYAndZ) {
12
+ /** Return true if two XYAndZs have equal x,y,z parts within a specified tolerance.
13
+ * @param a The first XYAndZ to compare
14
+ * @param b The second XYAndZ to compare
15
+ * @param The tolerance for comparison. If undefined, [[Geometry.smallMetricDistance]] is used.
16
+ * @returns true if the difference in each coordinate of `a` and `b` is smaller than `tol`.
17
+ */
18
+ function almostEqual(a, b, tol) {
19
+ return Geometry.isSameCoordinate(a.x, b.x, tol)
20
+ && Geometry.isSameCoordinate(a.y, b.y, tol)
21
+ && Geometry.isSameCoordinate(a.z, b.z, tol);
22
+ }
23
+ XYAndZ.almostEqual = almostEqual;
24
+ })(XYAndZ || (XYAndZ = {}));
6
25
  //# sourceMappingURL=XYZProps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"XYZProps.js","sourceRoot":"","sources":["../../../src/geometry3d/XYZProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F","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\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\n/**\r\n * interface for class with `x` and `y` as number properties.\r\n * @public\r\n */\r\nexport interface WritableXAndY {\r\n /** x coordinate */\r\n x: number;\r\n /** y coordinate */\r\n y: number;\r\n}\r\n/**\r\n * interface for class with `z` as number property.\r\n * @public\r\n */\r\nexport interface WriteableHasZ {\r\n /** z coordinate */\r\n z: number;\r\n}\r\n/**\r\n * interface for class with `x`, `y`, `z` as number property.\r\n * @public\r\n */\r\nexport interface WritableXYAndZ extends WritableXAndY, WriteableHasZ {\r\n}\r\n/**\r\n * interface for class with named properties `low` and `high`, both being `WriteableXAndY`\r\n * @public\r\n */\r\nexport interface WritableLowAndHighXY {\r\n /** low x,y coordinates */\r\n low: WritableXAndY;\r\n /** high x,y,z coordinates */\r\n high: WritableXAndY;\r\n}\r\n/**\r\n * interface for class with named properties `low` and `high`, both being `WriteableXYAndZ`\r\n * @public\r\n */\r\nexport interface WritableLowAndHighXYZ {\r\n /** low x,y,z coordinates */\r\n low: WritableXYAndZ;\r\n /** High x,y,z coordinates */\r\n high: WritableXYAndZ;\r\n}\r\n/**\r\n * interface for readable `z` number members.\r\n * @public\r\n */\r\nexport type HasZ = Readonly<WriteableHasZ>;\r\n/**\r\n * interface for readable `x` and `y` number members.\r\n * @public\r\n */\r\nexport type XAndY = Readonly<WritableXAndY>;\r\n/**\r\n * interface for type with readable `x`, `y`, `z` number members.\r\n * @public\r\n */\r\nexport type XYAndZ = Readonly<WritableXYAndZ>;\r\n/**\r\n * interface for type with readable `low` and `high` members which have `x` and `y` number members.\r\n * @public\r\n */\r\nexport type LowAndHighXY = Readonly<WritableLowAndHighXY>;\r\n/**\r\n * interface for type with readable `low` and `high` members which have `x`, `y`, and `z` number members.\r\n * @public\r\n */\r\nexport type LowAndHighXYZ = Readonly<WritableLowAndHighXYZ>;\r\n/**\r\n * interface for variant json (one of)\r\n * * (individually optional) `x`, `y`, `z`\r\n * * number array\r\n * @public\r\n */\r\nexport type XYZProps = {\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n} | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * (individually optional) `x`, `y`\r\n * * number array\r\n * @public\r\n */\r\nexport type XYProps = {\r\n x?: number;\r\n y?: number;\r\n} | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * array of number arrays, with one matrix row in each array\r\n * * flat array of numbers, in row-mor order\r\n * * `Matrix3d` object\r\n * @public\r\n */\r\nexport type Matrix3dProps = number[][] | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * array of number arrays, with each low level array containing 4 numbers of a transform row (qx, qy, qz, ax)\r\n * * flat array of 12 numbers, in row-major order for the 3 rows of 4 values\r\n * * `Transform` object\r\n * @public\r\n */\r\nexport type TransformProps = number[][] | number[] | {\r\n origin: XYZProps;\r\n matrix: Matrix3dProps;\r\n};\r\n/**\r\n * interface for variant json representing a Range3d\r\n * * pair of `XYZProps` named `low` and `high`\r\n * * array of `XYZProps`\r\n * @public\r\n */\r\nexport type Range3dProps = {\r\n low: XYZProps;\r\n high: XYZProps;\r\n} | XYZProps[];\r\n/**\r\n * interface for variant json representing a Range2d\r\n * * pair of `XYProps` named `low` and `high`\r\n * * array of `XYProps`\r\n * @public\r\n */\r\nexport type Range2dProps = {\r\n low: XYProps;\r\n high: XYProps;\r\n} | XYProps[];\r\n/**\r\n * interface for variant json representing a Range1d\r\n * * pair of `number` named `low` and `high`\r\n * * array of `number`\r\n * @public\r\n */\r\nexport type Range1dProps = {\r\n low: number;\r\n high: number;\r\n} | number[];\r\n"]}
1
+ {"version":3,"file":"XYZProps.js","sourceRoot":"","sources":["../../../src/geometry3d/XYZProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA6DvC,cAAc;AACd,MAAM,KAAW,MAAM,CAYtB;AAZD,WAAiB,MAAM;IACrB;;;;;OAKG;IACH,SAAgB,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,GAAY;QAC5D,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;eAC1C,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;eACxC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAJe,kBAAW,cAI1B,CAAA;AACH,CAAC,EAZgB,MAAM,KAAN,MAAM,QAYtB","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\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\n/**\r\n * interface for class with `x` and `y` as number properties.\r\n * @public\r\n */\r\nexport interface WritableXAndY {\r\n /** x coordinate */\r\n x: number;\r\n /** y coordinate */\r\n y: number;\r\n}\r\n/**\r\n * interface for class with `z` as number property.\r\n * @public\r\n */\r\nexport interface WriteableHasZ {\r\n /** z coordinate */\r\n z: number;\r\n}\r\n/**\r\n * interface for class with `x`, `y`, `z` as number property.\r\n * @public\r\n */\r\nexport interface WritableXYAndZ extends WritableXAndY, WriteableHasZ {\r\n}\r\n/**\r\n * interface for class with named properties `low` and `high`, both being `WriteableXAndY`\r\n * @public\r\n */\r\nexport interface WritableLowAndHighXY {\r\n /** low x,y coordinates */\r\n low: WritableXAndY;\r\n /** high x,y,z coordinates */\r\n high: WritableXAndY;\r\n}\r\n/**\r\n * interface for class with named properties `low` and `high`, both being `WriteableXYAndZ`\r\n * @public\r\n */\r\nexport interface WritableLowAndHighXYZ {\r\n /** low x,y,z coordinates */\r\n low: WritableXYAndZ;\r\n /** High x,y,z coordinates */\r\n high: WritableXYAndZ;\r\n}\r\n/**\r\n * interface for readable `z` number members.\r\n * @public\r\n */\r\nexport type HasZ = Readonly<WriteableHasZ>;\r\n/**\r\n * interface for readable `x` and `y` number members.\r\n * @public\r\n */\r\nexport type XAndY = Readonly<WritableXAndY>;\r\n/**\r\n * interface for type with readable `x`, `y`, `z` number members.\r\n * @public\r\n */\r\nexport type XYAndZ = Readonly<WritableXYAndZ>;\r\n\r\n/** @public */\r\nexport namespace XYAndZ { // eslint-disable-line @typescript-eslint/no-redeclare\r\n /** Return true if two XYAndZs have equal x,y,z parts within a specified tolerance.\r\n * @param a The first XYAndZ to compare\r\n * @param b The second XYAndZ to compare\r\n * @param The tolerance for comparison. If undefined, [[Geometry.smallMetricDistance]] is used.\r\n * @returns true if the difference in each coordinate of `a` and `b` is smaller than `tol`.\r\n */\r\n export function almostEqual(a: XYAndZ, b: XYAndZ, tol?: number): boolean {\r\n return Geometry.isSameCoordinate(a.x, b.x, tol)\r\n && Geometry.isSameCoordinate(a.y, b.y, tol)\r\n && Geometry.isSameCoordinate(a.z, b.z, tol);\r\n }\r\n}\r\n\r\n/**\r\n * interface for type with readable `low` and `high` members which have `x` and `y` number members.\r\n * @public\r\n */\r\nexport type LowAndHighXY = Readonly<WritableLowAndHighXY>;\r\n/**\r\n * interface for type with readable `low` and `high` members which have `x`, `y`, and `z` number members.\r\n * @public\r\n */\r\nexport type LowAndHighXYZ = Readonly<WritableLowAndHighXYZ>;\r\n/**\r\n * interface for variant json (one of)\r\n * * (individually optional) `x`, `y`, `z`\r\n * * number array\r\n * @public\r\n */\r\nexport type XYZProps = {\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n} | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * (individually optional) `x`, `y`\r\n * * number array\r\n * @public\r\n */\r\nexport type XYProps = {\r\n x?: number;\r\n y?: number;\r\n} | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * array of number arrays, with one matrix row in each array\r\n * * flat array of numbers, in row-mor order\r\n * * `Matrix3d` object\r\n * @public\r\n */\r\nexport type Matrix3dProps = number[][] | number[];\r\n/**\r\n * interface for variant json (one of)\r\n * * array of number arrays, with each low level array containing 4 numbers of a transform row (qx, qy, qz, ax)\r\n * * flat array of 12 numbers, in row-major order for the 3 rows of 4 values\r\n * * `Transform` object\r\n * @public\r\n */\r\nexport type TransformProps = number[][] | number[] | {\r\n origin: XYZProps;\r\n matrix: Matrix3dProps;\r\n};\r\n/**\r\n * interface for variant json representing a Range3d\r\n * * pair of `XYZProps` named `low` and `high`\r\n * * array of `XYZProps`\r\n * @public\r\n */\r\nexport type Range3dProps = {\r\n low: XYZProps;\r\n high: XYZProps;\r\n} | XYZProps[];\r\n/**\r\n * interface for variant json representing a Range2d\r\n * * pair of `XYProps` named `low` and `high`\r\n * * array of `XYProps`\r\n * @public\r\n */\r\nexport type Range2dProps = {\r\n low: XYProps;\r\n high: XYProps;\r\n} | XYProps[];\r\n/**\r\n * interface for variant json representing a Range1d\r\n * * pair of `number` named `low` and `high`\r\n * * array of `number`\r\n * @public\r\n */\r\nexport type Range1dProps = {\r\n low: number;\r\n high: number;\r\n} | number[];\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PolyfaceClip.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceClip.ts"],"names":[],"mappings":"AAKA;;GAEG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AAEpF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAYrD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgBpD;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAuB;IAClC,0DAA0D;IACnD,QAAQ,CAAC,EAAE,eAAe,CAAC;IAClC,2DAA2D;IACpD,QAAQ,CAAC,EAAE,eAAe,CAAC;IAClC,qCAAqC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACnC,OAAO;IAKP,qDAAqD;WACvC,MAAM,CAAC,UAAU,GAAE,OAAc,EAAE,WAAW,GAAE,OAAe,EAAE,cAAc,GAAE,OAAe;IAIvG,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS;CAWnF;AACD;;GAEG;AACH,qBAAa,YAAY;IACvB;;;OAGG;WACW,oCAAoC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAE,OAAc,EAAE,iBAAiB,GAAE,OAAc;IAGxJ;;;OAGG;WACW,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAE,OAAc,EAAE,iBAAiB,GAAE,OAAe,GAAG,QAAQ;IAMrJ;;;OAGG;WACW,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,GAAG,QAAQ;IAYvG;;;;;;;OAOG;WACW,gDAAgD,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,WAAW,EAAE,uBAAuB,EAAE,cAAc,GAAE,MAAU;IAqE5L,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAclC,OAAO,CAAC,MAAM,CAAC,iCAAiC;IAOhD,OAAO,CAAC,MAAM,CAAC,sCAAsC;IAMrD,OAAO,CAAC,MAAM,CAAC,wCAAwC;IAavD;;;;KAIC;WACa,wCAAwC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,uBAAuB;IAoB5I;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAuB5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAkBxC,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAGxC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAwBhC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsC/B;;;;OAIG;WACW,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,uBAAuB;IAqBvI;;;;;;OAMG;WACW,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,kBAAkB,GAAG,0BAA0B,EAAE,WAAW,EAAE,uBAAuB,EACpK,YAAY,GAAE,MAAU;IAS1B;;;;QAII;WACU,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,kBAAkB,GAAG,QAAQ,GAAG,SAAS;IAQ7G;;;;;MAKE;IACF,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAYlC;;OAEG;WACW,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,YAAY,EAAE;IAe9F;;;;;;;;;;;;;;OAcG;WACW,+CAA+C,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAChH,cAAc,EAAE,eAAe,GAAG,SAAS,EAC3C,aAAa,EAAE,eAAe,GAAG,SAAS;IAsC5C;;;;;;;;;;;;;;;;OAgBG;WACW,cAAc,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,GAAG;QAAE,WAAW,EAAE,eAAe,CAAC;QAAC,UAAU,EAAE,eAAe,CAAA;KAAE;CAe5I"}
1
+ {"version":3,"file":"PolyfaceClip.d.ts","sourceRoot":"","sources":["../../../src/polyface/PolyfaceClip.ts"],"names":[],"mappings":"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"}
@@ -355,7 +355,7 @@ export class PolyfaceClip {
355
355
  chainContext.clusterAndMergeVerticesXYZ();
356
356
  const loops = chainContext.collectMaximalGrowableXYZArrays();
357
357
  if (loops.length > 1) {
358
- const loopSets = PolygonOps.sortOuterAndHoleLoopsXY(loops);
358
+ const loopSets = PolygonOps.sortOuterAndHoleLoops(loops, outwardNormal);
359
359
  for (const loopSet of loopSets) {
360
360
  PolygonOps.orientLoopsCCWForOutwardNormalInPlace(loopSet, outwardNormal);
361
361
  const contour = SweepContour.createForPolygon(loopSet, outwardNormal);
@@ -1 +1 @@
1
- {"version":3,"file":"PolyfaceClip.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceClip.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\r\n/** @packageDocumentation\r\n * @module Polyface\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { ClipPlane } from \"../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\r\nimport { AnyRegion } from \"../curve/CurveChain\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { RegionBinaryOpType, RegionOps } from \"../curve/RegionOps\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { IndexedXYZCollectionPolygonOps, PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range1d, Range2d, Range3d } from \"../geometry3d/Range\";\r\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SweepContour } from \"../solid/SweepContour\";\r\nimport { ChainMergeContext } from \"../topology/ChainMerge\";\r\nimport { RangeSearch } from \"./multiclip/RangeSearch\";\r\n// import { Point3d, Vector3d, Point2d } from \"./PointVector\";\r\nimport { IndexedPolyface, Polyface, PolyfaceVisitor } from \"./Polyface\";\r\nimport { PolyfaceBuilder } from \"./PolyfaceBuilder\";\r\nimport { PolyfaceQuery } from \"./PolyfaceQuery\";\r\n\r\n /**\r\n * carrier for a point array with an index into UnionOfConvexClipPlaneSets\r\n * @private\r\n */\r\n class ClipCandidate {\r\n public nextConvexSetIndex: number;\r\n public points: GrowableXYZArray;\r\n public constructor(points: GrowableXYZArray, nextConvexSetIndex: number) {\r\n this.nextConvexSetIndex = nextConvexSetIndex;\r\n this.points = points;\r\n }\r\n }\r\n\r\n/**\r\n * A pair of PolyfaceBuilder objects, for use by clippers that emit inside and outside parts.\r\n * * There are nominally 4 builders:\r\n * * builderA collects simple \"inside\" clip.\r\n * * builderB collects simple \"outside\" clip.\r\n * * builderA1 collects \"side\" clip for inside.\r\n * * builderB1 collets \"side\" clip for outside.\r\n * * `static ClippedPolyfaceBuilders.create(keepInside, keepOutside)` initializes `builderA` and `builderB` (each optionally to undefined), with undefined `builderA1` and `builderB1`\r\n * * `builders.enableSideBuilders()` makes `builderA1` and `builderB1` match `builderA` and `builderB`.\r\n * * construction methods aim their facets at appropriate builders if defined.\r\n * * @public\r\n */\r\nexport class ClippedPolyfaceBuilders {\r\n /** An available builder. Typically the \"inside\" parts */\r\n public builderA?: PolyfaceBuilder;\r\n /** An available builder. Typically the \"outside\" parts */\r\n public builderB?: PolyfaceBuilder;\r\n /** request to construct cut faces */\r\n public buildClosureFaces?: boolean;\r\n private constructor(builderA: PolyfaceBuilder | undefined, builderB: PolyfaceBuilder | undefined, buildClosureFaces: boolean = false) {\r\n this.builderA = builderA;\r\n this.builderB = builderB;\r\n this.buildClosureFaces = buildClosureFaces;\r\n }\r\n /** Simple create with default options on builder. */\r\n public static create(keepInside: boolean = true, keepOutside: boolean = false, buildSideFaces: boolean = false) {\r\n return new ClippedPolyfaceBuilders(keepInside ? PolyfaceBuilder.create() : undefined, keepOutside ? PolyfaceBuilder.create() : undefined, buildSideFaces);\r\n }\r\n\r\n public claimPolyface(selector: 0 | 1, fixup: boolean): IndexedPolyface | undefined {\r\n const builder = selector === 0 ? this.builderA : this.builderB;\r\n if (builder) {\r\n let polyface = builder.claimPolyface();\r\n if (fixup) {\r\n polyface = PolyfaceQuery.cloneWithTVertexFixup(polyface);\r\n }\r\n return polyface;\r\n }\r\n return undefined;\r\n }\r\n}\r\n/** PolyfaceClip is a static class gathering operations using Polyfaces and clippers.\r\n * @public\r\n */\r\nexport class PolyfaceClip {\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return all surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\" -- parameters, normals, etc are not interpolated\r\n */\r\n public static clipPolyfaceClipPlaneWithClosureFace(polyface: Polyface, clipper: ClipPlane, insideClip: boolean = true, buildClosureFaces: boolean = true) {\r\n return this.clipPolyfaceClipPlane(polyface, clipper, insideClip, buildClosureFaces);\r\n }\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return all surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\" -- parameters, normals, etc are not interpolated\r\n */\r\n public static clipPolyfaceClipPlane(polyface: Polyface, clipper: ClipPlane, insideClip: boolean = true, buildClosureFaces: boolean = false): Polyface {\r\n const builders = ClippedPolyfaceBuilders.create(insideClip, !insideClip, buildClosureFaces);\r\n this.clipPolyfaceInsideOutside(polyface, clipper, builders);\r\n return builders.claimPolyface(insideClip ? 0 : 1, true)!;\r\n }\r\n\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\".\r\n */\r\n public static clipPolyfaceConvexClipPlaneSet(polyface: Polyface, clipper: ConvexClipPlaneSet): Polyface {\r\n const visitor = polyface.createVisitor(0);\r\n const builder = PolyfaceBuilder.create();\r\n const work = new GrowableXYZArray(10);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n clipper.clipConvexPolygonInPlace(visitor.point, work);\r\n if (visitor.point.length > 2)\r\n builder.addPolygonGrowableXYZArray(visitor.point);\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * * outputSelect determines how the clip output is structured\r\n * * 0 outputs all shards -- this may have many interior edges.\r\n * * 1 stitches shards together to get cleaner facets.\r\n * @internal\r\n */\r\n public static clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders(polyface: Polyface, allClippers: UnionOfConvexClipPlaneSets, destination: ClippedPolyfaceBuilders, outputSelector: number = 1) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const insideShards: GrowableXYZArray[] = [];\r\n const outsideShards: GrowableXYZArray[] = [];\r\n const residualPolygons: ClipCandidate[] = [];\r\n let candidate: ClipCandidate | undefined;\r\n const outsideParts: GrowableXYZArray[] = [];\r\n\r\n const numConvexSet = allClippers.convexSets.length;\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n residualPolygons.push(new ClipCandidate(cache.grabAndFill(visitor.point), 0));\r\n while ((candidate = residualPolygons.pop()) !== undefined) {\r\n const convexSetIndex = candidate.nextConvexSetIndex;\r\n if (convexSetIndex >= numConvexSet) {\r\n // ths remnant polygon is OUT ...\r\n if (candidate.points.length > 2)\r\n outsideShards.push(candidate.points);\r\n } else {\r\n const clipper = allClippers.convexSets[convexSetIndex];\r\n outsideParts.length = 0; // NO NO -- why isn't it empty from prior step cleanup?\r\n const insidePart = clipper.clipInsidePushOutside(candidate.points, outsideParts, cache);\r\n if (insidePart) {\r\n if (insidePart.length > 2)\r\n insideShards.push(insidePart);\r\n // Keep outside parts active for clip by later facets . . .\r\n for (const outsidePolygon of outsideParts) {\r\n residualPolygons.push(new ClipCandidate(outsidePolygon, convexSetIndex + 1));\r\n }\r\n } else {\r\n // Nothing was insidePart. The outside parts might be split by intermediate steps -- but all the pieces are there.\r\n candidate.nextConvexSetIndex++;\r\n residualPolygons.push(candidate);\r\n }\r\n outsideParts.length = 0;\r\n }\r\n }\r\n if (outsideShards.length === 0) {\r\n builderA?.addPolygonGrowableXYZArray(visitor.point);\r\n } else if (insideShards.length === 0) {\r\n // the facet spanned clippers but is intact outside\r\n builderB?.addPolygonGrowableXYZArray(visitor.point);\r\n } else {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(undefined, visitor.point);\r\n let worldToLocal: Transform | undefined;\r\n if (outputSelector === 1 && localToWorld !== undefined\r\n && undefined !== (worldToLocal = localToWorld.inverse())) {\r\n this.cleanupAndAddRegion(builderA, insideShards, worldToLocal, localToWorld);\r\n\r\n this.cleanupAndAddRegion(builderB, outsideShards, worldToLocal, localToWorld);\r\n } else {\r\n for (const shard of insideShards)\r\n this.addPolygonToBuilderAndDropToCache(shard, builderA, cache);\r\n for (const shard of outsideShards)\r\n this.addPolygonToBuilderAndDropToCache(shard, builderB, cache);\r\n }\r\n }\r\n outsideShards.length = 0;\r\n insideShards.length = 0;\r\n }\r\n cache.dropAllToCache(outsideParts);\r\n if (destination.buildClosureFaces) {\r\n for (const clipper of allClippers.convexSets) {\r\n this.buildClosureFacesForConvexSet(visitor, clipper, destination, cache);\r\n }\r\n }\r\n }\r\n private static addRegion(builder: PolyfaceBuilder | undefined, region: AnyRegion | undefined) {\r\n if (builder !== undefined && region !== undefined) {\r\n if (region instanceof Loop && region.children.length === 1 && region.children[0] instanceof LineString3d) {\r\n builder.addPolygonGrowableXYZArray(region.children[0].packedPoints);\r\n } else if (region instanceof UnionRegion) {\r\n for (const child of region.children)\r\n this.addRegion(builder, child);\r\n }\r\n }\r\n }\r\n // WARNING: shards are transformed into local system, not reverted!!!\r\n private static cleanupAndAddRegion(builder: PolyfaceBuilder | undefined, shards: GrowableXYZArray[],\r\n worldToLocal: Transform | undefined, localToWorld: Transform | undefined) {\r\n if (builder !== undefined && shards.length > 0) {\r\n if (worldToLocal)\r\n GrowableXYZArray.multiplyTransformInPlace(worldToLocal, shards);\r\n const outsidePieces = RegionOps.polygonBooleanXYToLoops(shards, RegionBinaryOpType.Union, []);\r\n if (outsidePieces && outsidePieces.children.length > 0){\r\n if (localToWorld)\r\n outsidePieces.tryTransformInPlace(localToWorld);\r\n RegionOps.consolidateAdjacentPrimitives(outsidePieces);\r\n this.addRegion(builder, outsidePieces);\r\n }\r\n }\r\n }\r\n private static addPolygonToBuilderAndDropToCache(polygon: GrowableXYZArray | undefined, builder: PolyfaceBuilder | undefined, cache: GrowableXYZArrayCache) {\r\n if (polygon) {\r\n if (builder)\r\n builder.addPolygonGrowableXYZArray(polygon);\r\n cache.dropToCache(polygon);\r\n }\r\n }\r\n private static addPolygonArrayToBuilderAndDropToCache(polygonArray: GrowableXYZArray[], builder: PolyfaceBuilder | undefined, cache: GrowableXYZArrayCache) {\r\n let polygon;\r\n while ((polygon = polygonArray.pop()) !== undefined) {\r\n this.addPolygonToBuilderAndDropToCache(polygon, builder, cache);\r\n }\r\n }\r\n private static createChainContextsForConvexClipPlaneSet(clipper: ConvexClipPlaneSet): ChainMergeContext[] {\r\n const chainContexts = [];\r\n for (const plane of clipper.planes) {\r\n if (!plane.interior) {\r\n const c = ChainMergeContext.create();\r\n c.plane = plane;\r\n c.convexClipper = clipper;\r\n chainContexts.push(c);\r\n }\r\n }\r\n return chainContexts;\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * @internal\r\n */\r\n public static clipPolyfaceConvexClipPlaneSetToBuilders(polyface: Polyface, clipper: ConvexClipPlaneSet, destination: ClippedPolyfaceBuilders) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const outsideParts: GrowableXYZArray[] = [];\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n // !!! currentCandidates and next candidates are empty at this point !!!\r\n const insidePart = clipper.clipInsidePushOutside(visitor.point, outsideParts, cache);\r\n if (insidePart === undefined) {\r\n // everything is out ... outsideParts might be fragmented. Save only the original polygon\r\n builderB?.addPolygonGrowableXYZArray(visitor.point);\r\n cache.dropToCache(insidePart);\r\n cache.dropAllToCache(outsideParts);\r\n }\r\n this.addPolygonToBuilderAndDropToCache(insidePart, builderA, cache);\r\n this.addPolygonArrayToBuilderAndDropToCache(outsideParts, builderB, cache);\r\n }\r\n this.buildClosureFacesForConvexSet(visitor, clipper, destination, cache);\r\n }\r\n /**\r\n *\r\n * @param visitor visitor for all facets of interest (entire polyface)\r\n * @param clipper ConvexClipPlaneSet to apply\r\n * @param destination builders to receive inside, outside parts\r\n * @param cache GrowableArray cache.\r\n */\r\n private static buildClosureFacesForConvexSet(visitor: PolyfaceVisitor, clipper: ConvexClipPlaneSet, destination: ClippedPolyfaceBuilders,\r\n cache: GrowableXYZArrayCache) {\r\n if (destination.buildClosureFaces) {\r\n const chainContexts = this.createChainContextsForConvexClipPlaneSet(clipper);\r\n const workPoints = cache.grabFromCache();\r\n const facetPoints = cache.grabFromCache();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n for (const chainContext of chainContexts) {\r\n const plane = chainContext.plane;\r\n facetPoints.clear();\r\n facetPoints.pushFrom(visitor.point);\r\n IndexedXYZCollectionPolygonOps.clipConvexPolygonInPlace(plane!, facetPoints, workPoints);\r\n chainContext.addSegmentsOnPlane(facetPoints, true);\r\n }\r\n }\r\n cache.dropToCache(facetPoints);\r\n cache.dropToCache(workPoints);\r\n for (const chainContext of chainContexts) {\r\n this.addClosureFacets(chainContext, destination, cache);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param visitor visitor for all facets of interest (entire polyface)\r\n * @param clipper ConvexClipPlaneSet to apply\r\n * @param destination builders to receive inside, outside parts\r\n * @param cache GrowableArray cache.\r\n */\r\n private static buildClosureFacesForPlane(visitor: PolyfaceVisitor, plane: PlaneAltitudeEvaluator, destination: ClippedPolyfaceBuilders,\r\n cache: GrowableXYZArrayCache) {\r\n if (destination.buildClosureFaces) {\r\n const chainContext = ChainMergeContext.create();\r\n chainContext.plane = plane;\r\n const workPoints = cache.grabFromCache();\r\n const facetPoints = cache.grabFromCache();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n facetPoints.clear();\r\n facetPoints.pushFrom(visitor.point);\r\n IndexedXYZCollectionPolygonOps.clipConvexPolygonInPlace(plane, facetPoints, workPoints);\r\n chainContext.addSegmentsOnPlane(facetPoints, true);\r\n }\r\n cache.dropToCache(facetPoints);\r\n cache.dropToCache(workPoints);\r\n this.addClosureFacets(chainContext, destination, cache);\r\n }\r\n }\r\n private static evaluateInwardPlaneNormal(plane: PlaneAltitudeEvaluator, scale: number): Vector3d {\r\n return Vector3d.create(plane.velocityXYZ(scale, 0, 0), plane.velocityXYZ(0, scale, 0), plane.velocityXYZ(0, 0, scale));\r\n }\r\n /**\r\n * * Triangulate the contour.\r\n * * Add all the triangles to both builders\r\n * * reversed in builderB.\r\n */\r\n private static addClippedContour(contour: SweepContour, clipper: ConvexClipPlaneSet | undefined, destination: ClippedPolyfaceBuilders, cache: GrowableXYZArrayCache) {\r\n const polygonA = cache.grabFromCache();\r\n const polygonB = cache.grabFromCache();\r\n if (destination.builderB)\r\n destination.builderB.toggleReversedFacetFlag();\r\n contour.announceFacets((facets: IndexedPolyface) => {\r\n const visitor = facets.createVisitor();\r\n // The contour facets are convex .. easy clip ..\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n polygonA.clear();\r\n polygonA.pushFromGrowableXYZArray(visitor.point);\r\n clipper?.clipConvexPolygonInPlace(polygonA, polygonB);\r\n if (polygonA.length > 2) {\r\n destination.builderA?.addPolygonGrowableXYZArray(polygonA);\r\n destination.builderB?.addPolygonGrowableXYZArray(polygonA);\r\n }\r\n }\r\n }, undefined);\r\n if (destination.builderB)\r\n destination.builderB.toggleReversedFacetFlag();\r\n cache.dropToCache(polygonA);\r\n cache.dropToCache(polygonB);\r\n }\r\n\r\n /**\r\n * Gather loops out of the ChainMergeContext. Add to destination arrays.\r\n * @param chainContext ASSUMED TO HAVE A PLANE\r\n * @param destination\r\n */\r\n private static addClosureFacets(chainContext: ChainMergeContext, destination: ClippedPolyfaceBuilders, cache: GrowableXYZArrayCache) {\r\n const clipper = chainContext.convexClipper;\r\n const plane = chainContext.plane!;\r\n const outwardNormal = this.evaluateInwardPlaneNormal(plane, -1.0);\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n const loops = chainContext.collectMaximalGrowableXYZArrays();\r\n if (loops.length > 1) {\r\n const loopSets = PolygonOps.sortOuterAndHoleLoopsXY(loops);\r\n for (const loopSet of loopSets) {\r\n PolygonOps.orientLoopsCCWForOutwardNormalInPlace(loopSet, outwardNormal);\r\n const contour = SweepContour.createForPolygon(loopSet, outwardNormal);\r\n if (contour !== undefined) {\r\n if (clipper) {\r\n this.addClippedContour(contour, clipper, destination, cache);\r\n } else {\r\n if (destination.builderA)\r\n contour.emitFacets(destination.builderA, true, clipper);\r\n if (destination.builderB)\r\n contour.emitFacets(destination.builderB, false, clipper);\r\n }\r\n }\r\n }\r\n } else {\r\n PolygonOps.orientLoopsCCWForOutwardNormalInPlace(loops, outwardNormal);\r\n const contour = SweepContour.createForPolygon(loops, outwardNormal);\r\n if (contour !== undefined) {\r\n if (clipper) {\r\n this.addClippedContour(contour, clipper, destination, cache);\r\n } else {\r\n if (destination.builderA)\r\n contour.emitFacets(destination.builderA, true, clipper);\r\n if (destination.builderB)\r\n contour.emitFacets(destination.builderB, false, clipper);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * @internal\r\n */\r\n public static clipPolyfaceClipPlaneToBuilders(polyface: Polyface, clipper: PlaneAltitudeEvaluator, destination: ClippedPolyfaceBuilders) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const inside = cache.grabFromCache();\r\n const outside = cache.grabFromCache();\r\n const range = Range1d.createNull();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n // !!! currentCandidates and next candidates are empty at this point !!!\r\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(clipper, visitor.point, inside, outside, range);\r\n if (builderA)\r\n builderA.addPolygonGrowableXYZArray(inside);\r\n if (builderB)\r\n builderB.addPolygonGrowableXYZArray(outside);\r\n }\r\n this.buildClosureFacesForPlane(visitor, clipper, destination, cache);\r\n cache.dropToCache(inside);\r\n cache.dropToCache(outside);\r\n }\r\n\r\n /** Clip each facet of polyface to the ClipPlane or ConvexClipPlaneSet\r\n * * accumulate inside and outside facets -- to destination.builderA and destination.builderB\r\n * * if `destination.buildClosureFaces` is set, and also build closure facets\r\n * * This method parses the variant input types and calls a more specific method.\r\n * * WARNING: The new mesh is \"points only\".\r\n * * outputSelect applies only for UnionOfConvexClipPlaneSets -- see [[PolyfaceClip.clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders]]\r\n */\r\n public static clipPolyfaceInsideOutside(polyface: Polyface, clipper: ClipPlane | ConvexClipPlaneSet | UnionOfConvexClipPlaneSets, destination: ClippedPolyfaceBuilders,\r\n outputSelect: number = 0) {\r\n if (clipper instanceof ClipPlane) {\r\n this.clipPolyfaceClipPlaneToBuilders(polyface, clipper, destination);\r\n } else if (clipper instanceof ConvexClipPlaneSet) {\r\n this.clipPolyfaceConvexClipPlaneSetToBuilders(polyface, clipper, destination);\r\n } else if (clipper instanceof UnionOfConvexClipPlaneSets) {\r\n this.clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders(polyface, clipper, destination, outputSelect);\r\n }\r\n }\r\n /** Clip each facet of polyface to the ClipPlane or ConvexClipPlaneSet\r\n * * This method parses the variant input types and calls a more specific method.\r\n * * To get both inside and outside parts, use clipPolyfaceInsideOutside\r\n * * WARNING: The new mesh is \"points only\".\r\n */\r\n public static clipPolyface(polyface: Polyface, clipper: ClipPlane | ConvexClipPlaneSet): Polyface | undefined {\r\n if (clipper instanceof ClipPlane)\r\n return this.clipPolyfaceClipPlane(polyface, clipper);\r\n if (clipper instanceof ConvexClipPlaneSet)\r\n return this.clipPolyfaceConvexClipPlaneSet(polyface, clipper);\r\n // (The if tests exhaust the type space -- this line is unreachable.)\r\n return undefined;\r\n }\r\n /** Find consecutive points around a polygon (with implied closure edge) that are ON a plane\r\n * @param points array of points around polygon. Closure edge is implied.\r\n * @param chainContext context receiving edges\r\n * @param point0 work point\r\n * @param point1 work point\r\n */\r\n private static collectEdgesOnPlane(points: GrowableXYZArray, clipper: ClipPlane, chainContext: ChainMergeContext, point0: Point3d, point1: Point3d) {\r\n const n = points.length;\r\n if (n > 1) {\r\n points.getPoint3dAtUncheckedPointIndex(n - 1, point0);\r\n for (let i = 0; i < n; i++) {\r\n points.getPoint3dAtUncheckedPointIndex(i, point1);\r\n if (clipper.isPointOn(point0) && clipper.isPointOn(point1))\r\n chainContext.addSegment(point0, point1);\r\n point0.setFromPoint3d(point1);\r\n }\r\n }\r\n }\r\n /** Intersect each facet with the clip plane. (Producing intersection edges.)\r\n * * Return all edges chained as array of LineString3d.\r\n */\r\n public static sectionPolyfaceClipPlane(polyface: Polyface, clipper: ClipPlane): LineString3d[] {\r\n const chainContext = ChainMergeContext.create();\r\n\r\n const visitor = polyface.createVisitor(0);\r\n const work = new GrowableXYZArray(10);\r\n const point0 = Point3d.create();\r\n const point1 = Point3d.create();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n clipper.clipConvexPolygonInPlace(visitor.point, work, true);\r\n this.collectEdgesOnPlane(visitor.point, clipper, chainContext, point0, point1);\r\n }\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n return chainContext.collectMaximalChains();\r\n }\r\n\r\n /**\r\n * * Split facets of mesh \"A\" into parts that are\r\n * * under mesh \"B\"\r\n * * over mesh \"B\"\r\n * * both meshes are represented by visitors rather than the meshes themselves\r\n * * If the data in-hand is a mesh, call with `mesh.createVisitor`\r\n * * The respective clip parts are fed to caller-supplied builders.\r\n * * Caller may set either or both builders to toggle facet order (e.g. toggle the lower facets to make them \"point down\" in cut-fill application)\r\n * * This step is commonly one-half of \"cut fill\".\r\n * * A \"cut fill\" wrapper will call this twice with the visitor and builder roles reversed.\r\n * * Both polyfaces are assumed convex with CCW orientation viewed from above.\r\n * @param visitorA iterator over polyface to be split.\r\n * @param visitorB iterator over polyface that acts as a splitter\r\n * @param orientUnderMeshDownward if true, the \"meshAUnderB\" output is oriented with its normals reversed so it can act as the bottom side of a cut-fill pair.\r\n */\r\n public static clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorA: PolyfaceVisitor, visitorB: PolyfaceVisitor,\r\n builderAUnderB: PolyfaceBuilder | undefined,\r\n builderAOverB: PolyfaceBuilder | undefined) {\r\n const rangeDataA = PolyfaceQuery.collectRangeLengthData(visitorA);\r\n const searchA = RangeSearch.create2dSearcherForRangeLengthData<number>(rangeDataA);\r\n if (!searchA)\r\n return;\r\n const range = Range3d.create();\r\n for (visitorA.reset(); visitorA.moveToNextFacet();) {\r\n visitorA.point.setRange(range);\r\n searchA.addRange(range, visitorA.currentReadIndex());\r\n }\r\n const xyClip = new GrowableXYZArray(10);\r\n const workArray = new GrowableXYZArray(10);\r\n const xyFrustum = ConvexClipPlaneSet.createEmpty();\r\n const below = new GrowableXYZArray(10);\r\n const above = new GrowableXYZArray(10);\r\n const planeOfFacet = ClipPlane.createNormalAndPointXYZXYZ(0, 0, 1, 0, 0, 0)!;\r\n const altitudeRange = Range1d.createNull();\r\n\r\n for (visitorB.reset(); visitorB.moveToNextFacet();) {\r\n visitorB.point.setRange(range);\r\n ConvexClipPlaneSet.setPlaneAndXYLoopCCW(visitorB.point, planeOfFacet, xyFrustum);\r\n searchA.searchRange2d(range, (_rangeA: Range2d, readIndexA: number) => {\r\n visitorA.moveToReadIndex(readIndexA);\r\n xyFrustum.polygonClip(visitorA.point, xyClip, workArray);\r\n // builderAOverB.addPolygonGrowableXYZArray(xyClip);\r\n if (xyClip.length > 0) {\r\n // planeOfFacet.convexPolygonSplitInsideOutsideGrowableArrays(xyClip, below, above, altitudeRange);\r\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(planeOfFacet, xyClip, below, above, altitudeRange);\r\n if (below.length > 0 && builderAUnderB)\r\n builderAUnderB.addPolygonGrowableXYZArray(below);\r\n if (above.length > 0 && builderAOverB)\r\n builderAOverB.addPolygonGrowableXYZArray(above);\r\n }\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * * Split facets into vertically overlapping sections\r\n * * both meshes are represented by visitors rather than the meshes themselves\r\n * * If the data in-hand is a mesh, call with `mesh.createVisitor`\r\n * * The respective clip parts are returned as separate meshes.\r\n * * Caller may set either or both builders to toggle facet order (e.g. toggle the lower facets to make them \"point down\" in cut-fill application)\r\n * * Both polyfaces are assumed convex with CCW orientation viewed from above.\r\n * * Each output contains some facets from meshA and some from meshB:\r\n * * meshAUnderB -- areas where meshA is underneath mesh B.\r\n * * If A is \"design surface\" and B is existing DTM, this is \"cut\" volume\r\n * * meshAOverB -- areas where meshB is over meshB.\r\n * * If A is \"design surface\" and B is existing DTM, this is \"fill\" volume\r\n *\r\n * @param visitorA iterator over polyface to be split.\r\n * @param visitorB iterator over polyface that acts as a splitter\r\n * @param orientUnderMeshDownward if true, the \"meshAUnderB\" output is oriented with its normals reversed so it can act as the bottom side of a cut-fill pair.\r\n */\r\n public static computeCutFill(meshA: IndexedPolyface, meshB: IndexedPolyface): { meshAUnderB: IndexedPolyface, meshAOverB: IndexedPolyface } {\r\n const visitorA = meshA.createVisitor();\r\n const visitorB = meshB.createVisitor();\r\n const builderAUnderB = PolyfaceBuilder.create();\r\n const builderAOverB = PolyfaceBuilder.create();\r\n builderAUnderB.toggleReversedFacetFlag();\r\n this.clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorA, visitorB, builderAUnderB, builderAOverB);\r\n builderAUnderB.toggleReversedFacetFlag();\r\n builderAOverB.toggleReversedFacetFlag();\r\n this.clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorB, visitorA, builderAOverB, builderAUnderB);\r\n return {\r\n meshAUnderB: builderAUnderB.claimPolyface(),\r\n meshAOverB: builderAOverB.claimPolyface(),\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"PolyfaceClip.js","sourceRoot":"","sources":["../../../src/polyface/PolyfaceClip.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\r\n/** @packageDocumentation\r\n * @module Polyface\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\nimport { ClipPlane } from \"../clipping/ClipPlane\";\r\nimport { ConvexClipPlaneSet } from \"../clipping/ConvexClipPlaneSet\";\r\nimport { UnionOfConvexClipPlaneSets } from \"../clipping/UnionOfConvexClipPlaneSets\";\r\nimport { AnyRegion } from \"../curve/CurveChain\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { RegionBinaryOpType, RegionOps } from \"../curve/RegionOps\";\r\nimport { UnionRegion } from \"../curve/UnionRegion\";\r\nimport { PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { FrameBuilder } from \"../geometry3d/FrameBuilder\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { IndexedXYZCollectionPolygonOps, PolygonOps } from \"../geometry3d/PolygonOps\";\r\nimport { Range1d, Range2d, Range3d } from \"../geometry3d/Range\";\r\nimport { GrowableXYZArrayCache } from \"../geometry3d/ReusableObjectCache\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SweepContour } from \"../solid/SweepContour\";\r\nimport { ChainMergeContext } from \"../topology/ChainMerge\";\r\nimport { RangeSearch } from \"./multiclip/RangeSearch\";\r\nimport { IndexedPolyface, Polyface, PolyfaceVisitor } from \"./Polyface\";\r\nimport { PolyfaceBuilder } from \"./PolyfaceBuilder\";\r\nimport { PolyfaceQuery } from \"./PolyfaceQuery\";\r\n\r\n /**\r\n * carrier for a point array with an index into UnionOfConvexClipPlaneSets\r\n * @private\r\n */\r\n class ClipCandidate {\r\n public nextConvexSetIndex: number;\r\n public points: GrowableXYZArray;\r\n public constructor(points: GrowableXYZArray, nextConvexSetIndex: number) {\r\n this.nextConvexSetIndex = nextConvexSetIndex;\r\n this.points = points;\r\n }\r\n }\r\n\r\n/**\r\n * A pair of PolyfaceBuilder objects, for use by clippers that emit inside and outside parts.\r\n * * There are nominally 4 builders:\r\n * * builderA collects simple \"inside\" clip.\r\n * * builderB collects simple \"outside\" clip.\r\n * * builderA1 collects \"side\" clip for inside.\r\n * * builderB1 collets \"side\" clip for outside.\r\n * * `static ClippedPolyfaceBuilders.create(keepInside, keepOutside)` initializes `builderA` and `builderB` (each optionally to undefined), with undefined `builderA1` and `builderB1`\r\n * * `builders.enableSideBuilders()` makes `builderA1` and `builderB1` match `builderA` and `builderB`.\r\n * * construction methods aim their facets at appropriate builders if defined.\r\n * * @public\r\n */\r\nexport class ClippedPolyfaceBuilders {\r\n /** An available builder. Typically the \"inside\" parts */\r\n public builderA?: PolyfaceBuilder;\r\n /** An available builder. Typically the \"outside\" parts */\r\n public builderB?: PolyfaceBuilder;\r\n /** request to construct cut faces */\r\n public buildClosureFaces?: boolean;\r\n private constructor(builderA: PolyfaceBuilder | undefined, builderB: PolyfaceBuilder | undefined, buildClosureFaces: boolean = false) {\r\n this.builderA = builderA;\r\n this.builderB = builderB;\r\n this.buildClosureFaces = buildClosureFaces;\r\n }\r\n /** Simple create with default options on builder. */\r\n public static create(keepInside: boolean = true, keepOutside: boolean = false, buildSideFaces: boolean = false) {\r\n return new ClippedPolyfaceBuilders(keepInside ? PolyfaceBuilder.create() : undefined, keepOutside ? PolyfaceBuilder.create() : undefined, buildSideFaces);\r\n }\r\n\r\n public claimPolyface(selector: 0 | 1, fixup: boolean): IndexedPolyface | undefined {\r\n const builder = selector === 0 ? this.builderA : this.builderB;\r\n if (builder) {\r\n let polyface = builder.claimPolyface();\r\n if (fixup) {\r\n polyface = PolyfaceQuery.cloneWithTVertexFixup(polyface);\r\n }\r\n return polyface;\r\n }\r\n return undefined;\r\n }\r\n}\r\n/** PolyfaceClip is a static class gathering operations using Polyfaces and clippers.\r\n * @public\r\n */\r\nexport class PolyfaceClip {\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return all surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\" -- parameters, normals, etc are not interpolated\r\n */\r\n public static clipPolyfaceClipPlaneWithClosureFace(polyface: Polyface, clipper: ClipPlane, insideClip: boolean = true, buildClosureFaces: boolean = true) {\r\n return this.clipPolyfaceClipPlane(polyface, clipper, insideClip, buildClosureFaces);\r\n }\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return all surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\" -- parameters, normals, etc are not interpolated\r\n */\r\n public static clipPolyfaceClipPlane(polyface: Polyface, clipper: ClipPlane, insideClip: boolean = true, buildClosureFaces: boolean = false): Polyface {\r\n const builders = ClippedPolyfaceBuilders.create(insideClip, !insideClip, buildClosureFaces);\r\n this.clipPolyfaceInsideOutside(polyface, clipper, builders);\r\n return builders.claimPolyface(insideClip ? 0 : 1, true)!;\r\n }\r\n\r\n /** Clip each facet of polyface to the ClipPlane.\r\n * * Return surviving clip as a new mesh.\r\n * * WARNING: The new mesh is \"points only\".\r\n */\r\n public static clipPolyfaceConvexClipPlaneSet(polyface: Polyface, clipper: ConvexClipPlaneSet): Polyface {\r\n const visitor = polyface.createVisitor(0);\r\n const builder = PolyfaceBuilder.create();\r\n const work = new GrowableXYZArray(10);\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n clipper.clipConvexPolygonInPlace(visitor.point, work);\r\n if (visitor.point.length > 2)\r\n builder.addPolygonGrowableXYZArray(visitor.point);\r\n }\r\n return builder.claimPolyface(true);\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * * outputSelect determines how the clip output is structured\r\n * * 0 outputs all shards -- this may have many interior edges.\r\n * * 1 stitches shards together to get cleaner facets.\r\n * @internal\r\n */\r\n public static clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders(polyface: Polyface, allClippers: UnionOfConvexClipPlaneSets, destination: ClippedPolyfaceBuilders, outputSelector: number = 1) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const insideShards: GrowableXYZArray[] = [];\r\n const outsideShards: GrowableXYZArray[] = [];\r\n const residualPolygons: ClipCandidate[] = [];\r\n let candidate: ClipCandidate | undefined;\r\n const outsideParts: GrowableXYZArray[] = [];\r\n\r\n const numConvexSet = allClippers.convexSets.length;\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n residualPolygons.push(new ClipCandidate(cache.grabAndFill(visitor.point), 0));\r\n while ((candidate = residualPolygons.pop()) !== undefined) {\r\n const convexSetIndex = candidate.nextConvexSetIndex;\r\n if (convexSetIndex >= numConvexSet) {\r\n // ths remnant polygon is OUT ...\r\n if (candidate.points.length > 2)\r\n outsideShards.push(candidate.points);\r\n } else {\r\n const clipper = allClippers.convexSets[convexSetIndex];\r\n outsideParts.length = 0; // NO NO -- why isn't it empty from prior step cleanup?\r\n const insidePart = clipper.clipInsidePushOutside(candidate.points, outsideParts, cache);\r\n if (insidePart) {\r\n if (insidePart.length > 2)\r\n insideShards.push(insidePart);\r\n // Keep outside parts active for clip by later facets . . .\r\n for (const outsidePolygon of outsideParts) {\r\n residualPolygons.push(new ClipCandidate(outsidePolygon, convexSetIndex + 1));\r\n }\r\n } else {\r\n // Nothing was insidePart. The outside parts might be split by intermediate steps -- but all the pieces are there.\r\n candidate.nextConvexSetIndex++;\r\n residualPolygons.push(candidate);\r\n }\r\n outsideParts.length = 0;\r\n }\r\n }\r\n if (outsideShards.length === 0) {\r\n builderA?.addPolygonGrowableXYZArray(visitor.point);\r\n } else if (insideShards.length === 0) {\r\n // the facet spanned clippers but is intact outside\r\n builderB?.addPolygonGrowableXYZArray(visitor.point);\r\n } else {\r\n const localToWorld = FrameBuilder.createRightHandedFrame(undefined, visitor.point);\r\n let worldToLocal: Transform | undefined;\r\n if (outputSelector === 1 && localToWorld !== undefined\r\n && undefined !== (worldToLocal = localToWorld.inverse())) {\r\n this.cleanupAndAddRegion(builderA, insideShards, worldToLocal, localToWorld);\r\n\r\n this.cleanupAndAddRegion(builderB, outsideShards, worldToLocal, localToWorld);\r\n } else {\r\n for (const shard of insideShards)\r\n this.addPolygonToBuilderAndDropToCache(shard, builderA, cache);\r\n for (const shard of outsideShards)\r\n this.addPolygonToBuilderAndDropToCache(shard, builderB, cache);\r\n }\r\n }\r\n outsideShards.length = 0;\r\n insideShards.length = 0;\r\n }\r\n cache.dropAllToCache(outsideParts);\r\n if (destination.buildClosureFaces) {\r\n for (const clipper of allClippers.convexSets) {\r\n this.buildClosureFacesForConvexSet(visitor, clipper, destination, cache);\r\n }\r\n }\r\n }\r\n private static addRegion(builder: PolyfaceBuilder | undefined, region: AnyRegion | undefined) {\r\n if (builder !== undefined && region !== undefined) {\r\n if (region instanceof Loop && region.children.length === 1 && region.children[0] instanceof LineString3d) {\r\n builder.addPolygonGrowableXYZArray(region.children[0].packedPoints);\r\n } else if (region instanceof UnionRegion) {\r\n for (const child of region.children)\r\n this.addRegion(builder, child);\r\n }\r\n }\r\n }\r\n // WARNING: shards are transformed into local system, not reverted!!!\r\n private static cleanupAndAddRegion(builder: PolyfaceBuilder | undefined, shards: GrowableXYZArray[],\r\n worldToLocal: Transform | undefined, localToWorld: Transform | undefined) {\r\n if (builder !== undefined && shards.length > 0) {\r\n if (worldToLocal)\r\n GrowableXYZArray.multiplyTransformInPlace(worldToLocal, shards);\r\n const outsidePieces = RegionOps.polygonBooleanXYToLoops(shards, RegionBinaryOpType.Union, []);\r\n if (outsidePieces && outsidePieces.children.length > 0){\r\n if (localToWorld)\r\n outsidePieces.tryTransformInPlace(localToWorld);\r\n RegionOps.consolidateAdjacentPrimitives(outsidePieces);\r\n this.addRegion(builder, outsidePieces);\r\n }\r\n }\r\n }\r\n private static addPolygonToBuilderAndDropToCache(polygon: GrowableXYZArray | undefined, builder: PolyfaceBuilder | undefined, cache: GrowableXYZArrayCache) {\r\n if (polygon) {\r\n if (builder)\r\n builder.addPolygonGrowableXYZArray(polygon);\r\n cache.dropToCache(polygon);\r\n }\r\n }\r\n private static addPolygonArrayToBuilderAndDropToCache(polygonArray: GrowableXYZArray[], builder: PolyfaceBuilder | undefined, cache: GrowableXYZArrayCache) {\r\n let polygon;\r\n while ((polygon = polygonArray.pop()) !== undefined) {\r\n this.addPolygonToBuilderAndDropToCache(polygon, builder, cache);\r\n }\r\n }\r\n private static createChainContextsForConvexClipPlaneSet(clipper: ConvexClipPlaneSet): ChainMergeContext[] {\r\n const chainContexts = [];\r\n for (const plane of clipper.planes) {\r\n if (!plane.interior) {\r\n const c = ChainMergeContext.create();\r\n c.plane = plane;\r\n c.convexClipper = clipper;\r\n chainContexts.push(c);\r\n }\r\n }\r\n return chainContexts;\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * @internal\r\n */\r\n public static clipPolyfaceConvexClipPlaneSetToBuilders(polyface: Polyface, clipper: ConvexClipPlaneSet, destination: ClippedPolyfaceBuilders) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const outsideParts: GrowableXYZArray[] = [];\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n // !!! currentCandidates and next candidates are empty at this point !!!\r\n const insidePart = clipper.clipInsidePushOutside(visitor.point, outsideParts, cache);\r\n if (insidePart === undefined) {\r\n // everything is out ... outsideParts might be fragmented. Save only the original polygon\r\n builderB?.addPolygonGrowableXYZArray(visitor.point);\r\n cache.dropToCache(insidePart);\r\n cache.dropAllToCache(outsideParts);\r\n }\r\n this.addPolygonToBuilderAndDropToCache(insidePart, builderA, cache);\r\n this.addPolygonArrayToBuilderAndDropToCache(outsideParts, builderB, cache);\r\n }\r\n this.buildClosureFacesForConvexSet(visitor, clipper, destination, cache);\r\n }\r\n /**\r\n *\r\n * @param visitor visitor for all facets of interest (entire polyface)\r\n * @param clipper ConvexClipPlaneSet to apply\r\n * @param destination builders to receive inside, outside parts\r\n * @param cache GrowableArray cache.\r\n */\r\n private static buildClosureFacesForConvexSet(visitor: PolyfaceVisitor, clipper: ConvexClipPlaneSet, destination: ClippedPolyfaceBuilders,\r\n cache: GrowableXYZArrayCache) {\r\n if (destination.buildClosureFaces) {\r\n const chainContexts = this.createChainContextsForConvexClipPlaneSet(clipper);\r\n const workPoints = cache.grabFromCache();\r\n const facetPoints = cache.grabFromCache();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n for (const chainContext of chainContexts) {\r\n const plane = chainContext.plane;\r\n facetPoints.clear();\r\n facetPoints.pushFrom(visitor.point);\r\n IndexedXYZCollectionPolygonOps.clipConvexPolygonInPlace(plane!, facetPoints, workPoints);\r\n chainContext.addSegmentsOnPlane(facetPoints, true);\r\n }\r\n }\r\n cache.dropToCache(facetPoints);\r\n cache.dropToCache(workPoints);\r\n for (const chainContext of chainContexts) {\r\n this.addClosureFacets(chainContext, destination, cache);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param visitor visitor for all facets of interest (entire polyface)\r\n * @param clipper ConvexClipPlaneSet to apply\r\n * @param destination builders to receive inside, outside parts\r\n * @param cache GrowableArray cache.\r\n */\r\n private static buildClosureFacesForPlane(visitor: PolyfaceVisitor, plane: PlaneAltitudeEvaluator, destination: ClippedPolyfaceBuilders,\r\n cache: GrowableXYZArrayCache) {\r\n if (destination.buildClosureFaces) {\r\n const chainContext = ChainMergeContext.create();\r\n chainContext.plane = plane;\r\n const workPoints = cache.grabFromCache();\r\n const facetPoints = cache.grabFromCache();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n facetPoints.clear();\r\n facetPoints.pushFrom(visitor.point);\r\n IndexedXYZCollectionPolygonOps.clipConvexPolygonInPlace(plane, facetPoints, workPoints);\r\n chainContext.addSegmentsOnPlane(facetPoints, true);\r\n }\r\n cache.dropToCache(facetPoints);\r\n cache.dropToCache(workPoints);\r\n this.addClosureFacets(chainContext, destination, cache);\r\n }\r\n }\r\n private static evaluateInwardPlaneNormal(plane: PlaneAltitudeEvaluator, scale: number): Vector3d {\r\n return Vector3d.create(plane.velocityXYZ(scale, 0, 0), plane.velocityXYZ(0, scale, 0), plane.velocityXYZ(0, 0, scale));\r\n }\r\n /**\r\n * * Triangulate the contour.\r\n * * Add all the triangles to both builders\r\n * * reversed in builderB.\r\n */\r\n private static addClippedContour(contour: SweepContour, clipper: ConvexClipPlaneSet | undefined, destination: ClippedPolyfaceBuilders, cache: GrowableXYZArrayCache) {\r\n const polygonA = cache.grabFromCache();\r\n const polygonB = cache.grabFromCache();\r\n if (destination.builderB)\r\n destination.builderB.toggleReversedFacetFlag();\r\n contour.announceFacets((facets: IndexedPolyface) => {\r\n const visitor = facets.createVisitor();\r\n // The contour facets are convex .. easy clip ..\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n polygonA.clear();\r\n polygonA.pushFromGrowableXYZArray(visitor.point);\r\n clipper?.clipConvexPolygonInPlace(polygonA, polygonB);\r\n if (polygonA.length > 2) {\r\n destination.builderA?.addPolygonGrowableXYZArray(polygonA);\r\n destination.builderB?.addPolygonGrowableXYZArray(polygonA);\r\n }\r\n }\r\n }, undefined);\r\n if (destination.builderB)\r\n destination.builderB.toggleReversedFacetFlag();\r\n cache.dropToCache(polygonA);\r\n cache.dropToCache(polygonB);\r\n }\r\n\r\n /**\r\n * Gather loops out of the ChainMergeContext. Add to destination arrays.\r\n * @param chainContext ASSUMED TO HAVE A PLANE\r\n * @param destination\r\n */\r\n private static addClosureFacets(chainContext: ChainMergeContext, destination: ClippedPolyfaceBuilders, cache: GrowableXYZArrayCache) {\r\n const clipper = chainContext.convexClipper;\r\n const plane = chainContext.plane!;\r\n const outwardNormal = this.evaluateInwardPlaneNormal(plane, -1.0);\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n const loops = chainContext.collectMaximalGrowableXYZArrays();\r\n if (loops.length > 1) {\r\n const loopSets = PolygonOps.sortOuterAndHoleLoops(loops, outwardNormal);\r\n for (const loopSet of loopSets) {\r\n PolygonOps.orientLoopsCCWForOutwardNormalInPlace(loopSet, outwardNormal);\r\n const contour = SweepContour.createForPolygon(loopSet, outwardNormal);\r\n if (contour !== undefined) {\r\n if (clipper) {\r\n this.addClippedContour(contour, clipper, destination, cache);\r\n } else {\r\n if (destination.builderA)\r\n contour.emitFacets(destination.builderA, true, clipper);\r\n if (destination.builderB)\r\n contour.emitFacets(destination.builderB, false, clipper);\r\n }\r\n }\r\n }\r\n } else {\r\n PolygonOps.orientLoopsCCWForOutwardNormalInPlace(loops, outwardNormal);\r\n const contour = SweepContour.createForPolygon(loops, outwardNormal);\r\n if (contour !== undefined) {\r\n if (clipper) {\r\n this.addClippedContour(contour, clipper, destination, cache);\r\n } else {\r\n if (destination.builderA)\r\n contour.emitFacets(destination.builderA, true, clipper);\r\n if (destination.builderB)\r\n contour.emitFacets(destination.builderB, false, clipper);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Clip each facet of polyface to the the clippers.\r\n * * Add inside, outside fragments to builderA, builderB\r\n * * This does not consider params, normals, colors. Just points.\r\n * @internal\r\n */\r\n public static clipPolyfaceClipPlaneToBuilders(polyface: Polyface, clipper: PlaneAltitudeEvaluator, destination: ClippedPolyfaceBuilders) {\r\n const builderA = destination.builderA;\r\n const builderB = destination.builderB;\r\n const visitor = polyface.createVisitor(0);\r\n const cache = new GrowableXYZArrayCache();\r\n const inside = cache.grabFromCache();\r\n const outside = cache.grabFromCache();\r\n const range = Range1d.createNull();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n // !!! currentCandidates and next candidates are empty at this point !!!\r\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(clipper, visitor.point, inside, outside, range);\r\n if (builderA)\r\n builderA.addPolygonGrowableXYZArray(inside);\r\n if (builderB)\r\n builderB.addPolygonGrowableXYZArray(outside);\r\n }\r\n this.buildClosureFacesForPlane(visitor, clipper, destination, cache);\r\n cache.dropToCache(inside);\r\n cache.dropToCache(outside);\r\n }\r\n\r\n /** Clip each facet of polyface to the ClipPlane or ConvexClipPlaneSet\r\n * * accumulate inside and outside facets -- to destination.builderA and destination.builderB\r\n * * if `destination.buildClosureFaces` is set, and also build closure facets\r\n * * This method parses the variant input types and calls a more specific method.\r\n * * WARNING: The new mesh is \"points only\".\r\n * * outputSelect applies only for UnionOfConvexClipPlaneSets -- see [[PolyfaceClip.clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders]]\r\n */\r\n public static clipPolyfaceInsideOutside(polyface: Polyface, clipper: ClipPlane | ConvexClipPlaneSet | UnionOfConvexClipPlaneSets, destination: ClippedPolyfaceBuilders,\r\n outputSelect: number = 0) {\r\n if (clipper instanceof ClipPlane) {\r\n this.clipPolyfaceClipPlaneToBuilders(polyface, clipper, destination);\r\n } else if (clipper instanceof ConvexClipPlaneSet) {\r\n this.clipPolyfaceConvexClipPlaneSetToBuilders(polyface, clipper, destination);\r\n } else if (clipper instanceof UnionOfConvexClipPlaneSets) {\r\n this.clipPolyfaceUnionOfConvexClipPlaneSetsToBuilders(polyface, clipper, destination, outputSelect);\r\n }\r\n }\r\n /** Clip each facet of polyface to the ClipPlane or ConvexClipPlaneSet\r\n * * This method parses the variant input types and calls a more specific method.\r\n * * To get both inside and outside parts, use clipPolyfaceInsideOutside\r\n * * WARNING: The new mesh is \"points only\".\r\n */\r\n public static clipPolyface(polyface: Polyface, clipper: ClipPlane | ConvexClipPlaneSet): Polyface | undefined {\r\n if (clipper instanceof ClipPlane)\r\n return this.clipPolyfaceClipPlane(polyface, clipper);\r\n if (clipper instanceof ConvexClipPlaneSet)\r\n return this.clipPolyfaceConvexClipPlaneSet(polyface, clipper);\r\n // (The if tests exhaust the type space -- this line is unreachable.)\r\n return undefined;\r\n }\r\n /** Find consecutive points around a polygon (with implied closure edge) that are ON a plane\r\n * @param points array of points around polygon. Closure edge is implied.\r\n * @param chainContext context receiving edges\r\n * @param point0 work point\r\n * @param point1 work point\r\n */\r\n private static collectEdgesOnPlane(points: GrowableXYZArray, clipper: ClipPlane, chainContext: ChainMergeContext, point0: Point3d, point1: Point3d) {\r\n const n = points.length;\r\n if (n > 1) {\r\n points.getPoint3dAtUncheckedPointIndex(n - 1, point0);\r\n for (let i = 0; i < n; i++) {\r\n points.getPoint3dAtUncheckedPointIndex(i, point1);\r\n if (clipper.isPointOn(point0) && clipper.isPointOn(point1))\r\n chainContext.addSegment(point0, point1);\r\n point0.setFromPoint3d(point1);\r\n }\r\n }\r\n }\r\n /** Intersect each facet with the clip plane. (Producing intersection edges.)\r\n * * Return all edges chained as array of LineString3d.\r\n */\r\n public static sectionPolyfaceClipPlane(polyface: Polyface, clipper: ClipPlane): LineString3d[] {\r\n const chainContext = ChainMergeContext.create();\r\n\r\n const visitor = polyface.createVisitor(0);\r\n const work = new GrowableXYZArray(10);\r\n const point0 = Point3d.create();\r\n const point1 = Point3d.create();\r\n for (visitor.reset(); visitor.moveToNextFacet();) {\r\n clipper.clipConvexPolygonInPlace(visitor.point, work, true);\r\n this.collectEdgesOnPlane(visitor.point, clipper, chainContext, point0, point1);\r\n }\r\n chainContext.clusterAndMergeVerticesXYZ();\r\n return chainContext.collectMaximalChains();\r\n }\r\n\r\n /**\r\n * * Split facets of mesh \"A\" into parts that are\r\n * * under mesh \"B\"\r\n * * over mesh \"B\"\r\n * * both meshes are represented by visitors rather than the meshes themselves\r\n * * If the data in-hand is a mesh, call with `mesh.createVisitor`\r\n * * The respective clip parts are fed to caller-supplied builders.\r\n * * Caller may set either or both builders to toggle facet order (e.g. toggle the lower facets to make them \"point down\" in cut-fill application)\r\n * * This step is commonly one-half of \"cut fill\".\r\n * * A \"cut fill\" wrapper will call this twice with the visitor and builder roles reversed.\r\n * * Both polyfaces are assumed convex with CCW orientation viewed from above.\r\n * @param visitorA iterator over polyface to be split.\r\n * @param visitorB iterator over polyface that acts as a splitter\r\n * @param orientUnderMeshDownward if true, the \"meshAUnderB\" output is oriented with its normals reversed so it can act as the bottom side of a cut-fill pair.\r\n */\r\n public static clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorA: PolyfaceVisitor, visitorB: PolyfaceVisitor,\r\n builderAUnderB: PolyfaceBuilder | undefined,\r\n builderAOverB: PolyfaceBuilder | undefined) {\r\n const rangeDataA = PolyfaceQuery.collectRangeLengthData(visitorA);\r\n const searchA = RangeSearch.create2dSearcherForRangeLengthData<number>(rangeDataA);\r\n if (!searchA)\r\n return;\r\n const range = Range3d.create();\r\n for (visitorA.reset(); visitorA.moveToNextFacet();) {\r\n visitorA.point.setRange(range);\r\n searchA.addRange(range, visitorA.currentReadIndex());\r\n }\r\n const xyClip = new GrowableXYZArray(10);\r\n const workArray = new GrowableXYZArray(10);\r\n const xyFrustum = ConvexClipPlaneSet.createEmpty();\r\n const below = new GrowableXYZArray(10);\r\n const above = new GrowableXYZArray(10);\r\n const planeOfFacet = ClipPlane.createNormalAndPointXYZXYZ(0, 0, 1, 0, 0, 0)!;\r\n const altitudeRange = Range1d.createNull();\r\n\r\n for (visitorB.reset(); visitorB.moveToNextFacet();) {\r\n visitorB.point.setRange(range);\r\n ConvexClipPlaneSet.setPlaneAndXYLoopCCW(visitorB.point, planeOfFacet, xyFrustum);\r\n searchA.searchRange2d(range, (_rangeA: Range2d, readIndexA: number) => {\r\n visitorA.moveToReadIndex(readIndexA);\r\n xyFrustum.polygonClip(visitorA.point, xyClip, workArray);\r\n // builderAOverB.addPolygonGrowableXYZArray(xyClip);\r\n if (xyClip.length > 0) {\r\n // planeOfFacet.convexPolygonSplitInsideOutsideGrowableArrays(xyClip, below, above, altitudeRange);\r\n IndexedXYZCollectionPolygonOps.splitConvexPolygonInsideOutsidePlane(planeOfFacet, xyClip, below, above, altitudeRange);\r\n if (below.length > 0 && builderAUnderB)\r\n builderAUnderB.addPolygonGrowableXYZArray(below);\r\n if (above.length > 0 && builderAOverB)\r\n builderAOverB.addPolygonGrowableXYZArray(above);\r\n }\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * * Split facets into vertically overlapping sections\r\n * * both meshes are represented by visitors rather than the meshes themselves\r\n * * If the data in-hand is a mesh, call with `mesh.createVisitor`\r\n * * The respective clip parts are returned as separate meshes.\r\n * * Caller may set either or both builders to toggle facet order (e.g. toggle the lower facets to make them \"point down\" in cut-fill application)\r\n * * Both polyfaces are assumed convex with CCW orientation viewed from above.\r\n * * Each output contains some facets from meshA and some from meshB:\r\n * * meshAUnderB -- areas where meshA is underneath mesh B.\r\n * * If A is \"design surface\" and B is existing DTM, this is \"cut\" volume\r\n * * meshAOverB -- areas where meshB is over meshB.\r\n * * If A is \"design surface\" and B is existing DTM, this is \"fill\" volume\r\n *\r\n * @param visitorA iterator over polyface to be split.\r\n * @param visitorB iterator over polyface that acts as a splitter\r\n * @param orientUnderMeshDownward if true, the \"meshAUnderB\" output is oriented with its normals reversed so it can act as the bottom side of a cut-fill pair.\r\n */\r\n public static computeCutFill(meshA: IndexedPolyface, meshB: IndexedPolyface): { meshAUnderB: IndexedPolyface, meshAOverB: IndexedPolyface } {\r\n const visitorA = meshA.createVisitor();\r\n const visitorB = meshB.createVisitor();\r\n const builderAUnderB = PolyfaceBuilder.create();\r\n const builderAOverB = PolyfaceBuilder.create();\r\n builderAUnderB.toggleReversedFacetFlag();\r\n this.clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorA, visitorB, builderAUnderB, builderAOverB);\r\n builderAUnderB.toggleReversedFacetFlag();\r\n builderAOverB.toggleReversedFacetFlag();\r\n this.clipPolyfaceUnderOverConvexPolyfaceIntoBuilders(visitorB, visitorA, builderAOverB, builderAUnderB);\r\n return {\r\n meshAUnderB: builderAUnderB.claimPolyface(),\r\n meshAOverB: builderAOverB.claimPolyface(),\r\n };\r\n }\r\n}\r\n"]}