@itwin/core-geometry 3.6.0-dev.14 → 3.6.0-dev.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts +45 -22
  5. package/lib/cjs/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
  6. package/lib/cjs/geometry3d/OrderedRotationAngles.js +84 -49
  7. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  8. package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts +49 -25
  9. package/lib/cjs/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
  10. package/lib/cjs/geometry3d/YawPitchRollAngles.js +146 -50
  11. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  12. package/lib/cjs/polyface/PolyfaceQuery.d.ts +28 -0
  13. package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
  14. package/lib/cjs/polyface/PolyfaceQuery.js +79 -0
  15. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  16. package/lib/esm/Geometry.d.ts.map +1 -1
  17. package/lib/esm/Geometry.js.map +1 -1
  18. package/lib/esm/geometry3d/OrderedRotationAngles.d.ts +45 -22
  19. package/lib/esm/geometry3d/OrderedRotationAngles.d.ts.map +1 -1
  20. package/lib/esm/geometry3d/OrderedRotationAngles.js +85 -50
  21. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  22. package/lib/esm/geometry3d/YawPitchRollAngles.d.ts +49 -25
  23. package/lib/esm/geometry3d/YawPitchRollAngles.d.ts.map +1 -1
  24. package/lib/esm/geometry3d/YawPitchRollAngles.js +146 -50
  25. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  26. package/lib/esm/polyface/PolyfaceQuery.d.ts +28 -0
  27. package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
  28. package/lib/esm/polyface/PolyfaceQuery.js +79 -0
  29. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  30. package/package.json +4 -4
@@ -13,11 +13,13 @@ const Angle_1 = require("./Angle");
13
13
  const Matrix3d_1 = require("./Matrix3d");
14
14
  /* cspell:word cxcz, cxsz, cxcy, cxsy, sxcz, sxsz, sxcy, sxsy, cycz, cysz, sycz, sysz */
15
15
  /**
16
- * * represents a non-trivial rotation using three simple axis rotation angles and an
17
- * order in which to apply them.
16
+ * represents a non-trivial rotation using three simple axis rotation angles and an order in which to apply them.
18
17
  * * This class accommodates application-specific interpretation of "multiplying 3 rotation matrices" with regard to
19
18
  * * Whether a "vector" is a "row" or a "column"
20
19
  * * The order in which the X,Y,Z rotations are applied.
20
+ * * This class bakes in angle rotation directions via create functions (i.e., createRadians, createDegrees, and
21
+ * createAngles) so you can define each of the 3 rotations to be clockwise or counterclockwise. The default
22
+ * rotation is counterclockwise.
21
23
  * * Within the imodel geometry library, the preferred rotation order is encapsulated in `YawPitchRollAngles`.
22
24
  * @alpha
23
25
  */
@@ -69,7 +71,7 @@ class OrderedRotationAngles {
69
71
  get zRadians() {
70
72
  return this._z.radians;
71
73
  }
72
- /** Flag controlling whether vectors are treated as rows or as columns */
74
+ /** the flag controlling whether vectors are treated as rows or as columns */
73
75
  static get treatVectorsAsColumns() {
74
76
  return OrderedRotationAngles._sTreatVectorsAsColumns;
75
77
  }
@@ -77,68 +79,81 @@ class OrderedRotationAngles {
77
79
  OrderedRotationAngles._sTreatVectorsAsColumns = value;
78
80
  }
79
81
  /**
80
- * Create an OrderedRotationAngles from three angles and an ordering in which to apply them when rotating.
81
- * @param xRotation rotation around x
82
- * @param yRotation rotation around y
83
- * @param zRotation rotation around z
82
+ * Create an OrderedRotationAngles from three angles (in radians), an ordering in which to apply them when
83
+ * rotating, and a flag triple controlling whether direction of x,y,z is clockwise or counterclockwise.
84
+ * @param xRadians rotation around x
85
+ * @param yRadians rotation around y
86
+ * @param zRadians rotation around z
84
87
  * @param order left to right order of axis names identifies the order that rotations are applied.
85
88
  * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.
86
89
  * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation
87
90
  * matrix multiplication would be zRot*yRot*xRot
91
+ * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.
92
+ * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.
93
+ * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].
94
+ * @param result caller-allocated OrderedRotationAngles
88
95
  */
89
- static createAngles(xRotation, yRotation, zRotation, order, result) {
96
+ static createRadians(xRadians, yRadians, zRadians, order, xyzRotationIsClockwise, result) {
97
+ if (!xyzRotationIsClockwise) {
98
+ xyzRotationIsClockwise = [false, false, false];
99
+ }
100
+ const xRadian = xyzRotationIsClockwise[0] ? -xRadians : xRadians;
101
+ const yRadian = xyzRotationIsClockwise[1] ? -yRadians : yRadians;
102
+ const zRadian = xyzRotationIsClockwise[2] ? -zRadians : zRadians;
90
103
  if (result) {
91
- result._x.setFrom(xRotation);
92
- result._y.setFrom(yRotation);
93
- result._z.setFrom(zRotation);
104
+ result._x.setRadians(xRadian);
105
+ result._y.setRadians(yRadian);
106
+ result._z.setRadians(zRadian);
94
107
  result._order = order;
95
108
  return result;
96
109
  }
97
- return new OrderedRotationAngles(xRotation.clone(), yRotation.clone(), zRotation.clone(), order);
110
+ return new OrderedRotationAngles(Angle_1.Angle.createRadians(xRadian), Angle_1.Angle.createRadians(yRadian), Angle_1.Angle.createRadians(zRadian), order);
98
111
  }
99
112
  /**
100
- * Create an OrderedRotationAngles from three angles (in radians) and an ordering in which to apply
113
+ * Create an OrderedRotationAngles from three angles (in degrees) and an ordering in which to apply
101
114
  * them when rotating.
102
- * @param xRadians rotation around x
103
- * @param yRadians rotation around y
104
- * @param zRadians rotation around z
115
+ * @param xDegrees rotation around x
116
+ * @param yDegrees rotation around y
117
+ * @param zDegrees rotation around z
105
118
  * @param order left to right order of axis names identifies the order that rotations are applied.
106
119
  * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.
107
120
  * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation
108
121
  * matrix multiplication would be zRot*yRot*xRot
122
+ * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.
123
+ * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.
124
+ * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].
125
+ * @param result caller-allocated OrderedRotationAngles
109
126
  */
110
- static createRadians(xRadians, yRadians, zRadians, order, result) {
111
- if (result) {
112
- result._x.setRadians(xRadians);
113
- result._y.setRadians(yRadians);
114
- result._z.setRadians(zRadians);
115
- result._order = order;
116
- return result;
117
- }
118
- return new OrderedRotationAngles(Angle_1.Angle.createRadians(xRadians), Angle_1.Angle.createRadians(yRadians), Angle_1.Angle.createRadians(zRadians), order);
127
+ static createDegrees(xDegrees, yDegrees, zDegrees, order, xyzRotationIsClockwise, result) {
128
+ return OrderedRotationAngles.createRadians(Angle_1.Angle.degreesToRadians(xDegrees), Angle_1.Angle.degreesToRadians(yDegrees), Angle_1.Angle.degreesToRadians(zDegrees), order, xyzRotationIsClockwise, result);
119
129
  }
120
130
  /**
121
- * Create an OrderedRotationAngles from three angles (in degrees) and an ordering in which to apply
122
- * them when rotating.
123
- * @param xRadians rotation around x
124
- * @param yRadians rotation around y
125
- * @param zRadians rotation around z
126
- * @param order left to right order of axis names identifies the order that rotations are applied.
131
+ * Create an OrderedRotationAngles from three angles, an ordering in which to apply them when rotating,
132
+ * and a flag triple controlling whether direction of x,y,z is clockwise or counterclockwise.
133
+ * @param xRotation rotation around x
134
+ * @param yRotation rotation around y
135
+ * @param zRotation rotation around z
136
+ * @param order left to right order of axis names identifies the order that rotations are applied
127
137
  * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.
128
138
  * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation
129
139
  * matrix multiplication would be zRot*yRot*xRot
140
+ * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.
141
+ * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.
142
+ * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].
143
+ * @param result caller-allocated OrderedRotationAngles
130
144
  */
131
- static createDegrees(xDegrees, yDegrees, zDegrees, order, result) {
132
- if (result) {
133
- result._x.setDegrees(xDegrees);
134
- result._y.setDegrees(yDegrees);
135
- result._z.setDegrees(zDegrees);
136
- result._order = order;
137
- return result;
138
- }
139
- return new OrderedRotationAngles(Angle_1.Angle.createDegrees(xDegrees), Angle_1.Angle.createDegrees(yDegrees), Angle_1.Angle.createDegrees(zDegrees), order);
145
+ static createAngles(xRotation, yRotation, zRotation, order, xyzRotationIsClockwise, result) {
146
+ return OrderedRotationAngles.createRadians(xRotation.radians, yRotation.radians, zRotation.radians, order, xyzRotationIsClockwise, result);
140
147
  }
141
- /** Create an OrderedRotationAngles from a 3x3 rotational matrix, given the ordering of axis rotations that the matrix derives from. */
148
+ /**
149
+ * Create an OrderedRotationAngles from a 3x3 rotational matrix, given the ordering of axis rotations
150
+ * that the matrix derives from.
151
+ * * This function creates an OrderedRotationAngles with default angle rotation directions, i.e.,
152
+ * it assumes all x, y, and z rotations are counterclockwise.
153
+ * * In the failure case the method's return value is `undefined`.
154
+ * * In the failure case, if the optional result was supplied, that result will nonetheless be filled with
155
+ * a set of angles.
156
+ * */
142
157
  static createFromMatrix3d(matrix, order, result) {
143
158
  // treat vector as columns
144
159
  let m11 = matrix.coffs[0], m12 = matrix.coffs[1], m13 = matrix.coffs[2];
@@ -161,13 +176,19 @@ class OrderedRotationAngles {
161
176
  zRad = Math.atan2(m21, m11);
162
177
  }
163
178
  else {
164
- /*
165
- * If Math.abs(m31) = 1 then yRad = 90 degrees and therefore, we have a gimbal lock.
166
- * This means xRad and zRad can be anything as long as their sum xRad + zRad is constant.
167
- * so we can pick zRad = 0 and calculate xRad (or pick xRad = 0 and calculate zRad).
168
- * Math details can be found
169
- * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles
170
- */
179
+ /**
180
+ * If Math.abs(m31) = 1 then yRad = +-90 degrees and therefore, we have a gimbal lock.
181
+ * This means xRad and zRad can be anything as long as their sum xRad + zRad is constant.
182
+ * so we can pick zRad = 0 and calculate xRad (or pick xRad = 0 and calculate zRad).
183
+ * Therefore, rotation matrix becomes
184
+ * Matrix3d.createRowValues(
185
+ * 0, +-sx, +-cx,
186
+ * 0, cx, -sx,
187
+ * -+1, 0, 0
188
+ * );
189
+ * Math details can be found
190
+ * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles
191
+ */
171
192
  xRad = Math.atan2(-m23, m22);
172
193
  zRad = 0;
173
194
  }
@@ -237,7 +258,21 @@ class OrderedRotationAngles {
237
258
  xRad = yRad = zRad = 0;
238
259
  }
239
260
  }
240
- return OrderedRotationAngles.createRadians(xRad, yRad, zRad, order, result);
261
+ const xyzRotationIsClockwise = [false, false, false];
262
+ const angles = OrderedRotationAngles.createRadians(xRad, yRad, zRad, order, xyzRotationIsClockwise, result);
263
+ // sanity check
264
+ const matrix1 = angles.toMatrix3d();
265
+ /**
266
+ * Below tolerance loosened to allow sanity check to pass for
267
+ *
268
+ * OrderedRotationAngles.createFromMatrix3d(
269
+ * OrderedRotationAngles.createDegrees(0, 89.999, 0.001, AxisOrder.XYZ).toMatrix3d(),
270
+ * AxisOrder.XYZ
271
+ * );
272
+ *
273
+ * with treatVectorsAsColumns = true.
274
+ */
275
+ return (matrix.maxDiff(matrix1) < 10 * Geometry_1.Geometry.smallFraction) ? angles : undefined;
241
276
  }
242
277
  /**
243
278
  * Create a 3x3 rotational matrix from this OrderedRotationAngles.
@@ -1 +1 @@
1
- {"version":3,"file":"OrderedRotationAngles.js","sourceRoot":"","sources":["../../../src/geometry3d/OrderedRotationAngles.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { AxisOrder } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\n\r\n/* cspell:word cxcz, cxsz, cxcy, cxsy, sxcz, sxsz, sxcy, sxsy, cycz, cysz, sycz, sysz */\r\n\r\n/**\r\n * * represents a non-trivial rotation using three simple axis rotation angles and an\r\n * order in which to apply them.\r\n * * This class accommodates application-specific interpretation of \"multiplying 3 rotation matrices\" with regard to\r\n * * Whether a \"vector\" is a \"row\" or a \"column\"\r\n * * The order in which the X,Y,Z rotations are applied.\r\n * * Within the imodel geometry library, the preferred rotation order is encapsulated in `YawPitchRollAngles`.\r\n * @alpha\r\n */\r\nexport class OrderedRotationAngles {\r\n /** rotation around x */\r\n private _x: Angle;\r\n /** rotation around y */\r\n private _y: Angle;\r\n /** rotation around z */\r\n private _z: Angle;\r\n /** rotation order. For example XYZ means to rotate around x axis first, then y axis, and finally Z axis */\r\n private _order: AxisOrder;\r\n /** treat vectors as matrix columns */\r\n private static _sTreatVectorsAsColumns: boolean = false;\r\n /** constructor */\r\n private constructor(x: Angle, y: Angle, z: Angle, axisOrder: AxisOrder) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._order = axisOrder;\r\n }\r\n /** (Property accessor) Return the `AxisOrder` controlling matrix multiplication order. */\r\n public get order(): AxisOrder {\r\n return this._order;\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around x. */\r\n public get xAngle(): Angle {\r\n return this._x.clone();\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around y. */\r\n public get yAngle(): Angle {\r\n return this._y.clone();\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around z. */\r\n public get zAngle(): Angle {\r\n return this._z.clone();\r\n }\r\n /** (Property accessor) Return the angle of rotation around x, in degrees */\r\n public get xDegrees(): number {\r\n return this._x.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around y, in degrees */\r\n public get xRadians(): number {\r\n return this._x.radians;\r\n }\r\n /** (Property accessor) Return the angle of rotation around z, in degrees */\r\n public get yDegrees(): number {\r\n return this._y.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around x, in radians */\r\n public get yRadians(): number {\r\n return this._y.radians;\r\n }\r\n /** (Property accessor) Return the angle of rotation around y, in radians */\r\n public get zDegrees(): number {\r\n return this._z.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around z, in radians */\r\n public get zRadians(): number {\r\n return this._z.radians;\r\n }\r\n /** Flag controlling whether vectors are treated as rows or as columns */\r\n public static get treatVectorsAsColumns(): boolean {\r\n return OrderedRotationAngles._sTreatVectorsAsColumns;\r\n }\r\n public static set treatVectorsAsColumns(value: boolean) {\r\n OrderedRotationAngles._sTreatVectorsAsColumns = value;\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles and an ordering in which to apply them when rotating.\r\n * @param xRotation rotation around x\r\n * @param yRotation rotation around y\r\n * @param zRotation rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied.\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n */\r\n public static createAngles(xRotation: Angle, yRotation: Angle, zRotation: Angle, order: AxisOrder,\r\n result?: OrderedRotationAngles): OrderedRotationAngles {\r\n if (result) {\r\n result._x.setFrom(xRotation);\r\n result._y.setFrom(yRotation);\r\n result._z.setFrom(zRotation);\r\n result._order = order;\r\n return result;\r\n }\r\n return new OrderedRotationAngles(xRotation.clone(), yRotation.clone(), zRotation.clone(), order);\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles (in radians) and an ordering in which to apply\r\n * them when rotating.\r\n * @param xRadians rotation around x\r\n * @param yRadians rotation around y\r\n * @param zRadians rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied.\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n */\r\n public static createRadians(xRadians: number, yRadians: number, zRadians: number, order: AxisOrder,\r\n result?: OrderedRotationAngles): OrderedRotationAngles {\r\n if (result) {\r\n result._x.setRadians(xRadians);\r\n result._y.setRadians(yRadians);\r\n result._z.setRadians(zRadians);\r\n result._order = order;\r\n return result;\r\n }\r\n return new OrderedRotationAngles(\r\n Angle.createRadians(xRadians),\r\n Angle.createRadians(yRadians),\r\n Angle.createRadians(zRadians),\r\n order\r\n );\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles (in degrees) and an ordering in which to apply\r\n * them when rotating.\r\n * @param xRadians rotation around x\r\n * @param yRadians rotation around y\r\n * @param zRadians rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied.\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n */\r\n public static createDegrees(xDegrees: number, yDegrees: number, zDegrees: number, order: AxisOrder,\r\n result?: OrderedRotationAngles): OrderedRotationAngles {\r\n if (result) {\r\n result._x.setDegrees(xDegrees);\r\n result._y.setDegrees(yDegrees);\r\n result._z.setDegrees(zDegrees);\r\n result._order = order;\r\n return result;\r\n }\r\n return new OrderedRotationAngles(\r\n Angle.createDegrees(xDegrees),\r\n Angle.createDegrees(yDegrees),\r\n Angle.createDegrees(zDegrees),\r\n order\r\n );\r\n }\r\n /** Create an OrderedRotationAngles from a 3x3 rotational matrix, given the ordering of axis rotations that the matrix derives from. */\r\n public static createFromMatrix3d(matrix: Matrix3d, order: AxisOrder, result?: OrderedRotationAngles): OrderedRotationAngles {\r\n // treat vector as columns\r\n let m11 = matrix.coffs[0], m12 = matrix.coffs[1], m13 = matrix.coffs[2];\r\n let m21 = matrix.coffs[3], m22 = matrix.coffs[4], m23 = matrix.coffs[5];\r\n let m31 = matrix.coffs[6], m32 = matrix.coffs[7], m33 = matrix.coffs[8];\r\n // treat vector as rows\r\n if (!OrderedRotationAngles.treatVectorsAsColumns) {\r\n m11 = matrix.coffs[0], m12 = matrix.coffs[3], m13 = matrix.coffs[6];\r\n m21 = matrix.coffs[1], m22 = matrix.coffs[4], m23 = matrix.coffs[7];\r\n m31 = matrix.coffs[2], m32 = matrix.coffs[5], m33 = matrix.coffs[8];\r\n }\r\n\r\n let xRad: number;\r\n let yRad: number;\r\n let zRad: number;\r\n\r\n switch (order) {\r\n case AxisOrder.XYZ: {\r\n yRad = Math.asin(Math.max(-1, Math.min(1, -m31))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m31) < 0.99999) {\r\n xRad = Math.atan2(m32, m33);\r\n zRad = Math.atan2(m21, m11);\r\n } else {\r\n /*\r\n * If Math.abs(m31) = 1 then yRad = 90 degrees and therefore, we have a gimbal lock.\r\n * This means xRad and zRad can be anything as long as their sum xRad + zRad is constant.\r\n * so we can pick zRad = 0 and calculate xRad (or pick xRad = 0 and calculate zRad).\r\n * Math details can be found\r\n * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles\r\n */\r\n xRad = Math.atan2(-m23, m22);\r\n zRad = 0;\r\n }\r\n break;\r\n } case AxisOrder.YXZ: {\r\n xRad = Math.asin(Math.max(-1, Math.min(1, m32))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m32) < 0.99999) {\r\n yRad = Math.atan2(-m31, m33);\r\n zRad = Math.atan2(-m12, m22);\r\n } else {\r\n yRad = Math.atan2(m13, m11);\r\n zRad = 0;\r\n }\r\n break;\r\n } case AxisOrder.ZXY: {\r\n xRad = Math.asin(Math.max(-1, Math.min(1, -m23))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m23) < 0.99999) {\r\n yRad = Math.atan2(m13, m33);\r\n zRad = Math.atan2(m21, m22);\r\n } else {\r\n yRad = 0;\r\n zRad = Math.atan2(-m12, m11);\r\n }\r\n break;\r\n } case AxisOrder.ZYX: {\r\n yRad = Math.asin(Math.max(-1, Math.min(1, m13))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m13) < 0.99999) {\r\n xRad = Math.atan2(-m23, m33);\r\n zRad = Math.atan2(-m12, m11);\r\n } else {\r\n xRad = 0;\r\n zRad = Math.atan2(m21, m22);\r\n }\r\n break;\r\n } case AxisOrder.YZX: {\r\n zRad = Math.asin(Math.max(-1, Math.min(1, -m12))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m12) < 0.99999) {\r\n xRad = Math.atan2(m32, m22);\r\n yRad = Math.atan2(m13, m11);\r\n } else {\r\n xRad = 0;\r\n yRad = Math.atan2(-m31, m33);\r\n }\r\n break;\r\n } case AxisOrder.XZY: {\r\n zRad = Math.asin(Math.max(-1, Math.min(1, m21))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m21) < 0.99999) {\r\n xRad = Math.atan2(-m23, m22);\r\n yRad = Math.atan2(-m31, m11);\r\n } else {\r\n xRad = Math.atan2(m32, m33);\r\n yRad = 0;\r\n }\r\n break;\r\n } default: {\r\n xRad = yRad = zRad = 0;\r\n }\r\n }\r\n\r\n return OrderedRotationAngles.createRadians(xRad, yRad, zRad, order, result);\r\n }\r\n /**\r\n * Create a 3x3 rotational matrix from this OrderedRotationAngles.\r\n ** math details can be found at docs/learning/geometry/Angle.md\r\n **/\r\n public toMatrix3d(result?: Matrix3d): Matrix3d {\r\n const rot = (result !== undefined) ? result : new Matrix3d();\r\n const axisOrder = this.order;\r\n const x = this.xAngle, y = this.yAngle, z = this.zAngle;\r\n\r\n const cx = x.cos(), sx = x.sin();\r\n const cy = y.cos(), sy = y.sin();\r\n const cz = z.cos(), sz = z.sin();\r\n\r\n const cxcz = cx * cz, cxsz = cx * sz, cxcy = cx * cy, cxsy = cx * sy;\r\n const sxcz = sx * cz, sxsz = sx * sz, sxcy = sx * cy, sxsy = sx * sy;\r\n const cycz = cy * cz, cysz = cy * sz, sycz = sy * cz, sysz = sy * sz;\r\n\r\n // the rotation matrix we build below is created using column-based base rotation matrixes\r\n if (axisOrder === AxisOrder.XYZ) {\r\n rot.setRowValues(\r\n cy * cz, sxcz * sy - cxsz, cxcz * sy + sxsz,\r\n cy * sz, cxcz + sxsz * sy, cxsz * sy - sxcz,\r\n -sy, sx * cy, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.YXZ) {\r\n rot.setRowValues(\r\n cycz - sysz * sx, -cx * sz, cysz * sx + sycz,\r\n sycz * sx + cysz, cx * cz, sysz - cycz * sx,\r\n -cx * sy, sx, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.ZXY) {\r\n rot.setRowValues(\r\n cycz + sysz * sx, sycz * sx - cysz, cx * sy,\r\n cx * sz, cx * cz, -sx,\r\n cysz * sx - sycz, cycz * sx + sysz, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.ZYX) {\r\n rot.setRowValues(\r\n cy * cz, -cy * sz, sy,\r\n sxcz * sy + cxsz, cxcz - sxsz * sy, -sx * cy,\r\n sxsz - cxcz * sy, sxcz + cxsz * sy, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.YZX) {\r\n rot.setRowValues(\r\n cy * cz, -sz, sy * cz,\r\n sxsy + cxcy * sz, cx * cz, cxsy * sz - sxcy,\r\n sxcy * sz - cxsy, sx * cz, cxcy + sxsy * sz,\r\n );\r\n } else if (axisOrder === AxisOrder.XZY) {\r\n rot.setRowValues(\r\n cy * cz, sxsy - cxcy * sz, cxsy + sxcy * sz,\r\n sz, cx * cz, -sx * cz,\r\n -sy * cz, sxcy + cxsy * sz, cxcy - sxsy * sz,\r\n );\r\n } else {\r\n rot.setIdentity();\r\n }\r\n // if we need row-based rotation matrix, we transpose the rotation matrix\r\n if (!OrderedRotationAngles.treatVectorsAsColumns)\r\n rot.transposeInPlace();\r\n\r\n return rot;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"OrderedRotationAngles.js","sourceRoot":"","sources":["../../../src/geometry3d/OrderedRotationAngles.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Angle } from \"./Angle\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\n\r\n/* cspell:word cxcz, cxsz, cxcy, cxsy, sxcz, sxsz, sxcy, sxsy, cycz, cysz, sycz, sysz */\r\n\r\n/**\r\n * represents a non-trivial rotation using three simple axis rotation angles and an order in which to apply them.\r\n * * This class accommodates application-specific interpretation of \"multiplying 3 rotation matrices\" with regard to\r\n * * Whether a \"vector\" is a \"row\" or a \"column\"\r\n * * The order in which the X,Y,Z rotations are applied.\r\n * * This class bakes in angle rotation directions via create functions (i.e., createRadians, createDegrees, and\r\n * createAngles) so you can define each of the 3 rotations to be clockwise or counterclockwise. The default\r\n * rotation is counterclockwise.\r\n * * Within the imodel geometry library, the preferred rotation order is encapsulated in `YawPitchRollAngles`.\r\n * @alpha\r\n */\r\nexport class OrderedRotationAngles {\r\n /** rotation around x */\r\n private _x: Angle;\r\n /** rotation around y */\r\n private _y: Angle;\r\n /** rotation around z */\r\n private _z: Angle;\r\n /** rotation order. For example XYZ means to rotate around x axis first, then y axis, and finally Z axis */\r\n private _order: AxisOrder;\r\n /** treat vectors as matrix columns */\r\n private static _sTreatVectorsAsColumns: boolean = false;\r\n /** constructor */\r\n private constructor(x: Angle, y: Angle, z: Angle, axisOrder: AxisOrder) {\r\n this._x = x;\r\n this._y = y;\r\n this._z = z;\r\n this._order = axisOrder;\r\n }\r\n /** (Property accessor) Return the `AxisOrder` controlling matrix multiplication order. */\r\n public get order(): AxisOrder {\r\n return this._order;\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around x. */\r\n public get xAngle(): Angle {\r\n return this._x.clone();\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around y. */\r\n public get yAngle(): Angle {\r\n return this._y.clone();\r\n }\r\n /** (Property accessor) Return the strongly typed angle of rotation around z. */\r\n public get zAngle(): Angle {\r\n return this._z.clone();\r\n }\r\n /** (Property accessor) Return the angle of rotation around x, in degrees */\r\n public get xDegrees(): number {\r\n return this._x.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around y, in degrees */\r\n public get xRadians(): number {\r\n return this._x.radians;\r\n }\r\n /** (Property accessor) Return the angle of rotation around z, in degrees */\r\n public get yDegrees(): number {\r\n return this._y.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around x, in radians */\r\n public get yRadians(): number {\r\n return this._y.radians;\r\n }\r\n /** (Property accessor) Return the angle of rotation around y, in radians */\r\n public get zDegrees(): number {\r\n return this._z.degrees;\r\n }\r\n /** (Property accessor) Return the angle of rotation around z, in radians */\r\n public get zRadians(): number {\r\n return this._z.radians;\r\n }\r\n /** the flag controlling whether vectors are treated as rows or as columns */\r\n public static get treatVectorsAsColumns(): boolean {\r\n return OrderedRotationAngles._sTreatVectorsAsColumns;\r\n }\r\n public static set treatVectorsAsColumns(value: boolean) {\r\n OrderedRotationAngles._sTreatVectorsAsColumns = value;\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles (in radians), an ordering in which to apply them when\r\n * rotating, and a flag triple controlling whether direction of x,y,z is clockwise or counterclockwise.\r\n * @param xRadians rotation around x\r\n * @param yRadians rotation around y\r\n * @param zRadians rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied.\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.\r\n * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.\r\n * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].\r\n * @param result caller-allocated OrderedRotationAngles\r\n */\r\n public static createRadians(xRadians: number, yRadians: number, zRadians: number, order: AxisOrder,\r\n xyzRotationIsClockwise?: [boolean, boolean, boolean], result?: OrderedRotationAngles): OrderedRotationAngles {\r\n if (!xyzRotationIsClockwise) {\r\n xyzRotationIsClockwise = [false, false, false];\r\n }\r\n const xRadian = xyzRotationIsClockwise[0] ? -xRadians : xRadians;\r\n const yRadian = xyzRotationIsClockwise[1] ? -yRadians : yRadians;\r\n const zRadian = xyzRotationIsClockwise[2] ? -zRadians : zRadians;\r\n if (result) {\r\n result._x.setRadians(xRadian);\r\n result._y.setRadians(yRadian);\r\n result._z.setRadians(zRadian);\r\n result._order = order;\r\n return result;\r\n }\r\n return new OrderedRotationAngles(\r\n Angle.createRadians(xRadian),\r\n Angle.createRadians(yRadian),\r\n Angle.createRadians(zRadian),\r\n order\r\n );\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles (in degrees) and an ordering in which to apply\r\n * them when rotating.\r\n * @param xDegrees rotation around x\r\n * @param yDegrees rotation around y\r\n * @param zDegrees rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied.\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.\r\n * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.\r\n * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].\r\n * @param result caller-allocated OrderedRotationAngles\r\n */\r\n public static createDegrees(xDegrees: number, yDegrees: number, zDegrees: number, order: AxisOrder,\r\n xyzRotationIsClockwise?: [boolean, boolean, boolean], result?: OrderedRotationAngles): OrderedRotationAngles {\r\n return OrderedRotationAngles.createRadians(\r\n Angle.degreesToRadians(xDegrees),\r\n Angle.degreesToRadians(yDegrees),\r\n Angle.degreesToRadians(zDegrees),\r\n order,\r\n xyzRotationIsClockwise,\r\n result\r\n );\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from three angles, an ordering in which to apply them when rotating,\r\n * and a flag triple controlling whether direction of x,y,z is clockwise or counterclockwise.\r\n * @param xRotation rotation around x\r\n * @param yRotation rotation around y\r\n * @param zRotation rotation around z\r\n * @param order left to right order of axis names identifies the order that rotations are applied\r\n * For example XYZ means to rotate around x axis first, then y axis, and finally Z axis.\r\n * * Note that rotation order is reverse of rotation matrix multiplication so for XYZ the rotation\r\n * matrix multiplication would be zRot*yRot*xRot\r\n * @param xyzRotationIsClockwise the flags controlling whether direction of x,y,z is clockwise or counterclockwise.\r\n * rotation direction of x,y,z: true ---> clockwise - false ---> counterclockwise.\r\n * * if xyzRotationIsClockwise is undefined it's set to [false, false, false].\r\n * @param result caller-allocated OrderedRotationAngles\r\n */\r\n public static createAngles(xRotation: Angle, yRotation: Angle, zRotation: Angle, order: AxisOrder,\r\n xyzRotationIsClockwise?: [boolean, boolean, boolean], result?: OrderedRotationAngles): OrderedRotationAngles {\r\n return OrderedRotationAngles.createRadians(\r\n xRotation.radians,\r\n yRotation.radians,\r\n zRotation.radians,\r\n order,\r\n xyzRotationIsClockwise,\r\n result\r\n );\r\n }\r\n /**\r\n * Create an OrderedRotationAngles from a 3x3 rotational matrix, given the ordering of axis rotations\r\n * that the matrix derives from.\r\n * * This function creates an OrderedRotationAngles with default angle rotation directions, i.e.,\r\n * it assumes all x, y, and z rotations are counterclockwise.\r\n * * In the failure case the method's return value is `undefined`.\r\n * * In the failure case, if the optional result was supplied, that result will nonetheless be filled with\r\n * a set of angles.\r\n * */\r\n public static createFromMatrix3d(matrix: Matrix3d, order: AxisOrder, result?: OrderedRotationAngles):\r\n OrderedRotationAngles | undefined {\r\n // treat vector as columns\r\n let m11 = matrix.coffs[0], m12 = matrix.coffs[1], m13 = matrix.coffs[2];\r\n let m21 = matrix.coffs[3], m22 = matrix.coffs[4], m23 = matrix.coffs[5];\r\n let m31 = matrix.coffs[6], m32 = matrix.coffs[7], m33 = matrix.coffs[8];\r\n // treat vector as rows\r\n if (!OrderedRotationAngles.treatVectorsAsColumns) {\r\n m11 = matrix.coffs[0], m12 = matrix.coffs[3], m13 = matrix.coffs[6];\r\n m21 = matrix.coffs[1], m22 = matrix.coffs[4], m23 = matrix.coffs[7];\r\n m31 = matrix.coffs[2], m32 = matrix.coffs[5], m33 = matrix.coffs[8];\r\n }\r\n\r\n let xRad: number;\r\n let yRad: number;\r\n let zRad: number;\r\n\r\n switch (order) {\r\n case AxisOrder.XYZ: {\r\n yRad = Math.asin(Math.max(-1, Math.min(1, -m31))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m31) < 0.99999) {\r\n xRad = Math.atan2(m32, m33);\r\n zRad = Math.atan2(m21, m11);\r\n } else {\r\n /**\r\n * If Math.abs(m31) = 1 then yRad = +-90 degrees and therefore, we have a gimbal lock.\r\n * This means xRad and zRad can be anything as long as their sum xRad + zRad is constant.\r\n * so we can pick zRad = 0 and calculate xRad (or pick xRad = 0 and calculate zRad).\r\n * Therefore, rotation matrix becomes\r\n * Matrix3d.createRowValues(\r\n * 0, +-sx, +-cx,\r\n * 0, cx, -sx,\r\n * -+1, 0, 0\r\n * );\r\n * Math details can be found\r\n * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles\r\n */\r\n xRad = Math.atan2(-m23, m22);\r\n zRad = 0;\r\n }\r\n break;\r\n } case AxisOrder.YXZ: {\r\n xRad = Math.asin(Math.max(-1, Math.min(1, m32))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m32) < 0.99999) {\r\n yRad = Math.atan2(-m31, m33);\r\n zRad = Math.atan2(-m12, m22);\r\n } else {\r\n yRad = Math.atan2(m13, m11);\r\n zRad = 0;\r\n }\r\n break;\r\n } case AxisOrder.ZXY: {\r\n xRad = Math.asin(Math.max(-1, Math.min(1, -m23))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m23) < 0.99999) {\r\n yRad = Math.atan2(m13, m33);\r\n zRad = Math.atan2(m21, m22);\r\n } else {\r\n yRad = 0;\r\n zRad = Math.atan2(-m12, m11);\r\n }\r\n break;\r\n } case AxisOrder.ZYX: {\r\n yRad = Math.asin(Math.max(-1, Math.min(1, m13))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m13) < 0.99999) {\r\n xRad = Math.atan2(-m23, m33);\r\n zRad = Math.atan2(-m12, m11);\r\n } else {\r\n xRad = 0;\r\n zRad = Math.atan2(m21, m22);\r\n }\r\n break;\r\n } case AxisOrder.YZX: {\r\n zRad = Math.asin(Math.max(-1, Math.min(1, -m12))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m12) < 0.99999) {\r\n xRad = Math.atan2(m32, m22);\r\n yRad = Math.atan2(m13, m11);\r\n } else {\r\n xRad = 0;\r\n yRad = Math.atan2(-m31, m33);\r\n }\r\n break;\r\n } case AxisOrder.XZY: {\r\n zRad = Math.asin(Math.max(-1, Math.min(1, m21))); // limit asin domain to [-1,1]\r\n\r\n if (Math.abs(m21) < 0.99999) {\r\n xRad = Math.atan2(-m23, m22);\r\n yRad = Math.atan2(-m31, m11);\r\n } else {\r\n xRad = Math.atan2(m32, m33);\r\n yRad = 0;\r\n }\r\n break;\r\n } default: {\r\n xRad = yRad = zRad = 0;\r\n }\r\n }\r\n const xyzRotationIsClockwise: [boolean, boolean, boolean] = [false, false, false];\r\n const angles = OrderedRotationAngles.createRadians(xRad, yRad, zRad, order, xyzRotationIsClockwise, result);\r\n // sanity check\r\n const matrix1 = angles.toMatrix3d();\r\n /**\r\n * Below tolerance loosened to allow sanity check to pass for\r\n *\r\n * OrderedRotationAngles.createFromMatrix3d(\r\n * OrderedRotationAngles.createDegrees(0, 89.999, 0.001, AxisOrder.XYZ).toMatrix3d(),\r\n * AxisOrder.XYZ\r\n * );\r\n *\r\n * with treatVectorsAsColumns = true.\r\n */\r\n return (matrix.maxDiff(matrix1) < 10 * Geometry.smallFraction) ? angles : undefined;\r\n }\r\n /**\r\n * Create a 3x3 rotational matrix from this OrderedRotationAngles.\r\n ** math details can be found at docs/learning/geometry/Angle.md\r\n **/\r\n public toMatrix3d(result?: Matrix3d): Matrix3d {\r\n const rot = (result !== undefined) ? result : new Matrix3d();\r\n const axisOrder = this.order;\r\n const x = this.xAngle, y = this.yAngle, z = this.zAngle;\r\n\r\n const cx = x.cos(), sx = x.sin();\r\n const cy = y.cos(), sy = y.sin();\r\n const cz = z.cos(), sz = z.sin();\r\n\r\n const cxcz = cx * cz, cxsz = cx * sz, cxcy = cx * cy, cxsy = cx * sy;\r\n const sxcz = sx * cz, sxsz = sx * sz, sxcy = sx * cy, sxsy = sx * sy;\r\n const cycz = cy * cz, cysz = cy * sz, sycz = sy * cz, sysz = sy * sz;\r\n\r\n // the rotation matrix we build below is created using column-based base rotation matrixes\r\n if (axisOrder === AxisOrder.XYZ) {\r\n rot.setRowValues(\r\n cy * cz, sxcz * sy - cxsz, cxcz * sy + sxsz,\r\n cy * sz, cxcz + sxsz * sy, cxsz * sy - sxcz,\r\n -sy, sx * cy, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.YXZ) {\r\n rot.setRowValues(\r\n cycz - sysz * sx, -cx * sz, cysz * sx + sycz,\r\n sycz * sx + cysz, cx * cz, sysz - cycz * sx,\r\n -cx * sy, sx, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.ZXY) {\r\n rot.setRowValues(\r\n cycz + sysz * sx, sycz * sx - cysz, cx * sy,\r\n cx * sz, cx * cz, -sx,\r\n cysz * sx - sycz, cycz * sx + sysz, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.ZYX) {\r\n rot.setRowValues(\r\n cy * cz, -cy * sz, sy,\r\n sxcz * sy + cxsz, cxcz - sxsz * sy, -sx * cy,\r\n sxsz - cxcz * sy, sxcz + cxsz * sy, cx * cy,\r\n );\r\n } else if (axisOrder === AxisOrder.YZX) {\r\n rot.setRowValues(\r\n cy * cz, -sz, sy * cz,\r\n sxsy + cxcy * sz, cx * cz, cxsy * sz - sxcy,\r\n sxcy * sz - cxsy, sx * cz, cxcy + sxsy * sz,\r\n );\r\n } else if (axisOrder === AxisOrder.XZY) {\r\n rot.setRowValues(\r\n cy * cz, sxsy - cxcy * sz, cxsy + sxcy * sz,\r\n sz, cx * cz, -sx * cz,\r\n -sy * cz, sxcy + cxsy * sz, cxcy - sxsy * sz,\r\n );\r\n } else {\r\n rot.setIdentity();\r\n }\r\n // if we need row-based rotation matrix, we transpose the rotation matrix\r\n if (!OrderedRotationAngles.treatVectorsAsColumns)\r\n rot.transposeInPlace();\r\n\r\n return rot;\r\n }\r\n}\r\n"]}
@@ -6,7 +6,6 @@ import { Angle } from "./Angle";
6
6
  import { Matrix3d } from "./Matrix3d";
7
7
  import { Point3d } from "./Point3dVector3d";
8
8
  import { Transform } from "./Transform";
9
- /** The properties that define [[YawPitchRollAngles]]. */
10
9
  /**
11
10
  * angle properties of a `YawPitchRoll` orientation
12
11
  * @public
@@ -19,44 +18,66 @@ export interface YawPitchRollProps {
19
18
  /** roll field */
20
19
  roll?: AngleProps;
21
20
  }
22
- /** Three angles that determine the orientation of an object in space. Sometimes referred to as [Tait–Bryan angles](https://en.wikipedia.org/wiki/Euler_angles).
21
+ /**
22
+ * Three angles that determine the orientation of an object in space, sometimes referred to as [Tait–Bryan angles]
23
+ * (https://en.wikipedia.org/wiki/Euler_angles).
23
24
  * * The matrix construction can be replicated by this logic:
24
25
  * * xyz coordinates have
25
26
  * * x forward
26
27
  * * y to left
27
28
  * * z up
28
- * * Note that this is a right handed coordinate system.
29
- * * yaw is a rotation of x towards y, i.e. around positive z:
29
+ * * Note that this is a right handed coordinate system.
30
+ * * yaw is a rotation of x towards y, i.e. around positive z (counterclockwise):
30
31
  * * `yawMatrix = Matrix3d.createRotationAroundAxisIndex(2, Angle.createDegrees(yawDegrees));`
31
- * * pitch is a rotation that raises x towards z, i.e. rotation around negative y:
32
+ * * pitch is a rotation that raises x towards z, i.e. rotation around **negative y** (**clockwise**):
32
33
  * * `pitchMatrix = Matrix3d.createRotationAroundAxisIndex(1, Angle.createDegrees(-pitchDegrees));`
33
- * * roll is rotation of y towards z, i.e. rotation around positive x:
34
+ * * roll is rotation of y towards z, i.e. rotation around positive x (counterclockwise):
34
35
  * * `rollMatrix = Matrix3d.createRotationAroundAxisIndex(0, Angle.createDegrees(rollDegrees));`
35
- * * The YPR matrix is the product
36
+ * * The YPR matrix is the product
36
37
  * * `result = yawMatrix.multiplyMatrixMatrix(pitchMatrix.multiplyMatrixMatrix(rollMatrix));`
37
- * * Note that this is for "column based" matrix, with vectors appearing to the right
38
- * * Hence a vector is first rotated by roll, then the pitch, finally yaw.
38
+ * * Note that this is for "column based" matrix with vectors multiplying on the right of the matrix.
39
+ * Hence a vector is first rotated by roll, then the pitch, finally yaw. So multiplication order in
40
+ * the sense of AxisOrder is `RPY` (i.e., XYZ), in contrast to the familiar name `YPR`.
39
41
  * @public
40
42
  */
41
43
  export declare class YawPitchRollAngles {
42
- /** The yaw angle. */
44
+ /** The yaw angle: counterclockwise rotation angle around z */
43
45
  yaw: Angle;
44
- /** The pitch angle. */
46
+ /** The pitch angle: **clockwise** rotation angle around y */
45
47
  pitch: Angle;
46
- /** The roll angle. */
48
+ /** The roll angle: counterclockwise rotation angle around x */
47
49
  roll: Angle;
50
+ /**
51
+ * constructor
52
+ * @param yaw counterclockwise rotation angle around z
53
+ * @param pitch **clockwise** rotation angle around y
54
+ * @param roll counterclockwise rotation angle around x
55
+ * */
48
56
  constructor(yaw?: Angle, pitch?: Angle, roll?: Angle);
49
57
  /** Freeze this YawPitchRollAngles */
50
58
  freeze(): Readonly<this>;
51
- /** constructor for YawPitchRollAngles with angles in degrees. */
59
+ /**
60
+ * constructor for YawPitchRollAngles with angles in degrees.
61
+ * @param yawDegrees counterclockwise rotation angle (in degrees) around z
62
+ * @param pitchDegrees **clockwise** rotation angle (in degrees) around y
63
+ * @param rollDegrees counterclockwise rotation angle (in degrees) around x
64
+ * */
52
65
  static createDegrees(yawDegrees: number, pitchDegrees: number, rollDegrees: number): YawPitchRollAngles;
53
- /** constructor for YawPitchRollAngles with angles in radians. */
66
+ /**
67
+ * constructor for YawPitchRollAngles with angles in radians.
68
+ * @param yawRadians counterclockwise rotation angle (in radians) around z
69
+ * @param pitchRadians **clockwise** rotation angle (in radians) around y
70
+ * @param rollRadians counterclockwise rotation angle (in radians) around x
71
+ * */
54
72
  static createRadians(yawRadians: number, pitchRadians: number, rollRadians: number): YawPitchRollAngles;
55
73
  /** construct a `YawPitchRoll` object from an object with 3 named angles */
56
74
  static fromJSON(json?: YawPitchRollProps): YawPitchRollAngles;
57
75
  /** populate yaw, pitch and roll fields using `Angle.fromJSON` */
58
76
  setFromJSON(json?: YawPitchRollProps): void;
59
- /** Convert to a JSON object of form { pitch: 20 , roll: 29.999999999999996 , yaw: 10 }. Any values that are exactly zero (with tolerance `Geometry.smallAngleRadians`) are omitted. */
77
+ /**
78
+ * Convert to a JSON object of form { pitch: 20 , roll: 30 , yaw: 10 }. Angles are in degrees.
79
+ * Any values that are exactly zero (with tolerance `Geometry.smallAngleRadians`) are omitted.
80
+ **/
60
81
  toJSON(): YawPitchRollProps;
61
82
  /**
62
83
  * Install all rotations from `other` into `this`.
@@ -64,7 +85,7 @@ export declare class YawPitchRollAngles {
64
85
  */
65
86
  setFrom(other: YawPitchRollAngles): void;
66
87
  /**
67
- * * Compare angles between `this` and `other`.
88
+ * Compare angles between `this` and `other`.
68
89
  * * Comparisons are via `isAlmostEqualAllowPeriodShift`.
69
90
  * @param other YawPitchRollAngles source
70
91
  */
@@ -76,35 +97,38 @@ export declare class YawPitchRollAngles {
76
97
  /**
77
98
  * Expand the angles into a (rigid rotation) matrix.
78
99
  *
79
- * * The returned matrix is "rigid" -- unit length rows and columns, and its transpose is its inverse.
80
- * * The "rigid" matrix is always a right handed coordinate system.
100
+ * * The returned matrix is "rigid" (i.e., it has unit length rows and columns, and its transpose is its inverse).
101
+ * * The rigid matrix is always a right handed coordinate system.
81
102
  * @param result optional pre-allocated `Matrix3d`
82
103
  */
83
104
  toMatrix3d(result?: Matrix3d): Matrix3d;
84
- /** Return the largest angle in radians */
85
- maxAbsRadians(): number;
86
- /** Return the sum of the angles in squared radians */
87
- sumSquaredRadians(): number;
88
105
  /** Returns true if this rotation does nothing.
89
106
  * * If allowPeriodShift is false, any nonzero angle is considered a non-identity
90
107
  * * If allowPeriodShift is true, all angles are individually allowed to be any multiple of 360 degrees.
91
108
  */
92
109
  isIdentity(allowPeriodShift?: boolean): boolean;
110
+ /** Return the largest angle in radians */
111
+ maxAbsRadians(): number;
112
+ /** Return the sum of the angles in squared radians */
113
+ sumSquaredRadians(): number;
93
114
  /** Return the largest difference of angles (in radians) between this and other */
94
115
  maxDiffRadians(other: YawPitchRollAngles): number;
95
116
  /** Return the largest angle in degrees. */
96
117
  maxAbsDegrees(): number;
97
118
  /** Return the sum of squared angles in degrees. */
98
119
  sumSquaredDegrees(): number;
120
+ /** Return the largest difference of angles (in degrees) between this and other */
121
+ maxDiffDegrees(other: YawPitchRollAngles): number;
99
122
  /** Return an object from a Transform as an origin and YawPitchRollAngles. */
100
123
  static tryFromTransform(transform: Transform): {
101
124
  origin: Point3d;
102
125
  angles: YawPitchRollAngles | undefined;
103
126
  };
104
- /** Attempts to create a YawPitchRollAngles object from an Matrix3d
105
- * * This conversion fails if the matrix is not rigid (unit rows and columns, transpose is inverse)
127
+ /** Attempts to create a YawPitchRollAngles object from a Matrix3d
128
+ * * This conversion fails if the matrix is not rigid (unit rows and columns, and transpose is inverse)
106
129
  * * In the failure case the method's return value is `undefined`.
107
- * * In the failure case, if the optional result was supplied, that result will nonetheless be filled with a set of angles.
130
+ * * In the failure case, if the optional result was supplied, that result will nonetheless be filled with
131
+ * a set of angles.
108
132
  */
109
133
  static createFromMatrix3d(matrix: Matrix3d, result?: YawPitchRollAngles): YawPitchRollAngles | undefined;
110
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"YawPitchRollAngles.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/YawPitchRollAngles.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,yDAAyD;AACzD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,iBAAiB;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAkB;IAC7B,qBAAqB;IACd,GAAG,EAAE,KAAK,CAAC;IAClB,uBAAuB;IAChB,KAAK,EAAE,KAAK,CAAC;IACpB,sBAAsB;IACf,IAAI,EAAE,KAAK,CAAC;gBAEP,GAAG,GAAE,KAAoB,EAAE,KAAK,GAAE,KAAoB,EAAE,IAAI,GAAE,KAAoB;IAK9F,qCAAqC;IAC9B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAC/B,iEAAiE;WACnD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAG9G,iEAAiE;WACnD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAG9G,2EAA2E;WAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAIpE,iEAAiE;IAC1D,WAAW,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAMlD,uLAAuL;IAChL,MAAM,IAAI,iBAAiB;IAUlC;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,kBAAkB;IAKxC;;;;OAIG;IACI,aAAa,CAAC,KAAK,EAAE,kBAAkB;IAK9C;;OAEG;IACI,KAAK;IACZ;;;;;;OAMG;IACI,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ;IAcnC,0CAA0C;IACnC,aAAa,IAAI,MAAM;IAG9B,sDAAsD;IAC/C,iBAAiB,IAAI,MAAM;IAGlC;;;OAGG;IACI,UAAU,CAAC,gBAAgB,GAAE,OAAc,GAAG,OAAO;IAU5D,kFAAkF;IAC3E,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM;IAGxD,2CAA2C;IACpC,aAAa,IAAI,MAAM;IAC9B,mDAAmD;IAC5C,iBAAiB,IAAI,MAAM;IAClC,6EAA6E;WAC/D,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG;QACpD,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;KACxC;IAOD;;;;OAIG;WACW,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,SAAS;CAqChH"}
1
+ {"version":3,"file":"YawPitchRollAngles.d.ts","sourceRoot":"","sources":["../../../src/geometry3d/YawPitchRollAngles.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,kBAAkB;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,iBAAiB;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,kBAAkB;IAC7B,+DAA+D;IACxD,GAAG,EAAE,KAAK,CAAC;IAClB,6DAA6D;IACtD,KAAK,EAAE,KAAK,CAAC;IACpB,+DAA+D;IACxD,IAAI,EAAE,KAAK,CAAC;IACnB;;;;;SAKK;gBACO,GAAG,GAAE,KAAoB,EAAE,KAAK,GAAE,KAAoB,EAAE,IAAI,GAAE,KAAoB;IAK9F,qCAAqC;IAC9B,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IAM/B;;;;;SAKK;WACS,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAO9G;;;;;SAKK;WACS,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAO9G,2EAA2E;WAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,kBAAkB;IAQpE,iEAAiE;IAC1D,WAAW,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAMlD;;;QAGI;IACG,MAAM,IAAI,iBAAiB;IAUlC;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,kBAAkB;IAKxC;;;;OAIG;IACI,aAAa,CAAC,KAAK,EAAE,kBAAkB;IAK9C;;OAEG;IACI,KAAK;IAOZ;;;;;;OAMG;IACI,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ;IAqCnC;;;OAGG;IACI,UAAU,CAAC,gBAAgB,GAAE,OAAc,GAAG,OAAO;IAU5D,0CAA0C;IACnC,aAAa,IAAI,MAAM;IAG9B,sDAAsD;IAC/C,iBAAiB,IAAI,MAAM;IAGlC,kFAAkF;IAC3E,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM;IAOxD,2CAA2C;IACpC,aAAa,IAAI,MAAM;IAG9B,mDAAmD;IAC5C,iBAAiB,IAAI,MAAM;IAGlC,kFAAkF;IAC3E,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM;IAOxD,6EAA6E;WAC/D,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG;QACpD,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;KACxC;IAMD;;;;;OAKG;WACW,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,GAAG,SAAS;CA0EhH"}