@itwin/core-geometry 4.7.0-dev.9 → 4.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -1
- package/lib/cjs/geometry3d/Angle.d.ts +15 -13
- package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +24 -38
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +46 -13
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +78 -24
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +5 -0
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts +10 -4
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +16 -4
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.d.ts +19 -12
- package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
- package/lib/cjs/solid/TorusPipe.js +27 -15
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/esm/geometry3d/Angle.d.ts +15 -13
- package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
- package/lib/esm/geometry3d/Angle.js +24 -38
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +46 -13
- package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js +78 -24
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +5 -0
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts +10 -4
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +16 -4
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/solid/TorusPipe.d.ts +19 -12
- package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
- package/lib/esm/solid/TorusPipe.js +27 -15
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/package.json +3 -3
|
@@ -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).
|
|
17
|
-
* *
|
|
18
|
-
* * The "major hoop" arc
|
|
19
|
-
* * vectorTheta0 = (radiusA, 0, 0)
|
|
20
|
-
* * vectorTheta90 = (0, radiusA, 0)
|
|
21
|
-
* *
|
|
22
|
-
* * The minor hoop
|
|
23
|
-
*
|
|
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
|
|
30
|
-
* * v is along the major hoop with
|
|
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
|
|
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
|
-
/**
|
|
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":"AAKA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIvD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD
|
|
1
|
+
{"version":3,"file":"TorusPipe.d.ts","sourceRoot":"","sources":["../../../src/solid/TorusPipe.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,23 +19,27 @@ const Point2dVector2d_1 = require("../geometry3d/Point2dVector2d");
|
|
|
19
19
|
const Transform_1 = require("../geometry3d/Transform");
|
|
20
20
|
const SolidPrimitive_1 = require("./SolidPrimitive");
|
|
21
21
|
/**
|
|
22
|
-
* A torus pipe is a partial torus (donut).
|
|
23
|
-
* *
|
|
24
|
-
* * The "major hoop" arc
|
|
25
|
-
* * vectorTheta0 = (radiusA, 0, 0)
|
|
26
|
-
* * vectorTheta90 = (0, radiusA, 0)
|
|
27
|
-
* *
|
|
28
|
-
* * The minor hoop
|
|
29
|
-
*
|
|
22
|
+
* A torus pipe is a partial torus (donut).
|
|
23
|
+
* * In its local coordinate system, the z-axis passes through the donut hole.
|
|
24
|
+
* * The "major hoop" circular arc is defined for theta in the angular sweep. Its formula in local coordinates:
|
|
25
|
+
* * `vectorTheta0 = (radiusA, 0, 0)`
|
|
26
|
+
* * `vectorTheta90 = (0, radiusA, 0)`
|
|
27
|
+
* * `M(theta) = vectorTheta0 * cos(theta) + vectorTheta90 * sin(theta)`
|
|
28
|
+
* * The "minor hoop" circular arc is defined for phi in [0,2pi]. Its formula, centered at the origin:
|
|
29
|
+
* * `vectorPhi0 = (radiusB * cos(theta), radiusB * sin(theta), 0)`
|
|
30
|
+
* * `vectorPhi90 = (0, 0, radiusB)`
|
|
31
|
+
* * `m(phi) = vectorPhi0 * cos(phi) + vectorPhi90 * sin(phi)`
|
|
32
|
+
* * Thus the torus pipe in local coordinates has the formula:
|
|
33
|
+
* * `T(theta, phi) = M(theta) + m(phi)`
|
|
30
34
|
* * The stored form of the torus pipe is oriented for positive volume:
|
|
31
35
|
* * Both radii are positive, with radiusA >= radiusB > 0
|
|
32
36
|
* * The sweep is positive
|
|
33
37
|
* * The coordinate system has positive determinant.
|
|
34
38
|
* * For uv parameterization,
|
|
35
|
-
* * u is around the minor hoop, with
|
|
36
|
-
* * v is along the major hoop with
|
|
39
|
+
* * u is around the minor hoop, with u in [0,1] mapping to phi in [0, 2pi]
|
|
40
|
+
* * v is along the major hoop, with v in [0,1] mapping to theta in the angular sweep
|
|
37
41
|
* * a constant v section is a full circle
|
|
38
|
-
* * a constant u section is an arc with sweep
|
|
42
|
+
* * a constant u section is an arc with the same angular sweep as the torusPipe
|
|
39
43
|
* @public
|
|
40
44
|
*/
|
|
41
45
|
class TorusPipe extends SolidPrimitive_1.SolidPrimitive {
|
|
@@ -114,14 +118,22 @@ class TorusPipe extends SolidPrimitive_1.SolidPrimitive {
|
|
|
114
118
|
const frame = Transform_1.Transform.createOriginAndMatrixColumns(center, vectorX, vectorY, vectorZ);
|
|
115
119
|
return TorusPipe.createInFrame(frame, majorRadius, minorRadius, sweep, capped);
|
|
116
120
|
}
|
|
117
|
-
/**
|
|
121
|
+
/**
|
|
122
|
+
* Create a TorusPipe from major arc and minor radius.
|
|
123
|
+
* For best results, `arc` should be circular; otherwise, circularity is coerced.
|
|
124
|
+
*/
|
|
118
125
|
static createAlongArc(arc, minorRadius, capped) {
|
|
119
126
|
if (!Angle_1.Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, arc.sweep.startRadians))
|
|
120
127
|
arc = arc.cloneInRotatedBasis(arc.sweep.startAngle);
|
|
121
|
-
|
|
128
|
+
if (!arc.isCircular) { // ensure circularity by squaring the axes and equating their lengths
|
|
129
|
+
const perpVector90 = arc.perpendicularVector.sizedCrossProduct(arc.vector0, arc.matrixRef.columnXMagnitude());
|
|
130
|
+
if (!perpVector90)
|
|
131
|
+
return undefined;
|
|
132
|
+
arc = Arc3d_1.Arc3d.create(arc.center, arc.vector0, perpVector90, arc.sweep);
|
|
133
|
+
}
|
|
122
134
|
const data = arc.toScaledMatrix3d();
|
|
123
|
-
const
|
|
124
|
-
return TorusPipe.createInFrame(
|
|
135
|
+
const rigidFrame = Transform_1.Transform.createOriginAndMatrix(arc.center, data.axes);
|
|
136
|
+
return TorusPipe.createInFrame(rigidFrame, data.r0, minorRadius, Angle_1.Angle.createRadians(arc.sweep.sweepRadians), capped);
|
|
125
137
|
}
|
|
126
138
|
/** Return a coordinate frame (right handed, unit axes)
|
|
127
139
|
* * origin at center of major circle
|
|
@@ -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
|
-
*
|
|
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
|
|
205
|
-
* @param rSin2A sine value
|
|
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
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
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
|
|
219
|
-
*
|
|
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":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;;;;GASG;AACH,qBAAa,KAAM,YAAW,eAAe;IAC3C,+DAA+D;IAC/D,gBAAuB,eAAe,uBAAuB;IAC7D,8DAA8D;IAC9D,gBAAuB,cAAc,sBAA0B;IAC/D,8DAA8D;IAC9D,gBAAuB,cAAc,sBAA2B;IAChE,6DAA6D;IAC7D,gBAAuB,SAAS,qBAA0B;IAC1D,+DAA+D;IAC/D,gBAAuB,UAAU,qBAA0B;IAC3D,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,qDAAqD;IACrD,gBAAuB,gBAAgB,SAAiC;IACxE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO;IAIP,gDAAgD;IACzC,KAAK,IAAI,KAAK;IAGrB,8CAA8C;IACvC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAG/B;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGnD;;;OAGG;WACW,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGnD;;OAEG;WACW,gBAAgB,IAAI,KAAK;IAGvC;;;;;OAKG;WACW,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK;IAGtF;;;OAGG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAGxC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC,yCAAyC;WAC3B,SAAS,IAAI,KAAK;IAGhC;;;;;OAKG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK;IAGxE;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK;IAI3B;;;;;;;OAOG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM;IAgBhE;;;;;OAKG;WACW,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,KAAK;IAK5E,+DAA+D;IACxD,MAAM,IAAI,UAAU;IAG3B,yEAAyE;IAClE,aAAa,IAAI,UAAU;IAGlC,4CAA4C;IAC5C,IAAW,OAAO,IAAI,MAAM,CAE3B;IACD,4CAA4C;IAC5C,IAAW,OAAO,IAAI,MAAM,CAE3B;IACD;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAGvD;;;OAGG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAsBvD,qDAAqD;IAC9C,GAAG,IAAI,MAAM;IAGpB,mDAAmD;IAC5C,GAAG,IAAI,MAAM;IAGpB,sDAAsD;IAC/C,GAAG,IAAI,MAAM;IAGpB,kEAAkE;WACpD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,iDAAiD;WACnC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAG3D,yCAAyC;IACzC,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,+DAA+D;IAC/D,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAe1D,mDAAmD;WACrC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc7D,yDAAyD;WAC3C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc1D,0DAA0D;WAC5C,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAcjE,mEAAmE;WACrD,IAAI,IAAI,KAAK;IAG3B,yCAAyC;IACzC,IAAW,WAAW,IAAI,OAAO,CAEhC;IACD,uFAAuF;IACvF,IAAW,YAAY,IAAI,OAAO,CAEjC;IACD,wGAAwG;IACxG,IAAW,wBAAwB,IAAI,OAAO,CAE7C;IACD,gEAAgE;WAClD,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGjE,mEAAmE;WACrD,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAGlE;;;;;OAKG;WACW,oCAAoC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EACnF,SAAS,GAAE,MAAmC,GAAG,OAAO;IAW1D;;;KAGC;IACM,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIxD;;;;OAIG;IACI,6BAA6B,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG3G;;;;;OAKG;WACW,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAChF,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG1D;;;;OAIG;IACI,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAGxG;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAmC,GAAG,OAAO;IAG3F;;;;;OAKG;WACW,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKzF;;;;;;;OAOG;WACW,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IA4BzF,8EAA8E;WAChE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAoC,GAAG,MAAM;IAYtG;;;;;;;;;;;;;;OAcG;WACW,gCAAgC,CAC5C,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GACrE,UAAU;IAOb;;;;;;;;;OASG;WACW,wBAAwB,CACpC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GACrE,MAAM;IAIT;;;;;;;;;;;;;;;;;OAiBG;WACW,gCAAgC,CAC5C,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAClC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAClC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EACvD,gBAAgB,GAAE,OAAe,GAChC,MAAM;IAmBT;;;OAGG;IACI,uBAAuB,CAAC,QAAQ,EAAE,MAAM;CAQhD"}
|
|
@@ -377,11 +377,12 @@ export class Angle {
|
|
|
377
377
|
&& dotUV * dotUV <= Geometry.smallAngleRadiansSquared * dotUU * dotVV;
|
|
378
378
|
}
|
|
379
379
|
/**
|
|
380
|
-
*
|
|
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
|
|
384
|
-
* @param rSin2A sine value
|
|
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
|
|
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
|
-
//
|
|
402
|
-
|
|
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
|
-
//
|
|
414
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
448
|
-
*
|
|
449
|
-
*
|
|
450
|
-
*
|
|
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
|
|
455
|
-
*
|
|
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;
|