@itwin/core-geometry 5.0.0-dev.8 → 5.0.0-dev.83

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 (966) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/lib/cjs/Constant.js +17 -17
  3. package/lib/cjs/Constant.js.map +1 -1
  4. package/lib/cjs/Geometry.d.ts +2 -4
  5. package/lib/cjs/Geometry.d.ts.map +1 -1
  6. package/lib/cjs/Geometry.js +37 -39
  7. package/lib/cjs/Geometry.js.map +1 -1
  8. package/lib/cjs/bspline/AkimaCurve3d.js +3 -1
  9. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  10. package/lib/cjs/bspline/BSpline1dNd.d.ts +90 -54
  11. package/lib/cjs/bspline/BSpline1dNd.d.ts.map +1 -1
  12. package/lib/cjs/bspline/BSpline1dNd.js +137 -84
  13. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  14. package/lib/cjs/bspline/BSplineCurve.d.ts +193 -155
  15. package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
  16. package/lib/cjs/bspline/BSplineCurve.js +249 -181
  17. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  18. package/lib/cjs/bspline/BSplineCurve3dH.js +1 -0
  19. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  20. package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
  21. package/lib/cjs/bspline/BSplineCurveOps.js +18 -21
  22. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  23. package/lib/cjs/bspline/BSplineSurface.js +22 -2
  24. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  25. package/lib/cjs/bspline/Bezier1dNd.js +6 -0
  26. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  27. package/lib/cjs/bspline/BezierCurve3d.d.ts +3 -1
  28. package/lib/cjs/bspline/BezierCurve3d.d.ts.map +1 -1
  29. package/lib/cjs/bspline/BezierCurve3d.js +5 -5
  30. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  31. package/lib/cjs/bspline/BezierCurve3dH.js +2 -0
  32. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  33. package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
  34. package/lib/cjs/bspline/BezierCurveBase.js +21 -2
  35. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  36. package/lib/cjs/bspline/InterpolationCurve3d.js +12 -1
  37. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  38. package/lib/cjs/bspline/KnotVector.d.ts +82 -60
  39. package/lib/cjs/bspline/KnotVector.d.ts.map +1 -1
  40. package/lib/cjs/bspline/KnotVector.js +144 -84
  41. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  42. package/lib/cjs/bspline/SurfaceLocationDetail.js +12 -0
  43. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  44. package/lib/cjs/clipping/AlternatingConvexClipTree.js +14 -13
  45. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  46. package/lib/cjs/clipping/BooleanClipNode.js +4 -0
  47. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  48. package/lib/cjs/clipping/ClipPlane.js +10 -1
  49. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  50. package/lib/cjs/clipping/ClipPrimitive.js +19 -0
  51. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  52. package/lib/cjs/clipping/ClipUtils.js +5 -1
  53. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  54. package/lib/cjs/clipping/ClipVector.js +11 -8
  55. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  56. package/lib/cjs/clipping/ConvexClipPlaneSet.js +5 -3
  57. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  58. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +2 -1
  59. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  60. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js +3 -0
  61. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  62. package/lib/cjs/core-geometry.d.ts +1 -0
  63. package/lib/cjs/core-geometry.d.ts.map +1 -1
  64. package/lib/cjs/core-geometry.js +1 -0
  65. package/lib/cjs/core-geometry.js.map +1 -1
  66. package/lib/cjs/curve/Arc3d.d.ts +17 -3
  67. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  68. package/lib/cjs/curve/Arc3d.js +50 -21
  69. package/lib/cjs/curve/Arc3d.js.map +1 -1
  70. package/lib/cjs/curve/ConstructCurveBetweenCurves.js +3 -0
  71. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  72. package/lib/cjs/curve/CoordinateXYZ.js +3 -2
  73. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  74. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +0 -2
  75. package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  76. package/lib/cjs/curve/CurveChainWithDistanceIndex.js +25 -10
  77. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  78. package/lib/cjs/curve/CurveCollection.d.ts +10 -0
  79. package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
  80. package/lib/cjs/curve/CurveCollection.js +35 -9
  81. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  82. package/lib/cjs/curve/CurveFactory.d.ts +87 -53
  83. package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
  84. package/lib/cjs/curve/CurveFactory.js +213 -135
  85. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  86. package/lib/cjs/curve/CurveLocationDetail.js +44 -0
  87. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  88. package/lib/cjs/curve/CurvePrimitive.d.ts +7 -10
  89. package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
  90. package/lib/cjs/curve/CurvePrimitive.js +27 -12
  91. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  92. package/lib/cjs/curve/CurveProcessor.js +2 -0
  93. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  94. package/lib/cjs/curve/CurveWireMomentsXYZ.js +2 -0
  95. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  96. package/lib/cjs/curve/LineSegment3d.js +6 -2
  97. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  98. package/lib/cjs/curve/LineString3d.js +27 -7
  99. package/lib/cjs/curve/LineString3d.js.map +1 -1
  100. package/lib/cjs/curve/Loop.js +12 -4
  101. package/lib/cjs/curve/Loop.js.map +1 -1
  102. package/lib/cjs/curve/OffsetOptions.js +25 -21
  103. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  104. package/lib/cjs/curve/ParityRegion.js +4 -2
  105. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  106. package/lib/cjs/curve/Path.js +2 -2
  107. package/lib/cjs/curve/Path.js.map +1 -1
  108. package/lib/cjs/curve/PointString3d.js +3 -2
  109. package/lib/cjs/curve/PointString3d.js.map +1 -1
  110. package/lib/cjs/curve/ProxyCurve.js +1 -0
  111. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  112. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +1 -0
  113. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  114. package/lib/cjs/curve/Query/CurveSplitContext.js +3 -0
  115. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  116. package/lib/cjs/curve/Query/CylindricalRange.js +6 -2
  117. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  118. package/lib/cjs/curve/Query/PlanarSubdivision.js +4 -6
  119. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  120. package/lib/cjs/curve/Query/StrokeCountChain.js +12 -0
  121. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  122. package/lib/cjs/curve/Query/StrokeCountMap.js +14 -0
  123. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  124. package/lib/cjs/curve/RegionMomentsXY.js +4 -5
  125. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  126. package/lib/cjs/curve/RegionOps.js +9 -10
  127. package/lib/cjs/curve/RegionOps.js.map +1 -1
  128. package/lib/cjs/curve/RegionOpsClassificationSweeps.js +24 -1
  129. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  130. package/lib/cjs/curve/StrokeOptions.d.ts +4 -4
  131. package/lib/cjs/curve/StrokeOptions.d.ts.map +1 -1
  132. package/lib/cjs/curve/StrokeOptions.js +23 -6
  133. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  134. package/lib/cjs/curve/UnionRegion.js +4 -2
  135. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  136. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +13 -7
  137. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  138. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js +6 -0
  139. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  140. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js +2 -0
  141. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  142. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +13 -5
  143. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  144. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js +3 -0
  145. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  146. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +18 -5
  147. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  148. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +26 -13
  149. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  150. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js +11 -5
  151. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  152. package/lib/cjs/curve/internalContexts/CurveLengthContext.js +6 -0
  153. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  154. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js +8 -6
  155. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  156. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js +38 -5
  157. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  158. package/lib/cjs/curve/internalContexts/GapSearchContext.js +1 -0
  159. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  160. package/lib/cjs/curve/internalContexts/MultiChainCollector.js +12 -0
  161. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  162. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js +1 -0
  163. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  164. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js +7 -0
  165. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  166. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +22 -4
  167. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  168. package/lib/cjs/curve/internalContexts/SumLengthsContext.js +1 -0
  169. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  170. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js +3 -0
  171. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  172. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js +2 -0
  173. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  174. package/lib/cjs/curve/spiral/ClothoidSeries.js +4 -0
  175. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  176. package/lib/cjs/curve/spiral/CubicEvaluator.js +2 -0
  177. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  178. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js +4 -0
  179. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  180. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js +5 -0
  181. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  182. package/lib/cjs/curve/spiral/DirectSpiral3d.js +12 -2
  183. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  184. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +24 -4
  185. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  186. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +2 -0
  187. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  188. package/lib/cjs/curve/spiral/NormalizedTransition.js +5 -0
  189. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  190. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js +2 -0
  191. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  192. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js +10 -0
  193. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  194. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +10 -0
  195. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  196. package/lib/cjs/curve/spiral/XYCurveEvaluator.js +6 -0
  197. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  198. package/lib/cjs/geometry3d/Angle.js +18 -16
  199. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  200. package/lib/cjs/geometry3d/AngleSweep.d.ts +7 -2
  201. package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
  202. package/lib/cjs/geometry3d/AngleSweep.js +14 -2
  203. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  204. package/lib/cjs/geometry3d/BarycentricTriangle.js +25 -0
  205. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  206. package/lib/cjs/geometry3d/BilinearPatch.js +8 -0
  207. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  208. package/lib/cjs/geometry3d/CoincidentGeometryOps.js +5 -0
  209. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  210. package/lib/cjs/geometry3d/Ellipsoid.js +48 -0
  211. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  212. package/lib/cjs/geometry3d/FrameBuilder.js +12 -4
  213. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  214. package/lib/cjs/geometry3d/FrustumAnimation.js +7 -0
  215. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  216. package/lib/cjs/geometry3d/GrowableBlockedArray.js +12 -0
  217. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  218. package/lib/cjs/geometry3d/GrowableFloat64Array.js +3 -0
  219. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  220. package/lib/cjs/geometry3d/GrowableXYArray.d.ts +0 -5
  221. package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
  222. package/lib/cjs/geometry3d/GrowableXYArray.js +16 -7
  223. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  224. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +32 -10
  225. package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  226. package/lib/cjs/geometry3d/GrowableXYZArray.js +70 -16
  227. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  228. package/lib/cjs/geometry3d/IndexedCollectionInterval.js +6 -0
  229. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  230. package/lib/cjs/geometry3d/IndexedXYCollection.js +1 -0
  231. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  232. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +13 -2
  233. package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  234. package/lib/cjs/geometry3d/IndexedXYZCollection.js +26 -11
  235. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  236. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js +3 -0
  237. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  238. package/lib/cjs/geometry3d/Matrix3d.d.ts +3 -4
  239. package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
  240. package/lib/cjs/geometry3d/Matrix3d.js +36 -14
  241. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  242. package/lib/cjs/geometry3d/OrderedRotationAngles.js +10 -2
  243. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  244. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +2 -0
  245. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  246. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js +7 -0
  247. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  248. package/lib/cjs/geometry3d/Point2dArrayCarrier.js +2 -0
  249. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  250. package/lib/cjs/geometry3d/Point2dVector2d.js +4 -0
  251. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  252. package/lib/cjs/geometry3d/Point3dArrayCarrier.js +3 -1
  253. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  254. package/lib/cjs/geometry3d/Point3dVector3d.d.ts +7 -10
  255. package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
  256. package/lib/cjs/geometry3d/Point3dVector3d.js +16 -10
  257. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  258. package/lib/cjs/geometry3d/PointHelpers.d.ts +4 -4
  259. package/lib/cjs/geometry3d/PointHelpers.d.ts.map +1 -1
  260. package/lib/cjs/geometry3d/PointHelpers.js +8 -8
  261. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  262. package/lib/cjs/geometry3d/PointStreaming.js +12 -4
  263. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  264. package/lib/cjs/geometry3d/PolygonOps.d.ts +2 -2
  265. package/lib/cjs/geometry3d/PolygonOps.js +62 -25
  266. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  267. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +7 -3
  268. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  269. package/lib/cjs/geometry3d/PolylineOps.d.ts +9 -5
  270. package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
  271. package/lib/cjs/geometry3d/PolylineOps.js +12 -5
  272. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  273. package/lib/cjs/geometry3d/Range.js +21 -4
  274. package/lib/cjs/geometry3d/Range.js.map +1 -1
  275. package/lib/cjs/geometry3d/Ray2d.js +2 -0
  276. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  277. package/lib/cjs/geometry3d/Ray3d.d.ts +2 -2
  278. package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
  279. package/lib/cjs/geometry3d/Ray3d.js +20 -11
  280. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  281. package/lib/cjs/geometry3d/ReusableObjectCache.js +4 -0
  282. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  283. package/lib/cjs/geometry3d/Segment1d.js +4 -0
  284. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  285. package/lib/cjs/geometry3d/SortablePolygon.js +11 -0
  286. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  287. package/lib/cjs/geometry3d/Transform.d.ts +1 -1
  288. package/lib/cjs/geometry3d/Transform.js +4 -1
  289. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  290. package/lib/cjs/geometry3d/YawPitchRollAngles.js +6 -0
  291. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  292. package/lib/cjs/geometry4d/Map4d.js +2 -0
  293. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  294. package/lib/cjs/geometry4d/Matrix4d.js +1 -0
  295. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  296. package/lib/cjs/geometry4d/MomentData.d.ts +72 -73
  297. package/lib/cjs/geometry4d/MomentData.d.ts.map +1 -1
  298. package/lib/cjs/geometry4d/MomentData.js +90 -66
  299. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  300. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js +6 -0
  301. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  302. package/lib/cjs/geometry4d/Point4d.js +2 -0
  303. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  304. package/lib/cjs/numerics/BezierPolynomials.js +8 -0
  305. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  306. package/lib/cjs/numerics/ClusterableArray.js +29 -13
  307. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  308. package/lib/cjs/numerics/Complex.js +2 -0
  309. package/lib/cjs/numerics/Complex.js.map +1 -1
  310. package/lib/cjs/numerics/ConvexPolygon2d.js +3 -0
  311. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  312. package/lib/cjs/numerics/Newton.js +59 -4
  313. package/lib/cjs/numerics/Newton.js.map +1 -1
  314. package/lib/cjs/numerics/PascalCoefficients.js +1 -1
  315. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  316. package/lib/cjs/numerics/PolarData.js +13 -1
  317. package/lib/cjs/numerics/PolarData.js.map +1 -1
  318. package/lib/cjs/numerics/Polynomials.js +64 -26
  319. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  320. package/lib/cjs/numerics/Quadrature.js +26 -20
  321. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  322. package/lib/cjs/numerics/TriDiagonalSystem.js +11 -0
  323. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  324. package/lib/cjs/numerics/UnionFind.js +1 -0
  325. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  326. package/lib/cjs/numerics/UsageSums.js +10 -0
  327. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  328. package/lib/cjs/polyface/AuxData.js +16 -0
  329. package/lib/cjs/polyface/AuxData.js.map +1 -1
  330. package/lib/cjs/polyface/BoxTopology.js +67 -67
  331. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  332. package/lib/cjs/polyface/FacetFaceData.d.ts +1 -1
  333. package/lib/cjs/polyface/FacetFaceData.js +3 -1
  334. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  335. package/lib/cjs/polyface/FacetLocationDetail.js +30 -0
  336. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  337. package/lib/cjs/polyface/FacetOrientation.js +12 -1
  338. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  339. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +18 -2
  340. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  341. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts +33 -23
  342. package/lib/cjs/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  343. package/lib/cjs/polyface/IndexedEdgeMatcher.js +63 -33
  344. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  345. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts +3 -2
  346. package/lib/cjs/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  347. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js +11 -2
  348. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  349. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts +233 -0
  350. package/lib/cjs/polyface/IndexedPolyfaceWalker.d.ts.map +1 -0
  351. package/lib/cjs/polyface/IndexedPolyfaceWalker.js +353 -0
  352. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -0
  353. package/lib/cjs/polyface/Polyface.d.ts +35 -10
  354. package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
  355. package/lib/cjs/polyface/Polyface.js +73 -12
  356. package/lib/cjs/polyface/Polyface.js.map +1 -1
  357. package/lib/cjs/polyface/PolyfaceBuilder.d.ts +14 -27
  358. package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
  359. package/lib/cjs/polyface/PolyfaceBuilder.js +47 -79
  360. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  361. package/lib/cjs/polyface/PolyfaceClip.js +8 -0
  362. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  363. package/lib/cjs/polyface/PolyfaceData.d.ts +28 -0
  364. package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
  365. package/lib/cjs/polyface/PolyfaceData.js +87 -5
  366. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  367. package/lib/cjs/polyface/PolyfaceQuery.js +47 -7
  368. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  369. package/lib/cjs/polyface/RangeLengthData.js +7 -0
  370. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  371. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js +12 -0
  372. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  373. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js +5 -2
  374. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  375. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +12 -0
  376. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  377. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +14 -0
  378. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  379. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +5 -0
  380. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  381. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +43 -0
  382. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  383. package/lib/cjs/polyface/TaggedNumericData.js +8 -0
  384. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  385. package/lib/cjs/polyface/TriangleCandidate.js +3 -0
  386. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  387. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js +7 -0
  388. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  389. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js +6 -0
  390. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  391. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +3 -0
  392. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  393. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js +3 -0
  394. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  395. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +32 -0
  396. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  397. package/lib/cjs/polyface/multiclip/RangeSearch.js +5 -5
  398. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  399. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +21 -8
  400. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  401. package/lib/cjs/polyface/multiclip/XYPointBuckets.js +6 -0
  402. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  403. package/lib/cjs/serialization/BGFBAccessors.js +82 -164
  404. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  405. package/lib/cjs/serialization/BGFBReader.js +22 -22
  406. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  407. package/lib/cjs/serialization/BGFBWriter.js +1 -0
  408. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  409. package/lib/cjs/serialization/DeepCompare.js +17 -17
  410. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  411. package/lib/cjs/serialization/GeometrySamples.d.ts +5 -5
  412. package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
  413. package/lib/cjs/serialization/GeometrySamples.js +113 -112
  414. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  415. package/lib/cjs/serialization/IModelJsonSchema.d.ts +70 -63
  416. package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
  417. package/lib/cjs/serialization/IModelJsonSchema.js +87 -74
  418. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  419. package/lib/cjs/solid/Box.js +7 -2
  420. package/lib/cjs/solid/Box.js.map +1 -1
  421. package/lib/cjs/solid/Cone.d.ts +39 -14
  422. package/lib/cjs/solid/Cone.d.ts.map +1 -1
  423. package/lib/cjs/solid/Cone.js +52 -16
  424. package/lib/cjs/solid/Cone.js.map +1 -1
  425. package/lib/cjs/solid/LinearSweep.js +4 -2
  426. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  427. package/lib/cjs/solid/RotationalSweep.js +5 -2
  428. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  429. package/lib/cjs/solid/RuledSweep.d.ts +26 -23
  430. package/lib/cjs/solid/RuledSweep.d.ts.map +1 -1
  431. package/lib/cjs/solid/RuledSweep.js +32 -24
  432. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  433. package/lib/cjs/solid/SolidPrimitive.d.ts +12 -11
  434. package/lib/cjs/solid/SolidPrimitive.d.ts.map +1 -1
  435. package/lib/cjs/solid/SolidPrimitive.js +11 -6
  436. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  437. package/lib/cjs/solid/Sphere.d.ts +34 -17
  438. package/lib/cjs/solid/Sphere.d.ts.map +1 -1
  439. package/lib/cjs/solid/Sphere.js +51 -24
  440. package/lib/cjs/solid/Sphere.js.map +1 -1
  441. package/lib/cjs/solid/SweepContour.d.ts +24 -15
  442. package/lib/cjs/solid/SweepContour.d.ts.map +1 -1
  443. package/lib/cjs/solid/SweepContour.js +33 -15
  444. package/lib/cjs/solid/SweepContour.js.map +1 -1
  445. package/lib/cjs/solid/TorusPipe.js +7 -2
  446. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  447. package/lib/cjs/topology/ChainMerge.js +16 -4
  448. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  449. package/lib/cjs/topology/Graph.js +41 -6
  450. package/lib/cjs/topology/Graph.js.map +1 -1
  451. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +1 -1
  452. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +5 -1
  453. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  454. package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -0
  455. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  456. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js +9 -2
  457. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  458. package/lib/cjs/topology/HalfEdgeGraphValidation.js +7 -9
  459. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  460. package/lib/cjs/topology/HalfEdgeMarkSet.js +5 -0
  461. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  462. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js +6 -0
  463. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  464. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +1 -0
  465. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  466. package/lib/cjs/topology/HalfEdgePositionDetail.js +16 -0
  467. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  468. package/lib/cjs/topology/HalfEdgePriorityQueue.js +2 -0
  469. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  470. package/lib/cjs/topology/InsertAndRetriangulateContext.js +4 -0
  471. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  472. package/lib/cjs/topology/MaskManager.js +3 -0
  473. package/lib/cjs/topology/MaskManager.js.map +1 -1
  474. package/lib/cjs/topology/Merging.js +11 -6
  475. package/lib/cjs/topology/Merging.js.map +1 -1
  476. package/lib/cjs/topology/RegularizeFace.js +22 -0
  477. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  478. package/lib/cjs/topology/SignedDataSummary.js +22 -0
  479. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  480. package/lib/cjs/topology/Triangulation.js +21 -11
  481. package/lib/cjs/topology/Triangulation.js.map +1 -1
  482. package/lib/cjs/topology/XYParitySearchContext.js +13 -0
  483. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  484. package/lib/esm/Constant.js +17 -17
  485. package/lib/esm/Constant.js.map +1 -1
  486. package/lib/esm/Geometry.d.ts +2 -4
  487. package/lib/esm/Geometry.d.ts.map +1 -1
  488. package/lib/esm/Geometry.js +37 -39
  489. package/lib/esm/Geometry.js.map +1 -1
  490. package/lib/esm/bspline/AkimaCurve3d.js +3 -1
  491. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  492. package/lib/esm/bspline/BSpline1dNd.d.ts +90 -54
  493. package/lib/esm/bspline/BSpline1dNd.d.ts.map +1 -1
  494. package/lib/esm/bspline/BSpline1dNd.js +137 -84
  495. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  496. package/lib/esm/bspline/BSplineCurve.d.ts +193 -155
  497. package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
  498. package/lib/esm/bspline/BSplineCurve.js +249 -181
  499. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  500. package/lib/esm/bspline/BSplineCurve3dH.js +1 -0
  501. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  502. package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
  503. package/lib/esm/bspline/BSplineCurveOps.js +18 -21
  504. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  505. package/lib/esm/bspline/BSplineSurface.js +22 -2
  506. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  507. package/lib/esm/bspline/Bezier1dNd.js +6 -0
  508. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  509. package/lib/esm/bspline/BezierCurve3d.d.ts +3 -1
  510. package/lib/esm/bspline/BezierCurve3d.d.ts.map +1 -1
  511. package/lib/esm/bspline/BezierCurve3d.js +5 -5
  512. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  513. package/lib/esm/bspline/BezierCurve3dH.js +2 -0
  514. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  515. package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
  516. package/lib/esm/bspline/BezierCurveBase.js +21 -2
  517. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  518. package/lib/esm/bspline/InterpolationCurve3d.js +12 -1
  519. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  520. package/lib/esm/bspline/KnotVector.d.ts +82 -60
  521. package/lib/esm/bspline/KnotVector.d.ts.map +1 -1
  522. package/lib/esm/bspline/KnotVector.js +144 -84
  523. package/lib/esm/bspline/KnotVector.js.map +1 -1
  524. package/lib/esm/bspline/SurfaceLocationDetail.js +12 -0
  525. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  526. package/lib/esm/clipping/AlternatingConvexClipTree.js +14 -13
  527. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  528. package/lib/esm/clipping/BooleanClipNode.js +4 -0
  529. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  530. package/lib/esm/clipping/ClipPlane.js +10 -1
  531. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  532. package/lib/esm/clipping/ClipPrimitive.js +19 -0
  533. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  534. package/lib/esm/clipping/ClipUtils.js +5 -1
  535. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  536. package/lib/esm/clipping/ClipVector.js +11 -8
  537. package/lib/esm/clipping/ClipVector.js.map +1 -1
  538. package/lib/esm/clipping/ConvexClipPlaneSet.js +5 -3
  539. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  540. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +2 -1
  541. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  542. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js +3 -0
  543. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  544. package/lib/esm/core-geometry.d.ts +1 -0
  545. package/lib/esm/core-geometry.d.ts.map +1 -1
  546. package/lib/esm/core-geometry.js +1 -0
  547. package/lib/esm/core-geometry.js.map +1 -1
  548. package/lib/esm/curve/Arc3d.d.ts +17 -3
  549. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  550. package/lib/esm/curve/Arc3d.js +50 -21
  551. package/lib/esm/curve/Arc3d.js.map +1 -1
  552. package/lib/esm/curve/ConstructCurveBetweenCurves.js +3 -0
  553. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  554. package/lib/esm/curve/CoordinateXYZ.js +3 -2
  555. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  556. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +0 -2
  557. package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
  558. package/lib/esm/curve/CurveChainWithDistanceIndex.js +25 -10
  559. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  560. package/lib/esm/curve/CurveCollection.d.ts +10 -0
  561. package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
  562. package/lib/esm/curve/CurveCollection.js +35 -9
  563. package/lib/esm/curve/CurveCollection.js.map +1 -1
  564. package/lib/esm/curve/CurveFactory.d.ts +87 -53
  565. package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
  566. package/lib/esm/curve/CurveFactory.js +213 -135
  567. package/lib/esm/curve/CurveFactory.js.map +1 -1
  568. package/lib/esm/curve/CurveLocationDetail.js +44 -0
  569. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  570. package/lib/esm/curve/CurvePrimitive.d.ts +7 -10
  571. package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
  572. package/lib/esm/curve/CurvePrimitive.js +27 -12
  573. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  574. package/lib/esm/curve/CurveProcessor.js +2 -0
  575. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  576. package/lib/esm/curve/CurveWireMomentsXYZ.js +2 -0
  577. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  578. package/lib/esm/curve/LineSegment3d.js +6 -2
  579. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  580. package/lib/esm/curve/LineString3d.js +27 -7
  581. package/lib/esm/curve/LineString3d.js.map +1 -1
  582. package/lib/esm/curve/Loop.js +12 -4
  583. package/lib/esm/curve/Loop.js.map +1 -1
  584. package/lib/esm/curve/OffsetOptions.js +25 -21
  585. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  586. package/lib/esm/curve/ParityRegion.js +4 -2
  587. package/lib/esm/curve/ParityRegion.js.map +1 -1
  588. package/lib/esm/curve/Path.js +2 -2
  589. package/lib/esm/curve/Path.js.map +1 -1
  590. package/lib/esm/curve/PointString3d.js +3 -2
  591. package/lib/esm/curve/PointString3d.js.map +1 -1
  592. package/lib/esm/curve/ProxyCurve.js +1 -0
  593. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  594. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +1 -0
  595. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  596. package/lib/esm/curve/Query/CurveSplitContext.js +3 -0
  597. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  598. package/lib/esm/curve/Query/CylindricalRange.js +6 -2
  599. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  600. package/lib/esm/curve/Query/PlanarSubdivision.js +4 -6
  601. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  602. package/lib/esm/curve/Query/StrokeCountChain.js +12 -0
  603. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  604. package/lib/esm/curve/Query/StrokeCountMap.js +14 -0
  605. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  606. package/lib/esm/curve/RegionMomentsXY.js +4 -5
  607. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  608. package/lib/esm/curve/RegionOps.js +9 -10
  609. package/lib/esm/curve/RegionOps.js.map +1 -1
  610. package/lib/esm/curve/RegionOpsClassificationSweeps.js +24 -1
  611. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  612. package/lib/esm/curve/StrokeOptions.d.ts +4 -4
  613. package/lib/esm/curve/StrokeOptions.d.ts.map +1 -1
  614. package/lib/esm/curve/StrokeOptions.js +23 -6
  615. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  616. package/lib/esm/curve/UnionRegion.js +4 -2
  617. package/lib/esm/curve/UnionRegion.js.map +1 -1
  618. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js +13 -7
  619. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  620. package/lib/esm/curve/internalContexts/ChainCollectorContext.js +6 -0
  621. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  622. package/lib/esm/curve/internalContexts/CloneCurvesContext.js +2 -0
  623. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  624. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +13 -5
  625. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  626. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js +3 -0
  627. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  628. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +18 -5
  629. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  630. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +26 -13
  631. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  632. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js +11 -5
  633. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  634. package/lib/esm/curve/internalContexts/CurveLengthContext.js +6 -0
  635. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  636. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js +8 -6
  637. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  638. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js +38 -5
  639. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  640. package/lib/esm/curve/internalContexts/GapSearchContext.js +1 -0
  641. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  642. package/lib/esm/curve/internalContexts/MultiChainCollector.js +12 -0
  643. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  644. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js +1 -0
  645. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  646. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js +7 -0
  647. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  648. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +22 -4
  649. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  650. package/lib/esm/curve/internalContexts/SumLengthsContext.js +1 -0
  651. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  652. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js +3 -0
  653. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  654. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js +2 -0
  655. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  656. package/lib/esm/curve/spiral/ClothoidSeries.js +4 -0
  657. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  658. package/lib/esm/curve/spiral/CubicEvaluator.js +2 -0
  659. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  660. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js +4 -0
  661. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  662. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js +5 -0
  663. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  664. package/lib/esm/curve/spiral/DirectSpiral3d.js +12 -2
  665. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  666. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +24 -4
  667. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  668. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +2 -0
  669. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  670. package/lib/esm/curve/spiral/NormalizedTransition.js +5 -0
  671. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  672. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js +2 -0
  673. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  674. package/lib/esm/curve/spiral/TransitionConditionalProperties.js +10 -0
  675. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  676. package/lib/esm/curve/spiral/TransitionSpiral3d.js +10 -0
  677. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  678. package/lib/esm/curve/spiral/XYCurveEvaluator.js +6 -0
  679. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  680. package/lib/esm/geometry3d/Angle.js +18 -16
  681. package/lib/esm/geometry3d/Angle.js.map +1 -1
  682. package/lib/esm/geometry3d/AngleSweep.d.ts +7 -2
  683. package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
  684. package/lib/esm/geometry3d/AngleSweep.js +14 -2
  685. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  686. package/lib/esm/geometry3d/BarycentricTriangle.js +25 -0
  687. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  688. package/lib/esm/geometry3d/BilinearPatch.js +8 -0
  689. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  690. package/lib/esm/geometry3d/CoincidentGeometryOps.js +5 -0
  691. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  692. package/lib/esm/geometry3d/Ellipsoid.js +48 -0
  693. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  694. package/lib/esm/geometry3d/FrameBuilder.js +12 -4
  695. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  696. package/lib/esm/geometry3d/FrustumAnimation.js +7 -0
  697. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  698. package/lib/esm/geometry3d/GrowableBlockedArray.js +12 -0
  699. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  700. package/lib/esm/geometry3d/GrowableFloat64Array.js +3 -0
  701. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  702. package/lib/esm/geometry3d/GrowableXYArray.d.ts +0 -5
  703. package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
  704. package/lib/esm/geometry3d/GrowableXYArray.js +16 -7
  705. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  706. package/lib/esm/geometry3d/GrowableXYZArray.d.ts +32 -10
  707. package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
  708. package/lib/esm/geometry3d/GrowableXYZArray.js +70 -16
  709. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  710. package/lib/esm/geometry3d/IndexedCollectionInterval.js +6 -0
  711. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  712. package/lib/esm/geometry3d/IndexedXYCollection.js +1 -0
  713. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  714. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +13 -2
  715. package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
  716. package/lib/esm/geometry3d/IndexedXYZCollection.js +26 -11
  717. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  718. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js +3 -0
  719. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  720. package/lib/esm/geometry3d/Matrix3d.d.ts +3 -4
  721. package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
  722. package/lib/esm/geometry3d/Matrix3d.js +36 -14
  723. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  724. package/lib/esm/geometry3d/OrderedRotationAngles.js +10 -2
  725. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  726. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +2 -0
  727. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  728. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js +7 -0
  729. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  730. package/lib/esm/geometry3d/Point2dArrayCarrier.js +2 -0
  731. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  732. package/lib/esm/geometry3d/Point2dVector2d.js +4 -0
  733. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  734. package/lib/esm/geometry3d/Point3dArrayCarrier.js +3 -1
  735. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  736. package/lib/esm/geometry3d/Point3dVector3d.d.ts +7 -10
  737. package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
  738. package/lib/esm/geometry3d/Point3dVector3d.js +16 -10
  739. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  740. package/lib/esm/geometry3d/PointHelpers.d.ts +4 -4
  741. package/lib/esm/geometry3d/PointHelpers.d.ts.map +1 -1
  742. package/lib/esm/geometry3d/PointHelpers.js +8 -8
  743. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  744. package/lib/esm/geometry3d/PointStreaming.js +12 -4
  745. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  746. package/lib/esm/geometry3d/PolygonOps.d.ts +2 -2
  747. package/lib/esm/geometry3d/PolygonOps.js +62 -25
  748. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  749. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +7 -3
  750. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  751. package/lib/esm/geometry3d/PolylineOps.d.ts +9 -5
  752. package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
  753. package/lib/esm/geometry3d/PolylineOps.js +12 -5
  754. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  755. package/lib/esm/geometry3d/Range.js +21 -4
  756. package/lib/esm/geometry3d/Range.js.map +1 -1
  757. package/lib/esm/geometry3d/Ray2d.js +2 -0
  758. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  759. package/lib/esm/geometry3d/Ray3d.d.ts +2 -2
  760. package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
  761. package/lib/esm/geometry3d/Ray3d.js +20 -11
  762. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  763. package/lib/esm/geometry3d/ReusableObjectCache.js +4 -0
  764. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  765. package/lib/esm/geometry3d/Segment1d.js +4 -0
  766. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  767. package/lib/esm/geometry3d/SortablePolygon.js +11 -0
  768. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  769. package/lib/esm/geometry3d/Transform.d.ts +1 -1
  770. package/lib/esm/geometry3d/Transform.js +4 -1
  771. package/lib/esm/geometry3d/Transform.js.map +1 -1
  772. package/lib/esm/geometry3d/YawPitchRollAngles.js +6 -0
  773. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  774. package/lib/esm/geometry4d/Map4d.js +2 -0
  775. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  776. package/lib/esm/geometry4d/Matrix4d.js +1 -0
  777. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  778. package/lib/esm/geometry4d/MomentData.d.ts +72 -73
  779. package/lib/esm/geometry4d/MomentData.d.ts.map +1 -1
  780. package/lib/esm/geometry4d/MomentData.js +90 -66
  781. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  782. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js +6 -0
  783. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  784. package/lib/esm/geometry4d/Point4d.js +2 -0
  785. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  786. package/lib/esm/numerics/BezierPolynomials.js +8 -0
  787. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  788. package/lib/esm/numerics/ClusterableArray.js +29 -13
  789. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  790. package/lib/esm/numerics/Complex.js +2 -0
  791. package/lib/esm/numerics/Complex.js.map +1 -1
  792. package/lib/esm/numerics/ConvexPolygon2d.js +3 -0
  793. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  794. package/lib/esm/numerics/Newton.js +59 -4
  795. package/lib/esm/numerics/Newton.js.map +1 -1
  796. package/lib/esm/numerics/PascalCoefficients.js +1 -1
  797. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  798. package/lib/esm/numerics/PolarData.js +13 -1
  799. package/lib/esm/numerics/PolarData.js.map +1 -1
  800. package/lib/esm/numerics/Polynomials.js +64 -26
  801. package/lib/esm/numerics/Polynomials.js.map +1 -1
  802. package/lib/esm/numerics/Quadrature.js +26 -20
  803. package/lib/esm/numerics/Quadrature.js.map +1 -1
  804. package/lib/esm/numerics/TriDiagonalSystem.js +11 -0
  805. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  806. package/lib/esm/numerics/UnionFind.js +1 -0
  807. package/lib/esm/numerics/UnionFind.js.map +1 -1
  808. package/lib/esm/numerics/UsageSums.js +10 -0
  809. package/lib/esm/numerics/UsageSums.js.map +1 -1
  810. package/lib/esm/polyface/AuxData.js +16 -0
  811. package/lib/esm/polyface/AuxData.js.map +1 -1
  812. package/lib/esm/polyface/BoxTopology.js +67 -67
  813. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  814. package/lib/esm/polyface/FacetFaceData.d.ts +1 -1
  815. package/lib/esm/polyface/FacetFaceData.js +3 -1
  816. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  817. package/lib/esm/polyface/FacetLocationDetail.js +30 -0
  818. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  819. package/lib/esm/polyface/FacetOrientation.js +12 -1
  820. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  821. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +18 -2
  822. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  823. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts +33 -23
  824. package/lib/esm/polyface/IndexedEdgeMatcher.d.ts.map +1 -1
  825. package/lib/esm/polyface/IndexedEdgeMatcher.js +63 -33
  826. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  827. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts +3 -2
  828. package/lib/esm/polyface/IndexedPolyfaceVisitor.d.ts.map +1 -1
  829. package/lib/esm/polyface/IndexedPolyfaceVisitor.js +11 -2
  830. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  831. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts +233 -0
  832. package/lib/esm/polyface/IndexedPolyfaceWalker.d.ts.map +1 -0
  833. package/lib/esm/polyface/IndexedPolyfaceWalker.js +349 -0
  834. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -0
  835. package/lib/esm/polyface/Polyface.d.ts +35 -10
  836. package/lib/esm/polyface/Polyface.d.ts.map +1 -1
  837. package/lib/esm/polyface/Polyface.js +73 -12
  838. package/lib/esm/polyface/Polyface.js.map +1 -1
  839. package/lib/esm/polyface/PolyfaceBuilder.d.ts +14 -27
  840. package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
  841. package/lib/esm/polyface/PolyfaceBuilder.js +48 -80
  842. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  843. package/lib/esm/polyface/PolyfaceClip.js +8 -0
  844. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  845. package/lib/esm/polyface/PolyfaceData.d.ts +28 -0
  846. package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
  847. package/lib/esm/polyface/PolyfaceData.js +87 -5
  848. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  849. package/lib/esm/polyface/PolyfaceQuery.js +47 -7
  850. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  851. package/lib/esm/polyface/RangeLengthData.js +7 -0
  852. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  853. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js +12 -0
  854. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  855. package/lib/esm/polyface/RangeTree/MinimumValueTester.js +5 -2
  856. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  857. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +12 -0
  858. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  859. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +14 -0
  860. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  861. package/lib/esm/polyface/RangeTree/RangeTreeNode.js +5 -0
  862. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  863. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +43 -0
  864. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  865. package/lib/esm/polyface/TaggedNumericData.js +8 -0
  866. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  867. package/lib/esm/polyface/TriangleCandidate.js +3 -0
  868. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  869. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js +7 -0
  870. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  871. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js +6 -0
  872. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  873. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js +3 -0
  874. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  875. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js +3 -0
  876. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  877. package/lib/esm/polyface/multiclip/OffsetMeshContext.js +32 -0
  878. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  879. package/lib/esm/polyface/multiclip/RangeSearch.js +5 -5
  880. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  881. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +21 -8
  882. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  883. package/lib/esm/polyface/multiclip/XYPointBuckets.js +6 -0
  884. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  885. package/lib/esm/serialization/BGFBAccessors.js +82 -164
  886. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  887. package/lib/esm/serialization/BGFBReader.js +22 -22
  888. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  889. package/lib/esm/serialization/BGFBWriter.js +1 -0
  890. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  891. package/lib/esm/serialization/DeepCompare.js +17 -17
  892. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  893. package/lib/esm/serialization/GeometrySamples.d.ts +5 -5
  894. package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
  895. package/lib/esm/serialization/GeometrySamples.js +113 -112
  896. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  897. package/lib/esm/serialization/IModelJsonSchema.d.ts +70 -63
  898. package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
  899. package/lib/esm/serialization/IModelJsonSchema.js +87 -74
  900. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  901. package/lib/esm/solid/Box.js +7 -2
  902. package/lib/esm/solid/Box.js.map +1 -1
  903. package/lib/esm/solid/Cone.d.ts +39 -14
  904. package/lib/esm/solid/Cone.d.ts.map +1 -1
  905. package/lib/esm/solid/Cone.js +53 -17
  906. package/lib/esm/solid/Cone.js.map +1 -1
  907. package/lib/esm/solid/LinearSweep.js +4 -2
  908. package/lib/esm/solid/LinearSweep.js.map +1 -1
  909. package/lib/esm/solid/RotationalSweep.js +5 -2
  910. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  911. package/lib/esm/solid/RuledSweep.d.ts +26 -23
  912. package/lib/esm/solid/RuledSweep.d.ts.map +1 -1
  913. package/lib/esm/solid/RuledSweep.js +32 -24
  914. package/lib/esm/solid/RuledSweep.js.map +1 -1
  915. package/lib/esm/solid/SolidPrimitive.d.ts +12 -11
  916. package/lib/esm/solid/SolidPrimitive.d.ts.map +1 -1
  917. package/lib/esm/solid/SolidPrimitive.js +11 -6
  918. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  919. package/lib/esm/solid/Sphere.d.ts +34 -17
  920. package/lib/esm/solid/Sphere.d.ts.map +1 -1
  921. package/lib/esm/solid/Sphere.js +52 -25
  922. package/lib/esm/solid/Sphere.js.map +1 -1
  923. package/lib/esm/solid/SweepContour.d.ts +24 -15
  924. package/lib/esm/solid/SweepContour.d.ts.map +1 -1
  925. package/lib/esm/solid/SweepContour.js +33 -15
  926. package/lib/esm/solid/SweepContour.js.map +1 -1
  927. package/lib/esm/solid/TorusPipe.js +7 -2
  928. package/lib/esm/solid/TorusPipe.js.map +1 -1
  929. package/lib/esm/topology/ChainMerge.js +16 -4
  930. package/lib/esm/topology/ChainMerge.js.map +1 -1
  931. package/lib/esm/topology/Graph.js +41 -6
  932. package/lib/esm/topology/Graph.js.map +1 -1
  933. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +1 -1
  934. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +5 -1
  935. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  936. package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -0
  937. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  938. package/lib/esm/topology/HalfEdgeGraphSpineContext.js +9 -2
  939. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  940. package/lib/esm/topology/HalfEdgeGraphValidation.js +7 -9
  941. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  942. package/lib/esm/topology/HalfEdgeMarkSet.js +5 -0
  943. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  944. package/lib/esm/topology/HalfEdgeNodeXYZUV.js +6 -0
  945. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  946. package/lib/esm/topology/HalfEdgePointInGraphSearch.js +1 -0
  947. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  948. package/lib/esm/topology/HalfEdgePositionDetail.js +16 -0
  949. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  950. package/lib/esm/topology/HalfEdgePriorityQueue.js +2 -0
  951. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  952. package/lib/esm/topology/InsertAndRetriangulateContext.js +4 -0
  953. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  954. package/lib/esm/topology/MaskManager.js +3 -0
  955. package/lib/esm/topology/MaskManager.js.map +1 -1
  956. package/lib/esm/topology/Merging.js +11 -6
  957. package/lib/esm/topology/Merging.js.map +1 -1
  958. package/lib/esm/topology/RegularizeFace.js +22 -0
  959. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  960. package/lib/esm/topology/SignedDataSummary.js +22 -0
  961. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  962. package/lib/esm/topology/Triangulation.js +21 -11
  963. package/lib/esm/topology/Triangulation.js.map +1 -1
  964. package/lib/esm/topology/XYParitySearchContext.js +13 -0
  965. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  966. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"SortablePolygon.js","sourceRoot":"","sources":["../../../src/geometry3d/SortablePolygon.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\nimport { AnyRegion } from \"../curve/CurveTypes\";\nimport { CurveChain } from \"../curve/CurveCollection\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { ParityRegion } from \"../curve/ParityRegion\";\nimport { RegionOps } from \"../curve/RegionOps\";\nimport { UnionRegion } from \"../curve/UnionRegion\";\nimport { IndexedReadWriteXYZCollection, IndexedXYZCollection } from \"./IndexedXYZCollection\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { PolygonOps } from \"./PolygonOps\";\nimport { Range3d } from \"./Range\";\nimport { XAndY } from \"./XYZProps\";\n\n/** abstract base class for area-related queries of a loop.\n * * subclasses have particular logic for `Loop` and polygon data.\n * @internal\n */\nabstract class SimpleRegionCarrier {\n public abstract classifyPointXY(xy: XAndY): number | undefined;\n // Find any point on an edge.\n // evaluate tangent.\n // move to left or right according to signedArea, producing an interior point for the loop.\n public abstract getAnyInteriorPoint(): Point3d | undefined;\n /**\n * * grab the loop formatted as a simple polygon.\n * * stroke if necessary.\n */\n public abstract grabPolygon(): IndexedReadWriteXYZCollection | undefined;\n /**\n * * grab the loop formatted as a strongly typed loop object\n */\n public abstract grabLoop(): Loop | undefined;\n /**\n * (Property access) Return the signed area of the loop\n */\n public abstract get signedArea(): number;\n /**\n * If the current `signedArea` has different sign versus `targetSign`, reverse the loop in place.\n */\n public abstract reverseForAreaSign(targetSign: number): void;\n}\n/**\n * Implement `LoopCarrier` queries with the area as a polygon carried in an `IndexedReadWriteXYZCollection`\n */\nclass PolygonCarrier extends SimpleRegionCarrier {\n public data: IndexedReadWriteXYZCollection;\n private _signedArea: number;\n public get signedArea(): number { return this._signedArea; }\n public constructor(data: IndexedReadWriteXYZCollection) {\n super();\n this.data = data;\n this._signedArea = PolygonOps.areaXY(data);\n }\n /**\n * classify xy parts of point wrt this loop.\n * @param xy\n * @internal\n */\n public classifyPointXY(xy: XAndY): number | undefined {\n return PolygonOps.classifyPointInPolygonXY(xy.x, xy.y, this.data);\n }\n /** Return some point \"inside\"\n * NEEDS WORK: this returns a point ON --\n */\n public getAnyInteriorPoint(): Point3d | undefined {\n for (let childIndex = 0; childIndex < this.data.length; childIndex++) {\n const q = this.constructInteriorPointNearEdge(childIndex, 0.2349);\n if (q !== undefined)\n return q;\n }\n return undefined;\n }\n public grabPolygon(): IndexedReadWriteXYZCollection | undefined { return this.data; }\n public grabLoop(): Loop | undefined {\n return Loop.createPolygon(this.data);\n }\n public reverseForAreaSign(targetSign: number) {\n if (targetSign * this._signedArea < 0.0) {\n this.data.reverseInPlace();\n this._signedArea *= -1.0;\n }\n }\n public constructInteriorPointNearEdge(edgeIndex: number, fractionAlong: number): Point3d | undefined {\n if (edgeIndex + 1 < this.data.length) {\n const point0 = this.data.getPoint3dAtUncheckedPointIndex(edgeIndex);\n const point1 = this.data.getPoint3dAtUncheckedPointIndex(edgeIndex + 1);\n const vector = point0.vectorTo(point1);\n const point = point0.interpolate(fractionAlong, point1);\n vector.rotate90CCWXY(vector);\n if (vector.normalizeInPlace()) {\n if (this._signedArea < 0)\n vector.scaleInPlace(-1.0);\n const refDistance = Math.sqrt(Math.abs(this._signedArea));\n for (let fraction = 1.0e-5; fraction < 3; fraction *= 5.0) {\n const candidatePoint = point.plusScaled(vector, fraction * refDistance);\n if (1 === this.classifyPointXY(candidatePoint))\n return candidatePoint;\n }\n }\n }\n return undefined;\n }\n\n}\n/**\n * Implement `LoopCarrier` queries with the area as a strongly typed `Loop`\n */\nclass LoopCarrier extends SimpleRegionCarrier {\n public data: Loop;\n private _signedArea: number;\n public get signedArea(): number { return this._signedArea; }\n public constructor(data: Loop) {\n super();\n this.data = data;\n const areaMoments = RegionOps.computeXYAreaMoments(data);\n this._signedArea = areaMoments !== undefined ? areaMoments.quantitySum : 0.0;\n }\n /**\n * classify xy parts of point wrt this loop.\n * @param xy\n * @internal\n */\n public classifyPointXY(xy: XAndY): number | undefined {\n return RegionOps.testPointInOnOutRegionXY(this.data, xy.x, xy.y);\n }\n public constructInteriorPointNearChild(childIndex: number, fractionAlong: number): Point3d | undefined {\n if (childIndex < this.data.children.length) {\n const primitive = this.data.children[childIndex];\n const ray = primitive.fractionToPointAndUnitTangent(fractionAlong);\n ray.direction.rotate90CCWXY(ray.direction);\n if (this._signedArea < 0.0)\n ray.direction.scaleInPlace(-1.0);\n const refDistance = Math.sqrt(Math.abs(this._signedArea));\n for (let fraction = 1.0e-5; fraction < 3; fraction *= 5.0) {\n const candidatePoint = ray.fractionToPoint(fraction * refDistance);\n if (1 === this.classifyPointXY(candidatePoint))\n return candidatePoint;\n }\n }\n return undefined;\n }\n /** Return some point \"inside\"\n * NEEDS WORK: this returns a point ON --\n */\n public getAnyInteriorPoint(): Point3d | undefined {\n for (let childIndex = 0; childIndex < this.data.children.length; childIndex++) {\n const q = this.constructInteriorPointNearChild(childIndex, 0.2349);\n if (q !== undefined)\n return q;\n }\n return undefined;\n }\n public grabPolygon(): IndexedReadWriteXYZCollection | undefined {\n const strokes = this.data.cloneStroked();\n if (strokes instanceof CurveChain) {\n const linestring = LineString3d.create();\n for (const child of strokes.children) {\n if (child instanceof CurvePrimitive) {\n child.emitStrokes(linestring);\n }\n }\n return linestring.numPoints() > 0 ? linestring.packedPoints : undefined;\n }\n return undefined;\n }\n public grabLoop(): Loop | undefined {\n return this.data;\n }\n public reverseForAreaSign(targetSign: number) {\n if (targetSign * this._signedArea < 0.0) {\n this.data.reverseChildrenInPlace();\n this._signedArea *= -1.0;\n }\n }\n}\n\n/**\n * A `SortablePolygon` carries a (single) loop with data useful for sorting for inner-outer structure.\n * @internal\n */\nexport class SortablePolygon {\n private _loopCarrier: SimpleRegionCarrier;\n public anyPoint?: Point3d;\n public sortKey: number;\n public range: Range3d;\n public parentIndex?: number;\n public isHole: boolean;\n public outputSetIndex?: number;\n /**\n *\n * @param loop Loop to capture.\n */\n public constructor(loop: IndexedReadWriteXYZCollection | Loop, range: Range3d) {\n if (loop instanceof IndexedReadWriteXYZCollection)\n this._loopCarrier = new PolygonCarrier(loop);\n else\n this._loopCarrier = new LoopCarrier(loop);\n this.range = range;\n this.sortKey = Math.abs(this._loopCarrier.signedArea);\n this.isHole = false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n public static pushPolygon(loops: SortablePolygon[], loop: IndexedReadWriteXYZCollection): boolean {\n const range = loop.getRange();\n const sortablePolygon = new SortablePolygon(loop, range);\n if (sortablePolygon.sortKey > 0.0) {\n loops.push(sortablePolygon);\n return true;\n }\n return false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n public static pushLoop(loops: SortablePolygon[], loop: Loop): boolean {\n const range = loop.range();\n const sortablePolygon = new SortablePolygon(loop, range);\n if (sortablePolygon.sortKey > 0.0) {\n loops.push(sortablePolygon);\n return true;\n }\n return false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n private static assignParentsAndDepth(loops: SortablePolygon[]): void {\n // Sort largest to smallest ...\n loops.sort((loopA: SortablePolygon, loopB: SortablePolygon) => (loopB.sortKey - loopA.sortKey));\n // starting with smallest loop, point each loop to smallest containing parent.\n for (let i = loops.length; i-- > 0;) {\n const thisLoop = loops[i];\n const xy = thisLoop._loopCarrier.getAnyInteriorPoint();\n if (xy !== undefined) {\n // find smallest containing parent (search forward only to hit)\n loops[i].parentIndex = undefined;\n loops[i].outputSetIndex = undefined;\n for (let j = i; j-- > 0;) {\n const otherLoop = loops[j];\n if (otherLoop.range.containsXY(xy.x, xy.y)) {\n if (1 === otherLoop._loopCarrier.classifyPointXY(xy)) {\n thisLoop.parentIndex = j;\n // The loops are searched from small area to larger. Any other containing loop is larger, so otherLoop must be the smallest.\n break;\n }\n }\n }\n }\n }\n }\n\n private static assemblePolygonSet(loops: SortablePolygon[]): IndexedReadWriteXYZCollection[][] {\n const outputSets: IndexedReadWriteXYZCollection[][] = [];\n\n // In large-to-small order:\n // If a loop has no parent or has a \"hole\" as parent it is outer.\n // otherwise (i.e. it has a non-hole parent) it becomes a hole in the parent.\n for (const loopData of loops) {\n loopData.isHole = false;\n const parentIndex = loopData.parentIndex;\n if (parentIndex !== undefined)\n loopData.isHole = !loops[parentIndex].isHole;\n if (!loopData.isHole) {\n loopData._loopCarrier.reverseForAreaSign(1.0);\n loopData.outputSetIndex = outputSets.length;\n outputSets.push([]);\n outputSets[loopData.outputSetIndex].push(loopData._loopCarrier.grabPolygon()!);\n } else {\n loopData._loopCarrier.reverseForAreaSign(-1.0);\n const outputSetIndex = loops[parentIndex!].outputSetIndex!;\n outputSets[outputSetIndex].push(loopData._loopCarrier.grabPolygon()!);\n }\n }\n return outputSets;\n }\n private static assembleLoopSet(loops: SortablePolygon[]): AnyRegion[] {\n const outputSets: AnyRegion[] = [];\n const numLoops = loops.length;\n // In large-to-small order:\n // If a loop has no parent or has a \"hole\" as parent it is outer.\n // otherwise (i.e. it has a non-hole parent) it becomes a hole in the parent.\n for (let candidateIndex = 0; candidateIndex < numLoops; candidateIndex++) {\n const candidateData = loops[candidateIndex];\n const parentIndex = candidateData.parentIndex;\n candidateData.isHole = parentIndex !== undefined ? !loops[parentIndex].isHole : false;\n\n if (!candidateData.isHole) {\n candidateData._loopCarrier.reverseForAreaSign(1.0);\n const candidateLoop = candidateData._loopCarrier.grabLoop()!;\n let candidateParityRegion: ParityRegion | undefined;\n // find all directly contained children . . .\n for (let childIndex = candidateIndex + 1; childIndex < numLoops; childIndex++) {\n const childData = loops[childIndex];\n if (childData.parentIndex === candidateIndex) {\n if (candidateParityRegion === undefined) {\n candidateParityRegion = ParityRegion.create();\n candidateParityRegion.tryAddChild(candidateLoop);\n childData._loopCarrier.reverseForAreaSign(-1.0);\n candidateParityRegion.tryAddChild(childData._loopCarrier.grabLoop());\n } else {\n childData._loopCarrier.reverseForAreaSign(-1.0);\n candidateParityRegion.tryAddChild(childData._loopCarrier.grabLoop());\n }\n }\n }\n if (candidateParityRegion !== undefined)\n outputSets.push(candidateParityRegion);\n else if (candidateLoop !== undefined)\n outputSets.push(candidateLoop);\n }\n }\n return outputSets;\n }\n\n public static sortAsAnyRegion(loops: SortablePolygon[]): AnyRegion {\n this.assignParentsAndDepth(loops);\n const regions = this.assembleLoopSet(loops);\n if (regions.length === 1)\n return regions[0];\n else {\n const unionRegion = UnionRegion.create();\n for (const region of regions)\n unionRegion.tryAddChild(region);\n return unionRegion;\n }\n }\n public static sortAsArrayOfArrayOfPolygons(loops: SortablePolygon[]): IndexedReadWriteXYZCollection[][] {\n this.assignParentsAndDepth(loops);\n return this.assemblePolygonSet(loops);\n }\n public grabPolygon(): IndexedXYZCollection | undefined {\n return this._loopCarrier.grabPolygon();\n }\n public grabLoop(): Loop | undefined {\n return this._loopCarrier.grabLoop();\n }\n public reverseForAreaSign(targetSign: number) {\n this._loopCarrier.reverseForAreaSign(targetSign);\n }\n public getAnyInteriorPoint(): Point3d | undefined {\n return this._loopCarrier.getAnyInteriorPoint();\n }\n}\n"]}
1
+ {"version":3,"file":"SortablePolygon.js","sourceRoot":"","sources":["../../../src/geometry3d/SortablePolygon.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\nimport { AnyRegion } from \"../curve/CurveTypes\";\nimport { CurveChain } from \"../curve/CurveCollection\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { Loop } from \"../curve/Loop\";\nimport { ParityRegion } from \"../curve/ParityRegion\";\nimport { RegionOps } from \"../curve/RegionOps\";\nimport { UnionRegion } from \"../curve/UnionRegion\";\nimport { IndexedReadWriteXYZCollection, IndexedXYZCollection } from \"./IndexedXYZCollection\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { PolygonOps } from \"./PolygonOps\";\nimport { Range3d } from \"./Range\";\nimport { XAndY } from \"./XYZProps\";\n\n/** abstract base class for area-related queries of a loop.\n * * subclasses have particular logic for `Loop` and polygon data.\n * @internal\n */\nabstract class SimpleRegionCarrier {\n public abstract classifyPointXY(xy: XAndY): number | undefined;\n // Find any point on an edge.\n // evaluate tangent.\n // move to left or right according to signedArea, producing an interior point for the loop.\n public abstract getAnyInteriorPoint(): Point3d | undefined;\n /**\n * * grab the loop formatted as a simple polygon.\n * * stroke if necessary.\n */\n public abstract grabPolygon(): IndexedReadWriteXYZCollection | undefined;\n /**\n * * grab the loop formatted as a strongly typed loop object\n */\n public abstract grabLoop(): Loop | undefined;\n /**\n * (Property access) Return the signed area of the loop\n */\n public abstract get signedArea(): number;\n /**\n * If the current `signedArea` has different sign versus `targetSign`, reverse the loop in place.\n */\n public abstract reverseForAreaSign(targetSign: number): void;\n}\n/**\n * Implement `LoopCarrier` queries with the area as a polygon carried in an `IndexedReadWriteXYZCollection`\n */\nclass PolygonCarrier extends SimpleRegionCarrier {\n public data: IndexedReadWriteXYZCollection;\n private _signedArea: number;\n public get signedArea(): number { return this._signedArea; }\n public constructor(data: IndexedReadWriteXYZCollection) {\n super();\n this.data = data;\n this._signedArea = PolygonOps.areaXY(data);\n }\n /**\n * classify xy parts of point wrt this loop.\n * @param xy\n * @internal\n */\n public classifyPointXY(xy: XAndY): number | undefined {\n return PolygonOps.classifyPointInPolygonXY(xy.x, xy.y, this.data);\n }\n /** Return some point \"inside\"\n * NEEDS WORK: this returns a point ON --\n */\n public getAnyInteriorPoint(): Point3d | undefined {\n for (let childIndex = 0; childIndex < this.data.length; childIndex++) {\n const q = this.constructInteriorPointNearEdge(childIndex, 0.2349);\n if (q !== undefined)\n return q;\n }\n return undefined;\n }\n public grabPolygon(): IndexedReadWriteXYZCollection | undefined { return this.data; }\n public grabLoop(): Loop | undefined {\n return Loop.createPolygon(this.data);\n }\n public reverseForAreaSign(targetSign: number) {\n if (targetSign * this._signedArea < 0.0) {\n this.data.reverseInPlace();\n this._signedArea *= -1.0;\n }\n }\n public constructInteriorPointNearEdge(edgeIndex: number, fractionAlong: number): Point3d | undefined {\n if (edgeIndex + 1 < this.data.length) {\n const point0 = this.data.getPoint3dAtUncheckedPointIndex(edgeIndex);\n const point1 = this.data.getPoint3dAtUncheckedPointIndex(edgeIndex + 1);\n const vector = point0.vectorTo(point1);\n const point = point0.interpolate(fractionAlong, point1);\n vector.rotate90CCWXY(vector);\n if (vector.normalizeInPlace()) {\n if (this._signedArea < 0)\n vector.scaleInPlace(-1.0);\n const refDistance = Math.sqrt(Math.abs(this._signedArea));\n for (let fraction = 1.0e-5; fraction < 3; fraction *= 5.0) {\n const candidatePoint = point.plusScaled(vector, fraction * refDistance);\n if (1 === this.classifyPointXY(candidatePoint))\n return candidatePoint;\n }\n }\n }\n return undefined;\n }\n\n}\n/**\n * Implement `LoopCarrier` queries with the area as a strongly typed `Loop`\n */\nclass LoopCarrier extends SimpleRegionCarrier {\n public data: Loop;\n private _signedArea: number;\n public get signedArea(): number { return this._signedArea; }\n public constructor(data: Loop) {\n super();\n this.data = data;\n const areaMoments = RegionOps.computeXYAreaMoments(data);\n this._signedArea = areaMoments !== undefined ? areaMoments.quantitySum : 0.0;\n }\n /**\n * classify xy parts of point wrt this loop.\n * @param xy\n * @internal\n */\n public classifyPointXY(xy: XAndY): number | undefined {\n return RegionOps.testPointInOnOutRegionXY(this.data, xy.x, xy.y);\n }\n public constructInteriorPointNearChild(childIndex: number, fractionAlong: number): Point3d | undefined {\n if (childIndex < this.data.children.length) {\n const primitive = this.data.children[childIndex];\n const ray = primitive.fractionToPointAndUnitTangent(fractionAlong);\n ray.direction.rotate90CCWXY(ray.direction);\n if (this._signedArea < 0.0)\n ray.direction.scaleInPlace(-1.0);\n const refDistance = Math.sqrt(Math.abs(this._signedArea));\n for (let fraction = 1.0e-5; fraction < 3; fraction *= 5.0) {\n const candidatePoint = ray.fractionToPoint(fraction * refDistance);\n if (1 === this.classifyPointXY(candidatePoint))\n return candidatePoint;\n }\n }\n return undefined;\n }\n /** Return some point \"inside\"\n * NEEDS WORK: this returns a point ON --\n */\n public getAnyInteriorPoint(): Point3d | undefined {\n for (let childIndex = 0; childIndex < this.data.children.length; childIndex++) {\n const q = this.constructInteriorPointNearChild(childIndex, 0.2349);\n if (q !== undefined)\n return q;\n }\n return undefined;\n }\n public grabPolygon(): IndexedReadWriteXYZCollection | undefined {\n const strokes = this.data.cloneStroked();\n if (strokes instanceof CurveChain) {\n const linestring = LineString3d.create();\n for (const child of strokes.children) {\n if (child instanceof CurvePrimitive) {\n child.emitStrokes(linestring);\n }\n }\n return linestring.numPoints() > 0 ? linestring.packedPoints : undefined;\n }\n return undefined;\n }\n public grabLoop(): Loop | undefined {\n return this.data;\n }\n public reverseForAreaSign(targetSign: number) {\n if (targetSign * this._signedArea < 0.0) {\n this.data.reverseChildrenInPlace();\n this._signedArea *= -1.0;\n }\n }\n}\n\n/**\n * A `SortablePolygon` carries a (single) loop with data useful for sorting for inner-outer structure.\n * @internal\n */\nexport class SortablePolygon {\n private _loopCarrier: SimpleRegionCarrier;\n public anyPoint?: Point3d;\n public sortKey: number;\n public range: Range3d;\n public parentIndex?: number;\n public isHole: boolean;\n public outputSetIndex?: number;\n /**\n *\n * @param loop Loop to capture.\n */\n public constructor(loop: IndexedReadWriteXYZCollection | Loop, range: Range3d) {\n if (loop instanceof IndexedReadWriteXYZCollection)\n this._loopCarrier = new PolygonCarrier(loop);\n else\n this._loopCarrier = new LoopCarrier(loop);\n this.range = range;\n this.sortKey = Math.abs(this._loopCarrier.signedArea);\n this.isHole = false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n public static pushPolygon(loops: SortablePolygon[], loop: IndexedReadWriteXYZCollection): boolean {\n const range = loop.getRange();\n const sortablePolygon = new SortablePolygon(loop, range);\n if (sortablePolygon.sortKey > 0.0) {\n loops.push(sortablePolygon);\n return true;\n }\n return false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n public static pushLoop(loops: SortablePolygon[], loop: Loop): boolean {\n const range = loop.range();\n const sortablePolygon = new SortablePolygon(loop, range);\n if (sortablePolygon.sortKey > 0.0) {\n loops.push(sortablePolygon);\n return true;\n }\n return false;\n }\n /** Push loop with sort data onto the array.\n * * No action if no clear normal.\n * * return true if pushed.\n */\n private static assignParentsAndDepth(loops: SortablePolygon[]): void {\n // Sort largest to smallest ...\n loops.sort((loopA: SortablePolygon, loopB: SortablePolygon) => (loopB.sortKey - loopA.sortKey));\n // starting with smallest loop, point each loop to smallest containing parent.\n for (let i = loops.length; i-- > 0;) {\n const thisLoop = loops[i];\n const xy = thisLoop._loopCarrier.getAnyInteriorPoint();\n if (xy !== undefined) {\n // find smallest containing parent (search forward only to hit)\n loops[i].parentIndex = undefined;\n loops[i].outputSetIndex = undefined;\n for (let j = i; j-- > 0;) {\n const otherLoop = loops[j];\n if (otherLoop.range.containsXY(xy.x, xy.y)) {\n if (1 === otherLoop._loopCarrier.classifyPointXY(xy)) {\n thisLoop.parentIndex = j;\n // The loops are searched from small area to larger. Any other containing loop is larger, so otherLoop must be the smallest.\n break;\n }\n }\n }\n }\n }\n }\n\n private static assemblePolygonSet(loops: SortablePolygon[]): IndexedReadWriteXYZCollection[][] {\n const outputSets: IndexedReadWriteXYZCollection[][] = [];\n\n // In large-to-small order:\n // If a loop has no parent or has a \"hole\" as parent it is outer.\n // otherwise (i.e. it has a non-hole parent) it becomes a hole in the parent.\n for (const loopData of loops) {\n loopData.isHole = false;\n const parentIndex = loopData.parentIndex;\n if (parentIndex !== undefined)\n loopData.isHole = !loops[parentIndex].isHole;\n if (!loopData.isHole) {\n loopData._loopCarrier.reverseForAreaSign(1.0);\n loopData.outputSetIndex = outputSets.length;\n outputSets.push([]);\n outputSets[loopData.outputSetIndex].push(loopData._loopCarrier.grabPolygon()!);\n } else {\n loopData._loopCarrier.reverseForAreaSign(-1.0);\n const outputSetIndex = loops[parentIndex!].outputSetIndex!;\n outputSets[outputSetIndex].push(loopData._loopCarrier.grabPolygon()!);\n }\n }\n return outputSets;\n }\n private static assembleLoopSet(loops: SortablePolygon[]): AnyRegion[] {\n const outputSets: AnyRegion[] = [];\n const numLoops = loops.length;\n // In large-to-small order:\n // If a loop has no parent or has a \"hole\" as parent it is outer.\n // otherwise (i.e. it has a non-hole parent) it becomes a hole in the parent.\n for (let candidateIndex = 0; candidateIndex < numLoops; candidateIndex++) {\n const candidateData = loops[candidateIndex];\n const parentIndex = candidateData.parentIndex;\n candidateData.isHole = parentIndex !== undefined ? !loops[parentIndex].isHole : false;\n\n if (!candidateData.isHole) {\n candidateData._loopCarrier.reverseForAreaSign(1.0);\n const candidateLoop = candidateData._loopCarrier.grabLoop()!;\n let candidateParityRegion: ParityRegion | undefined;\n // find all directly contained children . . .\n for (let childIndex = candidateIndex + 1; childIndex < numLoops; childIndex++) {\n const childData = loops[childIndex];\n if (childData.parentIndex === candidateIndex) {\n if (candidateParityRegion === undefined) {\n candidateParityRegion = ParityRegion.create();\n candidateParityRegion.tryAddChild(candidateLoop);\n childData._loopCarrier.reverseForAreaSign(-1.0);\n candidateParityRegion.tryAddChild(childData._loopCarrier.grabLoop());\n } else {\n childData._loopCarrier.reverseForAreaSign(-1.0);\n candidateParityRegion.tryAddChild(childData._loopCarrier.grabLoop());\n }\n }\n }\n if (candidateParityRegion !== undefined)\n outputSets.push(candidateParityRegion);\n else if (candidateLoop !== undefined)\n outputSets.push(candidateLoop);\n }\n }\n return outputSets;\n }\n\n public static sortAsAnyRegion(loops: SortablePolygon[]): AnyRegion {\n this.assignParentsAndDepth(loops);\n const regions = this.assembleLoopSet(loops);\n if (regions.length === 1)\n return regions[0];\n else {\n const unionRegion = UnionRegion.create();\n for (const region of regions)\n unionRegion.tryAddChild(region);\n return unionRegion;\n }\n }\n public static sortAsArrayOfArrayOfPolygons(loops: SortablePolygon[]): IndexedReadWriteXYZCollection[][] {\n this.assignParentsAndDepth(loops);\n return this.assemblePolygonSet(loops);\n }\n public grabPolygon(): IndexedXYZCollection | undefined {\n return this._loopCarrier.grabPolygon();\n }\n public grabLoop(): Loop | undefined {\n return this._loopCarrier.grabLoop();\n }\n public reverseForAreaSign(targetSign: number) {\n this._loopCarrier.reverseForAreaSign(targetSign);\n }\n public getAnyInteriorPoint(): Point3d | undefined {\n return this._loopCarrier.getAnyInteriorPoint();\n }\n}\n"]}
@@ -78,7 +78,7 @@ export declare class Transform implements BeJSONFunctions {
78
78
  clone(result?: Transform): Transform;
79
79
  /**
80
80
  * Return a modified copy of `this` Transform so that its `matrix` part is rigid (`origin` part is untouched).
81
- * * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.
81
+ * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.
82
82
  */
83
83
  cloneRigid(axisOrder?: AxisOrder): Transform | undefined;
84
84
  /** Create a Transform with the given `origin` and `matrix`. Inputs are captured, not cloned. */
@@ -32,11 +32,14 @@ const Range_1 = require("./Range");
32
32
  * @public
33
33
  */
34
34
  class Transform {
35
+ _origin;
36
+ _matrix;
35
37
  // Constructor accepts and uses pointer to content (no copy is done here).
36
38
  constructor(origin, matrix) {
37
39
  this._origin = origin;
38
40
  this._matrix = matrix;
39
41
  }
42
+ static _identity;
40
43
  /** The identity Transform. Value is frozen and cannot be modified. */
41
44
  static get identity() {
42
45
  if (undefined === this._identity) {
@@ -143,7 +146,7 @@ class Transform {
143
146
  }
144
147
  /**
145
148
  * Return a modified copy of `this` Transform so that its `matrix` part is rigid (`origin` part is untouched).
146
- * * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.
149
+ * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.
147
150
  */
148
151
  cloneRigid(axisOrder = Geometry_1.AxisOrder.XYZ) {
149
152
  const modifiedMatrix = Matrix3d_1.Matrix3d.createRigidFromMatrix3d(this.matrix, axisOrder);
@@ -1 +1 @@
1
- {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/geometry3d/Transform.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point2d } from \"./Point2dVector2d\";\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\nimport { Range3d } from \"./Range\";\nimport { TransformProps, XAndY, XYAndZ } from \"./XYZProps\";\n\n/**\n * A Transform consists of an origin and a Matrix3d. This describes a coordinate frame with this origin, with\n * the columns of the Matrix3d being the local x,y,z axis directions.\n * * The math for a Transform `T` consisting of a Matrix3d `M` and a Point3d `o` on a Vector3d `p` is: `Tp = M*p + o`.\n * In other words, `T` is a combination of two operations on `p`: the action of matrix multiplication, followed by a\n * translation. `Origin` is a traditional term for `o`, because `T` can be interpreted as a change of basis from the\n * global axes centered at the global origin, to a new set of axes specified by matrix M columns centered at `o`.\n * * Beware that for common transformations (e.g. scale about point, rotate around an axis) the `fixed point` that\n * is used when describing the transform is NOT the `origin` stored in the transform. Setup methods (e.g\n * createFixedPointAndMatrix, createScaleAboutPoint) take care of determining the appropriate origin coordinates.\n * * If `T` is a translation, no point is fixed by `T`.\n * * If `T` is the identity, all points are fixed by `T`.\n * * If `T` is a scale about a point, one point is fixed by `T`.\n * * If `T` is a rotation about an axis, a line is fixed by `T`.\n * * If `T` is a projection to the plane, a plane is fixed by `T`.\n * @public\n */\nexport class Transform implements BeJSONFunctions {\n private _origin: XYZ;\n private _matrix: Matrix3d;\n // Constructor accepts and uses pointer to content (no copy is done here).\n private constructor(origin: XYZ, matrix: Matrix3d) {\n this._origin = origin;\n this._matrix = matrix;\n }\n private static _identity?: Transform;\n /** The identity Transform. Value is frozen and cannot be modified. */\n public static get identity(): Transform {\n if (undefined === this._identity) {\n this._identity = Transform.createIdentity();\n this._identity.freeze();\n }\n return this._identity;\n }\n /** Freeze this instance (and its members) so it is read-only */\n public freeze(): Readonly<this> {\n this._origin.freeze();\n this._matrix.freeze();\n return Object.freeze(this);\n }\n /**\n * Copy contents from other Transform into this Transform\n * @param other source transform\n */\n public setFrom(other: Transform) {\n this._origin.setFrom(other._origin);\n this._matrix.setFrom(other._matrix);\n }\n /** Set this Transform to be an identity. */\n public setIdentity() {\n this._origin.setZero();\n this._matrix.setIdentity();\n }\n /**\n * Set this Transform instance from flexible inputs:\n * * Any object (such as another Transform or TransformProps) that has `origin` and `matrix` members\n * accepted by `Point3d.setFromJSON` and `Matrix3d.setFromJSON`\n * * An array of 3 number arrays, each with 4 entries which are rows in a 3x4 matrix.\n * * An array of 12 numbers, each block of 4 entries as a row 3x4 matrix.\n * * If no input is provided, the identity Transform is returned.\n */\n public setFromJSON(json?: TransformProps | Transform): void {\n if (json) {\n if (json instanceof Object && (json as any).origin && (json as any).matrix) {\n this._origin.setFromJSON((json as any).origin);\n this._matrix.setFromJSON((json as any).matrix);\n return;\n }\n if (Geometry.isArrayOfNumberArray(json, 3, 4)) {\n this._matrix.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 );\n this._origin.set(json[0][3], json[1][3], json[2][3]);\n return;\n }\n if (Geometry.isNumberArray(json, 12)) {\n this._matrix.setRowValues(\n json[0], json[1], json[2],\n json[4], json[5], json[6],\n json[8], json[9], json[10],\n );\n this._origin.set(json[3], json[7], json[11]);\n return;\n }\n }\n this.setIdentity();\n }\n /**\n * Test for near equality with `other` Transform. Comparison uses the `isAlmostEqual` methods on the `origin` and\n * `matrix` parts.\n * @param other Transform to compare to.\n */\n public isAlmostEqual(other: Readonly<Transform>): boolean {\n return this === other || this.origin.isAlmostEqual(other.origin) && this.matrix.isAlmostEqual(other.matrix);\n }\n /**\n * Test for near equality with `other` Transform. Comparison uses the `isAlmostEqual` methods on the `origin` part\n * and the `isAlmostEqualAllowZRotation` method on the `matrix` part.\n * @param other Transform to compare to.\n */\n public isAlmostEqualAllowZRotation(other: Transform): boolean {\n return this._origin.isAlmostEqual(other._origin) && this._matrix.isAlmostEqualAllowZRotation(other._matrix);\n }\n /**\n * Return a 3 by 4 matrix containing the rows of this Transform.\n * * The transform's origin coordinates are the last entries of the 3 json arrays\n */\n public toRows(): number[][] {\n return [\n [this._matrix.coffs[0], this._matrix.coffs[1], this._matrix.coffs[2], this._origin.x],\n [this._matrix.coffs[3], this._matrix.coffs[4], this._matrix.coffs[5], this._origin.y],\n [this._matrix.coffs[6], this._matrix.coffs[7], this._matrix.coffs[8], this._origin.z],\n ];\n }\n /**\n * Return a 3 by 4 matrix containing the rows of this Transform.\n * * The transform's origin coordinates are the last entries of the 3 json arrays\n */\n public toJSON(): TransformProps {\n return this.toRows();\n }\n /** Return a new Transform initialized by `Transform.setFromJSON` */\n public static fromJSON(json?: TransformProps): Transform {\n const result = Transform.createIdentity();\n result.setFromJSON(json);\n return result;\n }\n /** Copy the contents of `this` transform into a new Transform (or to the result, if specified). */\n public clone(result?: Transform): Transform {\n if (result) {\n result._matrix.setFrom(this._matrix);\n result._origin.setFrom(this._origin);\n return result;\n }\n return new Transform(\n Point3d.createFrom(this._origin),\n this._matrix.clone(),\n );\n }\n /**\n * Return a modified copy of `this` Transform so that its `matrix` part is rigid (`origin` part is untouched).\n * * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.\n */\n public cloneRigid(axisOrder: AxisOrder = AxisOrder.XYZ): Transform | undefined {\n const modifiedMatrix = Matrix3d.createRigidFromMatrix3d(this.matrix, axisOrder);\n if (!modifiedMatrix)\n return undefined;\n return new Transform(this.origin.cloneAsPoint3d(), modifiedMatrix);\n }\n /** Create a Transform with the given `origin` and `matrix`. Inputs are captured, not cloned. */\n public static createRefs(origin: XYZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\n if (!origin)\n origin = Point3d.createZero();\n if (result) {\n result._origin = origin;\n result._matrix = matrix;\n return result;\n }\n return new Transform(origin, matrix);\n }\n /** Create a Transform with complete contents given. `q` inputs make the matrix and `a` inputs make the origin */\n public static createRowValues(\n qxx: number, qxy: number, qxz: number, ax: number,\n qyx: number, qyy: number, qyz: number, ay: number,\n qzx: number, qzy: number, qzz: number, az: number,\n result?: Transform,\n ): Transform {\n if (result) {\n result._origin.set(ax, ay, az);\n result._matrix.setRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz);\n return result;\n }\n return new Transform(\n Point3d.create(ax, ay, az),\n Matrix3d.createRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz),\n );\n }\n /** Create a Transform with all zeros */\n public static createZero(result?: Transform): Transform {\n return Transform.createRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, result);\n }\n /**\n * Create a Transform with translation provided by x,y,z parts.\n * * Translation Transform maps any vector `v` to `v + p` where `p = (x,y,z)`\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n * @param x x part of translation\n * @param y y part of translation\n * @param z z part of translation\n * @param result optional pre-allocated Transform\n * @returns new or updated transform\n */\n public static createTranslationXYZ(x: number = 0, y: number = 0, z: number = 0, result?: Transform): Transform {\n return Transform.createRefs(Vector3d.create(x, y, z), Matrix3d.createIdentity(), result);\n }\n /**\n * Create a Transform with specified `translation` part.\n * * Translation Transform maps any vector `v` to `v + translation`\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n * @param translation x,y,z parts of the translation\n * @param result optional pre-allocated Transform\n * @returns new or updated transform\n */\n public static createTranslation(translation: XYZ, result?: Transform): Transform {\n return Transform.createRefs(translation, Matrix3d.createIdentity(), result);\n }\n /** Return a reference (and NOT a copy) to the `matrix` part of the Transform. */\n public get matrix(): Matrix3d {\n return this._matrix;\n }\n /** Return a reference (and NOT a copy) to the `origin` part of the Transform. */\n public get origin(): XYZ {\n return this._origin;\n }\n /** return a (clone of) the `origin` part of the Transform, as a `Point3d` */\n public getOrigin(): Point3d {\n return Point3d.createFrom(this._origin);\n }\n /** return a (clone of) the `origin` part of the Transform, as a `Vector3d` */\n public getTranslation(): Vector3d {\n return Vector3d.createFrom(this._origin);\n }\n /** return a (clone of) the `matrix` part of the Transform, as a `Matrix3d` */\n public getMatrix(): Matrix3d {\n return this._matrix.clone();\n }\n /** test if the transform has `origin` = (0,0,0) and identity `matrix` */\n public get isIdentity(): boolean {\n return this._matrix.isIdentity && this._origin.isAlmostZero;\n }\n /** Create an identity transform */\n public static createIdentity(result?: Transform): Transform {\n if (result) {\n result._origin.setZero();\n result._matrix.setIdentity();\n return result;\n }\n return Transform.createRefs(Point3d.createZero(), Matrix3d.createIdentity());\n }\n /**\n * Create a Transform using the given `origin` and `matrix`.\n * * This is the appropriate construction when the columns of the matrix are coordinate axes of a\n * local-to-world mapping, and the given point is the axes' origin in world coordinates.\n * * This function is closely related to `createFixedPointAndMatrix` whose point input is the fixed point\n * of the world-to-world transformation.\n * * If origin is `undefined`, (0,0,0) is used. If matrix is `undefined` the identity matrix is used.\n */\n public static createOriginAndMatrix(\n origin: XYZ | undefined, matrix: Matrix3d | undefined, result?: Transform,\n ): Transform {\n if (result) {\n result._origin.setFromPoint3d(origin);\n result._matrix.setFrom(matrix);\n return result;\n }\n return Transform.createRefs(\n origin ? origin.cloneAsPoint3d() : Point3d.createZero(),\n matrix === undefined ? Matrix3d.createIdentity() : matrix.clone(),\n result,\n );\n }\n /** Create a Transform using the given `origin` and columns of the `matrix`. If `undefined` zero is used. */\n public setOriginAndMatrixColumns(\n origin: XYZ | undefined, vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ: Vector3d | undefined,\n ): void {\n if (origin !== undefined)\n this._origin.setFrom(origin);\n this._matrix.setColumns(vectorX, vectorY, vectorZ);\n }\n /** Create a Transform using the given `origin` and columns of the `matrix` */\n public static createOriginAndMatrixColumns(\n origin: XYZ, vectorX: Vector3d, vectorY: Vector3d, vectorZ: Vector3d, result?: Transform,\n ): Transform {\n if (result)\n result.setOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\n else\n result = Transform.createRefs(Vector3d.createFrom(origin), Matrix3d.createColumns(vectorX, vectorY, vectorZ));\n return result;\n }\n /**\n * Create a Transform such that its `matrix` part is rigid.\n * @see [[Matrix3d.createRigidFromColumns]] for details of how the matrix is created to be rigid.\n */\n public static createRigidFromOriginAndColumns(\n origin: XYZ | undefined, vectorX: Vector3d, vectorY: Vector3d, axisOrder: AxisOrder, result?: Transform,\n ): Transform | undefined {\n const matrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, axisOrder, result ? result._matrix : undefined);\n if (!matrix)\n return undefined;\n if (result) {\n // result._matrix was already modified to become rigid via createRigidFromColumns\n result._origin.setFrom(origin);\n return result;\n }\n /**\n * We don't want to pass \"origin\" to createRefs because createRefs does not clone \"origin\". That means if \"origin\"\n * is changed via Transform at any point, the initial \"origin\" passed by the user is also changed. To avoid that,\n * we pass \"undefined\" to createRefs so that it allocates a new point which then we set it to the \"origin\" which\n * is passed by user in the next line.\n */\n result = Transform.createRefs(undefined, matrix);\n result._origin.setFromPoint3d(origin);\n return result;\n }\n /**\n * Create a Transform with the specified `matrix`. Compute an `origin` (different from the given `fixedPoint`)\n * so that the `fixedPoint` maps back to itself. The returned Transform, transforms a point `p` to `M*p + (f - M*f)`\n * where `f` is the fixedPoint (i.e., `Tp = M*(p-f) + f`).\n */\n public static createFixedPointAndMatrix(\n fixedPoint: XYAndZ | undefined, matrix: Matrix3d, result?: Transform,\n ): Transform {\n if (fixedPoint) {\n /**\n * if f is a fixed point, then Tf = M*f + o = f where M is the matrix and o is the origin.\n * we define the origin o = f - M*f. Therefore, Tf = Mf + o = M*f + (f - M*f) = f.\n */\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\n return Transform.createRefs(origin, matrix.clone(), result);\n }\n return Transform.createRefs(undefined, matrix.clone());\n }\n /**\n * Create a transform with the specified `matrix` and points `a` and `b`. The returned Transform maps\n * point `p` to `M*(p-a) + b` (i.e., `Tp = M*(p-a) + b`), so maps `a` to `b`.\n */\n public static createMatrixPickupPutdown(\n matrix: Matrix3d, a: Point3d, b: Point3d, result?: Transform,\n ): Transform {\n // we define the origin o = b - M*a so Tp = M*p + o = M*p + (b - M*a) = M*(p-a) + b\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(b, matrix, a);\n return Transform.createRefs(origin, matrix.clone(), result);\n }\n /**\n * Create a Transform which leaves the fixedPoint unchanged and scales everything else around it by\n * a single scale factor. The returned Transform maps a point `p` to `M*p + (f - M*f)`\n * where `f` is the fixedPoint and M is the scale matrix (i.e., `Tp = M*(p-f) + f`).\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n */\n public static createScaleAboutPoint(fixedPoint: Point3d, scale: number, result?: Transform): Transform {\n const matrix = Matrix3d.createScale(scale, scale, scale);\n /**\n * if f is a fixed point, then Tf = M*f + o = f where M is the matrix and o is the origin.\n * we define the origin o = f - M*f. Therefore, Tf = M*f + o = M*f + (f - M*f) = f.\n */\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\n return Transform.createRefs(origin, matrix, result);\n }\n /**\n * Return a transformation which flattens space onto a plane, sweeping along a direction which may be different\n * from the plane normal.\n * * See [Matrix3d.createFlattenAlongVectorToPlane] for math details.\n * @param sweepVector sweep direction. If same as `planeNormal`, the resulting transformation flattens to the plane.\n * @param planePoint any point on the plane\n * @param planeNormal vector normal to the plane.\n */\n public static createFlattenAlongVectorToPlane(sweepVector: Vector3d, planePoint: XYAndZ, planeNormal: Vector3d): Transform | undefined {\n const matrix = Matrix3d.createFlattenAlongVectorToPlane(sweepVector, planeNormal);\n if (matrix === undefined)\n return undefined;\n return Transform.createFixedPointAndMatrix(planePoint, matrix);\n }\n /**\n * Transform the input 2d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyPoint2d(point: XAndY, result?: Point2d): Point2d {\n return Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, point, result);\n }\n /**\n * Transform the input 3d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyPoint3d(point: XYAndZ, result?: Point3d): Point3d {\n // Tx = Mx + o so we return Mx + o\n return Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, result);\n }\n /**\n * Transform the input 3d point in place (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyXYAndZInPlace(point: XYAndZ): void {\n return Matrix3d.xyzPlusMatrixTimesXYZInPlace(this._origin, this._matrix, point);\n }\n /**\n * Transform the input 3d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyXYZ(x: number, y: number, z: number = 0, result?: Point3d): Point3d {\n // Tx = Mx + o so we return Mx + o\n return Matrix3d.xyzPlusMatrixTimesCoordinates(this._origin, this._matrix, x, y, z, result);\n }\n /**\n * Multiply a specific row (component) of the 3x4 instance times (x,y,z,1). Return the result.\n */\n public multiplyComponentXYZ(componentIndex: number, x: number, y: number, z: number = 0): number {\n const coffs = this._matrix.coffs;\n const idx = 3 * componentIndex;\n return this.origin.at(componentIndex) + (coffs[idx] * x) + (coffs[idx + 1] * y) + (coffs[idx + 2] * z);\n }\n /**\n * Multiply a specific row (component) of the 3x4 instance times (x,y,z,w). Return the result.\n */\n public multiplyComponentXYZW(componentIndex: number, x: number, y: number, z: number, w: number): number {\n const coffs = this._matrix.coffs;\n const idx = 3 * componentIndex;\n return (this.origin.at(componentIndex) * w) + (coffs[idx] * x) + (coffs[idx + 1] * y) + (coffs[idx + 2] * z);\n }\n /**\n * Transform the homogeneous point. Return as a new `Point4d`, or in the pre-allocated result (if result is given).\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o*w` and returns the `Point4d` formed by `Tp` in the\n * first three coordinates, and `w` in the fourth.\n * * Logically, this is multiplication by the 4x4 matrix formed from the 3x4 instance augmented with fourth row 0001.\n */\n public multiplyXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinates(this._origin, this._matrix, x, y, z, w, result);\n }\n /**\n * Transform the homogeneous point. Return as new `Float64Array` with size 4, or in the pre-allocated `result` of sufficient size.\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o*w` and returns the `Float64Array` formed by `Tp`\n * in the first 3 numbers of the array and `w` as the fourth.\n * * Logically, this is multiplication by the 4x4 matrix formed from the 3x4 instance augmented with fourth row 0001.\n */\n public multiplyXYZWToFloat64Array(x: number, y: number, z: number, w: number, result?: Float64Array): Float64Array {\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, w, result);\n }\n /**\n * * Transform the point. Return as new `Float64Array` with size 3, or in the pre-allocated `result` of sufficient size.\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o` and returns it as the first 3 elements of the array.\n */\n public multiplyXYZToFloat64Array(x: number, y: number, z: number, result?: Float64Array): Float64Array {\n return Matrix3d.xyzPlusMatrixTimesCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, result);\n }\n /**\n * Multiply the homogeneous point by the transpose of `this` Transform. Return as a new `Point4d` or in the\n * pre-allocated result (if result is given).\n * * If `p = (x,y,z)` then this method computes `M^t*p` and returns it in the first three coordinates of the `Point4d`,\n * and `o*p + w` in the fourth.\n * * Logically, this is multiplication by the transpose of the 4x4 matrix formed from the 3x4 instance augmented with\n * fourth row 0001.\n */\n public multiplyTransposeXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\n const coffs = this._matrix.coffs;\n const origin = this._origin;\n return Point4d.create(\n (x * coffs[0]) + (y * coffs[3]) + (z * coffs[6]),\n (x * coffs[1]) + (y * coffs[4]) + (z * coffs[7]),\n (x * coffs[2]) + (y * coffs[5]) + (z * coffs[8]),\n (x * origin.x) + (y * origin.y) + (z * origin.z) + w,\n result,\n );\n }\n /** For each point in the array, replace point by the transformed point (using `Tp = M*p + o`) */\n public multiplyPoint3dArrayInPlace(points: Point3d[]) {\n let point;\n for (point of points)\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, point);\n }\n /** For each point in the 2d array, replace point by the transformed point (using `Tp = M*p + o`) */\n public multiplyPoint3dArrayArrayInPlace(chains: Point3d[][]) {\n for (const chain of chains)\n this.multiplyPoint3dArrayInPlace(chain);\n }\n /**\n * Multiply the point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse`\n * Transform has matrix part `MInverse` and origin part `-MInverse*o`.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint3d(point: XYAndZ, result?: Point3d): Point3d | undefined {\n return this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - this._origin.x,\n point.y - this._origin.y,\n point.z - this._origin.z,\n result,\n );\n }\n /**\n * Multiply the homogenous point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse` Transform\n * has matrix part `MInverse` and origin part `-MInverse*o`.\n * * This method computes `TInverse p = MInverse*p - w*MInverse*o` and returns the `Point4d` formed by `TInverse*p`\n * in the first three coordinates, and `w` in the fourth.\n * * Logically, this is multiplication by the inverse of the 4x4 matrix formed from the 3x4 instance augmented with\n * fourth row 0001. This is equivalent to the 4x4 matrix formed in similar fashion from the inverse of this instance.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint4d(weightedPoint: Point4d, result?: Point4d): Point4d | undefined {\n const w = weightedPoint.w;\n return this._matrix.multiplyInverseXYZW(\n weightedPoint.x - w * this.origin.x,\n weightedPoint.y - w * this.origin.y,\n weightedPoint.z - w * this.origin.z,\n w,\n result,\n );\n }\n /**\n * Multiply the point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse` Transform\n * has matrix part `MInverse` and origin part `-MInverse*o`.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInverseXYZ(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\n return this._matrix.multiplyInverseXYZAsPoint3d(\n x - this._origin.x,\n y - this._origin.y,\n z - this._origin.z,\n result,\n );\n }\n /**\n * * Compute (if needed) the inverse of the `matrix` part of the Transform, thereby ensuring inverse\n * operations can complete.\n * @param useCached If true, accept prior cached inverse if available.\n * @returns `true` if matrix inverse completes, `false` otherwise.\n */\n public computeCachedInverse(useCached: boolean = true): boolean {\n return this._matrix.computeCachedInverse(useCached);\n }\n /**\n * Match the length of destination array with the length of source array\n * * If destination has more elements than source, remove the extra elements.\n * * If destination has fewer elements than source, use `constructionFunction` to create new elements.\n * *\n * @param source the source array\n * @param dest the destination array\n * @param constructionFunction function to call to create new elements.\n */\n public static matchArrayLengths(source: any[], dest: any[], constructionFunction: () => any): number {\n const numSource = source.length;\n const numDest = dest.length;\n if (numSource > numDest) {\n for (let i = numDest; i < numSource; i++) {\n dest.push(constructionFunction());\n }\n } else if (numDest > numSource) {\n dest.length = numSource;\n }\n return numSource;\n }\n /**\n * Multiply each point in the array by the inverse of `this` Transform.\n * * For a transform `T = [M o]` the inverse transform `T' = [M' -M'o]` exists if and only if `M` has an inverse\n * `M'`. Indeed, for any point `p`, we have `T'Tp = T'(Mp + o) = M'(Mp + o) - M'o = M'Mp + M'o - M'o = p.`\n * * If `result` is given, resize it to match the input `points` array and update it with original points `p[]`.\n * * If `result` is not given, return a new array.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint3dArray(points: Point3d[], result?: Point3d[]): Point3d[] | undefined {\n if (!this._matrix.computeCachedInverse(true))\n return undefined;\n const originX = this.origin.x;\n const originY = this.origin.y;\n const originZ = this.origin.z;\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point3d.createZero());\n for (let i = 0; i < n; i++)\n this._matrix.multiplyInverseXYZAsPoint3d(\n points[i].x - originX,\n points[i].y - originY,\n points[i].z - originZ,\n result[i],\n );\n return result;\n }\n result = [];\n for (const point of points)\n result.push(\n this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - originX,\n point.y - originY,\n point.z - originZ,\n )!,\n );\n return result;\n }\n /**\n * Multiply each point in the array by the inverse of `this` Transform in place.\n * * For a transform `T = [M o]` the inverse transform `T' = [M' -M'o]` exists if and only if `M` has an inverse\n * `M'`. Indeed, for any point `p`, we have `T'Tp = T'(Mp + o) = M'(Mp + o) - M'o = M'Mp + M'o - M'o = p.`\n * * Returns `true` if the `matrix` part if this Transform is invertible and `false` if singular.\n */\n public multiplyInversePoint3dArrayInPlace(points: Point3d[]): boolean {\n if (!this._matrix.computeCachedInverse(true))\n return false;\n for (const point of points)\n this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - this.origin.x,\n point.y - this.origin.y,\n point.z - this.origin.z,\n point,\n );\n return true;\n }\n /**\n * Transform the input 2d point array (using `Tp = M*p + o`).\n * * If `result` is given, resize it to match the input `points` array and update it with transformed points.\n * * If `result` is not given, return a new array.\n */\n public multiplyPoint2dArray(points: Point2d[], result?: Point2d[]): Point2d[] {\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point2d.createZero());\n for (let i = 0; i < n; i++)\n Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, points[i], result[i]);\n return result;\n }\n result = [];\n for (const p of points)\n result.push(Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, p));\n return result;\n }\n /**\n * Transform the input 3d point array (using `Tp = M*p + o`).\n * * If `result` is given, resize it to match the input `points` array and update it with transformed points.\n * * If `result` is not given, return a new array.\n */\n public multiplyPoint3dArray(points: Point3d[], result?: Point3d[]): Point3d[] {\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point3d.createZero());\n for (let i = 0; i < n; i++)\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, points[i], result[i]);\n return result;\n }\n result = [];\n for (const p of points)\n result.push(Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, p));\n return result;\n }\n /**\n * Multiply the vector by the `matrix` part of the Transform.\n * * The `origin` part of Transform is not used.\n * * If `result` is given, update it with the multiplication. Otherwise, create a new Vector3d.\n */\n public multiplyVector(vector: Vector3d, result?: Vector3d): Vector3d {\n return this._matrix.multiplyVector(vector, result);\n }\n /**\n * Multiply the vector by the `matrix` part of the Transform in place.\n * * The `origin` part of Transform is not used.\n */\n public multiplyVectorInPlace(vector: Vector3d): void {\n this._matrix.multiplyVectorInPlace(vector);\n }\n /**\n * Multiply the vector (x,y,z) by the `matrix` part of the Transform.\n * * The `origin` part of Transform is not used.\n * * If `result` is given, update it with the multiplication. Otherwise, create a new Vector3d.\n */\n public multiplyVectorXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\n return this._matrix.multiplyXYZ(x, y, z, result);\n }\n /**\n * Calculate `transformA * transformB` and store it into the calling instance (`this`).\n * * **Note:** If `transformA = [A a]` and `transformB = [B b]` then `transformA * transformB` is defined as\n * `[A*B Ab+a]`.\n * * @see [[multiplyTransformTransform]] documentation for math details.\n * @param transformA first operand\n * @param transformB second operand\n */\n public setMultiplyTransformTransform(transformA: Transform, transformB: Transform): void {\n Matrix3d.xyzPlusMatrixTimesXYZ(\n transformA._origin,\n transformA._matrix,\n transformB._origin,\n this._origin as Point3d,\n );\n transformA._matrix.multiplyMatrixMatrix(transformB._matrix, this._matrix);\n }\n /**\n * Multiply `this` Transform times `other` Transform.\n * * **Note:** If `this = [A a]` and `other = [B b]` then `this * other` is defined as `[A*B Ab+a]` because:\n * ```\n * equation\n * \\begin{matrix}\n * \\text{this Transform with matrix part }\\bold{A}\\text{ and origin part }\\bold{a} & \\blockTransform{A}{a}\\\\\n * \\text{other Transform with matrix part }\\bold{B}\\text{ and origin part }\\bold{b} & \\blockTransform{B}{b} \\\\\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab + a}\n * \\end{matrix}\n * ```\n * @param other the `other` Transform to be multiplied to `this` Transform.\n * @param result optional preallocated `result` to reuse.\n */\n public multiplyTransformTransform(other: Transform, result?: Transform) {\n if (!result)\n return Transform.createRefs(\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, other._origin),\n this._matrix.multiplyMatrixMatrix(other._matrix),\n );\n result.setMultiplyTransformTransform(this, other);\n return result;\n }\n /**\n * Multiply `this` Transform times `other` Matrix3d (considered to be a Transform with 0 `origin`).\n * * **Note:** If `this = [A a]` and `other = [B 0]`, then `this * other` is defined as [A*B a] because:\n * ```\n * equation\n * \\begin{matrix}\n * \\text{this Transform with matrix part }\\bold{A}\\text{ and origin part }\\bold{a} & \\blockTransform{A}{a}\\\\\n * \\text{other matrix }\\bold{B}\\text{ promoted to block Transform} & \\blockTransform{B}{0} \\\\\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{0}=\\blockTransform{AB}{a}\n * \\end{matrix}\n * ```\n * @param other the `other` Matrix3d to be multiplied to `this` Transform.\n * @param result optional preallocated `result` to reuse.\n */\n public multiplyTransformMatrix3d(other: Matrix3d, result?: Transform): Transform {\n if (!result)\n return Transform.createRefs(\n this._origin.cloneAsPoint3d(),\n this._matrix.multiplyMatrixMatrix(other),\n );\n this._matrix.multiplyMatrixMatrix(other, result._matrix);\n result._origin.setFrom(this._origin);\n return result;\n }\n /**\n * Return the range of the transformed corners.\n * * The 8 corners are transformed individually.\n * * **Note:** Suppose you have a geometry, a range box around that geometry, and your Transform is a rotation.\n * If you rotate the range box and recompute a new range box around the rotated range box, then the new range\n * box will have a larger volume than the original range box. However, if you rotate the geometry itself and\n * then recompute the range box, it will be a tighter range box around the rotated geometry. `multiplyRange`\n * function creates the larger range box because it only has access to the range box and not the geometry itself.\n */\n public multiplyRange(range: Range3d, result?: Range3d): Range3d {\n if (range.isNull)\n return range.clone(result);\n const lowX = range.low.x;\n const lowY = range.low.y;\n const lowZ = range.low.z;\n const highX = range.high.x;\n const highY = range.high.y;\n const highZ = range.high.z;\n result = Range3d.createNull(result);\n result.extendTransformedXYZ(this, lowX, lowY, lowZ);\n result.extendTransformedXYZ(this, highX, lowY, lowZ);\n result.extendTransformedXYZ(this, lowX, highY, lowZ);\n result.extendTransformedXYZ(this, highX, highY, lowZ);\n result.extendTransformedXYZ(this, lowX, lowY, highZ);\n result.extendTransformedXYZ(this, highX, lowY, highZ);\n result.extendTransformedXYZ(this, lowX, highY, highZ);\n result.extendTransformedXYZ(this, highX, highY, highZ);\n return result;\n }\n /**\n * Return a Transform which is the inverse of `this` Transform.\n * * If `transform = [M o]` then `transformInverse = [MInverse -MInverse*o]`\n * * Return `undefined` if this Transform's matrix is singular.\n */\n public inverse(result?: Transform): Transform | undefined {\n const matrixInverse = this._matrix.inverse(result ? result._matrix : undefined);\n if (!matrixInverse)\n return undefined;\n if (result) {\n // result._matrix is already defined\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z, result._origin as Vector3d);\n return result;\n }\n return Transform.createRefs(\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z),\n matrixInverse,\n );\n }\n /**\n * Initialize 2 Transforms that map between the unit box (specified by 000 and 111) and the range box specified\n * by the input points.\n * @param min the min corner of the range box\n * @param max the max corner of the range box\n * @param npcToGlobal maps NPC coordinates into range box coordinates. Specifically, maps 000 to `min` and maps\n * 111 to `max`. This Transform is the inverse of `globalToNpc`. Object created by caller, re-initialized here.\n * @param globalToNpc maps range box coordinates into NPC coordinates. Specifically, maps `min` to 000 and maps\n * `max` to 111. This Transform is the inverse of `npcToGlobal`. Object created by caller, re-initialized here.\n * * NPC stands for `Normalized Projection Coordinate`\n */\n public static initFromRange(min: Point3d, max: Point3d, npcToGlobal?: Transform, globalToNpc?: Transform): void {\n const diag = max.minus(min);\n if (diag.x === 0.0)\n diag.x = 1.0;\n if (diag.y === 0.0)\n diag.y = 1.0;\n if (diag.z === 0.0)\n diag.z = 1.0;\n const rMatrix = new Matrix3d();\n /**\n * [diag.x 0 0 min.x]\n * npcToGlobal = [ 0 diag.y 0 min.y]\n * [ 0 0 diag.y min.z]\n *\n * npcToGlobal * 0 = min\n * npcToGlobal * 1 = diag + min = max\n */\n if (npcToGlobal) {\n Matrix3d.createScale(diag.x, diag.y, diag.z, rMatrix);\n Transform.createOriginAndMatrix(min, rMatrix, npcToGlobal);\n }\n /**\n * [1/diag.x 0 0 -min.x/diag.x]\n * globalToNpc = [ 0 1/diag.y 0 -min.y/diag.y]\n * [ 0 0 1/diag.y -min.z/diag.z]\n *\n * globalToNpc * min = min/diag - min/diag = 0\n * globalToNpc * max = max/diag - min/diag = diag/diag = 1\n */\n if (globalToNpc) {\n const origin = new Point3d(-min.x / diag.x, -min.y / diag.y, -min.z / diag.z);\n Matrix3d.createScale(1.0 / diag.x, 1.0 / diag.y, 1.0 / diag.z, rMatrix);\n Transform.createOriginAndMatrix(origin, rMatrix, globalToNpc);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"Transform.js","sourceRoot":"","sources":["../../../src/geometry3d/Transform.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AxisOrder, BeJSONFunctions, Geometry } from \"../Geometry\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point2d } from \"./Point2dVector2d\";\nimport { Point3d, Vector3d, XYZ } from \"./Point3dVector3d\";\nimport { Range3d } from \"./Range\";\nimport { TransformProps, XAndY, XYAndZ } from \"./XYZProps\";\n\n/**\n * A Transform consists of an origin and a Matrix3d. This describes a coordinate frame with this origin, with\n * the columns of the Matrix3d being the local x,y,z axis directions.\n * * The math for a Transform `T` consisting of a Matrix3d `M` and a Point3d `o` on a Vector3d `p` is: `Tp = M*p + o`.\n * In other words, `T` is a combination of two operations on `p`: the action of matrix multiplication, followed by a\n * translation. `Origin` is a traditional term for `o`, because `T` can be interpreted as a change of basis from the\n * global axes centered at the global origin, to a new set of axes specified by matrix M columns centered at `o`.\n * * Beware that for common transformations (e.g. scale about point, rotate around an axis) the `fixed point` that\n * is used when describing the transform is NOT the `origin` stored in the transform. Setup methods (e.g\n * createFixedPointAndMatrix, createScaleAboutPoint) take care of determining the appropriate origin coordinates.\n * * If `T` is a translation, no point is fixed by `T`.\n * * If `T` is the identity, all points are fixed by `T`.\n * * If `T` is a scale about a point, one point is fixed by `T`.\n * * If `T` is a rotation about an axis, a line is fixed by `T`.\n * * If `T` is a projection to the plane, a plane is fixed by `T`.\n * @public\n */\nexport class Transform implements BeJSONFunctions {\n private _origin: XYZ;\n private _matrix: Matrix3d;\n // Constructor accepts and uses pointer to content (no copy is done here).\n private constructor(origin: XYZ, matrix: Matrix3d) {\n this._origin = origin;\n this._matrix = matrix;\n }\n private static _identity?: Transform;\n /** The identity Transform. Value is frozen and cannot be modified. */\n public static get identity(): Transform {\n if (undefined === this._identity) {\n this._identity = Transform.createIdentity();\n this._identity.freeze();\n }\n return this._identity;\n }\n /** Freeze this instance (and its members) so it is read-only */\n public freeze(): Readonly<this> {\n this._origin.freeze();\n this._matrix.freeze();\n return Object.freeze(this);\n }\n /**\n * Copy contents from other Transform into this Transform\n * @param other source transform\n */\n public setFrom(other: Transform) {\n this._origin.setFrom(other._origin);\n this._matrix.setFrom(other._matrix);\n }\n /** Set this Transform to be an identity. */\n public setIdentity() {\n this._origin.setZero();\n this._matrix.setIdentity();\n }\n /**\n * Set this Transform instance from flexible inputs:\n * * Any object (such as another Transform or TransformProps) that has `origin` and `matrix` members\n * accepted by `Point3d.setFromJSON` and `Matrix3d.setFromJSON`\n * * An array of 3 number arrays, each with 4 entries which are rows in a 3x4 matrix.\n * * An array of 12 numbers, each block of 4 entries as a row 3x4 matrix.\n * * If no input is provided, the identity Transform is returned.\n */\n public setFromJSON(json?: TransformProps | Transform): void {\n if (json) {\n if (json instanceof Object && (json as any).origin && (json as any).matrix) {\n this._origin.setFromJSON((json as any).origin);\n this._matrix.setFromJSON((json as any).matrix);\n return;\n }\n if (Geometry.isArrayOfNumberArray(json, 3, 4)) {\n this._matrix.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 );\n this._origin.set(json[0][3], json[1][3], json[2][3]);\n return;\n }\n if (Geometry.isNumberArray(json, 12)) {\n this._matrix.setRowValues(\n json[0], json[1], json[2],\n json[4], json[5], json[6],\n json[8], json[9], json[10],\n );\n this._origin.set(json[3], json[7], json[11]);\n return;\n }\n }\n this.setIdentity();\n }\n /**\n * Test for near equality with `other` Transform. Comparison uses the `isAlmostEqual` methods on the `origin` and\n * `matrix` parts.\n * @param other Transform to compare to.\n */\n public isAlmostEqual(other: Readonly<Transform>): boolean {\n return this === other || this.origin.isAlmostEqual(other.origin) && this.matrix.isAlmostEqual(other.matrix);\n }\n /**\n * Test for near equality with `other` Transform. Comparison uses the `isAlmostEqual` methods on the `origin` part\n * and the `isAlmostEqualAllowZRotation` method on the `matrix` part.\n * @param other Transform to compare to.\n */\n public isAlmostEqualAllowZRotation(other: Transform): boolean {\n return this._origin.isAlmostEqual(other._origin) && this._matrix.isAlmostEqualAllowZRotation(other._matrix);\n }\n /**\n * Return a 3 by 4 matrix containing the rows of this Transform.\n * * The transform's origin coordinates are the last entries of the 3 json arrays\n */\n public toRows(): number[][] {\n return [\n [this._matrix.coffs[0], this._matrix.coffs[1], this._matrix.coffs[2], this._origin.x],\n [this._matrix.coffs[3], this._matrix.coffs[4], this._matrix.coffs[5], this._origin.y],\n [this._matrix.coffs[6], this._matrix.coffs[7], this._matrix.coffs[8], this._origin.z],\n ];\n }\n /**\n * Return a 3 by 4 matrix containing the rows of this Transform.\n * * The transform's origin coordinates are the last entries of the 3 json arrays\n */\n public toJSON(): TransformProps {\n return this.toRows();\n }\n /** Return a new Transform initialized by `Transform.setFromJSON` */\n public static fromJSON(json?: TransformProps): Transform {\n const result = Transform.createIdentity();\n result.setFromJSON(json);\n return result;\n }\n /** Copy the contents of `this` transform into a new Transform (or to the result, if specified). */\n public clone(result?: Transform): Transform {\n if (result) {\n result._matrix.setFrom(this._matrix);\n result._origin.setFrom(this._origin);\n return result;\n }\n return new Transform(\n Point3d.createFrom(this._origin),\n this._matrix.clone(),\n );\n }\n /**\n * Return a modified copy of `this` Transform so that its `matrix` part is rigid (`origin` part is untouched).\n * @see [[Matrix3d.axisOrderCrossProductsInPlace]] documentation for details of how the matrix is modified to rigid.\n */\n public cloneRigid(axisOrder: AxisOrder = AxisOrder.XYZ): Transform | undefined {\n const modifiedMatrix = Matrix3d.createRigidFromMatrix3d(this.matrix, axisOrder);\n if (!modifiedMatrix)\n return undefined;\n return new Transform(this.origin.cloneAsPoint3d(), modifiedMatrix);\n }\n /** Create a Transform with the given `origin` and `matrix`. Inputs are captured, not cloned. */\n public static createRefs(origin: XYZ | undefined, matrix: Matrix3d, result?: Transform): Transform {\n if (!origin)\n origin = Point3d.createZero();\n if (result) {\n result._origin = origin;\n result._matrix = matrix;\n return result;\n }\n return new Transform(origin, matrix);\n }\n /** Create a Transform with complete contents given. `q` inputs make the matrix and `a` inputs make the origin */\n public static createRowValues(\n qxx: number, qxy: number, qxz: number, ax: number,\n qyx: number, qyy: number, qyz: number, ay: number,\n qzx: number, qzy: number, qzz: number, az: number,\n result?: Transform,\n ): Transform {\n if (result) {\n result._origin.set(ax, ay, az);\n result._matrix.setRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz);\n return result;\n }\n return new Transform(\n Point3d.create(ax, ay, az),\n Matrix3d.createRowValues(qxx, qxy, qxz, qyx, qyy, qyz, qzx, qzy, qzz),\n );\n }\n /** Create a Transform with all zeros */\n public static createZero(result?: Transform): Transform {\n return Transform.createRowValues(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, result);\n }\n /**\n * Create a Transform with translation provided by x,y,z parts.\n * * Translation Transform maps any vector `v` to `v + p` where `p = (x,y,z)`\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n * @param x x part of translation\n * @param y y part of translation\n * @param z z part of translation\n * @param result optional pre-allocated Transform\n * @returns new or updated transform\n */\n public static createTranslationXYZ(x: number = 0, y: number = 0, z: number = 0, result?: Transform): Transform {\n return Transform.createRefs(Vector3d.create(x, y, z), Matrix3d.createIdentity(), result);\n }\n /**\n * Create a Transform with specified `translation` part.\n * * Translation Transform maps any vector `v` to `v + translation`\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n * @param translation x,y,z parts of the translation\n * @param result optional pre-allocated Transform\n * @returns new or updated transform\n */\n public static createTranslation(translation: XYZ, result?: Transform): Transform {\n return Transform.createRefs(translation, Matrix3d.createIdentity(), result);\n }\n /** Return a reference (and NOT a copy) to the `matrix` part of the Transform. */\n public get matrix(): Matrix3d {\n return this._matrix;\n }\n /** Return a reference (and NOT a copy) to the `origin` part of the Transform. */\n public get origin(): XYZ {\n return this._origin;\n }\n /** return a (clone of) the `origin` part of the Transform, as a `Point3d` */\n public getOrigin(): Point3d {\n return Point3d.createFrom(this._origin);\n }\n /** return a (clone of) the `origin` part of the Transform, as a `Vector3d` */\n public getTranslation(): Vector3d {\n return Vector3d.createFrom(this._origin);\n }\n /** return a (clone of) the `matrix` part of the Transform, as a `Matrix3d` */\n public getMatrix(): Matrix3d {\n return this._matrix.clone();\n }\n /** test if the transform has `origin` = (0,0,0) and identity `matrix` */\n public get isIdentity(): boolean {\n return this._matrix.isIdentity && this._origin.isAlmostZero;\n }\n /** Create an identity transform */\n public static createIdentity(result?: Transform): Transform {\n if (result) {\n result._origin.setZero();\n result._matrix.setIdentity();\n return result;\n }\n return Transform.createRefs(Point3d.createZero(), Matrix3d.createIdentity());\n }\n /**\n * Create a Transform using the given `origin` and `matrix`.\n * * This is the appropriate construction when the columns of the matrix are coordinate axes of a\n * local-to-world mapping, and the given point is the axes' origin in world coordinates.\n * * This function is closely related to `createFixedPointAndMatrix` whose point input is the fixed point\n * of the world-to-world transformation.\n * * If origin is `undefined`, (0,0,0) is used. If matrix is `undefined` the identity matrix is used.\n */\n public static createOriginAndMatrix(\n origin: XYZ | undefined, matrix: Matrix3d | undefined, result?: Transform,\n ): Transform {\n if (result) {\n result._origin.setFromPoint3d(origin);\n result._matrix.setFrom(matrix);\n return result;\n }\n return Transform.createRefs(\n origin ? origin.cloneAsPoint3d() : Point3d.createZero(),\n matrix === undefined ? Matrix3d.createIdentity() : matrix.clone(),\n result,\n );\n }\n /** Create a Transform using the given `origin` and columns of the `matrix`. If `undefined` zero is used. */\n public setOriginAndMatrixColumns(\n origin: XYZ | undefined, vectorX: Vector3d | undefined, vectorY: Vector3d | undefined, vectorZ: Vector3d | undefined,\n ): void {\n if (origin !== undefined)\n this._origin.setFrom(origin);\n this._matrix.setColumns(vectorX, vectorY, vectorZ);\n }\n /** Create a Transform using the given `origin` and columns of the `matrix` */\n public static createOriginAndMatrixColumns(\n origin: XYZ, vectorX: Vector3d, vectorY: Vector3d, vectorZ: Vector3d, result?: Transform,\n ): Transform {\n if (result)\n result.setOriginAndMatrixColumns(origin, vectorX, vectorY, vectorZ);\n else\n result = Transform.createRefs(Vector3d.createFrom(origin), Matrix3d.createColumns(vectorX, vectorY, vectorZ));\n return result;\n }\n /**\n * Create a Transform such that its `matrix` part is rigid.\n * @see [[Matrix3d.createRigidFromColumns]] for details of how the matrix is created to be rigid.\n */\n public static createRigidFromOriginAndColumns(\n origin: XYZ | undefined, vectorX: Vector3d, vectorY: Vector3d, axisOrder: AxisOrder, result?: Transform,\n ): Transform | undefined {\n const matrix = Matrix3d.createRigidFromColumns(vectorX, vectorY, axisOrder, result ? result._matrix : undefined);\n if (!matrix)\n return undefined;\n if (result) {\n // result._matrix was already modified to become rigid via createRigidFromColumns\n result._origin.setFrom(origin);\n return result;\n }\n /**\n * We don't want to pass \"origin\" to createRefs because createRefs does not clone \"origin\". That means if \"origin\"\n * is changed via Transform at any point, the initial \"origin\" passed by the user is also changed. To avoid that,\n * we pass \"undefined\" to createRefs so that it allocates a new point which then we set it to the \"origin\" which\n * is passed by user in the next line.\n */\n result = Transform.createRefs(undefined, matrix);\n result._origin.setFromPoint3d(origin);\n return result;\n }\n /**\n * Create a Transform with the specified `matrix`. Compute an `origin` (different from the given `fixedPoint`)\n * so that the `fixedPoint` maps back to itself. The returned Transform, transforms a point `p` to `M*p + (f - M*f)`\n * where `f` is the fixedPoint (i.e., `Tp = M*(p-f) + f`).\n */\n public static createFixedPointAndMatrix(\n fixedPoint: XYAndZ | undefined, matrix: Matrix3d, result?: Transform,\n ): Transform {\n if (fixedPoint) {\n /**\n * if f is a fixed point, then Tf = M*f + o = f where M is the matrix and o is the origin.\n * we define the origin o = f - M*f. Therefore, Tf = Mf + o = M*f + (f - M*f) = f.\n */\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\n return Transform.createRefs(origin, matrix.clone(), result);\n }\n return Transform.createRefs(undefined, matrix.clone());\n }\n /**\n * Create a transform with the specified `matrix` and points `a` and `b`. The returned Transform maps\n * point `p` to `M*(p-a) + b` (i.e., `Tp = M*(p-a) + b`), so maps `a` to `b`.\n */\n public static createMatrixPickupPutdown(\n matrix: Matrix3d, a: Point3d, b: Point3d, result?: Transform,\n ): Transform {\n // we define the origin o = b - M*a so Tp = M*p + o = M*p + (b - M*a) = M*(p-a) + b\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(b, matrix, a);\n return Transform.createRefs(origin, matrix.clone(), result);\n }\n /**\n * Create a Transform which leaves the fixedPoint unchanged and scales everything else around it by\n * a single scale factor. The returned Transform maps a point `p` to `M*p + (f - M*f)`\n * where `f` is the fixedPoint and M is the scale matrix (i.e., `Tp = M*(p-f) + f`).\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/CubeTransform\n */\n public static createScaleAboutPoint(fixedPoint: Point3d, scale: number, result?: Transform): Transform {\n const matrix = Matrix3d.createScale(scale, scale, scale);\n /**\n * if f is a fixed point, then Tf = M*f + o = f where M is the matrix and o is the origin.\n * we define the origin o = f - M*f. Therefore, Tf = M*f + o = M*f + (f - M*f) = f.\n */\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(fixedPoint, matrix, fixedPoint);\n return Transform.createRefs(origin, matrix, result);\n }\n /**\n * Return a transformation which flattens space onto a plane, sweeping along a direction which may be different\n * from the plane normal.\n * * See [Matrix3d.createFlattenAlongVectorToPlane] for math details.\n * @param sweepVector sweep direction. If same as `planeNormal`, the resulting transformation flattens to the plane.\n * @param planePoint any point on the plane\n * @param planeNormal vector normal to the plane.\n */\n public static createFlattenAlongVectorToPlane(sweepVector: Vector3d, planePoint: XYAndZ, planeNormal: Vector3d): Transform | undefined {\n const matrix = Matrix3d.createFlattenAlongVectorToPlane(sweepVector, planeNormal);\n if (matrix === undefined)\n return undefined;\n return Transform.createFixedPointAndMatrix(planePoint, matrix);\n }\n /**\n * Transform the input 2d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyPoint2d(point: XAndY, result?: Point2d): Point2d {\n return Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, point, result);\n }\n /**\n * Transform the input 3d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyPoint3d(point: XYAndZ, result?: Point3d): Point3d {\n // Tx = Mx + o so we return Mx + o\n return Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, result);\n }\n /**\n * Transform the input 3d point in place (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyXYAndZInPlace(point: XYAndZ): void {\n return Matrix3d.xyzPlusMatrixTimesXYZInPlace(this._origin, this._matrix, point);\n }\n /**\n * Transform the input 3d point (using `Tp = M*p + o`).\n * Return as a new point or in the pre-allocated result (if result is given).\n */\n public multiplyXYZ(x: number, y: number, z: number = 0, result?: Point3d): Point3d {\n // Tx = Mx + o so we return Mx + o\n return Matrix3d.xyzPlusMatrixTimesCoordinates(this._origin, this._matrix, x, y, z, result);\n }\n /**\n * Multiply a specific row (component) of the 3x4 instance times (x,y,z,1). Return the result.\n */\n public multiplyComponentXYZ(componentIndex: number, x: number, y: number, z: number = 0): number {\n const coffs = this._matrix.coffs;\n const idx = 3 * componentIndex;\n return this.origin.at(componentIndex) + (coffs[idx] * x) + (coffs[idx + 1] * y) + (coffs[idx + 2] * z);\n }\n /**\n * Multiply a specific row (component) of the 3x4 instance times (x,y,z,w). Return the result.\n */\n public multiplyComponentXYZW(componentIndex: number, x: number, y: number, z: number, w: number): number {\n const coffs = this._matrix.coffs;\n const idx = 3 * componentIndex;\n return (this.origin.at(componentIndex) * w) + (coffs[idx] * x) + (coffs[idx + 1] * y) + (coffs[idx + 2] * z);\n }\n /**\n * Transform the homogeneous point. Return as a new `Point4d`, or in the pre-allocated result (if result is given).\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o*w` and returns the `Point4d` formed by `Tp` in the\n * first three coordinates, and `w` in the fourth.\n * * Logically, this is multiplication by the 4x4 matrix formed from the 3x4 instance augmented with fourth row 0001.\n */\n public multiplyXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinates(this._origin, this._matrix, x, y, z, w, result);\n }\n /**\n * Transform the homogeneous point. Return as new `Float64Array` with size 4, or in the pre-allocated `result` of sufficient size.\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o*w` and returns the `Float64Array` formed by `Tp`\n * in the first 3 numbers of the array and `w` as the fourth.\n * * Logically, this is multiplication by the 4x4 matrix formed from the 3x4 instance augmented with fourth row 0001.\n */\n public multiplyXYZWToFloat64Array(x: number, y: number, z: number, w: number, result?: Float64Array): Float64Array {\n return Matrix3d.xyzPlusMatrixTimesWeightedCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, w, result);\n }\n /**\n * * Transform the point. Return as new `Float64Array` with size 3, or in the pre-allocated `result` of sufficient size.\n * * If `p = (x,y,z)` then this method computes `Tp = M*p + o` and returns it as the first 3 elements of the array.\n */\n public multiplyXYZToFloat64Array(x: number, y: number, z: number, result?: Float64Array): Float64Array {\n return Matrix3d.xyzPlusMatrixTimesCoordinatesToFloat64Array(this._origin, this._matrix, x, y, z, result);\n }\n /**\n * Multiply the homogeneous point by the transpose of `this` Transform. Return as a new `Point4d` or in the\n * pre-allocated result (if result is given).\n * * If `p = (x,y,z)` then this method computes `M^t*p` and returns it in the first three coordinates of the `Point4d`,\n * and `o*p + w` in the fourth.\n * * Logically, this is multiplication by the transpose of the 4x4 matrix formed from the 3x4 instance augmented with\n * fourth row 0001.\n */\n public multiplyTransposeXYZW(x: number, y: number, z: number, w: number, result?: Point4d): Point4d {\n const coffs = this._matrix.coffs;\n const origin = this._origin;\n return Point4d.create(\n (x * coffs[0]) + (y * coffs[3]) + (z * coffs[6]),\n (x * coffs[1]) + (y * coffs[4]) + (z * coffs[7]),\n (x * coffs[2]) + (y * coffs[5]) + (z * coffs[8]),\n (x * origin.x) + (y * origin.y) + (z * origin.z) + w,\n result,\n );\n }\n /** For each point in the array, replace point by the transformed point (using `Tp = M*p + o`) */\n public multiplyPoint3dArrayInPlace(points: Point3d[]) {\n let point;\n for (point of points)\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, point, point);\n }\n /** For each point in the 2d array, replace point by the transformed point (using `Tp = M*p + o`) */\n public multiplyPoint3dArrayArrayInPlace(chains: Point3d[][]) {\n for (const chain of chains)\n this.multiplyPoint3dArrayInPlace(chain);\n }\n /**\n * Multiply the point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse`\n * Transform has matrix part `MInverse` and origin part `-MInverse*o`.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint3d(point: XYAndZ, result?: Point3d): Point3d | undefined {\n return this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - this._origin.x,\n point.y - this._origin.y,\n point.z - this._origin.z,\n result,\n );\n }\n /**\n * Multiply the homogenous point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse` Transform\n * has matrix part `MInverse` and origin part `-MInverse*o`.\n * * This method computes `TInverse p = MInverse*p - w*MInverse*o` and returns the `Point4d` formed by `TInverse*p`\n * in the first three coordinates, and `w` in the fourth.\n * * Logically, this is multiplication by the inverse of the 4x4 matrix formed from the 3x4 instance augmented with\n * fourth row 0001. This is equivalent to the 4x4 matrix formed in similar fashion from the inverse of this instance.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint4d(weightedPoint: Point4d, result?: Point4d): Point4d | undefined {\n const w = weightedPoint.w;\n return this._matrix.multiplyInverseXYZW(\n weightedPoint.x - w * this.origin.x,\n weightedPoint.y - w * this.origin.y,\n weightedPoint.z - w * this.origin.z,\n w,\n result,\n );\n }\n /**\n * Multiply the point by the inverse Transform.\n * * If for a point `p` we have `Tp = M*p + o = q`, then `p = MInverse*(q - o) = TInverse q` so `TInverse` Transform\n * has matrix part `MInverse` and origin part `-MInverse*o`.\n * * Return as a new point or in the optional `result`.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInverseXYZ(x: number, y: number, z: number, result?: Point3d): Point3d | undefined {\n return this._matrix.multiplyInverseXYZAsPoint3d(\n x - this._origin.x,\n y - this._origin.y,\n z - this._origin.z,\n result,\n );\n }\n /**\n * * Compute (if needed) the inverse of the `matrix` part of the Transform, thereby ensuring inverse\n * operations can complete.\n * @param useCached If true, accept prior cached inverse if available.\n * @returns `true` if matrix inverse completes, `false` otherwise.\n */\n public computeCachedInverse(useCached: boolean = true): boolean {\n return this._matrix.computeCachedInverse(useCached);\n }\n /**\n * Match the length of destination array with the length of source array\n * * If destination has more elements than source, remove the extra elements.\n * * If destination has fewer elements than source, use `constructionFunction` to create new elements.\n * *\n * @param source the source array\n * @param dest the destination array\n * @param constructionFunction function to call to create new elements.\n */\n public static matchArrayLengths(source: any[], dest: any[], constructionFunction: () => any): number {\n const numSource = source.length;\n const numDest = dest.length;\n if (numSource > numDest) {\n for (let i = numDest; i < numSource; i++) {\n dest.push(constructionFunction());\n }\n } else if (numDest > numSource) {\n dest.length = numSource;\n }\n return numSource;\n }\n /**\n * Multiply each point in the array by the inverse of `this` Transform.\n * * For a transform `T = [M o]` the inverse transform `T' = [M' -M'o]` exists if and only if `M` has an inverse\n * `M'`. Indeed, for any point `p`, we have `T'Tp = T'(Mp + o) = M'(Mp + o) - M'o = M'Mp + M'o - M'o = p.`\n * * If `result` is given, resize it to match the input `points` array and update it with original points `p[]`.\n * * If `result` is not given, return a new array.\n * * Returns `undefined` if the `matrix` part if this Transform is singular.\n */\n public multiplyInversePoint3dArray(points: Point3d[], result?: Point3d[]): Point3d[] | undefined {\n if (!this._matrix.computeCachedInverse(true))\n return undefined;\n const originX = this.origin.x;\n const originY = this.origin.y;\n const originZ = this.origin.z;\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point3d.createZero());\n for (let i = 0; i < n; i++)\n this._matrix.multiplyInverseXYZAsPoint3d(\n points[i].x - originX,\n points[i].y - originY,\n points[i].z - originZ,\n result[i],\n );\n return result;\n }\n result = [];\n for (const point of points)\n result.push(\n this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - originX,\n point.y - originY,\n point.z - originZ,\n )!,\n );\n return result;\n }\n /**\n * Multiply each point in the array by the inverse of `this` Transform in place.\n * * For a transform `T = [M o]` the inverse transform `T' = [M' -M'o]` exists if and only if `M` has an inverse\n * `M'`. Indeed, for any point `p`, we have `T'Tp = T'(Mp + o) = M'(Mp + o) - M'o = M'Mp + M'o - M'o = p.`\n * * Returns `true` if the `matrix` part if this Transform is invertible and `false` if singular.\n */\n public multiplyInversePoint3dArrayInPlace(points: Point3d[]): boolean {\n if (!this._matrix.computeCachedInverse(true))\n return false;\n for (const point of points)\n this._matrix.multiplyInverseXYZAsPoint3d(\n point.x - this.origin.x,\n point.y - this.origin.y,\n point.z - this.origin.z,\n point,\n );\n return true;\n }\n /**\n * Transform the input 2d point array (using `Tp = M*p + o`).\n * * If `result` is given, resize it to match the input `points` array and update it with transformed points.\n * * If `result` is not given, return a new array.\n */\n public multiplyPoint2dArray(points: Point2d[], result?: Point2d[]): Point2d[] {\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point2d.createZero());\n for (let i = 0; i < n; i++)\n Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, points[i], result[i]);\n return result;\n }\n result = [];\n for (const p of points)\n result.push(Matrix3d.xyPlusMatrixTimesXY(this._origin, this._matrix, p));\n return result;\n }\n /**\n * Transform the input 3d point array (using `Tp = M*p + o`).\n * * If `result` is given, resize it to match the input `points` array and update it with transformed points.\n * * If `result` is not given, return a new array.\n */\n public multiplyPoint3dArray(points: Point3d[], result?: Point3d[]): Point3d[] {\n if (result) {\n const n = Transform.matchArrayLengths(points, result, () => Point3d.createZero());\n for (let i = 0; i < n; i++)\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, points[i], result[i]);\n return result;\n }\n result = [];\n for (const p of points)\n result.push(Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, p));\n return result;\n }\n /**\n * Multiply the vector by the `matrix` part of the Transform.\n * * The `origin` part of Transform is not used.\n * * If `result` is given, update it with the multiplication. Otherwise, create a new Vector3d.\n */\n public multiplyVector(vector: Vector3d, result?: Vector3d): Vector3d {\n return this._matrix.multiplyVector(vector, result);\n }\n /**\n * Multiply the vector by the `matrix` part of the Transform in place.\n * * The `origin` part of Transform is not used.\n */\n public multiplyVectorInPlace(vector: Vector3d): void {\n this._matrix.multiplyVectorInPlace(vector);\n }\n /**\n * Multiply the vector (x,y,z) by the `matrix` part of the Transform.\n * * The `origin` part of Transform is not used.\n * * If `result` is given, update it with the multiplication. Otherwise, create a new Vector3d.\n */\n public multiplyVectorXYZ(x: number, y: number, z: number, result?: Vector3d): Vector3d {\n return this._matrix.multiplyXYZ(x, y, z, result);\n }\n /**\n * Calculate `transformA * transformB` and store it into the calling instance (`this`).\n * * **Note:** If `transformA = [A a]` and `transformB = [B b]` then `transformA * transformB` is defined as\n * `[A*B Ab+a]`.\n * * @see [[multiplyTransformTransform]] documentation for math details.\n * @param transformA first operand\n * @param transformB second operand\n */\n public setMultiplyTransformTransform(transformA: Transform, transformB: Transform): void {\n Matrix3d.xyzPlusMatrixTimesXYZ(\n transformA._origin,\n transformA._matrix,\n transformB._origin,\n this._origin as Point3d,\n );\n transformA._matrix.multiplyMatrixMatrix(transformB._matrix, this._matrix);\n }\n /**\n * Multiply `this` Transform times `other` Transform.\n * * **Note:** If `this = [A a]` and `other = [B b]` then `this * other` is defined as `[A*B Ab+a]` because:\n * ```\n * equation\n * \\begin{matrix}\n * \\text{this Transform with matrix part }\\bold{A}\\text{ and origin part }\\bold{a} & \\blockTransform{A}{a}\\\\\n * \\text{other Transform with matrix part }\\bold{B}\\text{ and origin part }\\bold{b} & \\blockTransform{B}{b} \\\\\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{b}=\\blockTransform{AB}{Ab + a}\n * \\end{matrix}\n * ```\n * @param other the `other` Transform to be multiplied to `this` Transform.\n * @param result optional preallocated `result` to reuse.\n */\n public multiplyTransformTransform(other: Transform, result?: Transform) {\n if (!result)\n return Transform.createRefs(\n Matrix3d.xyzPlusMatrixTimesXYZ(this._origin, this._matrix, other._origin),\n this._matrix.multiplyMatrixMatrix(other._matrix),\n );\n result.setMultiplyTransformTransform(this, other);\n return result;\n }\n /**\n * Multiply `this` Transform times `other` Matrix3d (considered to be a Transform with 0 `origin`).\n * * **Note:** If `this = [A a]` and `other = [B 0]`, then `this * other` is defined as [A*B a] because:\n * ```\n * equation\n * \\begin{matrix}\n * \\text{this Transform with matrix part }\\bold{A}\\text{ and origin part }\\bold{a} & \\blockTransform{A}{a}\\\\\n * \\text{other matrix }\\bold{B}\\text{ promoted to block Transform} & \\blockTransform{B}{0} \\\\\n * \\text{product}& \\blockTransform{A}{a}\\blockTransform{B}{0}=\\blockTransform{AB}{a}\n * \\end{matrix}\n * ```\n * @param other the `other` Matrix3d to be multiplied to `this` Transform.\n * @param result optional preallocated `result` to reuse.\n */\n public multiplyTransformMatrix3d(other: Matrix3d, result?: Transform): Transform {\n if (!result)\n return Transform.createRefs(\n this._origin.cloneAsPoint3d(),\n this._matrix.multiplyMatrixMatrix(other),\n );\n this._matrix.multiplyMatrixMatrix(other, result._matrix);\n result._origin.setFrom(this._origin);\n return result;\n }\n /**\n * Return the range of the transformed corners.\n * * The 8 corners are transformed individually.\n * * **Note:** Suppose you have a geometry, a range box around that geometry, and your Transform is a rotation.\n * If you rotate the range box and recompute a new range box around the rotated range box, then the new range\n * box will have a larger volume than the original range box. However, if you rotate the geometry itself and\n * then recompute the range box, it will be a tighter range box around the rotated geometry. `multiplyRange`\n * function creates the larger range box because it only has access to the range box and not the geometry itself.\n */\n public multiplyRange(range: Range3d, result?: Range3d): Range3d {\n if (range.isNull)\n return range.clone(result);\n const lowX = range.low.x;\n const lowY = range.low.y;\n const lowZ = range.low.z;\n const highX = range.high.x;\n const highY = range.high.y;\n const highZ = range.high.z;\n result = Range3d.createNull(result);\n result.extendTransformedXYZ(this, lowX, lowY, lowZ);\n result.extendTransformedXYZ(this, highX, lowY, lowZ);\n result.extendTransformedXYZ(this, lowX, highY, lowZ);\n result.extendTransformedXYZ(this, highX, highY, lowZ);\n result.extendTransformedXYZ(this, lowX, lowY, highZ);\n result.extendTransformedXYZ(this, highX, lowY, highZ);\n result.extendTransformedXYZ(this, lowX, highY, highZ);\n result.extendTransformedXYZ(this, highX, highY, highZ);\n return result;\n }\n /**\n * Return a Transform which is the inverse of `this` Transform.\n * * If `transform = [M o]` then `transformInverse = [MInverse -MInverse*o]`\n * * Return `undefined` if this Transform's matrix is singular.\n */\n public inverse(result?: Transform): Transform | undefined {\n const matrixInverse = this._matrix.inverse(result ? result._matrix : undefined);\n if (!matrixInverse)\n return undefined;\n if (result) {\n // result._matrix is already defined\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z, result._origin as Vector3d);\n return result;\n }\n return Transform.createRefs(\n matrixInverse.multiplyXYZ(-this._origin.x, -this._origin.y, -this._origin.z),\n matrixInverse,\n );\n }\n /**\n * Initialize 2 Transforms that map between the unit box (specified by 000 and 111) and the range box specified\n * by the input points.\n * @param min the min corner of the range box\n * @param max the max corner of the range box\n * @param npcToGlobal maps NPC coordinates into range box coordinates. Specifically, maps 000 to `min` and maps\n * 111 to `max`. This Transform is the inverse of `globalToNpc`. Object created by caller, re-initialized here.\n * @param globalToNpc maps range box coordinates into NPC coordinates. Specifically, maps `min` to 000 and maps\n * `max` to 111. This Transform is the inverse of `npcToGlobal`. Object created by caller, re-initialized here.\n * * NPC stands for `Normalized Projection Coordinate`\n */\n public static initFromRange(min: Point3d, max: Point3d, npcToGlobal?: Transform, globalToNpc?: Transform): void {\n const diag = max.minus(min);\n if (diag.x === 0.0)\n diag.x = 1.0;\n if (diag.y === 0.0)\n diag.y = 1.0;\n if (diag.z === 0.0)\n diag.z = 1.0;\n const rMatrix = new Matrix3d();\n /**\n * [diag.x 0 0 min.x]\n * npcToGlobal = [ 0 diag.y 0 min.y]\n * [ 0 0 diag.y min.z]\n *\n * npcToGlobal * 0 = min\n * npcToGlobal * 1 = diag + min = max\n */\n if (npcToGlobal) {\n Matrix3d.createScale(diag.x, diag.y, diag.z, rMatrix);\n Transform.createOriginAndMatrix(min, rMatrix, npcToGlobal);\n }\n /**\n * [1/diag.x 0 0 -min.x/diag.x]\n * globalToNpc = [ 0 1/diag.y 0 -min.y/diag.y]\n * [ 0 0 1/diag.y -min.z/diag.z]\n *\n * globalToNpc * min = min/diag - min/diag = 0\n * globalToNpc * max = max/diag - min/diag = diag/diag = 1\n */\n if (globalToNpc) {\n const origin = new Point3d(-min.x / diag.x, -min.y / diag.y, -min.z / diag.z);\n Matrix3d.createScale(1.0 / diag.x, 1.0 / diag.y, 1.0 / diag.z, rMatrix);\n Transform.createOriginAndMatrix(origin, rMatrix, globalToNpc);\n }\n }\n}\n"]}
@@ -35,6 +35,12 @@ const Point3dVector3d_1 = require("./Point3dVector3d");
35
35
  * @public
36
36
  */
37
37
  class YawPitchRollAngles {
38
+ /** The yaw angle: counterclockwise rotation angle around z */
39
+ yaw;
40
+ /** The pitch angle: **clockwise** rotation angle around y */
41
+ pitch;
42
+ /** The roll angle: counterclockwise rotation angle around x */
43
+ roll;
38
44
  /**
39
45
  * Constructor
40
46
  * @param yaw counterclockwise rotation angle around z
@@ -1 +1 @@
1
- {"version":3,"file":"YawPitchRollAngles.js","sourceRoot":"","sources":["../../../src/geometry3d/YawPitchRollAngles.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AngleProps, Geometry } from \"../Geometry\";\nimport { Angle } from \"./Angle\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { Transform } from \"./Transform\";\n\n// cspell:word Tait\n\n/**\n * Angle properties of a `YawPitchRoll` orientation\n * @public\n */\nexport interface YawPitchRollProps {\n /** yaw field */\n yaw?: AngleProps;\n /** pitch field */\n pitch?: AngleProps;\n /** roll field */\n roll?: AngleProps;\n}\n\n/**\n * Three angles that determine the orientation of an object in space, sometimes referred to as [Tait–Bryan angles]\n * (https://en.wikipedia.org/wiki/Euler_angles).\n * * The matrix construction can be replicated by this logic:\n * * xyz coordinates have\n * * x forward\n * * y to left\n * * z up\n * * Note that this is a right handed coordinate system.\n * * yaw is a rotation of x towards y, i.e. around positive z (counterclockwise):\n * * `yawMatrix = Matrix3d.createRotationAroundAxisIndex(2, Angle.createDegrees(yawDegrees));`\n * * pitch is a rotation that raises x towards z, i.e. rotation around **negative y** (**clockwise**):\n * * `pitchMatrix = Matrix3d.createRotationAroundAxisIndex(1, Angle.createDegrees(-pitchDegrees));`\n * * roll is rotation of y towards z, i.e. rotation around positive x (counterclockwise):\n * * `rollMatrix = Matrix3d.createRotationAroundAxisIndex(0, Angle.createDegrees(rollDegrees));`\n * * The YPR matrix is the product\n * * `result = yawMatrix.multiplyMatrixMatrix(pitchMatrix.multiplyMatrixMatrix(rollMatrix));`\n * * Note that this is for \"column based\" matrix with vectors multiplying on the right of the matrix.\n * Hence a vector is first rotated by roll, then the pitch, finally yaw. So multiplication order in\n * the sense of AxisOrder is `RPY` (i.e., XYZ), in contrast to the familiar name `YPR`.\n * @public\n */\nexport class YawPitchRollAngles {\n /** The yaw angle: counterclockwise rotation angle around z */\n public yaw: Angle;\n /** The pitch angle: **clockwise** rotation angle around y */\n public pitch: Angle;\n /** The roll angle: counterclockwise rotation angle around x */\n public roll: Angle;\n /**\n * Constructor\n * @param yaw counterclockwise rotation angle around z\n * @param pitch **clockwise** rotation angle around y\n * @param roll counterclockwise rotation angle around x\n */\n constructor(yaw: Angle = Angle.zero(), pitch: Angle = Angle.zero(), roll: Angle = Angle.zero()) {\n this.yaw = yaw;\n this.pitch = pitch;\n this.roll = roll;\n }\n /** Freeze this YawPitchRollAngles */\n public freeze(): Readonly<this> {\n this.yaw.freeze();\n this.pitch.freeze();\n this.roll.freeze();\n return Object.freeze(this);\n }\n /**\n * Constructor for YawPitchRollAngles with angles in degrees.\n * @param yawDegrees counterclockwise rotation angle (in degrees) around z\n * @param pitchDegrees **clockwise** rotation angle (in degrees) around y\n * @param rollDegrees counterclockwise rotation angle (in degrees) around x\n */\n public static createDegrees(yawDegrees: number, pitchDegrees: number, rollDegrees: number): YawPitchRollAngles {\n return new YawPitchRollAngles(\n Angle.createDegrees(yawDegrees),\n Angle.createDegrees(pitchDegrees),\n Angle.createDegrees(rollDegrees),\n );\n }\n /**\n * Constructor for YawPitchRollAngles with angles in radians.\n * @param yawRadians counterclockwise rotation angle (in radians) around z\n * @param pitchRadians **clockwise** rotation angle (in radians) around y\n * @param rollRadians counterclockwise rotation angle (in radians) around x\n */\n public static createRadians(yawRadians: number, pitchRadians: number, rollRadians: number): YawPitchRollAngles {\n return new YawPitchRollAngles(\n Angle.createRadians(yawRadians),\n Angle.createRadians(pitchRadians),\n Angle.createRadians(rollRadians),\n );\n }\n /** Construct a `YawPitchRoll` object from an object with 3 named angles */\n public static fromJSON(json?: YawPitchRollProps): YawPitchRollAngles {\n json = json ? json : {};\n return new YawPitchRollAngles(\n Angle.fromJSON(json.yaw),\n Angle.fromJSON(json.pitch),\n Angle.fromJSON(json.roll),\n );\n }\n /** Populate yaw, pitch and roll fields using `Angle.fromJSON` */\n public setFromJSON(json?: YawPitchRollProps): void {\n json = json ? json : {};\n this.yaw = Angle.fromJSON(json.yaw);\n this.pitch = Angle.fromJSON(json.pitch);\n this.roll = Angle.fromJSON(json.roll);\n }\n /**\n * Convert to a JSON object of form { pitch: 20 , roll: 30 , yaw: 10 }. Angles are in degrees.\n * Any values that are exactly zero (with tolerance `Geometry.smallAngleRadians`) are omitted.\n */\n public toJSON(): YawPitchRollProps {\n const val: YawPitchRollProps = {};\n if (!this.pitch.isAlmostZero)\n val.pitch = this.pitch.toJSON();\n if (!this.roll.isAlmostZero)\n val.roll = this.roll.toJSON();\n if (!this.yaw.isAlmostZero)\n val.yaw = this.yaw.toJSON();\n return val;\n }\n /**\n * Install all rotations from `other` into `this`.\n * @param other YawPitchRollAngles source\n */\n public setFrom(other: YawPitchRollAngles) {\n this.yaw.setFrom(other.yaw);\n this.pitch.setFrom(other.pitch);\n this.roll.setFrom(other.roll);\n }\n /**\n * Compare angles between `this` and `other`.\n * * Comparisons are via `isAlmostEqualAllowPeriodShift`.\n * @param other YawPitchRollAngles source\n */\n public isAlmostEqual(other: YawPitchRollAngles): boolean {\n return this.yaw.isAlmostEqualAllowPeriodShift(other.yaw)\n && this.pitch.isAlmostEqualAllowPeriodShift(other.pitch)\n && this.roll.isAlmostEqualAllowPeriodShift(other.roll);\n }\n /** Make a copy of this YawPitchRollAngles */\n public clone(): YawPitchRollAngles {\n return new YawPitchRollAngles(\n this.yaw.clone(),\n this.pitch.clone(),\n this.roll.clone(),\n );\n }\n /**\n * Expand the angles into a (rigid rotation) matrix.\n * * The returned matrix is \"rigid\" (i.e., it has unit length rows and columns, and its transpose is its inverse).\n * * The rigid matrix is always a right handed coordinate system.\n * @param result optional pre-allocated `Matrix3d`\n */\n public toMatrix3d(result?: Matrix3d): Matrix3d {\n const cz = Math.cos(this.yaw.radians);\n const sz = Math.sin(this.yaw.radians);\n const cy = Math.cos(this.pitch.radians);\n const sy = Math.sin(this.pitch.radians);\n const cx = Math.cos(this.roll.radians);\n const sx = Math.sin(this.roll.radians);\n /**\n * The axis order is XYZ (i.e., RPY) so the rotation matrix is calculated via rZ*rY*rX where\n * rX, rY, and rZ are base rotation matrixes:\n *\n * const rX = Matrix3d.createRowValues(\n * 1, 0, 0,\n * 0, Math.cos(x), -Math.sin(x),\n * 0, Math.sin(x), Math.cos(x),\n * );\n * const rY = Matrix3d.createRowValues(\n * Math.cos(y), 0, Math.sin(y),\n * 0, 1, 0,\n * -Math.sin(y), 0, Math.cos(y),\n * );\n * const rZ = Matrix3d.createRowValues(\n * Math.cos(z), -Math.sin(z), 0,\n * Math.sin(z), Math.cos(z), 0,\n * 0, 0, 1,\n * );\n *\n * Then we replace sin(y) with -sin(y) because y rotation (i.e., pitch) is clockwise (alternatively, you\n * can use transpose of rY in the matrix multiplication to get the same result)\n */\n return Matrix3d.createRowValues(\n cz * cy, -(sz * cx + cz * sy * sx), (sz * sx - cz * sy * cx),\n sz * cy, (cz * cx - sz * sy * sx), -(cz * sx + sz * sy * cx),\n sy, cy * sx, cy * cx,\n result,\n );\n }\n /**\n * Returns true if this rotation does nothing.\n * * If allowPeriodShift is false, any nonzero angle is considered a non-identity\n * * If allowPeriodShift is true, all angles are individually allowed to be any multiple of 360 degrees.\n */\n public isIdentity(allowPeriodShift: boolean = true): boolean {\n if (allowPeriodShift)\n return Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.yaw.radians)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.pitch.radians)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.roll.radians);\n else\n return Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.yaw.radians)\n && Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.pitch.radians)\n && Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.roll.radians);\n }\n /** Return the largest angle in radians */\n public maxAbsRadians(): number {\n return Geometry.maxAbsXYZ(this.yaw.radians, this.pitch.radians, this.roll.radians);\n }\n /** Return the sum of the angles in squared radians */\n public sumSquaredRadians(): number {\n return Geometry.hypotenuseSquaredXYZ(this.yaw.radians, this.pitch.radians, this.roll.radians);\n }\n /** Return the largest difference of angles (in radians) between this and other */\n public maxDiffRadians(other: YawPitchRollAngles): number {\n return Math.max(\n this.yaw.radians - other.yaw.radians,\n this.pitch.radians - other.pitch.radians,\n this.roll.radians - other.roll.radians,\n );\n }\n /** Return the largest angle in degrees. */\n public maxAbsDegrees(): number {\n return Geometry.maxAbsXYZ(this.yaw.degrees, this.pitch.degrees, this.roll.degrees);\n }\n /** Return the sum of squared angles in degrees. */\n public sumSquaredDegrees(): number {\n return Geometry.hypotenuseSquaredXYZ(this.yaw.degrees, this.pitch.degrees, this.roll.degrees);\n }\n /** Return the largest difference of angles (in degrees) between this and other */\n public maxDiffDegrees(other: YawPitchRollAngles): number {\n return Math.max(\n this.yaw.degrees - other.yaw.degrees,\n this.pitch.degrees - other.pitch.degrees,\n this.roll.degrees - other.roll.degrees,\n );\n }\n /** Return an object from a Transform as an origin and YawPitchRollAngles. */\n public static tryFromTransform(transform: Transform): {\n origin: Point3d;\n angles: YawPitchRollAngles | undefined;\n } {\n return {\n origin: Point3d.createFrom(transform.origin),\n angles: YawPitchRollAngles.createFromMatrix3d(transform.matrix),\n };\n }\n /**\n * Attempts to create a YawPitchRollAngles object from a Matrix3d.\n * @param matrix rigid matrix to process. Caller can test for rigidity with [[Matrix3d.isRigid]] and\n * ensure rigid input with [[Matrix3d.createRigidFromMatrix3d]] or [[Matrix3d.makeRigid]].\n * @param result optional pre-allocated object to populate and return.\n * @returns computed angles, or undefined if `matrix` is not rigid.\n * * Even when undefined is returned, `result` (if supplied) is populated with angles that may be used with caution:\n * their usefulness decreases the further `matrix` is from being rigid.\n */\n public static createFromMatrix3d(matrix: Matrix3d, result?: YawPitchRollAngles): YawPitchRollAngles | undefined {\n /**\n * The rotation matrix form is\n *\n * Matrix3d.createRowValues(\n * cz * cy, -(sz * cx + cz * sy * sx), (sz * sx - cz * sy * cx),\n * sz * cy, (cz * cx - sz * sy * sx), -(cz * sx + sz * sy * cx),\n * sy, cy * sx, cy * cx\n * );\n *\n * where cx = cos(x), sx = sin(x), cy = cos(y), sy = sin(y), cz = cos(z), and sz = sin(z)\n */\n const sy = matrix.at(2, 0); // sin(y)\n const cy = Math.sqrt(matrix.at(2, 1) * matrix.at(2, 1) + matrix.at(2, 2) * matrix.at(2, 2)); // |cos(y)|\n const pitchA = Angle.createAtan2(sy, cy); // with positive cosine\n const pitchB = Angle.createAtan2(sy, -cy); // with negative cosine\n const angles = result ? result : new YawPitchRollAngles();\n /**\n * If cos(y) = 0 then y = +-90 degrees so we have a gimbal lock.\n * This means x and z can be anything as long as their sum x + z is constant.\n * so we can pick z = 0 and calculate x (or pick x = 0 and calculate z).\n * Math details can be found\n * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles\n *\n * The rotation matrix for y = +-90 degrees and x = 0 becomes\n *\n * Matrix3d.createRowValues(\n * 0, -sz, -+cz,\n * 0, cz, -+sz,\n * +-1, 0, 0\n * );\n *\n * so z = atan(sz/cz) = atan(-matrix.at(0, 1), matrix.at(1, 1))\n */\n if (cy < Geometry.smallAngleRadians) {\n angles.yaw = Angle.createAtan2(-matrix.at(0, 1), matrix.at(1, 1));\n angles.pitch = pitchA; // this is an arbitrary choice. can pick pitchB instead.\n angles.roll = Angle.createRadians(0.0);\n } else {\n /**\n * positive cosine\n * z = atan(sz/cz) = atan(matrix.at(1, 0), matrix.at(0, 0))\n * x = atan(sx/cx) = atan(matrix.at(2, 1), matrix.at(2, 2))\n */\n const yawA = Angle.createAtan2(matrix.at(1, 0), matrix.at(0, 0));\n const rollA = Angle.createAtan2(matrix.at(2, 1), matrix.at(2, 2));\n // similar with negative cosine\n const yawB = Angle.createAtan2(-matrix.at(1, 0), -matrix.at(0, 0));\n const rollB = Angle.createAtan2(-matrix.at(2, 1), -matrix.at(2, 2));\n // create YPR\n const yprA = new YawPitchRollAngles(yawA, pitchA, rollA);\n const yprB = new YawPitchRollAngles(yawB, pitchB, rollB);\n // decide to pick yprA or yprB with smallest magnitude angles\n const absFactor = 0.95;\n const maxRadiansA = yprA.maxAbsRadians();\n const maxRadiansB = yprB.maxAbsRadians();\n if (maxRadiansA < absFactor * maxRadiansB) {\n angles.setFrom(yprA);\n } else if (maxRadiansB < absFactor * maxRadiansA) {\n angles.setFrom(yprB);\n } else {\n const sumA = yprA.sumSquaredRadians();\n const sumB = yprB.sumSquaredRadians();\n if (sumA <= sumB) {\n angles.setFrom(yprA);\n } else {\n angles.setFrom(yprB);\n }\n }\n }\n // sanity check\n const matrix1 = angles.toMatrix3d();\n return matrix.isAlmostEqual(matrix1) ? angles : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"YawPitchRollAngles.js","sourceRoot":"","sources":["../../../src/geometry3d/YawPitchRollAngles.ts"],"names":[],"mappings":"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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\n/** @packageDocumentation\n * @module CartesianGeometry\n */\n\nimport { AngleProps, Geometry } from \"../Geometry\";\nimport { Angle } from \"./Angle\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point3d } from \"./Point3dVector3d\";\nimport { Transform } from \"./Transform\";\n\n// cspell:word Tait\n\n/**\n * Angle properties of a `YawPitchRoll` orientation\n * @public\n */\nexport interface YawPitchRollProps {\n /** yaw field */\n yaw?: AngleProps;\n /** pitch field */\n pitch?: AngleProps;\n /** roll field */\n roll?: AngleProps;\n}\n\n/**\n * Three angles that determine the orientation of an object in space, sometimes referred to as [Tait–Bryan angles]\n * (https://en.wikipedia.org/wiki/Euler_angles).\n * * The matrix construction can be replicated by this logic:\n * * xyz coordinates have\n * * x forward\n * * y to left\n * * z up\n * * Note that this is a right handed coordinate system.\n * * yaw is a rotation of x towards y, i.e. around positive z (counterclockwise):\n * * `yawMatrix = Matrix3d.createRotationAroundAxisIndex(2, Angle.createDegrees(yawDegrees));`\n * * pitch is a rotation that raises x towards z, i.e. rotation around **negative y** (**clockwise**):\n * * `pitchMatrix = Matrix3d.createRotationAroundAxisIndex(1, Angle.createDegrees(-pitchDegrees));`\n * * roll is rotation of y towards z, i.e. rotation around positive x (counterclockwise):\n * * `rollMatrix = Matrix3d.createRotationAroundAxisIndex(0, Angle.createDegrees(rollDegrees));`\n * * The YPR matrix is the product\n * * `result = yawMatrix.multiplyMatrixMatrix(pitchMatrix.multiplyMatrixMatrix(rollMatrix));`\n * * Note that this is for \"column based\" matrix with vectors multiplying on the right of the matrix.\n * Hence a vector is first rotated by roll, then the pitch, finally yaw. So multiplication order in\n * the sense of AxisOrder is `RPY` (i.e., XYZ), in contrast to the familiar name `YPR`.\n * @public\n */\nexport class YawPitchRollAngles {\n /** The yaw angle: counterclockwise rotation angle around z */\n public yaw: Angle;\n /** The pitch angle: **clockwise** rotation angle around y */\n public pitch: Angle;\n /** The roll angle: counterclockwise rotation angle around x */\n public roll: Angle;\n /**\n * Constructor\n * @param yaw counterclockwise rotation angle around z\n * @param pitch **clockwise** rotation angle around y\n * @param roll counterclockwise rotation angle around x\n */\n constructor(yaw: Angle = Angle.zero(), pitch: Angle = Angle.zero(), roll: Angle = Angle.zero()) {\n this.yaw = yaw;\n this.pitch = pitch;\n this.roll = roll;\n }\n /** Freeze this YawPitchRollAngles */\n public freeze(): Readonly<this> {\n this.yaw.freeze();\n this.pitch.freeze();\n this.roll.freeze();\n return Object.freeze(this);\n }\n /**\n * Constructor for YawPitchRollAngles with angles in degrees.\n * @param yawDegrees counterclockwise rotation angle (in degrees) around z\n * @param pitchDegrees **clockwise** rotation angle (in degrees) around y\n * @param rollDegrees counterclockwise rotation angle (in degrees) around x\n */\n public static createDegrees(yawDegrees: number, pitchDegrees: number, rollDegrees: number): YawPitchRollAngles {\n return new YawPitchRollAngles(\n Angle.createDegrees(yawDegrees),\n Angle.createDegrees(pitchDegrees),\n Angle.createDegrees(rollDegrees),\n );\n }\n /**\n * Constructor for YawPitchRollAngles with angles in radians.\n * @param yawRadians counterclockwise rotation angle (in radians) around z\n * @param pitchRadians **clockwise** rotation angle (in radians) around y\n * @param rollRadians counterclockwise rotation angle (in radians) around x\n */\n public static createRadians(yawRadians: number, pitchRadians: number, rollRadians: number): YawPitchRollAngles {\n return new YawPitchRollAngles(\n Angle.createRadians(yawRadians),\n Angle.createRadians(pitchRadians),\n Angle.createRadians(rollRadians),\n );\n }\n /** Construct a `YawPitchRoll` object from an object with 3 named angles */\n public static fromJSON(json?: YawPitchRollProps): YawPitchRollAngles {\n json = json ? json : {};\n return new YawPitchRollAngles(\n Angle.fromJSON(json.yaw),\n Angle.fromJSON(json.pitch),\n Angle.fromJSON(json.roll),\n );\n }\n /** Populate yaw, pitch and roll fields using `Angle.fromJSON` */\n public setFromJSON(json?: YawPitchRollProps): void {\n json = json ? json : {};\n this.yaw = Angle.fromJSON(json.yaw);\n this.pitch = Angle.fromJSON(json.pitch);\n this.roll = Angle.fromJSON(json.roll);\n }\n /**\n * Convert to a JSON object of form { pitch: 20 , roll: 30 , yaw: 10 }. Angles are in degrees.\n * Any values that are exactly zero (with tolerance `Geometry.smallAngleRadians`) are omitted.\n */\n public toJSON(): YawPitchRollProps {\n const val: YawPitchRollProps = {};\n if (!this.pitch.isAlmostZero)\n val.pitch = this.pitch.toJSON();\n if (!this.roll.isAlmostZero)\n val.roll = this.roll.toJSON();\n if (!this.yaw.isAlmostZero)\n val.yaw = this.yaw.toJSON();\n return val;\n }\n /**\n * Install all rotations from `other` into `this`.\n * @param other YawPitchRollAngles source\n */\n public setFrom(other: YawPitchRollAngles) {\n this.yaw.setFrom(other.yaw);\n this.pitch.setFrom(other.pitch);\n this.roll.setFrom(other.roll);\n }\n /**\n * Compare angles between `this` and `other`.\n * * Comparisons are via `isAlmostEqualAllowPeriodShift`.\n * @param other YawPitchRollAngles source\n */\n public isAlmostEqual(other: YawPitchRollAngles): boolean {\n return this.yaw.isAlmostEqualAllowPeriodShift(other.yaw)\n && this.pitch.isAlmostEqualAllowPeriodShift(other.pitch)\n && this.roll.isAlmostEqualAllowPeriodShift(other.roll);\n }\n /** Make a copy of this YawPitchRollAngles */\n public clone(): YawPitchRollAngles {\n return new YawPitchRollAngles(\n this.yaw.clone(),\n this.pitch.clone(),\n this.roll.clone(),\n );\n }\n /**\n * Expand the angles into a (rigid rotation) matrix.\n * * The returned matrix is \"rigid\" (i.e., it has unit length rows and columns, and its transpose is its inverse).\n * * The rigid matrix is always a right handed coordinate system.\n * @param result optional pre-allocated `Matrix3d`\n */\n public toMatrix3d(result?: Matrix3d): Matrix3d {\n const cz = Math.cos(this.yaw.radians);\n const sz = Math.sin(this.yaw.radians);\n const cy = Math.cos(this.pitch.radians);\n const sy = Math.sin(this.pitch.radians);\n const cx = Math.cos(this.roll.radians);\n const sx = Math.sin(this.roll.radians);\n /**\n * The axis order is XYZ (i.e., RPY) so the rotation matrix is calculated via rZ*rY*rX where\n * rX, rY, and rZ are base rotation matrixes:\n *\n * const rX = Matrix3d.createRowValues(\n * 1, 0, 0,\n * 0, Math.cos(x), -Math.sin(x),\n * 0, Math.sin(x), Math.cos(x),\n * );\n * const rY = Matrix3d.createRowValues(\n * Math.cos(y), 0, Math.sin(y),\n * 0, 1, 0,\n * -Math.sin(y), 0, Math.cos(y),\n * );\n * const rZ = Matrix3d.createRowValues(\n * Math.cos(z), -Math.sin(z), 0,\n * Math.sin(z), Math.cos(z), 0,\n * 0, 0, 1,\n * );\n *\n * Then we replace sin(y) with -sin(y) because y rotation (i.e., pitch) is clockwise (alternatively, you\n * can use transpose of rY in the matrix multiplication to get the same result)\n */\n return Matrix3d.createRowValues(\n cz * cy, -(sz * cx + cz * sy * sx), (sz * sx - cz * sy * cx),\n sz * cy, (cz * cx - sz * sy * sx), -(cz * sx + sz * sy * cx),\n sy, cy * sx, cy * cx,\n result,\n );\n }\n /**\n * Returns true if this rotation does nothing.\n * * If allowPeriodShift is false, any nonzero angle is considered a non-identity\n * * If allowPeriodShift is true, all angles are individually allowed to be any multiple of 360 degrees.\n */\n public isIdentity(allowPeriodShift: boolean = true): boolean {\n if (allowPeriodShift)\n return Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.yaw.radians)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.pitch.radians)\n && Angle.isAlmostEqualRadiansAllowPeriodShift(0.0, this.roll.radians);\n else\n return Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.yaw.radians)\n && Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.pitch.radians)\n && Angle.isAlmostEqualRadiansNoPeriodShift(0.0, this.roll.radians);\n }\n /** Return the largest angle in radians */\n public maxAbsRadians(): number {\n return Geometry.maxAbsXYZ(this.yaw.radians, this.pitch.radians, this.roll.radians);\n }\n /** Return the sum of the angles in squared radians */\n public sumSquaredRadians(): number {\n return Geometry.hypotenuseSquaredXYZ(this.yaw.radians, this.pitch.radians, this.roll.radians);\n }\n /** Return the largest difference of angles (in radians) between this and other */\n public maxDiffRadians(other: YawPitchRollAngles): number {\n return Math.max(\n this.yaw.radians - other.yaw.radians,\n this.pitch.radians - other.pitch.radians,\n this.roll.radians - other.roll.radians,\n );\n }\n /** Return the largest angle in degrees. */\n public maxAbsDegrees(): number {\n return Geometry.maxAbsXYZ(this.yaw.degrees, this.pitch.degrees, this.roll.degrees);\n }\n /** Return the sum of squared angles in degrees. */\n public sumSquaredDegrees(): number {\n return Geometry.hypotenuseSquaredXYZ(this.yaw.degrees, this.pitch.degrees, this.roll.degrees);\n }\n /** Return the largest difference of angles (in degrees) between this and other */\n public maxDiffDegrees(other: YawPitchRollAngles): number {\n return Math.max(\n this.yaw.degrees - other.yaw.degrees,\n this.pitch.degrees - other.pitch.degrees,\n this.roll.degrees - other.roll.degrees,\n );\n }\n /** Return an object from a Transform as an origin and YawPitchRollAngles. */\n public static tryFromTransform(transform: Transform): {\n origin: Point3d;\n angles: YawPitchRollAngles | undefined;\n } {\n return {\n origin: Point3d.createFrom(transform.origin),\n angles: YawPitchRollAngles.createFromMatrix3d(transform.matrix),\n };\n }\n /**\n * Attempts to create a YawPitchRollAngles object from a Matrix3d.\n * @param matrix rigid matrix to process. Caller can test for rigidity with [[Matrix3d.isRigid]] and\n * ensure rigid input with [[Matrix3d.createRigidFromMatrix3d]] or [[Matrix3d.makeRigid]].\n * @param result optional pre-allocated object to populate and return.\n * @returns computed angles, or undefined if `matrix` is not rigid.\n * * Even when undefined is returned, `result` (if supplied) is populated with angles that may be used with caution:\n * their usefulness decreases the further `matrix` is from being rigid.\n */\n public static createFromMatrix3d(matrix: Matrix3d, result?: YawPitchRollAngles): YawPitchRollAngles | undefined {\n /**\n * The rotation matrix form is\n *\n * Matrix3d.createRowValues(\n * cz * cy, -(sz * cx + cz * sy * sx), (sz * sx - cz * sy * cx),\n * sz * cy, (cz * cx - sz * sy * sx), -(cz * sx + sz * sy * cx),\n * sy, cy * sx, cy * cx\n * );\n *\n * where cx = cos(x), sx = sin(x), cy = cos(y), sy = sin(y), cz = cos(z), and sz = sin(z)\n */\n const sy = matrix.at(2, 0); // sin(y)\n const cy = Math.sqrt(matrix.at(2, 1) * matrix.at(2, 1) + matrix.at(2, 2) * matrix.at(2, 2)); // |cos(y)|\n const pitchA = Angle.createAtan2(sy, cy); // with positive cosine\n const pitchB = Angle.createAtan2(sy, -cy); // with negative cosine\n const angles = result ? result : new YawPitchRollAngles();\n /**\n * If cos(y) = 0 then y = +-90 degrees so we have a gimbal lock.\n * This means x and z can be anything as long as their sum x + z is constant.\n * so we can pick z = 0 and calculate x (or pick x = 0 and calculate z).\n * Math details can be found\n * https://en.wikipedia.org/wiki/Gimbal_lock#Loss_of_a_degree_of_freedom_with_Euler_angles\n *\n * The rotation matrix for y = +-90 degrees and x = 0 becomes\n *\n * Matrix3d.createRowValues(\n * 0, -sz, -+cz,\n * 0, cz, -+sz,\n * +-1, 0, 0\n * );\n *\n * so z = atan(sz/cz) = atan(-matrix.at(0, 1), matrix.at(1, 1))\n */\n if (cy < Geometry.smallAngleRadians) {\n angles.yaw = Angle.createAtan2(-matrix.at(0, 1), matrix.at(1, 1));\n angles.pitch = pitchA; // this is an arbitrary choice. can pick pitchB instead.\n angles.roll = Angle.createRadians(0.0);\n } else {\n /**\n * positive cosine\n * z = atan(sz/cz) = atan(matrix.at(1, 0), matrix.at(0, 0))\n * x = atan(sx/cx) = atan(matrix.at(2, 1), matrix.at(2, 2))\n */\n const yawA = Angle.createAtan2(matrix.at(1, 0), matrix.at(0, 0));\n const rollA = Angle.createAtan2(matrix.at(2, 1), matrix.at(2, 2));\n // similar with negative cosine\n const yawB = Angle.createAtan2(-matrix.at(1, 0), -matrix.at(0, 0));\n const rollB = Angle.createAtan2(-matrix.at(2, 1), -matrix.at(2, 2));\n // create YPR\n const yprA = new YawPitchRollAngles(yawA, pitchA, rollA);\n const yprB = new YawPitchRollAngles(yawB, pitchB, rollB);\n // decide to pick yprA or yprB with smallest magnitude angles\n const absFactor = 0.95;\n const maxRadiansA = yprA.maxAbsRadians();\n const maxRadiansB = yprB.maxAbsRadians();\n if (maxRadiansA < absFactor * maxRadiansB) {\n angles.setFrom(yprA);\n } else if (maxRadiansB < absFactor * maxRadiansA) {\n angles.setFrom(yprB);\n } else {\n const sumA = yprA.sumSquaredRadians();\n const sumB = yprB.sumSquaredRadians();\n if (sumA <= sumB) {\n angles.setFrom(yprA);\n } else {\n angles.setFrom(yprB);\n }\n }\n }\n // sanity check\n const matrix1 = angles.toMatrix3d();\n return matrix.isAlmostEqual(matrix1) ? angles : undefined;\n }\n}\n"]}
@@ -16,6 +16,8 @@ const Matrix4d_1 = require("./Matrix4d");
16
16
  * @public
17
17
  */
18
18
  class Map4d {
19
+ _matrix0;
20
+ _matrix1;
19
21
  constructor(matrix0, matrix1) {
20
22
  this._matrix0 = matrix0;
21
23
  this._matrix1 = matrix1;