@itwin/core-geometry 4.0.0-dev.55 → 4.0.0-dev.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/Geometry.d.ts +5 -1
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +5 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.d.ts +29 -34
- package/lib/cjs/geometry3d/Angle.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Angle.js +31 -36
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +48 -43
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +48 -43
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +5 -8
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +5 -8
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts +3 -3
- package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js +3 -3
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts +8 -10
- package/lib/cjs/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js +8 -10
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +37 -34
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +38 -35
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +17 -21
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js +16 -20
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +84 -67
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +84 -67
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +76 -66
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +88 -77
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts +15 -16
- package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js +14 -15
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +72 -58
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +132 -108
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/Geometry.d.ts +5 -1
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +5 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/geometry3d/Angle.d.ts +29 -34
- package/lib/esm/geometry3d/Angle.d.ts.map +1 -1
- package/lib/esm/geometry3d/Angle.js +31 -36
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +48 -43
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +48 -43
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +5 -8
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +5 -8
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.d.ts +3 -3
- package/lib/esm/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js +3 -3
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts +8 -10
- package/lib/esm/geometry3d/Point2dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js +8 -10
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +37 -34
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +38 -35
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +17 -21
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js +16 -20
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +84 -67
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +84 -67
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +76 -66
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js +88 -77
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts +15 -16
- package/lib/esm/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js +14 -15
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +72 -58
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +132 -108
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/package.json +3 -3
|
@@ -125,11 +125,11 @@ class Angle {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
* Create an Angle from a JSON object
|
|
129
|
+
* @param json object from JSON.parse. If a number, value is in *DEGREES*
|
|
130
|
+
* @param defaultValRadians if json is undefined, default value in radians.
|
|
131
|
+
* @return a new Angle
|
|
132
|
+
*/
|
|
133
133
|
static fromJSON(json, defaultValRadians) {
|
|
134
134
|
const val = new Angle();
|
|
135
135
|
val.setFromJSON(json, defaultValRadians);
|
|
@@ -184,21 +184,15 @@ class Angle {
|
|
|
184
184
|
// all larger radians reference from 360 degrees (2PI)
|
|
185
185
|
return 360.0 + 180 * ((radians - 2.0 * pi) / pi);
|
|
186
186
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Return the cosine of this Angle object's angle.
|
|
189
|
-
*/
|
|
187
|
+
/** Return the cosine of this Angle object's angle */
|
|
190
188
|
cos() {
|
|
191
189
|
return Math.cos(this._radians);
|
|
192
190
|
}
|
|
193
|
-
/**
|
|
194
|
-
* Return the sine of this Angle object's angle.
|
|
195
|
-
*/
|
|
191
|
+
/** Return the sine of this Angle object's angle */
|
|
196
192
|
sin() {
|
|
197
193
|
return Math.sin(this._radians);
|
|
198
194
|
}
|
|
199
|
-
/**
|
|
200
|
-
* Return the tangent of this Angle object's angle.
|
|
201
|
-
*/
|
|
195
|
+
/** Return the tangent of this Angle object's angle */
|
|
202
196
|
tan() {
|
|
203
197
|
return Math.tan(this._radians);
|
|
204
198
|
}
|
|
@@ -210,11 +204,11 @@ class Angle {
|
|
|
210
204
|
static isHalfCircleRadians(radians) {
|
|
211
205
|
return Math.abs(Math.abs(radians) - Math.PI) <= Geometry.smallAngleRadians;
|
|
212
206
|
}
|
|
213
|
-
/**
|
|
207
|
+
/** Test if the angle is a full circle */
|
|
214
208
|
get isFullCircle() {
|
|
215
209
|
return Angle.isFullCircleRadians(this._radians);
|
|
216
210
|
}
|
|
217
|
-
/**
|
|
211
|
+
/** Test if the angle is a half circle (in either direction) */
|
|
218
212
|
get isHalfCircle() {
|
|
219
213
|
return Angle.isHalfCircleRadians(this._radians);
|
|
220
214
|
}
|
|
@@ -283,7 +277,7 @@ class Angle {
|
|
|
283
277
|
// fall through for NaN disaster.
|
|
284
278
|
return 0;
|
|
285
279
|
}
|
|
286
|
-
/**
|
|
280
|
+
/** Return a (newly allocated) Angle object with value 0 radians */
|
|
287
281
|
static zero() {
|
|
288
282
|
return new Angle(0);
|
|
289
283
|
}
|
|
@@ -437,19 +431,19 @@ class Angle {
|
|
|
437
431
|
return value;
|
|
438
432
|
}
|
|
439
433
|
/**
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
434
|
+
* Return the half angle cosine, sine, and radians for given dot products between vectors. The vectors define
|
|
435
|
+
* 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
|
|
436
|
+
* half angle t0 is an angle such that x(t0) is one of the ellipse semi-axis.
|
|
437
|
+
* * This construction arises e.g. in `Arc3d.toScaledMatrix3d`.
|
|
438
|
+
* * Given ellipse x(t) = c + U cos(t) + V sin(t), find t0 such that radial vector W(t0) = x(t0) - c is
|
|
439
|
+
* perpendicular to the ellipse.
|
|
440
|
+
* * 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)
|
|
441
|
+
* 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.
|
|
442
|
+
* math details can be found at docs/learning/geometry/Angle.md
|
|
443
|
+
* @param dotUU dot product of vectorU with itself
|
|
444
|
+
* @param dotVV dot product of vectorV with itself
|
|
445
|
+
* @param dotUV dot product of vectorU with vectorV
|
|
446
|
+
*/
|
|
453
447
|
static dotProductsToHalfAngleTrigValues(dotUU, dotVV, dotUV, favorZero = true) {
|
|
454
448
|
const cos2t0 = dotUU - dotVV;
|
|
455
449
|
const sin2t0 = 2.0 * dotUV;
|
|
@@ -458,9 +452,8 @@ class Angle {
|
|
|
458
452
|
return Angle.trigValuesToHalfAngleTrigValues(cos2t0, sin2t0);
|
|
459
453
|
}
|
|
460
454
|
/**
|
|
461
|
-
*
|
|
455
|
+
* Returns the angle between two vectors, with the vectors given as xyz components
|
|
462
456
|
* * The returned angle is between 0 and PI
|
|
463
|
-
*
|
|
464
457
|
* @param ux x component of vector u
|
|
465
458
|
* @param uy y component of vector u
|
|
466
459
|
* @param uz z component of vector u
|
|
@@ -473,7 +466,8 @@ class Angle {
|
|
|
473
466
|
return Math.atan2(Geometry.crossProductMagnitude(ux, uy, uz, vx, vy, vz), uDotV);
|
|
474
467
|
}
|
|
475
468
|
/**
|
|
476
|
-
*
|
|
469
|
+
* Returns the angle between two vectors, with the vectors given as xyz components, and an up vector to resolve
|
|
470
|
+
* angle to a full 2PI range.
|
|
477
471
|
* * The returned angle is (-PI < radians <= PI) or (0 <= radians < 2 * PI)
|
|
478
472
|
* * The angle is in the plane of the U and V vectors.
|
|
479
473
|
* * The upVector determines a positive side of the plane but need not be strictly perpendicular to the plane.
|
|
@@ -487,7 +481,8 @@ class Angle {
|
|
|
487
481
|
* @param upVectorX x component of vector to positive side of plane.
|
|
488
482
|
* @param upVectorY y component of vector to positive side of plane.
|
|
489
483
|
* @param upVectorZ z component of vector to positive side of plane.
|
|
490
|
-
* @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI).
|
|
484
|
+
* @param adjustToAllPositive if true, return strictly non-negative sweep (0 <= radians < 2*PI). If false, return
|
|
485
|
+
* signed (-PI < radians <= PI)
|
|
491
486
|
*/
|
|
492
487
|
static orientedRadiansBetweenVectorsXYZ(ux, uy, uz, vx, vy, vz, upVectorX, upVectorY, upVectorZ, adjustToPositive = false) {
|
|
493
488
|
const uDotV = ux * vx + uy * vy + uz * vz;
|
|
@@ -498,8 +493,8 @@ class Angle {
|
|
|
498
493
|
const crossMagnitude = Geometry.hypotenuseXYZ(wx, wy, wz);
|
|
499
494
|
if (upDotW < 0.0) {
|
|
500
495
|
if (adjustToPositive) {
|
|
501
|
-
// The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as
|
|
502
|
-
// This gives the smoothest numerical transition passing PI.
|
|
496
|
+
// The turn is greater than 180 degrees. Take a peculiarly oriented atan2 to get the excess-180 part as
|
|
497
|
+
// addition to PI. This gives the smoothest numerical transition passing PI.
|
|
503
498
|
return Math.PI + Math.atan2(crossMagnitude, -uDotV);
|
|
504
499
|
}
|
|
505
500
|
else {
|
|
@@ -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 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 /**\r\n * Return the cosine of this Angle object's angle.\r\n */\r\n public cos(): number {\r\n return Math.cos(this._radians);\r\n }\r\n /**\r\n * Return the sine of this Angle object's angle.\r\n */\r\n public sin(): number {\r\n return Math.sin(this._radians);\r\n }\r\n /**\r\n * Return the tangent of this Angle object's angle.\r\n */\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 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 = 1.0e-15): 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(dotUU: number, dotVV: number, dotUV: number, favorZero: boolean = true): 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 *\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(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number): 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 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 *\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 signed (-PI < radians <= PI)\r\n */\r\n public static orientedRadiansBetweenVectorsXYZ(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false): 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 addition to PI.\r\n // 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 /**\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 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 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 = 1.0e-15): 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 *\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(ux: number, uy: number, uz: number, vx: number, vy: number, vz: number,\r\n upVectorX: number, upVectorY: number, upVectorZ: number,\r\n adjustToPositive: boolean = false): 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"]}
|
|
@@ -39,13 +39,15 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
39
39
|
get startAngle(): Angle;
|
|
40
40
|
/** Return the (strongly typed) end angle */
|
|
41
41
|
get endAngle(): Angle;
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Create a sweep as one of
|
|
43
44
|
* * A clone of a given sweep
|
|
44
45
|
* * 0 to given angle
|
|
45
46
|
* * full circle if no arg given (sweep 0 to 360 degrees)
|
|
46
47
|
*/
|
|
47
48
|
static create(data?: AngleSweep | Angle): AngleSweep;
|
|
48
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* (private) constructor with start and end angles in radians.
|
|
49
51
|
* * Use explicitly named static methods to clarify intent and units of inputs:
|
|
50
52
|
*
|
|
51
53
|
* * createStartEndRadians (startRadians:number, endRadians:number)
|
|
@@ -57,46 +59,45 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
57
59
|
*/
|
|
58
60
|
private constructor();
|
|
59
61
|
/**
|
|
60
|
-
*
|
|
62
|
+
* Directly set the start and end angles in radians
|
|
61
63
|
* * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.
|
|
62
|
-
|
|
64
|
+
*/
|
|
63
65
|
setStartEndRadians(startRadians?: number, endRadians?: number): void;
|
|
64
|
-
/**
|
|
66
|
+
/** Directly set the start and end angles in degrees */
|
|
65
67
|
setStartEndDegrees(startDegrees?: number, endDegrees?: number): void;
|
|
66
68
|
/**
|
|
67
|
-
*
|
|
69
|
+
* Create an AngleSweep from start and end angles given in radians.
|
|
68
70
|
* * If the difference between startRadians and endRadians is greater than 360, the function limits the angle sweep to 360.
|
|
69
|
-
|
|
71
|
+
*/
|
|
70
72
|
static createStartEndRadians(startRadians?: number, endRadians?: number, result?: AngleSweep): AngleSweep;
|
|
71
73
|
/** Return the angle obtained by subtracting radians from this angle. */
|
|
72
74
|
cloneMinusRadians(radians: number): AngleSweep;
|
|
73
|
-
/**
|
|
75
|
+
/** Create an AngleSweep from start and end angles given in degrees. */
|
|
74
76
|
static createStartEndDegrees(startDegrees?: number, endDegrees?: number, result?: AngleSweep): AngleSweep;
|
|
75
|
-
/**
|
|
77
|
+
/** Create an angle sweep from strongly typed start and end angles */
|
|
76
78
|
static createStartEnd(startAngle: Angle, endAngle: Angle, result?: AngleSweep): AngleSweep;
|
|
77
|
-
/**
|
|
79
|
+
/** Create an AngleSweep from start and end angles given in radians. */
|
|
78
80
|
static createStartSweepRadians(startRadians?: number, sweepRadians?: number, result?: AngleSweep): AngleSweep;
|
|
79
|
-
/**
|
|
81
|
+
/** Create an AngleSweep from start and sweep given in degrees. */
|
|
80
82
|
static createStartSweepDegrees(startDegrees?: number, sweepDegrees?: number, result?: AngleSweep): AngleSweep;
|
|
81
83
|
/** Create an angle sweep with limits given as (strongly typed) angles for start and sweep */
|
|
82
84
|
static createStartSweep(startAngle: Angle, sweepAngle: Angle, result?: AngleSweep): AngleSweep;
|
|
83
85
|
/** Return a sweep with limits interpolated between this and other. */
|
|
84
86
|
interpolate(fraction: number, other: AngleSweep): AngleSweep;
|
|
85
|
-
/**
|
|
87
|
+
/** Copy from other AngleSweep. */
|
|
86
88
|
setFrom(other: AngleSweep): void;
|
|
87
|
-
/**
|
|
89
|
+
/** Create a full circle sweep (CCW). startRadians defaults to 0 */
|
|
88
90
|
static create360(startRadians?: number): AngleSweep;
|
|
89
|
-
/**
|
|
91
|
+
/** Create a sweep from the south pole to the north pole (-90 to +90). */
|
|
90
92
|
static createFullLatitude(): AngleSweep;
|
|
91
93
|
/** Reverse the start and end angle in place. */
|
|
92
94
|
reverseInPlace(): void;
|
|
93
|
-
/**
|
|
95
|
+
/**
|
|
96
|
+
* Return a sweep for the "other" part of the circle.
|
|
94
97
|
* @param reverseDirection true to move backwards (CW) from start to end, false to more forwards (CCW) from start to end.
|
|
95
98
|
*/
|
|
96
99
|
cloneComplement(reverseDirection?: boolean, result?: AngleSweep): AngleSweep;
|
|
97
|
-
/**
|
|
98
|
-
* Restrict start and end angles into the range (-90,+90) in degrees.
|
|
99
|
-
* */
|
|
100
|
+
/** Restrict start and end angles into the range (-90,+90) in degrees */
|
|
100
101
|
capLatitudeInPlace(): void;
|
|
101
102
|
/** Ask if the sweep is counterclockwise, i.e. positive sweep */
|
|
102
103
|
get isCCW(): boolean;
|
|
@@ -104,19 +105,20 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
104
105
|
get isFullCircle(): boolean;
|
|
105
106
|
/** Ask if the sweep is a full sweep from south pole to north pole. */
|
|
106
107
|
get isFullLatitudeSweep(): boolean;
|
|
107
|
-
/**
|
|
108
|
+
/** Return a clone of this sweep. */
|
|
108
109
|
clone(): AngleSweep;
|
|
109
110
|
/** Convert fractional position in the sweep to radians. */
|
|
110
111
|
fractionToRadians(fraction: number): number;
|
|
111
112
|
/** Convert fractional position in the sweep to strongly typed Angle object. */
|
|
112
113
|
fractionToAngle(fraction: number): Angle;
|
|
113
|
-
/**
|
|
114
|
+
/**
|
|
115
|
+
* Return 2PI divided by the sweep radians (i.e. 360 degrees divided by sweep angle).
|
|
114
116
|
* * This is the number of fractional intervals required to cover a whole circle.
|
|
115
117
|
*/
|
|
116
118
|
fractionPeriod(): number;
|
|
117
|
-
/**
|
|
119
|
+
/**
|
|
120
|
+
* Return the fractionalized position of the given angle (as Angle) computed without consideration of
|
|
118
121
|
* 2PI period and without consideration of angle sweep direction (CW or CCW).
|
|
119
|
-
*
|
|
120
122
|
* * the start angle is at fraction 0
|
|
121
123
|
* * the end angle is at fraction 1
|
|
122
124
|
* * interior angles are between 0 and 1
|
|
@@ -127,8 +129,8 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
127
129
|
* * does not allow period shift
|
|
128
130
|
*/
|
|
129
131
|
angleToUnboundedFraction(theta: Angle): number;
|
|
130
|
-
/**
|
|
131
|
-
*
|
|
132
|
+
/**
|
|
133
|
+
* Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.
|
|
132
134
|
* * consider radians0 as `start` angle of the sweep and radians1 as `end` angle of the sweep
|
|
133
135
|
* * fraction is always positive
|
|
134
136
|
* * the start angle is at fraction 0
|
|
@@ -138,8 +140,8 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
138
140
|
* * allows period shift
|
|
139
141
|
*/
|
|
140
142
|
static radiansToPositivePeriodicFractionStartEnd(radians: number, radians0: number, radians1: number, zeroSweepDefault?: number): number;
|
|
141
|
-
/**
|
|
142
|
-
*
|
|
143
|
+
/**
|
|
144
|
+
* Return the fractionalized position of the given angle (as radians), computed with consideration of 2PI period.
|
|
143
145
|
* * fraction is always positive
|
|
144
146
|
* * the start angle is at fraction 0
|
|
145
147
|
* * the end angle is at fraction 1
|
|
@@ -148,8 +150,8 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
148
150
|
* * allows period shift
|
|
149
151
|
*/
|
|
150
152
|
radiansToPositivePeriodicFraction(radians: number, zeroSweepDefault?: number): number;
|
|
151
|
-
/**
|
|
152
|
-
*
|
|
153
|
+
/**
|
|
154
|
+
* Return the fractionalized position of the given angle (as Angle), computed with consideration of 2PI period.
|
|
153
155
|
* * fraction is always positive
|
|
154
156
|
* * the start angle is at fraction 0
|
|
155
157
|
* * the end angle is at fraction 1
|
|
@@ -158,8 +160,8 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
158
160
|
* * allows period shift
|
|
159
161
|
*/
|
|
160
162
|
angleToPositivePeriodicFraction(theta: Angle): number;
|
|
161
|
-
/**
|
|
162
|
-
*
|
|
163
|
+
/**
|
|
164
|
+
* Return the fractionalized position of the given array of angles (as radian), computed with consideration of 2PI period.
|
|
163
165
|
* * fraction is always positive
|
|
164
166
|
* * the start angle is at fraction 0
|
|
165
167
|
* * the end angle is at fraction 1
|
|
@@ -168,9 +170,9 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
168
170
|
* * allows period shift
|
|
169
171
|
*/
|
|
170
172
|
radiansArrayToPositivePeriodicFractions(data: GrowableFloat64Array): void;
|
|
171
|
-
/**
|
|
173
|
+
/**
|
|
174
|
+
* Return the fractionalized position of the given angle (as radian) computed with consideration of
|
|
172
175
|
* 2PI period and with consideration of angle sweep direction (CW or CCW).
|
|
173
|
-
*
|
|
174
176
|
* * the start angle is at fraction 0
|
|
175
177
|
* * the end angle is at fraction 1
|
|
176
178
|
* * interior angles are between 0 and 1
|
|
@@ -179,9 +181,9 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
179
181
|
* * allows period shift
|
|
180
182
|
*/
|
|
181
183
|
radiansToSignedPeriodicFraction(radians: number): number;
|
|
182
|
-
/**
|
|
184
|
+
/**
|
|
185
|
+
* Return the fractionalized position of the given angle (as Angle) computed with consideration of
|
|
183
186
|
* 2PI period and with consideration of angle sweep direction (CW or CCW).
|
|
184
|
-
*
|
|
185
187
|
* * the start angle is at fraction 0
|
|
186
188
|
* * the end angle is at fraction 1
|
|
187
189
|
* * interior angles are between 0 and 1
|
|
@@ -190,14 +192,14 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
190
192
|
* * allows period shift
|
|
191
193
|
*/
|
|
192
194
|
angleToSignedPeriodicFraction(theta: Angle): number;
|
|
193
|
-
/**
|
|
195
|
+
/** Test if the given angle (as radians) is within sweep (between radians0 and radians1) */
|
|
194
196
|
static isRadiansInStartEnd(radians: number, radians0: number, radians1: number, allowPeriodShift?: boolean): boolean;
|
|
195
|
-
/**
|
|
197
|
+
/** Test if the given angle (as radians) is within sweep */
|
|
196
198
|
isRadiansInSweep(radians: number, allowPeriodShift?: boolean): boolean;
|
|
197
|
-
/**
|
|
199
|
+
/** Test if the given angle (as Angle) is within the sweep */
|
|
198
200
|
isAngleInSweep(angle: Angle): boolean;
|
|
199
|
-
/**
|
|
200
|
-
*
|
|
201
|
+
/**
|
|
202
|
+
* Set this AngleSweep from various sources:
|
|
201
203
|
* * if json is undefined, a full-circle sweep is returned.
|
|
202
204
|
* * If json is an AngleSweep object, it is cloned
|
|
203
205
|
* * If json is an array of 2 numbers, those numbers are start and end angles in degrees.
|
|
@@ -206,22 +208,25 @@ export declare class AngleSweep implements BeJSONFunctions {
|
|
|
206
208
|
* * Otherwise, a full-circle sweep is returned.
|
|
207
209
|
*/
|
|
208
210
|
setFromJSON(json?: any): void;
|
|
209
|
-
/**
|
|
211
|
+
/** Create an AngleSweep from a json object. */
|
|
210
212
|
static fromJSON(json?: AngleSweepProps): AngleSweep;
|
|
211
213
|
/**
|
|
212
214
|
* Convert an AngleSweep to a JSON object.
|
|
213
215
|
* @return {*} {degrees: [startAngleInDegrees, endAngleInDegrees}
|
|
214
216
|
*/
|
|
215
217
|
toJSON(): any;
|
|
216
|
-
/**
|
|
218
|
+
/**
|
|
219
|
+
* Test if this angle sweep and other angle sweep match with radians tolerance.
|
|
217
220
|
* * Period shifts are allowed.
|
|
218
221
|
*/
|
|
219
222
|
isAlmostEqualAllowPeriodShift(other: AngleSweep): boolean;
|
|
220
|
-
/**
|
|
223
|
+
/**
|
|
224
|
+
* Test if this angle sweep and other angle sweep match with radians tolerance.
|
|
221
225
|
* * Period shifts are not allowed.
|
|
222
226
|
*/
|
|
223
227
|
isAlmostEqualNoPeriodShift(other: AngleSweep): boolean;
|
|
224
|
-
/**
|
|
228
|
+
/**
|
|
229
|
+
* Test if start and end angles match with radians tolerance.
|
|
225
230
|
* * Period shifts are not allowed.
|
|
226
231
|
* * This function is equivalent to isAlmostEqualNoPeriodShift. It is present for consistency with other classes.
|
|
227
232
|
* However, it is recommended to use isAlmostEqualNoPeriodShift which has a clearer name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AngleSweep.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAY,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,iEAAiE;IACjE,IAAW,YAAY,WAEtB;IACD,+DAA+D;IAC/D,IAAW,UAAU,WAEpB;IACD,8DAA8D;IAC9D,IAAW,YAAY,WAEtB;IACD,iEAAiE;IACjE,IAAW,YAAY,WAEtB;IACD,+DAA+D;IAC/D,IAAW,UAAU,WAEpB;IACD,8DAA8D;IAC9D,IAAW,YAAY,WAEtB;IACD,8CAA8C;IAC9C,IAAW,UAAU,UAEpB;IACD,4CAA4C;IAC5C,IAAW,QAAQ,UAElB;IACD
|
|
1
|
+
{"version":3,"file":"AngleSweep.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/AngleSweep.ts"],"names":[],"mappings":"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"}
|