@itwin/core-geometry 4.6.0-dev.0 → 4.6.0-dev.10

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 (452) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  5. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  10. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  13. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  14. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  15. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  16. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  17. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  19. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  21. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  22. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  23. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  25. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  26. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  27. package/lib/cjs/core-geometry.d.ts +1 -0
  28. package/lib/cjs/core-geometry.d.ts.map +1 -1
  29. package/lib/cjs/core-geometry.js +1 -0
  30. package/lib/cjs/core-geometry.js.map +1 -1
  31. package/lib/cjs/curve/Arc3d.js.map +1 -1
  32. package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
  33. package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
  34. package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
  35. package/lib/cjs/curve/CurveCollection.js.map +1 -1
  36. package/lib/cjs/curve/CurveCurve.js.map +1 -1
  37. package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
  38. package/lib/cjs/curve/CurveFactory.js.map +1 -1
  39. package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
  40. package/lib/cjs/curve/CurveOps.js.map +1 -1
  41. package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
  42. package/lib/cjs/curve/CurveProcessor.js.map +1 -1
  43. package/lib/cjs/curve/CurveTypes.js.map +1 -1
  44. package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
  45. package/lib/cjs/curve/GeometryQuery.js.map +1 -1
  46. package/lib/cjs/curve/LineSegment3d.js.map +1 -1
  47. package/lib/cjs/curve/LineString3d.js.map +1 -1
  48. package/lib/cjs/curve/Loop.js.map +1 -1
  49. package/lib/cjs/curve/OffsetOptions.js.map +1 -1
  50. package/lib/cjs/curve/ParityRegion.js.map +1 -1
  51. package/lib/cjs/curve/Path.js.map +1 -1
  52. package/lib/cjs/curve/PointString3d.js.map +1 -1
  53. package/lib/cjs/curve/ProxyCurve.js.map +1 -1
  54. package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  55. package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
  56. package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
  57. package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
  58. package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
  59. package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
  60. package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
  61. package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
  62. package/lib/cjs/curve/RegionOps.js.map +1 -1
  63. package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
  64. package/lib/cjs/curve/StrokeOptions.js.map +1 -1
  65. package/lib/cjs/curve/UnionRegion.js.map +1 -1
  66. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  67. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  68. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  69. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  71. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  72. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  74. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  75. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  78. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  79. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  81. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  83. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  84. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  85. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  86. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  87. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  88. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  89. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  90. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  91. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  92. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  93. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  94. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  95. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  96. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  97. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  98. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  99. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  100. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  101. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  102. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  103. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  104. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  105. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  106. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  107. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  108. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  109. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  110. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  111. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  112. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  113. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  114. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  115. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  116. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  117. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  118. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  119. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  120. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  121. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  122. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  123. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  124. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  125. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  126. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  127. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  128. package/lib/cjs/geometry3d/Range.js.map +1 -1
  129. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  130. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  131. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  132. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  133. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  134. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  135. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  136. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  137. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  138. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  139. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  140. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  141. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  142. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  143. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  144. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  145. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  146. package/lib/cjs/numerics/Complex.js.map +1 -1
  147. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  148. package/lib/cjs/numerics/Newton.js.map +1 -1
  149. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  150. package/lib/cjs/numerics/PolarData.js.map +1 -1
  151. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  152. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  153. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  154. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  155. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  156. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  157. package/lib/cjs/polyface/AuxData.js.map +1 -1
  158. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  159. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  160. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  161. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  162. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  163. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  164. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  165. package/lib/cjs/polyface/Polyface.js.map +1 -1
  166. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  167. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  168. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  169. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  170. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  171. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  172. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  173. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  174. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  175. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  176. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  177. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  178. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  179. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  180. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  181. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  182. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  183. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  184. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  185. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  186. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  187. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  188. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  189. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  190. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  191. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  192. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  193. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  194. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  195. package/lib/cjs/serialization/SerializationHelpers.d.ts +29 -6
  196. package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -1
  197. package/lib/cjs/serialization/SerializationHelpers.js +12 -10
  198. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  199. package/lib/cjs/solid/Box.js.map +1 -1
  200. package/lib/cjs/solid/Cone.js.map +1 -1
  201. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  202. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  203. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  204. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  205. package/lib/cjs/solid/Sphere.js.map +1 -1
  206. package/lib/cjs/solid/SweepContour.js.map +1 -1
  207. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  208. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  209. package/lib/cjs/topology/Graph.js.map +1 -1
  210. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  211. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  212. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  213. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  214. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  215. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  216. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  217. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  218. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  219. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  220. package/lib/cjs/topology/MaskManager.js.map +1 -1
  221. package/lib/cjs/topology/Merging.js.map +1 -1
  222. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  223. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  224. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  225. package/lib/cjs/topology/Triangulation.js.map +1 -1
  226. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  227. package/lib/esm/Constant.js.map +1 -1
  228. package/lib/esm/Geometry.js.map +1 -1
  229. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  230. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  231. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  232. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  233. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  234. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  235. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  236. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  237. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  238. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  239. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  240. package/lib/esm/bspline/KnotVector.js.map +1 -1
  241. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  242. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  243. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  244. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  245. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  246. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  247. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  248. package/lib/esm/clipping/ClipVector.js.map +1 -1
  249. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  250. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  251. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  252. package/lib/esm/core-geometry.d.ts +1 -0
  253. package/lib/esm/core-geometry.d.ts.map +1 -1
  254. package/lib/esm/core-geometry.js +1 -0
  255. package/lib/esm/core-geometry.js.map +1 -1
  256. package/lib/esm/curve/Arc3d.js.map +1 -1
  257. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  258. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  259. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  260. package/lib/esm/curve/CurveCollection.js.map +1 -1
  261. package/lib/esm/curve/CurveCurve.js.map +1 -1
  262. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  263. package/lib/esm/curve/CurveFactory.js.map +1 -1
  264. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  265. package/lib/esm/curve/CurveOps.js.map +1 -1
  266. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  267. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  268. package/lib/esm/curve/CurveTypes.js.map +1 -1
  269. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  270. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  271. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  272. package/lib/esm/curve/LineString3d.js.map +1 -1
  273. package/lib/esm/curve/Loop.js.map +1 -1
  274. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  275. package/lib/esm/curve/ParityRegion.js.map +1 -1
  276. package/lib/esm/curve/Path.js.map +1 -1
  277. package/lib/esm/curve/PointString3d.js.map +1 -1
  278. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  279. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  280. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  281. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  282. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  283. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  284. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  285. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  286. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  287. package/lib/esm/curve/RegionOps.js.map +1 -1
  288. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  289. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  290. package/lib/esm/curve/UnionRegion.js.map +1 -1
  291. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  292. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  293. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  294. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  295. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  296. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  297. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  298. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  299. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  300. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  301. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  302. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  303. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  304. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  305. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  306. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  307. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  308. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  309. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  310. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  311. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  312. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  313. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  314. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  315. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  316. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  317. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  318. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  319. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  320. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  321. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  322. package/lib/esm/geometry3d/Angle.js.map +1 -1
  323. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  324. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  325. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  326. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  327. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  328. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  329. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  330. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  331. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  332. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  333. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  334. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  335. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  336. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  337. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  338. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  339. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  340. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  341. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  342. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  343. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  344. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  345. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  346. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  347. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  348. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  349. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  350. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  351. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  352. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  353. package/lib/esm/geometry3d/Range.js.map +1 -1
  354. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  355. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  356. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  357. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  358. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  359. package/lib/esm/geometry3d/Transform.js.map +1 -1
  360. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  361. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  362. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  363. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  364. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  365. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  366. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  367. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  368. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  369. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  370. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  371. package/lib/esm/numerics/Complex.js.map +1 -1
  372. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  373. package/lib/esm/numerics/Newton.js.map +1 -1
  374. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  375. package/lib/esm/numerics/PolarData.js.map +1 -1
  376. package/lib/esm/numerics/Polynomials.js.map +1 -1
  377. package/lib/esm/numerics/Quadrature.js.map +1 -1
  378. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  379. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  380. package/lib/esm/numerics/UnionFind.js.map +1 -1
  381. package/lib/esm/numerics/UsageSums.js.map +1 -1
  382. package/lib/esm/polyface/AuxData.js.map +1 -1
  383. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  384. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  385. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  386. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  387. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  388. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  389. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  390. package/lib/esm/polyface/Polyface.js.map +1 -1
  391. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  392. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  393. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  394. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  395. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  396. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  397. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  398. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  399. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  400. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  401. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  402. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  403. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  404. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  405. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  406. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  407. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  408. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  409. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  410. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  411. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  412. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  413. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  414. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  415. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  416. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  417. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  418. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  419. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  420. package/lib/esm/serialization/SerializationHelpers.d.ts +29 -6
  421. package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -1
  422. package/lib/esm/serialization/SerializationHelpers.js +12 -10
  423. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  424. package/lib/esm/solid/Box.js.map +1 -1
  425. package/lib/esm/solid/Cone.js.map +1 -1
  426. package/lib/esm/solid/LinearSweep.js.map +1 -1
  427. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  428. package/lib/esm/solid/RuledSweep.js.map +1 -1
  429. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  430. package/lib/esm/solid/Sphere.js.map +1 -1
  431. package/lib/esm/solid/SweepContour.js.map +1 -1
  432. package/lib/esm/solid/TorusPipe.js.map +1 -1
  433. package/lib/esm/topology/ChainMerge.js.map +1 -1
  434. package/lib/esm/topology/Graph.js.map +1 -1
  435. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  436. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  437. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  438. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  439. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  440. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  441. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  442. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  443. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  444. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  445. package/lib/esm/topology/MaskManager.js.map +1 -1
  446. package/lib/esm/topology/Merging.js.map +1 -1
  447. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  448. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  449. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  450. package/lib/esm/topology/Triangulation.js.map +1 -1
  451. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  452. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Ellipsoid.js","sourceRoot":"","sources":["../../../src/geometry3d/Ellipsoid.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 { CurveAndSurfaceLocationDetail, UVSurfaceLocationDetail } from \"../bspline/SurfaceLocationDetail\";\nimport { Clipper } from \"../clipping/ClipUtils\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { AxisIndex, AxisOrder, Geometry } from \"../Geometry\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { Order3Bezier } from \"../numerics/BezierPolynomials\";\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\nimport { SineCosinePolynomial, SphereImplicit, TrigPolynomial } from \"../numerics/Polynomials\";\nimport { TriDiagonalSystem } from \"../numerics/TriDiagonalSystem\";\nimport { Angle } from \"./Angle\";\nimport { AngleSweep } from \"./AngleSweep\";\nimport { UVSurface } from \"./GeometryHandler\";\nimport { LongitudeLatitudeNumber } from \"./LongitudeLatitudeAltitude\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Range1d, Range3d } from \"./Range\";\nimport { Ray3d } from \"./Ray3d\";\nimport { Transform } from \"./Transform\";\nimport { XYAndZ } from \"./XYZProps\";\n\n/**\n * For one component (x,y, or z) on the sphere\n * f(theta,phi) = c + (u * cos(theta) + v * sin(theta)) * cos(phi) + w * sin(phi)\n *\n * For the equator circle, phi=0, cos(phi) = 1, sin(phi)=0\n * f = u * cos(theta) + v * sin(theta).\n * with derivative\n * df / dTheta = = u * sin(theta) + v * cos(theta)\n * whose zero is tan(theta) = v/u\n * (and that has two solutions 180 degrees apart)\n * Then with that theta let A = u * cos(theta) + v * sin(theta)\n * f = A * cos(phi) + w * sin(phi)\n * df/dPhi = - A * sin(phi) + w * cos(phi)\n * tan(phi) = w / A\n * @internal\n */\nclass EllipsoidComponentExtrema {\n public c: number;\n public u: number;\n public v: number;\n public w: number;\n public axisIndex: AxisIndex;\n public theta0Radians: number;\n public phi0Radians: number;\n public cosTheta0: number;\n public sinTheta0: number;\n public cosPhi0: number;\n public sinPhi0: number;\n // temp vars used in arc range evaluation:\n private _axisRange: Range1d;\n private _trigForm: SineCosinePolynomial;\n public constructor(c: number, u: number, v: number, w: number, axisIndex: AxisIndex) {\n this.c = c;\n this.u = u;\n this.v = v;\n this.w = w;\n this.axisIndex = axisIndex;\n this.theta0Radians = Math.atan2(v, u);\n this.cosTheta0 = Math.cos(this.theta0Radians);\n this.sinTheta0 = Math.sin(this.theta0Radians);\n const A0 = u * this.cosTheta0 + v * this.sinTheta0;\n this.phi0Radians = Math.atan2(w, A0);\n this.cosPhi0 = Math.cos(this.phi0Radians);\n this.sinPhi0 = Math.sin(this.phi0Radians);\n this._axisRange = Range1d.createNull();\n this._trigForm = new SineCosinePolynomial(0, 0, 0);\n\n }\n /**\n * Create a component object with coefficients from a row of a `Transform`.\n * @param transform source transform.\n * @param axisIndex row index within the transform.\n */\n public static createTransformRow(transform: Transform, axisIndex: AxisIndex): EllipsoidComponentExtrema {\n const matrix = transform.matrix;\n return new EllipsoidComponentExtrema(transform.origin.at(axisIndex), matrix.at(axisIndex, 0), matrix.at(axisIndex, 1), matrix.at(axisIndex, 2), axisIndex);\n }\n public extendRangeForSmoothSurfacePoints(range: Range3d, theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number) {\n const delta = (this.u * this.cosTheta0 + this.v * this.sinTheta0) * this.cosPhi0 + this.w * this.sinPhi0;\n if (AngleSweep.isRadiansInStartEnd(this.theta0Radians, theta0Radians, theta1Radians)\n && AngleSweep.isRadiansInStartEnd(this.phi0Radians, phi0Radians, phi1Radians, false)) {\n range.extendSingleAxis(this.c + delta, this.axisIndex);\n }\n const thetaRadians = this.theta0Radians + Math.PI;\n const phiRadians = -this.phi0Radians;\n if (AngleSweep.isRadiansInStartEnd(thetaRadians, theta0Radians, theta1Radians)\n && AngleSweep.isRadiansInStartEnd(phiRadians, phi0Radians, phi1Radians, false)) {\n // cosTheta and sinTheta are both negated\n // sinPhi is negated\n // delta is negated\n range.extendSingleAxis(this.c - delta, this.axisIndex);\n }\n }\n /**\n * Extend range to include extrema of a phi-bounded arc at constant theta (i.e. a polar circle)\n * @param range range to extend\n * @param thetaRadians theta for arc\n * @param phi0Radians limit value on arc sweep\n * @param phi1Radians limit value on arc sweep\n */\n public extendRangeForConstantThetaArc(range: Range3d, thetaRadians: number, phi0Radians: number, phi1Radians: number) {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n this._trigForm.set(this.c, (this.u * cosTheta + this.v * sinTheta), this.w);\n this._trigForm.rangeInStartEndRadians(phi0Radians, phi1Radians, this._axisRange);\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\n }\n\n /**\n * Extend range to include extrema of a theta-bounded arc at constant phi (i.e. a circle parallel to the equator)\n * @param range range to extend\n * @param phiRadians phi for arc\n * @param theta0Radians limit value on arc sweep\n * @param theta1Radians limit value on arc sweep\n */\n public extendRangeForConstantPhiArc(range: Range3d, theta0Radians: number, theta1Radians: number, phiRadians: number) {\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n this._trigForm.set(this.c + this.w * sinPhi, this.u * cosPhi, this.v * cosPhi);\n this._trigForm.rangeInStartEndRadians(theta0Radians, theta1Radians, this._axisRange);\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\n }\n}\n\n/**\n * * An Ellipsoid is a (complete) unit sphere with an arbitrary (possibly skewed) `Transform` to 3d.\n * * The (unit) sphere parameterization with respect to longitude `theta` and latitude `phi` is\n * * `u = cos(theta) * cos (phi)`\n * * `v = sin(theta) * cos(phi)`\n * * `w = sin(phi)`\n * * The sphere (u,v,w) multiply the x,y,z columns of the Ellipsoid transform.\n * @public\n */\nexport class Ellipsoid implements Clipper {\n private _transform: Transform;\n private _unitVectorA: Vector3d;\n private _unitVectorB: Vector3d;\n private _workPointA: Point3d;\n private _workPointB: Point3d;\n private constructor(transform: Transform) {\n this._transform = transform;\n this._unitVectorA = Vector3d.create();\n this._unitVectorB = Vector3d.create();\n this._workPointA = Point3d.create();\n this._workPointB = Point3d.create();\n }\n /** Create with a clone (not capture) with given transform.\n * * If transform is undefined, create a unit sphere.\n */\n public static create(matrixOrTransform?: Transform | Matrix3d): Ellipsoid {\n if (matrixOrTransform instanceof Transform)\n return new Ellipsoid(matrixOrTransform);\n else if (matrixOrTransform instanceof Matrix3d)\n return new Ellipsoid(Transform.createOriginAndMatrix(undefined, matrixOrTransform));\n else\n return new Ellipsoid(Transform.createIdentity());\n }\n /**\n * Create a transform with given center and directions, applying the radii as multipliers for the respective columns of the axes.\n * @param center center of ellipsoid\n * @param axes x,y,z directions are columns of this matrix\n * @param radiusX multiplier to be applied to the x direction\n * @param radiusY multiplier to be applied to the y direction\n * @param radiusZ multiplier to be applied to the z direction\n */\n public static createCenterMatrixRadii(center: Point3d, axes: Matrix3d | undefined, radiusX: number, radiusY: number, radiusZ: number): Ellipsoid {\n let scaledAxes;\n if (axes === undefined)\n scaledAxes = Matrix3d.createScale(radiusX, radiusY, radiusZ)!;\n else\n scaledAxes = axes.scaleColumns(radiusX, radiusY, radiusZ);\n return new Ellipsoid(Transform.createOriginAndMatrix(center, scaledAxes));\n }\n /** Return a (REFERENCE TO) the transform from world space to the mapped sphere space.\n * * This maps coordinates \"relative to the sphere\" to world.\n * * Its inverse maps world coordinates into the sphere space.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n */\n public get transformRef(): Transform { return this._transform; }\n /**\n * * Convert a world point to point within the underlying mapped sphere space.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n * * This is undefined in the highly unusual case that the ellipsoid frame is singular.\n */\n public worldToLocal(worldPoint: XYAndZ, result?: Point3d): Point3d | undefined {\n return this._transform.multiplyInversePoint3d(worldPoint, result);\n }\n /**\n * * Convert a point within the underlying mapped sphere space to world coordinates.\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\n */\n public localToWorld(localPoint: XYAndZ, result?: Point3d): Point3d {\n return this._transform.multiplyPoint3d(localPoint, result);\n }\n\n /** return a clone with same coordinates */\n public clone(): Ellipsoid {\n return new Ellipsoid(this._transform.clone());\n }\n /** test equality of the 4 points */\n public isAlmostEqual(other: Ellipsoid): boolean {\n return this._transform.isAlmostEqual(other._transform);\n }\n /** Apply the transform to each point */\n public tryTransformInPlace(transform: Transform): boolean {\n transform.multiplyTransformTransform(this._transform, this._transform);\n return true;\n }\n /**\n * return a cloned and transformed ellipsoid.\n * @param transform\n */\n public cloneTransformed(transform: Transform): Ellipsoid | undefined {\n const result = this.clone();\n result.tryTransformInPlace(transform);\n return result;\n }\n /** Find the closest point of the (patch of the) ellipsoid.\n * * In general there are multiple points where a space point projects onto an ellipse.\n * * This searches for only one point, using heuristics which are reliable for points close to the surface but not for points distant from highly skewed ellipsoid\n */\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n const searcher = new EllipsoidClosestPoint(this);\n return searcher.searchClosestPoint(spacePoint);\n }\n\n /** Find the silhouette of the ellipsoid as viewed from a homogeneous eyepoint.\n * * Returns undefined if the eyepoint is inside the ellipsoid\n */\n public silhouetteArc(eyePoint: Point4d): Arc3d | undefined {\n const localEyePoint = this._transform.multiplyInversePoint4d(eyePoint);\n if (localEyePoint !== undefined) {\n // localEyePoint is now looking at a unit sphere centered at the origin.\n // the plane through the silhouette is the eye point with z negated ...\n const localPlaneA = Point4d.create(localEyePoint.x, localEyePoint.y, localEyePoint.z, -localEyePoint.w);\n const localPlaneB = localPlaneA.toPlane3dByOriginAndUnitNormal();\n // if the silhouette plane has origin inside the sphere, there is a silhouette with center at the plane origin.\n if (localPlaneB) {\n const rr = 1.0 - localPlaneB.getOriginRef().magnitudeSquared(); // squared distance radius of silhouette arc\n if (rr > 0.0 && rr <= 1.0) {\n const arc = Arc3d.createCenterNormalRadius(localPlaneB.getOriginRef(), localPlaneB.getNormalRef(), Math.sqrt(rr));\n if (arc.tryTransformInPlace(this._transform))\n return arc;\n }\n }\n }\n return undefined;\n }\n\n /** Compute intersections with a ray.\n * * Return the number of intersections\n * * Fill any combinations of arrays of\n * * rayFractions = fractions along the ray\n * * xyz = xyz intersection coordinates points in space\n * * thetaPhiRadians = sphere longitude and latitude in radians.\n * * For each optional array, caller must of course initialize an array (usually empty)\n * * return 0 if ray length is too small.\n */\n public intersectRay(ray: Ray3d, rayFractions: number[] | undefined, xyz: Point3d[] | undefined, thetaPhiRadians: LongitudeLatitudeNumber[] | undefined): number {\n if (xyz)\n xyz.length = 0;\n if (thetaPhiRadians !== undefined)\n thetaPhiRadians.length = 0;\n if (rayFractions)\n rayFractions.length = 0;\n // if ray comes in unit vector in large ellipsoid, localRay direction is minuscule.\n // use a ray scaled up so its direction vector magnitude is comparable to the ellipsoid radiusX\n const ray1 = ray.clone();\n const a0 = ray.direction.magnitude();\n const aX = this._transform.matrix.columnXMagnitude();\n const scale = Geometry.conditionalDivideCoordinate(aX, a0);\n if (scale === undefined)\n return 0;\n ray1.direction.scaleInPlace(scale);\n const localRay = ray1.cloneInverseTransformed(this._transform);\n if (localRay !== undefined) {\n const n = SphereImplicit.intersectSphereRay(Point3d.create(0, 0, 0), 1.0, localRay, rayFractions, xyz, thetaPhiRadians);\n if (rayFractions !== undefined) {\n for (let i = 0; i < rayFractions.length; i++)\n rayFractions[i] *= scale;\n }\n if (xyz !== undefined) {\n this._transform.multiplyPoint3dArrayInPlace(xyz);\n }\n return n;\n }\n return 0;\n }\n\n /** Return the range of a uv-aligned patch of the sphere. */\n public patchRangeStartEndRadians(theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number, result?: Range3d): Range3d {\n const xExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 0);\n const yExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 1);\n const zExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 2);\n if (!result)\n result = Range3d.createNull();\n else\n result.setNull();\n // Range extrema can occur at:\n // * 2 smooth surface points in each direction\n // * along low and high phi boundary arcs\n // * along low and high theta boundary arcs\n // smooth surface extrema . ..\n xExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\n //\n if (!Angle.isFullCircleRadians(theta1Radians - theta0Radians)) {\n xExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\n\n xExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n yExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n zExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\n }\n if (!Angle.isHalfCircleRadians(phi1Radians - phi0Radians)) {\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\n\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\n }\n return result;\n }\n /**\n * Evaluate a point on the ellipsoid at angles give in radians.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional point result\n */\n public radiansToPoint(thetaRadians: number, phiRadians: number, result?: Point3d): Point3d {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n return this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result);\n }\n\n /**\n * * For a given pair of points on an ellipsoid, construct an arc (possibly elliptical) which\n * * passes through both points\n * * is completely within the ellipsoid surface\n * * has its centerEvaluate a point on the ellipsoid at angles give in radians.\n * * If the ellipsoid is a sphere, this is the shortest great-circle arc between the two points.\n * * If the ellipsoid is not a sphere, this is close to but not precisely the shortest path.\n * @param thetaARadians longitude, in radians, for pointA\n * @param phiARadians latitude, in radians, for pointA\n * @param thetaBRadians longitude, in radians, for pointB\n * @param phiBRadians latitude, in radians, for pointB\n * @param result optional preallocated result\n */\n public radiansPairToGreatArc(\n thetaARadians: number, phiARadians: number,\n thetaBRadians: number, phiBRadians: number,\n result?: Arc3d): Arc3d | undefined {\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._unitVectorA);\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._unitVectorB);\n const sweepAngle = this._unitVectorA.angleTo(this._unitVectorB);\n // the unit vectors (on unit sphere) are never 0, so this cannot fail.\n const matrix = Matrix3d.createRigidFromColumns(this._unitVectorA, this._unitVectorB, AxisOrder.XYZ)!;\n if (matrix !== undefined) {\n const matrix1 = this._transform.matrix.multiplyMatrixMatrix(matrix);\n return Arc3d.create(this._transform.getOrigin(), matrix1.columnX(), matrix1.columnY(),\n AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result);\n }\n return undefined;\n }\n /**\n * See radiansPairToGreatArc, which does this computation with positions from `angleA` and `angleB` directly as radians\n */\n public anglePairToGreatArc(angleA: LongitudeLatitudeNumber, angleB: LongitudeLatitudeNumber, result?: Arc3d): Arc3d | undefined {\n return this.radiansPairToGreatArc(\n angleA.longitudeRadians, angleA.latitudeRadians, angleB.longitudeRadians, angleB.latitudeRadians, result);\n }\n /**\n * Construct an arc for the section cut of a plane with the ellipsoid.\n * * this is undefined if the plane does not intersect the ellipsoid.\n */\n public createPlaneSection(plane: Plane3dByOriginAndUnitNormal): Arc3d | undefined {\n const localPlane = plane.cloneTransformed(this._transform, true);\n if (localPlane !== undefined) {\n // construct center and arc vectors in the local system --- later transform them out to global.\n const center = localPlane.projectPointToPlane(Point3d.createZero());\n const d = center.magnitude();\n if (d < 1.0) {\n const frame = Matrix3d.createRigidHeadsUp(localPlane.getNormalRef(), AxisOrder.ZYX);\n const vector0 = frame.columnX();\n const vector90 = frame.columnY();\n const sectionRadius = Math.sqrt(1.0 - d * d);\n vector0.scaleInPlace(sectionRadius);\n vector90.scaleInPlace(sectionRadius);\n\n this._transform.multiplyPoint3d(center, center);\n this._transform.multiplyVector(vector0, vector0);\n this._transform.multiplyVector(vector90, vector90);\n return Arc3d.create(center, vector0, vector90, undefined);\n }\n }\n return undefined;\n }\n /**\n * Construct an arc which\n * * start at pointA (defined by its angle position)\n * * ends at pointB (defined by its angle position)\n * * contains the 3rd vector as an in-plane point.\n */\n public createSectionArcPointPointVectorInPlane(pointAnglesA: LongitudeLatitudeNumber, pointAnglesB: LongitudeLatitudeNumber, inPlaneVector: Vector3d,\n result?: Arc3d): Arc3d | undefined {\n const xyzA = this.radiansToPoint(pointAnglesA.longitudeRadians, pointAnglesA.latitudeRadians);\n const xyzB = this.radiansToPoint(pointAnglesB.longitudeRadians, pointAnglesB.latitudeRadians);\n const localA = this._transform.multiplyInversePoint3d(xyzA);\n const localB = this._transform.multiplyInversePoint3d(xyzB);\n const a = this._transform.matrix.maxAbs();\n const scaledInPlaneVector = inPlaneVector.scaleToLength(a);\n if (scaledInPlaneVector === undefined)\n return undefined;\n const localInPlaneVector = this._transform.matrix.multiplyInverse(scaledInPlaneVector);\n if (localA !== undefined && localB !== undefined && localInPlaneVector !== undefined) {\n const localPlane = Plane3dByOriginAndUnitNormal.createPointPointVectorInPlane(localA, localB, localInPlaneVector);\n if (localPlane !== undefined) {\n // construct center and arc vectors in the local system --- later transform them out to global.\n const center = localPlane.projectPointToPlane(Point3d.createZero());\n const vector0 = Vector3d.createStartEnd(center, localA);\n const vectorB = Vector3d.createStartEnd(center, localB);\n const vector90 = Vector3d.createRotateVectorAroundVector(vector0, localPlane.getNormalRef(), undefined);\n if (vector90 !== undefined) {\n const sweepRadians = vector0.planarRadiansTo(vectorB, localPlane.getNormalRef());\n this._transform.multiplyPoint3d(center, center);\n this._transform.multiplyVector(vector0, vector0);\n this._transform.multiplyVector(vector90, vector90);\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0, sweepRadians), result);\n }\n }\n }\n return undefined;\n }\n /**\n * * For a given pair of points on an ellipsoid, construct another ellipsoid\n * * touches the same xyz points in space\n * * has transformation modified so that the original two points are on the equator.\n * * Note that except for true sphere inputs, the result axes can be both non-perpendicular axes and of different lengths.\n * @param thetaARadians longitude, in radians, for pointA\n * @param phiARadians latitude, in radians, for pointA\n * @param thetaBRadians longitude, in radians, for pointB\n * @param phiBRadians latitude, in radians, for pointB\n * @param result optional preallocated result\n */\n public radiansPairToEquatorialEllipsoid(\n thetaARadians: number, phiARadians: number,\n thetaBRadians: number, phiBRadians: number,\n result?: Ellipsoid): Ellipsoid | undefined {\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._unitVectorA);\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._unitVectorB);\n\n const matrix = Matrix3d.createRigidFromColumns(this._unitVectorA, this._unitVectorB, AxisOrder.XYZ);\n if (matrix) {\n if (result) {\n this._transform.multiplyTransformMatrix3d(matrix, result._transform);\n return result;\n }\n return Ellipsoid.create(this._transform.multiplyTransformMatrix3d(matrix));\n }\n return undefined;\n }\n /**\n * Return an arc (circular or elliptical) at constant longitude\n * @param longitude (strongly typed) longitude\n * @param latitude latitude sweep angles\n * @param result\n */\n public constantLongitudeArc(longitude: Angle, latitudeSweep: AngleSweep, result?: Arc3d): Arc3d | undefined {\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, latitudeSweep.sweepRadians))\n return undefined;\n const cosTheta = longitude.cos();\n const sinTheta = longitude.sin();\n const vector0 = this._transform.matrix.multiplyXY(cosTheta, sinTheta);\n const vector90 = this._transform.matrix.columnZ();\n const center = this._transform.getOrigin();\n return Arc3d.create(center, vector0, vector90, latitudeSweep, result);\n }\n /**\n * Return an arc (circular or elliptical) at constant longitude\n * @param latitude sweep angles\n * @param latitude (strongly typed) latitude\n * @param result\n */\n public constantLatitudeArc(longitudeSweep: AngleSweep, latitude: Angle, result?: Arc3d): Arc3d | undefined {\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, longitudeSweep.sweepRadians))\n return undefined;\n if (latitude.isAlmostNorthOrSouthPole)\n return undefined;\n const cosPhi = latitude.cos();\n const sinPhi = latitude.sin();\n const vector0 = this._transform.matrix.columnX(); vector0.scaleInPlace(cosPhi);\n const vector90 = this._transform.matrix.columnY(); vector90.scaleInPlace(cosPhi);\n const center = this._transform.multiplyXYZ(0, 0, sinPhi);\n return Arc3d.create(center, vector0, vector90, longitudeSweep, result);\n }\n /**\n * * create a section arc with and end at positions A and B, and in plane with the normal at a fractional\n * interpolation between.\n * @param angleA start point of arc (given as angles on this ellipsoid)\n * @param intermediateNormalFraction\n * @param angleB end point of arc (given as angles on this ellipsoid)\n */\n public sectionArcWithIntermediateNormal(\n angleA: LongitudeLatitudeNumber,\n intermediateNormalFraction: number,\n angleB: LongitudeLatitudeNumber): Arc3d {\n const normalA = this.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians)!;\n const normalB = this.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians)!;\n const normal = normalA.direction.interpolate(intermediateNormalFraction, normalB.direction);\n const arc = this.createSectionArcPointPointVectorInPlane(angleA, angleB, normal);\n return arc!;\n }\n\n /**\n * Evaluate a point and derivatives with respect to angle on the ellipsoid at angles give in radians.\n * * \"u direction\" vector of the returned plane is derivative with respect to longitude.\n * * \"v direction\" vector fo the returned plane is derivative with respect ot latitude.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param applyCosPhiFactor selector for handling of theta (around equator derivative)\n * * if true, compute the properly scaled derivative, which goes to zero at the poles.\n * * If false, omit he cos(phi) factor on the derivative wrt theta. This ensures it is always nonzero and can be safely used in cross product for surface normal.\n * @param result optional plane result\n */\n public radiansToPointAndDerivatives(thetaRadians: number, phiRadians: number, applyCosPhiFactor = true, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const cosPhiA = applyCosPhiFactor ? cosPhi : 1.0;\n const sinPhi = Math.sin(phiRadians);\n const matrix = this._transform.matrix;\n if (!result)\n return Plane3dByOriginAndVectors.createCapture(\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi),\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0),\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi));\n // in place modification requires direct reference to members of the result ...\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result.origin);\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0, result.vectorU);\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi, result.vectorV);\n return result;\n }\n /**\n * Evaluate a point and derivatives wrt to theta, phi, thetaTheta, phiPhi, and thetaPhi.\n * All outputs are to caller-allocated points and vectors.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param point (returned) surface point\n * @param d1Theta (returned) derivative wrt theta\n * @param d1Phi (returned) derivative wrt phi\n * @param d2ThetaTheta (returned) second derivative wrt theta twice\n * @param d2PhiPhi (returned) second derivative wrt phi twice\n * @param d2ThetaPhi (returned) second derivative wrt theta and phi\n * @param result optional plane result\n */\n public radiansToPointAnd2Derivatives(thetaRadians: number, phiRadians: number,\n point: Point3d,\n d1Theta: Vector3d,\n d1Phi: Vector3d,\n d2ThetaTheta: Vector3d,\n d2PhiPhi: Vector3d,\n d2ThetaPhi: Vector3d) {\n const cosTheta = Math.cos(thetaRadians);\n const sinTheta = Math.sin(thetaRadians);\n const cosPhi = Math.cos(phiRadians);\n const sinPhi = Math.sin(phiRadians);\n const matrix = this._transform.matrix;\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, point);\n // theta derivatives\n matrix.multiplyXYZ(-sinTheta * cosPhi, cosTheta * cosPhi, 0, d1Theta);\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, 0, d2ThetaTheta);\n\n // phi derivatives\n matrix.multiplyXYZ(-cosTheta * sinPhi, -sinTheta * sinPhi, cosPhi, d1Phi);\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, -sinPhi, d2PhiPhi);\n\n // mixed derivative\n matrix.multiplyXYZ(sinTheta * sinPhi, -cosTheta * sinPhi, 0, d2ThetaPhi);\n }\n\n /**\n * Evaluate a point and rigid local coordinate frame the ellipsoid at angles give in radians.\n * * The undefined return is only possible if the placement transform is singular (and even then only at critical angles)\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional transform result\n *\n */\n public radiansToFrenetFrame(thetaRadians: number, phiRadians: number, result?: Transform): Transform | undefined {\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\n return plane.toRigidFrame(result);\n }\n /**\n * Evaluate a point and unit normal at given angles.\n * @param thetaRadians longitude, in radians\n * @param phiRadians latitude, in radians\n * @param result optional transform result\n *\n */\n public radiansToUnitNormalRay(thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\n return plane.unitNormalRay(result);\n }\n\n /**\n * Find the (unique) extreme point for a given true surface perpendicular vector (outward)\n */\n public surfaceNormalToAngles(normal: Vector3d, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\n const matrix = this._transform.matrix;\n const conjugateVector = matrix.multiplyTransposeVector(normal);\n const thetaRadians = Math.atan2(conjugateVector.y, conjugateVector.x);\n // For that phi arc,\n const axy = -(conjugateVector.x * Math.cos(thetaRadians) + conjugateVector.y * Math.sin(thetaRadians));\n const az = conjugateVector.z;\n const phiRadians = Math.atan2(az, -axy);\n return LongitudeLatitudeNumber.createRadians(thetaRadians, phiRadians, 0.0, result);\n }\n\n /**\n * * Evaluate the surface normal on `other` ellipsoid at given angles\n * * If `other` is undefined, default to unit sphere.\n * * Find the angles for the same normal on `this` ellipsoid\n */\n public otherEllipsoidAnglesToThisEllipsoidAngles(otherEllipsoid: Ellipsoid | undefined, otherAngles: LongitudeLatitudeNumber, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber | undefined {\n const normal = Ellipsoid.radiansToUnitNormalRay(otherEllipsoid, otherAngles.longitudeRadians, otherAngles.latitudeRadians);\n if (normal !== undefined)\n return this.surfaceNormalToAngles(normal.direction, result);\n return undefined;\n }\n /**\n * * if ellipsoid is given, return its surface point and unit normal as a Ray3d.\n * * if not given, return surface point and unit normal for unit sphere.\n */\n public static radiansToUnitNormalRay(ellipsoid: Ellipsoid | undefined, thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\n if (ellipsoid) {\n return ellipsoid.radiansToUnitNormalRay(thetaRadians, phiRadians, result);\n }\n if (!result)\n result = Ray3d.createZAxis();\n // for unit sphere, the vector from center to surface point is identical to the unit normal.\n SphereImplicit.radiansToUnitSphereXYZ(thetaRadians, phiRadians, result.origin);\n result.direction.setFromPoint3d(result.origin);\n return result;\n }\n /** Implement the `isPointInOnOrOutside` test fom the `interface` */\n public isPointOnOrInside(point: Point3d): boolean {\n const localPoint = this._transform.multiplyInversePoint3d(point, this._workPointA);\n if (localPoint !== undefined)\n return localPoint.magnitude() <= 1.0;\n return false;\n }\n /** Announce \"in\" portions of a line segment. See `Clipper.announceClippedSegmentIntervals` */\n public announceClippedSegmentIntervals(f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\n const localA = this._transform.multiplyInversePoint3d(pointA, this._workPointA);\n const localB = this._transform.multiplyInversePoint3d(pointB, this._workPointB);\n if (localA && localB) {\n const dotAA = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointA);\n const dotAB = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointB);\n const dotBB = Vector3d.dotProductAsXYAndZ(this._workPointB, this._workPointB);\n const bezier = new Order3Bezier(dotAA, dotAB, dotBB);\n const roots = bezier.roots(1.0, false);\n if (roots !== undefined && roots.length === 2) {\n // we know the roots are sorted. The f0,f1 might not be ..\n if (f0 < f1) {\n if (roots[0] < f0)\n roots[0] = f0;\n if (f1 < roots[1])\n roots[1] = f1;\n if (roots[0] < roots[1]) {\n if (announce)\n announce(roots[0], roots[1]);\n return true;\n }\n } else {\n // f0,f1 are reversed. do the outputs in the same sense\n if (roots[1] > f0)\n roots[1] = f0;\n if (roots[0] < f1)\n roots[0] = f1;\n if (roots[1] > roots[0]) {\n if (announce)\n announce(roots[1], roots[0]);\n return true;\n }\n }\n }\n }\n return false;\n }\n /** Announce \"in\" portions of a line segment. See `Clipper.announceClippedSegmentIntervals` */\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n const arcData = arc.toVectors();\n let numAnnounce = 0;\n if (this._transform.multiplyInversePoint3d(arcData.center, arcData.center)\n && this._transform.matrix.multiplyInverse(arcData.vector0, arcData.vector0)\n && this._transform.matrix.multiplyInverse(arcData.vector90, arcData.vector90)) {\n // in local coordinates the arc parameterization is X = center + vector0 * cos(theta) + vector90 * sin(theta)\n // We want X DOT X === 1, viz\n // center DOT center + 2 * cos(theta) * center DOT vector0 + 2 * sin(theta) * center DOT vector90 + cos(theta) ^2 * vector0 DOT vector0 + sin (theta)^2 * vector90 DOT vector90 = 1\n const cc = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.center);\n const cu = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector0);\n const cv = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector90);\n const uv = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector90);\n const uu = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector0);\n const vv = Vector3d.dotProductAsXYAndZ(arcData.vector90, arcData.vector90);\n const intersectionRadians: number[] = [];\n\n if (TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\n uu, 2.0 * uv, vv,\n 2.0 * cu, 2.0 * cv, cc - 1.0,\n intersectionRadians)) {\n const fractions = [0.0, 1.0];\n for (const radians of intersectionRadians) {\n const fraction = arc.sweep.radiansToSignedPeriodicFraction(radians);\n if (Geometry.isIn01(fraction))\n fractions.push(fraction);\n }\n fractions.sort();\n let f0, f1;\n for (let i1 = 1; i1 < fractions.length; i1++) {\n f0 = fractions[i1 - 1];\n f1 = fractions[i1];\n if (f1 > f0) {\n const xyz = arc.fractionToPoint(Geometry.interpolate(fractions[i1 - 1], 0.5, fractions[i1]));\n if (this.isPointOnOrInside(xyz)) {\n if (announce)\n announce(fractions[i1 - 1], fractions[i1], arc);\n numAnnounce++;\n }\n }\n }\n }\n }\n return numAnnounce > 0;\n }\n}\n/**\n * * An `EllipsoidPatch` is\n * * An underlying (full) `Ellipsoid` object\n * * an angular range (`AngleSweep`) of longitudes around the equator\n * * an angular range (`AngleSweep`) of latitudes, with 0 at the equator, +90 degrees at north pole.\n * * The `EllipsoidPatch` implements `UVSurface` methods, so a `PolyfaceBuilder` can generate facets in its method `addUVGridBody`\n * @public\n */\nexport class EllipsoidPatch implements UVSurface {\n public ellipsoid: Ellipsoid;\n public longitudeSweep: AngleSweep;\n public latitudeSweep: AngleSweep;\n /**\n * CAPTURE ellipsoid and sweeps as an EllipsoidPatch.\n * @param ellipsoid\n * @param longitudeSweep\n * @param latitudeSweep\n */\n private constructor(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep) {\n this.ellipsoid = ellipsoid;\n this.longitudeSweep = longitudeSweep;\n this.latitudeSweep = latitudeSweep;\n }\n /**\n * Create a new EllipsoidPatch, capturing (not cloning) all input object references.\n * @param ellipsoid full ellipsoid\n * @param longitudeSweep sweep of longitudes in the active patch\n * @param latitudeSweep sweep of latitudes in the active patch.\n */\n public static createCapture(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep): EllipsoidPatch {\n return new EllipsoidPatch(ellipsoid, longitudeSweep, latitudeSweep);\n }\n /** Return the point on the ellipsoid at fractional positions in the angular ranges. */\n public uvFractionToPoint(longitudeFraction: number, latitudeFraction: number, result?: Point3d): Point3d {\n return this.ellipsoid.radiansToPoint(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(latitudeFraction), result);\n }\n /** Return the point and derivative vectors on the ellipsoid at fractional positions in the angular ranges.\n * * Derivatives are with respect to fractional position.\n */\n public uvFractionToPointAndTangents(longitudeFraction: number, latitudeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n result = this.ellipsoid.radiansToPointAndDerivatives(\n this.longitudeSweep.fractionToRadians(longitudeFraction),\n this.latitudeSweep.fractionToRadians(latitudeFraction),\n true,\n result);\n result.vectorU.scale(this.longitudeSweep.sweepRadians);\n result.vectorV.scale(this.latitudeSweep.sweepRadians);\n return result;\n }\n /** Return the range of the patch, considering both boundary and internal extrema. */\n public range(result?: Range3d): Range3d {\n return this.ellipsoid.patchRangeStartEndRadians(this.longitudeSweep.startRadians, this.longitudeSweep.endRadians, this.latitudeSweep.startRadians, this.latitudeSweep.endRadians, result);\n }\n /** Return intersections of the ray and surface.\n * * uv values in the intersections are in radians unless `convertIntersectionRadiansToFractions` is true requesting conversion to patch fractions.\n */\n public intersectRay(ray: Ray3d, restrictToPatch: boolean, convertIntersectionRadiansToFractions: boolean = false): CurveAndSurfaceLocationDetail[] {\n const result: CurveAndSurfaceLocationDetail[] = [];\n const rayFractions: number[] = [];\n const xyz: Point3d[] = [];\n const thetaPhi: LongitudeLatitudeNumber[] = [];\n const n = this.ellipsoid.intersectRay(ray, rayFractions, xyz, thetaPhi);\n for (let i = 0; i < n; i++) {\n const longitudeRadians = thetaPhi[i].longitudeRadians;\n const latitudeRadians = thetaPhi[i].latitudeRadians;\n\n if (!restrictToPatch\n || (this.longitudeSweep.isRadiansInSweep(longitudeRadians)\n && this.latitudeSweep.isRadiansInSweep(latitudeRadians))) {\n if (convertIntersectionRadiansToFractions) {\n const uFraction = this.longitudeSweep.radiansToSignedPeriodicFraction(longitudeRadians);\n const vFraction = this.latitudeSweep.radiansToSignedPeriodicFraction(latitudeRadians);\n result.push(new CurveAndSurfaceLocationDetail(\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, uFraction, vFraction, xyz[i])));\n } else {\n result.push(new CurveAndSurfaceLocationDetail(\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, longitudeRadians, latitudeRadians, xyz[i])));\n }\n }\n }\n return result;\n }\n /**\n * test if the angles of the `LongitudeLatitudeNumber` are within the sweep ranges.\n * @param position longitude and latitude to test.\n * @param `allowPeriodicLongitude` true to allow the longitude to be in when shifted by a multiple of 2 PI\n * (latitude is never periodic for patches)\n */\n public containsAngles(position: LongitudeLatitudeNumber, allowPeriodicLongitude: boolean = true): boolean {\n return this.latitudeSweep.isRadiansInSweep(position.latitudeRadians, false)\n && this.longitudeSweep.isRadiansInSweep(position.longitudeRadians, allowPeriodicLongitude);\n }\n\n /**\n * Compute point (with altitude) at given angles and altitude.\n * * Never fails for non-singular ellipsoid.\n * * In the returned ray,\n * * ray.origin is the point at requested altitude.\n * * ray.direction is an outward-directed unit vector\n * @param position longitude, latitude, and height\n *\n */\n public anglesToUnitNormalRay(position: LongitudeLatitudeNumber, result?: Ray3d): Ray3d | undefined {\n const ray = this.ellipsoid.radiansToUnitNormalRay(position.longitudeRadians, position.latitudeRadians, result);\n if (!ray)\n return undefined;\n ray.origin = ray.fractionToPoint(position.altitude, ray.origin);\n return ray;\n }\n /**\n * Return simple angles of a fractional position in the patch.\n * @param thetaFraction fractional position in longitude (theta) interval\n * @param phiFraction fractional position in latitude (phi) interval\n * @param h optional altitude\n * @param result optional preallocated result.\n */\n public uvFractionToAngles(longitudeFraction: number, phiFraction: number, h: number = 0, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\n return LongitudeLatitudeNumber.createRadians(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(phiFraction), h, result);\n }\n /** Find the closest point of the (patch of the) ellipsoid. */\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n return this.ellipsoid.projectPointToSurface(spacePoint);\n }\n}\n/**\n * Internal class for searching for the closest point (projection of spacePoint) on an ellipsoid.\n */\nclass EllipsoidClosestPoint extends NewtonEvaluatorRRtoRRD {\n private _ellipsoid: Ellipsoid;\n private _spacePoint!: Point3d;\n private _surfacePoint: Point3d;\n private _d1Theta: Vector3d;\n private _d2Theta: Vector3d;\n private _d1Phi: Vector3d;\n private _d2Phi: Vector3d;\n private _d2ThetaPhi: Vector3d;\n private _delta: Vector3d;\n public constructor(ellipsoid: Ellipsoid) {\n super();\n this._ellipsoid = ellipsoid;\n this._surfacePoint = Point3d.create();\n this._d1Theta = Vector3d.create();\n this._d1Phi = Vector3d.create();\n this._d2Theta = Vector3d.create();\n this._d2Phi = Vector3d.create();\n this._d2ThetaPhi = Vector3d.create();\n\n this._delta = Vector3d.create();\n }\n public searchClosestPoint(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\n this._spacePoint = spacePoint;\n const localPoint = this._ellipsoid.transformRef.multiplyInversePoint3d(spacePoint);\n if (!localPoint)\n return undefined;\n const sphere = new SphereImplicit(1.0);\n const uv = sphere.xyzToThetaPhiR(localPoint);\n const newtonSearcher = new Newton2dUnboundedWithDerivative(this);\n newtonSearcher.setUV(uv.thetaRadians, uv.phiRadians);\n if (newtonSearcher.runIterations()) {\n uv.thetaRadians = newtonSearcher.getU();\n uv.phiRadians = newtonSearcher.getV();\n }\n return LongitudeLatitudeNumber.createRadians(uv.thetaRadians, uv.phiRadians, 0.0);\n }\n public evaluate(thetaRadians: number, phiRadians: number): boolean {\n this._ellipsoid.radiansToPointAnd2Derivatives(thetaRadians, phiRadians,\n this._surfacePoint,\n this._d1Theta, this._d1Phi,\n this._d2Theta, this._d2Phi,\n this._d2ThetaPhi);\n Vector3d.createStartEnd(this._spacePoint, this._surfacePoint, this._delta);\n const q = this._d1Theta.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2ThetaPhi);\n this.currentF.setOriginAndVectorsXYZ(\n // f,g,0\n this._delta.dotProduct(this._d1Theta), this._delta.dotProduct(this._d1Phi), 0,\n // df/dTheta, dg/dTheta, 0\n this._d1Theta.dotProduct(this._d1Theta) + this._delta.dotProduct(this._d2Theta), q, 0,\n // df/dPhi, dg/dPhi, 0\n q, this._d1Phi.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2Phi), 0);\n\n return true;\n }\n}\n/**\n * Detailed data for a point on a 2-angle parameter space.\n * @public\n */\nexport class GeodesicPathPoint {\n /** First angle, in radians */\n public thetaRadians: number;\n /** Second angle, in radians */\n public phiRadians: number;\n public point: Point3d;\n public dTheta: Vector3d;\n public dPhi: Vector3d;\n public d2Theta: Vector3d;\n public d2Phi: Vector3d;\n public d2ThetaPhi: Vector3d;\n public d1Cross: Vector3d;\n public constructor() {\n this.thetaRadians = 0;\n this.phiRadians = 0;\n this.point = Point3d.create();\n this.dTheta = Vector3d.create();\n this.dPhi = Vector3d.create();\n this.d2Theta = Vector3d.create();\n this.d2Phi = Vector3d.create();\n this.d2ThetaPhi = Vector3d.create();\n this.d1Cross = Vector3d.create();\n }\n /** Fill all evaluations at given theta and phi. */\n public evaluateDerivativesAtCurrentAngles(ellipsoid: Ellipsoid) {\n ellipsoid.radiansToPointAnd2Derivatives(this.thetaRadians, this.phiRadians, this.point, this.dTheta, this.dPhi, this.d2Theta, this.d2Phi, this.d2ThetaPhi);\n this.dTheta.crossProduct(this.dPhi, this.d1Cross);\n }\n private static _vectorAB?: Vector3d;\n private static _vectorCB?: Vector3d;\n private static _vectorCross?: Vector3d;\n /** Evaluate the newton function and derivatives:\n * `(UAB cross UCB) dot d1cross`\n * with as the central data, UAB = vector from pointA to pointB, UCB = vector from pointC to pointB.\n * * Return order is:\n * * values[0] = the function\n * * values[1] = derivative wrt pointA.phi\n * * values[2] = derivative wrt pointB.phi\n * * values[3] = derivative wrt pointC.phi\n */\n public static evaluateNewtonFunction(pointA: GeodesicPathPoint, pointB: GeodesicPathPoint, pointC: GeodesicPathPoint, values: Float64Array) {\n this._vectorAB = Vector3d.createStartEnd(pointA.point, pointB.point, this._vectorAB);\n this._vectorCB = Vector3d.createStartEnd(pointC.point, pointB.point, this._vectorCB);\n this._vectorCross = this._vectorAB.crossProduct(this._vectorCB);\n // this._vectorCross is the cross product of vectors from A to B and C to B\n // it should be perpendicular to (have zero dot product with) the surface normal, which is sitting in pointB as d1Cross\n values[0] = this._vectorCross.dotProduct(pointB.d1Cross);\n // Derivatives wrt phi at A, B, C creates derivatives of values[0] wrt each.\n // derivatives at neighbor appear only on their point-to-point vector, and with negative sign ..\n values[1] = - pointA.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross);\n values[3] = - this._vectorAB.tripleProduct(pointC.dPhi, pointB.d1Cross);\n // values from pointB appear with positive sign everywhere . ..\n values[2] = pointB.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross)\n + this._vectorAB.tripleProduct(pointB.dPhi, pointB.d1Cross)\n + this._vectorCross.tripleProduct(pointB.d2ThetaPhi, pointB.dPhi)\n + this._vectorCross.tripleProduct(pointB.dTheta, pointB.d2Phi);\n // CRUNCH CRUNCH CRUNCH\n }\n /**\n * Extract the two angles form this structure to a LongitudeLatitudeNumber structure.\n */\n public toAngles(): LongitudeLatitudeNumber {\n return LongitudeLatitudeNumber.createRadians(this.thetaRadians, this.phiRadians);\n }\n}\n/**\n * Algorithm implementation class for computing approximate optimal (shortest) path points.\n * * Call the static method `createGeodesicPath` to compute path points.\n * @public\n */\nexport class GeodesicPathSolver {\n private _defaultArc: Arc3d;\n private _pathPoints: GeodesicPathPoint[];\n private _tridiagonalSolver!: TriDiagonalSystem;\n private constructor(defaultArc: Arc3d) {\n this._pathPoints = [];\n this._defaultArc = defaultArc;\n }\n /**\n *\n * @param originalEllipsoid Given start and endpoints on an ellipsoid, compute points along a near-optimal shortest path.\n * * The points are located so that at each point the local surface normal is contained in the plane of the point and its two neighbors.\n * @param startAngles angles for the start of the path\n * @param endAngles angles for the end of the path\n * @param density If this is a number, it is the requested edge count. If this is an angle, it ias an angular spacing measured in the great arc through the two points.\n */\n public static createGeodesicPath(originalEllipsoid: Ellipsoid,\n startAngles: LongitudeLatitudeNumber, endAngles: LongitudeLatitudeNumber, density: number | Angle): GeodesicPathPoint[] | undefined {\n const workEllipsoid1 = originalEllipsoid.radiansPairToEquatorialEllipsoid(startAngles.longitudeRadians, startAngles.latitudeRadians,\n endAngles.longitudeRadians, endAngles.latitudeRadians);\n const workArc = originalEllipsoid.radiansPairToGreatArc(startAngles.longitudeRadians, startAngles.latitudeRadians,\n endAngles.longitudeRadians, endAngles.latitudeRadians);\n if (workEllipsoid1 === undefined || workArc === undefined)\n return undefined;\n let numEdges = 4;\n if (density instanceof Angle) {\n numEdges = Geometry.stepCount(density.radians, workArc.sweep.sweepRadians, 4, 180);\n } else if (Number.isFinite(density)) {\n numEdges = Math.max(numEdges, density);\n }\n if (numEdges > 180)\n numEdges = 180;\n const scaledMatrix = workEllipsoid1.transformRef.matrix.clone();\n const largestCoordinate = scaledMatrix.maxAbs();\n const inverseLargestCoordinate = 1.0 / largestCoordinate;\n scaledMatrix.scaleColumnsInPlace(inverseLargestCoordinate, inverseLargestCoordinate, inverseLargestCoordinate);\n const workEllipsoid = Ellipsoid.create(Transform.createOriginAndMatrix(undefined, scaledMatrix));\n\n const solver = new GeodesicPathSolver(workArc);\n solver.createInitialPointsAndTridiagonalSystem(numEdges);\n\n let numConverged = 0;\n let previousMaxDPhi = 10000.0;\n let numStep = 0;\n const dPhiTolerance = 1.0e-8;\n solver.setupStep(workEllipsoid);\n while (numStep < 15 && numConverged < 2) {\n if (!solver.solve())\n break;\n previousMaxDPhi = solver.applyUpdate(0.1);\n solver.setupStep(workEllipsoid);\n if (previousMaxDPhi < dPhiTolerance)\n numConverged++;\n else\n numConverged = 0;\n numStep++;\n }\n if (numConverged > 0) {\n const workAngles = LongitudeLatitudeNumber.createRadians(0, 0);\n const originalAngles = LongitudeLatitudeNumber.createRadians(0, 0);\n for (const p of solver._pathPoints) {\n LongitudeLatitudeNumber.createRadians(p.thetaRadians, p.phiRadians, 0, workAngles);\n originalEllipsoid.otherEllipsoidAnglesToThisEllipsoidAngles(workEllipsoid, workAngles, originalAngles);\n p.thetaRadians = originalAngles.longitudeRadians;\n p.phiRadians = originalAngles.latitudeRadians;\n p.evaluateDerivativesAtCurrentAngles(originalEllipsoid);\n }\n return solver._pathPoints;\n }\n return numConverged > 0 ? solver._pathPoints : undefined;\n }\n private createInitialPointsAndTridiagonalSystem(numEdges: number) {\n if (numEdges < 2)\n numEdges = 2;\n let f, thetaRadians;\n for (let i = 0; i <= numEdges; i++) {\n f = i / numEdges;\n thetaRadians = this._defaultArc.sweep.fractionToRadians(f);\n const p = new GeodesicPathPoint();\n p.thetaRadians = thetaRadians;\n p.phiRadians = 0.0;\n this._pathPoints.push(p);\n }\n this._tridiagonalSolver = new TriDiagonalSystem(this._pathPoints.length);\n }\n private applyUpdate(maxDPhiRadians: number): number {\n let dPhiMax = 0;\n for (let i = 0; i < this._pathPoints.length; i++) {\n const dPhi = Geometry.clampToStartEnd(this._tridiagonalSolver.getX(i), -maxDPhiRadians, maxDPhiRadians);\n this._pathPoints[i].phiRadians -= dPhi;\n dPhiMax = Geometry.maxAbsXY(dPhiMax, dPhi);\n }\n return dPhiMax;\n }\n\n /**\n * Set up a step with specified ellipsoid.\n * * ASSUME angles in _pathPoints are valid on given ellipsoid.\n * @param ellipsoid\n */\n private setupStep(ellipsoid: Ellipsoid) {\n for (const p of this._pathPoints) {\n p.evaluateDerivativesAtCurrentAngles(ellipsoid);\n }\n const lastRow = this._pathPoints.length - 1;\n // first and last points get trivial dPhi=0 equations:\n this._tridiagonalSolver.reset();\n this._tridiagonalSolver.addToRow(0, 0, 1, 0);\n this._tridiagonalSolver.addToB(0, 0);\n this._tridiagonalSolver.addToRow(lastRow, 0, 1, 0);\n this._tridiagonalSolver.addToB(lastRow, 0);\n\n // interior points get proper newton equations\n const values = new Float64Array(4);\n for (let i = 1; i < lastRow; i++) {\n GeodesicPathPoint.evaluateNewtonFunction(this._pathPoints[i - 1], this._pathPoints[i], this._pathPoints[i + 1], values);\n this._tridiagonalSolver.addToRow(i, values[1], values[2], values[3]);\n this._tridiagonalSolver.addToB(i, values[0]);\n }\n }\n\n private solve(): boolean {\n return this._tridiagonalSolver.factorAndBackSubstitute();\n }\n /**\n * Construct various section arcs (on the ellipsoid), using planes that (a) pass through the two given points and (b) have in-plane vector sampled between the normals of the two points.\n * * Each candidate ellipse has is in a plane with ellipsoid normal at vector constructed \"between\" the endpoint normals.\n * * The intermediate construction is by interpolation between stated fractions (which maybe outside 0 to 1)\n * @param ellipsoid\n * @param angleA start point of all candidates\n * @param angleB end point of all candidates\n * @param numSample number of ellipses to construct as candidates.\n * @param normalInterpolationFraction0\n * @param normalInterpolationFraction1\n */\n public static approximateMinimumLengthSectionArc(ellipsoid: Ellipsoid,\n angleA: LongitudeLatitudeNumber,\n angleB: LongitudeLatitudeNumber, numSample: number,\n normalInterpolationFraction0: number,\n normalInterpolationFraction1: number): { minLengthArc: Arc3d, minLengthNormalInterpolationFraction: number } | undefined {\n numSample = Geometry.clampToStartEnd(numSample, 2, 200);\n const normalA = ellipsoid.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians);\n const normalB = ellipsoid.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians);\n if (normalA !== undefined && normalB !== undefined) {\n let normalC;\n let resultArc;\n let lengthC;\n let fractionC;\n\n for (let i = 1; i <= numSample; i++) {\n const f = Geometry.interpolate(normalInterpolationFraction0, i / numSample, normalInterpolationFraction1);\n normalC = normalA.direction.interpolate(f, normalB.direction, normalC);\n const candidateArc = ellipsoid.createSectionArcPointPointVectorInPlane(angleA, angleB, normalC);\n if (candidateArc !== undefined) {\n const candidateLength = candidateArc.curveLength();\n if (lengthC === undefined || candidateLength < lengthC) {\n lengthC = candidateLength;\n resultArc = candidateArc;\n fractionC = f;\n }\n }\n }\n if (resultArc !== undefined && fractionC !== undefined)\n return { minLengthArc: resultArc, minLengthNormalInterpolationFraction: fractionC };\n }\n return undefined;\n }\n\n}\n"]}
1
+ {"version":3,"file":"Ellipsoid.js","sourceRoot":"","sources":["../../../src/geometry3d/Ellipsoid.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\nimport { CurveAndSurfaceLocationDetail, UVSurfaceLocationDetail } from \"../bspline/SurfaceLocationDetail\";\r\nimport { Clipper } from \"../clipping/ClipUtils\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveLocationDetail } from \"../curve/CurveLocationDetail\";\r\nimport { AnnounceNumberNumber, AnnounceNumberNumberCurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { AxisIndex, AxisOrder, Geometry } from \"../Geometry\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { Order3Bezier } from \"../numerics/BezierPolynomials\";\r\nimport { Newton2dUnboundedWithDerivative, NewtonEvaluatorRRtoRRD } from \"../numerics/Newton\";\r\nimport { SineCosinePolynomial, SphereImplicit, TrigPolynomial } from \"../numerics/Polynomials\";\r\nimport { TriDiagonalSystem } from \"../numerics/TriDiagonalSystem\";\r\nimport { Angle } from \"./Angle\";\r\nimport { AngleSweep } from \"./AngleSweep\";\r\nimport { UVSurface } from \"./GeometryHandler\";\r\nimport { LongitudeLatitudeNumber } from \"./LongitudeLatitudeAltitude\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"./Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"./Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"./Range\";\r\nimport { Ray3d } from \"./Ray3d\";\r\nimport { Transform } from \"./Transform\";\r\nimport { XYAndZ } from \"./XYZProps\";\r\n\r\n/**\r\n * For one component (x,y, or z) on the sphere\r\n * f(theta,phi) = c + (u * cos(theta) + v * sin(theta)) * cos(phi) + w * sin(phi)\r\n *\r\n * For the equator circle, phi=0, cos(phi) = 1, sin(phi)=0\r\n * f = u * cos(theta) + v * sin(theta).\r\n * with derivative\r\n * df / dTheta = = u * sin(theta) + v * cos(theta)\r\n * whose zero is tan(theta) = v/u\r\n * (and that has two solutions 180 degrees apart)\r\n * Then with that theta let A = u * cos(theta) + v * sin(theta)\r\n * f = A * cos(phi) + w * sin(phi)\r\n * df/dPhi = - A * sin(phi) + w * cos(phi)\r\n * tan(phi) = w / A\r\n * @internal\r\n */\r\nclass EllipsoidComponentExtrema {\r\n public c: number;\r\n public u: number;\r\n public v: number;\r\n public w: number;\r\n public axisIndex: AxisIndex;\r\n public theta0Radians: number;\r\n public phi0Radians: number;\r\n public cosTheta0: number;\r\n public sinTheta0: number;\r\n public cosPhi0: number;\r\n public sinPhi0: number;\r\n // temp vars used in arc range evaluation:\r\n private _axisRange: Range1d;\r\n private _trigForm: SineCosinePolynomial;\r\n public constructor(c: number, u: number, v: number, w: number, axisIndex: AxisIndex) {\r\n this.c = c;\r\n this.u = u;\r\n this.v = v;\r\n this.w = w;\r\n this.axisIndex = axisIndex;\r\n this.theta0Radians = Math.atan2(v, u);\r\n this.cosTheta0 = Math.cos(this.theta0Radians);\r\n this.sinTheta0 = Math.sin(this.theta0Radians);\r\n const A0 = u * this.cosTheta0 + v * this.sinTheta0;\r\n this.phi0Radians = Math.atan2(w, A0);\r\n this.cosPhi0 = Math.cos(this.phi0Radians);\r\n this.sinPhi0 = Math.sin(this.phi0Radians);\r\n this._axisRange = Range1d.createNull();\r\n this._trigForm = new SineCosinePolynomial(0, 0, 0);\r\n\r\n }\r\n /**\r\n * Create a component object with coefficients from a row of a `Transform`.\r\n * @param transform source transform.\r\n * @param axisIndex row index within the transform.\r\n */\r\n public static createTransformRow(transform: Transform, axisIndex: AxisIndex): EllipsoidComponentExtrema {\r\n const matrix = transform.matrix;\r\n return new EllipsoidComponentExtrema(transform.origin.at(axisIndex), matrix.at(axisIndex, 0), matrix.at(axisIndex, 1), matrix.at(axisIndex, 2), axisIndex);\r\n }\r\n public extendRangeForSmoothSurfacePoints(range: Range3d, theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number) {\r\n const delta = (this.u * this.cosTheta0 + this.v * this.sinTheta0) * this.cosPhi0 + this.w * this.sinPhi0;\r\n if (AngleSweep.isRadiansInStartEnd(this.theta0Radians, theta0Radians, theta1Radians)\r\n && AngleSweep.isRadiansInStartEnd(this.phi0Radians, phi0Radians, phi1Radians, false)) {\r\n range.extendSingleAxis(this.c + delta, this.axisIndex);\r\n }\r\n const thetaRadians = this.theta0Radians + Math.PI;\r\n const phiRadians = -this.phi0Radians;\r\n if (AngleSweep.isRadiansInStartEnd(thetaRadians, theta0Radians, theta1Radians)\r\n && AngleSweep.isRadiansInStartEnd(phiRadians, phi0Radians, phi1Radians, false)) {\r\n // cosTheta and sinTheta are both negated\r\n // sinPhi is negated\r\n // delta is negated\r\n range.extendSingleAxis(this.c - delta, this.axisIndex);\r\n }\r\n }\r\n /**\r\n * Extend range to include extrema of a phi-bounded arc at constant theta (i.e. a polar circle)\r\n * @param range range to extend\r\n * @param thetaRadians theta for arc\r\n * @param phi0Radians limit value on arc sweep\r\n * @param phi1Radians limit value on arc sweep\r\n */\r\n public extendRangeForConstantThetaArc(range: Range3d, thetaRadians: number, phi0Radians: number, phi1Radians: number) {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n this._trigForm.set(this.c, (this.u * cosTheta + this.v * sinTheta), this.w);\r\n this._trigForm.rangeInStartEndRadians(phi0Radians, phi1Radians, this._axisRange);\r\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\r\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\r\n }\r\n\r\n /**\r\n * Extend range to include extrema of a theta-bounded arc at constant phi (i.e. a circle parallel to the equator)\r\n * @param range range to extend\r\n * @param phiRadians phi for arc\r\n * @param theta0Radians limit value on arc sweep\r\n * @param theta1Radians limit value on arc sweep\r\n */\r\n public extendRangeForConstantPhiArc(range: Range3d, theta0Radians: number, theta1Radians: number, phiRadians: number) {\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n this._trigForm.set(this.c + this.w * sinPhi, this.u * cosPhi, this.v * cosPhi);\r\n this._trigForm.rangeInStartEndRadians(theta0Radians, theta1Radians, this._axisRange);\r\n range.extendSingleAxis(this._axisRange.low, this.axisIndex);\r\n range.extendSingleAxis(this._axisRange.high, this.axisIndex);\r\n }\r\n}\r\n\r\n/**\r\n * * An Ellipsoid is a (complete) unit sphere with an arbitrary (possibly skewed) `Transform` to 3d.\r\n * * The (unit) sphere parameterization with respect to longitude `theta` and latitude `phi` is\r\n * * `u = cos(theta) * cos (phi)`\r\n * * `v = sin(theta) * cos(phi)`\r\n * * `w = sin(phi)`\r\n * * The sphere (u,v,w) multiply the x,y,z columns of the Ellipsoid transform.\r\n * @public\r\n */\r\nexport class Ellipsoid implements Clipper {\r\n private _transform: Transform;\r\n private _unitVectorA: Vector3d;\r\n private _unitVectorB: Vector3d;\r\n private _workPointA: Point3d;\r\n private _workPointB: Point3d;\r\n private constructor(transform: Transform) {\r\n this._transform = transform;\r\n this._unitVectorA = Vector3d.create();\r\n this._unitVectorB = Vector3d.create();\r\n this._workPointA = Point3d.create();\r\n this._workPointB = Point3d.create();\r\n }\r\n /** Create with a clone (not capture) with given transform.\r\n * * If transform is undefined, create a unit sphere.\r\n */\r\n public static create(matrixOrTransform?: Transform | Matrix3d): Ellipsoid {\r\n if (matrixOrTransform instanceof Transform)\r\n return new Ellipsoid(matrixOrTransform);\r\n else if (matrixOrTransform instanceof Matrix3d)\r\n return new Ellipsoid(Transform.createOriginAndMatrix(undefined, matrixOrTransform));\r\n else\r\n return new Ellipsoid(Transform.createIdentity());\r\n }\r\n /**\r\n * Create a transform with given center and directions, applying the radii as multipliers for the respective columns of the axes.\r\n * @param center center of ellipsoid\r\n * @param axes x,y,z directions are columns of this matrix\r\n * @param radiusX multiplier to be applied to the x direction\r\n * @param radiusY multiplier to be applied to the y direction\r\n * @param radiusZ multiplier to be applied to the z direction\r\n */\r\n public static createCenterMatrixRadii(center: Point3d, axes: Matrix3d | undefined, radiusX: number, radiusY: number, radiusZ: number): Ellipsoid {\r\n let scaledAxes;\r\n if (axes === undefined)\r\n scaledAxes = Matrix3d.createScale(radiusX, radiusY, radiusZ)!;\r\n else\r\n scaledAxes = axes.scaleColumns(radiusX, radiusY, radiusZ);\r\n return new Ellipsoid(Transform.createOriginAndMatrix(center, scaledAxes));\r\n }\r\n /** Return a (REFERENCE TO) the transform from world space to the mapped sphere space.\r\n * * This maps coordinates \"relative to the sphere\" to world.\r\n * * Its inverse maps world coordinates into the sphere space.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n */\r\n public get transformRef(): Transform { return this._transform; }\r\n /**\r\n * * Convert a world point to point within the underlying mapped sphere space.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n * * This is undefined in the highly unusual case that the ellipsoid frame is singular.\r\n */\r\n public worldToLocal(worldPoint: XYAndZ, result?: Point3d): Point3d | undefined {\r\n return this._transform.multiplyInversePoint3d(worldPoint, result);\r\n }\r\n /**\r\n * * Convert a point within the underlying mapped sphere space to world coordinates.\r\n * * In the sphere space, an xyz (vector from origin) with magnitude equal to 1 is ON the sphere (hence its world image is ON the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude less than 1 is INSIDE the sphere (hence its world image is INSIDE the ellipsoid)\r\n * * In the sphere space, an xyz (vector from origin) with magnitude greater than 1 is OUTSIDE the sphere (hence its world image is OUTSIDE the ellipsoid)\r\n */\r\n public localToWorld(localPoint: XYAndZ, result?: Point3d): Point3d {\r\n return this._transform.multiplyPoint3d(localPoint, result);\r\n }\r\n\r\n /** return a clone with same coordinates */\r\n public clone(): Ellipsoid {\r\n return new Ellipsoid(this._transform.clone());\r\n }\r\n /** test equality of the 4 points */\r\n public isAlmostEqual(other: Ellipsoid): boolean {\r\n return this._transform.isAlmostEqual(other._transform);\r\n }\r\n /** Apply the transform to each point */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n transform.multiplyTransformTransform(this._transform, this._transform);\r\n return true;\r\n }\r\n /**\r\n * return a cloned and transformed ellipsoid.\r\n * @param transform\r\n */\r\n public cloneTransformed(transform: Transform): Ellipsoid | undefined {\r\n const result = this.clone();\r\n result.tryTransformInPlace(transform);\r\n return result;\r\n }\r\n /** Find the closest point of the (patch of the) ellipsoid.\r\n * * In general there are multiple points where a space point projects onto an ellipse.\r\n * * This searches for only one point, using heuristics which are reliable for points close to the surface but not for points distant from highly skewed ellipsoid\r\n */\r\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n const searcher = new EllipsoidClosestPoint(this);\r\n return searcher.searchClosestPoint(spacePoint);\r\n }\r\n\r\n /** Find the silhouette of the ellipsoid as viewed from a homogeneous eyepoint.\r\n * * Returns undefined if the eyepoint is inside the ellipsoid\r\n */\r\n public silhouetteArc(eyePoint: Point4d): Arc3d | undefined {\r\n const localEyePoint = this._transform.multiplyInversePoint4d(eyePoint);\r\n if (localEyePoint !== undefined) {\r\n // localEyePoint is now looking at a unit sphere centered at the origin.\r\n // the plane through the silhouette is the eye point with z negated ...\r\n const localPlaneA = Point4d.create(localEyePoint.x, localEyePoint.y, localEyePoint.z, -localEyePoint.w);\r\n const localPlaneB = localPlaneA.toPlane3dByOriginAndUnitNormal();\r\n // if the silhouette plane has origin inside the sphere, there is a silhouette with center at the plane origin.\r\n if (localPlaneB) {\r\n const rr = 1.0 - localPlaneB.getOriginRef().magnitudeSquared(); // squared distance radius of silhouette arc\r\n if (rr > 0.0 && rr <= 1.0) {\r\n const arc = Arc3d.createCenterNormalRadius(localPlaneB.getOriginRef(), localPlaneB.getNormalRef(), Math.sqrt(rr));\r\n if (arc.tryTransformInPlace(this._transform))\r\n return arc;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n /** Compute intersections with a ray.\r\n * * Return the number of intersections\r\n * * Fill any combinations of arrays of\r\n * * rayFractions = fractions along the ray\r\n * * xyz = xyz intersection coordinates points in space\r\n * * thetaPhiRadians = sphere longitude and latitude in radians.\r\n * * For each optional array, caller must of course initialize an array (usually empty)\r\n * * return 0 if ray length is too small.\r\n */\r\n public intersectRay(ray: Ray3d, rayFractions: number[] | undefined, xyz: Point3d[] | undefined, thetaPhiRadians: LongitudeLatitudeNumber[] | undefined): number {\r\n if (xyz)\r\n xyz.length = 0;\r\n if (thetaPhiRadians !== undefined)\r\n thetaPhiRadians.length = 0;\r\n if (rayFractions)\r\n rayFractions.length = 0;\r\n // if ray comes in unit vector in large ellipsoid, localRay direction is minuscule.\r\n // use a ray scaled up so its direction vector magnitude is comparable to the ellipsoid radiusX\r\n const ray1 = ray.clone();\r\n const a0 = ray.direction.magnitude();\r\n const aX = this._transform.matrix.columnXMagnitude();\r\n const scale = Geometry.conditionalDivideCoordinate(aX, a0);\r\n if (scale === undefined)\r\n return 0;\r\n ray1.direction.scaleInPlace(scale);\r\n const localRay = ray1.cloneInverseTransformed(this._transform);\r\n if (localRay !== undefined) {\r\n const n = SphereImplicit.intersectSphereRay(Point3d.create(0, 0, 0), 1.0, localRay, rayFractions, xyz, thetaPhiRadians);\r\n if (rayFractions !== undefined) {\r\n for (let i = 0; i < rayFractions.length; i++)\r\n rayFractions[i] *= scale;\r\n }\r\n if (xyz !== undefined) {\r\n this._transform.multiplyPoint3dArrayInPlace(xyz);\r\n }\r\n return n;\r\n }\r\n return 0;\r\n }\r\n\r\n /** Return the range of a uv-aligned patch of the sphere. */\r\n public patchRangeStartEndRadians(theta0Radians: number, theta1Radians: number, phi0Radians: number, phi1Radians: number, result?: Range3d): Range3d {\r\n const xExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 0);\r\n const yExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 1);\r\n const zExtreme = EllipsoidComponentExtrema.createTransformRow(this._transform, 2);\r\n if (!result)\r\n result = Range3d.createNull();\r\n else\r\n result.setNull();\r\n // Range extrema can occur at:\r\n // * 2 smooth surface points in each direction\r\n // * along low and high phi boundary arcs\r\n // * along low and high theta boundary arcs\r\n // smooth surface extrema . ..\r\n xExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForSmoothSurfacePoints(result, theta0Radians, theta1Radians, phi0Radians, phi1Radians);\r\n //\r\n if (!Angle.isFullCircleRadians(theta1Radians - theta0Radians)) {\r\n xExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantThetaArc(result, theta0Radians, phi0Radians, phi1Radians);\r\n\r\n xExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantThetaArc(result, theta1Radians, phi0Radians, phi1Radians);\r\n }\r\n if (!Angle.isHalfCircleRadians(phi1Radians - phi0Radians)) {\r\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi0Radians);\r\n\r\n xExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n yExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n zExtreme.extendRangeForConstantPhiArc(result, theta0Radians, theta1Radians, phi1Radians);\r\n }\r\n return result;\r\n }\r\n /**\r\n * Evaluate a point on the ellipsoid at angles give in radians.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional point result\r\n */\r\n public radiansToPoint(thetaRadians: number, phiRadians: number, result?: Point3d): Point3d {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n return this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result);\r\n }\r\n\r\n /**\r\n * * For a given pair of points on an ellipsoid, construct an arc (possibly elliptical) which\r\n * * passes through both points\r\n * * is completely within the ellipsoid surface\r\n * * has its centerEvaluate a point on the ellipsoid at angles give in radians.\r\n * * If the ellipsoid is a sphere, this is the shortest great-circle arc between the two points.\r\n * * If the ellipsoid is not a sphere, this is close to but not precisely the shortest path.\r\n * @param thetaARadians longitude, in radians, for pointA\r\n * @param phiARadians latitude, in radians, for pointA\r\n * @param thetaBRadians longitude, in radians, for pointB\r\n * @param phiBRadians latitude, in radians, for pointB\r\n * @param result optional preallocated result\r\n */\r\n public radiansPairToGreatArc(\r\n thetaARadians: number, phiARadians: number,\r\n thetaBRadians: number, phiBRadians: number,\r\n result?: Arc3d): Arc3d | undefined {\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._unitVectorA);\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._unitVectorB);\r\n const sweepAngle = this._unitVectorA.angleTo(this._unitVectorB);\r\n // the unit vectors (on unit sphere) are never 0, so this cannot fail.\r\n const matrix = Matrix3d.createRigidFromColumns(this._unitVectorA, this._unitVectorB, AxisOrder.XYZ)!;\r\n if (matrix !== undefined) {\r\n const matrix1 = this._transform.matrix.multiplyMatrixMatrix(matrix);\r\n return Arc3d.create(this._transform.getOrigin(), matrix1.columnX(), matrix1.columnY(),\r\n AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * See radiansPairToGreatArc, which does this computation with positions from `angleA` and `angleB` directly as radians\r\n */\r\n public anglePairToGreatArc(angleA: LongitudeLatitudeNumber, angleB: LongitudeLatitudeNumber, result?: Arc3d): Arc3d | undefined {\r\n return this.radiansPairToGreatArc(\r\n angleA.longitudeRadians, angleA.latitudeRadians, angleB.longitudeRadians, angleB.latitudeRadians, result);\r\n }\r\n /**\r\n * Construct an arc for the section cut of a plane with the ellipsoid.\r\n * * this is undefined if the plane does not intersect the ellipsoid.\r\n */\r\n public createPlaneSection(plane: Plane3dByOriginAndUnitNormal): Arc3d | undefined {\r\n const localPlane = plane.cloneTransformed(this._transform, true);\r\n if (localPlane !== undefined) {\r\n // construct center and arc vectors in the local system --- later transform them out to global.\r\n const center = localPlane.projectPointToPlane(Point3d.createZero());\r\n const d = center.magnitude();\r\n if (d < 1.0) {\r\n const frame = Matrix3d.createRigidHeadsUp(localPlane.getNormalRef(), AxisOrder.ZYX);\r\n const vector0 = frame.columnX();\r\n const vector90 = frame.columnY();\r\n const sectionRadius = Math.sqrt(1.0 - d * d);\r\n vector0.scaleInPlace(sectionRadius);\r\n vector90.scaleInPlace(sectionRadius);\r\n\r\n this._transform.multiplyPoint3d(center, center);\r\n this._transform.multiplyVector(vector0, vector0);\r\n this._transform.multiplyVector(vector90, vector90);\r\n return Arc3d.create(center, vector0, vector90, undefined);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Construct an arc which\r\n * * start at pointA (defined by its angle position)\r\n * * ends at pointB (defined by its angle position)\r\n * * contains the 3rd vector as an in-plane point.\r\n */\r\n public createSectionArcPointPointVectorInPlane(pointAnglesA: LongitudeLatitudeNumber, pointAnglesB: LongitudeLatitudeNumber, inPlaneVector: Vector3d,\r\n result?: Arc3d): Arc3d | undefined {\r\n const xyzA = this.radiansToPoint(pointAnglesA.longitudeRadians, pointAnglesA.latitudeRadians);\r\n const xyzB = this.radiansToPoint(pointAnglesB.longitudeRadians, pointAnglesB.latitudeRadians);\r\n const localA = this._transform.multiplyInversePoint3d(xyzA);\r\n const localB = this._transform.multiplyInversePoint3d(xyzB);\r\n const a = this._transform.matrix.maxAbs();\r\n const scaledInPlaneVector = inPlaneVector.scaleToLength(a);\r\n if (scaledInPlaneVector === undefined)\r\n return undefined;\r\n const localInPlaneVector = this._transform.matrix.multiplyInverse(scaledInPlaneVector);\r\n if (localA !== undefined && localB !== undefined && localInPlaneVector !== undefined) {\r\n const localPlane = Plane3dByOriginAndUnitNormal.createPointPointVectorInPlane(localA, localB, localInPlaneVector);\r\n if (localPlane !== undefined) {\r\n // construct center and arc vectors in the local system --- later transform them out to global.\r\n const center = localPlane.projectPointToPlane(Point3d.createZero());\r\n const vector0 = Vector3d.createStartEnd(center, localA);\r\n const vectorB = Vector3d.createStartEnd(center, localB);\r\n const vector90 = Vector3d.createRotateVectorAroundVector(vector0, localPlane.getNormalRef(), undefined);\r\n if (vector90 !== undefined) {\r\n const sweepRadians = vector0.planarRadiansTo(vectorB, localPlane.getNormalRef());\r\n this._transform.multiplyPoint3d(center, center);\r\n this._transform.multiplyVector(vector0, vector0);\r\n this._transform.multiplyVector(vector90, vector90);\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.createStartEndRadians(0, sweepRadians), result);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * * For a given pair of points on an ellipsoid, construct another ellipsoid\r\n * * touches the same xyz points in space\r\n * * has transformation modified so that the original two points are on the equator.\r\n * * Note that except for true sphere inputs, the result axes can be both non-perpendicular axes and of different lengths.\r\n * @param thetaARadians longitude, in radians, for pointA\r\n * @param phiARadians latitude, in radians, for pointA\r\n * @param thetaBRadians longitude, in radians, for pointB\r\n * @param phiBRadians latitude, in radians, for pointB\r\n * @param result optional preallocated result\r\n */\r\n public radiansPairToEquatorialEllipsoid(\r\n thetaARadians: number, phiARadians: number,\r\n thetaBRadians: number, phiBRadians: number,\r\n result?: Ellipsoid): Ellipsoid | undefined {\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaARadians, phiARadians, this._unitVectorA);\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaBRadians, phiBRadians, this._unitVectorB);\r\n\r\n const matrix = Matrix3d.createRigidFromColumns(this._unitVectorA, this._unitVectorB, AxisOrder.XYZ);\r\n if (matrix) {\r\n if (result) {\r\n this._transform.multiplyTransformMatrix3d(matrix, result._transform);\r\n return result;\r\n }\r\n return Ellipsoid.create(this._transform.multiplyTransformMatrix3d(matrix));\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return an arc (circular or elliptical) at constant longitude\r\n * @param longitude (strongly typed) longitude\r\n * @param latitude latitude sweep angles\r\n * @param result\r\n */\r\n public constantLongitudeArc(longitude: Angle, latitudeSweep: AngleSweep, result?: Arc3d): Arc3d | undefined {\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, latitudeSweep.sweepRadians))\r\n return undefined;\r\n const cosTheta = longitude.cos();\r\n const sinTheta = longitude.sin();\r\n const vector0 = this._transform.matrix.multiplyXY(cosTheta, sinTheta);\r\n const vector90 = this._transform.matrix.columnZ();\r\n const center = this._transform.getOrigin();\r\n return Arc3d.create(center, vector0, vector90, latitudeSweep, result);\r\n }\r\n /**\r\n * Return an arc (circular or elliptical) at constant longitude\r\n * @param latitude sweep angles\r\n * @param latitude (strongly typed) latitude\r\n * @param result\r\n */\r\n public constantLatitudeArc(longitudeSweep: AngleSweep, latitude: Angle, result?: Arc3d): Arc3d | undefined {\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(0, longitudeSweep.sweepRadians))\r\n return undefined;\r\n if (latitude.isAlmostNorthOrSouthPole)\r\n return undefined;\r\n const cosPhi = latitude.cos();\r\n const sinPhi = latitude.sin();\r\n const vector0 = this._transform.matrix.columnX(); vector0.scaleInPlace(cosPhi);\r\n const vector90 = this._transform.matrix.columnY(); vector90.scaleInPlace(cosPhi);\r\n const center = this._transform.multiplyXYZ(0, 0, sinPhi);\r\n return Arc3d.create(center, vector0, vector90, longitudeSweep, result);\r\n }\r\n /**\r\n * * create a section arc with and end at positions A and B, and in plane with the normal at a fractional\r\n * interpolation between.\r\n * @param angleA start point of arc (given as angles on this ellipsoid)\r\n * @param intermediateNormalFraction\r\n * @param angleB end point of arc (given as angles on this ellipsoid)\r\n */\r\n public sectionArcWithIntermediateNormal(\r\n angleA: LongitudeLatitudeNumber,\r\n intermediateNormalFraction: number,\r\n angleB: LongitudeLatitudeNumber): Arc3d {\r\n const normalA = this.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians)!;\r\n const normalB = this.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians)!;\r\n const normal = normalA.direction.interpolate(intermediateNormalFraction, normalB.direction);\r\n const arc = this.createSectionArcPointPointVectorInPlane(angleA, angleB, normal);\r\n return arc!;\r\n }\r\n\r\n /**\r\n * Evaluate a point and derivatives with respect to angle on the ellipsoid at angles give in radians.\r\n * * \"u direction\" vector of the returned plane is derivative with respect to longitude.\r\n * * \"v direction\" vector fo the returned plane is derivative with respect ot latitude.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param applyCosPhiFactor selector for handling of theta (around equator derivative)\r\n * * if true, compute the properly scaled derivative, which goes to zero at the poles.\r\n * * If false, omit he cos(phi) factor on the derivative wrt theta. This ensures it is always nonzero and can be safely used in cross product for surface normal.\r\n * @param result optional plane result\r\n */\r\n public radiansToPointAndDerivatives(thetaRadians: number, phiRadians: number, applyCosPhiFactor = true, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const cosPhiA = applyCosPhiFactor ? cosPhi : 1.0;\r\n const sinPhi = Math.sin(phiRadians);\r\n const matrix = this._transform.matrix;\r\n if (!result)\r\n return Plane3dByOriginAndVectors.createCapture(\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi),\r\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0),\r\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi));\r\n // in place modification requires direct reference to members of the result ...\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, result.origin);\r\n matrix.multiplyXYZ(-sinTheta * cosPhiA, cosTheta * cosPhiA, 0, result.vectorU);\r\n matrix.multiplyXYZ(-sinPhi * cosTheta, -sinPhi * sinTheta, cosPhi, result.vectorV);\r\n return result;\r\n }\r\n /**\r\n * Evaluate a point and derivatives wrt to theta, phi, thetaTheta, phiPhi, and thetaPhi.\r\n * All outputs are to caller-allocated points and vectors.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param point (returned) surface point\r\n * @param d1Theta (returned) derivative wrt theta\r\n * @param d1Phi (returned) derivative wrt phi\r\n * @param d2ThetaTheta (returned) second derivative wrt theta twice\r\n * @param d2PhiPhi (returned) second derivative wrt phi twice\r\n * @param d2ThetaPhi (returned) second derivative wrt theta and phi\r\n * @param result optional plane result\r\n */\r\n public radiansToPointAnd2Derivatives(thetaRadians: number, phiRadians: number,\r\n point: Point3d,\r\n d1Theta: Vector3d,\r\n d1Phi: Vector3d,\r\n d2ThetaTheta: Vector3d,\r\n d2PhiPhi: Vector3d,\r\n d2ThetaPhi: Vector3d) {\r\n const cosTheta = Math.cos(thetaRadians);\r\n const sinTheta = Math.sin(thetaRadians);\r\n const cosPhi = Math.cos(phiRadians);\r\n const sinPhi = Math.sin(phiRadians);\r\n const matrix = this._transform.matrix;\r\n this._transform.multiplyXYZ(cosTheta * cosPhi, sinTheta * cosPhi, sinPhi, point);\r\n // theta derivatives\r\n matrix.multiplyXYZ(-sinTheta * cosPhi, cosTheta * cosPhi, 0, d1Theta);\r\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, 0, d2ThetaTheta);\r\n\r\n // phi derivatives\r\n matrix.multiplyXYZ(-cosTheta * sinPhi, -sinTheta * sinPhi, cosPhi, d1Phi);\r\n matrix.multiplyXYZ(-cosTheta * cosPhi, -sinTheta * cosPhi, -sinPhi, d2PhiPhi);\r\n\r\n // mixed derivative\r\n matrix.multiplyXYZ(sinTheta * sinPhi, -cosTheta * sinPhi, 0, d2ThetaPhi);\r\n }\r\n\r\n /**\r\n * Evaluate a point and rigid local coordinate frame the ellipsoid at angles give in radians.\r\n * * The undefined return is only possible if the placement transform is singular (and even then only at critical angles)\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional transform result\r\n *\r\n */\r\n public radiansToFrenetFrame(thetaRadians: number, phiRadians: number, result?: Transform): Transform | undefined {\r\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\r\n return plane.toRigidFrame(result);\r\n }\r\n /**\r\n * Evaluate a point and unit normal at given angles.\r\n * @param thetaRadians longitude, in radians\r\n * @param phiRadians latitude, in radians\r\n * @param result optional transform result\r\n *\r\n */\r\n public radiansToUnitNormalRay(thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\r\n const plane = this.radiansToPointAndDerivatives(thetaRadians, phiRadians, false);\r\n return plane.unitNormalRay(result);\r\n }\r\n\r\n /**\r\n * Find the (unique) extreme point for a given true surface perpendicular vector (outward)\r\n */\r\n public surfaceNormalToAngles(normal: Vector3d, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\r\n const matrix = this._transform.matrix;\r\n const conjugateVector = matrix.multiplyTransposeVector(normal);\r\n const thetaRadians = Math.atan2(conjugateVector.y, conjugateVector.x);\r\n // For that phi arc,\r\n const axy = -(conjugateVector.x * Math.cos(thetaRadians) + conjugateVector.y * Math.sin(thetaRadians));\r\n const az = conjugateVector.z;\r\n const phiRadians = Math.atan2(az, -axy);\r\n return LongitudeLatitudeNumber.createRadians(thetaRadians, phiRadians, 0.0, result);\r\n }\r\n\r\n /**\r\n * * Evaluate the surface normal on `other` ellipsoid at given angles\r\n * * If `other` is undefined, default to unit sphere.\r\n * * Find the angles for the same normal on `this` ellipsoid\r\n */\r\n public otherEllipsoidAnglesToThisEllipsoidAngles(otherEllipsoid: Ellipsoid | undefined, otherAngles: LongitudeLatitudeNumber, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber | undefined {\r\n const normal = Ellipsoid.radiansToUnitNormalRay(otherEllipsoid, otherAngles.longitudeRadians, otherAngles.latitudeRadians);\r\n if (normal !== undefined)\r\n return this.surfaceNormalToAngles(normal.direction, result);\r\n return undefined;\r\n }\r\n /**\r\n * * if ellipsoid is given, return its surface point and unit normal as a Ray3d.\r\n * * if not given, return surface point and unit normal for unit sphere.\r\n */\r\n public static radiansToUnitNormalRay(ellipsoid: Ellipsoid | undefined, thetaRadians: number, phiRadians: number, result?: Ray3d): Ray3d | undefined {\r\n if (ellipsoid) {\r\n return ellipsoid.radiansToUnitNormalRay(thetaRadians, phiRadians, result);\r\n }\r\n if (!result)\r\n result = Ray3d.createZAxis();\r\n // for unit sphere, the vector from center to surface point is identical to the unit normal.\r\n SphereImplicit.radiansToUnitSphereXYZ(thetaRadians, phiRadians, result.origin);\r\n result.direction.setFromPoint3d(result.origin);\r\n return result;\r\n }\r\n /** Implement the `isPointInOnOrOutside` test fom the `interface` */\r\n public isPointOnOrInside(point: Point3d): boolean {\r\n const localPoint = this._transform.multiplyInversePoint3d(point, this._workPointA);\r\n if (localPoint !== undefined)\r\n return localPoint.magnitude() <= 1.0;\r\n return false;\r\n }\r\n /** Announce \"in\" portions of a line segment. See `Clipper.announceClippedSegmentIntervals` */\r\n public announceClippedSegmentIntervals(f0: number, f1: number, pointA: Point3d, pointB: Point3d, announce?: AnnounceNumberNumber): boolean {\r\n const localA = this._transform.multiplyInversePoint3d(pointA, this._workPointA);\r\n const localB = this._transform.multiplyInversePoint3d(pointB, this._workPointB);\r\n if (localA && localB) {\r\n const dotAA = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointA);\r\n const dotAB = Vector3d.dotProductAsXYAndZ(this._workPointA, this._workPointB);\r\n const dotBB = Vector3d.dotProductAsXYAndZ(this._workPointB, this._workPointB);\r\n const bezier = new Order3Bezier(dotAA, dotAB, dotBB);\r\n const roots = bezier.roots(1.0, false);\r\n if (roots !== undefined && roots.length === 2) {\r\n // we know the roots are sorted. The f0,f1 might not be ..\r\n if (f0 < f1) {\r\n if (roots[0] < f0)\r\n roots[0] = f0;\r\n if (f1 < roots[1])\r\n roots[1] = f1;\r\n if (roots[0] < roots[1]) {\r\n if (announce)\r\n announce(roots[0], roots[1]);\r\n return true;\r\n }\r\n } else {\r\n // f0,f1 are reversed. do the outputs in the same sense\r\n if (roots[1] > f0)\r\n roots[1] = f0;\r\n if (roots[0] < f1)\r\n roots[0] = f1;\r\n if (roots[1] > roots[0]) {\r\n if (announce)\r\n announce(roots[1], roots[0]);\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /** Announce \"in\" portions of a line segment. See `Clipper.announceClippedSegmentIntervals` */\r\n public announceClippedArcIntervals(arc: Arc3d, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\r\n const arcData = arc.toVectors();\r\n let numAnnounce = 0;\r\n if (this._transform.multiplyInversePoint3d(arcData.center, arcData.center)\r\n && this._transform.matrix.multiplyInverse(arcData.vector0, arcData.vector0)\r\n && this._transform.matrix.multiplyInverse(arcData.vector90, arcData.vector90)) {\r\n // in local coordinates the arc parameterization is X = center + vector0 * cos(theta) + vector90 * sin(theta)\r\n // We want X DOT X === 1, viz\r\n // center DOT center + 2 * cos(theta) * center DOT vector0 + 2 * sin(theta) * center DOT vector90 + cos(theta) ^2 * vector0 DOT vector0 + sin (theta)^2 * vector90 DOT vector90 = 1\r\n const cc = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.center);\r\n const cu = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector0);\r\n const cv = Vector3d.dotProductAsXYAndZ(arcData.center, arcData.vector90);\r\n const uv = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector90);\r\n const uu = Vector3d.dotProductAsXYAndZ(arcData.vector0, arcData.vector0);\r\n const vv = Vector3d.dotProductAsXYAndZ(arcData.vector90, arcData.vector90);\r\n const intersectionRadians: number[] = [];\r\n\r\n if (TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\r\n uu, 2.0 * uv, vv,\r\n 2.0 * cu, 2.0 * cv, cc - 1.0,\r\n intersectionRadians)) {\r\n const fractions = [0.0, 1.0];\r\n for (const radians of intersectionRadians) {\r\n const fraction = arc.sweep.radiansToSignedPeriodicFraction(radians);\r\n if (Geometry.isIn01(fraction))\r\n fractions.push(fraction);\r\n }\r\n fractions.sort();\r\n let f0, f1;\r\n for (let i1 = 1; i1 < fractions.length; i1++) {\r\n f0 = fractions[i1 - 1];\r\n f1 = fractions[i1];\r\n if (f1 > f0) {\r\n const xyz = arc.fractionToPoint(Geometry.interpolate(fractions[i1 - 1], 0.5, fractions[i1]));\r\n if (this.isPointOnOrInside(xyz)) {\r\n if (announce)\r\n announce(fractions[i1 - 1], fractions[i1], arc);\r\n numAnnounce++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return numAnnounce > 0;\r\n }\r\n}\r\n/**\r\n * * An `EllipsoidPatch` is\r\n * * An underlying (full) `Ellipsoid` object\r\n * * an angular range (`AngleSweep`) of longitudes around the equator\r\n * * an angular range (`AngleSweep`) of latitudes, with 0 at the equator, +90 degrees at north pole.\r\n * * The `EllipsoidPatch` implements `UVSurface` methods, so a `PolyfaceBuilder` can generate facets in its method `addUVGridBody`\r\n * @public\r\n */\r\nexport class EllipsoidPatch implements UVSurface {\r\n public ellipsoid: Ellipsoid;\r\n public longitudeSweep: AngleSweep;\r\n public latitudeSweep: AngleSweep;\r\n /**\r\n * CAPTURE ellipsoid and sweeps as an EllipsoidPatch.\r\n * @param ellipsoid\r\n * @param longitudeSweep\r\n * @param latitudeSweep\r\n */\r\n private constructor(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep) {\r\n this.ellipsoid = ellipsoid;\r\n this.longitudeSweep = longitudeSweep;\r\n this.latitudeSweep = latitudeSweep;\r\n }\r\n /**\r\n * Create a new EllipsoidPatch, capturing (not cloning) all input object references.\r\n * @param ellipsoid full ellipsoid\r\n * @param longitudeSweep sweep of longitudes in the active patch\r\n * @param latitudeSweep sweep of latitudes in the active patch.\r\n */\r\n public static createCapture(ellipsoid: Ellipsoid, longitudeSweep: AngleSweep, latitudeSweep: AngleSweep): EllipsoidPatch {\r\n return new EllipsoidPatch(ellipsoid, longitudeSweep, latitudeSweep);\r\n }\r\n /** Return the point on the ellipsoid at fractional positions in the angular ranges. */\r\n public uvFractionToPoint(longitudeFraction: number, latitudeFraction: number, result?: Point3d): Point3d {\r\n return this.ellipsoid.radiansToPoint(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(latitudeFraction), result);\r\n }\r\n /** Return the point and derivative vectors on the ellipsoid at fractional positions in the angular ranges.\r\n * * Derivatives are with respect to fractional position.\r\n */\r\n public uvFractionToPointAndTangents(longitudeFraction: number, latitudeFraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n result = this.ellipsoid.radiansToPointAndDerivatives(\r\n this.longitudeSweep.fractionToRadians(longitudeFraction),\r\n this.latitudeSweep.fractionToRadians(latitudeFraction),\r\n true,\r\n result);\r\n result.vectorU.scale(this.longitudeSweep.sweepRadians);\r\n result.vectorV.scale(this.latitudeSweep.sweepRadians);\r\n return result;\r\n }\r\n /** Return the range of the patch, considering both boundary and internal extrema. */\r\n public range(result?: Range3d): Range3d {\r\n return this.ellipsoid.patchRangeStartEndRadians(this.longitudeSweep.startRadians, this.longitudeSweep.endRadians, this.latitudeSweep.startRadians, this.latitudeSweep.endRadians, result);\r\n }\r\n /** Return intersections of the ray and surface.\r\n * * uv values in the intersections are in radians unless `convertIntersectionRadiansToFractions` is true requesting conversion to patch fractions.\r\n */\r\n public intersectRay(ray: Ray3d, restrictToPatch: boolean, convertIntersectionRadiansToFractions: boolean = false): CurveAndSurfaceLocationDetail[] {\r\n const result: CurveAndSurfaceLocationDetail[] = [];\r\n const rayFractions: number[] = [];\r\n const xyz: Point3d[] = [];\r\n const thetaPhi: LongitudeLatitudeNumber[] = [];\r\n const n = this.ellipsoid.intersectRay(ray, rayFractions, xyz, thetaPhi);\r\n for (let i = 0; i < n; i++) {\r\n const longitudeRadians = thetaPhi[i].longitudeRadians;\r\n const latitudeRadians = thetaPhi[i].latitudeRadians;\r\n\r\n if (!restrictToPatch\r\n || (this.longitudeSweep.isRadiansInSweep(longitudeRadians)\r\n && this.latitudeSweep.isRadiansInSweep(latitudeRadians))) {\r\n if (convertIntersectionRadiansToFractions) {\r\n const uFraction = this.longitudeSweep.radiansToSignedPeriodicFraction(longitudeRadians);\r\n const vFraction = this.latitudeSweep.radiansToSignedPeriodicFraction(latitudeRadians);\r\n result.push(new CurveAndSurfaceLocationDetail(\r\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\r\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, uFraction, vFraction, xyz[i])));\r\n } else {\r\n result.push(new CurveAndSurfaceLocationDetail(\r\n CurveLocationDetail.createRayFractionPoint(ray, rayFractions[i], xyz[i]),\r\n UVSurfaceLocationDetail.createSurfaceUVNumbersPoint(this, longitudeRadians, latitudeRadians, xyz[i])));\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * test if the angles of the `LongitudeLatitudeNumber` are within the sweep ranges.\r\n * @param position longitude and latitude to test.\r\n * @param `allowPeriodicLongitude` true to allow the longitude to be in when shifted by a multiple of 2 PI\r\n * (latitude is never periodic for patches)\r\n */\r\n public containsAngles(position: LongitudeLatitudeNumber, allowPeriodicLongitude: boolean = true): boolean {\r\n return this.latitudeSweep.isRadiansInSweep(position.latitudeRadians, false)\r\n && this.longitudeSweep.isRadiansInSweep(position.longitudeRadians, allowPeriodicLongitude);\r\n }\r\n\r\n /**\r\n * Compute point (with altitude) at given angles and altitude.\r\n * * Never fails for non-singular ellipsoid.\r\n * * In the returned ray,\r\n * * ray.origin is the point at requested altitude.\r\n * * ray.direction is an outward-directed unit vector\r\n * @param position longitude, latitude, and height\r\n *\r\n */\r\n public anglesToUnitNormalRay(position: LongitudeLatitudeNumber, result?: Ray3d): Ray3d | undefined {\r\n const ray = this.ellipsoid.radiansToUnitNormalRay(position.longitudeRadians, position.latitudeRadians, result);\r\n if (!ray)\r\n return undefined;\r\n ray.origin = ray.fractionToPoint(position.altitude, ray.origin);\r\n return ray;\r\n }\r\n /**\r\n * Return simple angles of a fractional position in the patch.\r\n * @param thetaFraction fractional position in longitude (theta) interval\r\n * @param phiFraction fractional position in latitude (phi) interval\r\n * @param h optional altitude\r\n * @param result optional preallocated result.\r\n */\r\n public uvFractionToAngles(longitudeFraction: number, phiFraction: number, h: number = 0, result?: LongitudeLatitudeNumber): LongitudeLatitudeNumber {\r\n return LongitudeLatitudeNumber.createRadians(this.longitudeSweep.fractionToRadians(longitudeFraction), this.latitudeSweep.fractionToRadians(phiFraction), h, result);\r\n }\r\n /** Find the closest point of the (patch of the) ellipsoid. */\r\n public projectPointToSurface(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n return this.ellipsoid.projectPointToSurface(spacePoint);\r\n }\r\n}\r\n/**\r\n * Internal class for searching for the closest point (projection of spacePoint) on an ellipsoid.\r\n */\r\nclass EllipsoidClosestPoint extends NewtonEvaluatorRRtoRRD {\r\n private _ellipsoid: Ellipsoid;\r\n private _spacePoint!: Point3d;\r\n private _surfacePoint: Point3d;\r\n private _d1Theta: Vector3d;\r\n private _d2Theta: Vector3d;\r\n private _d1Phi: Vector3d;\r\n private _d2Phi: Vector3d;\r\n private _d2ThetaPhi: Vector3d;\r\n private _delta: Vector3d;\r\n public constructor(ellipsoid: Ellipsoid) {\r\n super();\r\n this._ellipsoid = ellipsoid;\r\n this._surfacePoint = Point3d.create();\r\n this._d1Theta = Vector3d.create();\r\n this._d1Phi = Vector3d.create();\r\n this._d2Theta = Vector3d.create();\r\n this._d2Phi = Vector3d.create();\r\n this._d2ThetaPhi = Vector3d.create();\r\n\r\n this._delta = Vector3d.create();\r\n }\r\n public searchClosestPoint(spacePoint: Point3d): LongitudeLatitudeNumber | undefined {\r\n this._spacePoint = spacePoint;\r\n const localPoint = this._ellipsoid.transformRef.multiplyInversePoint3d(spacePoint);\r\n if (!localPoint)\r\n return undefined;\r\n const sphere = new SphereImplicit(1.0);\r\n const uv = sphere.xyzToThetaPhiR(localPoint);\r\n const newtonSearcher = new Newton2dUnboundedWithDerivative(this);\r\n newtonSearcher.setUV(uv.thetaRadians, uv.phiRadians);\r\n if (newtonSearcher.runIterations()) {\r\n uv.thetaRadians = newtonSearcher.getU();\r\n uv.phiRadians = newtonSearcher.getV();\r\n }\r\n return LongitudeLatitudeNumber.createRadians(uv.thetaRadians, uv.phiRadians, 0.0);\r\n }\r\n public evaluate(thetaRadians: number, phiRadians: number): boolean {\r\n this._ellipsoid.radiansToPointAnd2Derivatives(thetaRadians, phiRadians,\r\n this._surfacePoint,\r\n this._d1Theta, this._d1Phi,\r\n this._d2Theta, this._d2Phi,\r\n this._d2ThetaPhi);\r\n Vector3d.createStartEnd(this._spacePoint, this._surfacePoint, this._delta);\r\n const q = this._d1Theta.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2ThetaPhi);\r\n this.currentF.setOriginAndVectorsXYZ(\r\n // f,g,0\r\n this._delta.dotProduct(this._d1Theta), this._delta.dotProduct(this._d1Phi), 0,\r\n // df/dTheta, dg/dTheta, 0\r\n this._d1Theta.dotProduct(this._d1Theta) + this._delta.dotProduct(this._d2Theta), q, 0,\r\n // df/dPhi, dg/dPhi, 0\r\n q, this._d1Phi.dotProduct(this._d1Phi) + this._delta.dotProduct(this._d2Phi), 0);\r\n\r\n return true;\r\n }\r\n}\r\n/**\r\n * Detailed data for a point on a 2-angle parameter space.\r\n * @public\r\n */\r\nexport class GeodesicPathPoint {\r\n /** First angle, in radians */\r\n public thetaRadians: number;\r\n /** Second angle, in radians */\r\n public phiRadians: number;\r\n public point: Point3d;\r\n public dTheta: Vector3d;\r\n public dPhi: Vector3d;\r\n public d2Theta: Vector3d;\r\n public d2Phi: Vector3d;\r\n public d2ThetaPhi: Vector3d;\r\n public d1Cross: Vector3d;\r\n public constructor() {\r\n this.thetaRadians = 0;\r\n this.phiRadians = 0;\r\n this.point = Point3d.create();\r\n this.dTheta = Vector3d.create();\r\n this.dPhi = Vector3d.create();\r\n this.d2Theta = Vector3d.create();\r\n this.d2Phi = Vector3d.create();\r\n this.d2ThetaPhi = Vector3d.create();\r\n this.d1Cross = Vector3d.create();\r\n }\r\n /** Fill all evaluations at given theta and phi. */\r\n public evaluateDerivativesAtCurrentAngles(ellipsoid: Ellipsoid) {\r\n ellipsoid.radiansToPointAnd2Derivatives(this.thetaRadians, this.phiRadians, this.point, this.dTheta, this.dPhi, this.d2Theta, this.d2Phi, this.d2ThetaPhi);\r\n this.dTheta.crossProduct(this.dPhi, this.d1Cross);\r\n }\r\n private static _vectorAB?: Vector3d;\r\n private static _vectorCB?: Vector3d;\r\n private static _vectorCross?: Vector3d;\r\n /** Evaluate the newton function and derivatives:\r\n * `(UAB cross UCB) dot d1cross`\r\n * with as the central data, UAB = vector from pointA to pointB, UCB = vector from pointC to pointB.\r\n * * Return order is:\r\n * * values[0] = the function\r\n * * values[1] = derivative wrt pointA.phi\r\n * * values[2] = derivative wrt pointB.phi\r\n * * values[3] = derivative wrt pointC.phi\r\n */\r\n public static evaluateNewtonFunction(pointA: GeodesicPathPoint, pointB: GeodesicPathPoint, pointC: GeodesicPathPoint, values: Float64Array) {\r\n this._vectorAB = Vector3d.createStartEnd(pointA.point, pointB.point, this._vectorAB);\r\n this._vectorCB = Vector3d.createStartEnd(pointC.point, pointB.point, this._vectorCB);\r\n this._vectorCross = this._vectorAB.crossProduct(this._vectorCB);\r\n // this._vectorCross is the cross product of vectors from A to B and C to B\r\n // it should be perpendicular to (have zero dot product with) the surface normal, which is sitting in pointB as d1Cross\r\n values[0] = this._vectorCross.dotProduct(pointB.d1Cross);\r\n // Derivatives wrt phi at A, B, C creates derivatives of values[0] wrt each.\r\n // derivatives at neighbor appear only on their point-to-point vector, and with negative sign ..\r\n values[1] = - pointA.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross);\r\n values[3] = - this._vectorAB.tripleProduct(pointC.dPhi, pointB.d1Cross);\r\n // values from pointB appear with positive sign everywhere . ..\r\n values[2] = pointB.dPhi.tripleProduct(this._vectorCB, pointB.d1Cross)\r\n + this._vectorAB.tripleProduct(pointB.dPhi, pointB.d1Cross)\r\n + this._vectorCross.tripleProduct(pointB.d2ThetaPhi, pointB.dPhi)\r\n + this._vectorCross.tripleProduct(pointB.dTheta, pointB.d2Phi);\r\n // CRUNCH CRUNCH CRUNCH\r\n }\r\n /**\r\n * Extract the two angles form this structure to a LongitudeLatitudeNumber structure.\r\n */\r\n public toAngles(): LongitudeLatitudeNumber {\r\n return LongitudeLatitudeNumber.createRadians(this.thetaRadians, this.phiRadians);\r\n }\r\n}\r\n/**\r\n * Algorithm implementation class for computing approximate optimal (shortest) path points.\r\n * * Call the static method `createGeodesicPath` to compute path points.\r\n * @public\r\n */\r\nexport class GeodesicPathSolver {\r\n private _defaultArc: Arc3d;\r\n private _pathPoints: GeodesicPathPoint[];\r\n private _tridiagonalSolver!: TriDiagonalSystem;\r\n private constructor(defaultArc: Arc3d) {\r\n this._pathPoints = [];\r\n this._defaultArc = defaultArc;\r\n }\r\n /**\r\n *\r\n * @param originalEllipsoid Given start and endpoints on an ellipsoid, compute points along a near-optimal shortest path.\r\n * * The points are located so that at each point the local surface normal is contained in the plane of the point and its two neighbors.\r\n * @param startAngles angles for the start of the path\r\n * @param endAngles angles for the end of the path\r\n * @param density If this is a number, it is the requested edge count. If this is an angle, it ias an angular spacing measured in the great arc through the two points.\r\n */\r\n public static createGeodesicPath(originalEllipsoid: Ellipsoid,\r\n startAngles: LongitudeLatitudeNumber, endAngles: LongitudeLatitudeNumber, density: number | Angle): GeodesicPathPoint[] | undefined {\r\n const workEllipsoid1 = originalEllipsoid.radiansPairToEquatorialEllipsoid(startAngles.longitudeRadians, startAngles.latitudeRadians,\r\n endAngles.longitudeRadians, endAngles.latitudeRadians);\r\n const workArc = originalEllipsoid.radiansPairToGreatArc(startAngles.longitudeRadians, startAngles.latitudeRadians,\r\n endAngles.longitudeRadians, endAngles.latitudeRadians);\r\n if (workEllipsoid1 === undefined || workArc === undefined)\r\n return undefined;\r\n let numEdges = 4;\r\n if (density instanceof Angle) {\r\n numEdges = Geometry.stepCount(density.radians, workArc.sweep.sweepRadians, 4, 180);\r\n } else if (Number.isFinite(density)) {\r\n numEdges = Math.max(numEdges, density);\r\n }\r\n if (numEdges > 180)\r\n numEdges = 180;\r\n const scaledMatrix = workEllipsoid1.transformRef.matrix.clone();\r\n const largestCoordinate = scaledMatrix.maxAbs();\r\n const inverseLargestCoordinate = 1.0 / largestCoordinate;\r\n scaledMatrix.scaleColumnsInPlace(inverseLargestCoordinate, inverseLargestCoordinate, inverseLargestCoordinate);\r\n const workEllipsoid = Ellipsoid.create(Transform.createOriginAndMatrix(undefined, scaledMatrix));\r\n\r\n const solver = new GeodesicPathSolver(workArc);\r\n solver.createInitialPointsAndTridiagonalSystem(numEdges);\r\n\r\n let numConverged = 0;\r\n let previousMaxDPhi = 10000.0;\r\n let numStep = 0;\r\n const dPhiTolerance = 1.0e-8;\r\n solver.setupStep(workEllipsoid);\r\n while (numStep < 15 && numConverged < 2) {\r\n if (!solver.solve())\r\n break;\r\n previousMaxDPhi = solver.applyUpdate(0.1);\r\n solver.setupStep(workEllipsoid);\r\n if (previousMaxDPhi < dPhiTolerance)\r\n numConverged++;\r\n else\r\n numConverged = 0;\r\n numStep++;\r\n }\r\n if (numConverged > 0) {\r\n const workAngles = LongitudeLatitudeNumber.createRadians(0, 0);\r\n const originalAngles = LongitudeLatitudeNumber.createRadians(0, 0);\r\n for (const p of solver._pathPoints) {\r\n LongitudeLatitudeNumber.createRadians(p.thetaRadians, p.phiRadians, 0, workAngles);\r\n originalEllipsoid.otherEllipsoidAnglesToThisEllipsoidAngles(workEllipsoid, workAngles, originalAngles);\r\n p.thetaRadians = originalAngles.longitudeRadians;\r\n p.phiRadians = originalAngles.latitudeRadians;\r\n p.evaluateDerivativesAtCurrentAngles(originalEllipsoid);\r\n }\r\n return solver._pathPoints;\r\n }\r\n return numConverged > 0 ? solver._pathPoints : undefined;\r\n }\r\n private createInitialPointsAndTridiagonalSystem(numEdges: number) {\r\n if (numEdges < 2)\r\n numEdges = 2;\r\n let f, thetaRadians;\r\n for (let i = 0; i <= numEdges; i++) {\r\n f = i / numEdges;\r\n thetaRadians = this._defaultArc.sweep.fractionToRadians(f);\r\n const p = new GeodesicPathPoint();\r\n p.thetaRadians = thetaRadians;\r\n p.phiRadians = 0.0;\r\n this._pathPoints.push(p);\r\n }\r\n this._tridiagonalSolver = new TriDiagonalSystem(this._pathPoints.length);\r\n }\r\n private applyUpdate(maxDPhiRadians: number): number {\r\n let dPhiMax = 0;\r\n for (let i = 0; i < this._pathPoints.length; i++) {\r\n const dPhi = Geometry.clampToStartEnd(this._tridiagonalSolver.getX(i), -maxDPhiRadians, maxDPhiRadians);\r\n this._pathPoints[i].phiRadians -= dPhi;\r\n dPhiMax = Geometry.maxAbsXY(dPhiMax, dPhi);\r\n }\r\n return dPhiMax;\r\n }\r\n\r\n /**\r\n * Set up a step with specified ellipsoid.\r\n * * ASSUME angles in _pathPoints are valid on given ellipsoid.\r\n * @param ellipsoid\r\n */\r\n private setupStep(ellipsoid: Ellipsoid) {\r\n for (const p of this._pathPoints) {\r\n p.evaluateDerivativesAtCurrentAngles(ellipsoid);\r\n }\r\n const lastRow = this._pathPoints.length - 1;\r\n // first and last points get trivial dPhi=0 equations:\r\n this._tridiagonalSolver.reset();\r\n this._tridiagonalSolver.addToRow(0, 0, 1, 0);\r\n this._tridiagonalSolver.addToB(0, 0);\r\n this._tridiagonalSolver.addToRow(lastRow, 0, 1, 0);\r\n this._tridiagonalSolver.addToB(lastRow, 0);\r\n\r\n // interior points get proper newton equations\r\n const values = new Float64Array(4);\r\n for (let i = 1; i < lastRow; i++) {\r\n GeodesicPathPoint.evaluateNewtonFunction(this._pathPoints[i - 1], this._pathPoints[i], this._pathPoints[i + 1], values);\r\n this._tridiagonalSolver.addToRow(i, values[1], values[2], values[3]);\r\n this._tridiagonalSolver.addToB(i, values[0]);\r\n }\r\n }\r\n\r\n private solve(): boolean {\r\n return this._tridiagonalSolver.factorAndBackSubstitute();\r\n }\r\n /**\r\n * Construct various section arcs (on the ellipsoid), using planes that (a) pass through the two given points and (b) have in-plane vector sampled between the normals of the two points.\r\n * * Each candidate ellipse has is in a plane with ellipsoid normal at vector constructed \"between\" the endpoint normals.\r\n * * The intermediate construction is by interpolation between stated fractions (which maybe outside 0 to 1)\r\n * @param ellipsoid\r\n * @param angleA start point of all candidates\r\n * @param angleB end point of all candidates\r\n * @param numSample number of ellipses to construct as candidates.\r\n * @param normalInterpolationFraction0\r\n * @param normalInterpolationFraction1\r\n */\r\n public static approximateMinimumLengthSectionArc(ellipsoid: Ellipsoid,\r\n angleA: LongitudeLatitudeNumber,\r\n angleB: LongitudeLatitudeNumber, numSample: number,\r\n normalInterpolationFraction0: number,\r\n normalInterpolationFraction1: number): { minLengthArc: Arc3d, minLengthNormalInterpolationFraction: number } | undefined {\r\n numSample = Geometry.clampToStartEnd(numSample, 2, 200);\r\n const normalA = ellipsoid.radiansToUnitNormalRay(angleA.longitudeRadians, angleA.latitudeRadians);\r\n const normalB = ellipsoid.radiansToUnitNormalRay(angleB.longitudeRadians, angleB.latitudeRadians);\r\n if (normalA !== undefined && normalB !== undefined) {\r\n let normalC;\r\n let resultArc;\r\n let lengthC;\r\n let fractionC;\r\n\r\n for (let i = 1; i <= numSample; i++) {\r\n const f = Geometry.interpolate(normalInterpolationFraction0, i / numSample, normalInterpolationFraction1);\r\n normalC = normalA.direction.interpolate(f, normalB.direction, normalC);\r\n const candidateArc = ellipsoid.createSectionArcPointPointVectorInPlane(angleA, angleB, normalC);\r\n if (candidateArc !== undefined) {\r\n const candidateLength = candidateArc.curveLength();\r\n if (lengthC === undefined || candidateLength < lengthC) {\r\n lengthC = candidateLength;\r\n resultArc = candidateArc;\r\n fractionC = f;\r\n }\r\n }\r\n }\r\n if (resultArc !== undefined && fractionC !== undefined)\r\n return { minLengthArc: resultArc, minLengthNormalInterpolationFraction: fractionC };\r\n }\r\n return undefined;\r\n }\r\n\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.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\n// import { Point2d } from \"./Geometry2d\";\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\nimport { Arc3d } from \"../curve/Arc3d\";\nimport { CurveCollection } from \"../curve/CurveCollection\";\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\nimport { LineString3d } from \"../curve/LineString3d\";\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\nimport { Matrix3d } from \"./Matrix3d\";\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\nimport { Point3dArray } from \"./PointHelpers\";\nimport { PolygonOps } from \"./PolygonOps\";\nimport { Range3d } from \"./Range\";\nimport { Transform } from \"./Transform\";\n\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\n\n/**\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\n *\n * * For the common case of building a right handed frame:\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\n * * the frame will be fully determined by an origin and two vectors.\n * * the first call to announcePoint will set the origin.\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\n * * after each announcement, call getValidatedFrame(false)\n * * getValidatedFrame will succeed when it has two independent vectors.\n * * To build a left handed frame,\n * * an origin and 3 independent vectors are required.\n * * announce as above, but query with getValidatedFrame (true).\n * * this will use the third vector to select right or left handed frame.\n * @public\n */\nexport class FrameBuilder {\n private _origin: undefined | Point3d;\n private _vector0: undefined | Vector3d;\n private _vector1: undefined | Vector3d;\n private _vector2: undefined | Vector3d;\n private static _workMatrix?: Matrix3d;\n private static _workVector0?: Vector3d;\n private static _workVector1?: Vector3d;\n private static _workPoint?: Point3d;\n // test if both vectors are defined and have significant angle between.\n private areStronglyIndependentVectors(\n vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians,\n ): boolean {\n if (vector0 !== undefined && vector1 !== undefined) {\n const q = vector0.smallerUnorientedRadiansTo(vector1);\n return q > radiansTolerance;\n }\n return false;\n }\n /** Clear all accumulated point and vector data */\n public clear() {\n this._origin = undefined;\n this._vector0 = undefined;\n this._vector1 = undefined;\n this._vector2 = undefined;\n }\n constructor() {\n this.clear();\n }\n /**\n * Try to assemble the data into a non-singular transform.\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\n */\n public getValidatedFrame(allowLeftHanded: boolean = false, result?: Transform): Transform | undefined {\n if (this._origin && this._vector0 && this._vector1) {\n const createRigidMatrix = (v0: Vector3d, v1: Vector3d): Matrix3d | undefined => {\n return FrameBuilder._workMatrix = Matrix3d.createRigidFromColumns(v0, v1, AxisOrder.XYZ, FrameBuilder._workMatrix);\n };\n if (!allowLeftHanded) {\n const matrix = createRigidMatrix(this._vector0, this._vector1);\n if (matrix)\n return Transform.createOriginAndMatrix(this._origin, matrix, result);\n // uh oh -- vector1 was not really independent. clear everything after vector0.\n this._vector1 = this._vector2 = undefined;\n } else if (this._vector2) {\n const matrix = createRigidMatrix(this._vector0, this._vector1);\n if (matrix) {\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\n matrix.scaleColumns(1.0, 1.0, -1.0);\n return Transform.createOriginAndMatrix(this._origin, matrix, result);\n }\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\n const vector2 = this._vector2;\n this._vector1 = this._vector2 = undefined;\n this.announceVector(vector2);\n }\n }\n return undefined;\n }\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\n public applyDefaultUpVector(vector?: Vector3d) {\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\n this._vector1 = vector.crossProduct(this._vector0);\n }\n }\n /** Ask if there is a defined origin for the evolving frame */\n public get hasOrigin(): boolean {\n return this._origin !== undefined;\n }\n /**\n * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\n */\n public savedVectorCount(): number {\n if (!this._vector0)\n return 0;\n if (!this._vector1)\n return 1;\n if (!this._vector2)\n return 2;\n return 3;\n }\n /**\n * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.\n */\n public announcePoint(point: Point3d): number {\n if (!this._origin) {\n this._origin = point.clone();\n return this.savedVectorCount();\n }\n // the new point may provide an additional vector\n if (this._origin.isAlmostEqual(point))\n return this.savedVectorCount();\n return this.announceVector(this._origin.vectorTo(point));\n }\n /** Announce a new vector. */\n public announceVector(vector: Vector3d): number {\n if (vector.isAlmostZero)\n return this.savedVectorCount();\n if (!this._vector0) {\n this._vector0 = vector.clone(this._vector0);\n return 1;\n }\n if (!this._vector1) {\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\n this._vector1 = vector.clone(this._vector1);\n return 2;\n }\n return 1;\n }\n // vector0 and vector1 are independent.\n if (!this._vector2) {\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\n this._vector2 = vector.clone(this._vector2);\n return 3;\n }\n return 2;\n }\n // fall through if prior vectors are all there -- no need for the new one.\n return 3;\n }\n /**\n * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient\n * for a coordinate system.\n */\n public announce(data: any) {\n if (this.savedVectorCount() > 1)\n return;\n if (data === undefined)\n return;\n if (data instanceof Point3d)\n this.announcePoint(data);\n else if (data instanceof Vector3d)\n this.announceVector(data);\n else if (Array.isArray(data)) {\n for (const child of data) {\n if (this.savedVectorCount() > 1)\n break;\n this.announce(child);\n }\n } else if (data instanceof CurvePrimitive) {\n if (data instanceof LineSegment3d) {\n this.announcePoint(data.startPoint());\n this.announcePoint(data.endPoint());\n } else if (data instanceof Arc3d) {\n const ray = data.fractionToPointAndDerivative(0.0);\n this.announcePoint(ray.origin);\n this.announceVector(ray.direction);\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\n } else if (data instanceof LineString3d) {\n for (const point of data.points) {\n this.announcePoint(point);\n if (this.savedVectorCount() > 1)\n break;\n }\n } else if (data instanceof BSplineCurve3d) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (data.getPolePoint3d(i, point) instanceof Point3d)\n this.announcePoint(point);\n else break;\n }\n } else if (data instanceof InterpolationCurve3d) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (i < data.options.fitPoints.length) {\n point.setFrom(data.options.fitPoints[i]);\n this.announcePoint(point);\n } else break;\n }\n } else { // unimplemented CurvePrimitive type\n const frame = data.fractionToFrenetFrame(0.0);\n if (undefined !== frame) {\n this.announcePoint(frame.getOrigin());\n this.announceVector(frame.matrix.getColumn(0));\n this.announceVector(frame.matrix.getColumn(1));\n }\n }\n } else if (data instanceof CurveCollection) {\n if (data.children)\n for (const child of data.children) {\n this.announce(child);\n if (this.savedVectorCount() > 1)\n break;\n }\n } else if (data instanceof GrowableXYZArray) {\n const point = Point3d.create();\n for (let i = 0; this.savedVectorCount() < 2; i++) {\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\n this.announcePoint(point);\n else break;\n }\n } else if (data.hasOwnProperty(\"x\") && data.hasOwnProperty(\"y\") && data.hasOwnProperty(\"z\")) {\n this.announcePoint(Point3d.create(data.x, data.y, data.z));\n }\n }\n /**\n * Create a localToWorld frame for the given data.\n * * origin is at first point.\n * * x axis in direction of first nonzero vector present or implied by the input.\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\n * @param defaultUpVector optional vector to cross with vector0 to create vector1 when it is unknown\n * @param params any number of geometric objects to examine in [[announce]] for point/vector data sufficient to construct a frame.\n * If the last argument is a `Transform`, it is populated with the computed frame and returned.\n * @returns computed localToWorld frame, or undefined if insufficient data.\n */\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\n // if last arg is a Transform, remove it from the array and use for the return value\n let frame = (params.length > 0 && params[params.length - 1] instanceof Transform) ? params.pop() as Transform : undefined;\n const builder = new FrameBuilder();\n for (const data of params) {\n builder.announce(data);\n builder.applyDefaultUpVector(defaultUpVector);\n if (frame = builder.getValidatedFrame(false, frame)) {\n if (defaultUpVector) {\n if (frame.matrix.dotColumnZ(defaultUpVector) < 0.0)\n frame.matrix.scaleColumnsInPlace(1, -1, -1);\n }\n return frame;\n }\n }\n const evaluatePrimitiveFrame = (curve: CurvePrimitive, result?: Transform): Transform | undefined => {\n return curve.fractionToFrenetFrame(0.0, result);\n };\n // try direct evaluation of curve primitives using the above lambda\n for (const data of params) {\n if (data instanceof CurvePrimitive) {\n return evaluatePrimitiveFrame(data, frame);\n } else if (data instanceof CurveCollection) {\n const children = data.collectCurvePrimitives();\n for (const curve of children) {\n if (frame = evaluatePrimitiveFrame(curve, frame))\n return frame;\n }\n }\n }\n return undefined;\n }\n /**\n * Create a transform containing points or vectors in the given data.\n * * The xy columns of the transform contain the first points or vectors of the data.\n * * The z column is perpendicular to that xy plane.\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\n * @param params any number of geometric objects to examine in [[announce]] for point/vector data sufficient to construct a frame.\n * If the last argument is a `Transform`, it is populated with the computed frame and returned.\n * @returns computed localToWorld frame, or undefined if insufficient data.\n */\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\n return this.createRightHandedFrame(undefined, params);\n }\n\n /**\n * Try to create a frame whose xy plane is through points.\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\n * direction is toward the point most distant from that line.\n * @param points array of points\n * @param result optional pre-allocated Transform to populate and return\n * @returns localToWorld frame for the points, or undefined if insufficient data\n */\n public static createFrameToDistantPoints(points: Point3d[], result?: Transform): Transform | undefined {\n if (points.length > 2) {\n const origin = points[0];\n const vector01 = FrameBuilder._workVector0 ?? Vector3d.create();\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\n const vector02 = FrameBuilder._workVector1 ?? Vector3d.create();\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\n const matrix = FrameBuilder._workMatrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ, FrameBuilder._workMatrix);\n if (matrix)\n return Transform.createOriginAndMatrix(origin, matrix, result);\n }\n return undefined;\n }\n /**\n * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\n * direction is toward the point most distant from that line.\n * @param points array of points\n * @param result optional pre-allocated Transform to populate and return\n * @returns localToWorld frame for the points, or undefined if insufficient data\n */\n public static createFrameWithCCWPolygon(points: Point3d[], result?: Transform): Transform | undefined {\n if (points.length > 2) {\n const ray = PolygonOps.centroidAreaNormal(points); // can't pass pre-allocated ray...\n if (ray)\n return ray.toRigidZFrame(result);\n }\n return undefined;\n }\n /**\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\n * @param range range to inspect\n * @param scaleSelect selects size of localToWorld axes.\n * @param fractionX fractional coordinate of frame origin x\n * @param fractionY fractional coordinate of frame origin y\n * @param fractionZ fractional coordinate of frame origin z\n * @param defaultAxisLength if true and any axis length is 0, that axis vector takes this physical length.\n * @param result optional pre-allocated Transform to populate and return\n * @returns localToWorld frame for the range\n */\n public static createLocalToWorldTransformInRange(\n range: Range3d,\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\n fractionX: number = 0,\n fractionY: number = 0,\n fractionZ: number = 0,\n defaultAxisLength: number = 1.0,\n result?: Transform,\n ): Transform {\n if (range.isNull)\n return Transform.createIdentity(result);\n let a = 1.0;\n let b = 1.0;\n let c = 1.0;\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\n }\n const origin = FrameBuilder._workPoint = range.fractionToPoint(fractionX, fractionY, fractionZ, FrameBuilder._workPoint);\n const matrix = FrameBuilder._workMatrix = Matrix3d.createScale(a, b, c, FrameBuilder._workMatrix);\n return Transform.createOriginAndMatrix(origin, matrix, result);\n }\n}\n"]}
1
+ {"version":3,"file":"FrameBuilder.js","sourceRoot":"","sources":["../../../src/geometry3d/FrameBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module CartesianGeometry\r\n */\r\n\r\n// import { Point2d } from \"./Geometry2d\";\r\nimport { BSplineCurve3d } from \"../bspline/BSplineCurve\";\r\nimport { InterpolationCurve3d } from \"../bspline/InterpolationCurve3d\";\r\nimport { Arc3d } from \"../curve/Arc3d\";\r\nimport { CurveCollection } from \"../curve/CurveCollection\";\r\nimport { CurvePrimitive } from \"../curve/CurvePrimitive\";\r\nimport { LineSegment3d } from \"../curve/LineSegment3d\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { AxisOrder, AxisScaleSelect, Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"./GrowableXYZArray\";\r\nimport { Matrix3d } from \"./Matrix3d\";\r\nimport { Point3d, Vector3d } from \"./Point3dVector3d\";\r\nimport { Point3dArray } from \"./PointHelpers\";\r\nimport { PolygonOps } from \"./PolygonOps\";\r\nimport { Range3d } from \"./Range\";\r\nimport { Transform } from \"./Transform\";\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention, no-empty */\r\n\r\n/**\r\n * Helper class to accumulate points and vectors until there is enough data to define a coordinate system.\r\n *\r\n * * For the common case of building a right handed frame:\r\n * * create the FrameBuilder and make calls to announcePoint and announceVector.\r\n * * the frame will be fully determined by an origin and two vectors.\r\n * * the first call to announcePoint will set the origin.\r\n * * additional calls to announcePoint will produce announceVector call with the vector from the origin.\r\n * * after each announcement, call getValidatedFrame(false)\r\n * * getValidatedFrame will succeed when it has two independent vectors.\r\n * * To build a left handed frame,\r\n * * an origin and 3 independent vectors are required.\r\n * * announce as above, but query with getValidatedFrame (true).\r\n * * this will use the third vector to select right or left handed frame.\r\n * @public\r\n */\r\nexport class FrameBuilder {\r\n private _origin: undefined | Point3d;\r\n private _vector0: undefined | Vector3d;\r\n private _vector1: undefined | Vector3d;\r\n private _vector2: undefined | Vector3d;\r\n private static _workMatrix?: Matrix3d;\r\n private static _workVector0?: Vector3d;\r\n private static _workVector1?: Vector3d;\r\n private static _workPoint?: Point3d;\r\n // test if both vectors are defined and have significant angle between.\r\n private areStronglyIndependentVectors(\r\n vector0: Vector3d, vector1: Vector3d, radiansTolerance: number = Geometry.smallAngleRadians,\r\n ): boolean {\r\n if (vector0 !== undefined && vector1 !== undefined) {\r\n const q = vector0.smallerUnorientedRadiansTo(vector1);\r\n return q > radiansTolerance;\r\n }\r\n return false;\r\n }\r\n /** Clear all accumulated point and vector data */\r\n public clear() {\r\n this._origin = undefined;\r\n this._vector0 = undefined;\r\n this._vector1 = undefined;\r\n this._vector2 = undefined;\r\n }\r\n constructor() {\r\n this.clear();\r\n }\r\n /**\r\n * Try to assemble the data into a non-singular transform.\r\n * * If allowLeftHanded is false, vector0 and vector1 determine a right handed coordinate system.\r\n * * if allowLeftHanded is true, the z vector of the right handed system can be flipped to agree with vector2 direction.\r\n */\r\n public getValidatedFrame(allowLeftHanded: boolean = false, result?: Transform): Transform | undefined {\r\n if (this._origin && this._vector0 && this._vector1) {\r\n const createRigidMatrix = (v0: Vector3d, v1: Vector3d): Matrix3d | undefined => {\r\n return FrameBuilder._workMatrix = Matrix3d.createRigidFromColumns(v0, v1, AxisOrder.XYZ, FrameBuilder._workMatrix);\r\n };\r\n if (!allowLeftHanded) {\r\n const matrix = createRigidMatrix(this._vector0, this._vector1);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(this._origin, matrix, result);\r\n // uh oh -- vector1 was not really independent. clear everything after vector0.\r\n this._vector1 = this._vector2 = undefined;\r\n } else if (this._vector2) {\r\n const matrix = createRigidMatrix(this._vector0, this._vector1);\r\n if (matrix) {\r\n if (this._vector0.tripleProduct(this._vector1, this._vector2) < 0)\r\n matrix.scaleColumns(1.0, 1.0, -1.0);\r\n return Transform.createOriginAndMatrix(this._origin, matrix, result);\r\n }\r\n // uh oh again -- clear vector1 and vector2, re-announce vector2 as possible vector1??\r\n const vector2 = this._vector2;\r\n this._vector1 = this._vector2 = undefined;\r\n this.announceVector(vector2);\r\n }\r\n }\r\n return undefined;\r\n }\r\n /** If vector0 is known but vector1 is not, make vector1 the cross of the up-vector and vector0 */\r\n public applyDefaultUpVector(vector?: Vector3d) {\r\n if (vector && this._vector0 && !this._vector1 && !vector.isParallelTo(this._vector0)) {\r\n this._vector1 = vector.crossProduct(this._vector0);\r\n }\r\n }\r\n /** Ask if there is a defined origin for the evolving frame */\r\n public get hasOrigin(): boolean {\r\n return this._origin !== undefined;\r\n }\r\n /**\r\n * Return the number of vectors saved. Because the save process checks numerics, this should be the rank of the system.\r\n */\r\n public savedVectorCount(): number {\r\n if (!this._vector0)\r\n return 0;\r\n if (!this._vector1)\r\n return 1;\r\n if (!this._vector2)\r\n return 2;\r\n return 3;\r\n }\r\n /**\r\n * Announce a new point. If this point is different from the origin, also compute and announce the vector from the origin.\r\n */\r\n public announcePoint(point: Point3d): number {\r\n if (!this._origin) {\r\n this._origin = point.clone();\r\n return this.savedVectorCount();\r\n }\r\n // the new point may provide an additional vector\r\n if (this._origin.isAlmostEqual(point))\r\n return this.savedVectorCount();\r\n return this.announceVector(this._origin.vectorTo(point));\r\n }\r\n /** Announce a new vector. */\r\n public announceVector(vector: Vector3d): number {\r\n if (vector.isAlmostZero)\r\n return this.savedVectorCount();\r\n if (!this._vector0) {\r\n this._vector0 = vector.clone(this._vector0);\r\n return 1;\r\n }\r\n if (!this._vector1) {\r\n if (this.areStronglyIndependentVectors(vector, this._vector0, 1.0e-5)) {\r\n this._vector1 = vector.clone(this._vector1);\r\n return 2;\r\n }\r\n return 1;\r\n }\r\n // vector0 and vector1 are independent.\r\n if (!this._vector2) {\r\n const unitPerpendicular = this._vector0.unitCrossProduct(this._vector1);\r\n if (unitPerpendicular && !Geometry.isSameCoordinate(0, unitPerpendicular.dotProduct(vector))) {\r\n this._vector2 = vector.clone(this._vector2);\r\n return 3;\r\n }\r\n return 2;\r\n }\r\n // fall through if prior vectors are all there -- no need for the new one.\r\n return 3;\r\n }\r\n /**\r\n * Inspect the content of the data. Announce points and vectors. Return when savedVectorCount becomes sufficient\r\n * for a coordinate system.\r\n */\r\n public announce(data: any) {\r\n if (this.savedVectorCount() > 1)\r\n return;\r\n if (data === undefined)\r\n return;\r\n if (data instanceof Point3d)\r\n this.announcePoint(data);\r\n else if (data instanceof Vector3d)\r\n this.announceVector(data);\r\n else if (Array.isArray(data)) {\r\n for (const child of data) {\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n this.announce(child);\r\n }\r\n } else if (data instanceof CurvePrimitive) {\r\n if (data instanceof LineSegment3d) {\r\n this.announcePoint(data.startPoint());\r\n this.announcePoint(data.endPoint());\r\n } else if (data instanceof Arc3d) {\r\n const ray = data.fractionToPointAndDerivative(0.0);\r\n this.announcePoint(ray.origin);\r\n this.announceVector(ray.direction);\r\n this.announceVector(data.matrixRef.columnZCrossVector(ray.direction));\r\n } else if (data instanceof LineString3d) {\r\n for (const point of data.points) {\r\n this.announcePoint(point);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof BSplineCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPolePoint3d(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data instanceof InterpolationCurve3d) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (i < data.options.fitPoints.length) {\r\n point.setFrom(data.options.fitPoints[i]);\r\n this.announcePoint(point);\r\n } else break;\r\n }\r\n } else { // unimplemented CurvePrimitive type\r\n const frame = data.fractionToFrenetFrame(0.0);\r\n if (undefined !== frame) {\r\n this.announcePoint(frame.getOrigin());\r\n this.announceVector(frame.matrix.getColumn(0));\r\n this.announceVector(frame.matrix.getColumn(1));\r\n }\r\n }\r\n } else if (data instanceof CurveCollection) {\r\n if (data.children)\r\n for (const child of data.children) {\r\n this.announce(child);\r\n if (this.savedVectorCount() > 1)\r\n break;\r\n }\r\n } else if (data instanceof GrowableXYZArray) {\r\n const point = Point3d.create();\r\n for (let i = 0; this.savedVectorCount() < 2; i++) {\r\n if (data.getPoint3dAtCheckedPointIndex(i, point) instanceof Point3d)\r\n this.announcePoint(point);\r\n else break;\r\n }\r\n } else if (data.hasOwnProperty(\"x\") && data.hasOwnProperty(\"y\") && data.hasOwnProperty(\"z\")) {\r\n this.announcePoint(Point3d.create(data.x, data.y, data.z));\r\n }\r\n }\r\n /**\r\n * Create a localToWorld frame for the given data.\r\n * * origin is at first point.\r\n * * x axis in direction of first nonzero vector present or implied by the input.\r\n * * y axis is perpendicular to x and contains (in positive side) the next vector present or implied by the input.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n * @param defaultUpVector optional vector to cross with vector0 to create vector1 when it is unknown\r\n * @param params any number of geometric objects to examine in [[announce]] for point/vector data sufficient to construct a frame.\r\n * If the last argument is a `Transform`, it is populated with the computed frame and returned.\r\n * @returns computed localToWorld frame, or undefined if insufficient data.\r\n */\r\n public static createRightHandedFrame(defaultUpVector: Vector3d | undefined, ...params: any[]): Transform | undefined {\r\n // if last arg is a Transform, remove it from the array and use for the return value\r\n let frame = (params.length > 0 && params[params.length - 1] instanceof Transform) ? params.pop() as Transform : undefined;\r\n const builder = new FrameBuilder();\r\n for (const data of params) {\r\n builder.announce(data);\r\n builder.applyDefaultUpVector(defaultUpVector);\r\n if (frame = builder.getValidatedFrame(false, frame)) {\r\n if (defaultUpVector) {\r\n if (frame.matrix.dotColumnZ(defaultUpVector) < 0.0)\r\n frame.matrix.scaleColumnsInPlace(1, -1, -1);\r\n }\r\n return frame;\r\n }\r\n }\r\n const evaluatePrimitiveFrame = (curve: CurvePrimitive, result?: Transform): Transform | undefined => {\r\n return curve.fractionToFrenetFrame(0.0, result);\r\n };\r\n // try direct evaluation of curve primitives using the above lambda\r\n for (const data of params) {\r\n if (data instanceof CurvePrimitive) {\r\n return evaluatePrimitiveFrame(data, frame);\r\n } else if (data instanceof CurveCollection) {\r\n const children = data.collectCurvePrimitives();\r\n for (const curve of children) {\r\n if (frame = evaluatePrimitiveFrame(curve, frame))\r\n return frame;\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create a transform containing points or vectors in the given data.\r\n * * The xy columns of the transform contain the first points or vectors of the data.\r\n * * The z column is perpendicular to that xy plane.\r\n * * The calculation favors the first points found. It does not try to get a \"best\" plane.\r\n * @param params any number of geometric objects to examine in [[announce]] for point/vector data sufficient to construct a frame.\r\n * If the last argument is a `Transform`, it is populated with the computed frame and returned.\r\n * @returns computed localToWorld frame, or undefined if insufficient data.\r\n */\r\n public static createRightHandedLocalToWorld(...params: any[]): Transform | undefined {\r\n return this.createRightHandedFrame(undefined, params);\r\n }\r\n\r\n /**\r\n * Try to create a frame whose xy plane is through points.\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n * @param result optional pre-allocated Transform to populate and return\r\n * @returns localToWorld frame for the points, or undefined if insufficient data\r\n */\r\n public static createFrameToDistantPoints(points: Point3d[], result?: Transform): Transform | undefined {\r\n if (points.length > 2) {\r\n const origin = points[0];\r\n const vector01 = FrameBuilder._workVector0 ?? Vector3d.create();\r\n Point3dArray.indexOfMostDistantPoint(points, points[0], vector01);\r\n const vector02 = FrameBuilder._workVector1 ?? Vector3d.create();\r\n Point3dArray.indexOfPointWithMaxCrossProductMagnitude(points, origin, vector01, vector02);\r\n const matrix = FrameBuilder._workMatrix = Matrix3d.createRigidFromColumns(vector01, vector02, AxisOrder.XYZ, FrameBuilder._workMatrix);\r\n if (matrix)\r\n return Transform.createOriginAndMatrix(origin, matrix, result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Try to create a frame whose xy plane is through points, with the points appearing CCW in the local frame.\r\n * * If 3 or more distinct points are present, the x axis is from the first point to the most distant, and y\r\n * direction is toward the point most distant from that line.\r\n * @param points array of points\r\n * @param result optional pre-allocated Transform to populate and return\r\n * @returns localToWorld frame for the points, or undefined if insufficient data\r\n */\r\n public static createFrameWithCCWPolygon(points: Point3d[], result?: Transform): Transform | undefined {\r\n if (points.length > 2) {\r\n const ray = PolygonOps.centroidAreaNormal(points); // can't pass pre-allocated ray...\r\n if (ray)\r\n return ray.toRigidZFrame(result);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Create the localToWorld transform from a range to axes of its parent coordinate system.\r\n * @param range range to inspect\r\n * @param scaleSelect selects size of localToWorld axes.\r\n * @param fractionX fractional coordinate of frame origin x\r\n * @param fractionY fractional coordinate of frame origin y\r\n * @param fractionZ fractional coordinate of frame origin z\r\n * @param defaultAxisLength if true and any axis length is 0, that axis vector takes this physical length.\r\n * @param result optional pre-allocated Transform to populate and return\r\n * @returns localToWorld frame for the range\r\n */\r\n public static createLocalToWorldTransformInRange(\r\n range: Range3d,\r\n scaleSelect: AxisScaleSelect = AxisScaleSelect.NonUniformRangeContainment,\r\n fractionX: number = 0,\r\n fractionY: number = 0,\r\n fractionZ: number = 0,\r\n defaultAxisLength: number = 1.0,\r\n result?: Transform,\r\n ): Transform {\r\n if (range.isNull)\r\n return Transform.createIdentity(result);\r\n let a = 1.0;\r\n let b = 1.0;\r\n let c = 1.0;\r\n if (scaleSelect === AxisScaleSelect.LongestRangeDirection) {\r\n a = b = c = Geometry.correctSmallMetricDistance(range.maxLength(), defaultAxisLength);\r\n } else if (scaleSelect === AxisScaleSelect.NonUniformRangeContainment) {\r\n a = Geometry.correctSmallMetricDistance(range.xLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionX, 0, 1);\r\n b = Geometry.correctSmallMetricDistance(range.yLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionY, 0, 1);\r\n c = Geometry.correctSmallMetricDistance(range.zLength(), defaultAxisLength) * Geometry.maxAbsDiff(fractionZ, 0, 1);\r\n }\r\n const origin = FrameBuilder._workPoint = range.fractionToPoint(fractionX, fractionY, fractionZ, FrameBuilder._workPoint);\r\n const matrix = FrameBuilder._workMatrix = Matrix3d.createScale(a, b, c, FrameBuilder._workMatrix);\r\n return Transform.createOriginAndMatrix(origin, matrix, result);\r\n }\r\n}\r\n"]}