@itwin/core-geometry 4.7.0-dev.12 → 4.7.0-dev.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"TorusPipe.js","sourceRoot":"","sources":["../../../src/solid/TorusPipe.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 Solid\r\n */\r\n\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\r\nimport { GeometryHandler, UVSurface, UVSurfaceIsoParametricDistance } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\n\r\n/**\r\n * A torus pipe is a partial torus (donut). In a local coordinate system\r\n * * The z axis passes through the hole.\r\n * * The \"major hoop\" arc has\r\n * * vectorTheta0 = (radiusA, 0, 0)\r\n * * vectorTheta90 = (0, radiusA, 0)\r\n * * The major arc point at angle theta is `C(theta) = vectorTheta0 * cos(theta) + vectorTheta90 * sin(theta)\r\n * * The minor hoop at theta various with phi \"around the minor hoop\"\r\n * * (x,y,z) = C(theta) + (radiusB * cos(theta), radiusB * sin(theta), 0) * cos(phi) + (0, 0, radiusB) * sin(phi)\r\n * * The stored form of the torus pipe is oriented for positive volume:\r\n * * Both radii are positive, with radiusA >= radiusB > 0\r\n * * The sweep is positive\r\n * * The coordinate system has positive determinant.\r\n * * For uv parameterization,\r\n * * u is around the minor hoop, with (0..1) mapping to phi of (0 degrees ..360 degrees)\r\n * * v is along the major hoop with (0..1) mapping to theta of (0 .. sweep)\r\n * * a constant v section is a full circle\r\n * * a constant u section is an arc with sweep angle matching the torusPipe sweep angle.\r\n * @public\r\n */\r\nexport class TorusPipe extends SolidPrimitive implements UVSurface, UVSurfaceIsoParametricDistance {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"torusPipe\";\r\n\r\n private _localToWorld: Transform;\r\n private _radiusA: number; // radius of (large) circle in xy plane\r\n private _radiusB: number; // radius of (small) circle in xz plane.\r\n private _sweep: Angle;\r\n private _isReversed: boolean;\r\n\r\n // constructor captures the pointers!\r\n protected constructor(map: Transform, radiusA: number, radiusB: number, sweep: Angle, capped: boolean) {\r\n super(capped);\r\n this._localToWorld = map;\r\n this._radiusA = radiusA;\r\n this._radiusB = radiusB;\r\n this._sweep = sweep;\r\n this._isReversed = false;\r\n }\r\n /** return a copy of the TorusPipe */\r\n public clone(): TorusPipe {\r\n const result = new TorusPipe(this._localToWorld.clone(), this._radiusA, this._radiusB, this._sweep.clone(), this.capped);\r\n result._isReversed = this._isReversed;\r\n return result;\r\n }\r\n /** Apply `transform` to the local coordinate system. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\r\n return true;\r\n }\r\n /** Clone this TorusPipe and transform the clone */\r\n public cloneTransformed(transform: Transform): TorusPipe | undefined {\r\n const result = this.clone();\r\n if (!result.tryTransformInPlace(transform))\r\n return undefined;\r\n return result;\r\n }\r\n /** Create a new `TorusPipe`\r\n * @param frame local to world transformation. For best results, the matrix part should be a pure rotation.\r\n * @param majorRadius major hoop radius\r\n * @param minorRadius minor hoop radius\r\n * @param sweep sweep angle for major circle, with positive sweep from x axis towards y axis.\r\n * @param capped true for circular caps\r\n */\r\n public static createInFrame(frame: Transform, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean): TorusPipe | undefined {\r\n // force near-zero radii to true zero\r\n majorRadius = Math.abs(Geometry.correctSmallMetricDistance(majorRadius));\r\n minorRadius = Math.abs(Geometry.correctSmallMetricDistance(minorRadius));\r\n if (majorRadius < minorRadius)\r\n return undefined;\r\n if (majorRadius === 0.0)\r\n return undefined;\r\n if (minorRadius === 0.0)\r\n return undefined;\r\n if (sweep.isAlmostZero)\r\n return undefined;\r\n\r\n // remove mirror and negative sweep\r\n let yScale = 1.0;\r\n let zScale = 1.0;\r\n let isReversed = false;\r\n if (frame.matrix.determinant() < 0.0)\r\n zScale *= -1.0;\r\n const sweep1 = sweep.clone();\r\n if (sweep.radians < 0.0) {\r\n sweep1.setRadians(-sweep.radians);\r\n zScale *= -1.0;\r\n yScale *= -1.0;\r\n isReversed = true;\r\n }\r\n const frame1 = frame.clone();\r\n frame1.matrix.scaleColumnsInPlace(1, yScale, zScale);\r\n\r\n const result = new TorusPipe(frame1, majorRadius, minorRadius, sweep1, capped);\r\n result._isReversed = isReversed;\r\n return result;\r\n }\r\n\r\n /** Create a TorusPipe from the typical parameters of the Dgn file */\r\n public static createDgnTorusPipe(center: Point3d, vectorX: Vector3d, vectorY: Vector3d, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean) {\r\n const vectorZ = vectorX.unitCrossProductWithDefault(vectorY, 0, 0, 1);\r\n const frame = Transform.createOriginAndMatrixColumns(center, vectorX, vectorY, vectorZ);\r\n return TorusPipe.createInFrame(frame, majorRadius, minorRadius, sweep, capped);\r\n }\r\n /** Create a TorusPipe from its primary arc and minor radius */\r\n public static createAlongArc(arc: Arc3d, minorRadius: number, capped: boolean) {\r\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, arc.sweep.startRadians))\r\n arc = arc.cloneInRotatedBasis(arc.sweep.startAngle);\r\n const sweepRadians = arc.sweep.sweepRadians;\r\n const data = arc.toScaledMatrix3d();\r\n const frame = Transform.createOriginAndMatrix(data.center, data.axes);\r\n return TorusPipe.createInFrame(frame, data.r0, minorRadius, Angle.createRadians(sweepRadians), capped);\r\n }\r\n\r\n /** Return a coordinate frame (right handed, unit axes)\r\n * * origin at center of major circle\r\n * * major circle in plane of first two columns\r\n * * last column perpendicular to first two\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._localToWorld.cloneRigid();\r\n }\r\n /** Return the center of the torus pipe (inside the donut hole) */\r\n public cloneCenter(): Point3d { return this._localToWorld.getOrigin(); }\r\n /** return unit vector along the x axis (in the major hoop plane) */\r\n public cloneVectorX(): Vector3d {\r\n const xAxis = this._localToWorld.matrix.columnX();\r\n return xAxis.normalizeWithDefault(1, 0, 0, xAxis);\r\n }\r\n /** return unit vector along the y axis (in the major hoop plane) */\r\n public cloneVectorY(): Vector3d {\r\n const yAxis = this._localToWorld.matrix.columnY();\r\n return yAxis.normalizeWithDefault(0, 1, 0, yAxis);\r\n }\r\n /** return unit vector along the z axis */\r\n public cloneVectorZ(): Vector3d {\r\n const zAxis = this._localToWorld.matrix.columnZ();\r\n return zAxis.normalizeWithDefault(0, 0, 1, zAxis);\r\n }\r\n /** get the major hoop radius (`radiusA`) in world coordinates */\r\n public getMajorRadius(): number { return this._radiusA * this._localToWorld.matrix.columnXMagnitude(); }\r\n /** get the minor hoop radius (`radiusB`) in world coordinates */\r\n public getMinorRadius(): number { return this._radiusB * this._localToWorld.matrix.columnZMagnitude(); }\r\n /** get the sweep angle along the major circle. */\r\n public getSweepAngle(): Angle { return this._sweep.clone(); }\r\n /** Ask if this TorusPipe is labeled as reversed */\r\n public getIsReversed(): boolean { return this._isReversed; }\r\n /** Return the sweep angle as a fraction of full 360 degrees (2PI radians) */\r\n public getThetaFraction(): number { return this._sweep.radians / (Math.PI * 2.0); }\r\n /** Return a (clone of) the TorusPipe's local to world transformation. */\r\n public cloneLocalToWorld(): Transform { return this._localToWorld.clone(); }\r\n /** ask if `other` is an instance of `TorusPipe` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof TorusPipe; }\r\n\r\n /** test if `this` and `other` have nearly equal geometry */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof TorusPipe) {\r\n if ((!this._sweep.isFullCircle) && this.capped !== other.capped)\r\n return false;\r\n // Compare getter output so that we can equate TorusPipes created/transformed in equivalent ways.\r\n // In particular, the column vectors contribute their scale to the radii, so we ignore their length.\r\n if (!this.cloneCenter().isAlmostEqual(other.cloneCenter()))\r\n return false;\r\n if (!this.cloneVectorX().isAlmostEqual(other.cloneVectorX()))\r\n return false;\r\n if (!this.cloneVectorY().isAlmostEqual(other.cloneVectorY()))\r\n return false;\r\n if (!this.cloneVectorZ().isAlmostEqual(other.cloneVectorZ()))\r\n return false;\r\n if (!Geometry.isSameCoordinate(this.getMinorRadius(), other.getMinorRadius()))\r\n return false;\r\n if (!Geometry.isSameCoordinate(this.getMajorRadius(), other.getMajorRadius()))\r\n return false;\r\n if (!this.getSweepAngle().isAlmostEqualNoPeriodShift(other.getSweepAngle()))\r\n return false;\r\n // ignore _isReversed; it doesn't affect geometry\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Return the angle (in radians) for given fractional position around the major hoop.\r\n */\r\n public vFractionToRadians(v: number): number { return this._sweep.radians * v; }\r\n /** Second step of double dispatch: call `handler.handleTorusPipe(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleTorusPipe(this);\r\n }\r\n\r\n /**\r\n * Return the Arc3d section at vFraction. For the TorusPipe, this is a minor circle.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(v: number): CurveCollection | undefined {\r\n const thetaRadians = this.vFractionToRadians(v);\r\n const c0 = Math.cos(thetaRadians);\r\n const s0 = Math.sin(thetaRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const center = this._localToWorld.multiplyXYZ(majorRadius * c0, majorRadius * s0, 0);\r\n const vector0 = this._localToWorld.multiplyVectorXYZ(minorRadius * c0, minorRadius * s0, 0);\r\n const vector90 = this._localToWorld.multiplyVectorXYZ(0, 0, minorRadius);\r\n return Loop.create(Arc3d.create(center, vector0, vector90));\r\n }\r\n /** Return an arc at constant u, and arc sweep matching this TorusPipe sweep. */\r\n public constantUSection(uFraction: number): CurveCollection | undefined {\r\n const theta1Radians = this._sweep.radians;\r\n const phiRadians = uFraction * 2 * Math.PI;\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const transform = this._localToWorld;\r\n const axes = transform.matrix;\r\n const center = this._localToWorld.multiplyXYZ(0, 0, minorRadius * Math.sin(phiRadians));\r\n const rxy = majorRadius + minorRadius * Math.cos(phiRadians);\r\n const vector0 = axes.multiplyXYZ(rxy, 0, 0);\r\n const vector90 = axes.multiplyXYZ(0, rxy, 0);\r\n return Path.create(Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, theta1Radians)));\r\n }\r\n /** extend `rangeToExtend` to include this `TorusPipe` */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const theta1Radians = this._sweep.radians;\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const transform0 = this._localToWorld;\r\n const numThetaSample = Math.ceil(theta1Radians / (Math.PI / 16.0));\r\n const numHalfPhiSample = 16;\r\n let phi0 = 0;\r\n let dPhi = 0;\r\n let numPhiSample = 0;\r\n let theta = 0;\r\n let cosTheta = 0;\r\n let sinTheta = 0;\r\n let rxy = 0;\r\n let phi = 0;\r\n let j = 0;\r\n const dTheta = theta1Radians / numThetaSample;\r\n for (let i = 0; i <= numThetaSample; i++) {\r\n theta = i * dTheta;\r\n cosTheta = Math.cos(theta);\r\n sinTheta = Math.sin(theta);\r\n // At the ends, do the entire phi circle.\r\n // Otherwise only do the outer half\r\n if (i === 0 || i === numThetaSample) {\r\n phi0 = -Math.PI;\r\n dPhi = 2.0 * Math.PI / numHalfPhiSample;\r\n numPhiSample = numHalfPhiSample;\r\n } else {\r\n phi0 = -0.5 * Math.PI;\r\n dPhi = Math.PI / numHalfPhiSample;\r\n numPhiSample = 2 * numHalfPhiSample - 1;\r\n }\r\n if (transform) {\r\n for (j = 0; j <= numPhiSample; j++) {\r\n phi = phi0 + j * dPhi;\r\n rxy = majorRadius + minorRadius * Math.cos(phi);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, transform0,\r\n cosTheta * rxy, sinTheta * rxy,\r\n Math.sin(phi) * minorRadius);\r\n }\r\n } else {\r\n for (j = 0; j <= numPhiSample; j++) {\r\n phi = phi0 + j * dPhi;\r\n rxy = majorRadius + minorRadius * Math.cos(phi);\r\n rangeToExtend.extendTransformedXYZ(transform0,\r\n cosTheta * rxy, sinTheta * rxy,\r\n Math.sin(phi) * minorRadius);\r\n }\r\n }\r\n }\r\n }\r\n /** Evaluate as a uv surface\r\n * @param u fractional position in minor (phi)\r\n * @param v fractional position on major (theta) arc\r\n */\r\n public uvFractionToPoint(u: number, v: number, result?: Point3d): Point3d {\r\n const thetaRadians = v * this._sweep.radians;\r\n const phiRadians = u * Math.PI * 2.0;\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const rxy = majorRadius + Math.cos(phiRadians) * minorRadius;\r\n return this._localToWorld.multiplyXYZ(rxy * cosTheta, rxy * sinTheta, minorRadius * Math.sin(phiRadians), result);\r\n }\r\n /** Evaluate as a uv surface, returning point and two vectors.\r\n * @param u fractional position in minor (phi)\r\n * @param v fractional position on major (theta) arc\r\n */\r\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const thetaRadians = v * this._sweep.radians;\r\n const phiRadians = u * Math.PI * 2.0;\r\n const fTheta = this._sweep.radians;\r\n const fPhi = Math.PI * 2.0;\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const rxy = majorRadius + Math.cos(phiRadians) * minorRadius;\r\n const rSinPhi = minorRadius * sinPhi;\r\n const rCosPhi = minorRadius * cosPhi; // appears only as derivative of rSinPhi.\r\n return Plane3dByOriginAndVectors.createOriginAndVectors(\r\n this._localToWorld.multiplyXYZ(cosTheta * rxy, sinTheta * rxy, rSinPhi),\r\n this._localToWorld.multiplyVectorXYZ(-cosTheta * rSinPhi * fPhi, -sinTheta * rSinPhi * fPhi, rCosPhi * fPhi),\r\n this._localToWorld.multiplyVectorXYZ(-rxy * sinTheta * fTheta, rxy * cosTheta * fTheta, 0),\r\n result);\r\n }\r\n /**\r\n * Directional distance query\r\n * * u direction is around the (full) minor hoop\r\n * * v direction is around the outer radius, sum of (absolute values of) major and minor radii.\r\n */\r\n public maxIsoParametricDistance(): Vector2d {\r\n const a = Math.abs(this.getMajorRadius());\r\n const b = Math.abs(this.getMinorRadius());\r\n return Vector2d.create(b * Math.PI * 2.0, (a + b) * this._sweep.radians);\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped || this._sweep.isFullCircle;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"TorusPipe.js","sourceRoot":"","sources":["../../../src/solid/TorusPipe.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 Solid\r\n */\r\n\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { Loop } from \"../curve/Loop\";\r\nimport { Path } from \"../curve/Path\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\r\nimport { GeometryHandler, UVSurface, UVSurfaceIsoParametricDistance } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Vector2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { SolidPrimitive } from \"./SolidPrimitive\";\r\n\r\n/**\r\n * A torus pipe is a partial torus (donut).\r\n * * In its local coordinate system, the z-axis passes through the donut hole.\r\n * * The \"major hoop\" circular arc is defined for theta in the angular sweep. Its formula in local coordinates:\r\n * * `vectorTheta0 = (radiusA, 0, 0)`\r\n * * `vectorTheta90 = (0, radiusA, 0)`\r\n * * `M(theta) = vectorTheta0 * cos(theta) + vectorTheta90 * sin(theta)`\r\n * * The \"minor hoop\" circular arc is defined for phi in [0,2pi]. Its formula, centered at the origin:\r\n * * `vectorPhi0 = (radiusB * cos(theta), radiusB * sin(theta), 0)`\r\n * * `vectorPhi90 = (0, 0, radiusB)`\r\n * * `m(phi) = vectorPhi0 * cos(phi) + vectorPhi90 * sin(phi)`\r\n * * Thus the torus pipe in local coordinates has the formula:\r\n * * `T(theta, phi) = M(theta) + m(phi)`\r\n * * The stored form of the torus pipe is oriented for positive volume:\r\n * * Both radii are positive, with radiusA >= radiusB > 0\r\n * * The sweep is positive\r\n * * The coordinate system has positive determinant.\r\n * * For uv parameterization,\r\n * * u is around the minor hoop, with u in [0,1] mapping to phi in [0, 2pi]\r\n * * v is along the major hoop, with v in [0,1] mapping to theta in the angular sweep\r\n * * a constant v section is a full circle\r\n * * a constant u section is an arc with the same angular sweep as the torusPipe\r\n * @public\r\n */\r\nexport class TorusPipe extends SolidPrimitive implements UVSurface, UVSurfaceIsoParametricDistance {\r\n /** String name for schema properties */\r\n public readonly solidPrimitiveType = \"torusPipe\";\r\n\r\n private _localToWorld: Transform; // nominally rigid, but x,z column scales contribute to radiusA,radiusB\r\n private _radiusA: number; // radius of (large) circle in xy plane\r\n private _radiusB: number; // radius of (small) circle in xz plane.\r\n private _sweep: Angle;\r\n private _isReversed: boolean;\r\n\r\n // constructor captures the pointers!\r\n protected constructor(map: Transform, radiusA: number, radiusB: number, sweep: Angle, capped: boolean) {\r\n super(capped);\r\n this._localToWorld = map;\r\n this._radiusA = radiusA;\r\n this._radiusB = radiusB;\r\n this._sweep = sweep;\r\n this._isReversed = false;\r\n }\r\n /** return a copy of the TorusPipe */\r\n public clone(): TorusPipe {\r\n const result = new TorusPipe(this._localToWorld.clone(), this._radiusA, this._radiusB, this._sweep.clone(), this.capped);\r\n result._isReversed = this._isReversed;\r\n return result;\r\n }\r\n /** Apply `transform` to the local coordinate system. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n if (transform.matrix.isSingular())\r\n return false;\r\n transform.multiplyTransformTransform(this._localToWorld, this._localToWorld);\r\n return true;\r\n }\r\n /** Clone this TorusPipe and transform the clone */\r\n public cloneTransformed(transform: Transform): TorusPipe | undefined {\r\n const result = this.clone();\r\n if (!result.tryTransformInPlace(transform))\r\n return undefined;\r\n return result;\r\n }\r\n /** Create a new `TorusPipe`\r\n * @param frame local to world transformation. For best results, the matrix part should be a pure rotation.\r\n * @param majorRadius major hoop radius\r\n * @param minorRadius minor hoop radius\r\n * @param sweep sweep angle for major circle, with positive sweep from x axis towards y axis.\r\n * @param capped true for circular caps\r\n */\r\n public static createInFrame(frame: Transform, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean): TorusPipe | undefined {\r\n // force near-zero radii to true zero\r\n majorRadius = Math.abs(Geometry.correctSmallMetricDistance(majorRadius));\r\n minorRadius = Math.abs(Geometry.correctSmallMetricDistance(minorRadius));\r\n if (majorRadius < minorRadius)\r\n return undefined;\r\n if (majorRadius === 0.0)\r\n return undefined;\r\n if (minorRadius === 0.0)\r\n return undefined;\r\n if (sweep.isAlmostZero)\r\n return undefined;\r\n\r\n // remove mirror and negative sweep\r\n let yScale = 1.0;\r\n let zScale = 1.0;\r\n let isReversed = false;\r\n if (frame.matrix.determinant() < 0.0)\r\n zScale *= -1.0;\r\n const sweep1 = sweep.clone();\r\n if (sweep.radians < 0.0) {\r\n sweep1.setRadians(-sweep.radians);\r\n zScale *= -1.0;\r\n yScale *= -1.0;\r\n isReversed = true;\r\n }\r\n const frame1 = frame.clone();\r\n frame1.matrix.scaleColumnsInPlace(1, yScale, zScale);\r\n\r\n const result = new TorusPipe(frame1, majorRadius, minorRadius, sweep1, capped);\r\n result._isReversed = isReversed;\r\n return result;\r\n }\r\n\r\n /** Create a TorusPipe from the typical parameters of the Dgn file */\r\n public static createDgnTorusPipe(center: Point3d, vectorX: Vector3d, vectorY: Vector3d, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean) {\r\n const vectorZ = vectorX.unitCrossProductWithDefault(vectorY, 0, 0, 1);\r\n const frame = Transform.createOriginAndMatrixColumns(center, vectorX, vectorY, vectorZ);\r\n return TorusPipe.createInFrame(frame, majorRadius, minorRadius, sweep, capped);\r\n }\r\n /**\r\n * Create a TorusPipe from major arc and minor radius.\r\n * For best results, `arc` should be circular; otherwise, circularity is coerced.\r\n */\r\n public static createAlongArc(arc: Arc3d, minorRadius: number, capped: boolean): TorusPipe | undefined {\r\n if (!Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, arc.sweep.startRadians))\r\n arc = arc.cloneInRotatedBasis(arc.sweep.startAngle);\r\n if (!arc.isCircular) { // ensure circularity by squaring the axes and equating their lengths\r\n const perpVector90 = arc.perpendicularVector.sizedCrossProduct(arc.vector0, arc.matrixRef.columnXMagnitude());\r\n if (!perpVector90)\r\n return undefined;\r\n arc = Arc3d.create(arc.center, arc.vector0, perpVector90, arc.sweep);\r\n }\r\n const data = arc.toScaledMatrix3d();\r\n const rigidFrame = Transform.createOriginAndMatrix(arc.center, data.axes);\r\n return TorusPipe.createInFrame(rigidFrame, data.r0, minorRadius, Angle.createRadians(arc.sweep.sweepRadians), capped);\r\n }\r\n\r\n /** Return a coordinate frame (right handed, unit axes)\r\n * * origin at center of major circle\r\n * * major circle in plane of first two columns\r\n * * last column perpendicular to first two\r\n */\r\n public getConstructiveFrame(): Transform | undefined {\r\n return this._localToWorld.cloneRigid();\r\n }\r\n /** Return the center of the torus pipe (inside the donut hole) */\r\n public cloneCenter(): Point3d { return this._localToWorld.getOrigin(); }\r\n /** return unit vector along the x axis (in the major hoop plane) */\r\n public cloneVectorX(): Vector3d {\r\n const xAxis = this._localToWorld.matrix.columnX();\r\n return xAxis.normalizeWithDefault(1, 0, 0, xAxis);\r\n }\r\n /** return unit vector along the y axis (in the major hoop plane) */\r\n public cloneVectorY(): Vector3d {\r\n const yAxis = this._localToWorld.matrix.columnY();\r\n return yAxis.normalizeWithDefault(0, 1, 0, yAxis);\r\n }\r\n /** return unit vector along the z axis */\r\n public cloneVectorZ(): Vector3d {\r\n const zAxis = this._localToWorld.matrix.columnZ();\r\n return zAxis.normalizeWithDefault(0, 0, 1, zAxis);\r\n }\r\n /** get the major hoop radius (`radiusA`) in world coordinates */\r\n public getMajorRadius(): number { return this._radiusA * this._localToWorld.matrix.columnXMagnitude(); }\r\n /** get the minor hoop radius (`radiusB`) in world coordinates */\r\n public getMinorRadius(): number { return this._radiusB * this._localToWorld.matrix.columnZMagnitude(); }\r\n /** get the sweep angle along the major circle. */\r\n public getSweepAngle(): Angle { return this._sweep.clone(); }\r\n /** Ask if this TorusPipe is labeled as reversed */\r\n public getIsReversed(): boolean { return this._isReversed; }\r\n /** Return the sweep angle as a fraction of full 360 degrees (2PI radians) */\r\n public getThetaFraction(): number { return this._sweep.radians / (Math.PI * 2.0); }\r\n /** Return a (clone of) the TorusPipe's local to world transformation. */\r\n public cloneLocalToWorld(): Transform { return this._localToWorld.clone(); }\r\n /** ask if `other` is an instance of `TorusPipe` */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof TorusPipe; }\r\n\r\n /** test if `this` and `other` have nearly equal geometry */\r\n public override isAlmostEqual(other: GeometryQuery): boolean {\r\n if (other instanceof TorusPipe) {\r\n if ((!this._sweep.isFullCircle) && this.capped !== other.capped)\r\n return false;\r\n // Compare getter output so that we can equate TorusPipes created/transformed in equivalent ways.\r\n // In particular, the column vectors contribute their scale to the radii, so we ignore their length.\r\n if (!this.cloneCenter().isAlmostEqual(other.cloneCenter()))\r\n return false;\r\n if (!this.cloneVectorX().isAlmostEqual(other.cloneVectorX()))\r\n return false;\r\n if (!this.cloneVectorY().isAlmostEqual(other.cloneVectorY()))\r\n return false;\r\n if (!this.cloneVectorZ().isAlmostEqual(other.cloneVectorZ()))\r\n return false;\r\n if (!Geometry.isSameCoordinate(this.getMinorRadius(), other.getMinorRadius()))\r\n return false;\r\n if (!Geometry.isSameCoordinate(this.getMajorRadius(), other.getMajorRadius()))\r\n return false;\r\n if (!this.getSweepAngle().isAlmostEqualNoPeriodShift(other.getSweepAngle()))\r\n return false;\r\n // ignore _isReversed; it doesn't affect geometry\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Return the angle (in radians) for given fractional position around the major hoop.\r\n */\r\n public vFractionToRadians(v: number): number { return this._sweep.radians * v; }\r\n /** Second step of double dispatch: call `handler.handleTorusPipe(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleTorusPipe(this);\r\n }\r\n\r\n /**\r\n * Return the Arc3d section at vFraction. For the TorusPipe, this is a minor circle.\r\n * @param vFraction fractional position along the sweep direction\r\n */\r\n public constantVSection(v: number): CurveCollection | undefined {\r\n const thetaRadians = this.vFractionToRadians(v);\r\n const c0 = Math.cos(thetaRadians);\r\n const s0 = Math.sin(thetaRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const center = this._localToWorld.multiplyXYZ(majorRadius * c0, majorRadius * s0, 0);\r\n const vector0 = this._localToWorld.multiplyVectorXYZ(minorRadius * c0, minorRadius * s0, 0);\r\n const vector90 = this._localToWorld.multiplyVectorXYZ(0, 0, minorRadius);\r\n return Loop.create(Arc3d.create(center, vector0, vector90));\r\n }\r\n /** Return an arc at constant u, and arc sweep matching this TorusPipe sweep. */\r\n public constantUSection(uFraction: number): CurveCollection | undefined {\r\n const theta1Radians = this._sweep.radians;\r\n const phiRadians = uFraction * 2 * Math.PI;\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const transform = this._localToWorld;\r\n const axes = transform.matrix;\r\n const center = this._localToWorld.multiplyXYZ(0, 0, minorRadius * Math.sin(phiRadians));\r\n const rxy = majorRadius + minorRadius * Math.cos(phiRadians);\r\n const vector0 = axes.multiplyXYZ(rxy, 0, 0);\r\n const vector90 = axes.multiplyXYZ(0, rxy, 0);\r\n return Path.create(Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0.0, theta1Radians)));\r\n }\r\n /** extend `rangeToExtend` to include this `TorusPipe` */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const theta1Radians = this._sweep.radians;\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const transform0 = this._localToWorld;\r\n const numThetaSample = Math.ceil(theta1Radians / (Math.PI / 16.0));\r\n const numHalfPhiSample = 16;\r\n let phi0 = 0;\r\n let dPhi = 0;\r\n let numPhiSample = 0;\r\n let theta = 0;\r\n let cosTheta = 0;\r\n let sinTheta = 0;\r\n let rxy = 0;\r\n let phi = 0;\r\n let j = 0;\r\n const dTheta = theta1Radians / numThetaSample;\r\n for (let i = 0; i <= numThetaSample; i++) {\r\n theta = i * dTheta;\r\n cosTheta = Math.cos(theta);\r\n sinTheta = Math.sin(theta);\r\n // At the ends, do the entire phi circle.\r\n // Otherwise only do the outer half\r\n if (i === 0 || i === numThetaSample) {\r\n phi0 = -Math.PI;\r\n dPhi = 2.0 * Math.PI / numHalfPhiSample;\r\n numPhiSample = numHalfPhiSample;\r\n } else {\r\n phi0 = -0.5 * Math.PI;\r\n dPhi = Math.PI / numHalfPhiSample;\r\n numPhiSample = 2 * numHalfPhiSample - 1;\r\n }\r\n if (transform) {\r\n for (j = 0; j <= numPhiSample; j++) {\r\n phi = phi0 + j * dPhi;\r\n rxy = majorRadius + minorRadius * Math.cos(phi);\r\n rangeToExtend.extendTransformTransformedXYZ(transform, transform0,\r\n cosTheta * rxy, sinTheta * rxy,\r\n Math.sin(phi) * minorRadius);\r\n }\r\n } else {\r\n for (j = 0; j <= numPhiSample; j++) {\r\n phi = phi0 + j * dPhi;\r\n rxy = majorRadius + minorRadius * Math.cos(phi);\r\n rangeToExtend.extendTransformedXYZ(transform0,\r\n cosTheta * rxy, sinTheta * rxy,\r\n Math.sin(phi) * minorRadius);\r\n }\r\n }\r\n }\r\n }\r\n /** Evaluate as a uv surface\r\n * @param u fractional position in minor (phi)\r\n * @param v fractional position on major (theta) arc\r\n */\r\n public uvFractionToPoint(u: number, v: number, result?: Point3d): Point3d {\r\n const thetaRadians = v * this._sweep.radians;\r\n const phiRadians = u * Math.PI * 2.0;\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const rxy = majorRadius + Math.cos(phiRadians) * minorRadius;\r\n return this._localToWorld.multiplyXYZ(rxy * cosTheta, rxy * sinTheta, minorRadius * Math.sin(phiRadians), result);\r\n }\r\n /** Evaluate as a uv surface, returning point and two vectors.\r\n * @param u fractional position in minor (phi)\r\n * @param v fractional position on major (theta) arc\r\n */\r\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const thetaRadians = v * this._sweep.radians;\r\n const phiRadians = u * Math.PI * 2.0;\r\n const fTheta = this._sweep.radians;\r\n const fPhi = Math.PI * 2.0;\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const majorRadius = this._radiusA;\r\n const minorRadius = this._radiusB;\r\n const rxy = majorRadius + Math.cos(phiRadians) * minorRadius;\r\n const rSinPhi = minorRadius * sinPhi;\r\n const rCosPhi = minorRadius * cosPhi; // appears only as derivative of rSinPhi.\r\n return Plane3dByOriginAndVectors.createOriginAndVectors(\r\n this._localToWorld.multiplyXYZ(cosTheta * rxy, sinTheta * rxy, rSinPhi),\r\n this._localToWorld.multiplyVectorXYZ(-cosTheta * rSinPhi * fPhi, -sinTheta * rSinPhi * fPhi, rCosPhi * fPhi),\r\n this._localToWorld.multiplyVectorXYZ(-rxy * sinTheta * fTheta, rxy * cosTheta * fTheta, 0),\r\n result);\r\n }\r\n /**\r\n * Directional distance query\r\n * * u direction is around the (full) minor hoop\r\n * * v direction is around the outer radius, sum of (absolute values of) major and minor radii.\r\n */\r\n public maxIsoParametricDistance(): Vector2d {\r\n const a = Math.abs(this.getMajorRadius());\r\n const b = Math.abs(this.getMinorRadius());\r\n return Vector2d.create(b * Math.PI * 2.0, (a + b) * this._sweep.radians);\r\n }\r\n /**\r\n * @return true if this is a closed volume.\r\n */\r\n public get isClosedVolume(): boolean {\r\n return this.capped || this._sweep.isFullCircle;\r\n }\r\n\r\n}\r\n"]}
@@ -198,28 +198,30 @@ export declare class Angle implements BeJSONFunctions {
198
198
  */
199
199
  static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean;
200
200
  /**
201
- * Return cosine, sine, and radians for the half angle of a "cosine,sine" pair.
202
- * * This function assumes the input arguments are related to an angle between -PI and PI
203
- * * This function returns an angle between -PI and PI
204
- * @param rCos2A cosine value (scaled by radius) for initial angle.
205
- * @param rSin2A sine value (scaled by radius) for final angle.
201
+ * Compute the angle A given r*cos(2A) and r*sin(2A) for some nonnegative scalar r.
202
+ * * This function assumes the input arguments are related to an angle between -PI and PI.
203
+ * * This function returns an angle between -PI and PI.
204
+ * @param rCos2A scaled cosine value of twice the angle A.
205
+ * @param rSin2A scaled sine value of twice the angle A.
206
+ * @return cos(A), sin(A) and A in radians
206
207
  */
207
208
  static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues;
208
209
  /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */
209
210
  static cleanupTrigValue(value: number, tolerance?: number): number;
210
211
  /**
211
- * Return the half angle cosine, sine, and radians for given dot products between vectors. The vectors define
212
- * an ellipse using x(t) = c + U cos(t) + V sin(t) so U and V are at angle t=0 degree and t=90 degree. The
213
- * half angle t0 is an angle such that x(t0) is one of the ellipse semi-axis.
214
- * * This construction arises e.g. in `Arc3d.toScaledMatrix3d`.
215
- * * Given ellipse x(t) = c + U cos(t) + V sin(t), find t0 such that radial vector W(t0) = x(t0) - c is
216
- * perpendicular to the ellipse.
212
+ * Return the half angle cosine, sine, and radians for the given vector dot products.
213
+ * * These values arise e.g. in the computation performed in `Arc3d.toScaledMatrix3d`.
214
+ * * Let vectors U and V define the ellipse x(t) = c + U cos(t) + V sin(t). We seek an angle t0
215
+ * such that the radial vector W(t0) := x(t0) - c is perpendicular to the ellipse.
217
216
  * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)
218
- * implies sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the three dot products on the RHS.
219
- * math details can be found at docs/learning/geometry/Angle.md
217
+ * implies tan(2t0) = sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the input dot products.
218
+ * Math details can be found at docs/learning/geometry/Angle.md
220
219
  * @param dotUU dot product of vectorU with itself
221
220
  * @param dotVV dot product of vectorV with itself
222
221
  * @param dotUV dot product of vectorU with vectorV
222
+ * @param favorZero whether to allow a tight tolerance for returning t0 = 0 (default true).
223
+ * When dotUV is near zero, U and V are nearly perpendicular, and the returned angle is near zero.
224
+ * @return the angle t0 and its cosine and sine.
223
225
  */
224
226
  static dotProductsToHalfAngleTrigValues(dotUU: number, dotVV: number, dotUV: number, favorZero?: boolean): TrigValues;
225
227
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Angle.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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"}
@@ -377,11 +377,12 @@ export class Angle {
377
377
  && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;
378
378
  }
379
379
  /**
380
- * Return cosine, sine, and radians for the half angle of a "cosine,sine" pair.
381
- * * This function assumes the input arguments are related to an angle between -PI and PI
382
- * * This function returns an angle between -PI and PI
383
- * @param rCos2A cosine value (scaled by radius) for initial angle.
384
- * @param rSin2A sine value (scaled by radius) for final angle.
380
+ * Compute the angle A given r*cos(2A) and r*sin(2A) for some nonnegative scalar r.
381
+ * * This function assumes the input arguments are related to an angle between -PI and PI.
382
+ * * This function returns an angle between -PI and PI.
383
+ * @param rCos2A scaled cosine value of twice the angle A.
384
+ * @param rSin2A scaled sine value of twice the angle A.
385
+ * @return cos(A), sin(A) and A in radians
385
386
  */
386
387
  static trigValuesToHalfAngleTrigValues(rCos2A, rSin2A) {
387
388
  const r = Geometry.hypotenuseXY(rCos2A, rSin2A);
@@ -391,41 +392,25 @@ export class Angle {
391
392
  else {
392
393
  /* If the caller really gave you sine and cosine values, r should be 1. However,
393
394
  * to allow scaled values -- e.g. the x and y components of any vector -- we normalize
394
- * right here. This adds an extra sqrt and 2 divides to the whole process, but improves
395
+ * right here. This adds an extra sqrt and two divisions, but improves
395
396
  * both the usefulness and robustness of the computation.
396
397
  */
397
398
  let cosA;
398
399
  let sinA = 0.0;
399
400
  const cos2A = rCos2A / r;
400
401
  const sin2A = rSin2A / r;
401
- // Original angle in NE and SE quadrants. Half angle in same quadrant
402
- if (cos2A >= 0.0) {
403
- /*
404
- * We know cos2A = (cosA)^2 - (sinA)^2 and 1 = (cosA)^2 + (sinA)^2
405
- * so 1 + cos2A = 2(cosA)^2 and therefore, cosA = sqrt((1+cos2A)/2)
406
- * cosine is positive in NE and SE quadrants so we use +sqrt
407
- */
408
- cosA = Math.sqrt(0.5 * (1.0 + cos2A));
409
- // We know sin2A = 2 sinA cosA so sinA = sin2A/(2*cosA)
410
- sinA = sin2A / (2.0 * cosA);
402
+ if (cos2A >= 0.0) { // 2A is in NE and SE quadrants, A in same quadrant
403
+ cosA = Math.sqrt(0.5 * (1.0 + cos2A)); // half angle formula. Use +root since cosA >= 0
404
+ sinA = sin2A / (2.0 * cosA); // double angle formula
411
405
  }
412
406
  else {
413
- // Original angle in NW quadrant. Half angle in NE quadrant
414
- if (sin2A > 0.0) {
415
- /*
416
- * We know cos2A = (cosA)^2 - (sinA)^2 and 1 = (cosA)^2 + (sinA)^2
417
- * so 1 - cos2A = 2(sinA)^2 and therefore, sinA = sqrt((1-cos2A)/2)
418
- * sine is positive in NE quadrant so we use +sqrt
419
- */
420
- sinA = Math.sqrt(0.5 * (1.0 - cos2A));
421
- // Original angle in SW quadrant. Half angle in SE quadrant
407
+ if (sin2A > 0.0) { // 2A in NW quadrant. A in NE quadrant
408
+ sinA = Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use +root since sinA > 0
422
409
  }
423
- else {
424
- // sine is negative in SE quadrant so we use -sqrt
425
- sinA = -Math.sqrt(0.5 * (1.0 - cos2A));
410
+ else { // 2A in SW quadrant. A in SE quadrant
411
+ sinA = -Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use -root since sinA <= 0
426
412
  }
427
- // We know sin2A = 2 sinA cosA so cosA = sin2A/(2*sinA)
428
- cosA = sin2A / (2.0 * sinA); // always positive
413
+ cosA = sin2A / (2.0 * sinA); // double angle formula
429
414
  }
430
415
  return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };
431
416
  }
@@ -444,18 +429,19 @@ export class Angle {
444
429
  return value;
445
430
  }
446
431
  /**
447
- * Return the half angle cosine, sine, and radians for given dot products between vectors. The vectors define
448
- * an ellipse using x(t) = c + U cos(t) + V sin(t) so U and V are at angle t=0 degree and t=90 degree. The
449
- * half angle t0 is an angle such that x(t0) is one of the ellipse semi-axis.
450
- * * This construction arises e.g. in `Arc3d.toScaledMatrix3d`.
451
- * * Given ellipse x(t) = c + U cos(t) + V sin(t), find t0 such that radial vector W(t0) = x(t0) - c is
452
- * perpendicular to the ellipse.
432
+ * Return the half angle cosine, sine, and radians for the given vector dot products.
433
+ * * These values arise e.g. in the computation performed in `Arc3d.toScaledMatrix3d`.
434
+ * * Let vectors U and V define the ellipse x(t) = c + U cos(t) + V sin(t). We seek an angle t0
435
+ * such that the radial vector W(t0) := x(t0) - c is perpendicular to the ellipse.
453
436
  * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)
454
- * implies sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the three dot products on the RHS.
455
- * math details can be found at docs/learning/geometry/Angle.md
437
+ * implies tan(2t0) = sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the input dot products.
438
+ * Math details can be found at docs/learning/geometry/Angle.md
456
439
  * @param dotUU dot product of vectorU with itself
457
440
  * @param dotVV dot product of vectorV with itself
458
441
  * @param dotUV dot product of vectorU with vectorV
442
+ * @param favorZero whether to allow a tight tolerance for returning t0 = 0 (default true).
443
+ * When dotUV is near zero, U and V are nearly perpendicular, and the returned angle is near zero.
444
+ * @return the angle t0 and its cosine and sine.
459
445
  */
460
446
  static dotProductsToHalfAngleTrigValues(dotUU, dotVV, dotUV, favorZero = true) {
461
447
  const cos2t0 = dotUU - dotVV;
@@ -1 +1 @@
1
- {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to\r\n * be clear about whether their angle is degrees or radians.\r\n * * After the Angle object is created, the callers should not know or care whether it is stored in\r\n * `degrees` or `radians` because both are available if requested by caller.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or\r\n * out are degrees or radians.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/12 (15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914946;\r\n /** maximal accuracy value of pi/4 (45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.853981633974483e-001;\r\n /** maximal accuracy value of pi/2 (90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.5707963267948966e+000;\r\n /** maximal accuracy value of pi (180 degrees), in radians */\r\n public static readonly piRadians = 3.141592653589793e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.283185307179586e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) {\r\n this._radians = radians;\r\n this._degrees = degrees;\r\n }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle {\r\n return new Angle(this._radians, this._degrees);\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> {\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number): Angle {\r\n return new Angle(Angle.degreesToRadians(degrees), degrees);\r\n }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Return a new `Angle` object with the default \"small\" angle measurement specified by [[Geometry.smallAngleRadians]].\r\n */\r\n public static createSmallAngle(): Angle {\r\n return new Angle(Geometry.smallAngleRadians);\r\n }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs (based on a fraction)\r\n * @param angle0 first angle in radians\r\n * @param fraction the interpolation fraction\r\n * @param angle1 second angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle): Angle {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number): Angle {\r\n return new Angle(this.radians * scale);\r\n }\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) {\r\n this._radians = radians;\r\n this._degrees = undefined;\r\n }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) {\r\n this._radians = Angle.degreesToRadians(degrees);\r\n this._degrees = degrees;\r\n }\r\n /** Create an angle for a full circle. */\r\n public static create360(): Angle {\r\n return new Angle(Math.PI * 2.0, 360.0);\r\n }\r\n /**\r\n * Create a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in\r\n * determining the (otherwise ambiguous) quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle {\r\n return new Angle(Math.atan2(numerator, denominator));\r\n }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) {\r\n this._radians = other._radians;\r\n this._degrees = other._degrees;\r\n }\r\n /**\r\n * Set an Angle from a JSON object\r\n * * A simple number is considered as degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps {\r\n return this.degrees;\r\n }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps {\r\n return { radians: this.radians };\r\n }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number {\r\n return this._radians;\r\n }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number {\r\n return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians);\r\n }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number): number {\r\n return degrees * Math.PI / 180;\r\n }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n /* the following if statements are for round-off reasons. The problem is that no IEEE number is\r\n * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have\r\n * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees\r\n * it will return exactly 90,180 etc.\r\n */\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /** Return the cosine of this Angle object's angle */\r\n public cos(): number {\r\n return Math.cos(this._radians);\r\n }\r\n /** Return the sine of this Angle object's angle */\r\n public sin(): number {\r\n return Math.sin(this._radians);\r\n }\r\n /** Return the tangent of this Angle object's angle */\r\n public tan(): number {\r\n return Math.tan(this._radians);\r\n }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger! */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a half circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is a full circle */\r\n public get isFullCircle(): boolean {\r\n return Angle.isFullCircleRadians(this._radians);\r\n }\r\n /** Test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean {\r\n return Angle.isHalfCircleRadians(this._radians);\r\n }\r\n /** Adjust a radians value so it is positive in 0..360 */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n const radians = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians;\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is in -180..180 */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in 0..2Pi */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return Math.PI * 2.0 - Angle.adjustRadians0To2Pi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in -PI..PI */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Return a (newly allocated) Angle object with value 0 radians */\r\n public static zero(): Angle {\r\n return new Angle(0);\r\n }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero(): boolean {\r\n return this.radians === 0;\r\n }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero(): boolean {\r\n return Math.abs(this.radians) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole(): boolean {\r\n return Angle.isHalfCircleRadians(this.radians * 2.0);\r\n }\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegrees0To360(degrees));\r\n }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees));\r\n }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= radianTol)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= radianTol)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= radianTol;\r\n }\r\n /**\r\n * Test if this angle has magnitude no greater than that of `other`.\r\n * @param other the other angle\r\n */\r\n public isMagnitudeLessThanOrEqual(other: Angle): boolean {\r\n return Math.abs(this.radians) <= Math.abs(other.radians);\r\n }\r\n\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Math.abs(radiansA - radiansB) < radianTol;\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqual(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return this.isAlmostEqualNoPeriodShift(other, radianTol);\r\n }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Return cosine, sine, and radians for the half angle of a \"cosine,sine\" pair.\r\n * * This function assumes the input arguments are related to an angle between -PI and PI\r\n * * This function returns an angle between -PI and PI\r\n * @param rCos2A cosine value (scaled by radius) for initial angle.\r\n * @param rSin2A sine value (scaled by radius) for final angle.\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 }; // angle = 0\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,\r\n * to allow scaled values -- e.g. the x and y components of any vector -- we normalize\r\n * right here. This adds an extra sqrt and 2 divides to the whole process, but improves\r\n * both the usefulness and robustness of the computation.\r\n */\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n // Original angle in NE and SE quadrants. Half angle in same quadrant\r\n if (cos2A >= 0.0) {\r\n /*\r\n * We know cos2A = (cosA)^2 - (sinA)^2 and 1 = (cosA)^2 + (sinA)^2\r\n * so 1 + cos2A = 2(cosA)^2 and therefore, cosA = sqrt((1+cos2A)/2)\r\n * cosine is positive in NE and SE quadrants so we use +sqrt\r\n */\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A));\r\n // We know sin2A = 2 sinA cosA so sinA = sin2A/(2*cosA)\r\n sinA = sin2A / (2.0 * cosA);\r\n } else {\r\n // Original angle in NW quadrant. Half angle in NE quadrant\r\n if (sin2A > 0.0) {\r\n /*\r\n * We know cos2A = (cosA)^2 - (sinA)^2 and 1 = (cosA)^2 + (sinA)^2\r\n * so 1 - cos2A = 2(sinA)^2 and therefore, sinA = sqrt((1-cos2A)/2)\r\n * sine is positive in NE quadrant so we use +sqrt\r\n */\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A));\r\n // Original angle in SW quadrant. Half angle in SE quadrant\r\n } else {\r\n // sine is negative in SE quadrant so we use -sqrt\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A));\r\n }\r\n // We know sin2A = 2 sinA cosA so cosA = sin2A/(2*sinA)\r\n cosA = sin2A / (2.0 * sinA); // always positive\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = Geometry.smallFloatingPoint): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for given dot products between vectors. The vectors define\r\n * an ellipse using x(t) = c + U cos(t) + V sin(t) so U and V are at angle t=0 degree and t=90 degree. The\r\n * half angle t0 is an angle such that x(t0) is one of the ellipse semi-axis.\r\n * * This construction arises e.g. in `Arc3d.toScaledMatrix3d`.\r\n * * Given ellipse x(t) = c + U cos(t) + V sin(t), find t0 such that radial vector W(t0) = x(t0) - c is\r\n * perpendicular to the ellipse.\r\n * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)\r\n * implies sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the three dot products on the RHS.\r\n * math details can be found at docs/learning/geometry/Angle.md\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static dotProductsToHalfAngleTrigValues(\r\n dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true,\r\n ): TrigValues {\r\n\r\n const cos2t0 = dotUU - dotVV;\r\n const sin2t0 = 2.0 * dotUV;\r\n if (favorZero && Math.abs(sin2t0) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(cos2t0, sin2t0);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components, and an up vector to resolve\r\n * angle to a full 2PI range.\r\n * * The returned angle is (-PI < radians <= PI) or (0 <= radians < 2 * PI)\r\n * * The angle is in the plane of the U and V vectors.\r\n * * The upVector determines a positive side of the plane but need not be strictly perpendicular to the plane.\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n * @param upVectorX x component of vector to positive side of plane.\r\n * @param upVectorY y component of vector to positive side of plane.\r\n * @param upVectorZ z component of vector to positive side of plane.\r\n * @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI). If false, return\r\n * signed (-PI < radians <= PI)\r\n */\r\n public static orientedRadiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number,\r\n vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n const wx = uy * vz - uz * vy;\r\n const wy = uz * vx - ux * vz;\r\n const wz = ux * vy - uy * vx;\r\n const upDotW = upVectorX * wx + upVectorY * wy + upVectorZ * wz;\r\n const crossMagnitude = Geometry.hypotenuseXYZ(wx, wy, wz);\r\n if (upDotW < 0.0) {\r\n if (adjustToPositive) {\r\n // The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as\r\n // addition to PI. This gives the smoothest numerical transition passing PI.\r\n return Math.PI + Math.atan2(crossMagnitude, -uDotV);\r\n } else {\r\n return -Math.atan2(crossMagnitude, uDotV);\r\n }\r\n } else {\r\n return Math.atan2(crossMagnitude, uDotV);\r\n }\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Angle.js","sourceRoot":"","sources":["../../../src/geometry3d/Angle.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { AngleProps, BeJSONFunctions, Geometry, TrigValues } from \"../Geometry\";\r\n\r\n/**\r\n * An `Angle` carries the numeric value of an angle, with methods to allow (require!) callers to\r\n * be clear about whether their angle is degrees or radians.\r\n * * After the Angle object is created, the callers should not know or care whether it is stored in\r\n * `degrees` or `radians` because both are available if requested by caller.\r\n * * The various access method are named so that callers can specify whether untyped numbers passed in or\r\n * out are degrees or radians.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/AngleSweep\r\n * @public\r\n */\r\nexport class Angle implements BeJSONFunctions {\r\n /** maximal accuracy value of pi/12 (15 degrees), in radians */\r\n public static readonly piOver12Radians = 0.26179938779914946;\r\n /** maximal accuracy value of pi/4 (45 degrees), in radians */\r\n public static readonly piOver4Radians = 7.853981633974483e-001;\r\n /** maximal accuracy value of pi/2 (90 degrees), in radians */\r\n public static readonly piOver2Radians = 1.5707963267948966e+000;\r\n /** maximal accuracy value of pi (180 degrees), in radians */\r\n public static readonly piRadians = 3.141592653589793e+000;\r\n /** maximal accuracy value of 2*pi (360 degrees), in radians */\r\n public static readonly pi2Radians = 6.283185307179586e+000;\r\n /** scale factor for converting radians to degrees */\r\n public static readonly degreesPerRadian = (45.0 / Angle.piOver4Radians);\r\n /** scale factor for converting degrees to radians */\r\n public static readonly radiansPerDegree = (Angle.piOver4Radians / 45.0);\r\n private _radians: number;\r\n private _degrees?: number;\r\n private constructor(radians = 0, degrees?: number) {\r\n this._radians = radians;\r\n this._degrees = degrees;\r\n }\r\n /** Return a new angle with the same content. */\r\n public clone(): Angle {\r\n return new Angle(this._radians, this._degrees);\r\n }\r\n /** Freeze this instance so it is read-only */\r\n public freeze(): Readonly<this> {\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Return a new Angle object for angle given in degrees.\r\n * @param degrees angle in degrees\r\n */\r\n public static createDegrees(degrees: number): Angle {\r\n return new Angle(Angle.degreesToRadians(degrees), degrees);\r\n }\r\n /**\r\n * Return a (new) Angle object for a value given in radians.\r\n * @param radians angle in radians\r\n */\r\n public static createRadians(radians: number): Angle {\r\n return new Angle(radians);\r\n }\r\n /**\r\n * Return a new `Angle` object with the default \"small\" angle measurement specified by [[Geometry.smallAngleRadians]].\r\n */\r\n public static createSmallAngle(): Angle {\r\n return new Angle(Geometry.smallAngleRadians);\r\n }\r\n /**\r\n * Return a (new) Angle object that is interpolated between two inputs (based on a fraction)\r\n * @param angle0 first angle in radians\r\n * @param fraction the interpolation fraction\r\n * @param angle1 second angle in radians\r\n */\r\n public static createInterpolate(angle0: Angle, fraction: number, angle1: Angle): Angle {\r\n return new Angle(Geometry.interpolate(angle0.radians, fraction, angle1.radians));\r\n }\r\n /**\r\n * Return a (new) Angle object, with angle scaled from existing angle.\r\n * @param scale scale factor to apply to angle.\r\n */\r\n public cloneScaled(scale: number): Angle {\r\n return new Angle(this.radians * scale);\r\n }\r\n /**\r\n * Set this angle to a value given in radians.\r\n * @param radians angle given in radians\r\n */\r\n public setRadians(radians: number) {\r\n this._radians = radians;\r\n this._degrees = undefined;\r\n }\r\n /**\r\n * Set this angle to a value given in degrees.\r\n * @param degrees angle given in degrees.\r\n */\r\n public setDegrees(degrees: number) {\r\n this._radians = Angle.degreesToRadians(degrees);\r\n this._degrees = degrees;\r\n }\r\n /** Create an angle for a full circle. */\r\n public static create360(): Angle {\r\n return new Angle(Math.PI * 2.0, 360.0);\r\n }\r\n /**\r\n * Create a (strongly typed) Angle whose tangent is `numerator/denominator`, using the signs of both in\r\n * determining the (otherwise ambiguous) quadrant.\r\n * @param numerator numerator for tangent\r\n * @param denominator denominator for tangent\r\n */\r\n public static createAtan2(numerator: number, denominator: number): Angle {\r\n return new Angle(Math.atan2(numerator, denominator));\r\n }\r\n /**\r\n * Copy all contents of `other` to this Angle.\r\n * @param other source data\r\n */\r\n public setFrom(other: Angle) {\r\n this._radians = other._radians;\r\n this._degrees = other._degrees;\r\n }\r\n /**\r\n * Set an Angle from a JSON object\r\n * * A simple number is considered as degrees.\r\n * * specified `json.degrees` or `json._degrees` is degree value.\r\n * * specified `son.radians` or `json._radians` is radians value.\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n */\r\n public setFromJSON(json?: AngleProps, defaultValRadians?: number) {\r\n this._radians = defaultValRadians ? defaultValRadians : 0;\r\n if (!json)\r\n return;\r\n if (typeof json === \"number\") {\r\n this.setDegrees(json);\r\n } else if (typeof (json as any).degrees === \"number\") {\r\n this.setDegrees((json as any).degrees);\r\n } else if (typeof (json as any)._degrees === \"number\") {\r\n this.setDegrees((json as any)._degrees);\r\n } else if (typeof (json as any).radians === \"number\") {\r\n this.setRadians((json as any).radians);\r\n } else if (typeof (json as any)._radians === \"number\") {\r\n this.setRadians((json as any)._radians);\r\n }\r\n }\r\n /**\r\n * Create an Angle from a JSON object\r\n * @param json object from JSON.parse. If a number, value is in *DEGREES*\r\n * @param defaultValRadians if json is undefined, default value in radians.\r\n * @return a new Angle\r\n */\r\n public static fromJSON(json?: AngleProps, defaultValRadians?: number): Angle {\r\n const val = new Angle();\r\n val.setFromJSON(json, defaultValRadians);\r\n return val;\r\n }\r\n /** Convert an Angle to a JSON object as a number in degrees */\r\n public toJSON(): AngleProps {\r\n return this.degrees;\r\n }\r\n /** Return a json object with radians keyword, e.g. `{ radians: 0.10}` */\r\n public toJSONRadians(): AngleProps {\r\n return { radians: this.radians };\r\n }\r\n /** Return the angle measured in radians. */\r\n public get radians(): number {\r\n return this._radians;\r\n }\r\n /** Return the angle measured in degrees. */\r\n public get degrees(): number {\r\n return this._degrees !== undefined ? this._degrees : Angle.radiansToDegrees(this._radians);\r\n }\r\n /**\r\n * Convert an angle in degrees to radians.\r\n * @param degrees angle in degrees\r\n */\r\n public static degreesToRadians(degrees: number): number {\r\n return degrees * Math.PI / 180;\r\n }\r\n /**\r\n * Convert an angle in radians to degrees.\r\n * @param degrees angle in radians\r\n */\r\n public static radiansToDegrees(radians: number): number {\r\n if (radians < 0)\r\n return -Angle.radiansToDegrees(-radians);\r\n // Now radians is positive ...\r\n const pi = Math.PI;\r\n const factor = 180.0 / pi;\r\n /* the following if statements are for round-off reasons. The problem is that no IEEE number is\r\n * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have\r\n * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees\r\n * it will return exactly 90,180 etc.\r\n */\r\n if (radians <= 0.25 * pi)\r\n return factor * radians;\r\n if (radians < 0.75 * pi)\r\n return 90.0 + 180 * ((radians - 0.5 * pi) / pi);\r\n if (radians <= 1.25 * pi)\r\n return 180.0 + 180 * ((radians - pi) / pi);\r\n if (radians <= 1.75 * pi)\r\n return 270.0 + 180 * ((radians - 1.5 * pi) / pi);\r\n // all larger radians reference from 360 degrees (2PI)\r\n return 360.0 + 180 * ((radians - 2.0 * pi) / pi);\r\n }\r\n /** Return the cosine of this Angle object's angle */\r\n public cos(): number {\r\n return Math.cos(this._radians);\r\n }\r\n /** Return the sine of this Angle object's angle */\r\n public sin(): number {\r\n return Math.sin(this._radians);\r\n }\r\n /** Return the tangent of this Angle object's angle */\r\n public tan(): number {\r\n return Math.tan(this._radians);\r\n }\r\n /** Test if a radians (absolute) value is nearly 2PI or larger! */\r\n public static isFullCircleRadians(radians: number): boolean {\r\n return Math.abs(radians) >= Geometry.fullCircleRadiansMinusSmallAngle;\r\n }\r\n /** Test if the radians value is a half circle */\r\n public static isHalfCircleRadians(radians: number): boolean {\r\n return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is a full circle */\r\n public get isFullCircle(): boolean {\r\n return Angle.isFullCircleRadians(this._radians);\r\n }\r\n /** Test if the angle is a half circle (in either direction) */\r\n public get isHalfCircle(): boolean {\r\n return Angle.isHalfCircleRadians(this._radians);\r\n }\r\n /** Adjust a radians value so it is positive in 0..360 */\r\n public static adjustDegrees0To360(degrees: number): number {\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n if (degrees < period)\r\n return degrees;\r\n const numPeriods = Math.floor(degrees / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n const radians = Angle.adjustDegrees0To360(-degrees);\r\n return 360.0 - radians;\r\n }\r\n // fall through for Nan (disaster) !!!\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is in -180..180 */\r\n public static adjustDegreesSigned180(degrees: number): number {\r\n if (Math.abs(degrees) <= 180.0)\r\n return degrees;\r\n if (degrees >= 0) {\r\n const period = 360.0;\r\n const numPeriods = 1 + Math.floor((degrees - 180.0) / period);\r\n return degrees - numPeriods * period;\r\n } else if (degrees < 0) {\r\n // negative angle ...\r\n return -Angle.adjustDegreesSigned180(-degrees);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in 0..2Pi */\r\n public static adjustRadians0To2Pi(radians: number): number {\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n if (radians < period)\r\n return radians;\r\n const numPeriods = Math.floor(radians / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return Math.PI * 2.0 - Angle.adjustRadians0To2Pi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Adjust a radians value so it is positive in -PI..PI */\r\n public static adjustRadiansMinusPiPlusPi(radians: number): number {\r\n if (Math.abs(radians) <= Math.PI)\r\n return radians;\r\n if (radians >= 0) {\r\n const period = Math.PI * 2.0;\r\n const numPeriods = 1 + Math.floor((radians - Math.PI) / period);\r\n return radians - numPeriods * period;\r\n } else if (radians < 0) {\r\n // negative angle ...\r\n return -Angle.adjustRadiansMinusPiPlusPi(-radians);\r\n }\r\n // fall through for NaN disaster.\r\n return 0;\r\n }\r\n /** Return a (newly allocated) Angle object with value 0 radians */\r\n public static zero(): Angle {\r\n return new Angle(0);\r\n }\r\n /** Test if the angle is exactly zero. */\r\n public get isExactZero(): boolean {\r\n return this.radians === 0;\r\n }\r\n /** Test if the angle is almost zero (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostZero(): boolean {\r\n return Math.abs(this.radians) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the angle is almost a north or south pole (within tolerance `Geometry.smallAngleRadians`) */\r\n public get isAlmostNorthOrSouthPole(): boolean {\r\n return Angle.isHalfCircleRadians(this.radians * 2.0);\r\n }\r\n /** Create an angle object with degrees adjusted into 0..360. */\r\n public static createDegreesAdjustPositive(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegrees0To360(degrees));\r\n }\r\n /** Create an angle object with degrees adjusted into -180..180. */\r\n public static createDegreesAdjustSigned180(degrees: number): Angle {\r\n return Angle.createDegrees(Angle.adjustDegreesSigned180(degrees));\r\n }\r\n /**\r\n * Test if two radians values are equivalent, allowing shift by full circle (i.e. by a multiple of `2*PI`)\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansAllowPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n const delta = Math.abs(radiansA - radiansB);\r\n if (delta <= radianTol)\r\n return true;\r\n const period = Math.PI * 2.0;\r\n if (Math.abs(delta - period) <= radianTol)\r\n return true;\r\n const numPeriod = Math.round(delta / period);\r\n const delta1 = delta - numPeriod * period;\r\n return Math.abs(delta1) <= radianTol;\r\n }\r\n /**\r\n * Test if this angle has magnitude no greater than that of `other`.\r\n * @param other the other angle\r\n */\r\n public isMagnitudeLessThanOrEqual(other: Angle): boolean {\r\n return Math.abs(this.radians) <= Math.abs(other.radians);\r\n }\r\n\r\n /**\r\n * Test if this angle and other are equivalent, allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualAllowPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansAllowPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two angle (in radians) almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param radiansA first radians value\r\n * @param radiansB second radians value\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public static isAlmostEqualRadiansNoPeriodShift(radiansA: number, radiansB: number,\r\n radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Math.abs(radiansA - radiansB) < radianTol;\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqualNoPeriodShift(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return Angle.isAlmostEqualRadiansNoPeriodShift(this._radians, other._radians, radianTol);\r\n }\r\n /**\r\n * Test if two this angle and other are almost equal, NOT allowing shift by full circle (i.e., multiples of `2 * PI`).\r\n * * This function is same as isAlmostEqualRadiansNoPeriodShift. Please use isAlmostEqualRadiansNoPeriodShift.\r\n * @param other the other angle\r\n * @param radianTol radian tolerance with default value of Geometry.smallAngleRadians\r\n */\r\n public isAlmostEqual(other: Angle, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n return this.isAlmostEqualNoPeriodShift(other, radianTol);\r\n }\r\n /**\r\n * Test if dot product values indicate non-zero length perpendicular vectors.\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n */\r\n public static isPerpendicularDotSet(dotUU: number, dotVV: number, dotUV: number): boolean {\r\n return dotUU > Geometry.smallMetricDistanceSquared\r\n && dotVV > Geometry.smallMetricDistanceSquared\r\n && dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;\r\n }\r\n /**\r\n * Compute the angle A given r*cos(2A) and r*sin(2A) for some nonnegative scalar r.\r\n * * This function assumes the input arguments are related to an angle between -PI and PI.\r\n * * This function returns an angle between -PI and PI.\r\n * @param rCos2A scaled cosine value of twice the angle A.\r\n * @param rSin2A scaled sine value of twice the angle A.\r\n * @return cos(A), sin(A) and A in radians\r\n */\r\n public static trigValuesToHalfAngleTrigValues(rCos2A: number, rSin2A: number): TrigValues {\r\n const r = Geometry.hypotenuseXY(rCos2A, rSin2A);\r\n if (r < Geometry.smallMetricDistance) {\r\n return { c: 1.0, s: 0.0, radians: 0.0 }; // angle = 0\r\n } else {\r\n /* If the caller really gave you sine and cosine values, r should be 1. However,\r\n * to allow scaled values -- e.g. the x and y components of any vector -- we normalize\r\n * right here. This adds an extra sqrt and two divisions, but improves\r\n * both the usefulness and robustness of the computation.\r\n */\r\n let cosA;\r\n let sinA = 0.0;\r\n const cos2A = rCos2A / r;\r\n const sin2A = rSin2A / r;\r\n if (cos2A >= 0.0) { // 2A is in NE and SE quadrants, A in same quadrant\r\n cosA = Math.sqrt(0.5 * (1.0 + cos2A)); // half angle formula. Use +root since cosA >= 0\r\n sinA = sin2A / (2.0 * cosA); // double angle formula\r\n } else {\r\n if (sin2A > 0.0) { // 2A in NW quadrant. A in NE quadrant\r\n sinA = Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use +root since sinA > 0\r\n } else { // 2A in SW quadrant. A in SE quadrant\r\n sinA = -Math.sqrt(0.5 * (1.0 - cos2A)); // half angle formula. Use -root since sinA <= 0\r\n }\r\n cosA = sin2A / (2.0 * sinA); // double angle formula\r\n }\r\n return { c: cosA, s: sinA, radians: Math.atan2(sinA, cosA) };\r\n }\r\n }\r\n /** If value is close to -1, -0.5, 0, 0.5, 1, adjust it to the exact value. */\r\n public static cleanupTrigValue(value: number, tolerance: number = Geometry.smallFloatingPoint): number {\r\n const absValue = Math.abs(value);\r\n if (absValue <= tolerance)\r\n return 0;\r\n let a = Math.abs(absValue - 0.5);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -0.5 : 0.5;\r\n a = Math.abs(absValue - 1.0);\r\n if (a <= tolerance)\r\n return value < 0.0 ? -1.0 : 1.0;\r\n return value;\r\n }\r\n /**\r\n * Return the half angle cosine, sine, and radians for the given vector dot products.\r\n * * These values arise e.g. in the computation performed in `Arc3d.toScaledMatrix3d`.\r\n * * Let vectors U and V define the ellipse x(t) = c + U cos(t) + V sin(t). We seek an angle t0\r\n * such that the radial vector W(t0) := x(t0) - c is perpendicular to the ellipse.\r\n * * Then 0 = W(t0).x'(t0) = (U cos(t0) + V sin(t0)).(V cos(t0) - U sin(t0)) = U.V cos(2t0) + 0.5 (V.V - U.U) sin(2t0)\r\n * implies tan(2t0) = sin(2t0) / cos(2t0) = 2 U.V / (U.U - V.V), i.e., t0 can be computed given the input dot products.\r\n * Math details can be found at docs/learning/geometry/Angle.md\r\n * @param dotUU dot product of vectorU with itself\r\n * @param dotVV dot product of vectorV with itself\r\n * @param dotUV dot product of vectorU with vectorV\r\n * @param favorZero whether to allow a tight tolerance for returning t0 = 0 (default true).\r\n * When dotUV is near zero, U and V are nearly perpendicular, and the returned angle is near zero.\r\n * @return the angle t0 and its cosine and sine.\r\n */\r\n public static dotProductsToHalfAngleTrigValues(\r\n dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true,\r\n ): TrigValues {\r\n const cos2t0 = dotUU - dotVV;\r\n const sin2t0 = 2.0 * dotUV;\r\n if (favorZero && Math.abs(sin2t0) < Geometry.smallAngleRadians * (Math.abs(dotUU) + Math.abs(dotVV)))\r\n return { c: 1.0, s: 0.0, radians: 0.0 };\r\n return Angle.trigValuesToHalfAngleTrigValues(cos2t0, sin2t0);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components\r\n * * The returned angle is between 0 and PI\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n */\r\n public static radiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);\r\n }\r\n /**\r\n * Returns the angle between two vectors, with the vectors given as xyz components, and an up vector to resolve\r\n * angle to a full 2PI range.\r\n * * The returned angle is (-PI < radians <= PI) or (0 <= radians < 2 * PI)\r\n * * The angle is in the plane of the U and V vectors.\r\n * * The upVector determines a positive side of the plane but need not be strictly perpendicular to the plane.\r\n * @param ux x component of vector u\r\n * @param uy y component of vector u\r\n * @param uz z component of vector u\r\n * @param vx x component of vector v\r\n * @param vy y component of vector v\r\n * @param vz z component of vector v\r\n * @param upVectorX x component of vector to positive side of plane.\r\n * @param upVectorY y component of vector to positive side of plane.\r\n * @param upVectorZ z component of vector to positive side of plane.\r\n * @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI). If false, return\r\n * signed (-PI < radians <= PI)\r\n */\r\n public static orientedRadiansBetweenVectorsXYZ(\r\n ux: number, uy: number, uz: number,\r\n vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false,\r\n ): number {\r\n const uDotV = ux * vx + uy * vy + uz * vz;\r\n const wx = uy * vz - uz * vy;\r\n const wy = uz * vx - ux * vz;\r\n const wz = ux * vy - uy * vx;\r\n const upDotW = upVectorX * wx + upVectorY * wy + upVectorZ * wz;\r\n const crossMagnitude = Geometry.hypotenuseXYZ(wx, wy, wz);\r\n if (upDotW < 0.0) {\r\n if (adjustToPositive) {\r\n // The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as\r\n // addition to PI. This gives the smoothest numerical transition passing PI.\r\n return Math.PI + Math.atan2(crossMagnitude, -uDotV);\r\n } else {\r\n return -Math.atan2(crossMagnitude, uDotV);\r\n }\r\n } else {\r\n return Math.atan2(crossMagnitude, uDotV);\r\n }\r\n }\r\n /**\r\n * Add a multiple of a full circle angle (360 degrees, 2PI) in place.\r\n * @param multiple multiplier factor\r\n */\r\n public addMultipleOf2PiInPlace(multiple: number) {\r\n if (this._degrees !== undefined) {\r\n this._degrees += multiple * 360.0;\r\n this._radians = Angle.degreesToRadians(this._degrees);\r\n } else {\r\n this._radians += multiple * Angle.pi2Radians;\r\n }\r\n }\r\n}\r\n"]}
@@ -13,23 +13,27 @@ import { Range3d } from "../geometry3d/Range";
13
13
  import { Transform } from "../geometry3d/Transform";
14
14
  import { SolidPrimitive } from "./SolidPrimitive";
15
15
  /**
16
- * A torus pipe is a partial torus (donut). In a local coordinate system
17
- * * The z axis passes through the hole.
18
- * * The "major hoop" arc has
19
- * * vectorTheta0 = (radiusA, 0, 0)
20
- * * vectorTheta90 = (0, radiusA, 0)
21
- * * The major arc point at angle theta is `C(theta) = vectorTheta0 * cos(theta) + vectorTheta90 * sin(theta)
22
- * * The minor hoop at theta various with phi "around the minor hoop"
23
- * * (x,y,z) = C(theta) + (radiusB * cos(theta), radiusB * sin(theta), 0) * cos(phi) + (0, 0, radiusB) * sin(phi)
16
+ * A torus pipe is a partial torus (donut).
17
+ * * In its local coordinate system, the z-axis passes through the donut hole.
18
+ * * The "major hoop" circular arc is defined for theta in the angular sweep. Its formula in local coordinates:
19
+ * * `vectorTheta0 = (radiusA, 0, 0)`
20
+ * * `vectorTheta90 = (0, radiusA, 0)`
21
+ * * `M(theta) = vectorTheta0 * cos(theta) + vectorTheta90 * sin(theta)`
22
+ * * The "minor hoop" circular arc is defined for phi in [0,2pi]. Its formula, centered at the origin:
23
+ * * `vectorPhi0 = (radiusB * cos(theta), radiusB * sin(theta), 0)`
24
+ * * `vectorPhi90 = (0, 0, radiusB)`
25
+ * * `m(phi) = vectorPhi0 * cos(phi) + vectorPhi90 * sin(phi)`
26
+ * * Thus the torus pipe in local coordinates has the formula:
27
+ * * `T(theta, phi) = M(theta) + m(phi)`
24
28
  * * The stored form of the torus pipe is oriented for positive volume:
25
29
  * * Both radii are positive, with radiusA >= radiusB > 0
26
30
  * * The sweep is positive
27
31
  * * The coordinate system has positive determinant.
28
32
  * * For uv parameterization,
29
- * * u is around the minor hoop, with (0..1) mapping to phi of (0 degrees ..360 degrees)
30
- * * v is along the major hoop with (0..1) mapping to theta of (0 .. sweep)
33
+ * * u is around the minor hoop, with u in [0,1] mapping to phi in [0, 2pi]
34
+ * * v is along the major hoop, with v in [0,1] mapping to theta in the angular sweep
31
35
  * * a constant v section is a full circle
32
- * * a constant u section is an arc with sweep angle matching the torusPipe sweep angle.
36
+ * * a constant u section is an arc with the same angular sweep as the torusPipe
33
37
  * @public
34
38
  */
35
39
  export declare class TorusPipe extends SolidPrimitive implements UVSurface, UVSurfaceIsoParametricDistance {
@@ -57,7 +61,10 @@ export declare class TorusPipe extends SolidPrimitive implements UVSurface, UVSu
57
61
  static createInFrame(frame: Transform, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean): TorusPipe | undefined;
58
62
  /** Create a TorusPipe from the typical parameters of the Dgn file */
59
63
  static createDgnTorusPipe(center: Point3d, vectorX: Vector3d, vectorY: Vector3d, majorRadius: number, minorRadius: number, sweep: Angle, capped: boolean): TorusPipe | undefined;
60
- /** Create a TorusPipe from its primary arc and minor radius */
64
+ /**
65
+ * Create a TorusPipe from major arc and minor radius.
66
+ * For best results, `arc` should be circular; otherwise, circularity is coerced.
67
+ */
61
68
  static createAlongArc(arc: Arc3d, minorRadius: number, capped: boolean): TorusPipe | undefined;
62
69
  /** Return a coordinate frame (right handed, unit axes)
63
70
  * * origin at center of major circle
@@ -1 +1 @@
1
- {"version":3,"file":"TorusPipe.d.ts","sourceRoot":"","sources":["../../../src/solid/TorusPipe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TorusPipe.d.ts","sourceRoot":"","sources":["../../../src/solid/TorusPipe.ts"],"names":[],"mappings":"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"}