@itwin/core-geometry 4.0.0-dev.7 → 4.0.0-dev.8

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 (53) hide show
  1. package/lib/cjs/Geometry.d.ts +3 -3
  2. package/lib/cjs/Geometry.d.ts.map +1 -1
  3. package/lib/cjs/Geometry.js +27 -11
  4. package/lib/cjs/Geometry.js.map +1 -1
  5. package/lib/cjs/curve/CurveCurve.d.ts +11 -8
  6. package/lib/cjs/curve/CurveCurve.d.ts.map +1 -1
  7. package/lib/cjs/curve/CurveCurve.js +16 -12
  8. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  9. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts +5 -1
  10. package/lib/cjs/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  11. package/lib/cjs/curve/CurveCurveIntersectXY.js +11 -10
  12. package/lib/cjs/curve/CurveCurveIntersectXY.js.map +1 -1
  13. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts +1 -0
  14. package/lib/cjs/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  15. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +3 -0
  16. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  17. package/lib/cjs/geometry3d/Matrix3d.d.ts +171 -118
  18. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  19. package/lib/cjs/geometry3d/Matrix3d.js +448 -417
  20. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  21. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
  22. package/lib/cjs/geometry3d/Point3dVector3d.js +1 -1
  23. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  24. package/lib/cjs/geometry3d/Segment1d.d.ts +1 -1
  25. package/lib/cjs/geometry3d/Segment1d.js +1 -1
  26. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  27. package/lib/esm/Geometry.d.ts +3 -3
  28. package/lib/esm/Geometry.d.ts.map +1 -1
  29. package/lib/esm/Geometry.js +27 -11
  30. package/lib/esm/Geometry.js.map +1 -1
  31. package/lib/esm/curve/CurveCurve.d.ts +11 -8
  32. package/lib/esm/curve/CurveCurve.d.ts.map +1 -1
  33. package/lib/esm/curve/CurveCurve.js +16 -12
  34. package/lib/esm/curve/CurveCurve.js.map +1 -1
  35. package/lib/esm/curve/CurveCurveIntersectXY.d.ts +5 -1
  36. package/lib/esm/curve/CurveCurveIntersectXY.d.ts.map +1 -1
  37. package/lib/esm/curve/CurveCurveIntersectXY.js +11 -10
  38. package/lib/esm/curve/CurveCurveIntersectXY.js.map +1 -1
  39. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts +1 -0
  40. package/lib/esm/geometry3d/CoincidentGeometryOps.d.ts.map +1 -1
  41. package/lib/esm/geometry3d/CoincidentGeometryOps.js +3 -0
  42. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  43. package/lib/esm/geometry3d/Matrix3d.d.ts +171 -118
  44. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  45. package/lib/esm/geometry3d/Matrix3d.js +448 -417
  46. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  47. package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
  48. package/lib/esm/geometry3d/Point3dVector3d.js +1 -1
  49. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  50. package/lib/esm/geometry3d/Segment1d.d.ts +1 -1
  51. package/lib/esm/geometry3d/Segment1d.js +1 -1
  52. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  53. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"Matrix3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Matrix3d.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAmB,QAAQ,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAO,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,sCAAsC;AACtC;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,UAAU,CAAC,IAAkB,EACzC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW;QACrC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC9C,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,oBAAoB,CAAC,CAAe,EAAE,CAAe,EAAE,MAAqB;QACxF,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,iBAAiB,CAAC,UAAU,CAAC,MAAM,EACjC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAA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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 { AxisIndex, AxisOrder, BeJSONFunctions, Geometry, StandardViewIndex } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Angle } from \"./Angle\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { Transform } from \"./Transform\";\r\nimport { Matrix3dProps, WritableXYAndZ, XAndY, XYAndZ } from \"./XYZProps\";\r\n\r\n/* eslint-disable @itwin/prefer-get */\r\n/**\r\n * PackedMatrix3dOps contains static methods for matrix operations where the matrix is a Float64Array.\r\n * * The Float64Array contains the matrix entries in row-major order\r\n * @internal\r\n * ```\r\n * equation\r\n * \\newcommand[1]\\mij{#1_{00}\\ #1_{01}\\ a_{02}}\r\n * ```\r\n */\r\nexport class PackedMatrix3dOps {\r\n /**\r\n * Load 9 doubles into the packed format.\r\n * @param dest destination, allocated by caller\r\n * @param a00 row 0, column 0 entry\r\n * @param a01 row 0, column 1 entry\r\n * @param a02 row 0, column 2 entry\r\n * @param a10 row 1, column 0 entry\r\n * @param a11 row 1, column 1 entry\r\n * @param a12 row 1, column 2 entry\r\n * @param a20 row 2, column 0 entry\r\n * @param a21 row 2, column 1 entry\r\n * @param a22 row 2, column 2 entry\r\n */\r\n public static loadMatrix(dest: Float64Array,\r\n a00: number, a01: number, a02: number,\r\n a10: number, a11: number, a12: number,\r\n a20: number, a21: number, a22: number) {\r\n dest[0] = a00; dest[1] = a01; dest[2] = a02;\r\n dest[3] = a10; dest[4] = a11; dest[5] = a12;\r\n dest[6] = a20; dest[7] = a21; dest[8] = a22;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `a*b`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[1] * b[3] + a[2] * b[6]),\r\n (a[0] * b[1] + a[1] * b[4] + a[2] * b[7]),\r\n (a[0] * b[2] + a[1] * b[5] + a[2] * b[8]),\r\n (a[3] * b[0] + a[4] * b[3] + a[5] * b[6]),\r\n (a[3] * b[1] + a[4] * b[4] + a[5] * b[7]),\r\n (a[3] * b[2] + a[4] * b[5] + a[5] * b[8]),\r\n (a[6] * b[0] + a[7] * b[3] + a[8] * b[6]),\r\n (a[6] * b[1] + a[7] * b[4] + a[8] * b[7]),\r\n (a[6] * b[2] + a[7] * b[5] + a[8] * b[8]));\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `a*bTranspose`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixMatrixTranspose(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]),\r\n (a[0] * b[3] + a[1] * b[4] + a[2] * b[5]),\r\n (a[0] * b[6] + a[1] * b[7] + a[2] * b[8]),\r\n (a[3] * b[0] + a[4] * b[1] + a[5] * b[2]),\r\n (a[3] * b[3] + a[4] * b[4] + a[5] * b[5]),\r\n (a[3] * b[6] + a[4] * b[7] + a[5] * b[8]),\r\n (a[6] * b[0] + a[7] * b[1] + a[8] * b[2]),\r\n (a[6] * b[3] + a[7] * b[4] + a[8] * b[5]),\r\n (a[6] * b[6] + a[7] * b[7] + a[8] * b[8]));\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `aTranspose*b`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixTransposeMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[3] * b[3] + a[6] * b[6]),\r\n (a[0] * b[1] + a[3] * b[4] + a[6] * b[7]),\r\n (a[0] * b[2] + a[3] * b[5] + a[6] * b[8]),\r\n (a[1] * b[0] + a[4] * b[3] + a[7] * b[6]),\r\n (a[1] * b[1] + a[4] * b[4] + a[7] * b[7]),\r\n (a[1] * b[2] + a[4] * b[5] + a[7] * b[8]),\r\n (a[2] * b[0] + a[5] * b[3] + a[8] * b[6]),\r\n (a[2] * b[1] + a[5] * b[4] + a[8] * b[7]),\r\n (a[2] * b[2] + a[5] * b[5] + a[8] * b[8]));\r\n return result;\r\n }\r\n /** Transpose 3x3 matrix `a` in place */\r\n public static transposeInPlace(a: Float64Array) {\r\n let q = a[1]; a[1] = a[3]; a[3] = q;\r\n q = a[2]; a[2] = a[6]; a[6] = q;\r\n q = a[5]; a[5] = a[7]; a[7] = q;\r\n }\r\n /**\r\n * Returns the transpose of 3x3 matrix `a`\r\n * * If `dest` is passed as argument, then the function copies the transpose of 3x3 matrix `a` into `dest`\r\n * * `a` is not changed unless also passed as the dest, i.e., copyTransposed(a,a) transposes `a` in place\r\n */\r\n public static copyTransposed(a: Float64Array, dest?: Float64Array): Float64Array {\r\n if (dest === a) {\r\n PackedMatrix3dOps.transposeInPlace(dest);\r\n } else {\r\n if (!dest)\r\n dest = new Float64Array(9);\r\n dest[0] = a[0]; dest[1] = a[3]; dest[2] = a[6];\r\n dest[3] = a[1]; dest[4] = a[4]; dest[5] = a[7];\r\n dest[6] = a[2]; dest[7] = a[5]; dest[8] = a[8];\r\n }\r\n return dest;\r\n }\r\n /** Copy matrix `a` entries into `dest` */\r\n public static copy(a: Float64Array, dest: Float64Array): Float64Array {\r\n if (dest !== a) {\r\n dest[0] = a[0]; dest[1] = a[1]; dest[2] = a[2];\r\n dest[3] = a[3]; dest[4] = a[4]; dest[5] = a[5];\r\n dest[6] = a[6]; dest[7] = a[7]; dest[8] = a[8];\r\n }\r\n return dest;\r\n }\r\n}\r\n\r\n/** A Matrix3d is tagged indicating one of the following states:\r\n * * unknown: it is not know if the matrix is invertible.\r\n * * inverseStored: the matrix has its inverse stored.\r\n * * singular: the matrix is known to be singular.\r\n * @public\r\n */\r\nexport enum InverseMatrixState {\r\n /**\r\n * The invertibility of the `coffs` array has not been determined.\r\n * Any `inverseCoffs` contents are random.\r\n */\r\n unknown,\r\n /**\r\n * An inverse was computed and stored as the `inverseCoffs`\r\n */\r\n inverseStored,\r\n /**\r\n * The `coffs` array is known to be singular.\r\n * Any `inverseCoffs` contents are random.\r\n */\r\n singular,\r\n}\r\n\r\n/** A Matrix3d is a 3x3 matrix.\r\n * * A very common use is to hold a rigid body rotation (which has no scaling or skew), but the 3x3 contents can\r\n * also hold scaling and skewing.\r\n * * The matrix with 2-dimensional layout (note: a 2d array can be shown by a matrix)\r\n * ```\r\n * equation\r\n * \\matrixXY{A}\r\n * ```\r\n * is stored as 9 numbers in \"row-major\" order in a `Float64Array`, viz\r\n * ```\r\n * equation\r\n * \\rowMajorMatrixXY{A}\r\n * ```\r\n * * If the matrix inverse is known it is stored in the inverseCoffs array.\r\n * * The inverse status (`unknown`, `inverseStored`, `singular`) status is indicated by the `inverseState` property.\r\n * * Construction methods that are able to trivially construct the inverse, store it immediately and note that in\r\n * the inverseState.\r\n * * Constructions (e.g. createRowValues) for which the inverse is not immediately known mark the inverseState as\r\n * unknown.\r\n * * Later queries for the inverse, trigger full computation if needed at that time.\r\n * * Most matrix queries are present with both \"column\" and \"row\" variants.\r\n * * Usage elsewhere in the library is typically \"column\" based. For example, in a Transform that carries a\r\n * coordinate frame, the matrix columns are the unit vectors for the axes.\r\n * @public\r\n */\r\nexport class Matrix3d implements BeJSONFunctions {\r\n /** Control flag for whether this class uses cached inverse of matrices. */\r\n public static useCachedInverse = true; // cached inverse can be suppressed for testing.\r\n /** Total number of times a cached inverse was used to avoid recompute */\r\n public static numUseCache = 0;\r\n /** Total number of times a cached inverse was computed. */\r\n public static numComputeCache = 0;\r\n /**\r\n * Matrix contents as a flat array of numbers in row-major order.\r\n * ```\r\n * equation\r\n * \\mxy{B}\r\n * \\mij{B}\r\n * ```\r\n * * DO NOT directly modify this array. It will destroy safety of the cached inverse state.\r\n */\r\n public coffs: Float64Array;\r\n /**\r\n * Matrix inverse contents.\r\n * ```\r\n * equation\r\n * \\mxy{A}\r\n * ```\r\n * * DO NOT directly modify this array. It will destroy integrity of the cached inverse state.\r\n */\r\n public inverseCoffs: Float64Array | undefined;\r\n /** Indicates if inverse is unknown, available, or known singular */\r\n public inverseState: InverseMatrixState;\r\n private static _identity: Matrix3d;\r\n /** The identity Matrix3d. Value is frozen and cannot be modified. */\r\n public static get identity(): Matrix3d {\r\n if (undefined === this._identity) {\r\n this._identity = Matrix3d.createIdentity();\r\n this._identity.freeze();\r\n }\r\n\r\n return this._identity;\r\n }\r\n /** Freeze this Matrix3d. */\r\n public freeze(): Readonly<this> {\r\n this.computeCachedInverse(true);\r\n /*\r\n hm.. can't freeze the Float64Arrays..\r\n Object.freeze(this.coffs);\r\n if (this.inverseCoffs)\r\n Object.freeze(this.inverseCoffs);\r\n */\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Constructor\r\n * @param coffs optional coefficient array.\r\n * * **WARNING:** coffs is captured (i.e., is now owned by the Matrix3d object and can be modified by it).\r\n */\r\n public constructor(coffs?: Float64Array) {\r\n this.coffs = coffs ? coffs : new Float64Array(9);\r\n this.inverseCoffs = undefined;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /**\r\n * Return a json object containing the 9 numeric entries as a single array in row major order,\r\n * `[ [1, 2, 3],[ 4, 5, 6], [7, 8, 9] ]`\r\n */\r\n public toJSON(): Matrix3dProps {\r\n return [[this.coffs[0], this.coffs[1], this.coffs[2]],\r\n [this.coffs[3], this.coffs[4], this.coffs[5]],\r\n [this.coffs[6], this.coffs[7], this.coffs[8]]];\r\n }\r\n /**\r\n * Copy data from various input forms to this matrix.\r\n * The source can be:\r\n * * Another `Matrix3d`\r\n * * An array of 3 arrays, each of which has the 3 numbers for a row of the matrix.\r\n * * An array of 4 or 9 numbers in row major order.\r\n * * **WARNING:** if json is an array of numbers but size is not 4 or 9, the matrix is set to zeros.\r\n */\r\n public setFromJSON(json?: Matrix3dProps | Matrix3d): void {\r\n this.inverseCoffs = undefined;\r\n // if no json is passed\r\n if (!json) {\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n return;\r\n }\r\n // if json is Matrix3d\r\n if (!Array.isArray(json)) {\r\n if (json instanceof Matrix3d)\r\n this.setFrom(json);\r\n return;\r\n }\r\n // if json is Matrix3dProps and is an array of arrays\r\n if (Geometry.isArrayOfNumberArray(json, 3, 3)) {\r\n const data = json as number[][];\r\n this.setRowValues(\r\n data[0][0], data[0][1], data[0][2],\r\n data[1][0], data[1][1], data[1][2],\r\n data[2][0], data[2][1], data[2][2]);\r\n return;\r\n }\r\n // if json is Matrix3dProps and is an array of numbers\r\n if (json.length === 9) {\r\n const data = json as number[];\r\n this.setRowValues(\r\n data[0], data[1], data[2],\r\n data[3], data[4], data[5],\r\n data[6], data[7], data[8]);\r\n return;\r\n } else if (json.length === 4) {\r\n const data = json as number[];\r\n this.setRowValues(\r\n data[0], data[1], 0,\r\n data[2], data[3], 0,\r\n 0, 0, 1);\r\n return;\r\n }\r\n // if json is Matrix3dProps but is not the right size\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n return;\r\n }\r\n /** Return a new Matrix3d constructed from contents of the json value. See `setFromJSON` for layout rules */\r\n public static fromJSON(json?: Matrix3dProps): Matrix3d {\r\n const result = Matrix3d.createIdentity();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /**\r\n * Test if `this` and `other` are within tolerance in all numeric entries.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqual(other: Matrix3d, tol?: number): boolean {\r\n return Geometry.isDistanceWithinTol(this.maxDiff(other), tol);\r\n }\r\n /**\r\n * Test if `this` and `other` are within tolerance in the column entries specified by `columnIndex`.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualColumn(columnIndex: AxisIndex, other: Matrix3d, tol?: number): boolean {\r\n const max = Geometry.maxAbsXYZ(\r\n this.coffs[columnIndex] - other.coffs[columnIndex],\r\n this.coffs[columnIndex + 3] - other.coffs[columnIndex + 3],\r\n this.coffs[columnIndex + 6] - other.coffs[columnIndex + 6]);\r\n return Geometry.isDistanceWithinTol(max, tol);\r\n }\r\n /**\r\n * Test if column (specified by `columnIndex`) entries of `this` and [ax,ay,az] are within tolerance.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualColumnXYZ(columnIndex: AxisIndex, ax: number, ay: number, az: number, tol?: number): boolean {\r\n const max = Geometry.maxAbsXYZ(\r\n this.coffs[columnIndex] - ax,\r\n this.coffs[columnIndex + 3] - ay,\r\n this.coffs[columnIndex + 6] - az);\r\n return Geometry.isDistanceWithinTol(max, tol);\r\n }\r\n /**\r\n * Test if `this` and `other` have almost equal Z column and have X and Y columns differing only by a\r\n * rotation of the same angle around that Z.\r\n * * **WARNING:** X and Y columns have to be perpendicular to Z column in both `this` and `other`.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualAllowZRotation(other: Matrix3d, tol?: number): boolean {\r\n if (this.isAlmostEqual(other, tol))\r\n return true;\r\n if (this.isAlmostEqualColumn(AxisIndex.Z, other, tol)) {\r\n const radians = Angle.radiansBetweenVectorsXYZ(\r\n this.coffs[0], this.coffs[3], this.coffs[6],\r\n other.coffs[0], other.coffs[3], other.coffs[6]\r\n );\r\n const angle = Angle.createRadians(radians); // angle between X columns in `this` and `other`\r\n const columnX = this.columnX();\r\n const columnY = this.columnY();\r\n const columnZ = this.columnZ();\r\n /**\r\n * Here we rotate this.columnX() around this.columnZ() by \"angle\" and expect to get other.columnX().\r\n * Then we rotate this.columnY() around this.columnZ() by the same \"angle\" and if we get other.columnY(),\r\n * that means this` and `other` have X and Y columns differing only by a rotation around that Z.\r\n */\r\n let column = Vector3d.createRotateVectorAroundVector(columnX, columnZ, angle)!;\r\n if (other.isAlmostEqualColumnXYZ(0, column.x, column.y, column.z, tol)) {\r\n column = Vector3d.createRotateVectorAroundVector(columnY, columnZ, angle)!;\r\n return other.isAlmostEqualColumnXYZ(1, column.x, column.y, column.z, tol);\r\n }\r\n }\r\n return false;\r\n }\r\n /** Test for exact (bitwise) equality with other. */\r\n public isExactEqual(other: Matrix3d): boolean {\r\n return this.maxDiff(other) === 0.0;\r\n }\r\n /** test if all entries in the z row and column are exact 001, i.e. the matrix only acts in 2d */\r\n public get isXY(): boolean {\r\n return this.coffs[2] === 0.0\r\n && this.coffs[5] === 0.0\r\n && this.coffs[6] === 0.0\r\n && this.coffs[7] === 0.0\r\n && this.coffs[8] === 1.0;\r\n }\r\n /**\r\n * If result is not provided, then the method returns a new (zeroed) matrix; otherwise the result is\r\n * not zeroed first and is just returned as-is.\r\n */\r\n private static _create(result?: Matrix3d): Matrix3d {\r\n return result ? result : new Matrix3d();\r\n }\r\n /**\r\n * Returns a Matrix3d populated by numeric values given in row-major order.\r\n * Sets all entries in the matrix from call parameters appearing in row-major order, i.e.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}a_{xx}\\ a_{xy}\\ a_{xz}\\\\ a_{yx}\\ a_{yy}\\ a_{yz}\\\\ a_{zx}\\ a_{zy}\\ a_{zz}\\end{bmatrix}\r\n * ```\r\n * @param axx Row x, column x(0, 0) entry\r\n * @param axy Row x, column y(0, 1) entry\r\n * @param axz Row x, column z(0, 2) entry\r\n * @param ayx Row y, column x(1, 0) entry\r\n * @param ayy Row y, column y(1, 1) entry\r\n * @param ayz Row y, column z(1, 2) entry\r\n * @param azx Row z, column x(2, 0) entry\r\n * @param azy Row z, column y(2, 2) entry\r\n * @param azz row z, column z(2, 3) entry\r\n */\r\n public static createRowValues(\r\n axx: number, axy: number, axz: number,\r\n ayx: number, ayy: number, ayz: number,\r\n azx: number, azy: number, azz: number,\r\n result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.inverseState = InverseMatrixState.unknown;\r\n result.coffs[0] = axx; result.coffs[1] = axy; result.coffs[2] = axz;\r\n result.coffs[3] = ayx; result.coffs[4] = ayy; result.coffs[5] = ayz;\r\n result.coffs[6] = azx; result.coffs[7] = azy; result.coffs[8] = azz;\r\n return result;\r\n }\r\n /**\r\n * Create a Matrix3d with caller-supplied coefficients and optional inverse coefficients.\r\n * * The inputs are captured into (i.e., owned by) the new Matrix3d.\r\n * * The caller is responsible for validity of the inverse coefficients.\r\n * @param coffs (required) array of 9 coefficients.\r\n * @param inverseCoffs (optional) array of 9 coefficients.\r\n * @returns a Matrix3d populated by a coffs array.\r\n */\r\n public static createCapture(coffs: Float64Array, inverseCoffs?: Float64Array): Matrix3d {\r\n const result = new Matrix3d(coffs);\r\n if (inverseCoffs) {\r\n result.inverseCoffs = inverseCoffs;\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n } else {\r\n result.inverseState = InverseMatrixState.unknown;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a matrix by distributing vectors to columns in one of 6 orders.\r\n * @param axisOrder identifies where the columns are placed.\r\n * @param columnA vector to place in the column specified by first letter in the AxisOrder name.\r\n * @param columnB vector to place in the column specified by second letter in the AxisOrder name.\r\n * @param columnC vector to place in the column specified by third letter in the AxisOrder name.\r\n * @param result optional result matrix3d\r\n * * Example: If you pass AxisOrder.YZX, then result will be [columnC, columnA, columnB] because\r\n * first letter Y means columnA should go to the second column, second letter Z means columnB should\r\n * go to the third column, and third letter X means columnC should go to the first column.\r\n */\r\n public static createColumnsInAxisOrder(axisOrder: AxisOrder, columnA: Vector3d | undefined,\r\n columnB: Vector3d | undefined, columnC: Vector3d | undefined, result?: Matrix3d): Matrix3d {\r\n if (!result) result = new Matrix3d();\r\n if (axisOrder === AxisOrder.YZX) {\r\n result.setColumns(columnC, columnA, columnB);\r\n } else if (axisOrder === AxisOrder.ZXY) {\r\n result.setColumns(columnB, columnC, columnA);\r\n } else if (axisOrder === AxisOrder.XZY) {\r\n result.setColumns(columnA, columnC, columnB);\r\n } else if (axisOrder === AxisOrder.YXZ) {\r\n result.setColumns(columnB, columnA, columnC);\r\n } else if (axisOrder === AxisOrder.ZYX) {\r\n result.setColumns(columnC, columnB, columnA);\r\n } else { // AxisOrder.XYZ\r\n result.setColumns(columnA, columnB, columnC);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Copy the transpose of the coffs to the inverseCoffs.\r\n * * Mark the matrix as inverseStored.\r\n */\r\n private setupInverseTranspose() {\r\n const coffs = this.coffs;\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n this.inverseCoffs = Float64Array.from([\r\n coffs[0], coffs[3], coffs[6],\r\n coffs[1], coffs[4], coffs[7],\r\n coffs[2], coffs[5], coffs[8],\r\n ]);\r\n }\r\n /**\r\n * Set all entries in the matrix from call parameters appearing in row-major order.\r\n * @param axx Row x, column x (0,0) entry\r\n * @param axy Row x, column y (0,1) entry\r\n * @param axz Row x, column z (0,2) entry\r\n * @param ayx Row y, column x (1,0) entry\r\n * @param ayy Row y, column y (1,1) entry\r\n * @param ayz Row y, column z (1,2) entry\r\n * @param azx Row z, column x (2,0) entry\r\n * @param azy Row z, column y (2,2) entry\r\n * @param azz row z, column z (2,3) entry\r\n */\r\n public setRowValues(\r\n axx: number, axy: number, axz: number,\r\n ayx: number, ayy: number, ayz: number,\r\n azx: number, azy: number, azz: number): void {\r\n this.coffs[0] = axx; this.coffs[1] = axy; this.coffs[2] = axz;\r\n this.coffs[3] = ayx; this.coffs[4] = ayy; this.coffs[5] = ayz;\r\n this.coffs[6] = azx; this.coffs[7] = azy; this.coffs[8] = azz;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** Set the matrix to an identity. */\r\n public setIdentity() {\r\n this.setRowValues(1, 0, 0, 0, 1, 0, 0, 0, 1);\r\n this.setupInverseTranspose();\r\n }\r\n /** Set the matrix to all zeros. */\r\n public setZero() {\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n /** Copy contents from another matrix. */\r\n public setFrom(other: Matrix3d | undefined): void {\r\n if (other === undefined) {\r\n this.setIdentity();\r\n return;\r\n }\r\n if (other !== this) {\r\n for (let i = 0; i < 9; i++)\r\n this.coffs[i] = other.coffs[i];\r\n if (other.inverseState === InverseMatrixState.inverseStored && other.inverseCoffs !== undefined) {\r\n this.createInverseCoffsWithZeros();\r\n for (let i = 0; i < 9; i++)\r\n this.inverseCoffs![i] = other.inverseCoffs[i];\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n } else if (other.inverseState !== InverseMatrixState.inverseStored) {\r\n this.inverseState = other.inverseState;\r\n } else { // This is reached when other says stored but does not have coffs. This should not happen.\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n }\r\n }\r\n /**\r\n * Return a clone of this matrix.\r\n * * Coefficients are copied.\r\n * * Inverse coefficients and inverse status are copied if stored by `this`.\r\n */\r\n public clone(result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.setFrom(this);\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with all zeros.\r\n * * Note that for geometry transformations \"all zeros\" is not a useful default state.\r\n * * Hence, almost always use `createIdentity` for graphics transformations.\r\n * * \"All zeros\" is appropriate for summing moment data.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}0 & 0 & 0 \\\\ 0 & 0 & 0 \\\\ 0 & 0 & 0\\end{bmatrix}\r\n * ```\r\n */\r\n public static createZero(): Matrix3d {\r\n const retVal = new Matrix3d();\r\n retVal.inverseState = InverseMatrixState.singular;\r\n return retVal;\r\n }\r\n /**\r\n * Create an identity matrix.\r\n * * All diagonal entries (xx,yy,zz) are one\r\n * * All others are zero.\r\n * * This (rather than \"all zeros\") is the useful state for most graphics transformations.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1\\end{bmatrix}\r\n * ```\r\n *\r\n */\r\n public static createIdentity(result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.setIdentity();\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with distinct x,y,z diagonal (scale) entries.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}s_x & 0 & 0 \\\\ 0 & s_y & 0\\\\ 0 & 0 & s_z\\end{bmatrix}\r\n * ```\r\n */\r\n public static createScale(scaleFactorX: number, scaleFactorY: number, scaleFactorZ: number,\r\n result?: Matrix3d): Matrix3d {\r\n if (result)\r\n result.setZero();\r\n else\r\n result = new Matrix3d();\r\n\r\n result.coffs[0] = scaleFactorX;\r\n result.coffs[4] = scaleFactorY;\r\n result.coffs[8] = scaleFactorZ;\r\n if (scaleFactorX === 0 || scaleFactorY === 0 || scaleFactorZ === 0) {\r\n result.inverseState = InverseMatrixState.singular;\r\n } else {\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n result.inverseCoffs = Float64Array.from(\r\n [1 / scaleFactorX, 0, 0,\r\n 0, 1 / scaleFactorY, 0,\r\n 0, 0, 1 / scaleFactorZ]\r\n );\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with uniform scale factors for scale factor \"s\"\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}s & 0 & 0 \\\\ 0 & s & 0\\\\ 0 & 0 & s\\end{bmatrix}\r\n * ```\r\n */\r\n public static createUniformScale(scaleFactor: number): Matrix3d {\r\n return Matrix3d.createScale(scaleFactor, scaleFactor, scaleFactor);\r\n }\r\n /**\r\n * Return a vector that is perpendicular to the input `vectorA`.\r\n * * Among the infinite number of perpendiculars possible, this method favors having one in the xy plane.\r\n * * Hence, when `vectorA` is close to the Z axis, the returned vector is `vectorA cross -unitY`\r\n * but when `vectorA` is NOT close to the Z axis, the returned vector is `unitZ cross vectorA`.\r\n */\r\n public static createPerpendicularVectorFavorXYPlane(vectorA: Vector3d, result?: Vector3d): Vector3d {\r\n const a = vectorA.magnitude();\r\n const scale = 64.0; // A constant from the dawn of time in the CAD industry\r\n const b = a / scale;\r\n // if vectorA is close to the Z axis\r\n if (Math.abs(vectorA.x) < b && Math.abs(vectorA.y) < b) {\r\n return Vector3d.createCrossProduct(vectorA.x, vectorA.y, vectorA.z, 0, -1, 0, result);\r\n }\r\n // if vectorA is NOT close to the Z axis\r\n return Vector3d.createCrossProduct(0, 0, 1, vectorA.x, vectorA.y, vectorA.z, result);\r\n }\r\n /**\r\n * Return a vector that is perpendicular to the input `vectorA`.\r\n * * Among the infinite number of perpendiculars possible, this method favors having one near the plane\r\n * containing Z.\r\n * That is achieved by cross product of `this` vector with the result of createPerpendicularVectorFavorXYPlane.\r\n */\r\n public static createPerpendicularVectorFavorPlaneContainingZ(vectorA: Vector3d, result?: Vector3d): Vector3d {\r\n /**\r\n * vectorA, result (below), and \"vectorA cross result\" form a coordinate system where \"result\" is located on\r\n * the XY-plane. Once you've got a coordinate system with an axis in the XY-plane, your other two axes form\r\n * a plane that includes the z-axis.\r\n */\r\n result = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA, result);\r\n return vectorA.crossProduct(result, result);\r\n }\r\n /**\r\n * Create a matrix from column vectors, shuffled into place per axisOrder\r\n * For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]\r\n * Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because\r\n * Y is at index 0 so vectorU goes to the column Y (column 2), Z is at index 1 so vectorV goes\r\n * to the column Z (column 3), and X is at index 2 so vectorW goes to the column X (column 1)\r\n */\r\n public static createShuffledColumns(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d,\r\n axisOrder: AxisOrder, result?: Matrix3d): Matrix3d {\r\n const target = Matrix3d._create(result);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 0), vectorU);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 1), vectorV);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 2), vectorW);\r\n return target;\r\n }\r\n /**\r\n * Create a new orthogonal matrix (perpendicular columns, unit length, transpose is inverse).\r\n * * `vectorA1 = Normalized vectorA` is placed in the column specified by **first** letter in\r\n * the AxisOrder name.\r\n * * Normalized `vectorC1 = vectorA1 cross vectorB` is placed in the column specified by **third**\r\n * letter in the AxisOrder name.\r\n * * Normalized `vectorC1 cross vectorA` is placed in the column specified by **second**\r\n * letter in the AxisOrder name.\r\n * * This function internally uses createShuffledColumns.\r\n */\r\n public static createRigidFromColumns(vectorA: Vector3d, vectorB: Vector3d, axisOrder: AxisOrder,\r\n result?: Matrix3d): Matrix3d | undefined {\r\n const vectorA1 = vectorA.normalize();\r\n if (vectorA1) {\r\n const vectorC1 = vectorA1.unitCrossProduct(vectorB);\r\n if (vectorC1) {\r\n const vectorB1 = vectorC1.unitCrossProduct(vectorA);\r\n if (vectorB1) {\r\n const retVal = Matrix3d.createShuffledColumns(vectorA1, vectorB1, vectorC1, axisOrder, result);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a rigid matrix using vectorA and its 2 perpendicular.\r\n * * This function internally uses createPerpendicularVectorFavorXYPlane and createRigidFromColumns.\r\n */\r\n public static createRigidHeadsUp(vectorA: Vector3d, axisOrder: AxisOrder = AxisOrder.ZXY,\r\n result?: Matrix3d): Matrix3d {\r\n const vectorB = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA);\r\n const matrix = Matrix3d.createRigidFromColumns(vectorA, vectorB, axisOrder, result);\r\n if (matrix) {\r\n matrix.setupInverseTranspose();\r\n return matrix;\r\n }\r\n return Matrix3d.createIdentity(result);\r\n }\r\n /** Return the matrix for rotation of `angle` around `axis` */\r\n public static createRotationAroundVector(axis: Vector3d, angle: Angle, result?: Matrix3d): Matrix3d | undefined {\r\n // Rodriguez formula (matrix form), https://mathworld.wolfram.com/RodriguesRotationFormula.html\r\n const c = angle.cos();\r\n const s = angle.sin();\r\n const v = 1.0 - c;\r\n const unit = axis.normalize();\r\n if (unit) {\r\n const retVal = Matrix3d.createRowValues(\r\n unit.x * unit.x * v + c, unit.x * unit.y * v - s * unit.z, unit.x * unit.z * v + s * unit.y,\r\n unit.y * unit.x * v + s * unit.z, unit.y * unit.y * v + c, unit.y * unit.z * v - s * unit.x,\r\n unit.z * unit.x * v - s * unit.y, unit.z * unit.y * v + s * unit.x, unit.z * unit.z * v + c,\r\n result\r\n );\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n return undefined;\r\n }\r\n /** Returns a rotation of specified angle around an axis\r\n * @param axisIndex index of axis (AxisIndex.X, AxisIndex.Y, AxisIndex.Z) kept fixed by the rotation.\r\n * @param angle angle of rotation\r\n * @param result optional result matrix.\r\n * * Math details of 3d rotation matrices derivation can be found at docs/learning/geometry/Angle.md\r\n */\r\n public static createRotationAroundAxisIndex(axisIndex: AxisIndex, angle: Angle, result?: Matrix3d): Matrix3d {\r\n const c = angle.cos();\r\n const s = angle.sin();\r\n let myResult;\r\n if (axisIndex === AxisIndex.X) {\r\n myResult = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, c, -s,\r\n 0, s, c,\r\n result);\r\n } else if (axisIndex === AxisIndex.Y) {\r\n myResult = Matrix3d.createRowValues(\r\n c, 0, s,\r\n 0, 1, 0,\r\n -s, 0, c,\r\n result);\r\n } else {\r\n myResult = Matrix3d.createRowValues(\r\n c, -s, 0,\r\n s, c, 0,\r\n 0, 0, 1,\r\n result);\r\n }\r\n myResult.setupInverseTranspose();\r\n return myResult;\r\n }\r\n /**\r\n * Replace current columns Ui and Uj with (c*Ui - s*Uj) and (c*Uj + s*Ui).\r\n * * There is no checking for i,j being 0,1,2.\r\n * * This is used in compute intensive inner loops\r\n * @param i first row index. **must be 0,1,2** (unchecked)\r\n * @param j second row index. **must be 0,1,2** (unchecked)\r\n * @param c fist coefficient\r\n * @param s second coefficient\r\n */\r\n public applyGivensColumnOp(i: number, j: number, c: number, s: number): void {\r\n const limit = i + 9;\r\n for (; i < limit; i += 3, j += 3) {\r\n const a = this.coffs[i];\r\n const b = this.coffs[j];\r\n this.coffs[i] = a * c + b * s;\r\n this.coffs[j] = -a * s + b * c;\r\n }\r\n }\r\n /**\r\n * Create a matrix from column vectors.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ U_z & V_z & W_z \\end{bmatrix}\r\n * ```\r\n */\r\n public static createColumns(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n vectorU.z, vectorV.z, vectorW.z,\r\n result\r\n );\r\n }\r\n /** Create a matrix with each column's _x,y_ parts given `XAndY` and separate numeric z values.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ u & v & w \\end{bmatrix}\r\n * ```\r\n */\r\n public static createColumnsXYW(vectorU: XAndY, u: number, vectorV: XAndY, v: number,\r\n vectorW: XAndY, w: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n u, v, w,\r\n result\r\n );\r\n }\r\n /** Create a matrix from \"as viewed\" right and up vectors.\r\n * * ColumnX points in the rightVector direction\r\n * * ColumnY points in the upVector direction\r\n * * ColumnZ is a unit cross product of ColumnX and ColumnY.\r\n * * Optionally rotate the standard cube by 45 degrees ccw around Y to bring its left or right vertical edge to center.\r\n * * Optionally rotate the standard cube by 35.264 degrees ccw around X (isometric rotation).\r\n * * This is expected to be used with various principal unit vectors that are perpendicular to each other.\r\n * * STANDARD TOP VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(), 0, 0)\r\n * * STANDARD FRONT VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD BACK VIEW: createViewedAxes(Vector3d.unitX(-1), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD RIGHT VIEW: createViewedAxes(Vector3d.unitY(), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD LEFT VIEW: createViewedAxes(Vector3d.unitY(-1), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD BOTTOM VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(-1), 0, 0)\r\n * * Note: createViewedAxes is column-based so always returns local to world\r\n *\r\n * @param rightVector ColumnX of the returned matrix. Expected to be perpendicular to upVector.\r\n * @param upVector ColumnY of the returned matrix. Expected to be perpendicular to rightVector.\r\n * @param leftNoneRight Specifies the ccw rotation around Y axis. Normally one of \"-1\", \"0\", and \"1\", where\r\n * \"-1\" indicates rotation by 45 degrees to bring the left vertical edge to center, \"0\" means no rotation,\r\n * and \"1\" indicates rotation by 45 degrees to bring the right vertical edge to center. Other numbers are\r\n * used as multiplier for this 45 degree rotation.\r\n * @param topNoneBottom Specifies the ccw rotation around X axis. Normally one of \"-1\", \"0\", and \"1\", where\r\n * \"-1\" indicates isometric rotation (35.264 degrees) to bring the bottom upward, \"0\" means no rotation,\r\n * and \"1\" indicates isometric rotation (35.264 degrees) to bring the top downward. Other numbers are\r\n * used as multiplier for the 35.264 degree rotation.\r\n * @returns matrix = [rightVector, upVector, rightVector cross upVector] with the applied rotations specified\r\n * by leftNoneRight and topNoneBottom. Returns undefined if rightVector and upVector are parallel.\r\n */\r\n public static createViewedAxes(rightVector: Vector3d, upVector: Vector3d, leftNoneRight: number = 0,\r\n topNoneBottom: number = 0): Matrix3d | undefined {\r\n const columnZ = rightVector.crossProduct(upVector);\r\n if (columnZ.normalizeInPlace()) {\r\n // matrix = [rightVector, upVector, rightVector cross upVector]\r\n const matrix = Matrix3d.createColumns(rightVector, upVector, columnZ);\r\n // \"45 degrees * leftNoneRight\" rotation around Y\r\n if (leftNoneRight !== 0.0) {\r\n let c = Math.sqrt(0.5);\r\n let s = leftNoneRight < 0.0 ? -c : c;\r\n if (Math.abs(leftNoneRight) !== 1.0) {\r\n const radians = Angle.degreesToRadians(45.0 * leftNoneRight);\r\n c = Math.cos(radians);\r\n s = Math.sin(radians);\r\n }\r\n matrix.applyGivensColumnOp(2, 0, c, s); // rotate around Y (equivalent to matrix*rotationY)\r\n }\r\n // \"35.264 degrees * topNoneBottom\" rotation around X\r\n if (topNoneBottom !== 0.0) {\r\n const theta = topNoneBottom * Math.atan(Math.sqrt(0.5));\r\n const c = Math.cos(theta);\r\n const s = Math.sin(theta);\r\n matrix.applyGivensColumnOp(1, 2, c, -s); // rotate around X (equivalent to matrix*rotationX)\r\n }\r\n return matrix;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a rotation matrix for one of the 8 standard views.\r\n * * Default is TOP view (`local X = world X`, `local Y = world Y`, `local Z = world Z`).\r\n * * To change view from the TOP to one of the other 7 standard views, we need to multiply \"world data\" to\r\n * the corresponding matrix1 provided by `createStandardWorldToView(index, false)` and then\r\n * `matrix1.multiply(world data)` will returns \"local data\".\r\n * * To change view back to the TOP, we need to multiply \"local data\" to the corresponding matrix2 provided\r\n * by `createStandardWorldToView(index, true)` and then `matrix2.multiply(local data)` will returns \"world data\".\r\n *\r\n * @param index standard view index `StandardViewIndex.Top, Bottom, Left, Right, Front, Back, Iso, RightIso`\r\n * @param invert if false (default), the return matrix is world to local (view) and if true, the the return\r\n * matrix is local (view) to world.\r\n * @param result optional result.\r\n */\r\n public static createStandardWorldToView(index: StandardViewIndex, invert: boolean = false, result?: Matrix3d): Matrix3d {\r\n switch (index) {\r\n // start with TOP view, ccw rotation by 180 degrees around X\r\n case StandardViewIndex.Bottom:\r\n result = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, -1, 0,\r\n 0, 0, -1);\r\n break;\r\n // start with TOP view, ccw rotation by -90 degrees around X and by 90 degrees around Z\r\n case StandardViewIndex.Left:\r\n result = Matrix3d.createRowValues(\r\n 0, -1, 0,\r\n 0, 0, 1,\r\n -1, 0, 0);\r\n break;\r\n // start with TOP view, ccw rotation by -90 degrees around X and by -90 degrees around Z\r\n case StandardViewIndex.Right:\r\n result = Matrix3d.createRowValues(\r\n 0, 1, 0,\r\n 0, 0, 1,\r\n 1, 0, 0);\r\n break;\r\n // start with TOP view, ccw rotation by -90 degrees around X\r\n case StandardViewIndex.Front:\r\n result = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, 0, 1,\r\n 0, -1, 0);\r\n break;\r\n // start with TOP view, ccw rotation by -90 degrees around X and by 180 degrees around Z\r\n case StandardViewIndex.Back:\r\n result = Matrix3d.createRowValues(\r\n -1, 0, 0,\r\n 0, 0, 1,\r\n 0, 1, 0);\r\n break;\r\n case StandardViewIndex.Iso:\r\n // start with FRONT view, ccw rotation by -45 degrees around Y and by 35.264 degrees around X\r\n result = Matrix3d.createRowValues(\r\n 0.707106781186548, -0.70710678118654757, 0.00000000000000000,\r\n 0.408248290463863, 0.40824829046386302, 0.81649658092772603,\r\n -0.577350269189626, -0.57735026918962573, 0.57735026918962573);\r\n break;\r\n case StandardViewIndex.RightIso:\r\n result = Matrix3d.createRowValues(\r\n 0.707106781186548, 0.70710678118654757, 0.00000000000000000,\r\n -0.408248290463863, 0.40824829046386302, 0.81649658092772603,\r\n 0.577350269189626, -0.57735026918962573, 0.57735026918962573);\r\n break;\r\n case StandardViewIndex.Top: // no rotation\r\n default:\r\n result = Matrix3d.createIdentity(result);\r\n }\r\n if (invert)\r\n result.transposeInPlace();\r\n return result;\r\n }\r\n /*\r\n // this implementation has problems distinguishing failure (normalize) from small angle.\r\n public getAxisAndAngleOfRotation(): { axis: Vector3d, angle: Angle, error: boolean } {\r\n\r\n const result = { axis: Vector3d.unitZ(), angle: Angle.createRadians(0), error: true };\r\n if (this.isIdentity) {\r\n result.error = false;\r\n return result;\r\n }\r\n if (!this.isRigid())\r\n return result;\r\n const QMinusI = this.clone();\r\n QMinusI.coffs[0] -= 1.0;\r\n QMinusI.coffs[4] -= 1.0;\r\n QMinusI.coffs[8] -= 1.0;\r\n // Each column of (Q - I) is the motion of the corresponding axis vector\r\n // during the rotation.\r\n // Only one of the three axes can really be close to the rotation axis.\r\n const delta0 = QMinusI.columnX();\r\n const delta1 = QMinusI.columnY();\r\n const delta2 = QMinusI.columnZ();\r\n const cross01 = delta0.crossProduct(delta1);\r\n const cross12 = delta1.crossProduct(delta2);\r\n const cross20 = delta2.crossProduct(delta0);\r\n\r\n const aa01 = cross01.magnitudeSquared();\r\n const aa12 = cross12.magnitudeSquared();\r\n const aa20 = cross20.magnitudeSquared();\r\n\r\n const cross = cross01.clone(); // This will end up as the biggest cross product\r\n const v0 = delta0.clone(); // This will end up as one of the two largest delta vectors\r\n let aaMax = aa01;\r\n if (aa12 > aaMax) {\r\n cross.setFrom(cross12);\r\n aaMax = aa12;\r\n v0.setFrom(delta1);\r\n }\r\n if (aa20 > aaMax) {\r\n cross.setFrom(cross20);\r\n aaMax = aa20;\r\n v0.setFrom(delta2);\r\n }\r\n\r\n if (aaMax === 0.0) {\r\n // The vectors did not move. Just accept the zero rotation, with error flag set.\r\n return result;\r\n }\r\n\r\n v0.normalizeInPlace();\r\n // V0 is a unit vector perpendicular to the rotation axis.\r\n // Rotate it. Its image V1 is also a unit vector, and the angle from V0 to V1 is the quat angle.\r\n // CrossProduct is axis vector times sine of angle.\r\n // Dot Product is cosine of angle.\r\n // V2 is zero in 180 degree case, so we use the Cross from the search as the axis\r\n // as direction, being careful to keep sine positive.\r\n const v1 = this.multiplyVector(v0);\r\n const v2 = v0.crossProduct(v1);\r\n const sine = v2.magnitude();\r\n if (v2.dotProduct(cross) < 0.0)\r\n cross.scaleInPlace(-1.0);\r\n const cosine = v0.dotProduct(v1);\r\n result.angle.setRadians(Math.atan2(sine, cosine));\r\n result.axis.setFrom(cross);\r\n result.error = !result.axis.tryNormalizeInPlace();\r\n return result\r\n }\r\n*/\r\n /**\r\n * Compute the (unit vector) axis and angle of rotation.\r\n * @returns Returns axis and angle of rotation with result.ok === true when the conversion succeeded.\r\n */\r\n public getAxisAndAngleOfRotation(): { axis: Vector3d, angle: Angle, ok: boolean } {\r\n const trace = this.coffs[0] + this.coffs[4] + this.coffs[8];\r\n // trace = (xx + yy * zz) * (1-c) + 3 * c = 1 + 2c ==> c = (trace-1) / 2\r\n const skewXY = this.coffs[3] - this.coffs[1]; // == 2sz\r\n const skewYZ = this.coffs[7] - this.coffs[5]; // == 2sx\r\n const skewZX = this.coffs[2] - this.coffs[6]; // == 2sy\r\n const c = (trace - 1.0) / 2.0;\r\n const s = Geometry.hypotenuseXYZ(skewXY, skewYZ, skewZX) / 2.0;\r\n const e = c * c + s * s - 1.0;\r\n if (Math.abs(e) > Geometry.smallAngleRadians) {\r\n // the sine and cosine are not a unit circle point. bad matrix . ..\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n if (Math.abs(s) < Geometry.smallAngleRadians) {\r\n // There is no significant skew.\r\n // The matrix is symmetric\r\n // So it has simple eigenvalues -- either (1,1,1) or (1,-1,-1).\r\n if (c > 0) // no rotation\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: true };\r\n // 180 degree flip around some axis ?\r\n // Look for the simple case of a principal rotation ...\r\n // look for a pair of (-1) entries on the diagonal ...\r\n const axx = this.coffs[0];\r\n const ayy = this.coffs[4];\r\n const azz = this.coffs[8];\r\n const theta180 = Angle.createDegrees(180);\r\n // Look for principal axis flips as a special case . ..\r\n if (Geometry.isAlmostEqualNumber(-1.0, ayy) && Geometry.isAlmostEqualNumber(-1, azz)) {\r\n // rotate around\r\n return { axis: Vector3d.create(1, 0, 0), angle: theta180, ok: true };\r\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, azz)) {\r\n return { axis: Vector3d.create(0, 1, 0), angle: theta180, ok: true };\r\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, ayy)) {\r\n return { axis: Vector3d.create(0, 0, 1), angle: theta180, ok: true };\r\n }\r\n\r\n // 180 degree flip around some other axis ...\r\n // eigenvalues will have 1.0 once, -1.0 twice.\r\n // These cases look for each place (x,y,z) that the 1.0 might appear.\r\n // But fastSymmetricEigenvalues reliably always seems to put the 1.0 as the x eigenvalue.\r\n // so only the getColumn(0) return seems reachable in unit tests.\r\n const eigenvectors = Matrix3d.createIdentity();\r\n const eigenvalues = Vector3d.create(0, 0, 0);\r\n if (this.fastSymmetricEigenvalues(eigenvectors, eigenvalues)) {\r\n for (let axisIndex = 0; axisIndex < 2; axisIndex++) {\r\n const lambda = eigenvalues.at(axisIndex);\r\n if (Geometry.isAlmostEqualNumber(1, lambda))\r\n return { axis: eigenvectors.getColumn(axisIndex), angle: theta180, ok: true };\r\n }\r\n // Don't know if this can be reached ....\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n const a = 1.0 / (2.0 * s);\r\n const result = { axis: Vector3d.create(skewYZ * a, skewZX * a, skewXY * a), angle: Angle.createAtan2(s, c), ok: true };\r\n return result;\r\n }\r\n /**\r\n * Returns a matrix that rotates from vectorA to vectorB.\r\n */\r\n public static createRotationVectorToVector(vectorA: Vector3d, vectorB: Vector3d, result?: Matrix3d): Matrix3d | undefined {\r\n return this.createPartialRotationVectorToVector(vectorA, 1.0, vectorB, result);\r\n }\r\n /**\r\n * Return a matrix that rotates a fraction of the angular sweep from vectorA to vectorB.\r\n * @param vectorA initial vector position\r\n * @param fraction fractional rotation. 1.0 is \"all the way\"\r\n * @param vectorB final vector position\r\n * @param result optional result matrix.\r\n */\r\n public static createPartialRotationVectorToVector(vectorA: Vector3d, fraction: number, vectorB: Vector3d, result?: Matrix3d): Matrix3d | undefined {\r\n\r\n let upVector = vectorA.unitCrossProduct(vectorB);\r\n if (upVector) { // the usual case --\r\n return Matrix3d.createRotationAroundVector(upVector,\r\n Angle.createRadians(fraction * vectorA.planarAngleTo(vectorB, upVector).radians));\r\n }\r\n // fail if either vector is zero ...\r\n if (Geometry.isSmallMetricDistance(vectorA.magnitude())\r\n || Geometry.isSmallMetricDistance(vectorB.magnitude()))\r\n return undefined;\r\n // nonzero but aligned vectors ...\r\n if (vectorA.dotProduct(vectorB) > 0.0)\r\n return Matrix3d.createIdentity(result);\r\n // nonzero opposing vectors ..\r\n upVector = Matrix3d.createPerpendicularVectorFavorPlaneContainingZ(vectorA, upVector);\r\n return Matrix3d.createRotationAroundVector(upVector, Angle.createRadians(fraction * Math.PI));\r\n }\r\n\r\n /** Create a 90 degree rotation around a principal axis */\r\n public static create90DegreeRotationAroundAxis(axisIndex: number): Matrix3d {\r\n axisIndex = Geometry.cyclic3dAxis(axisIndex);\r\n if (axisIndex === 0) {\r\n const retVal = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, 0, -1,\r\n 0, 1, 0);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n } else if (axisIndex === 1) {\r\n const retVal = Matrix3d.createRowValues(\r\n 0, 0, 1,\r\n 0, 1, 0,\r\n -1, 0, 0);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n } else {\r\n const retVal = Matrix3d.createRowValues(\r\n 0, -1, 0,\r\n 1, 0, 0,\r\n 0, 0, 1);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n }\r\n /** Return (a copy of) the X column */\r\n public columnX(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[0], this.coffs[3], this.coffs[6], result); }\r\n /** Return (a copy of)the Y column */\r\n public columnY(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[1], this.coffs[4], this.coffs[7], result); }\r\n /** Return (a copy of)the Z column */\r\n public columnZ(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[2], this.coffs[5], this.coffs[8], result); }\r\n /** Return the X column magnitude squared */\r\n public columnXMagnitudeSquared(): number { return Geometry.hypotenuseSquaredXYZ(this.coffs[0], this.coffs[3], this.coffs[6]); }\r\n /** Return the Y column magnitude squared */\r\n public columnYMagnitudeSquared(): number { return Geometry.hypotenuseSquaredXYZ(this.coffs[1], this.coffs[4], this.coffs[7]); }\r\n /** Return the Z column magnitude squared */\r\n public columnZMagnitudeSquared(): number { return Geometry.hypotenuseSquaredXYZ(this.coffs[2], this.coffs[5], this.coffs[8]); }\r\n /** Return the X column magnitude */\r\n public columnXMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6]); }\r\n /** Return the Y column magnitude */\r\n public columnYMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7]); }\r\n /** Return the Z column magnitude */\r\n public columnZMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]); }\r\n /** Return magnitude of columnX cross columnY. */\r\n public columnXYCrossProductMagnitude(): number {\r\n return Geometry.crossProductMagnitude(\r\n this.coffs[0], this.coffs[3], this.coffs[6],\r\n this.coffs[1], this.coffs[4], this.coffs[7]);\r\n }\r\n /** Return the X row magnitude d */\r\n public rowXMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[1], this.coffs[2]); }\r\n /** Return the Y row magnitude */\r\n public rowYMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[3], this.coffs[4], this.coffs[5]); }\r\n /** Return the Z row magnitude */\r\n public rowZMagnitude(): number { return Geometry.hypotenuseXYZ(this.coffs[6], this.coffs[7], this.coffs[8]); }\r\n /** Return the dot product of column X with column Y */\r\n /** Return the dot product of column X with column Y */\r\n public columnXDotColumnY(): number {\r\n return this.coffs[0] * this.coffs[1]\r\n + this.coffs[3] * this.coffs[4]\r\n + this.coffs[6] * this.coffs[7];\r\n }\r\n /**\r\n * Dot product of an indexed column with a vector given as x,y,z\r\n * @param columnIndex index of column. Must be 0,1,2\r\n * @param x x component of vector\r\n * @param y y component of vector\r\n * @param z z component of vector\r\n */\r\n public columnDotXYZ(columnIndex: AxisIndex, x: number, y: number, z: number) {\r\n return this.coffs[columnIndex] * x + this.coffs[columnIndex + 3] * y + this.coffs[columnIndex + 6] * z;\r\n }\r\n /** Return (a copy of) the X row */\r\n public rowX(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[0], this.coffs[1], this.coffs[2], result); }\r\n /** Return (a copy of) the Y row */\r\n public rowY(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[3], this.coffs[4], this.coffs[5], result); }\r\n /** Return (a copy of) the Z row */\r\n public rowZ(result?: Vector3d): Vector3d { return Vector3d.create(this.coffs[6], this.coffs[7], this.coffs[8], result); }\r\n /** Return the dot product of the vector parameter with the X column. */\r\n public dotColumnX(vector: XYZ): number { return vector.x * this.coffs[0] + vector.y * this.coffs[3] + vector.z * this.coffs[6]; }\r\n /** Return the dot product of the vector parameter with the Y column. */\r\n public dotColumnY(vector: XYZ): number { return vector.x * this.coffs[1] + vector.y * this.coffs[4] + vector.z * this.coffs[7]; }\r\n /** Return the dot product of the vector parameter with the Z column. */\r\n public dotColumnZ(vector: XYZ): number { return vector.x * this.coffs[2] + vector.y * this.coffs[5] + vector.z * this.coffs[8]; }\r\n /** Return the dot product of the vector parameter with the X row. */\r\n public dotRowX(vector: XYZ): number { return vector.x * this.coffs[0] + vector.y * this.coffs[1] + vector.z * this.coffs[2]; }\r\n /** Return the dot product of the vector parameter with the Y row. */\r\n public dotRowY(vector: XYZ): number { return vector.x * this.coffs[3] + vector.y * this.coffs[4] + vector.z * this.coffs[5]; }\r\n /** Return the dot product of the vector parameter with the Z row. */\r\n public dotRowZ(vector: XYZ): number { return vector.x * this.coffs[6] + vector.y * this.coffs[7] + vector.z * this.coffs[8]; }\r\n // cSpell:words XXYZ YXYZ ZXYZ XYZAs Eigen\r\n /** Return the dot product of the x,y,z with the X row. */\r\n public dotRowXXYZ(x: number, y: number, z: number): number { return x * this.coffs[0] + y * this.coffs[1] + z * this.coffs[2]; }\r\n /** Return the dot product of the x,y,z with the Y row. */\r\n public dotRowYXYZ(x: number, y: number, z: number): number { return x * this.coffs[3] + y * this.coffs[4] + z * this.coffs[5]; }\r\n /** Return the dot product of the x,y,z with the Z row. */\r\n public dotRowZXYZ(x: number, y: number, z: number): number { return x * this.coffs[6] + y * this.coffs[7] + z * this.coffs[8]; }\r\n /** Return the (vector) cross product of the Z column with the vector parameter. */\r\n public columnZCrossVector(vector: XYZ, result?: Vector3d): Vector3d {\r\n return Geometry.crossProductXYZXYZ(this.coffs[2], this.coffs[5], this.coffs[8], vector.x, vector.y, vector.z, result);\r\n }\r\n /*\r\n * Replace current rows Ui Uj with (c*Ui - s*Uj) and (c*Uj + s*Ui).\r\n * @param i first row index. must be 0,1,2 (unchecked)\r\n * @param j second row index. must be 0,1,2 (unchecked)\r\n * @param c fist coefficient\r\n * @param s second coefficient\r\n */\r\n private applyGivensRowOp(i: number, j: number, c: number, s: number): void {\r\n let ii = 3 * i;\r\n let jj = 3 * j;\r\n const limit = ii + 3;\r\n for (; ii < limit; ii++, jj++) {\r\n const a = this.coffs[ii];\r\n const b = this.coffs[jj];\r\n this.coffs[ii] = a * c + b * s;\r\n this.coffs[jj] = -a * s + b * c;\r\n }\r\n }\r\n /**\r\n * create a rigid coordinate frame column z parallel to (_x_,_y_,_z_) and column x in the xy plane.\r\n * * column z points from origin to x,y,z\r\n * * column x is perpendicular and in the xy plane\r\n * * column y is perpendicular to both. It is the \"up\" vector on the view plane.\r\n * * Multiplying a world vector times the transpose of this matrix transforms into the view xy\r\n * * Multiplying the matrix times the an in-view vector transforms the vector to world.\r\n * @param x eye x coordinate\r\n * @param y eye y coordinate\r\n * @param z eye z coordinate\r\n * @param result\r\n */\r\n public static createRigidViewAxesZTowardsEye(x: number, y: number, z: number, result?: Matrix3d): Matrix3d {\r\n result = Matrix3d.createIdentity(result);\r\n const rxy = Geometry.hypotenuseXY(x, y);\r\n if (Geometry.isSmallMetricDistance(rxy)) {\r\n // special case for top or bottom view.\r\n if (z < 0.0)\r\n result.scaleColumnsInPlace(1.0, -1, -1.0);\r\n } else {\r\n // const d = Geometry.hypotenuseSquaredXYZ(x, y, z);\r\n const c = x / rxy;\r\n const s = y / rxy;\r\n result.setRowValues(\r\n -s, 0, c,\r\n c, 0, s,\r\n 0, 1, 0);\r\n if (z !== 0.0) {\r\n const r = Geometry.hypotenuseXYZ(x, y, z);\r\n const s1 = z / r;\r\n const c1 = rxy / r;\r\n result.applyGivensColumnOp(1, 2, c1, -s1);\r\n }\r\n }\r\n return result;\r\n }\r\n /** Rotate so columns i and j become perpendicular */\r\n private applyJacobiColumnRotation(i: number, j: number, matrixU: Matrix3d): number {\r\n const uDotU = this.coffs[i] * this.coffs[i] + this.coffs[i + 3] * this.coffs[i + 3] + this.coffs[i + 6] * this.coffs[i + 6];\r\n const vDotV = this.coffs[j] * this.coffs[j] + this.coffs[j + 3] * this.coffs[j + 3] + this.coffs[j + 6] * this.coffs[j + 6];\r\n const uDotV = this.coffs[i] * this.coffs[j] + this.coffs[i + 3] * this.coffs[j + 3] + this.coffs[i + 6] * this.coffs[j + 6];\r\n // const c2 = uDotU - vDotV;\r\n // const s2 = 2.0 * uDotV;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\r\n // const h = Math.hypot(c2, s2);\r\n // console.log(\" c2 s2\", c2 / h, s2 / h);\r\n // console.log(\" C S \", Math.cos(2 * jacobi.radians), Math.sin(2 * jacobi.radians));\r\n // console.log(\"i j uDotV\", i, j, uDotV);\r\n if (Math.abs(jacobi.s) < 2.0e-15)\r\n return 0.0;\r\n this.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n matrixU.applyGivensRowOp(i, j, jacobi.c, jacobi.s);\r\n // const BTB = this.multiplyMatrixTransposeMatrix(this);\r\n // console.log(\"BTB\", BTB.at(0, 0), BTB.at(1, 1), BTB.at(2, 2), \" off\", BTB.at(0, 1), BTB.at(0, 2), BTB.at(1, 2), \" at(i,j)\", BTB.at(i, j));\r\n return Math.abs(uDotV);\r\n }\r\n /**\r\n * Factor this as a product C * U where C has mutually perpendicular columns and\r\n * U is orthogonal.\r\n * @param matrixC (allocate by caller, computed here)\r\n * @param matrixU (allocate by caller, computed here)\r\n */\r\n public factorPerpendicularColumns(matrixC: Matrix3d, matrixU: Matrix3d): boolean {\r\n matrixC.setFrom(this);\r\n matrixU.setIdentity();\r\n const ss = this.sumSquares();\r\n const tolerance = 1.0e-12 * ss;\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = matrixC.applyJacobiColumnRotation(0, 1, matrixU)\r\n + matrixC.applyJacobiColumnRotation(0, 2, matrixU)\r\n + matrixC.applyJacobiColumnRotation(1, 2, matrixU);\r\n // console.log (\" sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"jacobi iterations\", iteration);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Factor this matrix M as a product M = V * D * U where V and U are orthogonal, and D is diagonal (scale matrix).\r\n * @param matrixV left orthogonal factor (allocate by caller, computed here)\r\n * @param scale diagonal entries of D (allocate by caller, computed here)\r\n * @param matrixU right orthogonal factor (allocate by caller, computed here)\r\n */\r\n public factorOrthogonalScaleOrthogonal(matrixV: Matrix3d, scale: Point3d, matrixU: Matrix3d): boolean {\r\n const matrixVD = Matrix3d.createZero();\r\n if (!this.factorPerpendicularColumns(matrixVD, matrixU))\r\n return false;\r\n\r\n const column: Vector3d[] = [];\r\n column.push(matrixVD.getColumn(0));\r\n column.push(matrixVD.getColumn(1));\r\n column.push(matrixVD.getColumn(2));\r\n scale.set(column[0].magnitude(), column[1].magnitude(), column[2].magnitude());\r\n\r\n const det = matrixVD.determinant();\r\n if (det < 0)\r\n scale.z = - scale.z;\r\n\r\n const almostZero = 1.0e-15;\r\n const scaleXIsZero = Math.abs(scale.x) < almostZero;\r\n const scaleYIsZero = Math.abs(scale.y) < almostZero;\r\n const scaleZIsZero = Math.abs(scale.z) < almostZero;\r\n\r\n // ASSUME: any zero-magnitude column(s) of matrixVD are last\r\n if (!scaleXIsZero && !scaleYIsZero && !scaleZIsZero) { // full rank\r\n matrixV = matrixVD.scaleColumns(1 / scale.x, 1 / scale.y, 1 / scale.z, matrixV);\r\n } else if (!scaleXIsZero && !scaleYIsZero) { // rank 2\r\n column[0].scaleInPlace(1 / scale.x);\r\n column[1].scaleInPlace(1 / scale.y);\r\n column[2] = column[0].unitCrossProduct(column[1], column[2])!;\r\n matrixV.setColumns(column[0], column[1], column[2]);\r\n } else if (!scaleXIsZero) { // rank 1\r\n matrixV = Matrix3d.createRigidHeadsUp(column[0], AxisOrder.XYZ, matrixV); // preserve column0\r\n } else { // rank 0\r\n matrixV.setIdentity();\r\n }\r\n return true;\r\n }\r\n /** Apply a jacobi step to lambda which evolves towards diagonal. */\r\n private applySymmetricJacobi(i: number, j: number, lambda: Matrix3d): number {\r\n const uDotU = lambda.at(i, i);\r\n const vDotV = lambda.at(j, j);\r\n const uDotV = lambda.at(i, j);\r\n if (Math.abs(uDotV) < 1.0e-15 * (uDotU + vDotV))\r\n return 0.0;\r\n // const c2 = uDotU - vDotV;\r\n // const s2 = 2.0 * uDotV;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\r\n // const h = Math.hypot(c2, s2);\r\n // console.log(\" c2 s2\", c2 / h, s2 / h);\r\n // console.log(\" C S \", Math.cos(2 * jacobi.radians), Math.sin(2 * jacobi.radians));\r\n // console.log(\"i j uDotV\", i, j, uDotV);\r\n if (Math.abs(jacobi.s) < 2.0e-15)\r\n return 0.0;\r\n // Factored form is this *lambda * thisTranspose\r\n // Let Q be the rotation matrix. Q*QT is inserted, viz\r\n // this*Q * QT * lambda * Q*thisTranspose\r\n this.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n\r\n lambda.applyGivensRowOp(i, j, jacobi.c, jacobi.s);\r\n lambda.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n // const BTB = this.multiplyMatrixTransposeMatrix(this);\r\n // console.log(\"BTB\", BTB.at(0, 0), BTB.at(1, 1), BTB.at(2, 2), \" off\", BTB.at(0, 1), BTB.at(0, 2), BTB.at(1, 2), \" at(i,j)\", BTB.at(i, j));\r\n return Math.abs(uDotV);\r\n }\r\n /**\r\n * Factor this (symmetrized) as a product U * lambda * UT where U is orthogonal, lambda is diagonal.\r\n * The upper triangle is mirrored to lower triangle to enforce symmetry.\r\n * @param matrixC (allocate by caller, computed here)\r\n * @param factor (allocate by caller, computed here)\r\n */\r\n public symmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\r\n const matrix = this.clone();\r\n leftEigenvectors.setIdentity();\r\n matrix.coffs[3] = matrix.coffs[1];\r\n matrix.coffs[6] = matrix.coffs[2];\r\n matrix.coffs[7] = matrix.coffs[5];\r\n const ss = this.sumSquares();\r\n const tolerance = 1.0e-12 * ss;\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = leftEigenvectors.applySymmetricJacobi(0, 1, matrix)\r\n + leftEigenvectors.applySymmetricJacobi(0, 2, matrix)\r\n + leftEigenvectors.applySymmetricJacobi(1, 2, matrix);\r\n // console.log(\"symmetric sum\", sum);\r\n // console.log (\" sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"symmetric iterations\", iteration);\r\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** Apply (in place a jacobi update that zeros out this.at(i,j).\r\n *\r\n */\r\n private applyFastSymmetricJacobiUpdate(\r\n i: number, // row index of zeroed member\r\n j: number, // column index of zeroed member\r\n k: number, // other row/column index (different from i and j)\r\n leftEigenVectors: Matrix3d): number {\r\n const indexII = 4 * i;\r\n const indexJJ = 4 * j;\r\n const indexIJ = 3 * i + j;\r\n const indexIK = 3 * i + k;\r\n const indexJK = 3 * j + k;\r\n const dotUU = this.coffs[indexII];\r\n const dotVV = this.coffs[indexJJ];\r\n const dotUV = this.coffs[indexIJ];\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(dotUU - dotVV, 2.0 * dotUV);\r\n if (Math.abs(dotUV) < 1.0e-15 * (dotUU + dotVV))\r\n return 0.0;\r\n const c = jacobi.c;\r\n const s = jacobi.s;\r\n const cc = c * c;\r\n const ss = s * s;\r\n const sc2 = 2.0 * c * s;\r\n this.coffs[indexII] = cc * dotUU + sc2 * dotUV + ss * dotVV;\r\n this.coffs[indexJJ] = ss * dotUU - sc2 * dotUV + cc * dotVV;\r\n this.coffs[indexIJ] = 0.0;\r\n const a = this.coffs[indexIK];\r\n const b = this.coffs[indexJK];\r\n this.coffs[indexIK] = a * c + b * s;\r\n this.coffs[indexJK] = -s * a + c * b;\r\n this.coffs[3 * j + i] = 0.0;\r\n this.coffs[3 * k + i] = this.coffs[indexIK];\r\n this.coffs[3 * k + j] = this.coffs[indexJK];\r\n leftEigenVectors.applyGivensColumnOp(i, j, c, s);\r\n return Math.abs(dotUV);\r\n }\r\n /**\r\n * Factor this (symmetrized) as a product U * lambda * UT where U is orthogonal, lambda is diagonal.\r\n * The upper triangle is mirrored to lower triangle to enforce symmetry.\r\n * @param matrixC (allocate by caller, computed here)\r\n * @param factor (allocate by caller, computed here)\r\n */\r\n public fastSymmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\r\n const matrix = this.clone();\r\n leftEigenvectors.setIdentity();\r\n const ss = this.sumSquares();\r\n const tolerance = 1.0e-12 * ss;\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = matrix.applyFastSymmetricJacobiUpdate(0, 1, 2, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobiUpdate(0, 2, 1, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobiUpdate(1, 2, 0, leftEigenvectors);\r\n // console.log(\"symmetric sum\", sum);\r\n // console.log (\" sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"symmetric iterations\", iteration);\r\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** Install data from xyz parts of Point4d (w part of Point4d ignored) */\r\n public setColumnsPoint4dXYZ(vectorU: Point4d, vectorV: Point4d, vectorW: Point4d) {\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.setRowValues(\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n vectorU.z, vectorV.z, vectorW.z);\r\n }\r\n /**\r\n * Set entries in one column of the matrix.\r\n * @param columnIndex column index (this is interpreted cyclically. See Geometry.cyclic3dAxis for more info).\r\n * @param value x,yz, values for column. If undefined, zeros are installed.\r\n */\r\n public setColumn(columnIndex: number, value: Vector3d | undefined) {\r\n const index = Geometry.cyclic3dAxis(columnIndex);\r\n this.inverseState = InverseMatrixState.unknown;\r\n if (value) {\r\n this.coffs[index] = value.x;\r\n this.coffs[index + 3] = value.y;\r\n this.coffs[index + 6] = value.z;\r\n } else {\r\n this.coffs[index] = 0.0;\r\n this.coffs[index + 3] = 0.0;\r\n this.coffs[index + 6] = 0.0;\r\n }\r\n }\r\n /** Set all columns of the matrix. Any undefined vector is zeros. */\r\n public setColumns(vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ?: Vector3d | undefined) {\r\n this.setColumn(0, vectorX);\r\n this.setColumn(1, vectorY);\r\n this.setColumn(2, vectorZ);\r\n }\r\n /**\r\n * set entries in one row of the matrix.\r\n * @param rowIndex row index. this is interpreted cyclically.\r\n * @param value x,yz, values for row. If undefined, zeros are installed.\r\n */\r\n public setRow(rowIndex: number, value: Vector3d) {\r\n const index = 3 * Geometry.cyclic3dAxis(rowIndex);\r\n this.coffs[index] = value.x;\r\n this.coffs[index + 1] = value.y;\r\n this.coffs[index + 2] = value.z;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** Return a (copy of) a column of the matrix.\r\n * @param i column index. This is corrected to 012 by Geometry.cyclic3dAxis.\r\n */\r\n public getColumn(columnIndex: number, result?: Vector3d): Vector3d {\r\n const index = Geometry.cyclic3dAxis(columnIndex);\r\n return Vector3d.create(\r\n this.coffs[index],\r\n this.coffs[index + 3],\r\n this.coffs[index + 6], result);\r\n }\r\n /** Return a (copy of) a row of the matrix.\r\n * @param i row index. This is corrected to 012 by Geometry.cyclic3dAxis.\r\n */\r\n public getRow(columnIndex: number, result?: Vector3d): Vector3d {\r\n const index = 3 * Geometry.cyclic3dAxis(columnIndex);\r\n return Vector3d.create(\r\n this.coffs[index],\r\n this.coffs[index + 1],\r\n this.coffs[index + 2], result);\r\n }\r\n /** Create a matrix from row vectors.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & U_y & U_z \\\\ V_x & V_y & V_z \\\\ W_x & W_y & W_z \\end{bmatrix}\r\n * ```\r\n */\r\n public static createRows(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorU.y, vectorU.z,\r\n vectorV.x, vectorV.y, vectorV.z,\r\n vectorW.x, vectorW.y, vectorW.z, result);\r\n }\r\n /** Create a matrix that scales along a specified direction.\r\n * * The scale factor can be negative.\r\n * * A scale of -1.0 (negative one) is a mirror across the plane perpendicular to the vector.\r\n * ```\r\n * equation\r\n * \\text{The matrix is } I - (s-1) U U^T\r\n * \\\\ \\text{with }U\\text{ being the unit vector in the direction of the input vector.}\r\n * ```\r\n */\r\n public static createDirectionalScale(direction: Vector3d, scale: number, result?: Matrix3d): Matrix3d {\r\n const unit = direction.normalize();\r\n if (unit) {\r\n const x = unit.x;\r\n const y = unit.y;\r\n const z = unit.z;\r\n const a = (scale - 1);\r\n return Matrix3d.createRowValues\r\n (\r\n 1 + a * x * x, a * x * y, a * x * z,\r\n a * y * x, 1 + a * y * y, a * y * z,\r\n a * z * x, a * z * y, 1 + a * z * z, result);\r\n }\r\n return Matrix3d.createUniformScale(scale);\r\n }\r\n /* Create a matrix with the indicated column in the (normalized) direction, and the other two columns perpendicular. All columns are normalized.\r\n * * The direction vector is normalized and appears in column axisIndex\r\n * * If the direction vector is not close to Z, the \"next\" column ((axisIndex + 1) mod 3) will be in the XY plane in the direction of (direction cross Z)\r\n * * If the direction vector is close to Z, the \"next\" column ((axisIndex + 1) mode 3) will be in the direction of (direction cross Y)\r\n */\r\n // static create1Vector(direction: Vector3d, axisIndex: number): Matrix3d;\r\n // static createFromXYVectors(vectorX: Vector3d, vectorY: Vector3d, axisIndex: number): Matrix3d;\r\n\r\n /** Multiply the matrix * vector, treating the vector is a column vector on the right.\r\n * ```\r\n * equation\r\n * \\matrixXY{A}\\columnSubXYZ{U}\r\n * ```\r\n * @return the vector result\r\n */\r\n public multiplyVector(vectorU: XYAndZ, result?: Vector3d): Vector3d {\r\n const x = vectorU.x;\r\n const y = vectorU.y;\r\n const z = vectorU.z;\r\n return Vector3d.create(\r\n (this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z),\r\n (this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z),\r\n (this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z),\r\n result);\r\n }\r\n /** Multiply matrix * vector for each array member, i.e. the vector is a column vector on the right.\r\n * @return the vector result\r\n */\r\n public multiplyVectorArrayInPlace(data: XYZ[]): void {\r\n for (const v of data) v.set(\r\n (this.coffs[0] * v.x + this.coffs[1] * v.y + this.coffs[2] * v.z),\r\n (this.coffs[3] * v.x + this.coffs[4] * v.y + this.coffs[5] * v.z),\r\n (this.coffs[6] * v.x + this.coffs[7] * v.y + this.coffs[8] * v.z));\r\n }\r\n /** compute `origin - matrix * vector` */\r\n public static xyzMinusMatrixTimesXYZ(origin: XYAndZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Point3d.create(\r\n origin.x - (matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z),\r\n origin.y - (matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z),\r\n origin.z - (matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z),\r\n result);\r\n }\r\n /** compute `origin + matrix * vector` using only the xy parts of the inputs. */\r\n public static xyPlusMatrixTimesXY(origin: XAndY, matrix: Matrix3d, vector: XAndY, result?: Point2d): Point2d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n return Point2d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y,\r\n result);\r\n }\r\n /** compute `origin + matrix * vector` using all xyz parts of the inputs. */\r\n public static xyzPlusMatrixTimesXYZ(origin: XYZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Point3d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\r\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\r\n result);\r\n }\r\n /** compute `origin + matrix * vector` using all xyz parts of the inputs. */\r\n public static xyzPlusMatrixTimesXYZInPlace(origin: XYZ, matrix: Matrix3d, vector: WritableXYAndZ) {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n vector.x = origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z;\r\n vector.y = origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z;\r\n vector.z = origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z;\r\n }\r\n /** compute `origin + matrix * vector` where the final vector is given as direct x,y,z coordinates */\r\n public static xyzPlusMatrixTimesCoordinates(origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Point3d): Point3d {\r\n return Point3d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\r\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\r\n result);\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\r\n * Multiply times point with coordinates `[x,y,z,w]`\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param w w part of multiplied point\r\n * @param result optional result.\r\n */\r\n public static xyzPlusMatrixTimesWeightedCoordinates(origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\r\n return Point4d.create(\r\n w * origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\r\n w * origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\r\n w * origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\r\n w,\r\n result);\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\r\n * Multiply times point with coordinates `[x,y,z,w]`\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param w w part of multiplied point\r\n * @param result optional result.\r\n */\r\n public static xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Float64Array): Float64Array {\r\n if (!result)\r\n result = new Float64Array(4);\r\n result[0] = w * origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z;\r\n result[1] = w * origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z;\r\n result[2] = w * origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z;\r\n result[3] = w;\r\n return result;\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\r\n * Multiply times point with coordinates `[x,y,z,w]`\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param w w part of multiplied point\r\n * @param result optional result.\r\n */\r\n public static xyzPlusMatrixTimesCoordinatesToFloat64Array(origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Float64Array): Float64Array {\r\n if (!result)\r\n result = new Float64Array(3);\r\n result[0] = origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z;\r\n result[1] = origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z;\r\n result[2] = origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z;\r\n return result;\r\n }\r\n /**\r\n * Multiply transpose of this matrix times a vector.\r\n * * This produces the same x,y,z as treating the vector as a row on the left of the (un-transposed) matrix.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{Treating U as a column to the right of transposed matrix\\: return column}&\\columnSubXYZ{V}&=&\\matrixTransposeSubXY{A}\\columnSubXYZ{U} \\\\\r\n * \\text{Treating U as a row to the left of untransposed matrix\\: return row}&\\rowSubXYZ{V}&=&\\rowSubXYZ{U}\\matrixXY{A}\r\n * \\end{matrix}\r\n * ```\r\n * @return the vector result\r\n */\r\n public multiplyTransposeVector(vector: Vector3d, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n result.x = (this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z);\r\n result.y = (this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z);\r\n result.z = (this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Multiply the matrix * (x,y,z), i.e. the vector (x,y,z) is a column vector on the right.\r\n * @return the vector result\r\n */\r\n public multiplyXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Multiply the matrix * xyz, place result in (required) return value.\r\n * @param xyz right side\r\n * @param result result.\r\n */\r\n public multiplyXYZtoXYZ(xyz: XYZ, result: XYZ) {\r\n const x = xyz.x;\r\n const y = xyz.y;\r\n const z = xyz.z;\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Multiply the matrix * (x,y,0), i.e. the vector (x,y,z) is a column vector on the right.\r\n * @return the vector result\r\n */\r\n public multiplyXY(x: number, y: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y);\r\n return result;\r\n }\r\n /** compute `origin + this*[x,y,0]` */\r\n public originPlusMatrixTimesXY(origin: XYZ, x: number, y: number, result?: Point3d): Point3d {\r\n return Point3d.create(\r\n origin.x + this.coffs[0] * x + this.coffs[1] * y,\r\n origin.y + this.coffs[3] * x + this.coffs[4] * y,\r\n origin.z + this.coffs[6] * x + this.coffs[7] * y,\r\n result);\r\n }\r\n /** Multiply matrix * (x, y, z) using any 3d object given containing those members */\r\n public multiplyVectorInPlace(xyzData: XYZ): void {\r\n const x = xyzData.x;\r\n const y = xyzData.y;\r\n const z = xyzData.z;\r\n const coffs = this.coffs;\r\n xyzData.x = (coffs[0] * x + coffs[1] * y + coffs[2] * z);\r\n xyzData.y = (coffs[3] * x + coffs[4] * y + coffs[5] * z);\r\n xyzData.z = (coffs[6] * x + coffs[7] * y + coffs[8] * z);\r\n }\r\n /** Multiply the transpose matrix times column using any 3d object with x,y,z members.\r\n * This is equivalent to `multiplyTransposeVector` but always returns the result directly in the input.\r\n */\r\n public multiplyTransposeVectorInPlace(vectorU: XYZ): void {\r\n const x = vectorU.x;\r\n const y = vectorU.y;\r\n const z = vectorU.z;\r\n const coffs = this.coffs;\r\n vectorU.x = (coffs[0] * x + coffs[3] * y + coffs[6] * z);\r\n vectorU.y = (coffs[1] * x + coffs[4] * y + coffs[7] * z);\r\n vectorU.z = (coffs[2] * x + coffs[5] * y + coffs[8] * z);\r\n }\r\n /** Multiply the transpose matrix times column using individual numeric inputs.\r\n * * This is equivalent to multiplying with the vector as a row to the left of the plain matrix.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{treating the input as a column } \\columnXYZ{x}{y}{z}\\text{ compute }&\\columnSubXYZ{V} &= &A^T \\columnXYZ{x}{y}{z} \\\\\r\n * \\text{or row vector } \\rowXYZ{x}{y}{z} \\text{ compute }&\\rowSubXYZ{V} &= &\\rowXYZ{x}{y}{z} A \\\\\r\n * \\phantom{8888}\\text{and return V as a Vector3d} & & &\r\n * \\end{matrix}\r\n * ````\r\n * @return the vector result\r\n */\r\n public multiplyTransposeXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z);\r\n result.y = (this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z);\r\n result.z = (this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Solve `matrix * result = vector`.\r\n * * This is equivalent to multiplication `result = matrixInverse * vector`.\r\n * * Result is undefined if the matrix is singular (e.g. has parallel or zero length columns)\r\n */\r\n public multiplyInverse(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /** Solve `matrixTranspose * result = vector`.\r\n * * This is equivalent to multiplication `result = matrixInverseTranspose * vector`.\r\n * * Result is undefined if the matrix is singular (e.g. has parallel or zero length columns)\r\n */\r\n public multiplyInverseTranspose(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[3] * y + this.inverseCoffs[6] * z),\r\n (this.inverseCoffs[1] * x + this.inverseCoffs[4] * y + this.inverseCoffs[7] * z),\r\n (this.inverseCoffs[2] * x + this.inverseCoffs[5] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]`.\r\n * * This is equivalent to solving `matrix * result = [x,y,z]`\r\n * * return as a Vector3d, or undefined if the matrix is singular.\r\n */\r\n public multiplyInverseXYZAsVector3d(x: number, y: number, z: number, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]` and return packaged as `Point4d` with given weight.\r\n * * Equivalent to solving matrix * result = [x,y,z]\r\n * * return as a Point4d with the same weight.\r\n * * Called by Transform with x,y,z adjusted by subtraction ((xw) - w * origin.x, etc) where xw is the pre-weighted space point.\r\n */\r\n public multiplyInverseXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Point4d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n w,\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]` and return packaged as `Point3d`.\r\n * * multiply matrixInverse * [x,y,z]\r\n * * Equivalent to solving matrix * result = [x,y,z]\r\n * * return as a Point3d.\r\n */\r\n public multiplyInverseXYZAsPoint3d(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Point3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * * invoke a given matrix-matrix operation (product function) to compute this.inverseCOffs\r\n * * set this.inverseCoffs\r\n * * if either input cffA or coffB is undefined, set state to `InverseMatrixState.unknown` (but leave the inverseCoffs untouched)\r\n */\r\n private finishInverseCoffs(f: (factorA: Float64Array, factorB: Float64Array, result: Float64Array) => void, coffA?: Float64Array, coffB?: Float64Array): void {\r\n if (coffA && coffB) {\r\n this.createInverseCoffsWithZeros();\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n f(coffA, coffB, this.inverseCoffs!);\r\n } else {\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n }\r\n /*\r\n Notes on inverses of products\r\n * 1) M = A * B MInverse = BInverse * AInverse\r\n * 2) M = A * BInverse MInverse = B * AInverse\r\n * 3) M = AInverse * B MInverse = BInverse * A\r\n * 4) M = ATranspose * B MInverse = BInverse * AInverseTranspose\r\n * 5) M = A * BTranspose MInverse = BInverseTranspose * AInverse\r\n */\r\n /** Multiply the instance matrix A by the input matrix B.\r\n * @return the matrix product A * B\r\n */\r\n public multiplyMatrixMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n private static _productBuffer = new Float64Array(9);\r\n /** Multiply this matrix times inverse of other\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixMatrixInverse(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\r\n if (!other.computeCachedInverse(true))\r\n return undefined;\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.inverseCoffs!, Matrix3d._productBuffer);\r\n if (this.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.coffs, this.inverseCoffs);\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\r\n return result;\r\n }\r\n /** Multiply this matrix times inverse of other\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixInverseMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\r\n if (!this.computeCachedInverse(true))\r\n return undefined;\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.inverseCoffs!, other.coffs, Matrix3d._productBuffer);\r\n if (other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.inverseCoffs, this.coffs);\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\r\n return result;\r\n }\r\n /** Multiply `this` matrix times the transpose of `matrixB`.\r\n * ```\r\n * equation\r\n * \\text{for instance matrix }A\\text{ and other matrix }B\\text{ return matrix }C{\\text where }\\\\\\matrixXY{C}=\\matrixXY{A}\\matrixTransposeSubXY{B}\r\n * ```\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixMatrixTranspose(matrixB: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrixTranspose(this.coffs, matrixB.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && matrixB.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixTransposeMatrix, matrixB.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || matrixB.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n /** Matrix multiplication `thisTranspose * other`.\r\n * ```\r\n * equation\r\n * \\matrixXY{result}=\\matrixXY{\\text{this}}\\matrixTransposeSubXY{\\text{other}}\r\n * ```\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixTransposeMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixTransposeMatrix(this.coffs, other.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrixTranspose, other.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n /** multiply this Matrix3d (considered as a transform with 0 translation) times other Transform.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{This matrix }\\bold{A}\\text{ promoted to block transform} & \\blockTransform{A}{0} \\\\\r\n * \\text{other transform with matrix part }\\bold{B}\\text{ and translation }\\bold{b} & \\blockTransform{B}{b}\\\\\r\n * \\text{product}& \\blockTransform{A}{0}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand Matrix3d for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyMatrixTransform(other: Transform, result?: Transform): Transform {\r\n if (!result)\r\n return Transform.createRefs(\r\n this.multiplyXYZ(other.origin.x, other.origin.y, other.origin.z),\r\n this.multiplyMatrixMatrix(other.matrix));\r\n // be sure to do the point multiplication first before aliasing changes the matrix ..\r\n this.multiplyXYZtoXYZ(other.origin, result.origin);\r\n this.multiplyMatrixMatrix(other.matrix, result.matrix);\r\n return result;\r\n }\r\n /**\r\n * Return the transpose of `this` matrix.\r\n * If `result` is passed as argument, then the function copies the transpose of `this` into `result`\r\n * `this` is not changed unless also passed as the result, i.e., this.transpose(this) transposes `this` in place\r\n */\r\n public transpose(result?: Matrix3d): Matrix3d {\r\n if (!result)\r\n result = new Matrix3d();\r\n PackedMatrix3dOps.copyTransposed(this.coffs, result.coffs);\r\n if (this.inverseCoffs !== undefined) {\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n result.inverseCoffs = PackedMatrix3dOps.copyTransposed(this.inverseCoffs, result.inverseCoffs);\r\n } else {\r\n result.inverseState = this.inverseState; // singular or unknown.\r\n result.inverseCoffs = undefined;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Transpose this matrix in place.\r\n */\r\n public transposeInPlace() {\r\n PackedMatrix3dOps.transposeInPlace(this.coffs);\r\n if (this.inverseCoffs)\r\n PackedMatrix3dOps.transposeInPlace(this.inverseCoffs);\r\n }\r\n /** return the inverse matrix.\r\n * The return is undefined if the matrix is singular (has columns that are coplanar or colinear)\r\n * * Note that each Matrix3d object caches its own inverse, and has methods to multiply the inverse times matrices and vectors.\r\n * * Hence explicitly constructing this new inverse object is rarely necessary.\r\n */\r\n public inverse(result?: Matrix3d): Matrix3d | undefined {\r\n if (!this.computeCachedInverse(true))\r\n return undefined;\r\n if (result === this) {\r\n // swap the contents (preserve pointers .. caller better know what they are doing)\r\n PackedMatrix3dOps.copy(this.coffs, Matrix3d._productBuffer);\r\n PackedMatrix3dOps.copy(this.inverseCoffs!, this.coffs);\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, this.inverseCoffs!);\r\n\r\n return result;\r\n }\r\n if (result === undefined) {\r\n result = Matrix3d.createIdentity();\r\n }\r\n result.createInverseCoffsWithZeros();\r\n PackedMatrix3dOps.copy(this.coffs, result.inverseCoffs!);\r\n PackedMatrix3dOps.copy(this.inverseCoffs!, result.coffs);\r\n result.inverseState = this.inverseState;\r\n return result;\r\n }\r\n /* Alternate implementation of computedCachedInverse - more direct addressing of arrays.\r\n This is indeed 10% faster than using static work areas. */\r\n\r\n // take the cross product of two rows of source.\r\n // store as a column of dest.\r\n private static indexedRowCrossProduct(source: Float64Array, rowStart0: number, rowStart1: number, dest: Float64Array, columnStart: number) {\r\n dest[columnStart] = source[rowStart0 + 1] * source[rowStart1 + 2] - source[rowStart0 + 2] * source[rowStart1 + 1];\r\n dest[columnStart + 3] = source[rowStart0 + 2] * source[rowStart1] - source[rowStart0] * source[rowStart1 + 2];\r\n dest[columnStart + 6] = source[rowStart0] * source[rowStart1 + 1] - source[rowStart0 + 1] * source[rowStart1];\r\n }\r\n // take the cross product of two columns of source.\r\n // store as third column in same Matrix3d.\r\n // This is private because the columnStart values are unchecked raw indices into the coffs\r\n private indexedColumnCrossProductInPlace(colStart0: number, colStart1: number, colStart2: number) {\r\n const coffs = this.coffs;\r\n coffs[colStart2] = coffs[colStart0 + 3] * coffs[colStart1 + 6] - coffs[colStart0 + 6] * coffs[colStart1 + 3];\r\n coffs[colStart2 + 3] = coffs[colStart0 + 6] * coffs[colStart1] - coffs[colStart0] * coffs[colStart1 + 6];\r\n coffs[colStart2 + 6] = coffs[colStart0] * coffs[colStart1 + 3] - coffs[colStart0 + 3] * coffs[colStart1];\r\n }\r\n /** Form cross products among columns in axisOrder.\r\n * For axis order ABC,\r\n * * form cross product of column A and B, store in C\r\n * * form cross product of column C and A, store in B.\r\n * This means that in the final matrix:\r\n * * column A is strictly parallel to original column A\r\n * * column B is linear combination of only original A and B\r\n * * column C is perpendicular to A and B of both the original and final.\r\n * * original column C does not participate in the result.\r\n */\r\n public axisOrderCrossProductsInPlace(axisOrder: AxisOrder) {\r\n switch (axisOrder) {\r\n case AxisOrder.XYZ: {\r\n this.indexedColumnCrossProductInPlace(0, 1, 2);\r\n this.indexedColumnCrossProductInPlace(2, 0, 1);\r\n break;\r\n }\r\n case AxisOrder.YZX: {\r\n this.indexedColumnCrossProductInPlace(1, 2, 0);\r\n this.indexedColumnCrossProductInPlace(0, 1, 2);\r\n break;\r\n }\r\n case AxisOrder.ZXY: {\r\n this.indexedColumnCrossProductInPlace(2, 0, 1);\r\n this.indexedColumnCrossProductInPlace(1, 2, 0);\r\n break;\r\n }\r\n case AxisOrder.XZY: {\r\n this.indexedColumnCrossProductInPlace(0, 2, 1);\r\n this.indexedColumnCrossProductInPlace(1, 0, 2);\r\n break;\r\n }\r\n case AxisOrder.YXZ: {\r\n this.indexedColumnCrossProductInPlace(1, 0, 2);\r\n this.indexedColumnCrossProductInPlace(2, 1, 0);\r\n break;\r\n }\r\n case AxisOrder.ZYX: {\r\n this.indexedColumnCrossProductInPlace(2, 1, 0);\r\n this.indexedColumnCrossProductInPlace(0, 2, 1);\r\n break;\r\n }\r\n }\r\n }\r\n /** Normalize each column in place.\r\n * * For false return the magnitudes are stored in the originalMagnitudes vector but no columns are altered.\r\n * @returns Return true if all columns had nonzero lengths.\r\n * @param originalMagnitudes optional vector to receive original column magnitudes.\r\n */\r\n public normalizeColumnsInPlace(originalMagnitudes?: Vector3d): boolean {\r\n const ax = this.columnXMagnitude();\r\n const ay = this.columnYMagnitude();\r\n const az = this.columnZMagnitude();\r\n if (originalMagnitudes)\r\n originalMagnitudes.set(ax, ay, az);\r\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\r\n return false;\r\n this.scaleColumns(1.0 / ax, 1.0 / ay, 1.0 / az, this);\r\n return true;\r\n }\r\n /** Normalize each row in place */\r\n public normalizeRowsInPlace(originalMagnitudes?: Vector3d): boolean {\r\n const ax = this.rowXMagnitude();\r\n const ay = this.rowYMagnitude();\r\n const az = this.rowZMagnitude();\r\n if (originalMagnitudes)\r\n originalMagnitudes.set(ax, ay, az);\r\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\r\n return false;\r\n this.scaleRows(1.0 / ax, 1.0 / ay, 1.0 / az, this);\r\n return true;\r\n }\r\n // take the cross product of two rows of source.\r\n // store as a column of dest.\r\n private static rowColumnDot(coffA: Float64Array, rowStartA: number, coffB: Float64Array, columnStartB: number): number {\r\n return coffA[rowStartA] * coffB[columnStartB] + coffA[rowStartA + 1] * coffB[columnStartB + 3] + coffA[rowStartA + 2] * coffB[columnStartB + 6];\r\n }\r\n /**\r\n * Returns true if the matrix is singular (i.e. collapses data to a plane, line, or point)\r\n */\r\n public isSingular(): boolean {\r\n return !this.computeCachedInverse(true);\r\n }\r\n /**\r\n * Mark this matrix as singular.\r\n */\r\n public markSingular() {\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n /**\r\n * Create the inverseCoffs member (filled with zeros)\r\n * This is for use by matrix * matrix multiplications which need to be sure the member is there to be\r\n * filled with method-specific content.\r\n */\r\n private createInverseCoffsWithZeros() {\r\n if (!this.inverseCoffs) {\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.inverseCoffs = new Float64Array(9);\r\n }\r\n }\r\n /** compute the inverse of this Matrix3d. The inverse is stored for later use.\r\n * @returns Return true if the inverse computed. (False if the columns collapse to a point, line or plane.)\r\n */\r\n public computeCachedInverse(useCacheIfAvailable: boolean): boolean {\r\n if (useCacheIfAvailable && Matrix3d.useCachedInverse && this.inverseState !== InverseMatrixState.unknown) {\r\n Matrix3d.numUseCache++;\r\n return this.inverseState === InverseMatrixState.inverseStored;\r\n }\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.createInverseCoffsWithZeros();\r\n const coffs = this.coffs;\r\n const inverseCoffs = this.inverseCoffs!;\r\n Matrix3d.indexedRowCrossProduct(coffs, 3, 6, inverseCoffs, 0);\r\n Matrix3d.indexedRowCrossProduct(coffs, 6, 0, inverseCoffs, 1);\r\n Matrix3d.indexedRowCrossProduct(coffs, 0, 3, inverseCoffs, 2);\r\n Matrix3d.numComputeCache++;\r\n const d = Matrix3d.rowColumnDot(coffs, 0, inverseCoffs, 0);\r\n if (d === 0.0) { // better test?\r\n this.inverseState = InverseMatrixState.singular;\r\n this.inverseCoffs = undefined;\r\n return false;\r\n }\r\n const f = 1.0 / d;\r\n for (let i = 0; i < 9; i++)inverseCoffs[i] *= f;\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n // verify inverse\r\n // const p = new Float64Array(9);\r\n // for (let i = 0; i < 9; i += 3)\r\n // for (let j = 0; j < 3; j++)\r\n // p[i + j] = Matrix3d.rowColumnDot (coffs, i, inverseCoffs, j);\r\n return true;\r\n }\r\n /* \"Classic\" inverse implementation with temporary vectors.\r\n private static rowX: Vector3d = Vector3d.create();\r\n private static rowY: Vector3d = Vector3d.create();\r\n private static rowZ: Vector3d = Vector3d.create();\r\n private static crossXY: Vector3d = Vector3d.create();\r\n private static crossZX: Vector3d = Vector3d.create();\r\n private static crossYZ: Vector3d = Vector3d.create();\r\n private computeCachedInverse(useCacheIfAvailable: boolean) {\r\n if (useCacheIfAvailable && Matrix3d.useCachedInverse && this.inverseState !== InverseMatrixState.unknown) {\r\n Matrix3d.numUseCache++;\r\n return this.inverseState === InverseMatrixState.inverseStored;\r\n }\r\n this.inverseState = InverseMatrixState.unknown;\r\n Matrix3d.numComputeCache++;\r\n const rowX = this.rowX(Matrix3d.rowX);\r\n const rowY = this.rowY(Matrix3d.rowY);\r\n const rowZ = this.rowZ(Matrix3d.rowZ);\r\n const crossXY = rowX.crossProduct(rowY, Matrix3d.crossXY);\r\n const crossYZ = rowY.crossProduct(rowZ, Matrix3d.crossYZ);\r\n const crossZX = rowZ.crossProduct(rowX, Matrix3d.crossZX);\r\n const d = rowX.dotProduct(crossYZ); // that's the determinant\r\n if (d === 0.0) { // better test?\r\n this.inverseState = InverseMatrixState.singular;\r\n this.inverseCoffs = undefined;\r\n return false;\r\n }\r\n const f = 1.0 / d;\r\n this.inverseState = InverseMatrixState.inverseStored; // Currently just lists that the inverse has been stored... singular case not handled\r\n this.inverseCoffs = Float64Array.from([crossYZ.x * f, crossZX.x * f, crossXY.x * f,\r\n crossYZ.y * f, crossZX.y * f, crossXY.y * f,\r\n crossYZ.z * f, crossZX.z * f, crossXY.z * f]);\r\n return true;\r\n }\r\n */\r\n /** convert a (row,column) index pair to the single index within flattened array of 9 numbers in row-major-order */\r\n public static flatIndexOf(row: number, column: number): number {\r\n return 3 * Geometry.cyclic3dAxis(row) + Geometry.cyclic3dAxis(column);\r\n }\r\n /** Get a column by index (0,1,2), packaged as a Point4d with given weight. Out of range index is interpreted cyclically. */\r\n public indexedColumnWithWeight(index: number, weight: number, result?: Point4d): Point4d {\r\n index = Geometry.cyclic3dAxis(index);\r\n return Point4d.create(this.coffs[index], this.coffs[index + 3], this.coffs[index + 6], weight, result);\r\n }\r\n /** return the entry at specific row and column */\r\n public at(row: number, column: number): number {\r\n return this.coffs[Matrix3d.flatIndexOf(row, column)];\r\n }\r\n /** Set the entry at specific row and column */\r\n public setAt(row: number, column: number, value: number): void {\r\n this.coffs[Matrix3d.flatIndexOf(row, column)] = value;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** create a Matrix3d whose columns are scaled copies of this Matrix3d.\r\n * @param scaleX scale factor for column x\r\n * @param scaleY scale factor for column y\r\n * @param scaleZ scale factor for column z\r\n * @param result optional result.\r\n */\r\n public scaleColumns(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scaleX, this.coffs[1] * scaleY, this.coffs[2] * scaleZ,\r\n this.coffs[3] * scaleX, this.coffs[4] * scaleY, this.coffs[5] * scaleZ,\r\n this.coffs[6] * scaleX, this.coffs[7] * scaleY, this.coffs[8] * scaleZ,\r\n result);\r\n }\r\n /** Scale the columns of this Matrix3d.\r\n * @param scaleX scale factor for column x\r\n * @param scaleY scale factor for column y\r\n * @param scaleZ scale factor for column z\r\n */\r\n public scaleColumnsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\r\n\r\n this.coffs[0] *= scaleX; this.coffs[1] *= scaleY; this.coffs[2] *= scaleZ;\r\n this.coffs[3] *= scaleX; this.coffs[4] *= scaleY; this.coffs[5] *= scaleZ;\r\n this.coffs[6] *= scaleX; this.coffs[7] *= scaleY; this.coffs[8] *= scaleZ;\r\n if (this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined) {\r\n // apply reciprocal scales to the ROWS of the inverse . . .\r\n const divX = Geometry.conditionalDivideFraction(1.0, scaleX);\r\n const divY = Geometry.conditionalDivideFraction(1.0, scaleY);\r\n const divZ = Geometry.conditionalDivideFraction(1.0, scaleZ);\r\n if (divX !== undefined && divY !== undefined && divZ !== undefined) {\r\n this.inverseCoffs[0] *= divX; this.inverseCoffs[1] *= divX; this.inverseCoffs[2] *= divX;\r\n this.inverseCoffs[3] *= divY; this.inverseCoffs[4] *= divY; this.inverseCoffs[5] *= divY;\r\n this.inverseCoffs[6] *= divZ; this.inverseCoffs[7] *= divZ; this.inverseCoffs[8] *= divZ;\r\n } else\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n }\r\n /** create a Matrix3d whose rows are scaled copies of this Matrix3d.\r\n * @param scaleX scale factor for row x\r\n * @param scaleY scale factor for row y\r\n * @param scaleZ scale factor for row z\r\n * @param result optional result.\r\n */\r\n public scaleRows(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scaleX, this.coffs[1] * scaleX, this.coffs[2] * scaleX,\r\n this.coffs[3] * scaleY, this.coffs[4] * scaleY, this.coffs[5] * scaleY,\r\n this.coffs[6] * scaleZ, this.coffs[7] * scaleZ, this.coffs[8] * scaleZ,\r\n result);\r\n }\r\n /**\r\n * add scaled values from other Matrix3d to this Matrix3d\r\n * @param other Matrix3d with values to be added\r\n * @param scale scale factor to apply to the added values.\r\n */\r\n public addScaledInPlace(other: Matrix3d, scale: number): void {\r\n for (let i = 0; i < 9; i++)\r\n this.coffs[i] += scale * other.coffs[i];\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /**\r\n * add scaled values from an outer product.\r\n * * The scaled outer product is a \"rank 1\" matrix.\r\n * * This is useful in constructing mirrors and directional scales.\r\n * ```\r\n * equation\r\n * A += s \\columnSubXYZ{U}\\rowSubXYZ{V}\r\n * \\\\ \\matrixXY{A} += s \\begin{bmatrix}\r\n * U_x * V_x & U_y * V_x & U_z * V_x \\\\\r\n * U_x * V_y & U_y * V_y & U_z * V_y \\\\\r\n * U_x * V_z & U_y * V_z & U_z * V_z \\end{bmatrix}\r\n * ```\r\n * @param other Matrix3d with values to be added\r\n * @param scale scale factor to apply to the added values.\r\n */\r\n public addScaledOuterProductInPlace(vectorU: Vector3d, vectorV: Vector3d, scale: number): void {\r\n this.coffs[0] += scale * vectorU.x * vectorV.x;\r\n this.coffs[1] += scale * vectorU.x * vectorV.y;\r\n this.coffs[2] += scale * vectorU.x * vectorV.z;\r\n\r\n this.coffs[3] += scale * vectorU.y * vectorV.x;\r\n this.coffs[4] += scale * vectorU.y * vectorV.y;\r\n this.coffs[5] += scale * vectorU.y * vectorV.z;\r\n\r\n this.coffs[6] += scale * vectorU.z * vectorV.x;\r\n this.coffs[7] += scale * vectorU.z * vectorV.y;\r\n this.coffs[8] += scale * vectorU.z * vectorV.z;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** create a Matrix3d whose values are uniformly scaled from this.\r\n * @param scale scale factor to apply.\r\n * @param result optional result.\r\n * @returns Return the new or repopulated matrix\r\n */\r\n public scale(scale: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scale, this.coffs[1] * scale, this.coffs[2] * scale,\r\n this.coffs[3] * scale, this.coffs[4] * scale, this.coffs[5] * scale,\r\n this.coffs[6] * scale, this.coffs[7] * scale, this.coffs[8] * scale,\r\n result);\r\n\r\n }\r\n /** Return the determinant of this matrix. */\r\n public determinant(): number {\r\n return this.coffs[0] * this.coffs[4] * this.coffs[8]\r\n - this.coffs[0] * this.coffs[7] * this.coffs[5]\r\n + this.coffs[3] * this.coffs[7] * this.coffs[2]\r\n - this.coffs[3] * this.coffs[1] * this.coffs[8]\r\n + this.coffs[6] * this.coffs[1] * this.coffs[5]\r\n - this.coffs[6] * this.coffs[4] * this.coffs[2];\r\n }\r\n /** Return an estimate of how independent the columns are. Near zero is bad. Near 1 is good\r\n */\r\n public conditionNumber(): number {\r\n const determinant = this.determinant();\r\n const columnMagnitudeProduct =\r\n Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6])\r\n + Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7])\r\n + Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\r\n return Geometry.safeDivideFraction(determinant, columnMagnitudeProduct, 0.0);\r\n }\r\n /** Return the sum of squares of all entries */\r\n public sumSquares(): number {\r\n let i = 0;\r\n let sum = 0;\r\n for (i = 0; i < 9; i++)\r\n sum += this.coffs[i] * this.coffs[i];\r\n return sum;\r\n }\r\n /** Return the sum of squares of diagonal entries */\r\n public sumDiagonalSquares(): number {\r\n let i = 0;\r\n let sum = 0;\r\n for (i = 0; i < 9; i += 4)\r\n sum += this.coffs[i] * this.coffs[i];\r\n return sum;\r\n }\r\n /** Return the sum of diagonal entries (also known as the trace) */\r\n public sumDiagonal(): number {\r\n return this.coffs[0] + this.coffs[4] + this.coffs[8];\r\n }\r\n /** Return the Maximum absolute value of any single entry */\r\n public maxAbs(): number {\r\n let i = 0;\r\n let max = 0;\r\n for (i = 0; i < 9; i++)\r\n max = Math.max(max, Math.abs(this.coffs[i]));\r\n return max;\r\n }\r\n /** Return the maximum absolute difference between corresponding entries of `this` and `other` */\r\n public maxDiff(other: Matrix3d): number {\r\n let i = 0;\r\n let max = 0;\r\n for (i = 0; i < 9; i++)\r\n max = Math.max(max, Math.abs(this.coffs[i] - other.coffs[i]));\r\n return max;\r\n }\r\n /** Test if the matrix is (very near to) an identity */\r\n public get isIdentity(): boolean {\r\n return this.maxDiff(Matrix3d.identity) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the off diagonal entries are all nearly zero */\r\n public get isDiagonal(): boolean {\r\n const sumAll = this.sumSquares();\r\n const sumDiagonal = this.sumDiagonalSquares();\r\n const sumOff = Math.abs(sumAll - sumDiagonal);\r\n return Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\r\n }\r\n /** Test if the stored inverse is present and marked valid */\r\n public get hasCachedInverse(): boolean {\r\n return this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined;\r\n }\r\n /** Test if the below diagonal entries are all nearly zero */\r\n public get isUpperTriangular(): boolean {\r\n const sumAll = this.sumSquares();\r\n const sumLow = Geometry.hypotenuseSquaredXYZ(this.coffs[3], this.coffs[6], this.coffs[7]);\r\n return Math.sqrt(sumLow) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\r\n }\r\n /** If the matrix is diagonal and all diagonals are within tolerance, return the first diagonal. Otherwise return undefined.\r\n */\r\n public sameDiagonalScale(): number | undefined {\r\n const sumAll = this.sumSquares();\r\n const sumDiagonal = this.sumDiagonalSquares();\r\n const sumOff = Math.abs(sumAll - sumDiagonal);\r\n if (Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll))\r\n && Geometry.isSameCoordinate(this.coffs[0], this.coffs[4]) && Geometry.isSameCoordinate(this.coffs[0], this.coffs[8]))\r\n return this.coffs[0];\r\n return undefined;\r\n }\r\n /** Sum of squared differences between symmetric pairs */\r\n public sumSkewSquares(): number {\r\n return Geometry.hypotenuseSquaredXYZ(\r\n this.coffs[1] - this.coffs[3],\r\n this.coffs[2] - this.coffs[6],\r\n this.coffs[5] - this.coffs[7]);\r\n }\r\n /** Test if the matrix is a pure rotation.\r\n * @param allowMirror whether to widen the test to return true if the matrix is orthogonal (a pure rotation or a mirror)\r\n */\r\n public isRigid(allowMirror: boolean = false): boolean {\r\n return this.testPerpendicularUnitRowsAndColumns() && (allowMirror || this.determinant() > 0);\r\n }\r\n /** Test if all rows and columns are perpendicular to each other and have equal length.\r\n * If so, the length (or its negative) is the scale factor from a set of rigid axes to these axes.\r\n * * result.rigidAxes is the rigid axes (with the scale factor removed)\r\n * * result.scale is the scale factor\r\n */\r\n public factorRigidWithSignedScale(): { rigidAxes: Matrix3d, scale: number } | undefined {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n const ss = product.sameDiagonalScale();\r\n if (ss === undefined || ss <= 0.0) return undefined;\r\n const s = this.determinant() > 0 ? Math.sqrt(ss) : -Math.sqrt(ss);\r\n const divS = 1.0 / s;\r\n const result = { rigidAxes: this.scaleColumns(divS, divS, divS), scale: s };\r\n return result;\r\n }\r\n /** Test if the matrix is shuffles and negates columns. */\r\n public get isSignedPermutation(): boolean {\r\n let count = 0;\r\n for (let row = 0; row < 3; row++)\r\n for (let col = 0; col < 3; col++) {\r\n const q = this.at(row, col);\r\n if (q === 0) {// This comment makes the block non-empty\r\n } else if (q === 1 || q === -1) {\r\n // the rest of this row and column should be 0.\r\n // \"at\" will apply cyclic indexing.\r\n count++;\r\n if (this.at(row + 1, col) !== 0)\r\n return false;\r\n if (this.at(row + 2, col) !== 0)\r\n return false;\r\n if (this.at(row, col + 1) !== 0)\r\n return false;\r\n if (this.at(row, col + 2) !== 0)\r\n return false;\r\n } else {// entry is not from 0,1,-1 . . .\r\n return false;\r\n }\r\n }\r\n return count === 3;\r\n }\r\n /** Test if all rows and columns are length 1 and are perpendicular to each other. (I.e. the matrix is either a pure rotation with uniform scale factor of 1 or -1) */\r\n public testPerpendicularUnitRowsAndColumns(): boolean {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n return product.isIdentity;\r\n }\r\n /** Adjust the matrix in place so that:\r\n * * columns are perpendicular and have unit length\r\n * * transpose equals inverse\r\n * * mirroring is removed\r\n * @param axisOrder how to reorder the matrix columns\r\n * @return whether the instance is rigid on return\r\n */\r\n public makeRigid(axisOrder: AxisOrder = AxisOrder.XYZ): boolean {\r\n const maxAbs = this.maxAbs();\r\n if (Geometry.isSmallMetricDistance(maxAbs))\r\n return false;\r\n const scale = 1.0 / maxAbs;\r\n this.scaleColumnsInPlace(scale, scale, scale);\r\n this.axisOrderCrossProductsInPlace(axisOrder);\r\n return this.normalizeColumnsInPlace();\r\n }\r\n /** Create a new orthogonal matrix (perpendicular columns, unit length, transpose is inverse).\r\n * * Columns are taken from the source Matrix3d in order indicated by the axis order.\r\n * * Mirroring in the matrix is removed.\r\n */\r\n public static createRigidFromMatrix3d(source: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ, result?: Matrix3d): Matrix3d | undefined {\r\n result = source.clone(result);\r\n if (result.makeRigid(axisOrder))\r\n return result;\r\n return undefined;\r\n }\r\n private static computeQuatTerm(numerator: number, denomCoff: number, reciprocal: number, diagSum: number): number {\r\n let coff: number;\r\n const diagTol = 0.500;\r\n if (diagSum > diagTol) {\r\n coff = Math.sqrt(diagSum) * 0.5;\r\n if (denomCoff * numerator < 0.0)\r\n coff = - coff;\r\n } else {\r\n coff = numerator * reciprocal;\r\n }\r\n return coff;\r\n }\r\n /** create a matrix from a quaternion.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by rows and columns.\r\n * **WARNING:** If you find that the matrix seems to rotate by the opposite angle expect it, transpose it.\r\n */\r\n public static createFromQuaternion(quat: Point4d): Matrix3d {\r\n\r\n const qqx = quat.x * quat.x;\r\n const qqy = quat.y * quat.y;\r\n const qqz = quat.z * quat.z;\r\n const qqw = quat.w * quat.w;\r\n\r\n const mag2 = qqx + qqy + qqz + qqw;\r\n\r\n if (mag2 === 0.0) {\r\n return Matrix3d.createIdentity();\r\n } else {\r\n const a = 1.0 / mag2;\r\n\r\n const matrix = Matrix3d.createRowValues(\r\n a * (qqw + qqx - qqy - qqz), 2.0 * a * (quat.w * quat.z + quat.x * quat.y), 2.0 * a * (quat.x * quat.z - quat.w * quat.y),\r\n 2.0 * a * (quat.x * quat.y - quat.w * quat.z), a * (qqw - qqx + qqy - qqz), 2.0 * a * (quat.w * quat.x + quat.y * quat.z),\r\n 2.0 * a * (quat.x * quat.z + quat.w * quat.y), 2.0 * a * (quat.y * quat.z - quat.w * quat.x), a * (qqw - qqx - qqy + qqz));\r\n return matrix;\r\n }\r\n }\r\n /** convert the matrix to a quaternion.\r\n * @note This calculation requires the matrix to have unit length rows and columns.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by rows and columns.\r\n * **WARNING:** If you find that the matrix seems to rotate by the opposite angle expect it, transpose it.\r\n */\r\n public toQuaternion(): Point4d {\r\n const result = Point4d.createZero();\r\n const props = [[this.coffs[0], this.coffs[3], this.coffs[6]],\r\n [this.coffs[1], this.coffs[4], this.coffs[7]],\r\n [this.coffs[2], this.coffs[5], this.coffs[8]]];\r\n\r\n const xx = props[0][0];\r\n const yy = props[1][1];\r\n const zz = props[2][2];\r\n const dSum: number[] = [];\r\n let denom: number, maxIndex: number, i: number;\r\n\r\n dSum[0] = 1.0 + xx - yy - zz;\r\n dSum[1] = 1.0 - xx + yy - zz;\r\n dSum[2] = 1.0 - xx - yy + zz;\r\n dSum[3] = 1.0 + xx + yy + zz;\r\n\r\n maxIndex = 0;\r\n for (i = 1; i < 4; i++) {\r\n if (dSum[i] > dSum[maxIndex])\r\n maxIndex = i;\r\n }\r\n\r\n if (maxIndex === 0) {\r\n result.x = 0.5 * Math.sqrt(dSum[0]);\r\n denom = 1.0 / (4.0 * result.x);\r\n result.y = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.x, denom, dSum[1]);\r\n result.z = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.x, denom, dSum[2]);\r\n result.w = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.x, denom, dSum[3]);\r\n } else if (maxIndex === 1) {\r\n result.y = 0.5 * Math.sqrt(dSum[1]);\r\n denom = 1.0 / (4.0 * result.y);\r\n result.x = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.y, denom, dSum[0]);\r\n result.z = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.y, denom, dSum[2]);\r\n result.w = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.y, denom, dSum[3]);\r\n\r\n } else if (maxIndex === 2) {\r\n result.z = 0.5 * Math.sqrt(dSum[2]);\r\n denom = 1.0 / (4.0 * result.z);\r\n result.x = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.z, denom, dSum[0]);\r\n result.y = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.z, denom, dSum[1]);\r\n result.w = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.z, denom, dSum[3]);\r\n\r\n } else {\r\n result.w = 0.5 * Math.sqrt(dSum[3]);\r\n denom = 1.0 / (4.0 * result.w);\r\n result.x = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.w, denom, dSum[0]);\r\n result.y = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.w, denom, dSum[1]);\r\n result.z = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.w, denom, dSum[2]);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Matrix3d.js","sourceRoot":"","sources":["../../../src/geometry3d/Matrix3d.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAmB,QAAQ,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAO,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,sCAAsC;AACtC,8BAA8B;AAC9B;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,UAAU,CAAC,IAAkB,EACzC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW;QACrC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC9C,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,oBAAoB,CAAC,CAAe,EAAE,CAAe,EAAE,MAAqB;QACxF,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,iBAAiB,CAAC,UAAU,CAAC,MAAM,EACjC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EACzC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,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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 { AxisIndex, AxisOrder, BeJSONFunctions, Geometry, StandardViewIndex } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Angle } from \"./Angle\";\r\nimport { Point2d } from \"./Point2dVector2d\";\r\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\r\nimport { Transform } from \"./Transform\";\r\nimport { Matrix3dProps, WritableXYAndZ, XAndY, XYAndZ } from \"./XYZProps\";\r\n\r\n/* eslint-disable @itwin/prefer-get */\r\n// cSpell:words XXYZ YXYZ ZXYZ\r\n/**\r\n * PackedMatrix3dOps contains static methods for matrix operations where the matrix is a Float64Array.\r\n * * The Float64Array contains the matrix entries in row-major order\r\n * @internal\r\n * ```\r\n * equation\r\n * \\newcommand[1]\\mij{#1_{00}\\ #1_{01}\\ a_{02}}\r\n * ```\r\n */\r\nexport class PackedMatrix3dOps {\r\n /**\r\n * Load 9 doubles into the packed format.\r\n * @param dest destination, allocated by caller\r\n * @param a00 row 0, column 0 entry\r\n * @param a01 row 0, column 1 entry\r\n * @param a02 row 0, column 2 entry\r\n * @param a10 row 1, column 0 entry\r\n * @param a11 row 1, column 1 entry\r\n * @param a12 row 1, column 2 entry\r\n * @param a20 row 2, column 0 entry\r\n * @param a21 row 2, column 1 entry\r\n * @param a22 row 2, column 2 entry\r\n */\r\n public static loadMatrix(dest: Float64Array,\r\n a00: number, a01: number, a02: number,\r\n a10: number, a11: number, a12: number,\r\n a20: number, a21: number, a22: number) {\r\n dest[0] = a00; dest[1] = a01; dest[2] = a02;\r\n dest[3] = a10; dest[4] = a11; dest[5] = a12;\r\n dest[6] = a20; dest[7] = a21; dest[8] = a22;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `a*b`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[1] * b[3] + a[2] * b[6]),\r\n (a[0] * b[1] + a[1] * b[4] + a[2] * b[7]),\r\n (a[0] * b[2] + a[1] * b[5] + a[2] * b[8]),\r\n (a[3] * b[0] + a[4] * b[3] + a[5] * b[6]),\r\n (a[3] * b[1] + a[4] * b[4] + a[5] * b[7]),\r\n (a[3] * b[2] + a[4] * b[5] + a[5] * b[8]),\r\n (a[6] * b[0] + a[7] * b[3] + a[8] * b[6]),\r\n (a[6] * b[1] + a[7] * b[4] + a[8] * b[7]),\r\n (a[6] * b[2] + a[7] * b[5] + a[8] * b[8]));\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `a*bTranspose`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixMatrixTranspose(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]),\r\n (a[0] * b[3] + a[1] * b[4] + a[2] * b[5]),\r\n (a[0] * b[6] + a[1] * b[7] + a[2] * b[8]),\r\n (a[3] * b[0] + a[4] * b[1] + a[5] * b[2]),\r\n (a[3] * b[3] + a[4] * b[4] + a[5] * b[5]),\r\n (a[3] * b[6] + a[4] * b[7] + a[5] * b[8]),\r\n (a[6] * b[0] + a[7] * b[1] + a[8] * b[2]),\r\n (a[6] * b[3] + a[7] * b[4] + a[8] * b[5]),\r\n (a[6] * b[6] + a[7] * b[7] + a[8] * b[8]));\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `aTranspose*b`, store in `result`.\r\n * * All params assumed length 9, allocated by caller.\r\n * * c may alias either input.\r\n */\r\n public static multiplyMatrixTransposeMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result) result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(result,\r\n (a[0] * b[0] + a[3] * b[3] + a[6] * b[6]),\r\n (a[0] * b[1] + a[3] * b[4] + a[6] * b[7]),\r\n (a[0] * b[2] + a[3] * b[5] + a[6] * b[8]),\r\n (a[1] * b[0] + a[4] * b[3] + a[7] * b[6]),\r\n (a[1] * b[1] + a[4] * b[4] + a[7] * b[7]),\r\n (a[1] * b[2] + a[4] * b[5] + a[7] * b[8]),\r\n (a[2] * b[0] + a[5] * b[3] + a[8] * b[6]),\r\n (a[2] * b[1] + a[5] * b[4] + a[8] * b[7]),\r\n (a[2] * b[2] + a[5] * b[5] + a[8] * b[8]));\r\n return result;\r\n }\r\n /** Transpose 3x3 matrix `a` in place */\r\n public static transposeInPlace(a: Float64Array) {\r\n let q = a[1]; a[1] = a[3]; a[3] = q;\r\n q = a[2]; a[2] = a[6]; a[6] = q;\r\n q = a[5]; a[5] = a[7]; a[7] = q;\r\n }\r\n /**\r\n * Returns the transpose of 3x3 matrix `a`\r\n * * If `dest` is passed as argument, then the function copies the transpose of 3x3 matrix `a` into `dest`\r\n * * `a` is not changed unless also passed as the dest, i.e., copyTransposed(a,a) transposes `a` in place\r\n */\r\n public static copyTransposed(a: Float64Array, dest?: Float64Array): Float64Array {\r\n if (dest === a) {\r\n PackedMatrix3dOps.transposeInPlace(dest);\r\n } else {\r\n if (!dest)\r\n dest = new Float64Array(9);\r\n dest[0] = a[0]; dest[1] = a[3]; dest[2] = a[6];\r\n dest[3] = a[1]; dest[4] = a[4]; dest[5] = a[7];\r\n dest[6] = a[2]; dest[7] = a[5]; dest[8] = a[8];\r\n }\r\n return dest;\r\n }\r\n /** Copy matrix `a` entries into `dest` */\r\n public static copy(a: Float64Array, dest: Float64Array): Float64Array {\r\n if (dest !== a) {\r\n dest[0] = a[0]; dest[1] = a[1]; dest[2] = a[2];\r\n dest[3] = a[3]; dest[4] = a[4]; dest[5] = a[5];\r\n dest[6] = a[6]; dest[7] = a[7]; dest[8] = a[8];\r\n }\r\n return dest;\r\n }\r\n}\r\n\r\n/** A Matrix3d is tagged indicating one of the following states:\r\n * * unknown: it is not know if the matrix is invertible.\r\n * * inverseStored: the matrix has its inverse stored.\r\n * * singular: the matrix is known to be singular.\r\n * @public\r\n */\r\nexport enum InverseMatrixState {\r\n /**\r\n * The invertibility of the `coffs` array has not been determined.\r\n * Any `inverseCoffs` contents are random.\r\n */\r\n unknown,\r\n /**\r\n * An inverse was computed and stored as the `inverseCoffs`\r\n */\r\n inverseStored,\r\n /**\r\n * The `coffs` array is known to be singular.\r\n * Any `inverseCoffs` contents are random.\r\n */\r\n singular,\r\n}\r\n\r\n/** A Matrix3d is a 3x3 matrix.\r\n * * A very common use is to hold a rigid body rotation (which has no scaling or skew), but the 3x3 contents can\r\n * also hold scaling and skewing.\r\n * * The matrix with 2-dimensional layout (note: a 2d array can be shown by a matrix)\r\n * ```\r\n * equation\r\n * \\matrixXY{A}\r\n * ```\r\n * is stored as 9 numbers in \"row-major\" order in a `Float64Array`, viz\r\n * ```\r\n * equation\r\n * \\rowMajorMatrixXY{A}\r\n * ```\r\n * * If the matrix inverse is known it is stored in the inverseCoffs array.\r\n * * The inverse status (`unknown`, `inverseStored`, `singular`) status is indicated by the `inverseState` property.\r\n * * Construction methods that are able to trivially construct the inverse, store it immediately and note that in\r\n * the inverseState.\r\n * * Constructions (e.g. createRowValues) for which the inverse is not immediately known mark the inverseState as\r\n * unknown.\r\n * * Later queries for the inverse, trigger full computation if needed at that time.\r\n * * Most matrix queries are present with both \"column\" and \"row\" variants.\r\n * * Usage elsewhere in the library is typically \"column\" based. For example, in a Transform that carries a\r\n * coordinate frame, the matrix columns are the unit vectors for the axes.\r\n * @public\r\n */\r\nexport class Matrix3d implements BeJSONFunctions {\r\n /** Control flag for whether this class uses cached inverse of matrices. */\r\n public static useCachedInverse = true; // cached inverse can be suppressed for testing.\r\n /** Total number of times a cached inverse was used to avoid recompute */\r\n public static numUseCache = 0;\r\n /** Total number of times a cached inverse was computed. */\r\n public static numComputeCache = 0;\r\n /**\r\n * Matrix contents as a flat array of numbers in row-major order.\r\n * ```\r\n * equation\r\n * \\mxy{B}\r\n * \\mij{B}\r\n * ```\r\n * * DO NOT directly modify this array. It will destroy safety of the cached inverse state.\r\n */\r\n public coffs: Float64Array;\r\n /**\r\n * Matrix inverse contents.\r\n * ```\r\n * equation\r\n * \\mxy{A}\r\n * ```\r\n * * DO NOT directly modify this array. It will destroy integrity of the cached inverse state.\r\n */\r\n public inverseCoffs: Float64Array | undefined;\r\n /** Indicates if inverse is unknown, available, or known singular */\r\n public inverseState: InverseMatrixState;\r\n private static _identity: Matrix3d;\r\n /** The identity Matrix3d. Value is frozen and cannot be modified. */\r\n public static get identity(): Matrix3d {\r\n if (undefined === this._identity) {\r\n this._identity = Matrix3d.createIdentity();\r\n this._identity.freeze();\r\n }\r\n\r\n return this._identity;\r\n }\r\n /** Freeze this Matrix3d. */\r\n public freeze(): Readonly<this> {\r\n this.computeCachedInverse(true);\r\n /*\r\n hm.. can't freeze the Float64Arrays..\r\n Object.freeze(this.coffs);\r\n if (this.inverseCoffs)\r\n Object.freeze(this.inverseCoffs);\r\n */\r\n return Object.freeze(this);\r\n }\r\n /**\r\n * Constructor\r\n * @param coffs optional coefficient array.\r\n * * **WARNING:** coffs is captured (i.e., is now owned by the Matrix3d object and can be modified by it).\r\n */\r\n public constructor(coffs?: Float64Array) {\r\n this.coffs = coffs ? coffs : new Float64Array(9);\r\n this.inverseCoffs = undefined;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /**\r\n * Return a json object containing the 9 numeric entries as a single array in row major order,\r\n * `[ [1, 2, 3],[ 4, 5, 6], [7, 8, 9] ]`\r\n */\r\n public toJSON(): Matrix3dProps {\r\n return [[this.coffs[0], this.coffs[1], this.coffs[2]],\r\n [this.coffs[3], this.coffs[4], this.coffs[5]],\r\n [this.coffs[6], this.coffs[7], this.coffs[8]]];\r\n }\r\n /**\r\n * Copy data from various input forms to this matrix.\r\n * The source can be:\r\n * * Another `Matrix3d`\r\n * * An array of 3 arrays, each of which has the 3 numbers for a row of the matrix.\r\n * * An array of 4 or 9 numbers in row major order.\r\n * * **WARNING:** if json is an array of numbers but size is not 4 or 9, the matrix is set to zeros.\r\n */\r\n public setFromJSON(json?: Matrix3dProps | Matrix3d): void {\r\n this.inverseCoffs = undefined;\r\n // if no json is passed\r\n if (!json) {\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n return;\r\n }\r\n // if json is Matrix3d\r\n if (!Array.isArray(json)) {\r\n if (json instanceof Matrix3d)\r\n this.setFrom(json);\r\n return;\r\n }\r\n // if json is Matrix3dProps and is an array of arrays\r\n if (Geometry.isArrayOfNumberArray(json, 3, 3)) {\r\n const data = json as number[][];\r\n this.setRowValues(\r\n data[0][0], data[0][1], data[0][2],\r\n data[1][0], data[1][1], data[1][2],\r\n data[2][0], data[2][1], data[2][2]);\r\n return;\r\n }\r\n // if json is Matrix3dProps and is an array of numbers\r\n if (json.length === 9) {\r\n const data = json as number[];\r\n this.setRowValues(\r\n data[0], data[1], data[2],\r\n data[3], data[4], data[5],\r\n data[6], data[7], data[8]);\r\n return;\r\n } else if (json.length === 4) {\r\n const data = json as number[];\r\n this.setRowValues(\r\n data[0], data[1], 0,\r\n data[2], data[3], 0,\r\n 0, 0, 1);\r\n return;\r\n }\r\n // if json is Matrix3dProps but is not the right size\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n return;\r\n }\r\n /** Return a new Matrix3d constructed from contents of the json value. See `setFromJSON` for layout rules */\r\n public static fromJSON(json?: Matrix3dProps): Matrix3d {\r\n const result = Matrix3d.createIdentity();\r\n result.setFromJSON(json);\r\n return result;\r\n }\r\n /**\r\n * Test if `this` and `other` are within tolerance in all numeric entries.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqual(other: Matrix3d, tol?: number): boolean {\r\n return Geometry.isDistanceWithinTol(this.maxDiff(other), tol);\r\n }\r\n /**\r\n * Test if `this` and `other` are within tolerance in the column entries specified by `columnIndex`.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualColumn(columnIndex: AxisIndex, other: Matrix3d, tol?: number): boolean {\r\n const max = Geometry.maxAbsXYZ(\r\n this.coffs[columnIndex] - other.coffs[columnIndex],\r\n this.coffs[columnIndex + 3] - other.coffs[columnIndex + 3],\r\n this.coffs[columnIndex + 6] - other.coffs[columnIndex + 6]);\r\n return Geometry.isDistanceWithinTol(max, tol);\r\n }\r\n /**\r\n * Test if column (specified by `columnIndex`) entries of `this` and [ax,ay,az] are within tolerance.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualColumnXYZ(columnIndex: AxisIndex, ax: number, ay: number, az: number, tol?: number): boolean {\r\n const max = Geometry.maxAbsXYZ(\r\n this.coffs[columnIndex] - ax,\r\n this.coffs[columnIndex + 3] - ay,\r\n this.coffs[columnIndex + 6] - az);\r\n return Geometry.isDistanceWithinTol(max, tol);\r\n }\r\n /**\r\n * Test if `this` and `other` have almost equal Z column and have X and Y columns differing only by a\r\n * rotation of the same angle around that Z.\r\n * * **WARNING:** X and Y columns have to be perpendicular to Z column in both `this` and `other`.\r\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\r\n */\r\n public isAlmostEqualAllowZRotation(other: Matrix3d, tol?: number): boolean {\r\n if (this.isAlmostEqual(other, tol))\r\n return true;\r\n if (this.isAlmostEqualColumn(AxisIndex.Z, other, tol)) {\r\n const radians = Angle.radiansBetweenVectorsXYZ(\r\n this.coffs[0], this.coffs[3], this.coffs[6],\r\n other.coffs[0], other.coffs[3], other.coffs[6]\r\n );\r\n const angle = Angle.createRadians(radians); // angle between X columns in `this` and `other`\r\n const columnX = this.columnX();\r\n const columnY = this.columnY();\r\n const columnZ = this.columnZ();\r\n /**\r\n * Here we rotate this.columnX() around this.columnZ() by \"angle\" and expect to get other.columnX().\r\n * Then we rotate this.columnY() around this.columnZ() by the same \"angle\" and if we get other.columnY(),\r\n * that means this` and `other` have X and Y columns differing only by a rotation around that Z.\r\n */\r\n let column = Vector3d.createRotateVectorAroundVector(columnX, columnZ, angle)!;\r\n if (other.isAlmostEqualColumnXYZ(0, column.x, column.y, column.z, tol)) {\r\n column = Vector3d.createRotateVectorAroundVector(columnY, columnZ, angle)!;\r\n return other.isAlmostEqualColumnXYZ(1, column.x, column.y, column.z, tol);\r\n }\r\n }\r\n return false;\r\n }\r\n /** Test for exact (bitwise) equality with other. */\r\n public isExactEqual(other: Matrix3d): boolean {\r\n return this.maxDiff(other) === 0.0;\r\n }\r\n /** test if all entries in the z row and column are exact 001, i.e. the matrix only acts in 2d */\r\n public get isXY(): boolean {\r\n return this.coffs[2] === 0.0\r\n && this.coffs[5] === 0.0\r\n && this.coffs[6] === 0.0\r\n && this.coffs[7] === 0.0\r\n && this.coffs[8] === 1.0;\r\n }\r\n /**\r\n * If result is not provided, then the method returns a new (zeroed) matrix; otherwise the result is\r\n * not zeroed first and is just returned as-is.\r\n */\r\n private static _create(result?: Matrix3d): Matrix3d {\r\n return result ? result : new Matrix3d();\r\n }\r\n /**\r\n * Returns a Matrix3d populated by numeric values given in row-major order.\r\n * Sets all entries in the matrix from call parameters appearing in row-major order, i.e.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}a_{xx}\\ a_{xy}\\ a_{xz}\\\\ a_{yx}\\ a_{yy}\\ a_{yz}\\\\ a_{zx}\\ a_{zy}\\ a_{zz}\\end{bmatrix}\r\n * ```\r\n * @param axx Row x, column x(0, 0) entry\r\n * @param axy Row x, column y(0, 1) entry\r\n * @param axz Row x, column z(0, 2) entry\r\n * @param ayx Row y, column x(1, 0) entry\r\n * @param ayy Row y, column y(1, 1) entry\r\n * @param ayz Row y, column z(1, 2) entry\r\n * @param azx Row z, column x(2, 0) entry\r\n * @param azy Row z, column y(2, 2) entry\r\n * @param azz row z, column z(2, 3) entry\r\n */\r\n public static createRowValues(\r\n axx: number, axy: number, axz: number,\r\n ayx: number, ayy: number, ayz: number,\r\n azx: number, azy: number, azz: number,\r\n result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.inverseState = InverseMatrixState.unknown;\r\n result.coffs[0] = axx; result.coffs[1] = axy; result.coffs[2] = axz;\r\n result.coffs[3] = ayx; result.coffs[4] = ayy; result.coffs[5] = ayz;\r\n result.coffs[6] = azx; result.coffs[7] = azy; result.coffs[8] = azz;\r\n return result;\r\n }\r\n /**\r\n * Create a Matrix3d with caller-supplied coefficients and optional inverse coefficients.\r\n * * The inputs are captured into (i.e., owned by) the new Matrix3d.\r\n * * The caller is responsible for validity of the inverse coefficients.\r\n * @param coffs (required) array of 9 coefficients.\r\n * @param inverseCoffs (optional) array of 9 coefficients.\r\n * @returns a Matrix3d populated by a coffs array.\r\n */\r\n public static createCapture(coffs: Float64Array, inverseCoffs?: Float64Array): Matrix3d {\r\n const result = new Matrix3d(coffs);\r\n if (inverseCoffs) {\r\n result.inverseCoffs = inverseCoffs;\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n } else {\r\n result.inverseState = InverseMatrixState.unknown;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a matrix by distributing vectors to columns in one of 6 orders.\r\n * @param axisOrder identifies where the columns are placed.\r\n * @param columnA vector to place in the column specified by first letter in the AxisOrder name.\r\n * @param columnB vector to place in the column specified by second letter in the AxisOrder name.\r\n * @param columnC vector to place in the column specified by third letter in the AxisOrder name.\r\n * @param result optional result matrix3d\r\n * * Example: If you pass AxisOrder.YZX, then result will be [columnC, columnA, columnB] because\r\n * first letter Y means columnA should go to the second column, second letter Z means columnB should\r\n * go to the third column, and third letter X means columnC should go to the first column.\r\n */\r\n public static createColumnsInAxisOrder(axisOrder: AxisOrder, columnA: Vector3d | undefined,\r\n columnB: Vector3d | undefined, columnC: Vector3d | undefined, result?: Matrix3d): Matrix3d {\r\n if (!result) result = new Matrix3d();\r\n if (axisOrder === AxisOrder.YZX) {\r\n result.setColumns(columnC, columnA, columnB);\r\n } else if (axisOrder === AxisOrder.ZXY) {\r\n result.setColumns(columnB, columnC, columnA);\r\n } else if (axisOrder === AxisOrder.XZY) {\r\n result.setColumns(columnA, columnC, columnB);\r\n } else if (axisOrder === AxisOrder.YXZ) {\r\n result.setColumns(columnB, columnA, columnC);\r\n } else if (axisOrder === AxisOrder.ZYX) {\r\n result.setColumns(columnC, columnB, columnA);\r\n } else { // AxisOrder.XYZ\r\n result.setColumns(columnA, columnB, columnC);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Copy the transpose of the coffs to the inverseCoffs.\r\n * * Mark the matrix as inverseStored.\r\n */\r\n private setupInverseTranspose() {\r\n const coffs = this.coffs;\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n this.inverseCoffs = Float64Array.from([\r\n coffs[0], coffs[3], coffs[6],\r\n coffs[1], coffs[4], coffs[7],\r\n coffs[2], coffs[5], coffs[8],\r\n ]);\r\n }\r\n /**\r\n * Set all entries in the matrix from call parameters appearing in row-major order.\r\n * @param axx Row x, column x (0,0) entry\r\n * @param axy Row x, column y (0,1) entry\r\n * @param axz Row x, column z (0,2) entry\r\n * @param ayx Row y, column x (1,0) entry\r\n * @param ayy Row y, column y (1,1) entry\r\n * @param ayz Row y, column z (1,2) entry\r\n * @param azx Row z, column x (2,0) entry\r\n * @param azy Row z, column y (2,2) entry\r\n * @param azz row z, column z (2,3) entry\r\n */\r\n public setRowValues(\r\n axx: number, axy: number, axz: number,\r\n ayx: number, ayy: number, ayz: number,\r\n azx: number, azy: number, azz: number): void {\r\n this.coffs[0] = axx; this.coffs[1] = axy; this.coffs[2] = axz;\r\n this.coffs[3] = ayx; this.coffs[4] = ayy; this.coffs[5] = ayz;\r\n this.coffs[6] = azx; this.coffs[7] = azy; this.coffs[8] = azz;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** Set the matrix to an identity. */\r\n public setIdentity() {\r\n this.setRowValues(1, 0, 0, 0, 1, 0, 0, 0, 1);\r\n this.setupInverseTranspose();\r\n }\r\n /** Set the matrix to all zeros. */\r\n public setZero() {\r\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n /** Copy contents from another matrix. */\r\n public setFrom(other: Matrix3d | undefined): void {\r\n if (other === undefined) {\r\n this.setIdentity();\r\n return;\r\n }\r\n if (other !== this) {\r\n for (let i = 0; i < 9; i++)\r\n this.coffs[i] = other.coffs[i];\r\n if (other.inverseState === InverseMatrixState.inverseStored && other.inverseCoffs !== undefined) {\r\n this.createInverseCoffsWithZeros();\r\n for (let i = 0; i < 9; i++)\r\n this.inverseCoffs![i] = other.inverseCoffs[i];\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n } else if (other.inverseState !== InverseMatrixState.inverseStored) {\r\n this.inverseState = other.inverseState;\r\n } else { // This is reached when other says stored but does not have coffs. This should not happen.\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n }\r\n }\r\n /**\r\n * Return a clone of this matrix.\r\n * * Coefficients are copied.\r\n * * Inverse coefficients and inverse status are copied if stored by `this`.\r\n */\r\n public clone(result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.setFrom(this);\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with all zeros.\r\n * * Note that for geometry transformations \"all zeros\" is not a useful default state.\r\n * * Hence, almost always use `createIdentity` for graphics transformations.\r\n * * \"All zeros\" is appropriate for summing moment data.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}0 & 0 & 0 \\\\ 0 & 0 & 0 \\\\ 0 & 0 & 0\\end{bmatrix}\r\n * ```\r\n */\r\n public static createZero(): Matrix3d {\r\n const retVal = new Matrix3d();\r\n retVal.inverseState = InverseMatrixState.singular;\r\n return retVal;\r\n }\r\n /**\r\n * Create an identity matrix.\r\n * * All diagonal entries (xx,yy,zz) are one\r\n * * All others are zero.\r\n * * This (rather than \"all zeros\") is the useful state for most graphics transformations.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1\\end{bmatrix}\r\n * ```\r\n *\r\n */\r\n public static createIdentity(result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n result.setIdentity();\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with distinct x,y,z diagonal (scale) entries.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}s_x & 0 & 0 \\\\ 0 & s_y & 0\\\\ 0 & 0 & s_z\\end{bmatrix}\r\n * ```\r\n */\r\n public static createScale(scaleFactorX: number, scaleFactorY: number, scaleFactorZ: number,\r\n result?: Matrix3d): Matrix3d {\r\n if (result)\r\n result.setZero();\r\n else\r\n result = new Matrix3d();\r\n\r\n result.coffs[0] = scaleFactorX;\r\n result.coffs[4] = scaleFactorY;\r\n result.coffs[8] = scaleFactorZ;\r\n if (scaleFactorX === 0 || scaleFactorY === 0 || scaleFactorZ === 0) {\r\n result.inverseState = InverseMatrixState.singular;\r\n } else {\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n result.inverseCoffs = Float64Array.from(\r\n [1 / scaleFactorX, 0, 0,\r\n 0, 1 / scaleFactorY, 0,\r\n 0, 0, 1 / scaleFactorZ]\r\n );\r\n }\r\n return result;\r\n }\r\n /**\r\n * Create a matrix with uniform scale factors for scale factor \"s\"\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}s & 0 & 0 \\\\ 0 & s & 0\\\\ 0 & 0 & s\\end{bmatrix}\r\n * ```\r\n */\r\n public static createUniformScale(scaleFactor: number): Matrix3d {\r\n return Matrix3d.createScale(scaleFactor, scaleFactor, scaleFactor);\r\n }\r\n /**\r\n * Return a vector that is perpendicular to the input `vectorA`.\r\n * * Among the infinite number of perpendiculars possible, this method favors having one in the xy plane.\r\n * * Hence, when `vectorA` is close to the Z axis, the returned vector is `vectorA cross -unitY`\r\n * but when `vectorA` is NOT close to the Z axis, the returned vector is `unitZ cross vectorA`.\r\n */\r\n public static createPerpendicularVectorFavorXYPlane(vectorA: Vector3d, result?: Vector3d): Vector3d {\r\n const a = vectorA.magnitude();\r\n const scale = 64.0; // A constant from the dawn of time in the CAD industry\r\n const b = a / scale;\r\n // if vectorA is close to the Z axis\r\n if (Math.abs(vectorA.x) < b && Math.abs(vectorA.y) < b) {\r\n return Vector3d.createCrossProduct(vectorA.x, vectorA.y, vectorA.z, 0, -1, 0, result);\r\n }\r\n // if vectorA is NOT close to the Z axis\r\n return Vector3d.createCrossProduct(0, 0, 1, vectorA.x, vectorA.y, vectorA.z, result);\r\n }\r\n /**\r\n * Return a vector that is perpendicular to the input `vectorA`.\r\n * * Among the infinite number of perpendiculars possible, this method favors having one near the plane\r\n * containing Z.\r\n * That is achieved by cross product of `this` vector with the result of createPerpendicularVectorFavorXYPlane.\r\n */\r\n public static createPerpendicularVectorFavorPlaneContainingZ(vectorA: Vector3d, result?: Vector3d): Vector3d {\r\n /**\r\n * vectorA, result (below), and \"vectorA cross result\" form a coordinate system where \"result\" is located on\r\n * the XY-plane. Once you've got a coordinate system with an axis in the XY-plane, your other two axes form\r\n * a plane that includes the z-axis.\r\n */\r\n result = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA, result);\r\n return vectorA.crossProduct(result, result);\r\n }\r\n /**\r\n * Create a matrix from column vectors, shuffled into place per axisOrder\r\n * For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]\r\n * Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because\r\n * Y is at index 0 so vectorU goes to the column Y (column 2), Z is at index 1 so vectorV goes\r\n * to the column Z (column 3), and X is at index 2 so vectorW goes to the column X (column 1)\r\n */\r\n public static createShuffledColumns(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d,\r\n axisOrder: AxisOrder, result?: Matrix3d): Matrix3d {\r\n const target = Matrix3d._create(result);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 0), vectorU);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 1), vectorV);\r\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 2), vectorW);\r\n return target;\r\n }\r\n /**\r\n * Create a new orthogonal matrix (perpendicular columns, unit length, transpose is inverse).\r\n * * `vectorA1 = Normalized vectorA` is placed in the column specified by **first** letter in\r\n * the AxisOrder name.\r\n * * Normalized `vectorC1 = vectorA1 cross vectorB` is placed in the column specified by **third**\r\n * letter in the AxisOrder name.\r\n * * Normalized `vectorC1 cross vectorA` is placed in the column specified by **second**\r\n * letter in the AxisOrder name.\r\n * * This function internally uses createShuffledColumns.\r\n */\r\n public static createRigidFromColumns(vectorA: Vector3d, vectorB: Vector3d, axisOrder: AxisOrder,\r\n result?: Matrix3d): Matrix3d | undefined {\r\n const vectorA1 = vectorA.normalize();\r\n if (vectorA1) {\r\n const vectorC1 = vectorA1.unitCrossProduct(vectorB);\r\n if (vectorC1) {\r\n const vectorB1 = vectorC1.unitCrossProduct(vectorA);\r\n if (vectorB1) {\r\n const retVal = Matrix3d.createShuffledColumns(vectorA1, vectorB1, vectorC1, axisOrder, result);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct a rigid matrix (orthogonal matrix with +1 determinant) using vectorA and its 2 perpendicular.\r\n * * If axisOrder is not passed then `AxisOrder = AxisOrder.ZXY` is used as default.\r\n * * This function internally uses createPerpendicularVectorFavorXYPlane and createRigidFromColumns.\r\n */\r\n public static createRigidHeadsUp(vectorA: Vector3d, axisOrder: AxisOrder = AxisOrder.ZXY,\r\n result?: Matrix3d): Matrix3d {\r\n const vectorB = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA);\r\n const matrix = Matrix3d.createRigidFromColumns(vectorA, vectorB, axisOrder, result);\r\n if (matrix) {\r\n matrix.setupInverseTranspose();\r\n return matrix;\r\n }\r\n return Matrix3d.createIdentity(result);\r\n }\r\n /** Return the matrix for rotation of `angle` around desired `axis` */\r\n public static createRotationAroundVector(axis: Vector3d, angle: Angle, result?: Matrix3d): Matrix3d | undefined {\r\n // Rodriguez formula (matrix form), https://mathworld.wolfram.com/RodriguesRotationFormula.html\r\n const c = angle.cos();\r\n const s = angle.sin();\r\n const v = 1.0 - c;\r\n const unit = axis.normalize();\r\n if (unit) {\r\n const retVal = Matrix3d.createRowValues(\r\n unit.x * unit.x * v + c, unit.x * unit.y * v - s * unit.z, unit.x * unit.z * v + s * unit.y,\r\n unit.y * unit.x * v + s * unit.z, unit.y * unit.y * v + c, unit.y * unit.z * v - s * unit.x,\r\n unit.z * unit.x * v - s * unit.y, unit.z * unit.y * v + s * unit.x, unit.z * unit.z * v + c,\r\n result\r\n );\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n return undefined;\r\n }\r\n /** Returns a rotation of specified angle around one of the main axis (X,Y,Z).\r\n * @param axisIndex index of axis (AxisIndex.X, AxisIndex.Y, AxisIndex.Z) kept fixed by the rotation.\r\n * @param angle angle of rotation\r\n * @param result optional result matrix.\r\n * * Math details of 3d rotation matrices derivation can be found at docs/learning/geometry/Angle.md\r\n */\r\n public static createRotationAroundAxisIndex(axisIndex: AxisIndex, angle: Angle, result?: Matrix3d): Matrix3d {\r\n const c = angle.cos();\r\n const s = angle.sin();\r\n let myResult;\r\n if (axisIndex === AxisIndex.X) {\r\n myResult = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, c, -s,\r\n 0, s, c,\r\n result);\r\n } else if (axisIndex === AxisIndex.Y) {\r\n myResult = Matrix3d.createRowValues(\r\n c, 0, s,\r\n 0, 1, 0,\r\n -s, 0, c,\r\n result);\r\n } else {\r\n myResult = Matrix3d.createRowValues(\r\n c, -s, 0,\r\n s, c, 0,\r\n 0, 0, 1,\r\n result);\r\n }\r\n myResult.setupInverseTranspose();\r\n return myResult;\r\n }\r\n /**\r\n * Replace current rows Ui and Uj with (c*Ui + s*Uj) and (c*Uj - s*Ui).\r\n * * There is no checking for i,j being 0,1,2.\r\n * @param i first row index. **must be 0,1,2** (unchecked)\r\n * @param j second row index. **must be 0,1,2** (unchecked)\r\n * @param c fist coefficient\r\n * @param s second coefficient\r\n */\r\n private applyGivensRowOp(i: number, j: number, c: number, s: number): void {\r\n let ii = 3 * i;\r\n let jj = 3 * j;\r\n const limit = ii + 3;\r\n for (; ii < limit; ii++, jj++) {\r\n const a = this.coffs[ii];\r\n const b = this.coffs[jj];\r\n this.coffs[ii] = a * c + b * s;\r\n this.coffs[jj] = -a * s + b * c;\r\n }\r\n }\r\n /**\r\n * Replace current columns Ui and Uj with (c*Ui + s*Uj) and (c*Uj - s*Ui).\r\n * * There is no checking for i,j being 0,1,2.\r\n * * This is used in compute intensive inner loops\r\n * @param i first row index. **must be 0,1,2** (unchecked)\r\n * @param j second row index. **must be 0,1,2** (unchecked)\r\n * @param c fist coefficient\r\n * @param s second coefficient\r\n */\r\n public applyGivensColumnOp(i: number, j: number, c: number, s: number): void {\r\n const limit = i + 9;\r\n for (; i < limit; i += 3, j += 3) {\r\n const a = this.coffs[i];\r\n const b = this.coffs[j];\r\n this.coffs[i] = a * c + b * s;\r\n this.coffs[j] = -a * s + b * c;\r\n }\r\n }\r\n /**\r\n * Create a matrix from column vectors.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ U_z & V_z & W_z \\end{bmatrix}\r\n * ```\r\n */\r\n public static createColumns(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n vectorU.z, vectorV.z, vectorW.z,\r\n result\r\n );\r\n }\r\n /** Create a matrix with each column's _x,y_ parts given `XAndY` and separate numeric z values.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ u & v & w \\end{bmatrix}\r\n * ```\r\n */\r\n public static createColumnsXYW(vectorU: XAndY, u: number, vectorV: XAndY, v: number,\r\n vectorW: XAndY, w: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n u, v, w,\r\n result\r\n );\r\n }\r\n /** Create a matrix from \"as viewed\" right and up vectors.\r\n * * ColumnX points in the rightVector direction\r\n * * ColumnY points in the upVector direction\r\n * * ColumnZ is a unit cross product of ColumnX and ColumnY.\r\n * * Optionally rotate by 45 degrees around `upVector` to bring its left or right vertical edge to center.\r\n * * Optionally rotate by arctan(1/sqrt(2)) ~ 35.264 degrees around `rightVector` to bring the top or bottom\r\n * horizontal edge of the view to the center (for isometric views).\r\n * * This is expected to be used with various principal unit vectors that are perpendicular to each other.\r\n * * STANDARD TOP VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(), 0, 0)\r\n * * STANDARD FRONT VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD BACK VIEW: createViewedAxes(Vector3d.unitX(-1), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD RIGHT VIEW: createViewedAxes(Vector3d.unitY(), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD LEFT VIEW: createViewedAxes(Vector3d.unitY(-1), Vector3d.unitZ(), 0, 0)\r\n * * STANDARD BOTTOM VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(-1), 0, 0)\r\n * * STANDARD ISO VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), -1, 1)\r\n * * STANDARD RIGHT ISO VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), 1, 1)\r\n * * Front, right, back, left, top, and bottom standard views are views from faces of the cube\r\n * and iso and right iso standard views are views from corners of the cube.\r\n * * Note: createViewedAxes is column-based so always returns local to world\r\n *\r\n * @param rightVector ColumnX of the returned matrix. Expected to be perpendicular to upVector.\r\n * @param upVector ColumnY of the returned matrix. Expected to be perpendicular to rightVector.\r\n * @param leftNoneRight Specifies the ccw rotation around `upVector` axis. Normally one of \"-1\", \"0\", and \"1\",\r\n * where \"-1\" indicates rotation by 45 degrees to bring the left vertical edge to center, \"0\" means no rotation,\r\n * and \"1\" indicates rotation by 45 degrees to bring the right vertical edge to center. Other numbers are\r\n * used as multiplier for this 45 degree rotation.\r\n * @param topNoneBottom Specifies the ccw rotation around `rightVector` axis. Normally one of \"-1\", \"0\", and \"1\",\r\n * where \"-1\" indicates isometric rotation (35.264 degrees) to bring the bottom upward, \"0\" means no rotation,\r\n * and \"1\" indicates isometric rotation (35.264 degrees) to bring the top downward. Other numbers are\r\n * used as multiplier for the 35.264 degree rotation.\r\n * @returns matrix = [rightVector, upVector, rightVector cross upVector] with the applied rotations specified\r\n * by leftNoneRight and topNoneBottom. Returns undefined if rightVector and upVector are parallel.\r\n */\r\n public static createViewedAxes(rightVector: Vector3d, upVector: Vector3d, leftNoneRight: number = 0,\r\n topNoneBottom: number = 0): Matrix3d | undefined {\r\n const columnZ = rightVector.crossProduct(upVector);\r\n if (columnZ.normalizeInPlace()) {\r\n // matrix = [rightVector, upVector, rightVector cross upVector]\r\n const matrix = Matrix3d.createColumns(rightVector, upVector, columnZ);\r\n // \"45 degrees * leftNoneRight\" rotation around Y\r\n if (leftNoneRight !== 0.0) {\r\n let c = Math.sqrt(0.5);\r\n let s = leftNoneRight < 0.0 ? -c : c;\r\n if (Math.abs(leftNoneRight) !== 1.0) {\r\n const radians = Angle.degreesToRadians(45.0 * leftNoneRight);\r\n c = Math.cos(radians);\r\n s = Math.sin(radians);\r\n }\r\n matrix.applyGivensColumnOp(2, 0, c, s); // rotate around Y (equivalent to matrix*rotationY)\r\n }\r\n // \"35.264 degrees * topNoneBottom\" rotation around X\r\n if (topNoneBottom !== 0.0) {\r\n const theta = topNoneBottom * Math.atan(Math.sqrt(0.5));\r\n const c = Math.cos(theta);\r\n const s = Math.sin(theta);\r\n matrix.applyGivensColumnOp(1, 2, c, -s); // rotate around X (equivalent to matrix*rotationX)\r\n }\r\n return matrix;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a rotation matrix for one of the 8 standard views.\r\n * * Default is TOP view (`local X = world X`, `local Y = world Y`, `local Z = world Z`).\r\n * * To change view from the TOP to one of the other 7 standard views, we need to multiply \"world data\" to\r\n * the corresponding matrix1 provided by `createStandardWorldToView(index, false)` and then\r\n * `matrix1.multiply(world data)` will return \"local data\".\r\n * * To change view back to the TOP, we need to multiply \"local data\" to the corresponding matrix2 provided\r\n * by `createStandardWorldToView(index, true)` and then `matrix2.multiply(local data)` will returns \"world data\".\r\n * * Note: No matter how you rotate the world axis, local X is always pointing right, local Y is always pointing up,\r\n * and local Z is always pointing toward you.\r\n *\r\n * @param index standard view index `StandardViewIndex.Top, Bottom, Left, Right, Front, Back, Iso, RightIso`\r\n * @param invert if false (default), the return matrix is world to local (view) and if true, the the return\r\n * matrix is local (view) to world.\r\n * @param result optional result.\r\n */\r\n public static createStandardWorldToView(index: StandardViewIndex, invert: boolean = false, result?: Matrix3d): Matrix3d {\r\n switch (index) {\r\n // Start with TOP view, ccw rotation by 180 degrees around X\r\n case StandardViewIndex.Bottom:\r\n result = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, -1, 0,\r\n 0, 0, -1);\r\n break;\r\n // Start with TOP view, ccw rotation by -90 degrees around X and by 90 degrees around Z\r\n case StandardViewIndex.Left:\r\n result = Matrix3d.createRowValues(\r\n 0, -1, 0,\r\n 0, 0, 1,\r\n -1, 0, 0);\r\n break;\r\n // Start with TOP view, ccw rotation by -90 degrees around X and by -90 degrees around Z\r\n case StandardViewIndex.Right:\r\n result = Matrix3d.createRowValues(\r\n 0, 1, 0,\r\n 0, 0, 1,\r\n 1, 0, 0);\r\n break;\r\n // Start with TOP view, ccw rotation by -90 degrees around X\r\n case StandardViewIndex.Front:\r\n result = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, 0, 1,\r\n 0, -1, 0);\r\n break;\r\n // Start with TOP view, ccw rotation by -90 degrees around X and by 180 degrees around Z\r\n case StandardViewIndex.Back:\r\n result = Matrix3d.createRowValues(\r\n -1, 0, 0,\r\n 0, 0, 1,\r\n 0, 1, 0);\r\n break;\r\n /**\r\n * Isometric view\r\n * Start with FRONT view, ccw rotation by -45 degrees around Y and by arctan(1/sqrt(2)) ~ 35.264 degrees around X\r\n * cos(45) = 1/sqrt(2) = 0.70710678118 and sin(45) = 1/sqrt(2) = 0.70710678118\r\n * cos(35.264) = 2/sqrt(6) = 0.81649658092 and sin(35.264) = 1/sqrt(3) = 0.57735026919\r\n * More info: https://en.wikipedia.org/wiki/Isometric_projection\r\n */\r\n case StandardViewIndex.Iso:\r\n result = Matrix3d.createRowValues(\r\n 0.707106781186548, -0.70710678118654757, 0.00000000000000000,\r\n 0.408248290463863, 0.40824829046386302, 0.81649658092772603,\r\n -0.577350269189626, -0.57735026918962573, 0.57735026918962573);\r\n break;\r\n // Start with FRONT view, ccw rotation by 45 degrees around Y and by 35.264 degrees around X\r\n case StandardViewIndex.RightIso:\r\n result = Matrix3d.createRowValues(\r\n 0.707106781186548, 0.70710678118654757, 0.00000000000000000,\r\n -0.408248290463863, 0.40824829046386302, 0.81649658092772603,\r\n 0.577350269189626, -0.57735026918962573, 0.57735026918962573);\r\n break;\r\n // no rotation\r\n case StandardViewIndex.Top:\r\n default:\r\n result = Matrix3d.createIdentity(result);\r\n }\r\n if (invert)\r\n result.transposeInPlace(); // matrix is rigid so transpose and inverse are the same\r\n return result;\r\n }\r\n /**\r\n * Apply (in place) a jacobi update that zeros out this.at(i,j).\r\n * @param i row index of zeroed member\r\n * @param j column index of zeroed member\r\n * @param k other row/column index (different from i and j)\r\n * @param leftEigenVectors a matrix that its columns will be filled by eigenvectors of this Matrix3d\r\n * (allocated by caller, computed and filled by this function)\r\n */\r\n private applyFastSymmetricJacobiUpdate(i: number, j: number, k: number, leftEigenVectors: Matrix3d): number {\r\n const indexII = 4 * i;\r\n const indexJJ = 4 * j;\r\n const indexIJ = 3 * i + j;\r\n const indexIK = 3 * i + k;\r\n const indexJK = 3 * j + k;\r\n const dotUU = this.coffs[indexII];\r\n const dotVV = this.coffs[indexJJ];\r\n const dotUV = this.coffs[indexIJ];\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(dotUU - dotVV, 2.0 * dotUV);\r\n if (Math.abs(dotUV) < 1.0e-15 * (dotUU + dotVV))\r\n return 0.0;\r\n const c = jacobi.c;\r\n const s = jacobi.s;\r\n const cc = c * c;\r\n const ss = s * s;\r\n const sc2 = 2.0 * c * s;\r\n this.coffs[indexII] = cc * dotUU + sc2 * dotUV + ss * dotVV;\r\n this.coffs[indexJJ] = ss * dotUU - sc2 * dotUV + cc * dotVV;\r\n this.coffs[indexIJ] = 0.0;\r\n const a = this.coffs[indexIK];\r\n const b = this.coffs[indexJK];\r\n this.coffs[indexIK] = a * c + b * s;\r\n this.coffs[indexJK] = -s * a + c * b;\r\n this.coffs[3 * j + i] = 0.0;\r\n this.coffs[3 * k + i] = this.coffs[indexIK];\r\n this.coffs[3 * k + j] = this.coffs[indexJK];\r\n leftEigenVectors.applyGivensColumnOp(i, j, c, s);\r\n return Math.abs(dotUV);\r\n }\r\n /**\r\n * Factor this (symmetrized) as a product U * lambda * UT where U is orthogonal, lambda is diagonal.\r\n * The upper triangle is mirrored to lower triangle to enforce symmetry.\r\n * @param leftEigenvectors a matrix that its columns will be filled by eigenvectors of this Matrix3d\r\n * (allocated by caller, computed and filled by this function)\r\n * @param lambda a vector that its entries will be filled by eigenvalues of this Matrix3d\r\n * (allocated by caller, computed and filled by this function)\r\n */\r\n public fastSymmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\r\n const matrix = this.clone();\r\n leftEigenvectors.setIdentity();\r\n const tolerance = 1.0e-12 * this.sumSquares();\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = matrix.applyFastSymmetricJacobiUpdate(0, 1, 2, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobiUpdate(0, 2, 1, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobiUpdate(1, 2, 0, leftEigenvectors);\r\n // console.log(\"symmetric sum\", sum);\r\n // console.log (\"sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"symmetric iterations\", iteration);\r\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Compute the (unit vector) axis and angle of rotation.\r\n * * math details can be found at docs/learning/geometry/Angle.md\r\n * @returns Returns axis and angle of rotation with result.ok === true when the conversion succeeded.\r\n */\r\n public getAxisAndAngleOfRotation(): { axis: Vector3d, angle: Angle, ok: boolean } {\r\n const trace = this.coffs[0] + this.coffs[4] + this.coffs[8];\r\n const skewXY = this.coffs[3] - this.coffs[1]; // 2*z*sin\r\n const skewYZ = this.coffs[7] - this.coffs[5]; // 2*y*sin\r\n const skewZX = this.coffs[2] - this.coffs[6]; // 2*x*sin\r\n // trace = (m00^2 + m11^2 + m22^2) * (1-cos) + 3cos = (1-cos) + 3cos = 1 + 2cos ==> cos = (trace-1) / 2\r\n const c = (trace - 1.0) / 2.0; // cosine\r\n const s = Geometry.hypotenuseXYZ(skewXY, skewYZ, skewZX) / 2.0; // sine\r\n const e = c * c + s * s - 1.0; // s^2 + c^2 = 1\r\n // if s^2 + c^2 != 1 then we have a bad matrix so return false\r\n if (Math.abs(e) > Geometry.smallAngleRadians) {\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n // sin is close to 0 then we got to special cases (angle 0 or 180) which needs to be handled differently\r\n if (Math.abs(s) < Geometry.smallAngleRadians) {\r\n if (c > 0) // sin = 0 and cos = 1 so angle = 0 (i.e., no rotation)\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: true };\r\n /**\r\n * If sin = 0 and cos = -1 then angle = 180 (i.e., 180 degree rotation around some axis)\r\n * then the rotation matrix becomes\r\n * 2x^2-1 2xy 2xz\r\n * 2xy 2y^2-1 2yz\r\n * 2xz 2yz 2z^2-1\r\n * Note that the matrix is symmetric.\r\n * If rotation is around one the standard basis then non-diagonal entries become 0 and we\r\n * have one 1 and two -1s on the diagonal.\r\n * If rotation is around an axis other than standard basis, then the axis is the eigenvector\r\n * of the rotation matrix with eigenvalue = 1.\r\n */\r\n const axx = this.coffs[0];\r\n const ayy = this.coffs[4];\r\n const azz = this.coffs[8];\r\n // Look for a pair of \"-1\" entries on the diagonal (for rotation around the basis X,Y,Z axis)\r\n if (Geometry.isAlmostEqualNumber(-1.0, ayy) && Geometry.isAlmostEqualNumber(-1, azz)) {\r\n return { axis: Vector3d.create(1, 0, 0), angle: Angle.createDegrees(180), ok: true };\r\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, azz)) {\r\n return { axis: Vector3d.create(0, 1, 0), angle: Angle.createDegrees(180), ok: true };\r\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, ayy)) {\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createDegrees(180), ok: true };\r\n }\r\n // Look for eigenvector with eigenvalue = 1\r\n const eigenvectors = Matrix3d.createIdentity();\r\n const eigenvalues = Vector3d.create(0, 0, 0);\r\n if (this.fastSymmetricEigenvalues(eigenvectors, eigenvalues)) {\r\n for (let axisIndex = 0; axisIndex < 2; axisIndex++) {\r\n const lambda = eigenvalues.at(axisIndex);\r\n if (Geometry.isAlmostEqualNumber(1, lambda))\r\n return { axis: eigenvectors.getColumn(axisIndex), angle: Angle.createDegrees(180), ok: true };\r\n }\r\n // if no eigenvalue = 1 was found return false\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n // if no axis was found return false\r\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\r\n }\r\n // good matrix and non-zero sine\r\n const a = 1.0 / (2.0 * s);\r\n const result = {\r\n axis: Vector3d.create(skewYZ * a, skewZX * a, skewXY * a),\r\n angle: Angle.createAtan2(s, c),\r\n ok: true,\r\n };\r\n return result;\r\n }\r\n /** Rotate so columns i and j become perpendicular */\r\n private applyJacobiColumnRotation(i: number, j: number, matrixU: Matrix3d): number {\r\n const uDotU = this.coffs[i] * this.coffs[i] + this.coffs[i + 3] * this.coffs[i + 3] + this.coffs[i + 6] * this.coffs[i + 6];\r\n const vDotV = this.coffs[j] * this.coffs[j] + this.coffs[j + 3] * this.coffs[j + 3] + this.coffs[j + 6] * this.coffs[j + 6];\r\n const uDotV = this.coffs[i] * this.coffs[j] + this.coffs[i + 3] * this.coffs[j + 3] + this.coffs[i + 6] * this.coffs[j + 6];\r\n // const c2 = uDotU - vDotV;\r\n // const s2 = 2.0 * uDotV;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\r\n // const h = Math.hypot(c2, s2);\r\n // console.log(\" c2 s2\", c2 / h, s2 / h);\r\n // console.log(\" C S \", Math.cos(2 * jacobi.radians), Math.sin(2 * jacobi.radians));\r\n // console.log(\"i j uDotV\", i, j, uDotV);\r\n if (Math.abs(jacobi.s) < 2.0e-15)\r\n return 0.0;\r\n this.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n matrixU.applyGivensRowOp(i, j, jacobi.c, jacobi.s);\r\n // const BTB = this.multiplyMatrixTransposeMatrix(this);\r\n // console.log(\"BTB\", BTB.at(0, 0), BTB.at(1, 1), BTB.at(2, 2), \" off\", BTB.at(0, 1), BTB.at(0, 2), BTB.at(1, 2), \" at(i,j)\", BTB.at(i, j));\r\n return Math.abs(uDotV);\r\n }\r\n /**\r\n * Factor this as a product C * U where C has mutually perpendicular columns and\r\n * U is orthogonal.\r\n * @param matrixC (allocate by caller, computed here)\r\n * @param matrixU (allocate by caller, computed here)\r\n */\r\n public factorPerpendicularColumns(matrixC: Matrix3d, matrixU: Matrix3d): boolean {\r\n matrixC.setFrom(this);\r\n matrixU.setIdentity();\r\n const tolerance = 1.0e-12 * this.sumSquares();\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = matrixC.applyJacobiColumnRotation(0, 1, matrixU)\r\n + matrixC.applyJacobiColumnRotation(0, 2, matrixU)\r\n + matrixC.applyJacobiColumnRotation(1, 2, matrixU);\r\n // console.log (\" sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"jacobi iterations\", iteration);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Factor this matrix M as a product M = V * D * U where V and U are orthogonal, and D is diagonal (scale matrix).\r\n * @param matrixV left orthogonal factor (allocate by caller, computed here)\r\n * @param scale diagonal entries of D (allocate by caller, computed here)\r\n * @param matrixU right orthogonal factor (allocate by caller, computed here)\r\n */\r\n public factorOrthogonalScaleOrthogonal(matrixV: Matrix3d, scale: Point3d, matrixU: Matrix3d): boolean {\r\n const matrixVD = Matrix3d.createZero();\r\n if (!this.factorPerpendicularColumns(matrixVD, matrixU))\r\n return false;\r\n\r\n const column: Vector3d[] = [];\r\n column.push(matrixVD.getColumn(0));\r\n column.push(matrixVD.getColumn(1));\r\n column.push(matrixVD.getColumn(2));\r\n scale.set(column[0].magnitude(), column[1].magnitude(), column[2].magnitude());\r\n\r\n const det = matrixVD.determinant();\r\n if (det < 0)\r\n scale.z = - scale.z;\r\n\r\n const almostZero = 1.0e-15;\r\n const scaleXIsZero = Math.abs(scale.x) < almostZero;\r\n const scaleYIsZero = Math.abs(scale.y) < almostZero;\r\n const scaleZIsZero = Math.abs(scale.z) < almostZero;\r\n\r\n // ASSUME: any zero-magnitude column(s) of matrixVD are last\r\n if (!scaleXIsZero && !scaleYIsZero && !scaleZIsZero) { // full rank\r\n matrixV = matrixVD.scaleColumns(1 / scale.x, 1 / scale.y, 1 / scale.z, matrixV);\r\n } else if (!scaleXIsZero && !scaleYIsZero) { // rank 2\r\n column[0].scaleInPlace(1 / scale.x);\r\n column[1].scaleInPlace(1 / scale.y);\r\n column[2] = column[0].unitCrossProduct(column[1], column[2])!;\r\n matrixV.setColumns(column[0], column[1], column[2]);\r\n } else if (!scaleXIsZero) { // rank 1\r\n matrixV = Matrix3d.createRigidHeadsUp(column[0], AxisOrder.XYZ, matrixV); // preserve column0\r\n } else { // rank 0\r\n matrixV.setIdentity();\r\n }\r\n return true;\r\n }\r\n /** Apply a jacobi step to lambda which evolves towards diagonal. */\r\n private applySymmetricJacobi(i: number, j: number, lambda: Matrix3d): number {\r\n const uDotU = lambda.at(i, i);\r\n const vDotV = lambda.at(j, j);\r\n const uDotV = lambda.at(i, j);\r\n if (Math.abs(uDotV) < 1.0e-15 * (uDotU + vDotV))\r\n return 0.0;\r\n // const c2 = uDotU - vDotV;\r\n // const s2 = 2.0 * uDotV;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\r\n // const h = Math.hypot(c2, s2);\r\n // console.log(\" c2 s2\", c2 / h, s2 / h);\r\n // console.log(\" C S \", Math.cos(2 * jacobi.radians), Math.sin(2 * jacobi.radians));\r\n // console.log(\"i j uDotV\", i, j, uDotV);\r\n if (Math.abs(jacobi.s) < 2.0e-15)\r\n return 0.0;\r\n // Factored form is this *lambda * thisTranspose\r\n // Let Q be the rotation matrix. Q*QT is inserted, viz\r\n // this*Q * QT * lambda * Q*thisTranspose\r\n this.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n\r\n lambda.applyGivensRowOp(i, j, jacobi.c, jacobi.s);\r\n lambda.applyGivensColumnOp(i, j, jacobi.c, jacobi.s);\r\n // const BTB = this.multiplyMatrixTransposeMatrix(this);\r\n // console.log(\"BTB\", BTB.at(0, 0), BTB.at(1, 1), BTB.at(2, 2), \" off\", BTB.at(0, 1), BTB.at(0, 2), BTB.at(1, 2), \" at(i,j)\", BTB.at(i, j));\r\n return Math.abs(uDotV);\r\n }\r\n /**\r\n * Factor this (symmetrized) as a product U * lambda * UT where U is orthogonal, lambda is diagonal.\r\n * The upper triangle is mirrored to lower triangle to enforce symmetry.\r\n * @param matrixC (allocate by caller, computed here)\r\n * @param factor (allocate by caller, computed here)\r\n */\r\n public symmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\r\n const matrix = this.clone();\r\n leftEigenvectors.setIdentity();\r\n matrix.coffs[3] = matrix.coffs[1];\r\n matrix.coffs[6] = matrix.coffs[2];\r\n matrix.coffs[7] = matrix.coffs[5];\r\n const tolerance = 1.0e-12 * this.sumSquares();\r\n for (let iteration = 0; iteration < 7; iteration++) {\r\n const sum = leftEigenvectors.applySymmetricJacobi(0, 1, matrix)\r\n + leftEigenvectors.applySymmetricJacobi(0, 2, matrix)\r\n + leftEigenvectors.applySymmetricJacobi(1, 2, matrix);\r\n // console.log(\"symmetric sum\", sum);\r\n // console.log (\" sum\", sum);\r\n if (sum < tolerance) {\r\n // console.log(\"symmetric iterations\", iteration);\r\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Return a matrix that rotates a fraction of the angular sweep from vectorA to vectorB.\r\n * @param vectorA initial vector position\r\n * @param fraction fractional rotation (1 means rotate all the way)\r\n * @param vectorB final vector position\r\n * @param result optional result matrix.\r\n */\r\n public static createPartialRotationVectorToVector(vectorA: Vector3d, fraction: number, vectorB: Vector3d,\r\n result?: Matrix3d): Matrix3d | undefined {\r\n let upVector = vectorA.unitCrossProduct(vectorB);\r\n // the usual case (both vectors and also their cross product is non-zero)\r\n if (upVector) {\r\n return Matrix3d.createRotationAroundVector(\r\n upVector,\r\n Angle.createRadians(fraction * vectorA.planarAngleTo(vectorB, upVector).radians)\r\n );\r\n }\r\n // if either vector is zero\r\n if (Geometry.isSmallMetricDistance(vectorA.magnitude())\r\n || Geometry.isSmallMetricDistance(vectorB.magnitude()))\r\n return undefined;\r\n // aligned vectors (cross product = 0, dot product > 0)\r\n if (vectorA.dotProduct(vectorB) > 0.0)\r\n return Matrix3d.createIdentity(result);\r\n // opposing vectors (cross product = 0, dot product < 0)\r\n upVector = Matrix3d.createPerpendicularVectorFavorPlaneContainingZ(vectorA, upVector);\r\n return Matrix3d.createRotationAroundVector(upVector, Angle.createRadians(fraction * Math.PI));\r\n }\r\n /** Returns a matrix that rotates from vectorA to vectorB. */\r\n public static createRotationVectorToVector(vectorA: Vector3d, vectorB: Vector3d, result?: Matrix3d): Matrix3d | undefined {\r\n return this.createPartialRotationVectorToVector(vectorA, 1.0, vectorB, result);\r\n }\r\n /** Create a 90 degree rotation around a principal axis */\r\n public static create90DegreeRotationAroundAxis(axisIndex: number): Matrix3d {\r\n axisIndex = Geometry.cyclic3dAxis(axisIndex);\r\n if (axisIndex === 0) {\r\n const retVal = Matrix3d.createRowValues(\r\n 1, 0, 0,\r\n 0, 0, -1,\r\n 0, 1, 0);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n } else if (axisIndex === 1) {\r\n const retVal = Matrix3d.createRowValues(\r\n 0, 0, 1,\r\n 0, 1, 0,\r\n -1, 0, 0);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n } else {\r\n const retVal = Matrix3d.createRowValues(\r\n 0, -1, 0,\r\n 1, 0, 0,\r\n 0, 0, 1);\r\n retVal.setupInverseTranspose();\r\n return retVal;\r\n }\r\n }\r\n /** Return (a copy of) the X column */\r\n public columnX(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[0], this.coffs[3], this.coffs[6], result);\r\n }\r\n /** Return (a copy of) the Y column */\r\n public columnY(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[1], this.coffs[4], this.coffs[7], result);\r\n }\r\n /** Return (a copy of) the Z column */\r\n public columnZ(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[2], this.coffs[5], this.coffs[8], result);\r\n }\r\n /** Return the X column magnitude squared */\r\n public columnXMagnitudeSquared(): number {\r\n return Geometry.hypotenuseSquaredXYZ(this.coffs[0], this.coffs[3], this.coffs[6]);\r\n }\r\n /** Return the Y column magnitude squared */\r\n public columnYMagnitudeSquared(): number {\r\n return Geometry.hypotenuseSquaredXYZ(this.coffs[1], this.coffs[4], this.coffs[7]);\r\n }\r\n /** Return the Z column magnitude squared */\r\n public columnZMagnitudeSquared(): number {\r\n return Geometry.hypotenuseSquaredXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\r\n }\r\n /** Return the X column magnitude */\r\n public columnXMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6]);\r\n }\r\n /** Return the Y column magnitude */\r\n public columnYMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7]);\r\n }\r\n /** Return the Z column magnitude */\r\n public columnZMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\r\n }\r\n /** Return magnitude of columnX cross columnY. */\r\n public columnXYCrossProductMagnitude(): number {\r\n return Geometry.crossProductMagnitude(\r\n this.coffs[0], this.coffs[3], this.coffs[6],\r\n this.coffs[1], this.coffs[4], this.coffs[7]\r\n );\r\n }\r\n /** Return the X row magnitude */\r\n public rowXMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[1], this.coffs[2]);\r\n }\r\n /** Return the Y row magnitude */\r\n public rowYMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[3], this.coffs[4], this.coffs[5]);\r\n }\r\n /** Return the Z row magnitude */\r\n public rowZMagnitude(): number {\r\n return Geometry.hypotenuseXYZ(this.coffs[6], this.coffs[7], this.coffs[8]);\r\n }\r\n /** Return the dot product of column X with column Y */\r\n public columnXDotColumnY(): number {\r\n return this.coffs[0] * this.coffs[1]\r\n + this.coffs[3] * this.coffs[4]\r\n + this.coffs[6] * this.coffs[7];\r\n }\r\n /**\r\n * Dot product of an indexed column with a vector given as x,y,z\r\n * @param columnIndex index of column. Must be 0,1,2.\r\n * @param x x component of vector\r\n * @param y y component of vector\r\n * @param z z component of vector\r\n */\r\n public columnDotXYZ(columnIndex: AxisIndex, x: number, y: number, z: number) {\r\n return this.coffs[columnIndex] * x + this.coffs[columnIndex + 3] * y + this.coffs[columnIndex + 6] * z;\r\n }\r\n /** Return (a copy of) the X row */\r\n public rowX(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[0], this.coffs[1], this.coffs[2], result);\r\n }\r\n /** Return (a copy of) the Y row */\r\n public rowY(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[3], this.coffs[4], this.coffs[5], result);\r\n }\r\n /** Return (a copy of) the Z row */\r\n public rowZ(result?: Vector3d): Vector3d {\r\n return Vector3d.create(this.coffs[6], this.coffs[7], this.coffs[8], result);\r\n }\r\n /** Return the dot product of the vector parameter with the X column. */\r\n public dotColumnX(vector: XYZ): number {\r\n return vector.x * this.coffs[0] + vector.y * this.coffs[3] + vector.z * this.coffs[6];\r\n }\r\n /** Return the dot product of the vector parameter with the Y column. */\r\n public dotColumnY(vector: XYZ): number {\r\n return vector.x * this.coffs[1] + vector.y * this.coffs[4] + vector.z * this.coffs[7];\r\n }\r\n /** Return the dot product of the vector parameter with the Z column. */\r\n public dotColumnZ(vector: XYZ): number {\r\n return vector.x * this.coffs[2] + vector.y * this.coffs[5] + vector.z * this.coffs[8];\r\n }\r\n /** Return the dot product of the vector parameter with the X row. */\r\n public dotRowX(vector: XYZ): number {\r\n return vector.x * this.coffs[0] + vector.y * this.coffs[1] + vector.z * this.coffs[2];\r\n }\r\n /** Return the dot product of the vector parameter with the Y row. */\r\n public dotRowY(vector: XYZ): number {\r\n return vector.x * this.coffs[3] + vector.y * this.coffs[4] + vector.z * this.coffs[5];\r\n }\r\n /** Return the dot product of the vector parameter with the Z row. */\r\n public dotRowZ(vector: XYZ): number {\r\n return vector.x * this.coffs[6] + vector.y * this.coffs[7] + vector.z * this.coffs[8];\r\n }\r\n /** Return the dot product of the x,y,z with the X row. */\r\n public dotRowXXYZ(x: number, y: number, z: number): number {\r\n return x * this.coffs[0] + y * this.coffs[1] + z * this.coffs[2];\r\n }\r\n /** Return the dot product of the x,y,z with the Y row. */\r\n public dotRowYXYZ(x: number, y: number, z: number): number {\r\n return x * this.coffs[3] + y * this.coffs[4] + z * this.coffs[5];\r\n }\r\n /** Return the dot product of the x,y,z with the Z row. */\r\n public dotRowZXYZ(x: number, y: number, z: number): number {\r\n return x * this.coffs[6] + y * this.coffs[7] + z * this.coffs[8];\r\n }\r\n /** Return the cross product of the Z column with the vector parameter. */\r\n public columnZCrossVector(vector: XYZ, result?: Vector3d): Vector3d {\r\n return Geometry.crossProductXYZXYZ(this.coffs[2], this.coffs[5], this.coffs[8], vector.x, vector.y, vector.z, result);\r\n }\r\n /** Set data from xyz parts of Point4d (w part of Point4d ignored) */\r\n public setColumnsPoint4dXYZ(vectorU: Point4d, vectorV: Point4d, vectorW: Point4d) {\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.setRowValues(\r\n vectorU.x, vectorV.x, vectorW.x,\r\n vectorU.y, vectorV.y, vectorW.y,\r\n vectorU.z, vectorV.z, vectorW.z);\r\n }\r\n /**\r\n * Set entries in one column of the matrix.\r\n * @param columnIndex column index (this is interpreted cyclically. See Geometry.cyclic3dAxis for more info).\r\n * @param value x,yz, values for column. If undefined, zeros are installed.\r\n */\r\n public setColumn(columnIndex: number, value: Vector3d | undefined) {\r\n const index = Geometry.cyclic3dAxis(columnIndex);\r\n this.inverseState = InverseMatrixState.unknown;\r\n if (value) {\r\n this.coffs[index] = value.x;\r\n this.coffs[index + 3] = value.y;\r\n this.coffs[index + 6] = value.z;\r\n } else {\r\n this.coffs[index] = 0.0;\r\n this.coffs[index + 3] = 0.0;\r\n this.coffs[index + 6] = 0.0;\r\n }\r\n }\r\n /**\r\n * Set all columns of the matrix. Any undefined vector is zeros.\r\n * @param vectorX values for column 0\r\n * @param vectorY values for column 1\r\n * @param vectorZ optional values for column 2 (it's optional in case column 2 is 000, which is a\r\n * projection onto the xy-plane)\r\n */\r\n public setColumns(vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ?: Vector3d) {\r\n this.setColumn(0, vectorX);\r\n this.setColumn(1, vectorY);\r\n this.setColumn(2, vectorZ);\r\n }\r\n /**\r\n * Set entries in one row of the matrix.\r\n * @param rowIndex row index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\r\n * @param value x,y,z values for row.\r\n */\r\n public setRow(rowIndex: number, value: Vector3d) {\r\n const index = 3 * Geometry.cyclic3dAxis(rowIndex);\r\n this.coffs[index] = value.x;\r\n this.coffs[index + 1] = value.y;\r\n this.coffs[index + 2] = value.z;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /**\r\n * Return (a copy of) a column of the matrix.\r\n * @param i column index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\r\n * @param result optional preallocated result.\r\n */\r\n public getColumn(columnIndex: number, result?: Vector3d): Vector3d {\r\n const index = Geometry.cyclic3dAxis(columnIndex);\r\n return Vector3d.create(\r\n this.coffs[index],\r\n this.coffs[index + 3],\r\n this.coffs[index + 6],\r\n result\r\n );\r\n }\r\n /**\r\n * Return a (copy of) a row of the matrix.\r\n * @param i row index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\r\n * @param result optional preallocated result.\r\n */\r\n public getRow(columnIndex: number, result?: Vector3d): Vector3d {\r\n const index = 3 * Geometry.cyclic3dAxis(columnIndex);\r\n return Vector3d.create(\r\n this.coffs[index],\r\n this.coffs[index + 1],\r\n this.coffs[index + 2],\r\n result\r\n );\r\n }\r\n /**\r\n * Create a matrix from row vectors.\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}U_x & U_y & U_z \\\\ V_x & V_y & V_z \\\\ W_x & W_y & W_z \\end{bmatrix}\r\n * ```\r\n */\r\n public static createRows(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n vectorU.x, vectorU.y, vectorU.z,\r\n vectorV.x, vectorV.y, vectorV.z,\r\n vectorW.x, vectorW.y, vectorW.z,\r\n result\r\n );\r\n }\r\n /**\r\n * Create a matrix that scales along a specified `direction`. This means if you multiply the returned matrix\r\n * by a `vector`, you get `directional scale` of that `vector`. Suppose `plane` is the plane perpendicular\r\n * to the `direction`. When scale = 0, `directional scale` is projection of the `vector` to the `plane`.\r\n * When scale = 1, `directional scale` is the `vector` itself. When scale = -1, `directional scale` is\r\n * mirror of the `vector` across the `plane`. In general, When scale != 0, the result is computed by first\r\n * projecting the `vector` to the `plane`, then translating that projection along the `direction` (if scale > 0)\r\n * or in opposite direction (if scale < 0).\r\n * ```\r\n * equation\r\n * \\text{The matrix is } I + (s-1) D D^T\r\n * \\\\ \\text{with }D\\text{ being the normalized direction vector and }s\\text{ being the scale.}\r\n * ```\r\n */\r\n public static createDirectionalScale(direction: Vector3d, scale: number, result?: Matrix3d): Matrix3d {\r\n const unit = direction.normalize();\r\n if (unit) {\r\n const x = unit.x;\r\n const y = unit.y;\r\n const z = unit.z;\r\n const a = scale - 1;\r\n return Matrix3d.createRowValues(\r\n 1 + a * x * x, a * x * y, a * x * z,\r\n a * y * x, 1 + a * y * y, a * y * z,\r\n a * z * x, a * z * y, 1 + a * z * z,\r\n result\r\n );\r\n }\r\n return Matrix3d.createUniformScale(scale);\r\n }\r\n /**\r\n * Multiply `matrix * vector`, treating the vector is a column vector on the right.\r\n * ```\r\n * equation\r\n * \\matrixXY{A}\\columnSubXYZ{U}\r\n * ```\r\n * @return the vector result\r\n */\r\n public multiplyVector(vectorU: XYAndZ, result?: Vector3d): Vector3d {\r\n const x = vectorU.x;\r\n const y = vectorU.y;\r\n const z = vectorU.z;\r\n return Vector3d.create(\r\n this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z,\r\n this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z,\r\n this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z,\r\n result\r\n );\r\n }\r\n /**\r\n * Multiply `matrix * vector` in place for vector in the array, i.e. treating the vector is a column\r\n * vector on the right.\r\n * * Each `vector` is updated to be `matrix * vector`\r\n */\r\n public multiplyVectorArrayInPlace(data: XYZ[]): void {\r\n for (const v of data) v.set(\r\n this.coffs[0] * v.x + this.coffs[1] * v.y + this.coffs[2] * v.z,\r\n this.coffs[3] * v.x + this.coffs[4] * v.y + this.coffs[5] * v.z,\r\n this.coffs[6] * v.x + this.coffs[7] * v.y + this.coffs[8] * v.z\r\n );\r\n }\r\n /** Compute `origin - matrix * vector` */\r\n public static xyzMinusMatrixTimesXYZ(origin: XYAndZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Point3d.create(\r\n origin.x - (matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z),\r\n origin.y - (matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z),\r\n origin.z - (matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z),\r\n result\r\n );\r\n }\r\n /** Compute `origin + matrix * vector` using only the xy parts of the inputs. */\r\n public static xyPlusMatrixTimesXY(origin: XAndY, matrix: Matrix3d, vector: XAndY, result?: Point2d): Point2d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n return Point2d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y,\r\n result\r\n );\r\n }\r\n /** Compute `origin + matrix * vector` using all xyz parts of the inputs. */\r\n public static xyzPlusMatrixTimesXYZ(origin: XYZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Point3d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\r\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\r\n result\r\n );\r\n }\r\n /** Updates vector to be `origin + matrix * vector` using all xyz parts of the inputs. */\r\n public static xyzPlusMatrixTimesXYZInPlace(origin: XYZ, matrix: Matrix3d, vector: WritableXYAndZ): void {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n vector.x = origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z;\r\n vector.y = origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z;\r\n vector.z = origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z;\r\n }\r\n /** Compute `origin + matrix * vector` where the final vector is given as direct x,y,z coordinates */\r\n public static xyzPlusMatrixTimesCoordinates(origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number,\r\n result?: Point3d): Point3d {\r\n return Point3d.create(\r\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\r\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\r\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\r\n result\r\n );\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\r\n * Multiply the 4x4 matrix by `[x,y,z,w]`\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}M_0 & M_1 & M_2 & Ox \\\\ M_3 & M_4 & M_5 & Oy \\\\ M_6 & M_7 & M_8 & Oz \\\\ 0 & 0 & 0 & 1\\end{bmatrix} * \\begin{bmatrix}x \\\\ y \\\\ z \\\\ w\\end{bmatrix}\r\n * ```\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param w w part of multiplied point\r\n * @param result optional preallocated result.\r\n */\r\n public static xyzPlusMatrixTimesWeightedCoordinates(origin: XYZ, matrix: Matrix3d, x: number, y: number,\r\n z: number, w: number, result?: Point4d): Point4d {\r\n return Point4d.create(\r\n matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x * w,\r\n matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y * w,\r\n matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z * w,\r\n w,\r\n result\r\n );\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\r\n * Multiply the 4x4 matrix by `[x,y,z,w]`\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}M_0 & M_1 & M_2 & Ox \\\\ M_3 & M_4 & M_5 & Oy \\\\ M_6 & M_7 & M_8 & Oz \\\\ 0 & 0 & 0 & 1\\end{bmatrix} * \\begin{bmatrix}x \\\\ y \\\\ z \\\\ w\\end{bmatrix}\r\n * ```\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param w w part of multiplied point\r\n * @param result optional preallocated result.\r\n */\r\n public static xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(origin: XYZ, matrix: Matrix3d, x: number, y: number,\r\n z: number, w: number, result?: Float64Array): Float64Array {\r\n if (!result)\r\n result = new Float64Array(4);\r\n result[0] = matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x * w;\r\n result[1] = matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y * w;\r\n result[2] = matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z * w;\r\n result[3] = w;\r\n return result;\r\n }\r\n /**\r\n * Treat the 3x3 matrix and origin as a 3x4 matrix.\r\n * * Multiply the 3x4 matrix by `[x,y,z,1]`\r\n * ```\r\n * equation\r\n * \\begin{bmatrix}M_0 & M_1 & M_2 & Ox \\\\ M_3 & M_4 & M_5 & Oy \\\\ M_6 & M_7 & M_8 & Oz\\end{bmatrix} * \\begin{bmatrix}x \\\\ y \\\\ z \\\\ 1\\end{bmatrix}\r\n * ```\r\n * @param origin translation part (xyz in column 3)\r\n * @param matrix matrix part (leading 3x3)\r\n * @param x x part of multiplied point\r\n * @param y y part of multiplied point\r\n * @param z z part of multiplied point\r\n * @param result optional preallocated result.\r\n */\r\n public static xyzPlusMatrixTimesCoordinatesToFloat64Array(origin: XYZ, matrix: Matrix3d, x: number, y: number,\r\n z: number, result?: Float64Array): Float64Array {\r\n if (!result)\r\n result = new Float64Array(3);\r\n result[0] = matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x;\r\n result[1] = matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y;\r\n result[2] = matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z;\r\n return result;\r\n }\r\n /**\r\n * Multiply transpose of this matrix times a vector.\r\n * * This produces the same x,y,z as treating the vector as a row on the left of the (un-transposed) matrix.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{Treating U as a column to the right of transposed matrix\\: return column}&\\columnSubXYZ{V}&=&\\matrixTransposeSubXY{A}\\columnSubXYZ{U} \\\\\r\n * \\text{Treating U as a row to the left of untransposed matrix\\: return row}&\\rowSubXYZ{V}&=&\\rowSubXYZ{U}\\matrixXY{A}\r\n * \\end{matrix}\r\n * ```\r\n * @return the vector result\r\n */\r\n public multiplyTransposeVector(vector: Vector3d, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n result.x = this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z;\r\n result.y = this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z;\r\n result.z = this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z;\r\n return result;\r\n }\r\n /** Multiply the matrix * (x,y,z), i.e. the vector (x,y,z) is a column vector on the right.\r\n * @return the vector result\r\n */\r\n public multiplyXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Multiply the matrix * xyz, place result in (required) return value.\r\n * @param xyz right side\r\n * @param result result.\r\n */\r\n public multiplyXYZtoXYZ(xyz: XYZ, result: XYZ) {\r\n const x = xyz.x;\r\n const y = xyz.y;\r\n const z = xyz.z;\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Multiply the matrix * (x,y,0), i.e. the vector (x,y,z) is a column vector on the right.\r\n * @return the vector result\r\n */\r\n public multiplyXY(x: number, y: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[1] * y);\r\n result.y = (this.coffs[3] * x + this.coffs[4] * y);\r\n result.z = (this.coffs[6] * x + this.coffs[7] * y);\r\n return result;\r\n }\r\n /** compute `origin + this*[x,y,0]` */\r\n public originPlusMatrixTimesXY(origin: XYZ, x: number, y: number, result?: Point3d): Point3d {\r\n return Point3d.create(\r\n origin.x + this.coffs[0] * x + this.coffs[1] * y,\r\n origin.y + this.coffs[3] * x + this.coffs[4] * y,\r\n origin.z + this.coffs[6] * x + this.coffs[7] * y,\r\n result);\r\n }\r\n /** Multiply matrix * (x, y, z) using any 3d object given containing those members */\r\n public multiplyVectorInPlace(xyzData: XYZ): void {\r\n const x = xyzData.x;\r\n const y = xyzData.y;\r\n const z = xyzData.z;\r\n const coffs = this.coffs;\r\n xyzData.x = (coffs[0] * x + coffs[1] * y + coffs[2] * z);\r\n xyzData.y = (coffs[3] * x + coffs[4] * y + coffs[5] * z);\r\n xyzData.z = (coffs[6] * x + coffs[7] * y + coffs[8] * z);\r\n }\r\n /** Multiply the transpose matrix times column using any 3d object with x,y,z members.\r\n * This is equivalent to `multiplyTransposeVector` but always returns the result directly in the input.\r\n */\r\n public multiplyTransposeVectorInPlace(vectorU: XYZ): void {\r\n const x = vectorU.x;\r\n const y = vectorU.y;\r\n const z = vectorU.z;\r\n const coffs = this.coffs;\r\n vectorU.x = (coffs[0] * x + coffs[3] * y + coffs[6] * z);\r\n vectorU.y = (coffs[1] * x + coffs[4] * y + coffs[7] * z);\r\n vectorU.z = (coffs[2] * x + coffs[5] * y + coffs[8] * z);\r\n }\r\n /** Multiply the transpose matrix times column using individual numeric inputs.\r\n * * This is equivalent to multiplying with the vector as a row to the left of the plain matrix.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{treating the input as a column } \\columnXYZ{x}{y}{z}\\text{ compute }&\\columnSubXYZ{V} &= &A^T \\columnXYZ{x}{y}{z} \\\\\r\n * \\text{or row vector } \\rowXYZ{x}{y}{z} \\text{ compute }&\\rowSubXYZ{V} &= &\\rowXYZ{x}{y}{z} A \\\\\r\n * \\phantom{8888}\\text{and return V as a Vector3d} & & &\r\n * \\end{matrix}\r\n * ````\r\n * @return the vector result\r\n */\r\n public multiplyTransposeXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\r\n result = result ? result : new Vector3d();\r\n result.x = (this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z);\r\n result.y = (this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z);\r\n result.z = (this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z);\r\n return result;\r\n }\r\n /** Solve `matrix * result = vector`.\r\n * * This is equivalent to multiplication `result = matrixInverse * vector`.\r\n * * Result is undefined if the matrix is singular (e.g. has parallel or zero length columns)\r\n */\r\n public multiplyInverse(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /** Solve `matrixTranspose * result = vector`.\r\n * * This is equivalent to multiplication `result = matrixInverseTranspose * vector`.\r\n * * Result is undefined if the matrix is singular (e.g. has parallel or zero length columns)\r\n */\r\n public multiplyInverseTranspose(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n const x = vector.x;\r\n const y = vector.y;\r\n const z = vector.z;\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[3] * y + this.inverseCoffs[6] * z),\r\n (this.inverseCoffs[1] * x + this.inverseCoffs[4] * y + this.inverseCoffs[7] * z),\r\n (this.inverseCoffs[2] * x + this.inverseCoffs[5] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]`.\r\n * * This is equivalent to solving `matrix * result = [x,y,z]`\r\n * * return as a Vector3d, or undefined if the matrix is singular.\r\n */\r\n public multiplyInverseXYZAsVector3d(x: number, y: number, z: number, result?: Vector3d): Vector3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Vector3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]` and return packaged as `Point4d` with given weight.\r\n * * Equivalent to solving matrix * result = [x,y,z]\r\n * * return as a Point4d with the same weight.\r\n * * Called by Transform with x,y,z adjusted by subtraction ((xw) - w * origin.x, etc) where xw is the pre-weighted space point.\r\n */\r\n public multiplyInverseXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Point4d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n w,\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * multiply `matrixInverse * [x,y,z]` and return packaged as `Point3d`.\r\n * * multiply matrixInverse * [x,y,z]\r\n * * Equivalent to solving matrix * result = [x,y,z]\r\n * * return as a Point3d.\r\n */\r\n public multiplyInverseXYZAsPoint3d(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\r\n this.computeCachedInverse(true);\r\n if (this.inverseCoffs) {\r\n return Point3d.create(\r\n (this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z),\r\n (this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z),\r\n (this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z),\r\n result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * * invoke a given matrix-matrix operation (product function) to compute this.inverseCOffs\r\n * * set this.inverseCoffs\r\n * * if either input cffA or coffB is undefined, set state to `InverseMatrixState.unknown` (but leave the inverseCoffs untouched)\r\n */\r\n private finishInverseCoffs(f: (factorA: Float64Array, factorB: Float64Array, result: Float64Array) => void, coffA?: Float64Array, coffB?: Float64Array): void {\r\n if (coffA && coffB) {\r\n this.createInverseCoffsWithZeros();\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n f(coffA, coffB, this.inverseCoffs!);\r\n } else {\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n }\r\n /*\r\n Notes on inverses of products\r\n * 1) M = A * B MInverse = BInverse * AInverse\r\n * 2) M = A * BInverse MInverse = B * AInverse\r\n * 3) M = AInverse * B MInverse = BInverse * A\r\n * 4) M = ATranspose * B MInverse = BInverse * AInverseTranspose\r\n * 5) M = A * BTranspose MInverse = BInverseTranspose * AInverse\r\n */\r\n /** Multiply the instance matrix A by the input matrix B.\r\n * @return the matrix product A * B\r\n */\r\n public multiplyMatrixMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n private static _productBuffer = new Float64Array(9);\r\n /** Multiply this matrix times inverse of other\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixMatrixInverse(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\r\n if (!other.computeCachedInverse(true))\r\n return undefined;\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.inverseCoffs!, Matrix3d._productBuffer);\r\n if (this.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.coffs, this.inverseCoffs);\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\r\n return result;\r\n }\r\n /** Multiply this matrix times inverse of other\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixInverseMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\r\n if (!this.computeCachedInverse(true))\r\n return undefined;\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrix(this.inverseCoffs!, other.coffs, Matrix3d._productBuffer);\r\n if (other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrix, other.inverseCoffs, this.coffs);\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\r\n return result;\r\n }\r\n /** Multiply `this` matrix times the transpose of `matrixB`.\r\n * ```\r\n * equation\r\n * \\text{for instance matrix }A\\text{ and other matrix }B\\text{ return matrix }C{\\text where }\\\\\\matrixXY{C}=\\matrixXY{A}\\matrixTransposeSubXY{B}\r\n * ```\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixMatrixTranspose(matrixB: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrixTranspose(this.coffs, matrixB.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && matrixB.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixTransposeMatrix, matrixB.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || matrixB.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n /** Matrix multiplication `thisTranspose * other`.\r\n * ```\r\n * equation\r\n * \\matrixXY{result}=\\matrixXY{\\text{this}}\\matrixTransposeSubXY{\\text{other}}\r\n * ```\r\n * @return the matrix result\r\n */\r\n public multiplyMatrixTransposeMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixTransposeMatrix(this.coffs, other.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs(PackedMatrix3dOps.multiplyMatrixMatrixTranspose, other.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\r\n result.inverseState = InverseMatrixState.singular;\r\n else\r\n result.inverseState = InverseMatrixState.unknown;\r\n return result;\r\n }\r\n /** multiply this Matrix3d (considered as a transform with 0 translation) times other Transform.\r\n * ```\r\n * equation\r\n * \\begin{matrix}\r\n * \\text{This matrix }\\bold{A}\\text{ promoted to block transform} & \\blockTransform{A}{0} \\\\\r\n * \\text{other transform with matrix part }\\bold{B}\\text{ and translation }\\bold{b} & \\blockTransform{B}{b}\\\\\r\n * \\text{product}& \\blockTransform{A}{0}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab}\r\n * \\end{matrix}\r\n * ```\r\n * @param other right hand Matrix3d for multiplication.\r\n * @param result optional preallocated result to reuse.\r\n */\r\n public multiplyMatrixTransform(other: Transform, result?: Transform): Transform {\r\n if (!result)\r\n return Transform.createRefs(\r\n this.multiplyXYZ(other.origin.x, other.origin.y, other.origin.z),\r\n this.multiplyMatrixMatrix(other.matrix));\r\n // be sure to do the point multiplication first before aliasing changes the matrix ..\r\n this.multiplyXYZtoXYZ(other.origin, result.origin);\r\n this.multiplyMatrixMatrix(other.matrix, result.matrix);\r\n return result;\r\n }\r\n /**\r\n * Return the transpose of `this` matrix.\r\n * If `result` is passed as argument, then the function copies the transpose of `this` into `result`\r\n * `this` is not changed unless also passed as the result, i.e., this.transpose(this) transposes `this` in place\r\n */\r\n public transpose(result?: Matrix3d): Matrix3d {\r\n if (!result)\r\n result = new Matrix3d();\r\n PackedMatrix3dOps.copyTransposed(this.coffs, result.coffs);\r\n if (this.inverseCoffs !== undefined) {\r\n result.inverseState = InverseMatrixState.inverseStored;\r\n result.inverseCoffs = PackedMatrix3dOps.copyTransposed(this.inverseCoffs, result.inverseCoffs);\r\n } else {\r\n result.inverseState = this.inverseState; // singular or unknown.\r\n result.inverseCoffs = undefined;\r\n }\r\n return result;\r\n }\r\n /**\r\n * Transpose this matrix in place.\r\n */\r\n public transposeInPlace() {\r\n PackedMatrix3dOps.transposeInPlace(this.coffs);\r\n if (this.inverseCoffs)\r\n PackedMatrix3dOps.transposeInPlace(this.inverseCoffs);\r\n }\r\n /** return the inverse matrix.\r\n * The return is undefined if the matrix is singular (has columns that are coplanar or colinear)\r\n * * Note that each Matrix3d object caches its own inverse, and has methods to multiply the inverse times matrices and vectors.\r\n * * Hence explicitly constructing this new inverse object is rarely necessary.\r\n */\r\n public inverse(result?: Matrix3d): Matrix3d | undefined {\r\n if (!this.computeCachedInverse(true))\r\n return undefined;\r\n if (result === this) {\r\n // swap the contents (preserve pointers .. caller better know what they are doing)\r\n PackedMatrix3dOps.copy(this.coffs, Matrix3d._productBuffer);\r\n PackedMatrix3dOps.copy(this.inverseCoffs!, this.coffs);\r\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, this.inverseCoffs!);\r\n\r\n return result;\r\n }\r\n if (result === undefined) {\r\n result = Matrix3d.createIdentity();\r\n }\r\n result.createInverseCoffsWithZeros();\r\n PackedMatrix3dOps.copy(this.coffs, result.inverseCoffs!);\r\n PackedMatrix3dOps.copy(this.inverseCoffs!, result.coffs);\r\n result.inverseState = this.inverseState;\r\n return result;\r\n }\r\n /* Alternate implementation of computedCachedInverse - more direct addressing of arrays.\r\n This is indeed 10% faster than using static work areas. */\r\n\r\n // take the cross product of two rows of source.\r\n // store as a column of dest.\r\n private static indexedRowCrossProduct(source: Float64Array, rowStart0: number, rowStart1: number, dest: Float64Array, columnStart: number) {\r\n dest[columnStart] = source[rowStart0 + 1] * source[rowStart1 + 2] - source[rowStart0 + 2] * source[rowStart1 + 1];\r\n dest[columnStart + 3] = source[rowStart0 + 2] * source[rowStart1] - source[rowStart0] * source[rowStart1 + 2];\r\n dest[columnStart + 6] = source[rowStart0] * source[rowStart1 + 1] - source[rowStart0 + 1] * source[rowStart1];\r\n }\r\n // take the cross product of two columns of source.\r\n // store as third column in same Matrix3d.\r\n // This is private because the columnStart values are unchecked raw indices into the coffs\r\n private indexedColumnCrossProductInPlace(colStart0: number, colStart1: number, colStart2: number) {\r\n const coffs = this.coffs;\r\n coffs[colStart2] = coffs[colStart0 + 3] * coffs[colStart1 + 6] - coffs[colStart0 + 6] * coffs[colStart1 + 3];\r\n coffs[colStart2 + 3] = coffs[colStart0 + 6] * coffs[colStart1] - coffs[colStart0] * coffs[colStart1 + 6];\r\n coffs[colStart2 + 6] = coffs[colStart0] * coffs[colStart1 + 3] - coffs[colStart0 + 3] * coffs[colStart1];\r\n }\r\n /** Form cross products among columns in axisOrder.\r\n * For axis order ABC,\r\n * * form cross product of column A and B, store in C\r\n * * form cross product of column C and A, store in B.\r\n * This means that in the final matrix:\r\n * * column A is strictly parallel to original column A\r\n * * column B is linear combination of only original A and B\r\n * * column C is perpendicular to A and B of both the original and final.\r\n * * original column C does not participate in the result.\r\n */\r\n public axisOrderCrossProductsInPlace(axisOrder: AxisOrder) {\r\n switch (axisOrder) {\r\n case AxisOrder.XYZ: {\r\n this.indexedColumnCrossProductInPlace(0, 1, 2);\r\n this.indexedColumnCrossProductInPlace(2, 0, 1);\r\n break;\r\n }\r\n case AxisOrder.YZX: {\r\n this.indexedColumnCrossProductInPlace(1, 2, 0);\r\n this.indexedColumnCrossProductInPlace(0, 1, 2);\r\n break;\r\n }\r\n case AxisOrder.ZXY: {\r\n this.indexedColumnCrossProductInPlace(2, 0, 1);\r\n this.indexedColumnCrossProductInPlace(1, 2, 0);\r\n break;\r\n }\r\n case AxisOrder.XZY: {\r\n this.indexedColumnCrossProductInPlace(0, 2, 1);\r\n this.indexedColumnCrossProductInPlace(1, 0, 2);\r\n break;\r\n }\r\n case AxisOrder.YXZ: {\r\n this.indexedColumnCrossProductInPlace(1, 0, 2);\r\n this.indexedColumnCrossProductInPlace(2, 1, 0);\r\n break;\r\n }\r\n case AxisOrder.ZYX: {\r\n this.indexedColumnCrossProductInPlace(2, 1, 0);\r\n this.indexedColumnCrossProductInPlace(0, 2, 1);\r\n break;\r\n }\r\n }\r\n }\r\n /** Normalize each column in place.\r\n * * For false return the magnitudes are stored in the originalMagnitudes vector but no columns are altered.\r\n * @returns Return true if all columns had nonzero lengths.\r\n * @param originalMagnitudes optional vector to receive original column magnitudes.\r\n */\r\n public normalizeColumnsInPlace(originalMagnitudes?: Vector3d): boolean {\r\n const ax = this.columnXMagnitude();\r\n const ay = this.columnYMagnitude();\r\n const az = this.columnZMagnitude();\r\n if (originalMagnitudes)\r\n originalMagnitudes.set(ax, ay, az);\r\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\r\n return false;\r\n this.scaleColumns(1.0 / ax, 1.0 / ay, 1.0 / az, this);\r\n return true;\r\n }\r\n /** Normalize each row in place */\r\n public normalizeRowsInPlace(originalMagnitudes?: Vector3d): boolean {\r\n const ax = this.rowXMagnitude();\r\n const ay = this.rowYMagnitude();\r\n const az = this.rowZMagnitude();\r\n if (originalMagnitudes)\r\n originalMagnitudes.set(ax, ay, az);\r\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\r\n return false;\r\n this.scaleRows(1.0 / ax, 1.0 / ay, 1.0 / az, this);\r\n return true;\r\n }\r\n // take the cross product of two rows of source.\r\n // store as a column of dest.\r\n private static rowColumnDot(coffA: Float64Array, rowStartA: number, coffB: Float64Array, columnStartB: number): number {\r\n return coffA[rowStartA] * coffB[columnStartB] + coffA[rowStartA + 1] * coffB[columnStartB + 3] + coffA[rowStartA + 2] * coffB[columnStartB + 6];\r\n }\r\n /**\r\n * Returns true if the matrix is singular (i.e. collapses data to a plane, line, or point)\r\n */\r\n public isSingular(): boolean {\r\n return !this.computeCachedInverse(true);\r\n }\r\n /**\r\n * Mark this matrix as singular.\r\n */\r\n public markSingular() {\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n /**\r\n * Create the inverseCoffs member (filled with zeros)\r\n * This is for use by matrix * matrix multiplications which need to be sure the member is there to be\r\n * filled with method-specific content.\r\n */\r\n private createInverseCoffsWithZeros() {\r\n if (!this.inverseCoffs) {\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.inverseCoffs = new Float64Array(9);\r\n }\r\n }\r\n /** compute the inverse of this Matrix3d. The inverse is stored for later use.\r\n * @returns Return true if the inverse computed. (False if the columns collapse to a point, line or plane.)\r\n */\r\n public computeCachedInverse(useCacheIfAvailable: boolean): boolean {\r\n if (useCacheIfAvailable && Matrix3d.useCachedInverse && this.inverseState !== InverseMatrixState.unknown) {\r\n Matrix3d.numUseCache++;\r\n return this.inverseState === InverseMatrixState.inverseStored;\r\n }\r\n this.inverseState = InverseMatrixState.unknown;\r\n this.createInverseCoffsWithZeros();\r\n const coffs = this.coffs;\r\n const inverseCoffs = this.inverseCoffs!;\r\n Matrix3d.indexedRowCrossProduct(coffs, 3, 6, inverseCoffs, 0);\r\n Matrix3d.indexedRowCrossProduct(coffs, 6, 0, inverseCoffs, 1);\r\n Matrix3d.indexedRowCrossProduct(coffs, 0, 3, inverseCoffs, 2);\r\n Matrix3d.numComputeCache++;\r\n const d = Matrix3d.rowColumnDot(coffs, 0, inverseCoffs, 0);\r\n if (d === 0.0) { // better test?\r\n this.inverseState = InverseMatrixState.singular;\r\n this.inverseCoffs = undefined;\r\n return false;\r\n }\r\n const f = 1.0 / d;\r\n for (let i = 0; i < 9; i++)inverseCoffs[i] *= f;\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n // verify inverse\r\n // const p = new Float64Array(9);\r\n // for (let i = 0; i < 9; i += 3)\r\n // for (let j = 0; j < 3; j++)\r\n // p[i + j] = Matrix3d.rowColumnDot (coffs, i, inverseCoffs, j);\r\n return true;\r\n }\r\n /* \"Classic\" inverse implementation with temporary vectors.\r\n private static rowX: Vector3d = Vector3d.create();\r\n private static rowY: Vector3d = Vector3d.create();\r\n private static rowZ: Vector3d = Vector3d.create();\r\n private static crossXY: Vector3d = Vector3d.create();\r\n private static crossZX: Vector3d = Vector3d.create();\r\n private static crossYZ: Vector3d = Vector3d.create();\r\n private computeCachedInverse(useCacheIfAvailable: boolean) {\r\n if (useCacheIfAvailable && Matrix3d.useCachedInverse && this.inverseState !== InverseMatrixState.unknown) {\r\n Matrix3d.numUseCache++;\r\n return this.inverseState === InverseMatrixState.inverseStored;\r\n }\r\n this.inverseState = InverseMatrixState.unknown;\r\n Matrix3d.numComputeCache++;\r\n const rowX = this.rowX(Matrix3d.rowX);\r\n const rowY = this.rowY(Matrix3d.rowY);\r\n const rowZ = this.rowZ(Matrix3d.rowZ);\r\n const crossXY = rowX.crossProduct(rowY, Matrix3d.crossXY);\r\n const crossYZ = rowY.crossProduct(rowZ, Matrix3d.crossYZ);\r\n const crossZX = rowZ.crossProduct(rowX, Matrix3d.crossZX);\r\n const d = rowX.dotProduct(crossYZ); // that's the determinant\r\n if (d === 0.0) { // better test?\r\n this.inverseState = InverseMatrixState.singular;\r\n this.inverseCoffs = undefined;\r\n return false;\r\n }\r\n const f = 1.0 / d;\r\n this.inverseState = InverseMatrixState.inverseStored; // Currently just lists that the inverse has been stored... singular case not handled\r\n this.inverseCoffs = Float64Array.from([crossYZ.x * f, crossZX.x * f, crossXY.x * f,\r\n crossYZ.y * f, crossZX.y * f, crossXY.y * f,\r\n crossYZ.z * f, crossZX.z * f, crossXY.z * f]);\r\n return true;\r\n }\r\n */\r\n /** convert a (row,column) index pair to the single index within flattened array of 9 numbers in row-major-order */\r\n public static flatIndexOf(row: number, column: number): number {\r\n return 3 * Geometry.cyclic3dAxis(row) + Geometry.cyclic3dAxis(column);\r\n }\r\n /** Get a column by index (0,1,2), packaged as a Point4d with given weight. Out of range index is interpreted cyclically. */\r\n public indexedColumnWithWeight(index: number, weight: number, result?: Point4d): Point4d {\r\n index = Geometry.cyclic3dAxis(index);\r\n return Point4d.create(this.coffs[index], this.coffs[index + 3], this.coffs[index + 6], weight, result);\r\n }\r\n /** return the entry at specific row and column */\r\n public at(row: number, column: number): number {\r\n return this.coffs[Matrix3d.flatIndexOf(row, column)];\r\n }\r\n /** Set the entry at specific row and column */\r\n public setAt(row: number, column: number, value: number): void {\r\n this.coffs[Matrix3d.flatIndexOf(row, column)] = value;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** create a Matrix3d whose columns are scaled copies of this Matrix3d.\r\n * @param scaleX scale factor for column x\r\n * @param scaleY scale factor for column y\r\n * @param scaleZ scale factor for column z\r\n * @param result optional preallocated result.\r\n */\r\n public scaleColumns(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scaleX, this.coffs[1] * scaleY, this.coffs[2] * scaleZ,\r\n this.coffs[3] * scaleX, this.coffs[4] * scaleY, this.coffs[5] * scaleZ,\r\n this.coffs[6] * scaleX, this.coffs[7] * scaleY, this.coffs[8] * scaleZ,\r\n result);\r\n }\r\n /** Scale the columns of this Matrix3d.\r\n * @param scaleX scale factor for column x\r\n * @param scaleY scale factor for column y\r\n * @param scaleZ scale factor for column z\r\n */\r\n public scaleColumnsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\r\n\r\n this.coffs[0] *= scaleX; this.coffs[1] *= scaleY; this.coffs[2] *= scaleZ;\r\n this.coffs[3] *= scaleX; this.coffs[4] *= scaleY; this.coffs[5] *= scaleZ;\r\n this.coffs[6] *= scaleX; this.coffs[7] *= scaleY; this.coffs[8] *= scaleZ;\r\n if (this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined) {\r\n // apply reverse scales to the ROWS of the inverse\r\n const divX = Geometry.conditionalDivideFraction(1.0, scaleX);\r\n const divY = Geometry.conditionalDivideFraction(1.0, scaleY);\r\n const divZ = Geometry.conditionalDivideFraction(1.0, scaleZ);\r\n if (divX !== undefined && divY !== undefined && divZ !== undefined) {\r\n this.inverseCoffs[0] *= divX; this.inverseCoffs[1] *= divX; this.inverseCoffs[2] *= divX;\r\n this.inverseCoffs[3] *= divY; this.inverseCoffs[4] *= divY; this.inverseCoffs[5] *= divY;\r\n this.inverseCoffs[6] *= divZ; this.inverseCoffs[7] *= divZ; this.inverseCoffs[8] *= divZ;\r\n } else\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n }\r\n /** create a Matrix3d whose rows are scaled copies of this Matrix3d.\r\n * @param scaleX scale factor for row x\r\n * @param scaleY scale factor for row y\r\n * @param scaleZ scale factor for row z\r\n * @param result optional preallocated result.\r\n */\r\n public scaleRows(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scaleX, this.coffs[1] * scaleX, this.coffs[2] * scaleX,\r\n this.coffs[3] * scaleY, this.coffs[4] * scaleY, this.coffs[5] * scaleY,\r\n this.coffs[6] * scaleZ, this.coffs[7] * scaleZ, this.coffs[8] * scaleZ,\r\n result);\r\n }\r\n /**\r\n * add scaled values from other Matrix3d to this Matrix3d\r\n * @param other Matrix3d with values to be added\r\n * @param scale scale factor to apply to the added values.\r\n */\r\n public addScaledInPlace(other: Matrix3d, scale: number): void {\r\n for (let i = 0; i < 9; i++)\r\n this.coffs[i] += scale * other.coffs[i];\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /**\r\n * add scaled values from an outer product.\r\n * * The scaled outer product is a \"rank 1\" matrix.\r\n * * This is useful in constructing mirrors and directional scales.\r\n * ```\r\n * equation\r\n * A += s \\columnSubXYZ{U}\\rowSubXYZ{V}\r\n * \\\\ \\matrixXY{A} += s \\begin{bmatrix}\r\n * U_x * V_x & U_y * V_x & U_z * V_x \\\\\r\n * U_x * V_y & U_y * V_y & U_z * V_y \\\\\r\n * U_x * V_z & U_y * V_z & U_z * V_z \\end{bmatrix}\r\n * ```\r\n * @param other Matrix3d with values to be added\r\n * @param scale scale factor to apply to the added values.\r\n */\r\n public addScaledOuterProductInPlace(vectorU: Vector3d, vectorV: Vector3d, scale: number): void {\r\n this.coffs[0] += scale * vectorU.x * vectorV.x;\r\n this.coffs[1] += scale * vectorU.x * vectorV.y;\r\n this.coffs[2] += scale * vectorU.x * vectorV.z;\r\n\r\n this.coffs[3] += scale * vectorU.y * vectorV.x;\r\n this.coffs[4] += scale * vectorU.y * vectorV.y;\r\n this.coffs[5] += scale * vectorU.y * vectorV.z;\r\n\r\n this.coffs[6] += scale * vectorU.z * vectorV.x;\r\n this.coffs[7] += scale * vectorU.z * vectorV.y;\r\n this.coffs[8] += scale * vectorU.z * vectorV.z;\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n /** create a Matrix3d whose values are uniformly scaled from this.\r\n * @param scale scale factor to apply.\r\n * @param result optional preallocated result.\r\n * @returns Return the new or repopulated matrix\r\n */\r\n public scale(scale: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues\r\n (\r\n this.coffs[0] * scale, this.coffs[1] * scale, this.coffs[2] * scale,\r\n this.coffs[3] * scale, this.coffs[4] * scale, this.coffs[5] * scale,\r\n this.coffs[6] * scale, this.coffs[7] * scale, this.coffs[8] * scale,\r\n result);\r\n\r\n }\r\n /**\r\n * Create a rigid matrix (columns and rows are unit length and pairwise perpendicular) for\r\n * the given eye coordinate.\r\n * * column z is parallel to x,y,z\r\n * * column x is perpendicular to column z and is in the xy plane\r\n * * column y is perpendicular to both. It is the \"up\" vector on the view plane.\r\n * * Multiplying the returned matrix times a local (view) vector gives the world vector.\r\n * * Multiplying transpose of the returned matrix times a world vector gives the local\r\n * (view) vector.\r\n * @param x eye x coordinate\r\n * @param y eye y coordinate\r\n * @param z eye z coordinate\r\n * @param result optional preallocated result\r\n */\r\n public static createRigidViewAxesZTowardsEye(x: number, y: number, z: number, result?: Matrix3d): Matrix3d {\r\n result = Matrix3d.createIdentity(result);\r\n const rxy = Geometry.hypotenuseXY(x, y);\r\n // if coordinate is (0,0,z), i.e., Top or Bottom view\r\n if (Geometry.isSmallMetricDistance(rxy)) {\r\n if (z < 0.0)\r\n result.scaleColumnsInPlace(1.0, -1.0, -1.0);\r\n } else {\r\n const c = x / rxy;\r\n const s = y / rxy;\r\n // if coordinate is (x,y,0), i.e., Front or Back or Left or Right view\r\n result.setRowValues(\r\n -s, 0, c,\r\n c, 0, s,\r\n 0, 1, 0);\r\n // if coordinate is (x,y,z), i.e., other views such as Iso or RightIso\r\n if (z !== 0.0) {\r\n const r = Geometry.hypotenuseXYZ(x, y, z);\r\n const s1 = z / r;\r\n const c1 = rxy / r;\r\n result.applyGivensColumnOp(1, 2, c1, -s1);\r\n }\r\n }\r\n return result;\r\n }\r\n /** Return the determinant of this matrix. */\r\n public determinant(): number {\r\n return this.coffs[0] * this.coffs[4] * this.coffs[8]\r\n - this.coffs[0] * this.coffs[7] * this.coffs[5]\r\n + this.coffs[3] * this.coffs[7] * this.coffs[2]\r\n - this.coffs[3] * this.coffs[1] * this.coffs[8]\r\n + this.coffs[6] * this.coffs[1] * this.coffs[5]\r\n - this.coffs[6] * this.coffs[4] * this.coffs[2];\r\n }\r\n /** Return an estimate of how independent the columns are. Near zero is bad. Near 1 is good\r\n */\r\n public conditionNumber(): number {\r\n const determinant = this.determinant();\r\n const columnMagnitudeProduct =\r\n Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6])\r\n + Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7])\r\n + Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\r\n return Geometry.safeDivideFraction(determinant, columnMagnitudeProduct, 0.0);\r\n }\r\n /** Return the sum of squares of all entries */\r\n public sumSquares(): number {\r\n let i = 0;\r\n let sum = 0;\r\n for (i = 0; i < 9; i++)\r\n sum += this.coffs[i] * this.coffs[i];\r\n return sum;\r\n }\r\n /** Return the sum of squares of diagonal entries */\r\n public sumDiagonalSquares(): number {\r\n let i = 0;\r\n let sum = 0;\r\n for (i = 0; i < 9; i += 4)\r\n sum += this.coffs[i] * this.coffs[i];\r\n return sum;\r\n }\r\n /** Return the sum of diagonal entries (also known as the trace) */\r\n public sumDiagonal(): number {\r\n return this.coffs[0] + this.coffs[4] + this.coffs[8];\r\n }\r\n /** Return the Maximum absolute value of any single entry */\r\n public maxAbs(): number {\r\n let i = 0;\r\n let max = 0;\r\n for (i = 0; i < 9; i++)\r\n max = Math.max(max, Math.abs(this.coffs[i]));\r\n return max;\r\n }\r\n /** Return the maximum absolute difference between corresponding entries of `this` and `other` */\r\n public maxDiff(other: Matrix3d): number {\r\n let i = 0;\r\n let max = 0;\r\n for (i = 0; i < 9; i++)\r\n max = Math.max(max, Math.abs(this.coffs[i] - other.coffs[i]));\r\n return max;\r\n }\r\n /** Test if the matrix is (very near to) an identity */\r\n public get isIdentity(): boolean {\r\n return this.maxDiff(Matrix3d.identity) < Geometry.smallAngleRadians;\r\n }\r\n /** Test if the off diagonal entries are all nearly zero */\r\n public get isDiagonal(): boolean {\r\n const sumAll = this.sumSquares();\r\n const sumDiagonal = this.sumDiagonalSquares();\r\n const sumOff = Math.abs(sumAll - sumDiagonal);\r\n return Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\r\n }\r\n /** Test if the stored inverse is present and marked valid */\r\n public get hasCachedInverse(): boolean {\r\n return this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined;\r\n }\r\n /** Test if the below diagonal entries are all nearly zero */\r\n public get isUpperTriangular(): boolean {\r\n const sumAll = this.sumSquares();\r\n const sumLow = Geometry.hypotenuseSquaredXYZ(this.coffs[3], this.coffs[6], this.coffs[7]);\r\n return Math.sqrt(sumLow) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\r\n }\r\n /** If the matrix is diagonal and all diagonals are within tolerance, return the first diagonal. Otherwise return undefined.\r\n */\r\n public sameDiagonalScale(): number | undefined {\r\n const sumAll = this.sumSquares();\r\n const sumDiagonal = this.sumDiagonalSquares();\r\n const sumOff = Math.abs(sumAll - sumDiagonal);\r\n if (Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll))\r\n && Geometry.isSameCoordinate(this.coffs[0], this.coffs[4]) && Geometry.isSameCoordinate(this.coffs[0], this.coffs[8]))\r\n return this.coffs[0];\r\n return undefined;\r\n }\r\n /** Sum of squared differences between symmetric pairs */\r\n public sumSkewSquares(): number {\r\n return Geometry.hypotenuseSquaredXYZ(\r\n this.coffs[1] - this.coffs[3],\r\n this.coffs[2] - this.coffs[6],\r\n this.coffs[5] - this.coffs[7]);\r\n }\r\n /** Test if the matrix is a pure rotation.\r\n * @param allowMirror whether to widen the test to return true if the matrix is orthogonal (a pure rotation or a mirror)\r\n */\r\n public isRigid(allowMirror: boolean = false): boolean {\r\n return this.testPerpendicularUnitRowsAndColumns() && (allowMirror || this.determinant() > 0);\r\n }\r\n /** Test if all rows and columns are perpendicular to each other and have equal length.\r\n * If so, the length (or its negative) is the scale factor from a set of rigid axes to these axes.\r\n * * result.rigidAxes is the rigid axes (with the scale factor removed)\r\n * * result.scale is the scale factor\r\n */\r\n public factorRigidWithSignedScale(): { rigidAxes: Matrix3d, scale: number } | undefined {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n const ss = product.sameDiagonalScale();\r\n if (ss === undefined || ss <= 0.0) return undefined;\r\n const s = this.determinant() > 0 ? Math.sqrt(ss) : -Math.sqrt(ss);\r\n const divS = 1.0 / s;\r\n const result = { rigidAxes: this.scaleColumns(divS, divS, divS), scale: s };\r\n return result;\r\n }\r\n /** Test if the matrix is shuffles and negates columns. */\r\n public get isSignedPermutation(): boolean {\r\n let count = 0;\r\n for (let row = 0; row < 3; row++)\r\n for (let col = 0; col < 3; col++) {\r\n const q = this.at(row, col);\r\n if (q === 0) {// This comment makes the block non-empty\r\n } else if (q === 1 || q === -1) {\r\n // the rest of this row and column should be 0.\r\n // \"at\" will apply cyclic indexing.\r\n count++;\r\n if (this.at(row + 1, col) !== 0)\r\n return false;\r\n if (this.at(row + 2, col) !== 0)\r\n return false;\r\n if (this.at(row, col + 1) !== 0)\r\n return false;\r\n if (this.at(row, col + 2) !== 0)\r\n return false;\r\n } else {// entry is not from 0,1,-1 . . .\r\n return false;\r\n }\r\n }\r\n return count === 3;\r\n }\r\n /** Test if all rows and columns are length 1 and are perpendicular to each other. (I.e. the matrix is either a pure rotation with uniform scale factor of 1 or -1) */\r\n public testPerpendicularUnitRowsAndColumns(): boolean {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n return product.isIdentity;\r\n }\r\n /** Adjust the matrix in place so that:\r\n * * columns are perpendicular and have unit length\r\n * * transpose equals inverse\r\n * * mirroring is removed\r\n * @param axisOrder how to reorder the matrix columns\r\n * @return whether the instance is rigid on return\r\n */\r\n public makeRigid(axisOrder: AxisOrder = AxisOrder.XYZ): boolean {\r\n const maxAbs = this.maxAbs();\r\n if (Geometry.isSmallMetricDistance(maxAbs))\r\n return false;\r\n const scale = 1.0 / maxAbs;\r\n this.scaleColumnsInPlace(scale, scale, scale);\r\n this.axisOrderCrossProductsInPlace(axisOrder);\r\n return this.normalizeColumnsInPlace();\r\n }\r\n /** Create a new orthogonal matrix (perpendicular columns, unit length, transpose is inverse).\r\n * * Columns are taken from the source Matrix3d in order indicated by the axis order.\r\n * * Mirroring in the matrix is removed.\r\n */\r\n public static createRigidFromMatrix3d(source: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ, result?: Matrix3d): Matrix3d | undefined {\r\n result = source.clone(result);\r\n if (result.makeRigid(axisOrder))\r\n return result;\r\n return undefined;\r\n }\r\n private static computeQuatTerm(numerator: number, denomCoff: number, reciprocal: number, diagSum: number): number {\r\n let coff: number;\r\n const diagTol = 0.500;\r\n if (diagSum > diagTol) {\r\n coff = Math.sqrt(diagSum) * 0.5;\r\n if (denomCoff * numerator < 0.0)\r\n coff = - coff;\r\n } else {\r\n coff = numerator * reciprocal;\r\n }\r\n return coff;\r\n }\r\n /** create a matrix from a quaternion.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by rows and columns.\r\n * **WARNING:** If you find that the matrix seems to rotate by the opposite angle expect it, transpose it.\r\n */\r\n public static createFromQuaternion(quat: Point4d): Matrix3d {\r\n\r\n const qqx = quat.x * quat.x;\r\n const qqy = quat.y * quat.y;\r\n const qqz = quat.z * quat.z;\r\n const qqw = quat.w * quat.w;\r\n\r\n const mag2 = qqx + qqy + qqz + qqw;\r\n\r\n if (mag2 === 0.0) {\r\n return Matrix3d.createIdentity();\r\n } else {\r\n const a = 1.0 / mag2;\r\n\r\n const matrix = Matrix3d.createRowValues(\r\n a * (qqw + qqx - qqy - qqz), 2.0 * a * (quat.w * quat.z + quat.x * quat.y), 2.0 * a * (quat.x * quat.z - quat.w * quat.y),\r\n 2.0 * a * (quat.x * quat.y - quat.w * quat.z), a * (qqw - qqx + qqy - qqz), 2.0 * a * (quat.w * quat.x + quat.y * quat.z),\r\n 2.0 * a * (quat.x * quat.z + quat.w * quat.y), 2.0 * a * (quat.y * quat.z - quat.w * quat.x), a * (qqw - qqx - qqy + qqz));\r\n return matrix;\r\n }\r\n }\r\n /** convert the matrix to a quaternion.\r\n * @note This calculation requires the matrix to have unit length rows and columns.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by rows and columns.\r\n * **WARNING:** If you find that the matrix seems to rotate by the opposite angle expect it, transpose it.\r\n */\r\n public toQuaternion(): Point4d {\r\n const result = Point4d.createZero();\r\n const props = [[this.coffs[0], this.coffs[3], this.coffs[6]],\r\n [this.coffs[1], this.coffs[4], this.coffs[7]],\r\n [this.coffs[2], this.coffs[5], this.coffs[8]]];\r\n\r\n const xx = props[0][0];\r\n const yy = props[1][1];\r\n const zz = props[2][2];\r\n const dSum: number[] = [];\r\n let denom: number, maxIndex: number, i: number;\r\n\r\n dSum[0] = 1.0 + xx - yy - zz;\r\n dSum[1] = 1.0 - xx + yy - zz;\r\n dSum[2] = 1.0 - xx - yy + zz;\r\n dSum[3] = 1.0 + xx + yy + zz;\r\n\r\n maxIndex = 0;\r\n for (i = 1; i < 4; i++) {\r\n if (dSum[i] > dSum[maxIndex])\r\n maxIndex = i;\r\n }\r\n\r\n if (maxIndex === 0) {\r\n result.x = 0.5 * Math.sqrt(dSum[0]);\r\n denom = 1.0 / (4.0 * result.x);\r\n result.y = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.x, denom, dSum[1]);\r\n result.z = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.x, denom, dSum[2]);\r\n result.w = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.x, denom, dSum[3]);\r\n } else if (maxIndex === 1) {\r\n result.y = 0.5 * Math.sqrt(dSum[1]);\r\n denom = 1.0 / (4.0 * result.y);\r\n result.x = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.y, denom, dSum[0]);\r\n result.z = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.y, denom, dSum[2]);\r\n result.w = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.y, denom, dSum[3]);\r\n\r\n } else if (maxIndex === 2) {\r\n result.z = 0.5 * Math.sqrt(dSum[2]);\r\n denom = 1.0 / (4.0 * result.z);\r\n result.x = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.z, denom, dSum[0]);\r\n result.y = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.z, denom, dSum[1]);\r\n result.w = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.z, denom, dSum[3]);\r\n\r\n } else {\r\n result.w = 0.5 * Math.sqrt(dSum[3]);\r\n denom = 1.0 / (4.0 * result.w);\r\n result.x = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.w, denom, dSum[0]);\r\n result.y = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.w, denom, dSum[1]);\r\n result.z = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.w, denom, dSum[2]);\r\n }\r\n return result;\r\n }\r\n}\r\n"]}