@itwin/core-geometry 5.3.0-dev.2 → 5.3.0-dev.21

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 (608) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  5. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  10. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  13. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  14. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  15. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  16. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  17. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  19. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  21. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  22. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  23. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  25. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  26. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  27. package/lib/cjs/core-geometry.js.map +1 -1
  28. package/lib/cjs/curve/Arc3d.d.ts +15 -1
  29. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  30. package/lib/cjs/curve/Arc3d.js +36 -9
  31. package/lib/cjs/curve/Arc3d.js.map +1 -1
  32. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  33. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  34. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  35. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  36. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  37. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  38. package/lib/cjs/curve/CurveFactory.d.ts +25 -8
  39. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  40. package/lib/cjs/curve/CurveFactory.js +51 -55
  41. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  42. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  43. package/lib/cjs/curve/CurveOps.d.ts +2 -5
  44. package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
  45. package/lib/cjs/curve/CurveOps.js +2 -5
  46. package/lib/cjs/curve/CurveOps.js.map +1 -1
  47. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  48. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  49. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  50. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  51. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  52. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  53. package/lib/cjs/curve/LineString3d.js.map +1 -1
  54. package/lib/cjs/curve/Loop.js.map +1 -1
  55. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  56. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  57. package/lib/cjs/curve/Path.js.map +1 -1
  58. package/lib/cjs/curve/PointString3d.js.map +1 -1
  59. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  60. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  61. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  62. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  63. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  64. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +50 -15
  65. package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  66. package/lib/cjs/curve/Query/PlanarSubdivision.js +102 -84
  67. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  68. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  69. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  70. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  71. package/lib/cjs/curve/RegionOps.d.ts +44 -25
  72. package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
  73. package/lib/cjs/curve/RegionOps.js +74 -39
  74. package/lib/cjs/curve/RegionOps.js.map +1 -1
  75. package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  76. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
  77. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  78. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  79. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  81. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  83. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  84. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  85. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  86. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  87. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  88. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  89. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  90. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
  91. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  92. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  93. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  94. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  95. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  96. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  97. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  98. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  99. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  100. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  101. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  102. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  103. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  104. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
  105. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
  106. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
  107. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  108. package/lib/cjs/curve/spiral/ClothoidSeries.d.ts +10 -6
  109. package/lib/cjs/curve/spiral/ClothoidSeries.d.ts.map +1 -1
  110. package/lib/cjs/curve/spiral/ClothoidSeries.js +36 -19
  111. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  112. package/lib/cjs/curve/spiral/CubicEvaluator.d.ts +7 -6
  113. package/lib/cjs/curve/spiral/CubicEvaluator.d.ts.map +1 -1
  114. package/lib/cjs/curve/spiral/CubicEvaluator.js +29 -14
  115. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  116. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts +34 -44
  117. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
  118. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js +47 -53
  119. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  120. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
  121. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
  122. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
  123. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  124. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +112 -104
  125. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  126. package/lib/cjs/curve/spiral/DirectSpiral3d.js +143 -117
  127. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  128. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +71 -53
  129. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  130. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +99 -66
  131. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  132. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +8 -12
  133. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
  134. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +11 -13
  135. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  136. package/lib/cjs/curve/spiral/NormalizedTransition.d.ts +36 -29
  137. package/lib/cjs/curve/spiral/NormalizedTransition.d.ts.map +1 -1
  138. package/lib/cjs/curve/spiral/NormalizedTransition.js +62 -40
  139. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  140. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts +13 -18
  141. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
  142. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js +21 -24
  143. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  144. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +41 -27
  145. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  146. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js +50 -33
  147. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  148. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +45 -34
  149. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  150. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +56 -38
  151. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  152. package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts +27 -21
  153. package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
  154. package/lib/cjs/curve/spiral/XYCurveEvaluator.js +23 -18
  155. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  156. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  157. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  158. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  159. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  160. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  161. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  162. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  163. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  164. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  165. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  166. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  167. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +98 -99
  168. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  169. package/lib/cjs/geometry3d/GrowableXYArray.js +123 -111
  170. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  171. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +137 -143
  172. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  173. package/lib/cjs/geometry3d/GrowableXYZArray.js +167 -161
  174. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  175. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  176. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts +51 -34
  177. package/lib/cjs/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  178. package/lib/cjs/geometry3d/IndexedXYCollection.js +16 -6
  179. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  180. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +87 -93
  181. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  182. package/lib/cjs/geometry3d/IndexedXYZCollection.js +41 -38
  183. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  184. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  185. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  186. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  187. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  188. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  189. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  190. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  191. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  192. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  193. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  194. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  195. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  196. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  197. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  198. package/lib/cjs/geometry3d/PolylineOps.d.ts +2 -2
  199. package/lib/cjs/geometry3d/PolylineOps.js +2 -2
  200. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  201. package/lib/cjs/geometry3d/Range.js.map +1 -1
  202. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  203. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  204. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  205. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  206. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  207. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  208. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  209. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  210. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  211. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  212. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  213. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  214. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  215. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  216. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  217. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  218. package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
  219. package/lib/cjs/numerics/ClusterableArray.js +2 -2
  220. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  221. package/lib/cjs/numerics/Complex.js.map +1 -1
  222. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  223. package/lib/cjs/numerics/Newton.js.map +1 -1
  224. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  225. package/lib/cjs/numerics/PolarData.js.map +1 -1
  226. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  227. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  228. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  229. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  230. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  231. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  232. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  233. package/lib/cjs/polyface/AuxData.js.map +1 -1
  234. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  235. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  236. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  237. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  238. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  239. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  240. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  241. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  242. package/lib/cjs/polyface/Polyface.js.map +1 -1
  243. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  244. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  245. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  246. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  247. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  248. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  249. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  250. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  251. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  252. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  253. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  254. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  255. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  256. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  257. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  258. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  259. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  260. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  261. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  262. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  263. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  264. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  265. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  266. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  267. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  268. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  269. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  270. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  271. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  272. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  273. package/lib/cjs/solid/Box.js.map +1 -1
  274. package/lib/cjs/solid/Cone.js.map +1 -1
  275. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  276. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  277. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  278. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  279. package/lib/cjs/solid/Sphere.js.map +1 -1
  280. package/lib/cjs/solid/SweepContour.js.map +1 -1
  281. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  282. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  283. package/lib/cjs/topology/Graph.js.map +1 -1
  284. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  285. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  286. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  287. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  288. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  289. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  290. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  291. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  292. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  293. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  294. package/lib/cjs/topology/MaskManager.js.map +1 -1
  295. package/lib/cjs/topology/Merging.d.ts +15 -7
  296. package/lib/cjs/topology/Merging.d.ts.map +1 -1
  297. package/lib/cjs/topology/Merging.js +15 -10
  298. package/lib/cjs/topology/Merging.js.map +1 -1
  299. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  300. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  301. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  302. package/lib/cjs/topology/Triangulation.js.map +1 -1
  303. package/lib/cjs/topology/Voronoi.js.map +1 -1
  304. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  305. package/lib/esm/Constant.js.map +1 -1
  306. package/lib/esm/Geometry.js.map +1 -1
  307. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  308. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  309. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  310. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  311. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  312. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  313. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  314. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  315. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  316. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  317. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  318. package/lib/esm/bspline/KnotVector.js.map +1 -1
  319. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  320. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  321. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  322. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  323. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  324. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  325. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  326. package/lib/esm/clipping/ClipVector.js.map +1 -1
  327. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  328. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  329. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  330. package/lib/esm/core-geometry.js.map +1 -1
  331. package/lib/esm/curve/Arc3d.d.ts +15 -1
  332. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  333. package/lib/esm/curve/Arc3d.js +36 -9
  334. package/lib/esm/curve/Arc3d.js.map +1 -1
  335. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  336. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  337. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  338. package/lib/esm/curve/CurveCollection.js.map +1 -1
  339. package/lib/esm/curve/CurveCurve.js.map +1 -1
  340. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  341. package/lib/esm/curve/CurveFactory.d.ts +25 -8
  342. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  343. package/lib/esm/curve/CurveFactory.js +51 -55
  344. package/lib/esm/curve/CurveFactory.js.map +1 -1
  345. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  346. package/lib/esm/curve/CurveOps.d.ts +2 -5
  347. package/lib/esm/curve/CurveOps.d.ts.map +1 -1
  348. package/lib/esm/curve/CurveOps.js +2 -5
  349. package/lib/esm/curve/CurveOps.js.map +1 -1
  350. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  351. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  352. package/lib/esm/curve/CurveTypes.js.map +1 -1
  353. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  354. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  355. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  356. package/lib/esm/curve/LineString3d.js.map +1 -1
  357. package/lib/esm/curve/Loop.js.map +1 -1
  358. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  359. package/lib/esm/curve/ParityRegion.js.map +1 -1
  360. package/lib/esm/curve/Path.js.map +1 -1
  361. package/lib/esm/curve/PointString3d.js.map +1 -1
  362. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  363. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  364. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  365. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  366. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  367. package/lib/esm/curve/Query/PlanarSubdivision.d.ts +50 -15
  368. package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
  369. package/lib/esm/curve/Query/PlanarSubdivision.js +102 -84
  370. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  371. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  372. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  373. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  374. package/lib/esm/curve/RegionOps.d.ts +44 -25
  375. package/lib/esm/curve/RegionOps.d.ts.map +1 -1
  376. package/lib/esm/curve/RegionOps.js +72 -37
  377. package/lib/esm/curve/RegionOps.js.map +1 -1
  378. package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
  379. package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
  380. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  381. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  382. package/lib/esm/curve/UnionRegion.js.map +1 -1
  383. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  384. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  385. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  386. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  387. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  388. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  389. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  390. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  391. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
  392. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
  393. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +102 -92
  394. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  395. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  396. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  397. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  398. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  399. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  400. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  401. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  402. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  403. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  404. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  405. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  406. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  407. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
  408. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
  409. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
  410. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  411. package/lib/esm/curve/spiral/ClothoidSeries.d.ts +10 -6
  412. package/lib/esm/curve/spiral/ClothoidSeries.d.ts.map +1 -1
  413. package/lib/esm/curve/spiral/ClothoidSeries.js +36 -19
  414. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  415. package/lib/esm/curve/spiral/CubicEvaluator.d.ts +7 -6
  416. package/lib/esm/curve/spiral/CubicEvaluator.d.ts.map +1 -1
  417. package/lib/esm/curve/spiral/CubicEvaluator.js +29 -14
  418. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  419. package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts +34 -44
  420. package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
  421. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js +47 -53
  422. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  423. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
  424. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
  425. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
  426. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  427. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +112 -104
  428. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  429. package/lib/esm/curve/spiral/DirectSpiral3d.js +143 -117
  430. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  431. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +71 -53
  432. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  433. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +99 -66
  434. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  435. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +8 -12
  436. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
  437. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +11 -13
  438. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  439. package/lib/esm/curve/spiral/NormalizedTransition.d.ts +36 -29
  440. package/lib/esm/curve/spiral/NormalizedTransition.d.ts.map +1 -1
  441. package/lib/esm/curve/spiral/NormalizedTransition.js +62 -40
  442. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  443. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts +13 -18
  444. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
  445. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js +21 -24
  446. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  447. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +41 -27
  448. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  449. package/lib/esm/curve/spiral/TransitionConditionalProperties.js +50 -33
  450. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  451. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +45 -34
  452. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  453. package/lib/esm/curve/spiral/TransitionSpiral3d.js +56 -38
  454. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  455. package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts +27 -21
  456. package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
  457. package/lib/esm/curve/spiral/XYCurveEvaluator.js +23 -18
  458. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  459. package/lib/esm/geometry3d/Angle.js.map +1 -1
  460. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  461. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  462. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  463. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  464. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  465. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  466. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  467. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  468. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  469. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  470. package/lib/esm/geometry3d/GrowableXYArray.d.ts +98 -99
  471. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  472. package/lib/esm/geometry3d/GrowableXYArray.js +124 -112
  473. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  474. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +137 -143
  475. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  476. package/lib/esm/geometry3d/GrowableXYZArray.js +167 -161
  477. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  478. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  479. package/lib/esm/geometry3d/IndexedXYCollection.d.ts +51 -34
  480. package/lib/esm/geometry3d/IndexedXYCollection.d.ts.map +1 -1
  481. package/lib/esm/geometry3d/IndexedXYCollection.js +14 -5
  482. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  483. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +87 -93
  484. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  485. package/lib/esm/geometry3d/IndexedXYZCollection.js +41 -38
  486. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  487. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  488. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  489. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  490. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  491. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  492. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  493. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  494. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  495. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  496. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  497. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  498. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  499. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  500. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  501. package/lib/esm/geometry3d/PolylineOps.d.ts +2 -2
  502. package/lib/esm/geometry3d/PolylineOps.js +2 -2
  503. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  504. package/lib/esm/geometry3d/Range.js.map +1 -1
  505. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  506. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  507. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  508. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  509. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  510. package/lib/esm/geometry3d/Transform.js.map +1 -1
  511. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  512. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  513. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  514. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  515. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  516. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  517. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  518. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  519. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  520. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  521. package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
  522. package/lib/esm/numerics/ClusterableArray.js +2 -2
  523. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  524. package/lib/esm/numerics/Complex.js.map +1 -1
  525. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  526. package/lib/esm/numerics/Newton.js.map +1 -1
  527. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  528. package/lib/esm/numerics/PolarData.js.map +1 -1
  529. package/lib/esm/numerics/Polynomials.js.map +1 -1
  530. package/lib/esm/numerics/Quadrature.js.map +1 -1
  531. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  532. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  533. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  534. package/lib/esm/numerics/UnionFind.js.map +1 -1
  535. package/lib/esm/numerics/UsageSums.js.map +1 -1
  536. package/lib/esm/polyface/AuxData.js.map +1 -1
  537. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  538. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  539. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  540. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  541. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  542. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  543. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  544. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  545. package/lib/esm/polyface/Polyface.js.map +1 -1
  546. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  547. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  548. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  549. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  550. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  551. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  552. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  553. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  554. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  555. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  556. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  557. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  558. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  559. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  560. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  561. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  562. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  563. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  564. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  565. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  566. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  567. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  568. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  569. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  570. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  571. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  572. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  573. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  574. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  575. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  576. package/lib/esm/solid/Box.js.map +1 -1
  577. package/lib/esm/solid/Cone.js.map +1 -1
  578. package/lib/esm/solid/LinearSweep.js.map +1 -1
  579. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  580. package/lib/esm/solid/RuledSweep.js.map +1 -1
  581. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  582. package/lib/esm/solid/Sphere.js.map +1 -1
  583. package/lib/esm/solid/SweepContour.js.map +1 -1
  584. package/lib/esm/solid/TorusPipe.js.map +1 -1
  585. package/lib/esm/topology/ChainMerge.js.map +1 -1
  586. package/lib/esm/topology/Graph.js.map +1 -1
  587. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  588. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  589. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  590. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  591. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  592. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  593. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  594. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  595. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  596. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  597. package/lib/esm/topology/MaskManager.js.map +1 -1
  598. package/lib/esm/topology/Merging.d.ts +15 -7
  599. package/lib/esm/topology/Merging.d.ts.map +1 -1
  600. package/lib/esm/topology/Merging.js +15 -10
  601. package/lib/esm/topology/Merging.js.map +1 -1
  602. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  603. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  604. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  605. package/lib/esm/topology/Triangulation.js.map +1 -1
  606. package/lib/esm/topology/Voronoi.js.map +1 -1
  607. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  608. package/package.json +3 -3
@@ -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,4EAA4E;AAC5E;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,UAAU,CACtB,IAAkB,EAClB,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW;QAErC,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;;;;;;OAMG;IACI,MAAM,CAAC,oBAAoB,CAAC,CAAe,EAAE,CAAe,EAAE,MAAqB;QACxF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAC9B,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,iBAAiB,CAAC,UAAU,CAC1B,MAAM,EACN,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,C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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AxisIndex, AxisOrder, BeJSONFunctions, Geometry, StandardViewIndex } from \"../Geometry\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { Angle } from \"./Angle\";\nimport { Point2d } from \"./Point2dVector2d\";\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\nimport { Transform } from \"./Transform\";\nimport { Matrix3dProps, WritableXYAndZ, XAndY, XYAndZ } from \"./XYZProps\";\n\n/* eslint-disable @itwin/prefer-get */\n// cSpell:words XXYZ YXYZ ZXYZ SaeedTorabi arctan newcommand diagonalization\n/**\n * PackedMatrix3dOps contains static methods for matrix operations where the matrix is a Float64Array.\n * * The Float64Array contains the matrix entries in row-major order\n * @internal\n * ```\n * equation\n * \\newcommand[1]\\mij{#1_{00}\\ #1_{01}\\ a_{02}}\n * ```\n */\nexport class PackedMatrix3dOps {\n /**\n * Load 9 doubles into the packed format.\n * @param dest destination, allocated by caller\n * @param a00 row 0, column 0 entry\n * @param a01 row 0, column 1 entry\n * @param a02 row 0, column 2 entry\n * @param a10 row 1, column 0 entry\n * @param a11 row 1, column 1 entry\n * @param a12 row 1, column 2 entry\n * @param a20 row 2, column 0 entry\n * @param a21 row 2, column 1 entry\n * @param a22 row 2, column 2 entry\n */\n public static loadMatrix(\n dest: Float64Array,\n a00: number, a01: number, a02: number,\n a10: number, a11: number, a12: number,\n a20: number, a21: number, a22: number,\n ) {\n dest[0] = a00; dest[1] = a01; dest[2] = a02;\n dest[3] = a10; dest[4] = a11; dest[5] = a12;\n dest[6] = a20; dest[7] = a21; dest[8] = a22;\n }\n /**\n * Multiply 3x3 matrix `a*b`, store in `result`.\n * @param a left matrix in product. ASSUMED length 9.\n * @param b right matrix in product. ASSUMED length 9.\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\n * @return matrix product `a*b`\n */\n public static multiplyMatrixMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\n if (!result || result.length < 9)\n result = new Float64Array(9);\n PackedMatrix3dOps.loadMatrix(\n result,\n (a[0] * b[0] + a[1] * b[3] + a[2] * b[6]),\n (a[0] * b[1] + a[1] * b[4] + a[2] * b[7]),\n (a[0] * b[2] + a[1] * b[5] + a[2] * b[8]),\n (a[3] * b[0] + a[4] * b[3] + a[5] * b[6]),\n (a[3] * b[1] + a[4] * b[4] + a[5] * b[7]),\n (a[3] * b[2] + a[4] * b[5] + a[5] * b[8]),\n (a[6] * b[0] + a[7] * b[3] + a[8] * b[6]),\n (a[6] * b[1] + a[7] * b[4] + a[8] * b[7]),\n (a[6] * b[2] + a[7] * b[5] + a[8] * b[8]),\n );\n return result;\n }\n /**\n * Multiply 3x3 matrix `a*bTranspose`, store in `result`.\n * @param a left matrix in product. ASSUMED length 9.\n * @param b transpose of right matrix in product. ASSUMED length 9.\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\n * @return matrix product `a*b^T`\n */\n public static multiplyMatrixMatrixTranspose(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\n if (!result || result.length < 9)\n result = new Float64Array(9);\n PackedMatrix3dOps.loadMatrix(\n result,\n (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]),\n (a[0] * b[3] + a[1] * b[4] + a[2] * b[5]),\n (a[0] * b[6] + a[1] * b[7] + a[2] * b[8]),\n (a[3] * b[0] + a[4] * b[1] + a[5] * b[2]),\n (a[3] * b[3] + a[4] * b[4] + a[5] * b[5]),\n (a[3] * b[6] + a[4] * b[7] + a[5] * b[8]),\n (a[6] * b[0] + a[7] * b[1] + a[8] * b[2]),\n (a[6] * b[3] + a[7] * b[4] + a[8] * b[5]),\n (a[6] * b[6] + a[7] * b[7] + a[8] * b[8]),\n );\n return result;\n }\n /**\n * Multiply 3x3 matrix `aTranspose*b`, store in `result`.\n * @param a transpose of left matrix in product. ASSUMED length 9.\n * @param b right matrix in product. ASSUMED length 9.\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\n * @return matrix product `a^T*b`\n */\n public static multiplyMatrixTransposeMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\n if (!result || result.length < 9)\n result = new Float64Array(9);\n PackedMatrix3dOps.loadMatrix(\n result,\n (a[0] * b[0] + a[3] * b[3] + a[6] * b[6]),\n (a[0] * b[1] + a[3] * b[4] + a[6] * b[7]),\n (a[0] * b[2] + a[3] * b[5] + a[6] * b[8]),\n (a[1] * b[0] + a[4] * b[3] + a[7] * b[6]),\n (a[1] * b[1] + a[4] * b[4] + a[7] * b[7]),\n (a[1] * b[2] + a[4] * b[5] + a[7] * b[8]),\n (a[2] * b[0] + a[5] * b[3] + a[8] * b[6]),\n (a[2] * b[1] + a[5] * b[4] + a[8] * b[7]),\n (a[2] * b[2] + a[5] * b[5] + a[8] * b[8]),\n );\n return result;\n }\n /** Transpose 3x3 matrix `a` in place */\n public static transposeInPlace(a: Float64Array) {\n let q = a[1]; a[1] = a[3]; a[3] = q;\n q = a[2]; a[2] = a[6]; a[6] = q;\n q = a[5]; a[5] = a[7]; a[7] = q;\n }\n /**\n * Compute transpose of 3x3 matrix `a`, store in `dest`.\n * @param a source matrix. ASSUMED length 9. Note that `a` is not changed unless also passed as `dest`, i.e., `copyTransposed(a,a)` transposes `a` in place.\n * @param dest optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a`.\n * @return matrix `a^T`\n */\n public static copyTransposed(a: Float64Array, dest?: Float64Array): Float64Array {\n if (dest === a) {\n PackedMatrix3dOps.transposeInPlace(dest);\n } else {\n if (!dest || dest.length < 9)\n dest = new Float64Array(9);\n dest[0] = a[0]; dest[1] = a[3]; dest[2] = a[6];\n dest[3] = a[1]; dest[4] = a[4]; dest[5] = a[7];\n dest[6] = a[2]; dest[7] = a[5]; dest[8] = a[8];\n }\n return dest;\n }\n /** Copy matrix `a` entries into `dest` */\n public static copy(a: Float64Array, dest: Float64Array): Float64Array {\n if (dest !== a) {\n dest[0] = a[0]; dest[1] = a[1]; dest[2] = a[2];\n dest[3] = a[3]; dest[4] = a[4]; dest[5] = a[5];\n dest[6] = a[6]; dest[7] = a[7]; dest[8] = a[8];\n }\n return dest;\n }\n}\n\n/**\n * A Matrix3d is tagged indicating one of the following states:\n * * unknown: it is not know if the matrix is invertible.\n * * inverseStored: the matrix has its inverse stored.\n * * singular: the matrix is known to be singular.\n * @public\n */\nexport enum InverseMatrixState {\n /**\n * The invertibility of the `coffs` array has not been determined.\n * Any `inverseCoffs` contents are random.\n */\n unknown,\n /**\n * An inverse was computed and stored as the `inverseCoffs`\n */\n inverseStored,\n /**\n * The `coffs` array is known to be singular.\n * Any `inverseCoffs` contents are random.\n */\n singular,\n}\n\n/**\n * A Matrix3d is a 3x3 matrix.\n * * A very common use is to hold a rigid body rotation (which has no scaling or skew), but the 3x3 contents can\n * also hold scaling and skewing.\n * * The matrix with 2-dimensional layout (note: a 2d array can be shown by a matrix)\n * ```\n * equation\n * \\matrixXY{A}\n * ```\n * is stored as 9 numbers in \"row-major\" order in a `Float64Array`, viz\n * ```\n * equation\n * \\rowMajorMatrixXY{A}\n * ```\n * * If the matrix inverse is known it is stored in the inverseCoffs array.\n * * The inverse status (`unknown`, `inverseStored`, `singular`) status is indicated by the `inverseState` property.\n * * Construction methods that are able to trivially construct the inverse, store it immediately and note that in\n * the inverseState.\n * * Constructions (e.g. createRowValues) for which the inverse is not immediately known mark the inverseState as\n * unknown.\n * * Later queries for the inverse, trigger full computation if needed at that time.\n * * Most matrix queries are present with both \"column\" and \"row\" variants.\n * * Usage elsewhere in the library is typically \"column\" based. For example, in a Transform that carries a\n * coordinate frame, the matrix columns are the unit vectors for the axes.\n * @public\n */\nexport class Matrix3d implements BeJSONFunctions {\n /** Control flag for whether this class uses cached inverse of matrices. */\n public static useCachedInverse = true; // cached inverse can be suppressed for testing.\n /** Total number of times a cached inverse was used to avoid recompute */\n public static numUseCache = 0;\n /** Total number of times a cached inverse was computed. */\n public static numComputeCache = 0;\n /**\n * Matrix contents as a flat array of numbers in row-major order.\n * ```\n * equation\n * \\mxy{B}\n * \\mij{B}\n * ```\n * * DO NOT directly modify this array. It will destroy safety of the cached inverse state.\n */\n public coffs: Float64Array;\n /**\n * Matrix inverse contents.\n * ```\n * equation\n * \\mxy{A}\n * ```\n * * DO NOT directly modify this array. It will destroy integrity of the cached inverse state.\n */\n public inverseCoffs: Float64Array | undefined;\n /** Indicates if inverse is unknown, available, or known singular */\n public inverseState: InverseMatrixState;\n /** The identity matrix */\n private static _identity: Matrix3d;\n /** temporary buffer to store a matrix as a Float64Array (array of 9 floats) */\n private static _productBuffer = new Float64Array(9);\n /** The identity Matrix3d. Value is frozen and cannot be modified. */\n public static get identity(): Matrix3d {\n if (undefined === this._identity) {\n this._identity = Matrix3d.createIdentity();\n this._identity.freeze();\n }\n\n return this._identity;\n }\n /** Freeze this Matrix3d. */\n public freeze(): Readonly<this> {\n this.computeCachedInverse(true);\n /*\n hm.. can't freeze the Float64Arrays..\n Object.freeze(this.coffs);\n if (this.inverseCoffs)\n Object.freeze(this.inverseCoffs);\n */\n return Object.freeze(this);\n }\n /**\n * Constructor\n * @param coffs optional coefficient array of length at least 9 (CAPTURED). If undefined or insufficient length, a new array is created.\n */\n public constructor(coffs?: Float64Array) {\n this.coffs = (coffs && coffs.length >= 9) ? coffs : new Float64Array(9);\n this.inverseCoffs = undefined;\n this.inverseState = InverseMatrixState.unknown;\n }\n /**\n * Return a json object containing the 9 numeric entries as a single array in row major order,\n * `[ [1, 2, 3],[ 4, 5, 6], [7, 8, 9] ]`\n */\n public toJSON(): Matrix3dProps {\n return [[this.coffs[0], this.coffs[1], this.coffs[2]],\n [this.coffs[3], this.coffs[4], this.coffs[5]],\n [this.coffs[6], this.coffs[7], this.coffs[8]]];\n }\n /**\n * Copy data from various input forms to this matrix.\n * The source can be:\n * * Another `Matrix3d`\n * * An array of 3 arrays, each of which has the 3 numbers for a row of the matrix.\n * * An array of 4 or 9 numbers in row major order.\n * * **WARNING:** if json is an array of numbers but size is not 4 or 9, the matrix is set to zeros.\n */\n public setFromJSON(json?: Matrix3dProps | Matrix3d): void {\n this.inverseCoffs = undefined;\n // if no json is passed\n if (!json) {\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\n return;\n }\n // if json is Matrix3d\n if (!Array.isArray(json)) {\n if (json instanceof Matrix3d)\n this.setFrom(json);\n return;\n }\n // if json is Matrix3dProps and is an array of arrays\n if (Geometry.isArrayOfNumberArray(json, 3, 3)) {\n this.setRowValues(\n json[0][0], json[0][1], json[0][2],\n json[1][0], json[1][1], json[1][2],\n json[2][0], json[2][1], json[2][2]);\n return;\n }\n // if json is Matrix3dProps and is an array of numbers\n if (json.length === 9) {\n this.setRowValues(\n json[0], json[1], json[2],\n json[3], json[4], json[5],\n json[6], json[7], json[8]);\n return;\n } else if (json.length === 4) {\n this.setRowValues(\n json[0], json[1], 0,\n json[2], json[3], 0,\n 0, 0, 1);\n return;\n }\n // if json is Matrix3dProps but is not the right size\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\n return;\n }\n /** Return a new Matrix3d constructed from contents of the json value. See `setFromJSON` for layout rules */\n public static fromJSON(json?: Matrix3dProps): Matrix3d {\n const result = Matrix3d.createIdentity();\n result.setFromJSON(json);\n return result;\n }\n /**\n * Test if `this` and `other` are within tolerance in all numeric entries.\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\n */\n public isAlmostEqual(other: Matrix3d, tol?: number): boolean {\n return Geometry.isDistanceWithinTol(this.maxDiff(other), tol);\n }\n /**\n * Test if `this` and `other` are within tolerance in the column entries specified by `columnIndex`.\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\n */\n public isAlmostEqualColumn(columnIndex: AxisIndex, other: Matrix3d, tol?: number): boolean {\n const max = Geometry.maxAbsXYZ(\n this.coffs[columnIndex] - other.coffs[columnIndex],\n this.coffs[columnIndex + 3] - other.coffs[columnIndex + 3],\n this.coffs[columnIndex + 6] - other.coffs[columnIndex + 6]);\n return Geometry.isDistanceWithinTol(max, tol);\n }\n /**\n * Test if column (specified by `columnIndex`) entries of `this` and [ax,ay,az] are within tolerance.\n * @param tol optional tolerance for comparisons by Geometry.isDistanceWithinTol\n */\n public isAlmostEqualColumnXYZ(columnIndex: AxisIndex, ax: number, ay: number, az: number, tol?: number): boolean {\n const max = Geometry.maxAbsXYZ(\n this.coffs[columnIndex] - ax,\n this.coffs[columnIndex + 3] - ay,\n this.coffs[columnIndex + 6] - az);\n return Geometry.isDistanceWithinTol(max, tol);\n }\n /**\n * A matrix equivalence test, returning true if and only if the matrices are almost equal,\n * or all of the following column comparisons hold:\n * * z columns are almost equal, and\n * * x columns differ only by a rotation of angle t around the z column, and\n * * y columns differ only by a rotation of the same angle t around the z column.\n * @param other matrix to compare\n * @param tol optional distance tolerance, for comparisons by Geometry.isDistanceWithinTol\n * @return whether matrices are almost equal modulo a rotation around their common nonzero z-column.\n */\n public isAlmostEqualAllowZRotation(other: Matrix3d, tol?: number): boolean {\n if (this.isAlmostEqual(other, tol))\n return true;\n if (!this.isAlmostEqualColumn(AxisIndex.Z, other, tol))\n return false;\n const columnX = this.columnX();\n const columnY = this.columnY();\n const columnZ = this.columnZ();\n const toOtherColumnX = columnX.signedAngleTo(other.columnX(), columnZ);\n let testColumn = Vector3d.createRotateVectorAroundVector(columnX, columnZ, toOtherColumnX);\n if (!testColumn)\n return false; // columnZ is zero length\n if (!other.isAlmostEqualColumnXYZ(0, testColumn.x, testColumn.y, testColumn.z, tol))\n return false; // columnX rotated around columnZ by angle doesn't end up at other.columnX\n testColumn = Vector3d.createRotateVectorAroundVector(columnY, columnZ, toOtherColumnX);\n if (!testColumn)\n return false;\n if (!other.isAlmostEqualColumnXYZ(1, testColumn.x, testColumn.y, testColumn.z, tol))\n return false; // columnY rotated around columnZ by angle doesn't end up at other.columnY\n return true;\n }\n /** Test for exact (bitwise) equality with other. */\n public isExactEqual(other: Matrix3d): boolean {\n return this.maxDiff(other) === 0.0;\n }\n /** test if all entries in the z row and column are exact 001, i.e. the matrix only acts in 2d */\n public get isXY(): boolean {\n return this.coffs[2] === 0.0\n && this.coffs[5] === 0.0\n && this.coffs[6] === 0.0\n && this.coffs[7] === 0.0\n && this.coffs[8] === 1.0;\n }\n /**\n * If result is not provided, then the method returns a new (zeroed) matrix; otherwise the result is\n * not zeroed first and is just returned as-is.\n */\n private static _create(result?: Matrix3d): Matrix3d {\n return result ? result : new Matrix3d();\n }\n /**\n * Returns a Matrix3d populated by numeric values given in row-major order.\n * Sets all entries in the matrix from call parameters appearing in row-major order, i.e.\n * ```\n * equation\n * \\begin{bmatrix}a_{xx}\\ a_{xy}\\ a_{xz}\\\\ a_{yx}\\ a_{yy}\\ a_{yz}\\\\ a_{zx}\\ a_{zy}\\ a_{zz}\\end{bmatrix}\n * ```\n * @param axx Row x, column x(0, 0) entry\n * @param axy Row x, column y(0, 1) entry\n * @param axz Row x, column z(0, 2) entry\n * @param ayx Row y, column x(1, 0) entry\n * @param ayy Row y, column y(1, 1) entry\n * @param ayz Row y, column z(1, 2) entry\n * @param azx Row z, column x(2, 0) entry\n * @param azy Row z, column y(2, 2) entry\n * @param azz row z, column z(2, 3) entry\n */\n public static createRowValues(\n axx: number, axy: number, axz: number,\n ayx: number, ayy: number, ayz: number,\n azx: number, azy: number, azz: number,\n result?: Matrix3d,\n ): Matrix3d {\n result = result ? result : new Matrix3d();\n result.inverseState = InverseMatrixState.unknown;\n result.coffs[0] = axx; result.coffs[1] = axy; result.coffs[2] = axz;\n result.coffs[3] = ayx; result.coffs[4] = ayy; result.coffs[5] = ayz;\n result.coffs[6] = azx; result.coffs[7] = azy; result.coffs[8] = azz;\n return result;\n }\n /**\n * Create a Matrix3d with caller-supplied coefficients and optional inverse coefficients.\n * * The inputs are captured into (i.e., owned by) the new Matrix3d.\n * * The caller is responsible for validity of the inverse coefficients.\n * * If either array is insufficiently sized, it is ignored.\n * @param coffs (required) array of 9 coefficients.\n * @param inverseCoffs (optional) array of 9 coefficients.\n * @returns a Matrix3d populated by a coffs array.\n */\n public static createCapture(coffs: Float64Array, inverseCoffs?: Float64Array): Matrix3d {\n const result = new Matrix3d(coffs);\n if (inverseCoffs && inverseCoffs.length >= 9) {\n result.inverseCoffs = inverseCoffs;\n result.inverseState = InverseMatrixState.inverseStored;\n } else {\n result.inverseState = InverseMatrixState.unknown;\n }\n return result;\n }\n /**\n * Create a matrix by distributing vectors to columns in one of 6 orders.\n * @param axisOrder identifies where the columns are placed.\n * @param columnA vector to place in the column specified by first letter in the AxisOrder name.\n * @param columnB vector to place in the column specified by second letter in the AxisOrder name.\n * @param columnC vector to place in the column specified by third letter in the AxisOrder name.\n * @param result optional result matrix3d\n * * Example: If you pass AxisOrder.YZX, then result will be [columnC, columnA, columnB] because\n * first letter Y means columnA should go to the second column, second letter Z means columnB should\n * go to the third column, and third letter X means columnC should go to the first column.\n */\n public static createColumnsInAxisOrder(\n axisOrder: AxisOrder, columnA: Vector3d | undefined, columnB: Vector3d | undefined,\n columnC: Vector3d | undefined, result?: Matrix3d,\n ): Matrix3d {\n if (!result) result = new Matrix3d();\n if (axisOrder === AxisOrder.YZX) {\n result.setColumns(columnC, columnA, columnB);\n } else if (axisOrder === AxisOrder.ZXY) {\n result.setColumns(columnB, columnC, columnA);\n } else if (axisOrder === AxisOrder.XZY) {\n result.setColumns(columnA, columnC, columnB);\n } else if (axisOrder === AxisOrder.YXZ) {\n result.setColumns(columnB, columnA, columnC);\n } else if (axisOrder === AxisOrder.ZYX) {\n result.setColumns(columnC, columnB, columnA);\n } else { // AxisOrder.XYZ\n result.setColumns(columnA, columnB, columnC);\n }\n return result;\n }\n /**\n * Create the inverseCoffs member (filled with zeros)\n * This is for use by matrix * matrix multiplications which need to be sure the member is there to be\n * filled with method-specific content.\n */\n private createInverseCoffsWithZeros() {\n if (!this.inverseCoffs) {\n this.inverseState = InverseMatrixState.unknown;\n this.inverseCoffs = new Float64Array(9);\n }\n }\n /**\n * Copy the transpose of the coffs to the inverseCoffs.\n * * Mark the matrix as inverseStored.\n */\n private setupInverseTranspose() {\n const coffs = this.coffs;\n this.inverseState = InverseMatrixState.inverseStored;\n this.inverseCoffs = Float64Array.from([\n coffs[0], coffs[3], coffs[6],\n coffs[1], coffs[4], coffs[7],\n coffs[2], coffs[5], coffs[8],\n ]);\n }\n /**\n * Set all entries in the matrix from call parameters appearing in row-major order.\n * @param axx Row x, column x (0,0) entry\n * @param axy Row x, column y (0,1) entry\n * @param axz Row x, column z (0,2) entry\n * @param ayx Row y, column x (1,0) entry\n * @param ayy Row y, column y (1,1) entry\n * @param ayz Row y, column z (1,2) entry\n * @param azx Row z, column x (2,0) entry\n * @param azy Row z, column y (2,2) entry\n * @param azz row z, column z (2,3) entry\n */\n public setRowValues(\n axx: number, axy: number, axz: number,\n ayx: number, ayy: number, ayz: number,\n azx: number, azy: number, azz: number): void {\n this.coffs[0] = axx; this.coffs[1] = axy; this.coffs[2] = axz;\n this.coffs[3] = ayx; this.coffs[4] = ayy; this.coffs[5] = ayz;\n this.coffs[6] = azx; this.coffs[7] = azy; this.coffs[8] = azz;\n this.inverseState = InverseMatrixState.unknown;\n }\n /** Set the matrix to an identity. */\n public setIdentity() {\n this.setRowValues(1, 0, 0, 0, 1, 0, 0, 0, 1);\n this.setupInverseTranspose();\n }\n /** Set the matrix to all zeros. */\n public setZero() {\n this.setRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0);\n this.inverseState = InverseMatrixState.singular;\n }\n /** Copy contents from the `other` matrix. If `other` is undefined, use identity matrix. */\n public setFrom(other: Matrix3d | undefined): void {\n if (other === undefined) {\n this.setIdentity();\n return;\n }\n if (other !== this) {\n for (let i = 0; i < 9; i++)\n this.coffs[i] = other.coffs[i];\n if (other.inverseState === InverseMatrixState.inverseStored && other.inverseCoffs !== undefined) {\n this.createInverseCoffsWithZeros();\n for (let i = 0; i < 9; i++)\n this.inverseCoffs![i] = other.inverseCoffs[i];\n this.inverseState = InverseMatrixState.inverseStored;\n } else if (other.inverseState !== InverseMatrixState.inverseStored) {\n this.inverseState = other.inverseState;\n } else { // This is reached when other says stored but does not have coffs. This should not happen.\n this.inverseState = InverseMatrixState.unknown;\n }\n }\n }\n /**\n * Return a clone of this matrix.\n * * Coefficients are copied.\n * * Inverse coefficients and inverse status are copied if stored by `this`.\n */\n public clone(result?: Matrix3d): Matrix3d {\n result = result ? result : new Matrix3d();\n result.setFrom(this);\n return result;\n }\n /**\n * Create a matrix with all zeros.\n * * Note that for geometry transformations \"all zeros\" is not a useful default state.\n * * Hence, almost always use `createIdentity` for graphics transformations.\n * * \"All zeros\" is appropriate for summing moment data.\n * ```\n * equation\n * \\begin{bmatrix}0 & 0 & 0 \\\\ 0 & 0 & 0 \\\\ 0 & 0 & 0\\end{bmatrix}\n * ```\n */\n public static createZero(): Matrix3d {\n const retVal = new Matrix3d();\n retVal.inverseState = InverseMatrixState.singular;\n return retVal;\n }\n /**\n * Create an identity matrix.\n * * All diagonal entries (xx,yy,zz) are one\n * * All others are zero.\n * * This (rather than \"all zeros\") is the useful state for most graphics transformations.\n * ```\n * equation\n * \\begin{bmatrix}1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1\\end{bmatrix}\n * ```\n *\n */\n public static createIdentity(result?: Matrix3d): Matrix3d {\n result = result ? result : new Matrix3d();\n result.setIdentity();\n return result;\n }\n /**\n * Create a matrix with distinct x,y,z diagonal (scale) entries.\n * ```\n * equation\n * \\begin{bmatrix}s_x & 0 & 0 \\\\ 0 & s_y & 0\\\\ 0 & 0 & s_z\\end{bmatrix}\n * ```\n */\n public static createScale(\n scaleFactorX: number, scaleFactorY: number, scaleFactorZ: number, result?: Matrix3d,\n ): Matrix3d {\n if (result)\n result.setZero();\n else\n result = new Matrix3d();\n result.coffs[0] = scaleFactorX;\n result.coffs[4] = scaleFactorY;\n result.coffs[8] = scaleFactorZ;\n if (scaleFactorX === 0 || scaleFactorY === 0 || scaleFactorZ === 0) {\n result.inverseState = InverseMatrixState.singular;\n } else {\n result.inverseState = InverseMatrixState.inverseStored;\n result.inverseCoffs = Float64Array.from(\n [1 / scaleFactorX, 0, 0,\n 0, 1 / scaleFactorY, 0,\n 0, 0, 1 / scaleFactorZ],\n );\n }\n return result;\n }\n /**\n * Create a matrix with uniform scale factor \"s\":\n * ```\n * equation\n * \\begin{bmatrix}s & 0 & 0 \\\\ 0 & s & 0\\\\ 0 & 0 & s\\end{bmatrix}\n * ```\n */\n public static createUniformScale(scaleFactor: number): Matrix3d {\n return Matrix3d.createScale(scaleFactor, scaleFactor, scaleFactor);\n }\n /**\n * Return a vector that is perpendicular to the input `vectorA`.\n * * Among the infinite number of perpendiculars possible, this method favors having one in the xy plane.\n * * Hence, when `vectorA` is close to the Z axis, the returned vector is `vectorA cross -unitY`\n * but when `vectorA` is NOT close to the Z axis, the returned vector is `unitZ cross vectorA`.\n */\n public static createPerpendicularVectorFavorXYPlane(vectorA: Vector3d, result?: Vector3d): Vector3d {\n const a = vectorA.magnitude();\n const scale = 64.0; // A constant from the dawn of time in the CAD industry\n const b = a / scale;\n // if vectorA is close to the Z axis\n if (Math.abs(vectorA.x) < b && Math.abs(vectorA.y) < b) {\n return Vector3d.createCrossProduct(vectorA.x, vectorA.y, vectorA.z, 0, -1, 0, result);\n }\n // if vectorA is NOT close to the Z axis\n return Vector3d.createCrossProduct(0, 0, 1, vectorA.x, vectorA.y, vectorA.z, result);\n }\n /**\n * Return a vector that is perpendicular to the input `vectorA`.\n * * Among the infinite number of perpendiculars possible, this method favors having one near the plane\n * containing Z.\n * That is achieved by cross product of `this` vector with the result of createPerpendicularVectorFavorXYPlane.\n */\n public static createPerpendicularVectorFavorPlaneContainingZ(vectorA: Vector3d, result?: Vector3d): Vector3d {\n /**\n * vectorA, result (below), and \"vectorA cross result\" form a coordinate system where \"result\" is located on\n * the XY-plane. Once you've got a coordinate system with an axis in the XY-plane, your other two axes form\n * a plane that includes the z-axis.\n */\n result = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA, result);\n return vectorA.crossProduct(result, result);\n }\n /**\n * Create a matrix from column vectors, shuffled into place per axisOrder\n * * For example, if axisOrder = XYZ then it returns [vectorU, vectorV, vectorW]\n * * Another example, if axisOrder = YZX then it returns [vectorW, vectorU, vectorV] because\n * Y is at index 0 so vectorU goes to the column Y (column 2), Z is at index 1 so vectorV goes\n * to the column Z (column 3), and X is at index 2 so vectorW goes to the column X (column 1)\n */\n public static createShuffledColumns(\n vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, axisOrder: AxisOrder, result?: Matrix3d,\n ): Matrix3d {\n const target = Matrix3d._create(result);\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 0), vectorU);\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 1), vectorV);\n target.setColumn(Geometry.axisOrderToAxis(axisOrder, 2), vectorW);\n return target;\n }\n /**\n * Create a new orthogonal matrix (perpendicular columns, unit length, transpose is inverse).\n * * `vectorA1 = Normalized vectorA` is placed in the column specified by **first** letter in\n * the AxisOrder name.\n * * Normalized `vectorC1 = vectorA1 cross vectorB` is placed in the column specified by **third**\n * letter in the AxisOrder name.\n * * Normalized `vectorC1 cross vectorA` is placed in the column specified by **second**\n * letter in the AxisOrder name.\n * * This function internally uses createShuffledColumns.\n */\n public static createRigidFromColumns(\n vectorA: Vector3d, vectorB: Vector3d, axisOrder: AxisOrder, result?: Matrix3d,\n ): Matrix3d | undefined {\n const vectorA1 = vectorA.normalize();\n if (vectorA1) {\n const vectorC1 = vectorA1.unitCrossProduct(vectorB);\n if (vectorC1) {\n const vectorB1 = vectorC1.unitCrossProduct(vectorA);\n if (vectorB1) {\n const retVal = Matrix3d.createShuffledColumns(vectorA1, vectorB1, vectorC1, axisOrder, result);\n retVal.setupInverseTranspose();\n return retVal;\n }\n }\n }\n return undefined;\n }\n /**\n * Construct a rigid matrix (orthogonal matrix with determinant 1) using vectorA and its 2 perpendiculars.\n * * If axisOrder is not passed then `AxisOrder = AxisOrder.ZXY` is used as default.\n * * This function internally uses createPerpendicularVectorFavorXYPlane and createRigidFromColumns.\n * * Passing the normal of a plane P into this method returns a matrix whose transpose rotates geometry in P\n * to the xy-plane if P contains the origin, or to a plane parallel to the xy-plane if P does not contain the origin.\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/2PerpendicularVectorsTo1Vector\n */\n public static createRigidHeadsUp(\n vectorA: Vector3d, axisOrder: AxisOrder = AxisOrder.ZXY, result?: Matrix3d,\n ): Matrix3d {\n const vectorB = Matrix3d.createPerpendicularVectorFavorXYPlane(vectorA);\n const matrix = Matrix3d.createRigidFromColumns(vectorA, vectorB, axisOrder, result);\n if (matrix) {\n matrix.setupInverseTranspose();\n return matrix;\n }\n return Matrix3d.createIdentity(result);\n }\n /**\n * Return the matrix for rotation of `angle` around desired `axis`\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n * @param axis the axis of rotation\n * @param angle the angle of rotation\n * @param result caller-allocated matrix (optional)\n * @returns the `rotation matrix` or `undefined` (if axis magnitude is near zero).\n */\n public static createRotationAroundVector(axis: Vector3d, angle: Angle, result?: Matrix3d): Matrix3d | undefined {\n // Rodriguez formula (matrix form), https://mathworld.wolfram.com/RodriguesRotationFormula.html\n const c = angle.cos();\n const s = angle.sin();\n const v = 1.0 - c;\n const unit = axis.normalize();\n if (unit) {\n const retVal = Matrix3d.createRowValues(\n unit.x * unit.x * v + c, unit.x * unit.y * v - s * unit.z, unit.x * unit.z * v + s * unit.y,\n unit.y * unit.x * v + s * unit.z, unit.y * unit.y * v + c, unit.y * unit.z * v - s * unit.x,\n unit.z * unit.x * v - s * unit.y, unit.z * unit.y * v + s * unit.x, unit.z * unit.z * v + c,\n result,\n );\n retVal.setupInverseTranspose();\n return retVal;\n }\n return undefined;\n }\n /** Returns a rotation of specified angle around one of the main axis (X,Y,Z).\n * @param axisIndex index of axis (AxisIndex.X, AxisIndex.Y, AxisIndex.Z) kept fixed by the rotation.\n * @param angle angle of rotation\n * @param result optional result matrix.\n * * Math details of 3d rotation matrices derivation can be found at docs/learning/geometry/Angle.md\n */\n public static createRotationAroundAxisIndex(axisIndex: AxisIndex, angle: Angle, result?: Matrix3d): Matrix3d {\n const c = angle.cos();\n const s = angle.sin();\n let myResult;\n if (axisIndex === AxisIndex.X) {\n myResult = Matrix3d.createRowValues(\n 1, 0, 0,\n 0, c, -s,\n 0, s, c,\n result);\n } else if (axisIndex === AxisIndex.Y) {\n myResult = Matrix3d.createRowValues(\n c, 0, s,\n 0, 1, 0,\n -s, 0, c,\n result);\n } else {\n myResult = Matrix3d.createRowValues(\n c, -s, 0,\n s, c, 0,\n 0, 0, 1,\n result);\n }\n myResult.setupInverseTranspose();\n return myResult;\n }\n /**\n * Replace current rows Ui and Uj with (c*Ui + s*Uj) and (c*Uj - s*Ui).\n * * There is no checking for i,j being 0,1,2.\n * * The instance matrix A is multiplied in place on the left by a Givens rotation G, resulting in the matrix G*A.\n * @param i first row index. **must be 0,1,2** (unchecked)\n * @param j second row index. **must be 0,1,2** (unchecked)\n * @param c fist coefficient\n * @param s second coefficient\n */\n private applyGivensRowOp(i: number, j: number, c: number, s: number): void {\n let ii = 3 * i;\n let jj = 3 * j;\n const limit = ii + 3;\n for (; ii < limit; ii++, jj++) {\n const a = this.coffs[ii];\n const b = this.coffs[jj];\n this.coffs[ii] = a * c + b * s;\n this.coffs[jj] = -a * s + b * c;\n }\n }\n /**\n * Replace current columns Ui and Uj with (c*Ui + s*Uj) and (c*Uj - s*Ui).\n * * There is no checking for i,j being 0,1,2.\n * * The instance matrix A is multiplied in place on the right by a Givens rotation G, resulting in the matrix A*G.\n * * This is used in compute intensive inner loops\n * @param i first row index. **must be 0,1,2** (unchecked)\n * @param j second row index. **must be 0,1,2** (unchecked)\n * @param c fist coefficient\n * @param s second coefficient\n */\n public applyGivensColumnOp(i: number, j: number, c: number, s: number): void {\n const limit = i + 9;\n for (; i < limit; i += 3, j += 3) {\n const a = this.coffs[i];\n const b = this.coffs[j];\n this.coffs[i] = a * c + b * s;\n this.coffs[j] = -a * s + b * c;\n }\n }\n /**\n * Create a matrix from column vectors.\n * ```\n * equation\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ U_z & V_z & W_z \\end{bmatrix}\n * ```\n */\n public static createColumns(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\n return Matrix3d.createRowValues\n (\n vectorU.x, vectorV.x, vectorW.x,\n vectorU.y, vectorV.y, vectorW.y,\n vectorU.z, vectorV.z, vectorW.z,\n result,\n );\n }\n /**\n * Create a matrix with each column's _x,y_ parts given `XAndY` and separate numeric z values.\n * ```\n * equation\n * \\begin{bmatrix}U_x & V_x & W_x \\\\ U_y & V_y & W_y \\\\ u & v & w \\end{bmatrix}\n * ```\n */\n public static createColumnsXYW(\n vectorU: XAndY, u: number,\n vectorV: XAndY, v: number,\n vectorW: XAndY, w: number,\n result?: Matrix3d,\n ): Matrix3d {\n return Matrix3d.createRowValues\n (\n vectorU.x, vectorV.x, vectorW.x,\n vectorU.y, vectorV.y, vectorW.y,\n u, v, w,\n result,\n );\n }\n /**\n * Create a matrix from \"as viewed\" right and up vectors.\n * * ColumnX points in the rightVector direction.\n * * ColumnY points in the upVector direction.\n * * ColumnZ is a unit cross product of ColumnX and ColumnY.\n * * Optionally rotate by 45 degrees around `upVector` to bring its left or right vertical edge to center.\n * * Optionally rotate by arctan(1/sqrt(2)) ~ 35.264 degrees around `rightVector` to bring the top or bottom\n * horizontal edge of the view to the center (for isometric views).\n *\n * This is expected to be used with various principal unit vectors that are perpendicular to each other.\n * * STANDARD TOP VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(), 0, 0)\n * * STANDARD FRONT VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), 0, 0)\n * * STANDARD BACK VIEW: createViewedAxes(Vector3d.unitX(-1), Vector3d.unitZ(), 0, 0)\n * * STANDARD RIGHT VIEW: createViewedAxes(Vector3d.unitY(), Vector3d.unitZ(), 0, 0)\n * * STANDARD LEFT VIEW: createViewedAxes(Vector3d.unitY(-1), Vector3d.unitZ(), 0, 0)\n * * STANDARD BOTTOM VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitY(-1), 0, 0)\n * * STANDARD ISO VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), -1, 1)\n * * STANDARD RIGHT ISO VIEW: createViewedAxes(Vector3d.unitX(), Vector3d.unitZ(), 1, 1)\n * * Front, right, back, left, top, and bottom standard views are views from faces of the cube\n * and iso and right iso standard views are views from corners of the cube.\n * * Note: createViewedAxes is column-based so always returns local to world\n *\n * @param rightVector ColumnX of the returned matrix. Expected to be perpendicular to upVector.\n * @param upVector ColumnY of the returned matrix. Expected to be perpendicular to rightVector.\n * @param leftNoneRight Specifies the ccw rotation around `upVector` axis. Normally one of \"-1\", \"0\", and \"1\",\n * where \"-1\" indicates rotation by 45 degrees to bring the left vertical edge to center, \"0\" means no rotation,\n * and \"1\" indicates rotation by 45 degrees to bring the right vertical edge to center. Other numbers are\n * used as multiplier for this 45 degree rotation.\n * @param topNoneBottom Specifies the ccw rotation around `rightVector` axis. Normally one of \"-1\", \"0\", and \"1\",\n * where \"-1\" indicates isometric rotation (35.264 degrees) to bring the bottom upward, \"0\" means no rotation,\n * and \"1\" indicates isometric rotation (35.264 degrees) to bring the top downward. Other numbers are\n * used as multiplier for the 35.264 degree rotation.\n * @returns matrix = [rightVector, upVector, rightVector cross upVector] with the applied rotations specified\n * by leftNoneRight and topNoneBottom. Returns undefined if rightVector and upVector are parallel.\n */\n public static createViewedAxes(\n rightVector: Vector3d, upVector: Vector3d, leftNoneRight: number = 0, topNoneBottom: number = 0,\n ): Matrix3d | undefined {\n const columnZ = rightVector.crossProduct(upVector);\n if (columnZ.normalizeInPlace()) {\n // matrix = [rightVector, upVector, rightVector cross upVector]\n const matrix = Matrix3d.createColumns(rightVector, upVector, columnZ);\n // \"45 degrees * leftNoneRight\" rotation around Y\n if (leftNoneRight !== 0.0) {\n let c = Math.sqrt(0.5);\n let s = leftNoneRight < 0.0 ? -c : c;\n if (Math.abs(leftNoneRight) !== 1.0) {\n const radians = Angle.degreesToRadians(45.0 * leftNoneRight);\n c = Math.cos(radians);\n s = Math.sin(radians);\n }\n matrix.applyGivensColumnOp(2, 0, c, s); // rotate around Y (equivalent to matrix*rotationY)\n }\n // \"35.264 degrees * topNoneBottom\" rotation around X\n if (topNoneBottom !== 0.0) {\n const theta = topNoneBottom * Math.atan(Math.sqrt(0.5));\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n matrix.applyGivensColumnOp(1, 2, c, -s); // rotate around X (equivalent to matrix*rotationX)\n }\n return matrix;\n }\n return undefined;\n }\n /**\n * Create a rotation matrix for one of the 8 standard views.\n * * Default is TOP view (`local X = world X`, `local Y = world Y`, `local Z = world Z`).\n * * To change view from the TOP to one of the other 7 standard views, we need to multiply \"world data\" to\n * the corresponding matrix1 provided by `createStandardWorldToView(index, false)` and then\n * `matrix1.multiply(world data)` will return \"local data\".\n * * To change view back to the TOP, we need to multiply \"local data\" to the corresponding matrix2 provided\n * by `createStandardWorldToView(index, true)` and then `matrix2.multiply(local data)` will returns \"world data\".\n * * Note: No matter how you rotate the world axis, local X is always pointing right, local Y is always pointing up,\n * and local Z is always pointing toward you.\n *\n * @param index standard view index `StandardViewIndex.Top, Bottom, Left, Right, Front, Back, Iso, RightIso`\n * @param invert if false (default), the return matrix is world to local (view) and if true, the the return\n * matrix is local (view) to world.\n * @param result optional result.\n */\n public static createStandardWorldToView(\n index: StandardViewIndex, invert: boolean = false, result?: Matrix3d,\n ): Matrix3d {\n switch (index) {\n // Start with TOP view, ccw rotation by 180 degrees around X\n case StandardViewIndex.Bottom:\n result = Matrix3d.createRowValues(\n 1, 0, 0,\n 0, -1, 0,\n 0, 0, -1,\n );\n break;\n // Start with TOP view, ccw rotation by -90 degrees around X and by 90 degrees around Z\n case StandardViewIndex.Left:\n result = Matrix3d.createRowValues(\n 0, -1, 0,\n 0, 0, 1,\n -1, 0, 0,\n );\n break;\n // Start with TOP view, ccw rotation by -90 degrees around X and by -90 degrees around Z\n case StandardViewIndex.Right:\n result = Matrix3d.createRowValues(\n 0, 1, 0,\n 0, 0, 1,\n 1, 0, 0,\n );\n break;\n // Start with TOP view, ccw rotation by -90 degrees around X\n case StandardViewIndex.Front:\n result = Matrix3d.createRowValues(\n 1, 0, 0,\n 0, 0, 1,\n 0, -1, 0,\n );\n break;\n // Start with TOP view, ccw rotation by -90 degrees around X and by 180 degrees around Z\n case StandardViewIndex.Back:\n result = Matrix3d.createRowValues(\n -1, 0, 0,\n 0, 0, 1,\n 0, 1, 0,\n );\n break;\n /**\n * Isometric view\n * Start with FRONT view, ccw rotation by -45 degrees around Y and by arctan(1/sqrt(2)) ~ 35.264 degrees around X\n * cos(45) = 1/sqrt(2) = 0.70710678118 and sin(45) = 1/sqrt(2) = 0.70710678118\n * cos(35.264) = 2/sqrt(6) = 0.81649658092 and sin(35.264) = 1/sqrt(3) = 0.57735026919\n * More info: https://en.wikipedia.org/wiki/Isometric_projection\n */\n case StandardViewIndex.Iso:\n result = Matrix3d.createRowValues(\n 0.707106781186548, -0.70710678118654757, 0.00000000000000000,\n 0.408248290463863, 0.40824829046386302, 0.81649658092772603,\n -0.577350269189626, -0.57735026918962573, 0.57735026918962573,\n );\n break;\n // Start with FRONT view, ccw rotation by 45 degrees around Y and by 35.264 degrees around X\n case StandardViewIndex.RightIso:\n result = Matrix3d.createRowValues(\n 0.707106781186548, 0.70710678118654757, 0.00000000000000000,\n -0.408248290463863, 0.40824829046386302, 0.81649658092772603,\n 0.577350269189626, -0.57735026918962573, 0.57735026918962573,\n );\n break;\n // no rotation\n case StandardViewIndex.Top:\n default:\n result = Matrix3d.createIdentity(result);\n }\n if (invert)\n result.transposeInPlace(); // matrix is rigid so transpose and inverse are the same\n return result;\n }\n /**\n * Apply (in place) a jacobi eigenvalue algorithm.\n * @param i row index of zeroed member\n * @param j column index of zeroed member\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\n * mutually perpendicular because `this` matrix is symmetric.\n * @param lambda a matrix that its diagonal entries will be filled by eigenvalues and its non-diagonal elements\n * converge to 0 (allocated by caller, computed and filled by this function).\n */\n private applySymmetricJacobi(i: number, j: number, leftEigenvectors: Matrix3d, lambda: Matrix3d): number {\n const sii = lambda.at(i, i);\n const sjj = lambda.at(j, j);\n const sij = lambda.at(i, j);\n if (Math.abs(sij) < Geometry.smallFloatingPoint * (sii + sjj))\n return 0.0;\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(sii - sjj, 2.0 * sij);\n const c = jacobi.c;\n const s = jacobi.s;\n /**\n * The following check does not exist in applyFastSymmetricJacobi because here if we don't return\n * early, the matrix remains untouched. However, applyFastSymmetricJacobi zeroes-out elements ij\n * and ji. Therefore, if we return early in applyFastSymmetricJacobi, zeroing-out wont happen.\n */\n if (Math.abs(s) < 2.0e-15)\n return 0.0;\n /**\n * If you apply the following 2 lines to a symmetric matrix, you get same lines used in\n * applyFastSymmetricJacobi. There are 2 differences which make applyFastSymmetricJacobi\n * more efficient. First, we directly set elements ij and ji equal to zero rather than\n * calculation them. Second, we copy symmetric elements from upper triangle to lower\n * instead of calculating them.\n */\n lambda.applyGivensRowOp(i, j, c, s);\n lambda.applyGivensColumnOp(i, j, c, s);\n leftEigenvectors.applyGivensColumnOp(i, j, c, s);\n return Math.abs(sij);\n }\n /**\n * Factor `this` matrix as a product `U * lambda * UT` where `U` is an orthogonal matrix and `lambda`\n * is a diagonal matrix.\n *\n * * **Note 1:** You must apply this function to a `symmetric` matrix. Otherwise, the lower triangle is ignored\n * and the upper triangle is mirrored to the lower triangle to enforce symmetry.\n * * **Note 2:** This function is replaced by a faster method called `fastSymmetricEigenvalues` so consider\n * using the fast version instead.\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\n * mutually perpendicular because `this` matrix is symmetric.\n * @param lambda a vector that its entries will be filled by eigenvalues of `this` Matrix3d (allocated by\n * caller, computed and filled by this function).\n */\n public symmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\n const matrix = this.clone();\n leftEigenvectors.setIdentity();\n matrix.coffs[3] = matrix.coffs[1];\n matrix.coffs[6] = matrix.coffs[2];\n matrix.coffs[7] = matrix.coffs[5];\n const tolerance = 1.0e-12 * this.sumSquares();\n const numberOfIterations = 7;\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\n const sum = this.applySymmetricJacobi(0, 1, leftEigenvectors, matrix)\n + this.applySymmetricJacobi(0, 2, leftEigenvectors, matrix)\n + this.applySymmetricJacobi(1, 2, leftEigenvectors, matrix);\n if (sum < tolerance) {\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\n return true;\n }\n }\n return false;\n }\n /**\n * Apply (in place) a jacobi eigenvalue algorithm that diagonalize `this` matrix, i.e., zeros out this.at(i,j).\n * * During diagonalization, the upper triangle is mirrored to lower triangle to enforce symmetry.\n * * Math details can be found at docs/learning/geometry/Matrix.md\n * @param i row index of zeroed member.\n * @param j column index of zeroed member.\n * @param k other row/column index (different from i and j).\n * @param leftEigenVectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\n * mutually perpendicular because `this` matrix is symmetric.\n */\n private applyFastSymmetricJacobi(i: number, j: number, k: number, leftEigenVectors: Matrix3d): number {\n const indexII = 4 * i;\n const indexJJ = 4 * j;\n const indexIJ = 3 * i + j;\n const indexJI = 3 * j + i;\n const indexIK = 3 * i + k;\n const indexKI = 3 * k + i;\n const indexJK = 3 * j + k;\n const indexKJ = 3 * k + j;\n const sii = this.coffs[indexII];\n const sjj = this.coffs[indexJJ];\n const sij = this.coffs[indexIJ];\n if (Math.abs(sij) < Geometry.smallFloatingPoint * (sii + sjj))\n return 0.0;\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(sii - sjj, 2.0 * sij);\n const c = jacobi.c;\n const s = jacobi.s;\n const cc = c * c;\n const ss = s * s;\n const sc2 = 2.0 * c * s;\n this.coffs[indexII] = cc * sii + sc2 * sij + ss * sjj;\n this.coffs[indexJJ] = ss * sii - sc2 * sij + cc * sjj;\n this.coffs[indexIJ] = 0.0;\n this.coffs[indexJI] = 0.0;\n const a = this.coffs[indexIK];\n const b = this.coffs[indexJK];\n this.coffs[indexIK] = c * a + s * b;\n this.coffs[indexJK] = -s * a + c * b;\n this.coffs[indexKI] = this.coffs[indexIK];\n this.coffs[indexKJ] = this.coffs[indexJK];\n leftEigenVectors.applyGivensColumnOp(i, j, c, s);\n return Math.abs(sij);\n }\n /**\n * Factor `this` matrix as a product `U * lambda * UT` where `U` is an orthogonal matrix and `lambda`\n * is a diagonal matrix.\n *\n * * **Note:** You must apply this function to a `symmetric` matrix. Otherwise, the lower triangle is ignored\n * and the upper triangle is mirrored to the lower triangle to enforce symmetry.\n * * Math details can be found at docs/learning/geometry/Matrix.md\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\n * mutually perpendicular because `this` matrix is symmetric.\n * @param lambda a vector that its entries will be filled by eigenvalues of `this` Matrix3d (allocated by\n * caller, computed and filled by this function).\n */\n public fastSymmetricEigenvalues(leftEigenvectors: Matrix3d, lambda: Vector3d): boolean {\n const matrix = this.clone();\n leftEigenvectors.setIdentity();\n const tolerance = 1.0e-12 * this.sumSquares();\n const numberOfIterations = 7;\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\n const sum = matrix.applyFastSymmetricJacobi(0, 1, 2, leftEigenvectors)\n + matrix.applyFastSymmetricJacobi(0, 2, 1, leftEigenvectors)\n + matrix.applyFastSymmetricJacobi(1, 2, 0, leftEigenvectors);\n if (sum < tolerance) {\n lambda.set(matrix.at(0, 0), matrix.at(1, 1), matrix.at(2, 2));\n return true;\n }\n }\n return false;\n }\n /**\n * Compute the (unit vector) axis and angle for the rotation generated by `this` Matrix3d.\n * * Math details can be found at docs/learning/geometry/Angle.md\n * @returns Returns axis and angle of rotation with result.ok === true when the conversion succeeded.\n */\n public getAxisAndAngleOfRotation(): { axis: Vector3d, angle: Angle, ok: boolean } {\n const trace = this.coffs[0] + this.coffs[4] + this.coffs[8];\n const skewXY = this.coffs[3] - this.coffs[1]; // 2*z*sin\n const skewYZ = this.coffs[7] - this.coffs[5]; // 2*y*sin\n const skewZX = this.coffs[2] - this.coffs[6]; // 2*x*sin\n // trace = (m00^2 + m11^2 + m22^2) * (1-cos) + 3cos = (1-cos) + 3cos = 1 + 2cos ==> cos = (trace-1) / 2\n const c = (trace - 1.0) / 2.0; // cosine\n const s = Geometry.hypotenuseXYZ(skewXY, skewYZ, skewZX) / 2.0; // sine\n const e = c * c + s * s - 1.0; // s^2 + c^2 = 1\n // if s^2 + c^2 != 1 then we have a bad matrix so return false\n if (Math.abs(e) > Geometry.smallAngleRadians) {\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\n }\n // sin is close to 0 then we got to special cases (angle 0 or 180) which needs to be handled differently\n if (Math.abs(s) < Geometry.smallAngleRadians) {\n if (c > 0) // sin = 0 and cos = 1 so angle = 0 (i.e., no rotation)\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: true };\n /**\n * If sin = 0 and cos = -1 then angle = 180 (i.e., 180 degree rotation around some axis)\n * then the rotation matrix becomes\n * 2x^2-1 2xy 2xz\n * 2xy 2y^2-1 2yz\n * 2xz 2yz 2z^2-1\n * Note that the matrix is \"symmetric\".\n * If rotation is around one the standard basis then non-diagonal entries become 0 and we\n * have one 1 and two -1s on the diagonal.\n * If rotation is around an axis other than standard basis, then the axis is the eigenvector\n * of the rotation matrix with eigenvalue = 1.\n */\n const axx = this.coffs[0];\n const ayy = this.coffs[4];\n const azz = this.coffs[8];\n // Look for a pair of \"-1\" entries on the diagonal (for rotation around the basis X,Y,Z axis)\n if (Geometry.isAlmostEqualNumber(-1.0, ayy) && Geometry.isAlmostEqualNumber(-1, azz)) {\n return { axis: Vector3d.create(1, 0, 0), angle: Angle.createDegrees(180), ok: true };\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, azz)) {\n return { axis: Vector3d.create(0, 1, 0), angle: Angle.createDegrees(180), ok: true };\n } else if (Geometry.isAlmostEqualNumber(-1.0, axx) && Geometry.isAlmostEqualNumber(-1, ayy)) {\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createDegrees(180), ok: true };\n }\n // Look for eigenvector with eigenvalue = 1\n const eigenvectors = Matrix3d.createIdentity();\n const eigenvalues = Vector3d.create(0, 0, 0);\n if (this.fastSymmetricEigenvalues(eigenvectors, eigenvalues)) { // note: this matrix is \"symmetric\"\n for (let axisIndex = 0; axisIndex < 2; axisIndex++) {\n const lambda = eigenvalues.at(axisIndex);\n if (Geometry.isAlmostEqualNumber(1, lambda))\n return { axis: eigenvectors.getColumn(axisIndex), angle: Angle.createDegrees(180), ok: true };\n }\n // if no eigenvalue = 1 was found return false\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\n }\n // if no axis was found return false\n return { axis: Vector3d.create(0, 0, 1), angle: Angle.createRadians(0), ok: false };\n }\n // good matrix and non-zero sine\n const a = 1.0 / (2.0 * s);\n const result = {\n axis: Vector3d.create(skewYZ * a, skewZX * a, skewXY * a),\n angle: Angle.createAtan2(s, c),\n ok: true,\n };\n return result;\n }\n /**\n * Rotate columns i and j of `this` matrix to make them perpendicular using the angle that zero-out\n * `thisTranspose * this`.\n * @param i row index of zeroed member.\n * @param j column index of zeroed member.\n * @param matrixU a matrix that its columns will be filled by the right eigenvectors of `thisTranspose * this`\n * (allocated by caller, computed and filled by this function). Note that columns of matrixU will be mutually\n * perpendicular because `thisTranspose * this` matrix is symmetric.\n */\n private applyJacobiColumnRotation(i: number, j: number, matrixU: Matrix3d): number {\n const uDotU = this.coffs[i] * this.coffs[i]\n + this.coffs[i + 3] * this.coffs[i + 3]\n + this.coffs[i + 6] * this.coffs[i + 6];\n const vDotV = this.coffs[j] * this.coffs[j]\n + this.coffs[j + 3] * this.coffs[j + 3]\n + this.coffs[j + 6] * this.coffs[j + 6];\n const uDotV = this.coffs[i] * this.coffs[j]\n + this.coffs[i + 3] * this.coffs[j + 3]\n + this.coffs[i + 6] * this.coffs[j + 6];\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\n const c = jacobi.c;\n const s = jacobi.s;\n if (Math.abs(s) < 2.0e-15)\n return 0.0;\n this.applyGivensColumnOp(i, j, c, s); // make columns i and j of `this` matrix perpendicular\n matrixU.applyGivensRowOp(i, j, c, s); // right eigenvalues of `thisTranspose * this`\n return Math.abs(uDotV);\n }\n /**\n * Factor `this` matrix as a product `VD * U` where `VD` has mutually perpendicular columns and `U` is orthogonal.\n * @param matrixVD a matrix that its columns will be filled by rotating columns of `this` to make them mutually\n * perpendicular (allocated by caller, computed and filled by this function).\n * @param matrixU a matrix that its columns will be filled by the right eigenvectors of `thisTranspose * this`\n * (allocated by caller, computed and filled by this function). Note that columns of matrixU will be mutually\n * perpendicular because `thisTranspose * this` matrix is symmetric.\n */\n public factorPerpendicularColumns(matrixVD: Matrix3d, matrixU: Matrix3d): boolean {\n matrixVD.setFrom(this);\n matrixU.setIdentity();\n const tolerance = 1.0e-12 * this.sumSquares();\n const numberOfIterations = 7;\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\n const sum = matrixVD.applyJacobiColumnRotation(0, 1, matrixU)\n + matrixVD.applyJacobiColumnRotation(0, 2, matrixU)\n + matrixVD.applyJacobiColumnRotation(1, 2, matrixU);\n if (sum < tolerance) {\n return true;\n }\n }\n return false;\n }\n /**\n * Factor `this` matrix as a product `V * D * U` where `V` and `U` are orthogonal and `D` is diagonal with\n * positive entries.\n * * This is formally known as the `Singular Value Decomposition` or `SVD`.\n * @param matrixV an orthogonal matrix that its columns will be filled by the left eigenvectors of\n * `thisTranspose * this` (allocated by caller, computed and filled by this function).\n * @param scale singular values of `this` (allocated by caller, computed and filled by this function).\n * The singular values in the `scale` are non-negative and decreasing.\n * @param matrixU an orthogonal matrix that its columns will be filled by the right eigenvectors of\n * `thisTranspose * this` (allocated by caller, computed and filled by this function).\n */\n public factorOrthogonalScaleOrthogonal(matrixV: Matrix3d, scale: Point3d, matrixU: Matrix3d): boolean {\n const matrixVD = Matrix3d.createZero();\n if (!this.factorPerpendicularColumns(matrixVD, matrixU))\n return false;\n const column: Vector3d[] = [];\n column.push(matrixVD.getColumn(0));\n column.push(matrixVD.getColumn(1));\n column.push(matrixVD.getColumn(2));\n scale.set(column[0].magnitude(), column[1].magnitude(), column[2].magnitude()); // singular values of `this`\n const det = matrixVD.determinant();\n if (det < 0)\n scale.z = -scale.z;\n const almostZero = Geometry.smallFloatingPoint;\n const scaleXIsZero: boolean = Math.abs(scale.x) < almostZero;\n const scaleYIsZero: boolean = Math.abs(scale.y) < almostZero;\n const scaleZIsZero: boolean = Math.abs(scale.z) < almostZero;\n // NOTE: We assume any zero-magnitude column(s) of matrixVD are last\n if (!scaleXIsZero && !scaleYIsZero && !scaleZIsZero) { // full rank\n matrixV = matrixVD.scaleColumns(1 / scale.x, 1 / scale.y, 1 / scale.z, matrixV);\n } else if (!scaleXIsZero && !scaleYIsZero) { // rank 2\n column[0].scaleInPlace(1 / scale.x);\n column[1].scaleInPlace(1 / scale.y);\n column[2] = column[0].unitCrossProduct(column[1], column[2])!;\n matrixV.setColumns(column[0], column[1], column[2]);\n } else if (!scaleXIsZero) { // rank 1\n matrixV = Matrix3d.createRigidHeadsUp(column[0], AxisOrder.XYZ, matrixV); // preserve column0\n } else { // rank 0\n matrixV.setIdentity();\n }\n return true;\n }\n /**\n * Return a matrix that rotates a fraction of the angular sweep from vectorA to vectorB.\n * @param vectorA initial vector position\n * @param fraction fractional rotation (1 means rotate all the way)\n * @param vectorB final vector position\n * @param result optional result matrix.\n */\n public static createPartialRotationVectorToVector(\n vectorA: Vector3d, fraction: number, vectorB: Vector3d, result?: Matrix3d,\n ): Matrix3d | undefined {\n let upVector = vectorA.unitCrossProduct(vectorB);\n // the usual case (both vectors and also their cross product is non-zero)\n if (upVector) {\n return Matrix3d.createRotationAroundVector(\n upVector,\n Angle.createRadians(fraction * vectorA.planarAngleTo(vectorB, upVector).radians),\n result,\n );\n }\n // if either vector is zero\n if (Geometry.isSmallMetricDistance(vectorA.magnitude())\n || Geometry.isSmallMetricDistance(vectorB.magnitude()))\n return undefined;\n // aligned vectors (cross product = 0, dot product > 0)\n if (vectorA.dotProduct(vectorB) > 0.0)\n return Matrix3d.createIdentity(result);\n // opposing vectors (cross product = 0, dot product < 0)\n upVector = Matrix3d.createPerpendicularVectorFavorPlaneContainingZ(vectorA, upVector);\n return Matrix3d.createRotationAroundVector(upVector, Angle.createRadians(fraction * Math.PI), result);\n }\n /** Returns a matrix that rotates from vectorA to vectorB. */\n public static createRotationVectorToVector(\n vectorA: Vector3d, vectorB: Vector3d, result?: Matrix3d,\n ): Matrix3d | undefined {\n return this.createPartialRotationVectorToVector(vectorA, 1.0, vectorB, result);\n }\n /** Create a 90 degree rotation around a principal axis */\n public static create90DegreeRotationAroundAxis(axisIndex: number): Matrix3d {\n axisIndex = Geometry.cyclic3dAxis(axisIndex);\n if (axisIndex === 0) {\n const retVal = Matrix3d.createRowValues(\n 1, 0, 0,\n 0, 0, -1,\n 0, 1, 0);\n retVal.setupInverseTranspose();\n return retVal;\n } else if (axisIndex === 1) {\n const retVal = Matrix3d.createRowValues(\n 0, 0, 1,\n 0, 1, 0,\n -1, 0, 0);\n retVal.setupInverseTranspose();\n return retVal;\n } else {\n const retVal = Matrix3d.createRowValues(\n 0, -1, 0,\n 1, 0, 0,\n 0, 0, 1);\n retVal.setupInverseTranspose();\n return retVal;\n }\n }\n /** Return (a copy of) the X column */\n public columnX(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[0], this.coffs[3], this.coffs[6], result);\n }\n /** Return (a copy of) the Y column */\n public columnY(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[1], this.coffs[4], this.coffs[7], result);\n }\n /** Return (a copy of) the Z column */\n public columnZ(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[2], this.coffs[5], this.coffs[8], result);\n }\n /** Return the X column magnitude squared */\n public columnXMagnitudeSquared(): number {\n return Geometry.hypotenuseSquaredXYZ(this.coffs[0], this.coffs[3], this.coffs[6]);\n }\n /** Return the Y column magnitude squared */\n public columnYMagnitudeSquared(): number {\n return Geometry.hypotenuseSquaredXYZ(this.coffs[1], this.coffs[4], this.coffs[7]);\n }\n /** Return the Z column magnitude squared */\n public columnZMagnitudeSquared(): number {\n return Geometry.hypotenuseSquaredXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\n }\n /** Return the X column magnitude */\n public columnXMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6]);\n }\n /** Return the Y column magnitude */\n public columnYMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7]);\n }\n /** Return the Z column magnitude */\n public columnZMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\n }\n /** Return magnitude of columnX cross columnY. */\n public columnXYCrossProductMagnitude(): number {\n return Geometry.crossProductMagnitude(\n this.coffs[0], this.coffs[3], this.coffs[6],\n this.coffs[1], this.coffs[4], this.coffs[7],\n );\n }\n /** Return the X row magnitude */\n public rowXMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[1], this.coffs[2]);\n }\n /** Return the Y row magnitude */\n public rowYMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[3], this.coffs[4], this.coffs[5]);\n }\n /** Return the Z row magnitude */\n public rowZMagnitude(): number {\n return Geometry.hypotenuseXYZ(this.coffs[6], this.coffs[7], this.coffs[8]);\n }\n /** Return the dot product of column X with column Y */\n public columnXDotColumnY(): number {\n return this.coffs[0] * this.coffs[1]\n + this.coffs[3] * this.coffs[4]\n + this.coffs[6] * this.coffs[7];\n }\n /** Return the dot product of column X with column Z */\n public columnXDotColumnZ(): number {\n return this.coffs[0] * this.coffs[2]\n + this.coffs[3] * this.coffs[5]\n + this.coffs[6] * this.coffs[8];\n }\n /** Return the dot product of column Y with column Z */\n public columnYDotColumnZ(): number {\n return this.coffs[1] * this.coffs[2]\n + this.coffs[4] * this.coffs[5]\n + this.coffs[7] * this.coffs[8];\n }\n /**\n * Dot product of an indexed column with a vector given as x,y,z\n * @param columnIndex index of column. Must be 0,1,2.\n * @param x x component of vector\n * @param y y component of vector\n * @param z z component of vector\n */\n public columnDotXYZ(columnIndex: AxisIndex, x: number, y: number, z: number): number {\n return this.coffs[columnIndex] * x + this.coffs[columnIndex + 3] * y + this.coffs[columnIndex + 6] * z;\n }\n /** Return (a copy of) the X row */\n public rowX(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[0], this.coffs[1], this.coffs[2], result);\n }\n /** Return (a copy of) the Y row */\n public rowY(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[3], this.coffs[4], this.coffs[5], result);\n }\n /** Return (a copy of) the Z row */\n public rowZ(result?: Vector3d): Vector3d {\n return Vector3d.create(this.coffs[6], this.coffs[7], this.coffs[8], result);\n }\n /** Return the dot product of the vector parameter with the X column. */\n public dotColumnX(vector: XYZ): number {\n return vector.x * this.coffs[0] + vector.y * this.coffs[3] + vector.z * this.coffs[6];\n }\n /** Return the dot product of the vector parameter with the Y column. */\n public dotColumnY(vector: XYZ): number {\n return vector.x * this.coffs[1] + vector.y * this.coffs[4] + vector.z * this.coffs[7];\n }\n /** Return the dot product of the vector parameter with the Z column. */\n public dotColumnZ(vector: XYZ): number {\n return vector.x * this.coffs[2] + vector.y * this.coffs[5] + vector.z * this.coffs[8];\n }\n /** Return the dot product of the vector parameter with the X row. */\n public dotRowX(vector: XYZ): number {\n return vector.x * this.coffs[0] + vector.y * this.coffs[1] + vector.z * this.coffs[2];\n }\n /** Return the dot product of the vector parameter with the Y row. */\n public dotRowY(vector: XYZ): number {\n return vector.x * this.coffs[3] + vector.y * this.coffs[4] + vector.z * this.coffs[5];\n }\n /** Return the dot product of the vector parameter with the Z row. */\n public dotRowZ(vector: XYZ): number {\n return vector.x * this.coffs[6] + vector.y * this.coffs[7] + vector.z * this.coffs[8];\n }\n /** Return the dot product of the x,y,z with the X row. */\n public dotRowXXYZ(x: number, y: number, z: number): number {\n return x * this.coffs[0] + y * this.coffs[1] + z * this.coffs[2];\n }\n /** Return the dot product of the x,y,z with the Y row. */\n public dotRowYXYZ(x: number, y: number, z: number): number {\n return x * this.coffs[3] + y * this.coffs[4] + z * this.coffs[5];\n }\n /** Return the dot product of the x,y,z with the Z row. */\n public dotRowZXYZ(x: number, y: number, z: number): number {\n return x * this.coffs[6] + y * this.coffs[7] + z * this.coffs[8];\n }\n /** Return the cross product of the Z column with the vector parameter. */\n public columnZCrossVector(vector: XYZ, result?: Vector3d): Vector3d {\n return Geometry.crossProductXYZXYZ(\n this.coffs[2], this.coffs[5], this.coffs[8], vector.x, vector.y, vector.z, result,\n );\n }\n /** Set data from xyz parts of Point4d (w part of Point4d ignored) */\n public setColumnsPoint4dXYZ(vectorU: Point4d, vectorV: Point4d, vectorW: Point4d) {\n this.inverseState = InverseMatrixState.unknown;\n this.setRowValues(\n vectorU.x, vectorV.x, vectorW.x,\n vectorU.y, vectorV.y, vectorW.y,\n vectorU.z, vectorV.z, vectorW.z);\n }\n /**\n * Set entries in one column of the matrix.\n * @param columnIndex column index (this is interpreted cyclically. See Geometry.cyclic3dAxis for more info).\n * @param value x,yz, values for column. If undefined, zeros are installed.\n */\n public setColumn(columnIndex: number, value: Vector3d | undefined) {\n const index = Geometry.cyclic3dAxis(columnIndex);\n this.inverseState = InverseMatrixState.unknown;\n if (value) {\n this.coffs[index] = value.x;\n this.coffs[index + 3] = value.y;\n this.coffs[index + 6] = value.z;\n } else {\n this.coffs[index] = 0.0;\n this.coffs[index + 3] = 0.0;\n this.coffs[index + 6] = 0.0;\n }\n }\n /**\n * Set all columns of the matrix. Any undefined vector is zeros.\n * @param vectorX values for column 0\n * @param vectorY values for column 1\n * @param vectorZ optional values for column 2 (it's optional in case column 2 is 000, which is a\n * projection onto the xy-plane)\n */\n public setColumns(vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ?: Vector3d) {\n this.setColumn(0, vectorX);\n this.setColumn(1, vectorY);\n this.setColumn(2, vectorZ);\n }\n /**\n * Set entries in one row of the matrix.\n * @param rowIndex row index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\n * @param value x,y,z values for row.\n */\n public setRow(rowIndex: number, value: Vector3d) {\n const index = 3 * Geometry.cyclic3dAxis(rowIndex);\n this.coffs[index] = value.x;\n this.coffs[index + 1] = value.y;\n this.coffs[index + 2] = value.z;\n this.inverseState = InverseMatrixState.unknown;\n }\n /**\n * Return (a copy of) a column of the matrix.\n * @param i column index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\n * @param result optional preallocated result.\n */\n public getColumn(columnIndex: number, result?: Vector3d): Vector3d {\n const index = Geometry.cyclic3dAxis(columnIndex);\n return Vector3d.create(\n this.coffs[index],\n this.coffs[index + 3],\n this.coffs[index + 6],\n result,\n );\n }\n /**\n * Return a (copy of) a row of the matrix.\n * @param i row index. This is interpreted cyclically (using Geometry.cyclic3dAxis).\n * @param result optional preallocated result.\n */\n public getRow(columnIndex: number, result?: Vector3d): Vector3d {\n const index = 3 * Geometry.cyclic3dAxis(columnIndex);\n return Vector3d.create(\n this.coffs[index],\n this.coffs[index + 1],\n this.coffs[index + 2],\n result,\n );\n }\n /**\n * Create a matrix from row vectors.\n * ```\n * equation\n * \\begin{bmatrix}U_x & U_y & U_z \\\\ V_x & V_y & V_z \\\\ W_x & W_y & W_z \\end{bmatrix}\n * ```\n */\n public static createRows(vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, result?: Matrix3d): Matrix3d {\n return Matrix3d.createRowValues\n (\n vectorU.x, vectorU.y, vectorU.z,\n vectorV.x, vectorV.y, vectorV.z,\n vectorW.x, vectorW.y, vectorW.z,\n result,\n );\n }\n /**\n * Create a matrix that scales along a specified `direction`. This means if you multiply the returned matrix\n * by a `vector`, you get `directional scale` of that `vector`. Suppose `plane` is the plane perpendicular\n * to the `direction`. When scale = 0, `directional scale` is projection of the `vector` to the `plane`.\n * When scale = 1, `directional scale` is the `vector` itself. When scale = -1, `directional scale` is\n * mirror of the `vector` across the `plane`. In general, When scale != 0, the result is computed by first\n * projecting the `vector` to the `plane`, then translating that projection along the `direction` (if scale > 0)\n * or in opposite direction (if scale < 0).\n * ```\n * equation\n * \\text{The matrix is } I + (s-1) D D^T\n * \\\\ \\text{with }D\\text{ being the normalized direction vector and }s\\text{ being the scale.}\n * ```\n * * Visualization can be found at itwinjs.org/sandbox/SaeedTorabi/DirectionalScale\n */\n public static createDirectionalScale(direction: Vector3d, scale: number, result?: Matrix3d): Matrix3d {\n const unit = direction.normalize();\n if (unit) {\n const x = unit.x;\n const y = unit.y;\n const z = unit.z;\n const a = scale - 1;\n return Matrix3d.createRowValues(\n 1 + a * x * x, a * x * y, a * x * z,\n a * y * x, 1 + a * y * y, a * y * z,\n a * z * x, a * z * y, 1 + a * z * z,\n result,\n );\n }\n return Matrix3d.createUniformScale(scale);\n }\n /**\n * Create a matrix which sweeps a vector along `sweepVector` until it hits the plane through the origin with the\n * given normal.\n * * Geometrically, the returned matrix `M` acts on a vector `u` by rotating and scaling it to lie in the plane.\n * Specifically, `Mu = u + sw` is perpendicular to `n` for some scalar `s`, where `w` is the sweep direction, and\n * `n` is the plane normal.\n * * Symbolically, `M = I - w⊗n / w.n`, where `I` is the identity, and ⊗ is the vector outer product.\n * @param sweepVector sweep direction. If same as `planeNormal`, the resulting matrix is a projection onto the plane.\n * @param planeNormal normal to the target plane\n */\n public static createFlattenAlongVectorToPlane(sweepVector: Vector3d, planeNormal: Vector3d): Matrix3d | undefined {\n // To sweep an arbitrary vector U0 along direction W to the vector U1 in the plane through the origin with normal N:\n // `U1 = U0 + W * alpha`\n // `U1 DOT N = (U0 + W * alpha) DOT N = 0`\n // `U0 DOT N = - alpha * W DOT N`\n // `alpha = - U0 DOT N / W DOT N`\n // Insert the alpha definition in U1:\n // `U1 = U0 - W * N DOT U0 / W DOT N`\n // Write W * N DOT U0 in terms of a vector outer product (^T indicates transpose):\n // `U1 = U0 - W * N^T * U0 / W DOT N`\n // Note W * N^T is a 3x3 matrix. By associativity of matrix multiplication:\n // `U1 = (I - W * N^T / W DOT N) * U0`\n // and the matrix to do the sweep for any vector in place of U0 is `I - W * N^T / W DOT N`.\n const result = Matrix3d.createIdentity();\n const dot = sweepVector.dotProduct(planeNormal);\n const inverse = Geometry.conditionalDivideCoordinate(1.0, -dot);\n if (inverse !== undefined) {\n result.addScaledOuterProductInPlace(sweepVector, planeNormal, inverse);\n return result;\n }\n return undefined;\n }\n /**\n * Multiply `matrix * point`, treating the point as a column vector on the right.\n * ```\n * equation\n * \\matrixXY{A}\\columnSubXYZ{U}\n * ```\n * @return the point result\n */\n public multiplyPoint(point: Point3d, result?: Point3d): Point3d {\n const x = point.x;\n const y = point.y;\n const z = point.z;\n return Point3d.create(\n this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z,\n this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z,\n this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z,\n result,\n );\n }\n /**\n * Multiply `matrix * vector`, treating the vector is a column vector on the right.\n * ```\n * equation\n * \\matrixXY{A}\\columnSubXYZ{U}\n * ```\n * @return the vector result\n */\n public multiplyVector(vectorU: XYAndZ, result?: Vector3d): Vector3d {\n const x = vectorU.x;\n const y = vectorU.y;\n const z = vectorU.z;\n return Vector3d.create(\n this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z,\n this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z,\n this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z,\n result,\n );\n }\n /**\n * Multiply `matrix * vector` in place for vector in the array, i.e. treating the vector is a column\n * vector on the right.\n * * Each `vector` is updated to be `matrix * vector`\n */\n public multiplyVectorArrayInPlace(data: XYZ[]): void {\n for (const v of data) v.set(\n this.coffs[0] * v.x + this.coffs[1] * v.y + this.coffs[2] * v.z,\n this.coffs[3] * v.x + this.coffs[4] * v.y + this.coffs[5] * v.z,\n this.coffs[6] * v.x + this.coffs[7] * v.y + this.coffs[8] * v.z,\n );\n }\n /** Compute `origin - matrix * vector` */\n public static xyzMinusMatrixTimesXYZ(origin: XYAndZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n return Point3d.create(\n origin.x - (matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z),\n origin.y - (matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z),\n origin.z - (matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z),\n result,\n );\n }\n /** Compute `origin + matrix * vector` using only the xy parts of the inputs. */\n public static xyPlusMatrixTimesXY(origin: XAndY, matrix: Matrix3d, vector: XAndY, result?: Point2d): Point2d {\n const x = vector.x;\n const y = vector.y;\n return Point2d.create(\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y,\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y,\n result,\n );\n }\n /** Compute `origin + matrix * vector` using all xyz parts of the inputs. */\n public static xyzPlusMatrixTimesXYZ(origin: XYZ, matrix: Matrix3d, vector: XYAndZ, result?: Point3d): Point3d {\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n return Point3d.create(\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\n result,\n );\n }\n /** Updates vector to be `origin + matrix * vector` using all xyz parts of the inputs. */\n public static xyzPlusMatrixTimesXYZInPlace(origin: XYZ, matrix: Matrix3d, vector: WritableXYAndZ): void {\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n vector.x = origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z;\n vector.y = origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z;\n vector.z = origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z;\n }\n /** Compute `origin + matrix * vector` where the final vector is given as direct x,y,z coordinates */\n public static xyzPlusMatrixTimesCoordinates(\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Point3d,\n ): Point3d {\n return Point3d.create(\n origin.x + matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z,\n origin.y + matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z,\n origin.z + matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z,\n result,\n );\n }\n /**\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\n * Multiply the 4x4 matrix by `[x,y,z,w]`\n * ```\n * equation\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}\n * ```\n * @param origin translation part (xyz in column 3)\n * @param matrix matrix part (leading 3x3)\n * @param x x part of multiplied point\n * @param y y part of multiplied point\n * @param z z part of multiplied point\n * @param w w part of multiplied point\n * @param result optional preallocated result.\n */\n public static xyzPlusMatrixTimesWeightedCoordinates(\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Point4d,\n ): Point4d {\n return Point4d.create(\n matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x * w,\n matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y * w,\n matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z * w,\n w,\n result,\n );\n }\n /**\n * Treat the 3x3 matrix and origin as upper 3x4 part of a 4x4 matrix, with 0001 as the final row.\n * Multiply the 4x4 matrix by `[x,y,z,w]`\n * ```\n * equation\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}\n * ```\n * @param origin translation part (xyz in column 3)\n * @param matrix matrix part (leading 3x3)\n * @param x x part of multiplied point\n * @param y y part of multiplied point\n * @param z z part of multiplied point\n * @param w w part of multiplied point\n * @param result optional preallocated result. If length < 4, a new array is returned.\n */\n public static xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Float64Array,\n ): Float64Array {\n if (!result || result.length < 4)\n result = new Float64Array(4);\n result[0] = matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x * w;\n result[1] = matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y * w;\n result[2] = matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z * w;\n result[3] = w;\n return result;\n }\n /**\n * Treat the 3x3 matrix and origin as a 3x4 matrix.\n * * Multiply the 3x4 matrix by `[x,y,z,1]`\n * ```\n * equation\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}\n * ```\n * @param origin translation part (xyz in column 3)\n * @param matrix matrix part (leading 3x3)\n * @param x x part of multiplied point\n * @param y y part of multiplied point\n * @param z z part of multiplied point\n * @param result optional preallocated result. If length < 3, a new array is returned.\n */\n public static xyzPlusMatrixTimesCoordinatesToFloat64Array(\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Float64Array,\n ): Float64Array {\n if (!result || result.length < 3)\n result = new Float64Array(3);\n result[0] = matrix.coffs[0] * x + matrix.coffs[1] * y + matrix.coffs[2] * z + origin.x;\n result[1] = matrix.coffs[3] * x + matrix.coffs[4] * y + matrix.coffs[5] * z + origin.y;\n result[2] = matrix.coffs[6] * x + matrix.coffs[7] * y + matrix.coffs[8] * z + origin.z;\n return result;\n }\n /**\n * Multiply the transpose matrix times a vector.\n * * This produces the same x,y,z as treating the vector as a row on the left of the (un-transposed) matrix.\n * ```\n * equation\n * \\begin{matrix}\n * \\text{Treating U as a column to the right of transposed matrix\\: return column}&\\columnSubXYZ{V}&=&\\matrixTransposeSubXY{A}\\columnSubXYZ{U} \\\\\n * \\text{Treating U as a row to the left of untransposed matrix\\: return row}&\\rowSubXYZ{V}&=&\\rowSubXYZ{U}\\matrixXY{A}\n * \\end{matrix}\n * ```\n * @param result the vector result (optional)\n */\n public multiplyTransposeVector(vector: Vector3d, result?: Vector3d): Vector3d {\n result = result ? result : new Vector3d();\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n result.x = this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z;\n result.y = this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z;\n result.z = this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z;\n return result;\n }\n /**\n * Multiply the matrix * [x,y,z], i.e. the vector [x,y,z] is a column vector on the right.\n * @param result the vector result (optional)\n */\n public multiplyXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\n result = result ? result : new Vector3d();\n result.x = this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z;\n result.y = this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z;\n result.z = this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z;\n return result;\n }\n /**\n * Multiply the matrix * xyz, place result in (required) return value.\n * @param xyz right side\n * @param result the result.\n */\n public multiplyXYZtoXYZ(xyz: XYZ, result: XYZ): XYZ {\n const x = xyz.x;\n const y = xyz.y;\n const z = xyz.z;\n result.x = this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z;\n result.y = this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z;\n result.z = this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z;\n return result;\n }\n /**\n * Multiply the matrix * [x,y,0], i.e. the vector [x,y,0] is a column vector on the right.\n * @param result the vector result (optional)\n */\n public multiplyXY(x: number, y: number, result?: Vector3d): Vector3d {\n result = result ? result : new Vector3d();\n result.x = this.coffs[0] * x + this.coffs[1] * y;\n result.y = this.coffs[3] * x + this.coffs[4] * y;\n result.z = this.coffs[6] * x + this.coffs[7] * y;\n return result;\n }\n /**\n * Compute origin + the matrix * [x,y,0].\n * @param result the Point3d result (optional)\n */\n public originPlusMatrixTimesXY(origin: XYZ, x: number, y: number, result?: Point3d): Point3d {\n return Point3d.create(\n origin.x + this.coffs[0] * x + this.coffs[1] * y,\n origin.y + this.coffs[3] * x + this.coffs[4] * y,\n origin.z + this.coffs[6] * x + this.coffs[7] * y,\n result,\n );\n }\n /**\n * Multiply the matrix * (x,y,z) in place, i.e. the vector (x,y,z) is a column vector on the right and\n * the multiplication updates the vector values.\n * @param xyzData the vector data.\n */\n public multiplyVectorInPlace(xyzData: XYZ): void {\n const x = xyzData.x;\n const y = xyzData.y;\n const z = xyzData.z;\n xyzData.x = this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z;\n xyzData.y = this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z;\n xyzData.z = this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z;\n }\n /**\n * Multiply the transpose matrix times [x,y,z] in place, i.e. the vector [x,y,z] is a column vector on\n * the right and the multiplication updates the vector values.\n * * This is equivalent to `multiplyTransposeVector` but always returns the result directly in the input.\n * @param vectorU the vector data\n */\n public multiplyTransposeVectorInPlace(vectorU: XYZ): void {\n const x = vectorU.x;\n const y = vectorU.y;\n const z = vectorU.z;\n vectorU.x = this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z;\n vectorU.y = this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z;\n vectorU.z = this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z;\n }\n /**\n * Multiply the transpose matrix times column using individual numeric inputs.\n * * This produces the same x,y,z as treating the vector as a row on the left of the (un-transposed) matrix.\n * ```\n * equation\n * \\begin{matrix}\n * \\text{treating the input as a column vector } \\columnXYZ{x}{y}{z}\\text{ compute }&\\columnSubXYZ{V} &= &A^T \\columnXYZ{x}{y}{z} \\\\\n * \\text{or as a row vector } \\rowXYZ{x}{y}{z} \\text{ compute }&\\rowSubXYZ{V} &= &\\rowXYZ{x}{y}{z} A \\\\\n * \\phantom{8888}\\text{and return V as a Vector3d} & & &\n * \\end{matrix}\n * ````\n * @param result the vector result (optional)\n */\n public multiplyTransposeXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\n result = result ? result : new Vector3d();\n result.x = this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z;\n result.y = this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z;\n result.z = this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z;\n return result;\n }\n /**\n * Solve `matrix * result = vector` for an unknown `result`.\n * * This is equivalent to multiplication `result = matrixInverse * vector`.\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\n */\n public multiplyInverse(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\n this.computeCachedInverse(true);\n if (this.inverseCoffs) {\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n return Vector3d.create(\n this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z,\n this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z,\n this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z,\n result,\n );\n }\n return undefined;\n }\n /**\n * Solve `matrixTranspose * result = vector` for an unknown `result`.\n * * This is equivalent to multiplication `result = matrixInverseTranspose * vector`.\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\n */\n public multiplyInverseTranspose(vector: Vector3d, result?: Vector3d): Vector3d | undefined {\n this.computeCachedInverse(true);\n if (this.inverseCoffs) {\n const x = vector.x;\n const y = vector.y;\n const z = vector.z;\n return Vector3d.create(\n this.inverseCoffs[0] * x + this.inverseCoffs[3] * y + this.inverseCoffs[6] * z,\n this.inverseCoffs[1] * x + this.inverseCoffs[4] * y + this.inverseCoffs[7] * z,\n this.inverseCoffs[2] * x + this.inverseCoffs[5] * y + this.inverseCoffs[8] * z,\n result,\n );\n }\n return undefined;\n }\n /**\n * Multiply `matrixInverse * [x,y,z]`.\n * * This is equivalent to solving `matrix * result = [x,y,z]` for an unknown `result`.\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\n * @return result as a Vector3d or undefined (if the matrix is singular).\n */\n public multiplyInverseXYZAsVector3d(x: number, y: number, z: number, result?: Vector3d): Vector3d | undefined {\n this.computeCachedInverse(true);\n if (this.inverseCoffs) {\n return Vector3d.create(\n this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z,\n this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z,\n this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z,\n result,\n );\n }\n return undefined;\n }\n /**\n * Multiply `matrixInverse * [x,y,z]` and return result as a `Point4d` with the given weight as the last coordinate.\n * * Equivalent to solving `matrix * result = [x,y,z]` for an unknown `result`.\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\n * @return result as a Point4d with the same weight.\n */\n public multiplyInverseXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d | undefined {\n this.computeCachedInverse(true);\n if (this.inverseCoffs) {\n return Point4d.create(\n this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z,\n this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z,\n this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z,\n w,\n result,\n );\n }\n return undefined;\n }\n /**\n * Multiply `matrixInverse * [x,y,z]` and return result as `Point3d`.\n * * Equivalent to solving `matrix * result = [x,y,z]` for an unknown `result`.\n * @return result as a Point3d or `undefined` (if the matrix is singular).\n */\n public multiplyInverseXYZAsPoint3d(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\n this.computeCachedInverse(true);\n if (this.inverseCoffs) {\n return Point3d.create(\n this.inverseCoffs[0] * x + this.inverseCoffs[1] * y + this.inverseCoffs[2] * z,\n this.inverseCoffs[3] * x + this.inverseCoffs[4] * y + this.inverseCoffs[5] * z,\n this.inverseCoffs[6] * x + this.inverseCoffs[7] * y + this.inverseCoffs[8] * z,\n result,\n );\n }\n return undefined;\n }\n /**\n * Invoke a given matrix*matrix operation to compute the inverse matrix and set this.inverseCoffs\n * * If either input coffA or coffB is `undefined`, set state to `InverseMatrixState.unknown` but\n * leave the inverseCoffs untouched.\n * @param f the given matrix*matrix operation that is called by this function to compute the inverse.\n * `f` must be a matrix*matrix operation. Otherwise, the function does not generate the inverse properly.\n */\n private finishInverseCoffs(\n f: (factorA: Float64Array, factorB: Float64Array, result: Float64Array) => void, coffA?: Float64Array,\n coffB?: Float64Array,\n ): void {\n if (coffA && coffB) {\n this.createInverseCoffsWithZeros();\n this.inverseState = InverseMatrixState.inverseStored;\n f(coffA, coffB, this.inverseCoffs!); // call function f (which is provided by user) to compute the inverse.\n } else {\n this.inverseState = InverseMatrixState.unknown;\n }\n }\n // Notes on inverse of matrix products:\n // 1) M = A * B ===> MInverse = BInverse * AInverse\n // 2) M = A * BInverse ===> MInverse = B * AInverse\n // 3) M = AInverse * B ===> MInverse = BInverse * A\n // 4) M = A * BTranspose ===> MInverse = BInverseTranspose * AInverse\n // 5) M = ATranspose * B ===> MInverse = BInverse * AInverseTranspose\n /**\n * Multiply `this` matrix times `other` matrix\n * @return the matrix result: this*other\n */\n public multiplyMatrixMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\n result = result ? result : new Matrix3d();\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.coffs, result.coffs);\n if (this.inverseState === InverseMatrixState.inverseStored\n && other.inverseState === InverseMatrixState.inverseStored)\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), other.inverseCoffs, this.inverseCoffs);\n else if (this.inverseState === InverseMatrixState.singular\n || other.inverseState === InverseMatrixState.singular)\n result.inverseState = InverseMatrixState.singular;\n else\n result.inverseState = InverseMatrixState.unknown;\n return result;\n }\n /**\n * Multiply `this` matrix times `inverse of other` matrix\n * @return the matrix result: this*otherInverse\n */\n public multiplyMatrixMatrixInverse(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\n if (!other.computeCachedInverse(true))\n return undefined;\n result = result ? result : new Matrix3d();\n PackedMatrix3dOps.multiplyMatrixMatrix(this.coffs, other.inverseCoffs!, Matrix3d._productBuffer);\n if (this.inverseState === InverseMatrixState.inverseStored)\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), other.coffs, this.inverseCoffs);\n else\n result.inverseState = InverseMatrixState.unknown;\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\n return result;\n }\n /**\n * Multiply `inverse of this` matrix times `other` matrix\n * @return the matrix result: thisInverse*other\n */\n public multiplyMatrixInverseMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d | undefined {\n if (!this.computeCachedInverse(true))\n return undefined;\n result = result ? result : new Matrix3d();\n PackedMatrix3dOps.multiplyMatrixMatrix(this.inverseCoffs!, other.coffs, Matrix3d._productBuffer);\n if (other.inverseState === InverseMatrixState.inverseStored)\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), other.inverseCoffs, this.coffs);\n else\n result.inverseState = InverseMatrixState.unknown;\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, result.coffs);\n return result;\n }\n /**\n * Multiply `this` matrix times the transpose of `other` matrix\n * ```\n * equation\n * \\text{for instance matrix }A\\text{ and matrix }B\\text{ return matrix }C{\\text where }\\\\\\matrixXY{C}=\\matrixXY{A}\\matrixTransposeSubXY{B}\n * ```\n * @return the matrix result: this*otherTranspose\n */\n public multiplyMatrixMatrixTranspose(other: Matrix3d, result?: Matrix3d): Matrix3d {\n result = result ? result : new Matrix3d();\n PackedMatrix3dOps.multiplyMatrixMatrixTranspose(this.coffs, other.coffs, result.coffs);\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixTransposeMatrix(a, b, _result), other.inverseCoffs, this.inverseCoffs);\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\n result.inverseState = InverseMatrixState.singular;\n else\n result.inverseState = InverseMatrixState.unknown;\n return result;\n }\n /**\n * Multiply the transpose of `this` matrix times `other` matrix\n * ```\n * equation\n * \\matrixXY{result}=\\matrixXY{\\text{this}}\\matrixTransposeSubXY{\\text{other}}\n * ```\n * @return the matrix result: thisTranspose*other\n */\n public multiplyMatrixTransposeMatrix(other: Matrix3d, result?: Matrix3d): Matrix3d {\n result = result ? result : new Matrix3d();\n PackedMatrix3dOps.multiplyMatrixTransposeMatrix(this.coffs, other.coffs, result.coffs);\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrixTranspose(a, b, _result), other.inverseCoffs, this.inverseCoffs);\n else if (this.inverseState === InverseMatrixState.singular || other.inverseState === InverseMatrixState.singular)\n result.inverseState = InverseMatrixState.singular;\n else\n result.inverseState = InverseMatrixState.unknown;\n return result;\n }\n /**\n * Multiply `this` Matrix3d (considered to be a Transform with 0 `origin`) times `other` Transform.\n * * **Note:** If `this = [A 0]` and `other = [B b]`, then `this * other` is defined as [A*B Ab] because:\n * ```\n * equation\n * \\begin{matrix}\n * \\text{this matrix }\\bold{A}\\text{ promoted to block Transform} & \\blockTransform{A}{0} \\\\\n * \\text{other Transform with `matrix` part }\\bold{B}\\text{ and origin part }\\bold{b} & \\blockTransform{B}{b}\\\\\n * \\text{product}& \\blockTransform{A}{0}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab}\n * \\end{matrix}\n * ```\n * @param other the `other` Transform to be multiplied to `this` matrix.\n * @param result optional preallocated `result` to reuse.\n */\n public multiplyMatrixTransform(other: Transform, result?: Transform): Transform {\n if (!result)\n return Transform.createRefs(\n this.multiplyXYZ(other.origin.x, other.origin.y, other.origin.z),\n this.multiplyMatrixMatrix(other.matrix),\n );\n this.multiplyXYZtoXYZ(other.origin, result.origin);\n this.multiplyMatrixMatrix(other.matrix, result.matrix);\n return result;\n }\n /**\n * Return the transpose of `this` matrix.\n * * If `result` is passed as argument, then the function copies the transpose of `this` into `result`.\n * * `this` is not changed unless also passed as the result, i.e., `this.transpose(this)` transposes `this` in place.\n */\n public transpose(result?: Matrix3d): Matrix3d {\n if (!result)\n result = new Matrix3d();\n PackedMatrix3dOps.copyTransposed(this.coffs, result.coffs);\n if (this.inverseCoffs !== undefined) {\n result.inverseState = InverseMatrixState.inverseStored;\n result.inverseCoffs = PackedMatrix3dOps.copyTransposed(this.inverseCoffs, result.inverseCoffs);\n } else {\n result.inverseState = this.inverseState; // singular or unknown.\n result.inverseCoffs = undefined;\n }\n return result;\n }\n /**\n * Transpose this matrix in place.\n */\n public transposeInPlace() {\n PackedMatrix3dOps.transposeInPlace(this.coffs);\n if (this.inverseCoffs)\n PackedMatrix3dOps.transposeInPlace(this.inverseCoffs); // inverse of transpose is equal to transpose of inverse\n }\n /**\n * Return the inverse matrix.\n * The return is undefined if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\n * * If `result == this`, then content of inverse of `this` matrix is copied into `this`. Otherwise, inverse\n * of `this` is stored in `result`.\n * * **Note:** Each Matrix3d object caches its own inverse (`this.inverseCoffs`) and has methods to multiply\n * the inverse times matrices and vectors (e.g., `multiplyMatrixInverseMatrix`, `multiplyMatrixMatrixInverse`,\n * `multiplyInverse`). Hence explicitly constructing this new inverse object is rarely necessary.\n */\n public inverse(result?: Matrix3d): Matrix3d | undefined {\n if (!this.computeCachedInverse(true))\n return undefined;\n if (result === this) {\n // swap the contents of this.coffs and this.inverseCoffs\n PackedMatrix3dOps.copy(this.coffs, Matrix3d._productBuffer);\n PackedMatrix3dOps.copy(this.inverseCoffs!, this.coffs);\n PackedMatrix3dOps.copy(Matrix3d._productBuffer, this.inverseCoffs!);\n return result;\n }\n if (result === undefined) {\n result = Matrix3d.createIdentity();\n }\n result.createInverseCoffsWithZeros();\n PackedMatrix3dOps.copy(this.coffs, result.inverseCoffs!);\n PackedMatrix3dOps.copy(this.inverseCoffs!, result.coffs);\n result.inverseState = this.inverseState;\n return result;\n }\n /**\n * Take the dot product of a row (specified by `rowStartA`) of `coffA` and `columnStartB` of `coffB`.\n * * **Note:** We don't validate row/column numbers. Pass 0/3/6 for row 0/1/2 and pass 0/1/2 for column 0/1/2.\n */\n private static rowColumnDot(\n coffA: Float64Array, rowStartA: number, coffB: Float64Array, columnStartB: number,\n ): number {\n return coffA[rowStartA] * coffB[columnStartB] +\n coffA[rowStartA + 1] * coffB[columnStartB + 3] +\n coffA[rowStartA + 2] * coffB[columnStartB + 6];\n }\n /**\n * Take the cross product of 2 rows (specified by `rowStart0` and `rowStart1`) of `source` and store the result\n * in `columnStart` of `dest`.\n * * **Note:** We don't validate row/column numbers. Pass 0/3/6 for row 0/1/2 and pass 0/1/2 for column 0/1/2.\n */\n private static indexedRowCrossProduct(\n source: Float64Array, rowStart0: number, rowStart1: number, dest: Float64Array, columnStart: number,\n ): void {\n dest[columnStart] = source[rowStart0 + 1] * source[rowStart1 + 2] - source[rowStart0 + 2] * source[rowStart1 + 1];\n dest[columnStart + 3] = source[rowStart0 + 2] * source[rowStart1] - source[rowStart0] * source[rowStart1 + 2];\n dest[columnStart + 6] = source[rowStart0] * source[rowStart1 + 1] - source[rowStart0 + 1] * source[rowStart1];\n }\n /**\n * Take the cross product of 2 columns (i.e., `colStart0` and `colStart1`) of `this` matrix and store the\n * result in `colStart2` of the same matrix.\n * * **Note:** We don't validate column numbers. Pass 0/1/2 for column 0/1/2.\n */\n private indexedColumnCrossProductInPlace(colStart0: number, colStart1: number, colStart2: number): void {\n const coffs = this.coffs;\n coffs[colStart2] = coffs[colStart0 + 3] * coffs[colStart1 + 6] - coffs[colStart0 + 6] * coffs[colStart1 + 3];\n coffs[colStart2 + 3] = coffs[colStart0 + 6] * coffs[colStart1] - coffs[colStart0] * coffs[colStart1 + 6];\n coffs[colStart2 + 6] = coffs[colStart0] * coffs[colStart1 + 3] - coffs[colStart0 + 3] * coffs[colStart1];\n }\n /**\n * Form cross products among columns in axisOrder.\n * For axis order ABC:\n * * form cross product of column A and B, store in C.\n * * form cross product of column C and A, store in B.\n * * [A B C] ===> [A B AxB] ===> [A (AxB)xA AxB]\n *\n * This means that in the final matrix:\n * * first column is same as original column A.\n * * second column is linear combination of original A and B (i.e., is in the plane of original A and B).\n * * third column is perpendicular to first and second columns of both the original and final.\n * * original column C is overwritten and does not participate in the result.\n *\n * The final matrix will have 3 orthogonal columns.\n */\n public axisOrderCrossProductsInPlace(axisOrder: AxisOrder): void {\n switch (axisOrder) {\n case AxisOrder.XYZ: {\n this.indexedColumnCrossProductInPlace(0, 1, 2);\n this.indexedColumnCrossProductInPlace(2, 0, 1);\n break;\n }\n case AxisOrder.YZX: {\n this.indexedColumnCrossProductInPlace(1, 2, 0);\n this.indexedColumnCrossProductInPlace(0, 1, 2);\n break;\n }\n case AxisOrder.ZXY: {\n this.indexedColumnCrossProductInPlace(2, 0, 1);\n this.indexedColumnCrossProductInPlace(1, 2, 0);\n break;\n }\n case AxisOrder.XZY: {\n this.indexedColumnCrossProductInPlace(0, 2, 1);\n this.indexedColumnCrossProductInPlace(1, 0, 2);\n break;\n }\n case AxisOrder.YXZ: {\n this.indexedColumnCrossProductInPlace(1, 0, 2);\n this.indexedColumnCrossProductInPlace(2, 1, 0);\n break;\n }\n case AxisOrder.ZYX: {\n this.indexedColumnCrossProductInPlace(2, 1, 0);\n this.indexedColumnCrossProductInPlace(0, 2, 1);\n break;\n }\n }\n }\n /**\n * Normalize each column in place.\n * @param originalColumnMagnitudes optional vector to store original column magnitudes.\n * @returns return true if all columns have non-zero lengths. Otherwise, return false.\n * * If false is returned, the magnitudes are stored in the `originalColumnMagnitudes` vector but no columns\n * are altered.\n */\n public normalizeColumnsInPlace(originalColumnMagnitudes?: Vector3d): boolean {\n const ax = this.columnXMagnitude();\n const ay = this.columnYMagnitude();\n const az = this.columnZMagnitude();\n if (originalColumnMagnitudes)\n originalColumnMagnitudes.set(ax, ay, az);\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\n return false;\n this.scaleColumns(1.0 / ax, 1.0 / ay, 1.0 / az, this);\n return true;\n }\n /**\n * Normalize each row in place.\n * @param originalRowMagnitudes optional vector to store original row magnitudes.\n * @returns return true if all rows have non-zero lengths. Otherwise, return false.\n * * If false is returned, the magnitudes are stored in the `originalRowMagnitudes` vector but no rows\n * are altered.\n */\n public normalizeRowsInPlace(originalRowMagnitudes?: Vector3d): boolean {\n const ax = this.rowXMagnitude();\n const ay = this.rowYMagnitude();\n const az = this.rowZMagnitude();\n if (originalRowMagnitudes)\n originalRowMagnitudes.set(ax, ay, az);\n if (Geometry.isSmallMetricDistance(ax) || Geometry.isSmallMetricDistance(ay) || Geometry.isSmallMetricDistance(az))\n return false;\n this.scaleRows(1.0 / ax, 1.0 / ay, 1.0 / az, this);\n return true;\n }\n /**\n * Returns true if the matrix is singular.\n */\n public isSingular(): boolean {\n return !this.computeCachedInverse(true);\n }\n /**\n * Mark this matrix as singular.\n */\n public markSingular(): void {\n this.inverseState = InverseMatrixState.singular;\n }\n /**\n * Compute the inverse of `this` Matrix3d. The inverse is stored in `this.inverseCoffs` for later use.\n * @param useCacheIfAvailable if `true`, use the previously computed inverse if available. If `false`,\n * recompute the inverse.\n * @returns return `true` if the inverse is computed. Return `false` if matrix is singular.\n */\n public computeCachedInverse(useCacheIfAvailable: boolean): boolean {\n if (useCacheIfAvailable && Matrix3d.useCachedInverse && this.inverseState !== InverseMatrixState.unknown) {\n Matrix3d.numUseCache++;\n return this.inverseState === InverseMatrixState.inverseStored;\n }\n this.inverseState = InverseMatrixState.unknown;\n this.createInverseCoffsWithZeros();\n const coffs = this.coffs;\n const inverseCoffs = this.inverseCoffs!;\n /**\n * We calculate the inverse using cross products.\n * Math details can be found at docs/learning/matrix/Matrix.md\n * [ A ]\n * In summary, if M = [ B ] then inverse of M = (1/det)[BxC CxA AxB] where\n * [ C ]\n * det is the determinant of matrix M (which is equal to \"A dot BxC\").\n */\n Matrix3d.indexedRowCrossProduct(coffs, 3, 6, inverseCoffs, 0); // BxC\n Matrix3d.indexedRowCrossProduct(coffs, 6, 0, inverseCoffs, 1); // CxA\n Matrix3d.indexedRowCrossProduct(coffs, 0, 3, inverseCoffs, 2); // AxB\n Matrix3d.numComputeCache++;\n const det = Matrix3d.rowColumnDot(coffs, 0, inverseCoffs, 0); // A dot BxC\n if (det === 0.0) {\n this.inverseState = InverseMatrixState.singular;\n this.inverseCoffs = undefined;\n return false;\n }\n const f = 1.0 / det;\n for (let i = 0; i < 9; i++)\n inverseCoffs[i] *= f;\n this.inverseState = InverseMatrixState.inverseStored;\n return true;\n }\n /**\n * Convert a (row,column) index pair to the single index within flattened array of 9 numbers in row-major-order\n * * **Note:** Out of range row/column is interpreted cyclically.\n */\n public static flatIndexOf(row: number, column: number): number {\n return 3 * Geometry.cyclic3dAxis(row) + Geometry.cyclic3dAxis(column);\n }\n /**\n * Get elements of column `index` packaged as a Point4d with given `weight`.\n * * **Note:** Out of range index is interpreted cyclically.\n */\n public indexedColumnWithWeight(index: number, weight: number, result?: Point4d): Point4d {\n index = Geometry.cyclic3dAxis(index);\n return Point4d.create(this.coffs[index], this.coffs[index + 3], this.coffs[index + 6], weight, result);\n }\n /** Return the entry at specific row and column */\n public at(row: number, column: number): number {\n return this.coffs[Matrix3d.flatIndexOf(row, column)];\n }\n /** Set the entry at specific row and column */\n public setAt(row: number, column: number, value: number): void {\n this.coffs[Matrix3d.flatIndexOf(row, column)] = value;\n this.inverseState = InverseMatrixState.unknown;\n }\n /**\n * Create a Matrix3d whose values are uniformly scaled from `this` Matrix3d.\n * @param scale scale factor to apply.\n * @param result optional result.\n * @returns return the scaled matrix.\n */\n public scale(scale: number, result?: Matrix3d): Matrix3d {\n return Matrix3d.createRowValues(\n this.coffs[0] * scale, this.coffs[1] * scale, this.coffs[2] * scale,\n this.coffs[3] * scale, this.coffs[4] * scale, this.coffs[5] * scale,\n this.coffs[6] * scale, this.coffs[7] * scale, this.coffs[8] * scale,\n result,\n );\n }\n /**\n * Create a Matrix3d whose columns are scaled copies of `this` Matrix3d.\n * @param scaleX scale factor for column 0\n * @param scaleY scale factor for column 1\n * @param scaleZ scale factor for column 2\n * @param result optional result\n */\n public scaleColumns(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\n return Matrix3d.createRowValues(\n this.coffs[0] * scaleX, this.coffs[1] * scaleY, this.coffs[2] * scaleZ,\n this.coffs[3] * scaleX, this.coffs[4] * scaleY, this.coffs[5] * scaleZ,\n this.coffs[6] * scaleX, this.coffs[7] * scaleY, this.coffs[8] * scaleZ,\n result,\n );\n }\n /**\n * Scale the columns of `this` Matrix3d in place.\n * @param scaleX scale factor for column 0\n * @param scaleY scale factor for column 1\n * @param scaleZ scale factor for column 2\n */\n public scaleColumnsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\n this.coffs[0] *= scaleX; this.coffs[1] *= scaleY; this.coffs[2] *= scaleZ;\n this.coffs[3] *= scaleX; this.coffs[4] *= scaleY; this.coffs[5] *= scaleZ;\n this.coffs[6] *= scaleX; this.coffs[7] *= scaleY; this.coffs[8] *= scaleZ;\n if (this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined) {\n // apply reciprocal scales to the ROWS of the inverse\n const divX = Geometry.conditionalDivideFraction(1.0, scaleX);\n const divY = Geometry.conditionalDivideFraction(1.0, scaleY);\n const divZ = Geometry.conditionalDivideFraction(1.0, scaleZ);\n if (divX !== undefined && divY !== undefined && divZ !== undefined) {\n this.inverseCoffs[0] *= divX; this.inverseCoffs[1] *= divX; this.inverseCoffs[2] *= divX;\n this.inverseCoffs[3] *= divY; this.inverseCoffs[4] *= divY; this.inverseCoffs[5] *= divY;\n this.inverseCoffs[6] *= divZ; this.inverseCoffs[7] *= divZ; this.inverseCoffs[8] *= divZ;\n } else\n this.inverseState = InverseMatrixState.singular;\n }\n }\n /**\n * Create a Matrix3d whose rows are scaled copies of `this` Matrix3d.\n * @param scaleX scale factor for row 0\n * @param scaleY scale factor for row 1\n * @param scaleZ scale factor for row 2\n * @param result optional result\n */\n public scaleRows(scaleX: number, scaleY: number, scaleZ: number, result?: Matrix3d): Matrix3d {\n return Matrix3d.createRowValues(\n this.coffs[0] * scaleX, this.coffs[1] * scaleX, this.coffs[2] * scaleX,\n this.coffs[3] * scaleY, this.coffs[4] * scaleY, this.coffs[5] * scaleY,\n this.coffs[6] * scaleZ, this.coffs[7] * scaleZ, this.coffs[8] * scaleZ,\n result,\n );\n }\n /**\n * Scale the rows of `this` Matrix3d in place.\n * @param scaleX scale factor for row 0\n * @param scaleY scale factor for row 1\n * @param scaleZ scale factor for row 2\n */\n public scaleRowsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\n this.coffs[0] *= scaleX; this.coffs[1] *= scaleX; this.coffs[2] *= scaleX;\n this.coffs[3] *= scaleY; this.coffs[4] *= scaleY; this.coffs[5] *= scaleY;\n this.coffs[6] *= scaleZ; this.coffs[7] *= scaleZ; this.coffs[8] *= scaleZ;\n if (this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined) {\n // apply reciprocal scales to the COLUMNs of the inverse\n const divX = Geometry.conditionalDivideFraction(1.0, scaleX);\n const divY = Geometry.conditionalDivideFraction(1.0, scaleY);\n const divZ = Geometry.conditionalDivideFraction(1.0, scaleZ);\n if (divX !== undefined && divY !== undefined && divZ !== undefined) {\n this.inverseCoffs[0] *= divX; this.inverseCoffs[1] *= divY; this.inverseCoffs[2] *= divZ;\n this.inverseCoffs[3] *= divX; this.inverseCoffs[4] *= divY; this.inverseCoffs[5] *= divZ;\n this.inverseCoffs[6] *= divX; this.inverseCoffs[7] *= divY; this.inverseCoffs[8] *= divZ;\n } else\n this.inverseState = InverseMatrixState.singular;\n }\n }\n /**\n * Add scaled values from `other` Matrix3d to `this` Matrix3d.\n * @param other Matrix3d with values to be added.\n * @param scale scale factor to apply to the added values.\n */\n public addScaledInPlace(other: Matrix3d, scale: number): void {\n for (let i = 0; i < 9; i++)\n this.coffs[i] += scale * other.coffs[i];\n this.inverseState = InverseMatrixState.unknown;\n }\n /**\n * Add scaled values from an outer product of vectors U and V.\n * * The scaled outer product is a matrix with `rank 1` (all columns/rows are linearly dependent).\n * * This is useful in constructing mirrors and directional scales.\n * ```\n * equation\n * A += s \\columnSubXYZ{U}\\rowSubXYZ{V}\n * \\\\ \\matrixXY{A} += s \\begin{bmatrix}\n * U_x * V_x & U_x * V_y & U_x * V_z \\\\\n * U_y * V_x & U_y * V_y & U_y * V_z \\\\\n * U_z * V_x & U_z * V_y & U_z * V_z \\end{bmatrix}\n * ```\n * @param vectorU first vector in the outer product.\n * @param vectorV second vector in the outer product.\n * @param scale scale factor to apply to the added values.\n */\n public addScaledOuterProductInPlace(vectorU: Vector3d, vectorV: Vector3d, scale: number): void {\n this.coffs[0] += scale * vectorU.x * vectorV.x;\n this.coffs[1] += scale * vectorU.x * vectorV.y;\n this.coffs[2] += scale * vectorU.x * vectorV.z;\n\n this.coffs[3] += scale * vectorU.y * vectorV.x;\n this.coffs[4] += scale * vectorU.y * vectorV.y;\n this.coffs[5] += scale * vectorU.y * vectorV.z;\n\n this.coffs[6] += scale * vectorU.z * vectorV.x;\n this.coffs[7] += scale * vectorU.z * vectorV.y;\n this.coffs[8] += scale * vectorU.z * vectorV.z;\n this.inverseState = InverseMatrixState.unknown;\n }\n /**\n * Create a rigid matrix (columns and rows are unit length and pairwise perpendicular) for the given eye coordinate.\n * * column 2 is parallel to (x,y,z).\n * * column 0 is perpendicular to column 2 and is in the xy plane.\n * * column 1 is perpendicular to both. It is the \"up\" vector on the view plane.\n * * Multiplying the returned matrix times a local (view) vector gives the world vector.\n * * Multiplying transpose of the returned matrix times a world vector gives the local (view) vector.\n * * If you want to rotate a given plane (which contains (0,0,0)) to the xy-plane, pass coordinates of the normal\n * vector of your plane into createRigidViewAxesZTowardsEye. The transpose of the returned Matrix3d can be used\n * to rotate your plane to the xy-plane. If plane does not contain (0,0,0) then the plane is rotated to a plane\n * parallel to the xy-plane.\n * @param x eye x coordinate\n * @param y eye y coordinate\n * @param z eye z coordinate\n * @param result optional preallocated result\n */\n public static createRigidViewAxesZTowardsEye(x: number, y: number, z: number, result?: Matrix3d): Matrix3d {\n result = Matrix3d.createIdentity(result);\n const rxy = Geometry.hypotenuseXY(x, y);\n // if coordinate is (0,0,z), i.e., Top or Bottom view\n if (Geometry.isSmallMetricDistance(rxy)) {\n if (z < 0.0)\n result.scaleColumnsInPlace(1.0, -1.0, -1.0);\n } else {\n /**\n * The matrix that the \"else\" statement creates is\n * [-s -s1*c c1*c]\n * [c -s1*s c1*s]\n * [0 c1 s1 ]\n * where\n * c = x / sqrt(x*x + y*y)\n * s = y / sqrt(x*x + y*y)\n * c1 = sqrt(x*x + y*y) / sqrt(x*x + y*y + z*z)\n * s1 = z / sqrt(x*x + y*y + z*z)\n *\n * This is an orthogonal matrix meaning it rotates the standard XYZ axis to ABC axis system\n * (if matrix is [A B C]). The matrix rotates (0,0,1), i.e., the default Top view or Z axis,\n * to the eye point (x/r,y/r,z/r) where r = sqrt(x*x + y*y + z*z). The matrix also rotates\n * (1,0,0) to a point on XY plane.\n */\n const c = x / rxy;\n const s = y / rxy;\n // if coordinate is (x,y,0), e.g., Front or Back or Left or Right view (for those 4 views x or y is 0 not both)\n result.setRowValues(\n -s, 0, c,\n c, 0, s,\n 0, 1, 0);\n // if coordinate is (x,y,z) and z is not 0, i.e., other views such as Iso or RightIso\n if (z !== 0.0) {\n const r = Geometry.hypotenuseXYZ(x, y, z);\n const s1 = z / r;\n const c1 = rxy / r;\n result.applyGivensColumnOp(1, 2, c1, -s1);\n }\n }\n return result;\n }\n /** Return the determinant of `this` matrix. */\n public determinant(): number {\n return this.coffs[0] * this.coffs[4] * this.coffs[8]\n - this.coffs[0] * this.coffs[5] * this.coffs[7]\n - this.coffs[1] * this.coffs[3] * this.coffs[8]\n + this.coffs[1] * this.coffs[5] * this.coffs[6]\n + this.coffs[2] * this.coffs[3] * this.coffs[7]\n - this.coffs[2] * this.coffs[4] * this.coffs[6];\n }\n /**\n * Return an estimate of how independent the columns of `this` matrix are. Near zero is bad (i.e.,\n * columns are almost dependent and matrix is nearly singular). Near 1 is good (i.e., columns are\n * almost independent and matrix is invertible).\n */\n public conditionNumber(): number {\n const determinant = Math.abs(this.determinant());\n const columnMagnitudeSum =\n Geometry.hypotenuseXYZ(this.coffs[0], this.coffs[3], this.coffs[6])\n + Geometry.hypotenuseXYZ(this.coffs[1], this.coffs[4], this.coffs[7])\n + Geometry.hypotenuseXYZ(this.coffs[2], this.coffs[5], this.coffs[8]);\n return Geometry.safeDivideFraction(determinant, columnMagnitudeSum, 0.0);\n }\n /** Return the sum of squares of all entries */\n public sumSquares(): number {\n let sum = 0;\n for (let i = 0; i < 9; i++)\n sum += this.coffs[i] * this.coffs[i];\n return sum;\n }\n /** Return the sum of squares of diagonal entries */\n public sumDiagonalSquares(): number {\n let sum = 0;\n for (let i = 0; i < 9; i += 4)\n sum += this.coffs[i] * this.coffs[i];\n return sum;\n }\n /** Return the matrix `trace` (sum of diagonal entries) */\n public sumDiagonal(): number {\n return this.coffs[0] + this.coffs[4] + this.coffs[8];\n }\n /** Return the Maximum absolute value of any single entry */\n public maxAbs(): number {\n let max = 0;\n for (let i = 0; i < 9; i++)\n max = Math.max(max, Math.abs(this.coffs[i]));\n return max;\n }\n /** Return the maximum absolute difference between corresponding entries of `this` and `other` */\n public maxDiff(other: Matrix3d): number {\n let max = 0;\n for (let i = 0; i < 9; i++)\n max = Math.max(max, Math.abs(this.coffs[i] - other.coffs[i]));\n return max;\n }\n /** Test if the matrix is (very near to) an identity */\n public get isIdentity(): boolean {\n return this.maxDiff(Matrix3d.identity) < Geometry.smallAngleRadians;\n }\n /** Test if the off diagonal entries are all nearly zero */\n public get isDiagonal(): boolean {\n const sumAll = this.sumSquares();\n const sumDiagonal = this.sumDiagonalSquares();\n const sumOff = Math.abs(sumAll - sumDiagonal);\n return Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\n }\n /** Sum of squared differences between symmetric pairs (symmetric pairs have indices (1,3), (2,6), and (5,7).) */\n public sumSkewSquares(): number {\n return Geometry.hypotenuseSquaredXYZ(\n this.coffs[1] - this.coffs[3],\n this.coffs[2] - this.coffs[6],\n this.coffs[5] - this.coffs[7],\n );\n }\n /** Test if the matrix is (very near to) symmetric */\n public isSymmetric(): boolean {\n const offDiagonal: number = this.sumSkewSquares();\n return Math.sqrt(offDiagonal) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(this.sumSquares()));\n }\n /** Test if the stored inverse is present and marked valid */\n public get hasCachedInverse(): boolean {\n return this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined;\n }\n /** Test if the below diagonal entries (3,6,7) are all nearly zero */\n public get isUpperTriangular(): boolean {\n const sumAll = this.sumSquares();\n const sumLow = Geometry.hypotenuseSquaredXYZ(this.coffs[3], this.coffs[6], this.coffs[7]);\n return Math.sqrt(sumLow) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\n }\n /** Test if the above diagonal entries (1,2,5) are all nearly zero */\n public get isLowerTriangular(): boolean {\n const sumAll = this.sumSquares();\n const sumLow = Geometry.hypotenuseSquaredXYZ(this.coffs[1], this.coffs[2], this.coffs[5]);\n return Math.sqrt(sumLow) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\n }\n /**\n * If the matrix is diagonal with almost equal diagonal entries, return the first diagonal entry.\n * Otherwise return `undefined`.\n */\n public sameDiagonalScale(): number | undefined {\n const sumAll = this.sumSquares();\n const sumDiagonal = this.sumDiagonalSquares();\n const sumOff = Math.abs(sumAll - sumDiagonal);\n if (Math.sqrt(sumOff) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll))\n && Geometry.isSameCoordinate(this.coffs[0], this.coffs[4])\n && Geometry.isSameCoordinate(this.coffs[0], this.coffs[8])\n )\n return this.coffs[0];\n return undefined;\n }\n /**\n * Test if all rows and columns are unit length and perpendicular to each other.\n * * If so, the matrix is either a rotation (determinant is +1) or a mirror (determinant is -1).\n * * Such a matrix is called \"orthogonal\" and its inverse is its transpose.\n */\n public testPerpendicularUnitRowsAndColumns(): boolean {\n const product = this.multiplyMatrixMatrixTranspose(this);\n return product.isIdentity;\n }\n /**\n * Test if the matrix is a rigid matrix.\n * * A rigid matrix is a rotation: its columns and rows are unit length and pairwise perpendicular, and its\n * determinant is +1.\n * @param allowMirror whether to widen the test to also return true if the matrix is a mirror (determinant is -1).\n */\n public isRigid(allowMirror: boolean = false): boolean {\n return this.testPerpendicularUnitRowsAndColumns() && (allowMirror || this.determinant() > 0);\n }\n /**\n * Test if the instance is the product of a rigid matrix and a signed scale, and return both.\n * * Specifically, this is a test of whether the instance rows and columns are pairwise perpendicular and have equal\n * length. If so, the scale factor is this length, or its negative if the instance is a mirror, and dividing the\n * columns by this scale factor produces a rigid matrix (a rotation).\n * @param result optional pre-allocated object to populate and return\n * @returns the factorization `{ rigidAxes, scale }` where `rigidAxes` is the instance matrix with `scale` factor\n * removed, or undefined if the factorization failed.\n */\n public factorRigidWithSignedScale(result?: Matrix3d): { rigidAxes: Matrix3d, scale: number } | undefined {\n const product = this.multiplyMatrixMatrixTranspose(this);\n const scaleSquare = product.sameDiagonalScale();\n if (scaleSquare === undefined || scaleSquare <= 0.0)\n return undefined;\n const scale = this.determinant() > 0 ? Math.sqrt(scaleSquare) : -Math.sqrt(scaleSquare);\n const scaleInverse = 1.0 / scale;\n return { rigidAxes: this.scaleColumns(scaleInverse, scaleInverse, scaleInverse, result), scale };\n }\n /**\n * Compute the factorization M = R*G, where R is rigid (a rotation) and G is whatever is left over (skew, scale,\n * mirror, etc).\n * * The rotation is computed from the instance by passing `axisOrder` into [[createRigidFromMatrix3d]].\n * @param rotation the rigid factor R\n * @param skew the non-rotation factor G = R^t * M (since R transposed is its inverse)\n * @param axisOrder optional cross product ordering for computing R\n * @return whether [[createRigidFromMatrix3d]] succeeded; if not, `rotation` is set to the identity, and `skew` is\n * set to this instance.\n */\n public factorRigidSkew(rotation: Matrix3d, skew: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ): boolean {\n if (Matrix3d.createRigidFromMatrix3d(this, axisOrder, rotation)) {\n rotation.multiplyMatrixTransposeMatrix(this, skew);\n return true;\n }\n rotation.setIdentity();\n skew.setFrom(this);\n return false;\n }\n /** Test if `this` matrix reorders and/or negates the columns of the `identity` matrix. */\n public get isSignedPermutation(): boolean {\n let count = 0;\n for (let row = 0; row < 3; row++)\n for (let col = 0; col < 3; col++) {\n const q = this.at(row, col);\n if (q === 0) {\n // do nothing\n } else if (q === 1 || q === -1) {\n count++;\n // if the rest of this row and column should be 0 (\"at\" will apply cyclic indexing)\n if ((this.at(row + 1, col) !== 0) || (this.at(row + 2, col) !== 0) ||\n (this.at(row, col + 1) !== 0) || (this.at(row, col + 2) !== 0))\n return false;\n } else { // entry is not 0, 1, or -1\n return false;\n }\n }\n return count === 3;\n }\n /**\n * Adjust the matrix in place to make it rigid:\n * * Columns are perpendicular and have unit length.\n * * Transpose equals inverse.\n * @param axisOrder how to reorder the matrix columns. A left-handed ordering will return a mirror.\n * @return whether the adjusted matrix is rigid on return\n */\n public makeRigid(axisOrder: AxisOrder = AxisOrder.XYZ): boolean {\n const maxAbs = this.maxAbs();\n if (Geometry.isSmallMetricDistance(maxAbs))\n return false;\n const scale = 1.0 / maxAbs;\n this.scaleColumnsInPlace(scale, scale, scale); // improve numerical stability\n this.axisOrderCrossProductsInPlace(axisOrder);\n return this.normalizeColumnsInPlace();\n }\n /**\n * Create a new orthogonal matrix by calling [[makeRigid]] on a clone of `source`.\n * @param source input matrix\n * @param axisOrder how to reorder the matrix columns. A left-handed ordering will return a mirror.\n * @param result optional preallocated result to populate and return\n * @returns rigid matrix, or `undefined` if the operation failed.\n */\n public static createRigidFromMatrix3d(\n source: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ, result?: Matrix3d,\n ): Matrix3d | undefined {\n result = source.clone(result);\n if (result.makeRigid(axisOrder))\n return result;\n return undefined;\n }\n /**\n * Create a matrix from a quaternion.\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by\n * rows or columns. If you find that the matrix seems to rotate by the opposite angle, transpose it.\n *\n * Some math details can be found at\n * http://marc-b-reynolds.github.io/quaternions/2017/08/08/QuatRotMatrix.html\n */\n public static createFromQuaternion(quat: Point4d): Matrix3d {\n const qqx = quat.x * quat.x;\n const qqy = quat.y * quat.y;\n const qqz = quat.z * quat.z;\n const qqw = quat.w * quat.w;\n const mag2 = qqx + qqy + qqz + qqw;\n if (mag2 === 0.0) {\n return Matrix3d.createIdentity();\n } else {\n const a = 1.0 / mag2;\n const matrix = Matrix3d.createRowValues(\n // first row\n a * (qqw + qqx - qqy - qqz),\n 2.0 * a * (quat.w * quat.z + quat.x * quat.y),\n 2.0 * a * (quat.x * quat.z - quat.w * quat.y),\n // second row\n 2.0 * a * (quat.x * quat.y - quat.w * quat.z),\n a * (qqw - qqx + qqy - qqz),\n 2.0 * a * (quat.w * quat.x + quat.y * quat.z),\n // third row\n 2.0 * a * (quat.x * quat.z + quat.w * quat.y),\n 2.0 * a * (quat.y * quat.z - quat.w * quat.x),\n a * (qqw - qqx - qqy + qqz),\n );\n return matrix;\n }\n }\n /** Calculate quaternion terms used to convert matrix to a quaternion */\n private static computeQuatTerm(numerator: number, denomCoff: number, reciprocal: number, diagSum: number): number {\n let coff: number;\n const diagTol = 0.500;\n if (diagSum > diagTol) {\n coff = 0.5 * Math.sqrt(diagSum);\n if (denomCoff * numerator < 0.0)\n coff = -coff;\n } else {\n coff = numerator * reciprocal;\n }\n return coff;\n }\n /**\n * Create `this` matrix to a quaternion.\n * **Note:** This calculation requires `this` matrix to have unit length rows and columns.\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by\n * rows or columns. If you find that the matrix seems to rotate by the opposite angle, transpose it.\n *\n * Some math details can be found at\n * http://marc-b-reynolds.github.io/quaternions/2017/08/08/QuatRotMatrix.html\n */\n public toQuaternion(): Point4d {\n const result = Point4d.createZero();\n const props = [\n [this.coffs[0], this.coffs[3], this.coffs[6]],\n [this.coffs[1], this.coffs[4], this.coffs[7]],\n [this.coffs[2], this.coffs[5], this.coffs[8]],\n ];\n const xx = props[0][0];\n const yy = props[1][1];\n const zz = props[2][2];\n const dSum: number[] = [];\n dSum[0] = 1.0 + xx - yy - zz;\n dSum[1] = 1.0 - xx + yy - zz;\n dSum[2] = 1.0 - xx - yy + zz;\n dSum[3] = 1.0 + xx + yy + zz;\n let denom: number;\n let maxIndex = 0;\n for (let i = 1; i <= 3; i++) {\n if (dSum[i] > dSum[maxIndex])\n maxIndex = i;\n }\n if (maxIndex === 0) {\n result.x = 0.5 * Math.sqrt(dSum[0]);\n denom = 1.0 / (4.0 * result.x);\n result.y = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.x, denom, dSum[1]);\n result.z = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.x, denom, dSum[2]);\n result.w = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.x, denom, dSum[3]);\n } else if (maxIndex === 1) {\n result.y = 0.5 * Math.sqrt(dSum[1]);\n denom = 1.0 / (4.0 * result.y);\n result.x = Matrix3d.computeQuatTerm(props[0][1] + props[1][0], result.y, denom, dSum[0]);\n result.z = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.y, denom, dSum[2]);\n result.w = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.y, denom, dSum[3]);\n\n } else if (maxIndex === 2) {\n result.z = 0.5 * Math.sqrt(dSum[2]);\n denom = 1.0 / (4.0 * result.z);\n result.x = Matrix3d.computeQuatTerm(props[0][2] + props[2][0], result.z, denom, dSum[0]);\n result.y = Matrix3d.computeQuatTerm(props[1][2] + props[2][1], result.z, denom, dSum[1]);\n result.w = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.z, denom, dSum[3]);\n\n } else {\n result.w = 0.5 * Math.sqrt(dSum[3]);\n denom = 1.0 / (4.0 * result.w);\n result.x = Matrix3d.computeQuatTerm(props[2][1] - props[1][2], result.w, denom, dSum[0]);\n result.y = Matrix3d.computeQuatTerm(props[0][2] - props[2][0], result.w, denom, dSum[1]);\n result.z = Matrix3d.computeQuatTerm(props[1][0] - props[0][1], result.w, denom, dSum[2]);\n }\n return result;\n }\n}\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,4EAA4E;AAC5E;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC5B;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,UAAU,CACtB,IAAkB,EAClB,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW,EACrC,GAAW,EAAE,GAAW,EAAE,GAAW;QAErC,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;;;;;;OAMG;IACI,MAAM,CAAC,oBAAoB,CAAC,CAAe,EAAE,CAAe,EAAE,MAAqB;QACxF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAC9B,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,iBAAiB,CAAC,UAAU,CAC1B,MAAM,EACN,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,C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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 SaeedTorabi arctan newcommand diagonalization\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(\r\n 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 ) {\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 * @param a left matrix in product. ASSUMED length 9.\r\n * @param b right matrix in product. ASSUMED length 9.\r\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\r\n * @return matrix product `a*b`\r\n */\r\n public static multiplyMatrixMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result || result.length < 9)\r\n result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(\r\n 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 );\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `a*bTranspose`, store in `result`.\r\n * @param a left matrix in product. ASSUMED length 9.\r\n * @param b transpose of right matrix in product. ASSUMED length 9.\r\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\r\n * @return matrix product `a*b^T`\r\n */\r\n public static multiplyMatrixMatrixTranspose(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result || result.length < 9)\r\n result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(\r\n 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 );\r\n return result;\r\n }\r\n /**\r\n * Multiply 3x3 matrix `aTranspose*b`, store in `result`.\r\n * @param a transpose of left matrix in product. ASSUMED length 9.\r\n * @param b right matrix in product. ASSUMED length 9.\r\n * @param result optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a` or `b`.\r\n * @return matrix product `a^T*b`\r\n */\r\n public static multiplyMatrixTransposeMatrix(a: Float64Array, b: Float64Array, result?: Float64Array): Float64Array {\r\n if (!result || result.length < 9)\r\n result = new Float64Array(9);\r\n PackedMatrix3dOps.loadMatrix(\r\n 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 );\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 * Compute transpose of 3x3 matrix `a`, store in `dest`.\r\n * @param a source matrix. ASSUMED length 9. Note that `a` is not changed unless also passed as `dest`, i.e., `copyTransposed(a,a)` transposes `a` in place.\r\n * @param dest optional destination array of length 9. If insufficient length, a new array is returned. May refer to same array as `a`.\r\n * @return matrix `a^T`\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 || dest.length < 9)\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/**\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/**\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 /** The identity matrix */\r\n private static _identity: Matrix3d;\r\n /** temporary buffer to store a matrix as a Float64Array (array of 9 floats) */\r\n private static _productBuffer = new Float64Array(9);\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 of length at least 9 (CAPTURED). If undefined or insufficient length, a new array is created.\r\n */\r\n public constructor(coffs?: Float64Array) {\r\n this.coffs = (coffs && coffs.length >= 9) ? 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 this.setRowValues(\r\n json[0][0], json[0][1], json[0][2],\r\n json[1][0], json[1][1], json[1][2],\r\n json[2][0], json[2][1], json[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 this.setRowValues(\r\n json[0], json[1], json[2],\r\n json[3], json[4], json[5],\r\n json[6], json[7], json[8]);\r\n return;\r\n } else if (json.length === 4) {\r\n this.setRowValues(\r\n json[0], json[1], 0,\r\n json[2], json[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 * A matrix equivalence test, returning true if and only if the matrices are almost equal,\r\n * or all of the following column comparisons hold:\r\n * * z columns are almost equal, and\r\n * * x columns differ only by a rotation of angle t around the z column, and\r\n * * y columns differ only by a rotation of the same angle t around the z column.\r\n * @param other matrix to compare\r\n * @param tol optional distance tolerance, for comparisons by Geometry.isDistanceWithinTol\r\n * @return whether matrices are almost equal modulo a rotation around their common nonzero z-column.\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 return false;\r\n const columnX = this.columnX();\r\n const columnY = this.columnY();\r\n const columnZ = this.columnZ();\r\n const toOtherColumnX = columnX.signedAngleTo(other.columnX(), columnZ);\r\n let testColumn = Vector3d.createRotateVectorAroundVector(columnX, columnZ, toOtherColumnX);\r\n if (!testColumn)\r\n return false; // columnZ is zero length\r\n if (!other.isAlmostEqualColumnXYZ(0, testColumn.x, testColumn.y, testColumn.z, tol))\r\n return false; // columnX rotated around columnZ by angle doesn't end up at other.columnX\r\n testColumn = Vector3d.createRotateVectorAroundVector(columnY, columnZ, toOtherColumnX);\r\n if (!testColumn)\r\n return false;\r\n if (!other.isAlmostEqualColumnXYZ(1, testColumn.x, testColumn.y, testColumn.z, tol))\r\n return false; // columnY rotated around columnZ by angle doesn't end up at other.columnY\r\n return true;\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,\r\n ): 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 * * If either array is insufficiently sized, it is ignored.\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 && inverseCoffs.length >= 9) {\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(\r\n axisOrder: AxisOrder, columnA: Vector3d | undefined, columnB: Vector3d | undefined,\r\n columnC: Vector3d | undefined, result?: Matrix3d,\r\n ): 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 * 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 /**\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 the `other` matrix. If `other` is undefined, use identity 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(\r\n scaleFactorX: number, scaleFactorY: number, scaleFactorZ: number, result?: Matrix3d,\r\n ): Matrix3d {\r\n if (result)\r\n result.setZero();\r\n else\r\n result = new Matrix3d();\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 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(\r\n vectorU: Vector3d, vectorV: Vector3d, vectorW: Vector3d, axisOrder: AxisOrder, result?: Matrix3d,\r\n ): 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(\r\n vectorA: Vector3d, vectorB: Vector3d, axisOrder: AxisOrder, result?: Matrix3d,\r\n ): 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 determinant 1) using vectorA and its 2 perpendiculars.\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 * * Passing the normal of a plane P into this method returns a matrix whose transpose rotates geometry in P\r\n * to the xy-plane if P contains the origin, or to a plane parallel to the xy-plane if P does not contain the origin.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/2PerpendicularVectorsTo1Vector\r\n */\r\n public static createRigidHeadsUp(\r\n vectorA: Vector3d, axisOrder: AxisOrder = AxisOrder.ZXY, result?: Matrix3d,\r\n ): 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 /**\r\n * Return the matrix for rotation of `angle` around desired `axis`\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\r\n * @param axis the axis of rotation\r\n * @param angle the angle of rotation\r\n * @param result caller-allocated matrix (optional)\r\n * @returns the `rotation matrix` or `undefined` (if axis magnitude is near zero).\r\n */\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 * * The instance matrix A is multiplied in place on the left by a Givens rotation G, resulting in the matrix G*A.\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 * * The instance matrix A is multiplied in place on the right by a Givens rotation G, resulting in the matrix A*G.\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 /**\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(\r\n vectorU: XAndY, u: number,\r\n vectorV: XAndY, v: number,\r\n vectorW: XAndY, w: number,\r\n result?: Matrix3d,\r\n ): 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 /**\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 *\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(\r\n rightVector: Vector3d, upVector: Vector3d, leftNoneRight: number = 0, topNoneBottom: number = 0,\r\n ): 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(\r\n index: StandardViewIndex, invert: boolean = false, result?: Matrix3d,\r\n ): 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 );\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 );\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 );\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 );\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 );\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 );\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 );\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 eigenvalue algorithm.\r\n * @param i row index of zeroed member\r\n * @param j column index of zeroed member\r\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\r\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\r\n * mutually perpendicular because `this` matrix is symmetric.\r\n * @param lambda a matrix that its diagonal entries will be filled by eigenvalues and its non-diagonal elements\r\n * converge to 0 (allocated by caller, computed and filled by this function).\r\n */\r\n private applySymmetricJacobi(i: number, j: number, leftEigenvectors: Matrix3d, lambda: Matrix3d): number {\r\n const sii = lambda.at(i, i);\r\n const sjj = lambda.at(j, j);\r\n const sij = lambda.at(i, j);\r\n if (Math.abs(sij) < Geometry.smallFloatingPoint * (sii + sjj))\r\n return 0.0;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(sii - sjj, 2.0 * sij);\r\n const c = jacobi.c;\r\n const s = jacobi.s;\r\n /**\r\n * The following check does not exist in applyFastSymmetricJacobi because here if we don't return\r\n * early, the matrix remains untouched. However, applyFastSymmetricJacobi zeroes-out elements ij\r\n * and ji. Therefore, if we return early in applyFastSymmetricJacobi, zeroing-out wont happen.\r\n */\r\n if (Math.abs(s) < 2.0e-15)\r\n return 0.0;\r\n /**\r\n * If you apply the following 2 lines to a symmetric matrix, you get same lines used in\r\n * applyFastSymmetricJacobi. There are 2 differences which make applyFastSymmetricJacobi\r\n * more efficient. First, we directly set elements ij and ji equal to zero rather than\r\n * calculation them. Second, we copy symmetric elements from upper triangle to lower\r\n * instead of calculating them.\r\n */\r\n lambda.applyGivensRowOp(i, j, c, s);\r\n lambda.applyGivensColumnOp(i, j, c, s);\r\n leftEigenvectors.applyGivensColumnOp(i, j, c, s);\r\n return Math.abs(sij);\r\n }\r\n /**\r\n * Factor `this` matrix as a product `U * lambda * UT` where `U` is an orthogonal matrix and `lambda`\r\n * is a diagonal matrix.\r\n *\r\n * * **Note 1:** You must apply this function to a `symmetric` matrix. Otherwise, the lower triangle is ignored\r\n * and the upper triangle is mirrored to the lower triangle to enforce symmetry.\r\n * * **Note 2:** This function is replaced by a faster method called `fastSymmetricEigenvalues` so consider\r\n * using the fast version instead.\r\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\r\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\r\n * mutually perpendicular because `this` matrix is symmetric.\r\n * @param lambda a vector that its entries will be filled by eigenvalues of `this` Matrix3d (allocated by\r\n * caller, computed and filled by this function).\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 const numberOfIterations = 7;\r\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\r\n const sum = this.applySymmetricJacobi(0, 1, leftEigenvectors, matrix)\r\n + this.applySymmetricJacobi(0, 2, leftEigenvectors, matrix)\r\n + this.applySymmetricJacobi(1, 2, leftEigenvectors, matrix);\r\n if (sum < tolerance) {\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 * Apply (in place) a jacobi eigenvalue algorithm that diagonalize `this` matrix, i.e., zeros out this.at(i,j).\r\n * * During diagonalization, the upper triangle is mirrored to lower triangle to enforce symmetry.\r\n * * Math details can be found at docs/learning/geometry/Matrix.md\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 the left eigenvectors of `this` Matrix3d\r\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\r\n * mutually perpendicular because `this` matrix is symmetric.\r\n */\r\n private applyFastSymmetricJacobi(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 indexJI = 3 * j + i;\r\n const indexIK = 3 * i + k;\r\n const indexKI = 3 * k + i;\r\n const indexJK = 3 * j + k;\r\n const indexKJ = 3 * k + j;\r\n const sii = this.coffs[indexII];\r\n const sjj = this.coffs[indexJJ];\r\n const sij = this.coffs[indexIJ];\r\n if (Math.abs(sij) < Geometry.smallFloatingPoint * (sii + sjj))\r\n return 0.0;\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(sii - sjj, 2.0 * sij);\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 * sii + sc2 * sij + ss * sjj;\r\n this.coffs[indexJJ] = ss * sii - sc2 * sij + cc * sjj;\r\n this.coffs[indexIJ] = 0.0;\r\n this.coffs[indexJI] = 0.0;\r\n const a = this.coffs[indexIK];\r\n const b = this.coffs[indexJK];\r\n this.coffs[indexIK] = c * a + s * b;\r\n this.coffs[indexJK] = -s * a + c * b;\r\n this.coffs[indexKI] = this.coffs[indexIK];\r\n this.coffs[indexKJ] = this.coffs[indexJK];\r\n leftEigenVectors.applyGivensColumnOp(i, j, c, s);\r\n return Math.abs(sij);\r\n }\r\n /**\r\n * Factor `this` matrix as a product `U * lambda * UT` where `U` is an orthogonal matrix and `lambda`\r\n * is a diagonal matrix.\r\n *\r\n * * **Note:** You must apply this function to a `symmetric` matrix. Otherwise, the lower triangle is ignored\r\n * and the upper triangle is mirrored to the lower triangle to enforce symmetry.\r\n * * Math details can be found at docs/learning/geometry/Matrix.md\r\n * @param leftEigenvectors a matrix that its columns will be filled by the left eigenvectors of `this` Matrix3d\r\n * (allocated by caller, computed and filled by this function). Note that columns of leftEigenVectors will be\r\n * mutually perpendicular because `this` matrix is symmetric.\r\n * @param lambda a vector that its entries will be filled by eigenvalues of `this` Matrix3d (allocated by\r\n * 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 const numberOfIterations = 7;\r\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\r\n const sum = matrix.applyFastSymmetricJacobi(0, 1, 2, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobi(0, 2, 1, leftEigenvectors)\r\n + matrix.applyFastSymmetricJacobi(1, 2, 0, leftEigenvectors);\r\n if (sum < tolerance) {\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 for the rotation generated by `this` Matrix3d.\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)) { // note: this matrix is \"symmetric\"\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 /**\r\n * Rotate columns i and j of `this` matrix to make them perpendicular using the angle that zero-out\r\n * `thisTranspose * this`.\r\n * @param i row index of zeroed member.\r\n * @param j column index of zeroed member.\r\n * @param matrixU a matrix that its columns will be filled by the right eigenvectors of `thisTranspose * this`\r\n * (allocated by caller, computed and filled by this function). Note that columns of matrixU will be mutually\r\n * perpendicular because `thisTranspose * this` matrix is symmetric.\r\n */\r\n private applyJacobiColumnRotation(i: number, j: number, matrixU: Matrix3d): number {\r\n const uDotU = this.coffs[i] * this.coffs[i]\r\n + this.coffs[i + 3] * this.coffs[i + 3]\r\n + this.coffs[i + 6] * this.coffs[i + 6];\r\n const vDotV = this.coffs[j] * this.coffs[j]\r\n + this.coffs[j + 3] * this.coffs[j + 3]\r\n + this.coffs[j + 6] * this.coffs[j + 6];\r\n const uDotV = this.coffs[i] * this.coffs[j]\r\n + this.coffs[i + 3] * this.coffs[j + 3]\r\n + this.coffs[i + 6] * this.coffs[j + 6];\r\n const jacobi = Angle.trigValuesToHalfAngleTrigValues(uDotU - vDotV, 2.0 * uDotV);\r\n const c = jacobi.c;\r\n const s = jacobi.s;\r\n if (Math.abs(s) < 2.0e-15)\r\n return 0.0;\r\n this.applyGivensColumnOp(i, j, c, s); // make columns i and j of `this` matrix perpendicular\r\n matrixU.applyGivensRowOp(i, j, c, s); // right eigenvalues of `thisTranspose * this`\r\n return Math.abs(uDotV);\r\n }\r\n /**\r\n * Factor `this` matrix as a product `VD * U` where `VD` has mutually perpendicular columns and `U` is orthogonal.\r\n * @param matrixVD a matrix that its columns will be filled by rotating columns of `this` to make them mutually\r\n * perpendicular (allocated by caller, computed and filled by this function).\r\n * @param matrixU a matrix that its columns will be filled by the right eigenvectors of `thisTranspose * this`\r\n * (allocated by caller, computed and filled by this function). Note that columns of matrixU will be mutually\r\n * perpendicular because `thisTranspose * this` matrix is symmetric.\r\n */\r\n public factorPerpendicularColumns(matrixVD: Matrix3d, matrixU: Matrix3d): boolean {\r\n matrixVD.setFrom(this);\r\n matrixU.setIdentity();\r\n const tolerance = 1.0e-12 * this.sumSquares();\r\n const numberOfIterations = 7;\r\n for (let iteration = 0; iteration < numberOfIterations; iteration++) {\r\n const sum = matrixVD.applyJacobiColumnRotation(0, 1, matrixU)\r\n + matrixVD.applyJacobiColumnRotation(0, 2, matrixU)\r\n + matrixVD.applyJacobiColumnRotation(1, 2, matrixU);\r\n if (sum < tolerance) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Factor `this` matrix as a product `V * D * U` where `V` and `U` are orthogonal and `D` is diagonal with\r\n * positive entries.\r\n * * This is formally known as the `Singular Value Decomposition` or `SVD`.\r\n * @param matrixV an orthogonal matrix that its columns will be filled by the left eigenvectors of\r\n * `thisTranspose * this` (allocated by caller, computed and filled by this function).\r\n * @param scale singular values of `this` (allocated by caller, computed and filled by this function).\r\n * The singular values in the `scale` are non-negative and decreasing.\r\n * @param matrixU an orthogonal matrix that its columns will be filled by the right eigenvectors of\r\n * `thisTranspose * this` (allocated by caller, computed and filled by this function).\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 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()); // singular values of `this`\r\n const det = matrixVD.determinant();\r\n if (det < 0)\r\n scale.z = -scale.z;\r\n const almostZero = Geometry.smallFloatingPoint;\r\n const scaleXIsZero: boolean = Math.abs(scale.x) < almostZero;\r\n const scaleYIsZero: boolean = Math.abs(scale.y) < almostZero;\r\n const scaleZIsZero: boolean = Math.abs(scale.z) < almostZero;\r\n // NOTE: We 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 /**\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(\r\n vectorA: Vector3d, fraction: number, vectorB: Vector3d, result?: Matrix3d,\r\n ): 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 result,\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), result);\r\n }\r\n /** Returns a matrix that rotates from vectorA to vectorB. */\r\n public static createRotationVectorToVector(\r\n vectorA: Vector3d, vectorB: Vector3d, result?: Matrix3d,\r\n ): 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 /** Return the dot product of column X with column Z */\r\n public columnXDotColumnZ(): number {\r\n return this.coffs[0] * this.coffs[2]\r\n + this.coffs[3] * this.coffs[5]\r\n + this.coffs[6] * this.coffs[8];\r\n }\r\n /** Return the dot product of column Y with column Z */\r\n public columnYDotColumnZ(): number {\r\n return this.coffs[1] * this.coffs[2]\r\n + this.coffs[4] * this.coffs[5]\r\n + this.coffs[7] * this.coffs[8];\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): 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(\r\n this.coffs[2], this.coffs[5], this.coffs[8], vector.x, vector.y, vector.z, result,\r\n );\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 * * Visualization can be found at itwinjs.org/sandbox/SaeedTorabi/DirectionalScale\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 * Create a matrix which sweeps a vector along `sweepVector` until it hits the plane through the origin with the\r\n * given normal.\r\n * * Geometrically, the returned matrix `M` acts on a vector `u` by rotating and scaling it to lie in the plane.\r\n * Specifically, `Mu = u + sw` is perpendicular to `n` for some scalar `s`, where `w` is the sweep direction, and\r\n * `n` is the plane normal.\r\n * * Symbolically, `M = I - w⊗n / w.n`, where `I` is the identity, and ⊗ is the vector outer product.\r\n * @param sweepVector sweep direction. If same as `planeNormal`, the resulting matrix is a projection onto the plane.\r\n * @param planeNormal normal to the target plane\r\n */\r\n public static createFlattenAlongVectorToPlane(sweepVector: Vector3d, planeNormal: Vector3d): Matrix3d | undefined {\r\n // To sweep an arbitrary vector U0 along direction W to the vector U1 in the plane through the origin with normal N:\r\n // `U1 = U0 + W * alpha`\r\n // `U1 DOT N = (U0 + W * alpha) DOT N = 0`\r\n // `U0 DOT N = - alpha * W DOT N`\r\n // `alpha = - U0 DOT N / W DOT N`\r\n // Insert the alpha definition in U1:\r\n // `U1 = U0 - W * N DOT U0 / W DOT N`\r\n // Write W * N DOT U0 in terms of a vector outer product (^T indicates transpose):\r\n // `U1 = U0 - W * N^T * U0 / W DOT N`\r\n // Note W * N^T is a 3x3 matrix. By associativity of matrix multiplication:\r\n // `U1 = (I - W * N^T / W DOT N) * U0`\r\n // and the matrix to do the sweep for any vector in place of U0 is `I - W * N^T / W DOT N`.\r\n const result = Matrix3d.createIdentity();\r\n const dot = sweepVector.dotProduct(planeNormal);\r\n const inverse = Geometry.conditionalDivideCoordinate(1.0, -dot);\r\n if (inverse !== undefined) {\r\n result.addScaledOuterProductInPlace(sweepVector, planeNormal, inverse);\r\n return result;\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Multiply `matrix * point`, treating the point as a column vector on the right.\r\n * ```\r\n * equation\r\n * \\matrixXY{A}\\columnSubXYZ{U}\r\n * ```\r\n * @return the point result\r\n */\r\n public multiplyPoint(point: Point3d, result?: Point3d): Point3d {\r\n const x = point.x;\r\n const y = point.y;\r\n const z = point.z;\r\n return Point3d.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`, 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(\r\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Point3d,\r\n ): 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(\r\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Point4d,\r\n ): 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. If length < 4, a new array is returned.\r\n */\r\n public static xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(\r\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, w: number, result?: Float64Array,\r\n ): Float64Array {\r\n if (!result || result.length < 4)\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. If length < 3, a new array is returned.\r\n */\r\n public static xyzPlusMatrixTimesCoordinatesToFloat64Array(\r\n origin: XYZ, matrix: Matrix3d, x: number, y: number, z: number, result?: Float64Array,\r\n ): Float64Array {\r\n if (!result || result.length < 3)\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 the transpose 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 * @param result the vector result (optional)\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 /**\r\n * Multiply the matrix * [x,y,z], i.e. the vector [x,y,z] is a column vector on the right.\r\n * @param result the vector result (optional)\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 /**\r\n * Multiply the matrix * xyz, place result in (required) return value.\r\n * @param xyz right side\r\n * @param result the result.\r\n */\r\n public multiplyXYZtoXYZ(xyz: XYZ, result: XYZ): 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 /**\r\n * Multiply the matrix * [x,y,0], i.e. the vector [x,y,0] is a column vector on the right.\r\n * @param result the vector result (optional)\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 /**\r\n * Compute origin + the matrix * [x,y,0].\r\n * @param result the Point3d result (optional)\r\n */\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 }\r\n /**\r\n * Multiply the matrix * (x,y,z) in place, i.e. the vector (x,y,z) is a column vector on the right and\r\n * the multiplication updates the vector values.\r\n * @param xyzData the vector data.\r\n */\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 xyzData.x = this.coffs[0] * x + this.coffs[1] * y + this.coffs[2] * z;\r\n xyzData.y = this.coffs[3] * x + this.coffs[4] * y + this.coffs[5] * z;\r\n xyzData.z = this.coffs[6] * x + this.coffs[7] * y + this.coffs[8] * z;\r\n }\r\n /**\r\n * Multiply the transpose matrix times [x,y,z] in place, i.e. the vector [x,y,z] is a column vector on\r\n * the right and the multiplication updates the vector values.\r\n * * This is equivalent to `multiplyTransposeVector` but always returns the result directly in the input.\r\n * @param vectorU the vector data\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 vectorU.x = this.coffs[0] * x + this.coffs[3] * y + this.coffs[6] * z;\r\n vectorU.y = this.coffs[1] * x + this.coffs[4] * y + this.coffs[7] * z;\r\n vectorU.z = this.coffs[2] * x + this.coffs[5] * y + this.coffs[8] * z;\r\n }\r\n /**\r\n * Multiply the transpose matrix times column using individual numeric inputs.\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 the input as a column vector } \\columnXYZ{x}{y}{z}\\text{ compute }&\\columnSubXYZ{V} &= &A^T \\columnXYZ{x}{y}{z} \\\\\r\n * \\text{or as a 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 * @param result the vector result (optional)\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 /**\r\n * Solve `matrix * result = vector` for an unknown `result`.\r\n * * This is equivalent to multiplication `result = matrixInverse * vector`.\r\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\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 }\r\n return undefined;\r\n }\r\n /**\r\n * Solve `matrixTranspose * result = vector` for an unknown `result`.\r\n * * This is equivalent to multiplication `result = matrixInverseTranspose * vector`.\r\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\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 }\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]` for an unknown `result`.\r\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\r\n * @return result 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 }\r\n return undefined;\r\n }\r\n /**\r\n * Multiply `matrixInverse * [x,y,z]` and return result as a `Point4d` with the given weight as the last coordinate.\r\n * * Equivalent to solving `matrix * result = [x,y,z]` for an unknown `result`.\r\n * * Result is `undefined` if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\r\n * @return result as a Point4d with the same weight.\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 }\r\n return undefined;\r\n }\r\n /**\r\n * Multiply `matrixInverse * [x,y,z]` and return result as `Point3d`.\r\n * * Equivalent to solving `matrix * result = [x,y,z]` for an unknown `result`.\r\n * @return result as a Point3d or `undefined` (if the matrix is singular).\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 }\r\n return undefined;\r\n }\r\n /**\r\n * Invoke a given matrix*matrix operation to compute the inverse matrix and set this.inverseCoffs\r\n * * If either input coffA or coffB is `undefined`, set state to `InverseMatrixState.unknown` but\r\n * leave the inverseCoffs untouched.\r\n * @param f the given matrix*matrix operation that is called by this function to compute the inverse.\r\n * `f` must be a matrix*matrix operation. Otherwise, the function does not generate the inverse properly.\r\n */\r\n private finishInverseCoffs(\r\n f: (factorA: Float64Array, factorB: Float64Array, result: Float64Array) => void, coffA?: Float64Array,\r\n coffB?: Float64Array,\r\n ): void {\r\n if (coffA && coffB) {\r\n this.createInverseCoffsWithZeros();\r\n this.inverseState = InverseMatrixState.inverseStored;\r\n f(coffA, coffB, this.inverseCoffs!); // call function f (which is provided by user) to compute the inverse.\r\n } else {\r\n this.inverseState = InverseMatrixState.unknown;\r\n }\r\n }\r\n // Notes on inverse of matrix 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 = A * BTranspose ===> MInverse = BInverseTranspose * AInverse\r\n // 5) M = ATranspose * B ===> MInverse = BInverse * AInverseTranspose\r\n /**\r\n * Multiply `this` matrix times `other` matrix\r\n * @return the matrix result: this*other\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\r\n && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), other.inverseCoffs, this.inverseCoffs);\r\n else if (this.inverseState === InverseMatrixState.singular\r\n || 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 /**\r\n * Multiply `this` matrix times `inverse of other` matrix\r\n * @return the matrix result: this*otherInverse\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((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), 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 /**\r\n * Multiply `inverse of this` matrix times `other` matrix\r\n * @return the matrix result: thisInverse*other\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((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrix(a, b, _result), 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 /**\r\n * Multiply `this` matrix times the transpose of `other` matrix\r\n * ```\r\n * equation\r\n * \\text{for instance matrix }A\\text{ and matrix }B\\text{ return matrix }C{\\text where }\\\\\\matrixXY{C}=\\matrixXY{A}\\matrixTransposeSubXY{B}\r\n * ```\r\n * @return the matrix result: this*otherTranspose\r\n */\r\n public multiplyMatrixMatrixTranspose(other: Matrix3d, result?: Matrix3d): Matrix3d {\r\n result = result ? result : new Matrix3d();\r\n PackedMatrix3dOps.multiplyMatrixMatrixTranspose(this.coffs, other.coffs, result.coffs);\r\n if (this.inverseState === InverseMatrixState.inverseStored && other.inverseState === InverseMatrixState.inverseStored)\r\n result.finishInverseCoffs((a, b, _result) => PackedMatrix3dOps.multiplyMatrixTransposeMatrix(a, b, _result), 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 /**\r\n * Multiply the transpose of `this` matrix times `other` matrix\r\n * ```\r\n * equation\r\n * \\matrixXY{result}=\\matrixXY{\\text{this}}\\matrixTransposeSubXY{\\text{other}}\r\n * ```\r\n * @return the matrix result: thisTranspose*other\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((a, b, _result) => PackedMatrix3dOps.multiplyMatrixMatrixTranspose(a, b, _result), 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 /**\r\n * Multiply `this` Matrix3d (considered to be a Transform with 0 `origin`) times `other` Transform.\r\n * * **Note:** If `this = [A 0]` and `other = [B b]`, then `this * other` is defined as [A*B Ab] because:\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 origin part }\\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 the `other` Transform to be multiplied to `this` matrix.\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 );\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); // inverse of transpose is equal to transpose of inverse\r\n }\r\n /**\r\n * Return the inverse matrix.\r\n * The return is undefined if the matrix is singular (e.g. has parallel columns or a zero magnitude column)\r\n * * If `result == this`, then content of inverse of `this` matrix is copied into `this`. Otherwise, inverse\r\n * of `this` is stored in `result`.\r\n * * **Note:** Each Matrix3d object caches its own inverse (`this.inverseCoffs`) and has methods to multiply\r\n * the inverse times matrices and vectors (e.g., `multiplyMatrixInverseMatrix`, `multiplyMatrixMatrixInverse`,\r\n * `multiplyInverse`). 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 of this.coffs and this.inverseCoffs\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 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 /**\r\n * Take the dot product of a row (specified by `rowStartA`) of `coffA` and `columnStartB` of `coffB`.\r\n * * **Note:** We don't validate row/column numbers. Pass 0/3/6 for row 0/1/2 and pass 0/1/2 for column 0/1/2.\r\n */\r\n private static rowColumnDot(\r\n coffA: Float64Array, rowStartA: number, coffB: Float64Array, columnStartB: number,\r\n ): number {\r\n return coffA[rowStartA] * coffB[columnStartB] +\r\n coffA[rowStartA + 1] * coffB[columnStartB + 3] +\r\n coffA[rowStartA + 2] * coffB[columnStartB + 6];\r\n }\r\n /**\r\n * Take the cross product of 2 rows (specified by `rowStart0` and `rowStart1`) of `source` and store the result\r\n * in `columnStart` of `dest`.\r\n * * **Note:** We don't validate row/column numbers. Pass 0/3/6 for row 0/1/2 and pass 0/1/2 for column 0/1/2.\r\n */\r\n private static indexedRowCrossProduct(\r\n source: Float64Array, rowStart0: number, rowStart1: number, dest: Float64Array, columnStart: number,\r\n ): void {\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 /**\r\n * Take the cross product of 2 columns (i.e., `colStart0` and `colStart1`) of `this` matrix and store the\r\n * result in `colStart2` of the same matrix.\r\n * * **Note:** We don't validate column numbers. Pass 0/1/2 for column 0/1/2.\r\n */\r\n private indexedColumnCrossProductInPlace(colStart0: number, colStart1: number, colStart2: number): void {\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 /**\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 * * [A B C] ===> [A B AxB] ===> [A (AxB)xA AxB]\r\n *\r\n * This means that in the final matrix:\r\n * * first column is same as original column A.\r\n * * second column is linear combination of original A and B (i.e., is in the plane of original A and B).\r\n * * third column is perpendicular to first and second columns of both the original and final.\r\n * * original column C is overwritten and does not participate in the result.\r\n *\r\n * The final matrix will have 3 orthogonal columns.\r\n */\r\n public axisOrderCrossProductsInPlace(axisOrder: AxisOrder): void {\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 /**\r\n * Normalize each column in place.\r\n * @param originalColumnMagnitudes optional vector to store original column magnitudes.\r\n * @returns return true if all columns have non-zero lengths. Otherwise, return false.\r\n * * If false is returned, the magnitudes are stored in the `originalColumnMagnitudes` vector but no columns\r\n * are altered.\r\n */\r\n public normalizeColumnsInPlace(originalColumnMagnitudes?: Vector3d): boolean {\r\n const ax = this.columnXMagnitude();\r\n const ay = this.columnYMagnitude();\r\n const az = this.columnZMagnitude();\r\n if (originalColumnMagnitudes)\r\n originalColumnMagnitudes.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 /**\r\n * Normalize each row in place.\r\n * @param originalRowMagnitudes optional vector to store original row magnitudes.\r\n * @returns return true if all rows have non-zero lengths. Otherwise, return false.\r\n * * If false is returned, the magnitudes are stored in the `originalRowMagnitudes` vector but no rows\r\n * are altered.\r\n */\r\n public normalizeRowsInPlace(originalRowMagnitudes?: Vector3d): boolean {\r\n const ax = this.rowXMagnitude();\r\n const ay = this.rowYMagnitude();\r\n const az = this.rowZMagnitude();\r\n if (originalRowMagnitudes)\r\n originalRowMagnitudes.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 /**\r\n * Returns true if the matrix is singular.\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(): void {\r\n this.inverseState = InverseMatrixState.singular;\r\n }\r\n /**\r\n * Compute the inverse of `this` Matrix3d. The inverse is stored in `this.inverseCoffs` for later use.\r\n * @param useCacheIfAvailable if `true`, use the previously computed inverse if available. If `false`,\r\n * recompute the inverse.\r\n * @returns return `true` if the inverse is computed. Return `false` if matrix is singular.\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 /**\r\n * We calculate the inverse using cross products.\r\n * Math details can be found at docs/learning/matrix/Matrix.md\r\n * [ A ]\r\n * In summary, if M = [ B ] then inverse of M = (1/det)[BxC CxA AxB] where\r\n * [ C ]\r\n * det is the determinant of matrix M (which is equal to \"A dot BxC\").\r\n */\r\n Matrix3d.indexedRowCrossProduct(coffs, 3, 6, inverseCoffs, 0); // BxC\r\n Matrix3d.indexedRowCrossProduct(coffs, 6, 0, inverseCoffs, 1); // CxA\r\n Matrix3d.indexedRowCrossProduct(coffs, 0, 3, inverseCoffs, 2); // AxB\r\n Matrix3d.numComputeCache++;\r\n const det = Matrix3d.rowColumnDot(coffs, 0, inverseCoffs, 0); // A dot BxC\r\n if (det === 0.0) {\r\n this.inverseState = InverseMatrixState.singular;\r\n this.inverseCoffs = undefined;\r\n return false;\r\n }\r\n const f = 1.0 / det;\r\n for (let i = 0; i < 9; i++)\r\n inverseCoffs[i] *= f;\r\n this.inverseState = InverseMatrixState.inverseStored;\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 * * **Note:** Out of range row/column is interpreted cyclically.\r\n */\r\n public static flatIndexOf(row: number, column: number): number {\r\n return 3 * Geometry.cyclic3dAxis(row) + Geometry.cyclic3dAxis(column);\r\n }\r\n /**\r\n * Get elements of column `index` packaged as a Point4d with given `weight`.\r\n * * **Note:** Out of range index is interpreted cyclically.\r\n */\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 /**\r\n * Create a Matrix3d whose values are uniformly scaled from `this` Matrix3d.\r\n * @param scale scale factor to apply.\r\n * @param result optional result.\r\n * @returns return the scaled matrix.\r\n */\r\n public scale(scale: number, result?: Matrix3d): Matrix3d {\r\n return Matrix3d.createRowValues(\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 Matrix3d whose columns are scaled copies of `this` Matrix3d.\r\n * @param scaleX scale factor for column 0\r\n * @param scaleY scale factor for column 1\r\n * @param scaleZ scale factor for column 2\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 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 }\r\n /**\r\n * Scale the columns of `this` Matrix3d in place.\r\n * @param scaleX scale factor for column 0\r\n * @param scaleY scale factor for column 1\r\n * @param scaleZ scale factor for column 2\r\n */\r\n public scaleColumnsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\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 /**\r\n * Create a Matrix3d whose rows are scaled copies of `this` Matrix3d.\r\n * @param scaleX scale factor for row 0\r\n * @param scaleY scale factor for row 1\r\n * @param scaleZ scale factor for row 2\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 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 /**\r\n * Scale the rows of `this` Matrix3d in place.\r\n * @param scaleX scale factor for row 0\r\n * @param scaleY scale factor for row 1\r\n * @param scaleZ scale factor for row 2\r\n */\r\n public scaleRowsInPlace(scaleX: number, scaleY: number, scaleZ: number) {\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 if (this.inverseState === InverseMatrixState.inverseStored && this.inverseCoffs !== undefined) {\r\n // apply reciprocal scales to the COLUMNs 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] *= divY; this.inverseCoffs[2] *= divZ;\r\n this.inverseCoffs[3] *= divX; this.inverseCoffs[4] *= divY; this.inverseCoffs[5] *= divZ;\r\n this.inverseCoffs[6] *= divX; this.inverseCoffs[7] *= divY; this.inverseCoffs[8] *= divZ;\r\n } else\r\n this.inverseState = InverseMatrixState.singular;\r\n }\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 of vectors U and V.\r\n * * The scaled outer product is a matrix with `rank 1` (all columns/rows are linearly dependent).\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_x * V_y & U_x * V_z \\\\\r\n * U_y * V_x & U_y * V_y & U_y * V_z \\\\\r\n * U_z * V_x & U_z * V_y & U_z * V_z \\end{bmatrix}\r\n * ```\r\n * @param vectorU first vector in the outer product.\r\n * @param vectorV second vector in the outer product.\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 /**\r\n * Create a rigid matrix (columns and rows are unit length and pairwise perpendicular) for the given eye coordinate.\r\n * * column 2 is parallel to (x,y,z).\r\n * * column 0 is perpendicular to column 2 and is in the xy plane.\r\n * * column 1 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 (view) vector.\r\n * * If you want to rotate a given plane (which contains (0,0,0)) to the xy-plane, pass coordinates of the normal\r\n * vector of your plane into createRigidViewAxesZTowardsEye. The transpose of the returned Matrix3d can be used\r\n * to rotate your plane to the xy-plane. If plane does not contain (0,0,0) then the plane is rotated to a plane\r\n * parallel to the xy-plane.\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 /**\r\n * The matrix that the \"else\" statement creates is\r\n * [-s -s1*c c1*c]\r\n * [c -s1*s c1*s]\r\n * [0 c1 s1 ]\r\n * where\r\n * c = x / sqrt(x*x + y*y)\r\n * s = y / sqrt(x*x + y*y)\r\n * c1 = sqrt(x*x + y*y) / sqrt(x*x + y*y + z*z)\r\n * s1 = z / sqrt(x*x + y*y + z*z)\r\n *\r\n * This is an orthogonal matrix meaning it rotates the standard XYZ axis to ABC axis system\r\n * (if matrix is [A B C]). The matrix rotates (0,0,1), i.e., the default Top view or Z axis,\r\n * to the eye point (x/r,y/r,z/r) where r = sqrt(x*x + y*y + z*z). The matrix also rotates\r\n * (1,0,0) to a point on XY plane.\r\n */\r\n const c = x / rxy;\r\n const s = y / rxy;\r\n // if coordinate is (x,y,0), e.g., Front or Back or Left or Right view (for those 4 views x or y is 0 not both)\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) and z is not 0, 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[5] * this.coffs[7]\r\n - this.coffs[1] * this.coffs[3] * this.coffs[8]\r\n + this.coffs[1] * this.coffs[5] * this.coffs[6]\r\n + this.coffs[2] * this.coffs[3] * this.coffs[7]\r\n - this.coffs[2] * this.coffs[4] * this.coffs[6];\r\n }\r\n /**\r\n * Return an estimate of how independent the columns of `this` matrix are. Near zero is bad (i.e.,\r\n * columns are almost dependent and matrix is nearly singular). Near 1 is good (i.e., columns are\r\n * almost independent and matrix is invertible).\r\n */\r\n public conditionNumber(): number {\r\n const determinant = Math.abs(this.determinant());\r\n const columnMagnitudeSum =\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, columnMagnitudeSum, 0.0);\r\n }\r\n /** Return the sum of squares of all entries */\r\n public sumSquares(): number {\r\n let sum = 0;\r\n for (let 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 sum = 0;\r\n for (let 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 matrix `trace` (sum of diagonal entries) */\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 max = 0;\r\n for (let 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 max = 0;\r\n for (let 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 /** Sum of squared differences between symmetric pairs (symmetric pairs have indices (1,3), (2,6), and (5,7).) */\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 }\r\n /** Test if the matrix is (very near to) symmetric */\r\n public isSymmetric(): boolean {\r\n const offDiagonal: number = this.sumSkewSquares();\r\n return Math.sqrt(offDiagonal) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(this.sumSquares()));\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 (3,6,7) 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 /** Test if the above diagonal entries (1,2,5) are all nearly zero */\r\n public get isLowerTriangular(): boolean {\r\n const sumAll = this.sumSquares();\r\n const sumLow = Geometry.hypotenuseSquaredXYZ(this.coffs[1], this.coffs[2], this.coffs[5]);\r\n return Math.sqrt(sumLow) <= Geometry.smallAngleRadians * (1.0 + Math.sqrt(sumAll));\r\n }\r\n /**\r\n * If the matrix is diagonal with almost equal diagonal entries, return the first diagonal entry.\r\n * 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])\r\n && Geometry.isSameCoordinate(this.coffs[0], this.coffs[8])\r\n )\r\n return this.coffs[0];\r\n return undefined;\r\n }\r\n /**\r\n * Test if all rows and columns are unit length and perpendicular to each other.\r\n * * If so, the matrix is either a rotation (determinant is +1) or a mirror (determinant is -1).\r\n * * Such a matrix is called \"orthogonal\" and its inverse is its transpose.\r\n */\r\n public testPerpendicularUnitRowsAndColumns(): boolean {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n return product.isIdentity;\r\n }\r\n /**\r\n * Test if the matrix is a rigid matrix.\r\n * * A rigid matrix is a rotation: its columns and rows are unit length and pairwise perpendicular, and its\r\n * determinant is +1.\r\n * @param allowMirror whether to widen the test to also return true if the matrix is a mirror (determinant is -1).\r\n */\r\n public isRigid(allowMirror: boolean = false): boolean {\r\n return this.testPerpendicularUnitRowsAndColumns() && (allowMirror || this.determinant() > 0);\r\n }\r\n /**\r\n * Test if the instance is the product of a rigid matrix and a signed scale, and return both.\r\n * * Specifically, this is a test of whether the instance rows and columns are pairwise perpendicular and have equal\r\n * length. If so, the scale factor is this length, or its negative if the instance is a mirror, and dividing the\r\n * columns by this scale factor produces a rigid matrix (a rotation).\r\n * @param result optional pre-allocated object to populate and return\r\n * @returns the factorization `{ rigidAxes, scale }` where `rigidAxes` is the instance matrix with `scale` factor\r\n * removed, or undefined if the factorization failed.\r\n */\r\n public factorRigidWithSignedScale(result?: Matrix3d): { rigidAxes: Matrix3d, scale: number } | undefined {\r\n const product = this.multiplyMatrixMatrixTranspose(this);\r\n const scaleSquare = product.sameDiagonalScale();\r\n if (scaleSquare === undefined || scaleSquare <= 0.0)\r\n return undefined;\r\n const scale = this.determinant() > 0 ? Math.sqrt(scaleSquare) : -Math.sqrt(scaleSquare);\r\n const scaleInverse = 1.0 / scale;\r\n return { rigidAxes: this.scaleColumns(scaleInverse, scaleInverse, scaleInverse, result), scale };\r\n }\r\n /**\r\n * Compute the factorization M = R*G, where R is rigid (a rotation) and G is whatever is left over (skew, scale,\r\n * mirror, etc).\r\n * * The rotation is computed from the instance by passing `axisOrder` into [[createRigidFromMatrix3d]].\r\n * @param rotation the rigid factor R\r\n * @param skew the non-rotation factor G = R^t * M (since R transposed is its inverse)\r\n * @param axisOrder optional cross product ordering for computing R\r\n * @return whether [[createRigidFromMatrix3d]] succeeded; if not, `rotation` is set to the identity, and `skew` is\r\n * set to this instance.\r\n */\r\n public factorRigidSkew(rotation: Matrix3d, skew: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ): boolean {\r\n if (Matrix3d.createRigidFromMatrix3d(this, axisOrder, rotation)) {\r\n rotation.multiplyMatrixTransposeMatrix(this, skew);\r\n return true;\r\n }\r\n rotation.setIdentity();\r\n skew.setFrom(this);\r\n return false;\r\n }\r\n /** Test if `this` matrix reorders and/or negates the columns of the `identity` matrix. */\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) {\r\n // do nothing\r\n } else if (q === 1 || q === -1) {\r\n count++;\r\n // if the rest of this row and column should be 0 (\"at\" will apply cyclic indexing)\r\n if ((this.at(row + 1, col) !== 0) || (this.at(row + 2, col) !== 0) ||\r\n (this.at(row, col + 1) !== 0) || (this.at(row, col + 2) !== 0))\r\n return false;\r\n } else { // entry is not 0, 1, or -1\r\n return false;\r\n }\r\n }\r\n return count === 3;\r\n }\r\n /**\r\n * Adjust the matrix in place to make it rigid:\r\n * * Columns are perpendicular and have unit length.\r\n * * Transpose equals inverse.\r\n * @param axisOrder how to reorder the matrix columns. A left-handed ordering will return a mirror.\r\n * @return whether the adjusted matrix 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); // improve numerical stability\r\n this.axisOrderCrossProductsInPlace(axisOrder);\r\n return this.normalizeColumnsInPlace();\r\n }\r\n /**\r\n * Create a new orthogonal matrix by calling [[makeRigid]] on a clone of `source`.\r\n * @param source input matrix\r\n * @param axisOrder how to reorder the matrix columns. A left-handed ordering will return a mirror.\r\n * @param result optional preallocated result to populate and return\r\n * @returns rigid matrix, or `undefined` if the operation failed.\r\n */\r\n public static createRigidFromMatrix3d(\r\n source: Matrix3d, axisOrder: AxisOrder = AxisOrder.XYZ, result?: Matrix3d,\r\n ): 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 /**\r\n * Create a matrix from a quaternion.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by\r\n * rows or columns. If you find that the matrix seems to rotate by the opposite angle, transpose it.\r\n *\r\n * Some math details can be found at\r\n * http://marc-b-reynolds.github.io/quaternions/2017/08/08/QuatRotMatrix.html\r\n */\r\n public static createFromQuaternion(quat: Point4d): Matrix3d {\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 const mag2 = qqx + qqy + qqz + qqw;\r\n if (mag2 === 0.0) {\r\n return Matrix3d.createIdentity();\r\n } else {\r\n const a = 1.0 / mag2;\r\n const matrix = Matrix3d.createRowValues(\r\n // first row\r\n a * (qqw + qqx - qqy - qqz),\r\n 2.0 * a * (quat.w * quat.z + quat.x * quat.y),\r\n 2.0 * a * (quat.x * quat.z - quat.w * quat.y),\r\n // second row\r\n 2.0 * a * (quat.x * quat.y - quat.w * quat.z),\r\n a * (qqw - qqx + qqy - qqz),\r\n 2.0 * a * (quat.w * quat.x + quat.y * quat.z),\r\n // third row\r\n 2.0 * a * (quat.x * quat.z + quat.w * quat.y),\r\n 2.0 * a * (quat.y * quat.z - quat.w * quat.x),\r\n a * (qqw - qqx - qqy + qqz),\r\n );\r\n return matrix;\r\n }\r\n }\r\n /** Calculate quaternion terms used to convert matrix to a quaternion */\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 = 0.5 * Math.sqrt(diagSum);\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 /**\r\n * Create `this` matrix to a quaternion.\r\n * **Note:** This calculation requires `this` matrix to have unit length rows and columns.\r\n * **WARNING:** There is frequent confusion over whether a \"from quaternion\" matrix is organized by\r\n * rows or columns. If you find that the matrix seems to rotate by the opposite angle, transpose it.\r\n *\r\n * Some math details can be found at\r\n * http://marc-b-reynolds.github.io/quaternions/2017/08/08/QuatRotMatrix.html\r\n */\r\n public toQuaternion(): Point4d {\r\n const result = Point4d.createZero();\r\n const props = [\r\n [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 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 let denom: number;\r\n let maxIndex = 0;\r\n for (let i = 1; i <= 3; i++) {\r\n if (dSum[i] > dSum[maxIndex])\r\n maxIndex = i;\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"]}