@itwin/core-geometry 5.3.0-dev.16 → 5.3.0-dev.18

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 (536) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/lib/cjs/Constant.js.map +1 -1
  3. package/lib/cjs/Geometry.js.map +1 -1
  4. package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
  5. package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
  6. package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
  7. package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
  8. package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
  9. package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
  10. package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
  11. package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
  12. package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
  13. package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
  14. package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
  15. package/lib/cjs/bspline/KnotVector.js.map +1 -1
  16. package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
  17. package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
  18. package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
  19. package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
  20. package/lib/cjs/clipping/ClipPlane.js.map +1 -1
  21. package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
  22. package/lib/cjs/clipping/ClipUtils.js.map +1 -1
  23. package/lib/cjs/clipping/ClipVector.js.map +1 -1
  24. package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
  25. package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  26. package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  27. package/lib/cjs/core-geometry.js.map +1 -1
  28. package/lib/cjs/curve/Arc3d.d.ts +15 -1
  29. package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
  30. package/lib/cjs/curve/Arc3d.js +31 -2
  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/AnnounceTangentStrokeHandler.js.map +1 -1
  67. package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  68. package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  69. package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  70. package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  71. package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  72. package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  73. package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  74. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  75. package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  76. package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
  77. package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  78. package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  79. package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
  80. package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
  81. package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  82. package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  83. package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  84. package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
  85. package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  86. package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  87. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
  88. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
  89. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
  90. package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  91. package/lib/cjs/curve/spiral/ClothoidSeries.d.ts +5 -5
  92. package/lib/cjs/curve/spiral/ClothoidSeries.d.ts.map +1 -1
  93. package/lib/cjs/curve/spiral/ClothoidSeries.js +28 -16
  94. package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
  95. package/lib/cjs/curve/spiral/CubicEvaluator.d.ts +7 -6
  96. package/lib/cjs/curve/spiral/CubicEvaluator.d.ts.map +1 -1
  97. package/lib/cjs/curve/spiral/CubicEvaluator.js +29 -14
  98. package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
  99. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts +30 -40
  100. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
  101. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js +43 -49
  102. package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  103. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
  104. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
  105. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
  106. package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  107. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +103 -95
  108. package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  109. package/lib/cjs/curve/spiral/DirectSpiral3d.js +132 -106
  110. package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
  111. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +70 -52
  112. package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  113. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +97 -65
  114. package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  115. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +7 -11
  116. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
  117. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +10 -12
  118. package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  119. package/lib/cjs/curve/spiral/NormalizedTransition.d.ts +29 -24
  120. package/lib/cjs/curve/spiral/NormalizedTransition.d.ts.map +1 -1
  121. package/lib/cjs/curve/spiral/NormalizedTransition.js +53 -35
  122. package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
  123. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts +12 -17
  124. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
  125. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js +20 -23
  126. package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  127. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +25 -23
  128. package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  129. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js +34 -29
  130. package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  131. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +43 -33
  132. package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  133. package/lib/cjs/curve/spiral/TransitionSpiral3d.js +56 -38
  134. package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
  135. package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts +27 -21
  136. package/lib/cjs/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
  137. package/lib/cjs/curve/spiral/XYCurveEvaluator.js +23 -18
  138. package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
  139. package/lib/cjs/geometry3d/Angle.js.map +1 -1
  140. package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
  141. package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
  142. package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
  143. package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
  144. package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
  145. package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
  146. package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
  147. package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
  148. package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
  149. package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
  150. package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
  151. package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
  152. package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
  153. package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
  154. package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
  155. package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  156. package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
  157. package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
  158. package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
  159. package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  160. package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  161. package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
  162. package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
  163. package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
  164. package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
  165. package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
  166. package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
  167. package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
  168. package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  169. package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
  170. package/lib/cjs/geometry3d/Range.js.map +1 -1
  171. package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
  172. package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
  173. package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
  174. package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
  175. package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
  176. package/lib/cjs/geometry3d/Transform.js.map +1 -1
  177. package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
  178. package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
  179. package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
  180. package/lib/cjs/geometry4d/Map4d.js.map +1 -1
  181. package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
  182. package/lib/cjs/geometry4d/MomentData.js.map +1 -1
  183. package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  184. package/lib/cjs/geometry4d/Point4d.js.map +1 -1
  185. package/lib/cjs/numerics/BandedSystem.js.map +1 -1
  186. package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
  187. package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
  188. package/lib/cjs/numerics/Complex.js.map +1 -1
  189. package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
  190. package/lib/cjs/numerics/Newton.js.map +1 -1
  191. package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
  192. package/lib/cjs/numerics/PolarData.js.map +1 -1
  193. package/lib/cjs/numerics/Polynomials.js.map +1 -1
  194. package/lib/cjs/numerics/Quadrature.js.map +1 -1
  195. package/lib/cjs/numerics/Range1dArray.js.map +1 -1
  196. package/lib/cjs/numerics/SmallSystem.js.map +1 -1
  197. package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
  198. package/lib/cjs/numerics/UnionFind.js.map +1 -1
  199. package/lib/cjs/numerics/UsageSums.js.map +1 -1
  200. package/lib/cjs/polyface/AuxData.js.map +1 -1
  201. package/lib/cjs/polyface/BoxTopology.js.map +1 -1
  202. package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
  203. package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
  204. package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
  205. package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  206. package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
  207. package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  208. package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
  209. package/lib/cjs/polyface/Polyface.js.map +1 -1
  210. package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
  211. package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
  212. package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
  213. package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
  214. package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
  215. package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  216. package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  217. package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  218. package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  219. package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  220. package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  221. package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
  222. package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
  223. package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  224. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  225. package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  226. package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  227. package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  228. package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  229. package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
  230. package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  231. package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
  232. package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
  233. package/lib/cjs/serialization/BGFBReader.js.map +1 -1
  234. package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
  235. package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  236. package/lib/cjs/serialization/DeepCompare.js.map +1 -1
  237. package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
  238. package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
  239. package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
  240. package/lib/cjs/solid/Box.js.map +1 -1
  241. package/lib/cjs/solid/Cone.js.map +1 -1
  242. package/lib/cjs/solid/LinearSweep.js.map +1 -1
  243. package/lib/cjs/solid/RotationalSweep.js.map +1 -1
  244. package/lib/cjs/solid/RuledSweep.js.map +1 -1
  245. package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
  246. package/lib/cjs/solid/Sphere.js.map +1 -1
  247. package/lib/cjs/solid/SweepContour.js.map +1 -1
  248. package/lib/cjs/solid/TorusPipe.js.map +1 -1
  249. package/lib/cjs/topology/ChainMerge.js.map +1 -1
  250. package/lib/cjs/topology/Graph.js.map +1 -1
  251. package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  252. package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
  253. package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  254. package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
  255. package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
  256. package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  257. package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  258. package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
  259. package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
  260. package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
  261. package/lib/cjs/topology/MaskManager.js.map +1 -1
  262. package/lib/cjs/topology/Merging.js.map +1 -1
  263. package/lib/cjs/topology/RegularizeFace.js.map +1 -1
  264. package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
  265. package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
  266. package/lib/cjs/topology/Triangulation.js.map +1 -1
  267. package/lib/cjs/topology/Voronoi.js.map +1 -1
  268. package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
  269. package/lib/esm/Constant.js.map +1 -1
  270. package/lib/esm/Geometry.js.map +1 -1
  271. package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
  272. package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
  273. package/lib/esm/bspline/BSplineCurve.js.map +1 -1
  274. package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
  275. package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
  276. package/lib/esm/bspline/BSplineSurface.js.map +1 -1
  277. package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
  278. package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
  279. package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
  280. package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
  281. package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
  282. package/lib/esm/bspline/KnotVector.js.map +1 -1
  283. package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
  284. package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
  285. package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
  286. package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
  287. package/lib/esm/clipping/ClipPlane.js.map +1 -1
  288. package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
  289. package/lib/esm/clipping/ClipUtils.js.map +1 -1
  290. package/lib/esm/clipping/ClipVector.js.map +1 -1
  291. package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
  292. package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
  293. package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
  294. package/lib/esm/core-geometry.js.map +1 -1
  295. package/lib/esm/curve/Arc3d.d.ts +15 -1
  296. package/lib/esm/curve/Arc3d.d.ts.map +1 -1
  297. package/lib/esm/curve/Arc3d.js +31 -2
  298. package/lib/esm/curve/Arc3d.js.map +1 -1
  299. package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
  300. package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
  301. package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
  302. package/lib/esm/curve/CurveCollection.js.map +1 -1
  303. package/lib/esm/curve/CurveCurve.js.map +1 -1
  304. package/lib/esm/curve/CurveExtendMode.js.map +1 -1
  305. package/lib/esm/curve/CurveFactory.js.map +1 -1
  306. package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
  307. package/lib/esm/curve/CurveOps.js.map +1 -1
  308. package/lib/esm/curve/CurvePrimitive.js.map +1 -1
  309. package/lib/esm/curve/CurveProcessor.js.map +1 -1
  310. package/lib/esm/curve/CurveTypes.js.map +1 -1
  311. package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
  312. package/lib/esm/curve/GeometryQuery.js.map +1 -1
  313. package/lib/esm/curve/LineSegment3d.js.map +1 -1
  314. package/lib/esm/curve/LineString3d.js.map +1 -1
  315. package/lib/esm/curve/Loop.js.map +1 -1
  316. package/lib/esm/curve/OffsetOptions.js.map +1 -1
  317. package/lib/esm/curve/ParityRegion.js.map +1 -1
  318. package/lib/esm/curve/Path.js.map +1 -1
  319. package/lib/esm/curve/PointString3d.js.map +1 -1
  320. package/lib/esm/curve/ProxyCurve.js.map +1 -1
  321. package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
  322. package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
  323. package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
  324. package/lib/esm/curve/Query/InOutTests.js.map +1 -1
  325. package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
  326. package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
  327. package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
  328. package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
  329. package/lib/esm/curve/RegionOps.js.map +1 -1
  330. package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
  331. package/lib/esm/curve/StrokeOptions.js.map +1 -1
  332. package/lib/esm/curve/UnionRegion.js.map +1 -1
  333. package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
  334. package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
  335. package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
  336. package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
  337. package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
  338. package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
  339. package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
  340. package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
  341. package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
  342. package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
  343. package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
  344. package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
  345. package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
  346. package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
  347. package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
  348. package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
  349. package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
  350. package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
  351. package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
  352. package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
  353. package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
  354. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts +10 -13
  355. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.d.ts.map +1 -1
  356. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js +23 -22
  357. package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
  358. package/lib/esm/curve/spiral/ClothoidSeries.d.ts +5 -5
  359. package/lib/esm/curve/spiral/ClothoidSeries.d.ts.map +1 -1
  360. package/lib/esm/curve/spiral/ClothoidSeries.js +28 -16
  361. package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
  362. package/lib/esm/curve/spiral/CubicEvaluator.d.ts +7 -6
  363. package/lib/esm/curve/spiral/CubicEvaluator.d.ts.map +1 -1
  364. package/lib/esm/curve/spiral/CubicEvaluator.js +29 -14
  365. package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
  366. package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts +30 -40
  367. package/lib/esm/curve/spiral/CzechSpiralEvaluator.d.ts.map +1 -1
  368. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js +43 -49
  369. package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
  370. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts +2 -2
  371. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.d.ts.map +1 -1
  372. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js +17 -7
  373. package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
  374. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +103 -95
  375. package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
  376. package/lib/esm/curve/spiral/DirectSpiral3d.js +132 -106
  377. package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
  378. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +70 -52
  379. package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
  380. package/lib/esm/curve/spiral/IntegratedSpiral3d.js +97 -65
  381. package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
  382. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts +7 -11
  383. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.d.ts.map +1 -1
  384. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js +10 -12
  385. package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
  386. package/lib/esm/curve/spiral/NormalizedTransition.d.ts +29 -24
  387. package/lib/esm/curve/spiral/NormalizedTransition.d.ts.map +1 -1
  388. package/lib/esm/curve/spiral/NormalizedTransition.js +53 -35
  389. package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
  390. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts +12 -17
  391. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.d.ts.map +1 -1
  392. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js +20 -23
  393. package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
  394. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +25 -23
  395. package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
  396. package/lib/esm/curve/spiral/TransitionConditionalProperties.js +34 -29
  397. package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
  398. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +43 -33
  399. package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
  400. package/lib/esm/curve/spiral/TransitionSpiral3d.js +56 -38
  401. package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
  402. package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts +27 -21
  403. package/lib/esm/curve/spiral/XYCurveEvaluator.d.ts.map +1 -1
  404. package/lib/esm/curve/spiral/XYCurveEvaluator.js +23 -18
  405. package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
  406. package/lib/esm/geometry3d/Angle.js.map +1 -1
  407. package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
  408. package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
  409. package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
  410. package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
  411. package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
  412. package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
  413. package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
  414. package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
  415. package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
  416. package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
  417. package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
  418. package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
  419. package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
  420. package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
  421. package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
  422. package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
  423. package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
  424. package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
  425. package/lib/esm/geometry3d/Plane3d.js.map +1 -1
  426. package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
  427. package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
  428. package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
  429. package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
  430. package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
  431. package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
  432. package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
  433. package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
  434. package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
  435. package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
  436. package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
  437. package/lib/esm/geometry3d/Range.js.map +1 -1
  438. package/lib/esm/geometry3d/Ray2d.js.map +1 -1
  439. package/lib/esm/geometry3d/Ray3d.js.map +1 -1
  440. package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
  441. package/lib/esm/geometry3d/Segment1d.js.map +1 -1
  442. package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
  443. package/lib/esm/geometry3d/Transform.js.map +1 -1
  444. package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
  445. package/lib/esm/geometry3d/XYZProps.js.map +1 -1
  446. package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
  447. package/lib/esm/geometry4d/Map4d.js.map +1 -1
  448. package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
  449. package/lib/esm/geometry4d/MomentData.js.map +1 -1
  450. package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
  451. package/lib/esm/geometry4d/Point4d.js.map +1 -1
  452. package/lib/esm/numerics/BandedSystem.js.map +1 -1
  453. package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
  454. package/lib/esm/numerics/ClusterableArray.js.map +1 -1
  455. package/lib/esm/numerics/Complex.js.map +1 -1
  456. package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
  457. package/lib/esm/numerics/Newton.js.map +1 -1
  458. package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
  459. package/lib/esm/numerics/PolarData.js.map +1 -1
  460. package/lib/esm/numerics/Polynomials.js.map +1 -1
  461. package/lib/esm/numerics/Quadrature.js.map +1 -1
  462. package/lib/esm/numerics/Range1dArray.js.map +1 -1
  463. package/lib/esm/numerics/SmallSystem.js.map +1 -1
  464. package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
  465. package/lib/esm/numerics/UnionFind.js.map +1 -1
  466. package/lib/esm/numerics/UsageSums.js.map +1 -1
  467. package/lib/esm/polyface/AuxData.js.map +1 -1
  468. package/lib/esm/polyface/BoxTopology.js.map +1 -1
  469. package/lib/esm/polyface/FacetFaceData.js.map +1 -1
  470. package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
  471. package/lib/esm/polyface/FacetOrientation.js.map +1 -1
  472. package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
  473. package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
  474. package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
  475. package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
  476. package/lib/esm/polyface/Polyface.js.map +1 -1
  477. package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
  478. package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
  479. package/lib/esm/polyface/PolyfaceData.js.map +1 -1
  480. package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
  481. package/lib/esm/polyface/RangeLengthData.js.map +1 -1
  482. package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
  483. package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
  484. package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
  485. package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
  486. package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
  487. package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
  488. package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
  489. package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
  490. package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
  491. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
  492. package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
  493. package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
  494. package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
  495. package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
  496. package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
  497. package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
  498. package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
  499. package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
  500. package/lib/esm/serialization/BGFBReader.js.map +1 -1
  501. package/lib/esm/serialization/BGFBWriter.js.map +1 -1
  502. package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
  503. package/lib/esm/serialization/DeepCompare.js.map +1 -1
  504. package/lib/esm/serialization/GeometrySamples.js.map +1 -1
  505. package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
  506. package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
  507. package/lib/esm/solid/Box.js.map +1 -1
  508. package/lib/esm/solid/Cone.js.map +1 -1
  509. package/lib/esm/solid/LinearSweep.js.map +1 -1
  510. package/lib/esm/solid/RotationalSweep.js.map +1 -1
  511. package/lib/esm/solid/RuledSweep.js.map +1 -1
  512. package/lib/esm/solid/SolidPrimitive.js.map +1 -1
  513. package/lib/esm/solid/Sphere.js.map +1 -1
  514. package/lib/esm/solid/SweepContour.js.map +1 -1
  515. package/lib/esm/solid/TorusPipe.js.map +1 -1
  516. package/lib/esm/topology/ChainMerge.js.map +1 -1
  517. package/lib/esm/topology/Graph.js.map +1 -1
  518. package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
  519. package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
  520. package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
  521. package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
  522. package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
  523. package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
  524. package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
  525. package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
  526. package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
  527. package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
  528. package/lib/esm/topology/MaskManager.js.map +1 -1
  529. package/lib/esm/topology/Merging.js.map +1 -1
  530. package/lib/esm/topology/RegularizeFace.js.map +1 -1
  531. package/lib/esm/topology/SignedDataSummary.js.map +1 -1
  532. package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
  533. package/lib/esm/topology/Triangulation.js.map +1 -1
  534. package/lib/esm/topology/Voronoi.js.map +1 -1
  535. package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
  536. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Arc3d.js","sourceRoot":"","sources":["../../../src/curve/Arc3d.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 Curve\r\n */\r\n\r\nimport { Clipper } from \"../clipping/ClipUtils\";\r\nimport { Constant } from \"../Constant\";\r\nimport { AxisOrder, BeJSONFunctions, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\r\nimport { Angle } from \"../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\r\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\r\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { SineCosinePolynomial, TrigPolynomial } from \"../numerics/Polynomials\";\r\nimport { SmallSystem } from \"../numerics/SmallSystem\";\r\nimport { CurveChain } from \"./CurveCollection\";\r\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\r\nimport { CurveIntervalRole, CurveLocationDetail, CurveSearchStatus } from \"./CurveLocationDetail\";\r\nimport { AnnounceNumberNumberCurvePrimitive, CurvePrimitive, TangentOptions } from \"./CurvePrimitive\";\r\nimport { GeometryQuery } from \"./GeometryQuery\";\r\nimport { CurveOffsetXYHandler } from \"./internalContexts/CurveOffsetXYHandler\";\r\nimport { EllipticalArcApproximationContext } from \"./internalContexts/EllipticalArcApproximationContext\";\r\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\r\nimport { LineSegment3d } from \"./LineSegment3d\";\r\nimport { LineString3d } from \"./LineString3d\";\r\nimport { OffsetOptions } from \"./OffsetOptions\";\r\nimport { Path } from \"./Path\";\r\nimport { StrokeOptions } from \"./StrokeOptions\";\r\n\r\n// cspell:words binormal\r\n\r\n/**\r\n * Compact vector form of an elliptic arc defined by center, vectors at 0 and 90 degrees, and angular sweep.\r\n * * @see [Curve Collections]($docs/learning/geometry/CurvePrimitive.md) learning article for further details of the\r\n * parameterization and meaning of the vectors.\r\n * @public\r\n */\r\nexport interface ArcVectors {\r\n /** Center point of arc. */\r\n center: Point3d;\r\n /** Vector from the arc center to the arc point at parameter 0 degrees. */\r\n vector0: Vector3d;\r\n /** Vector from the arc center to the arc point at parameter 90 degrees. */\r\n vector90: Vector3d;\r\n /** Angular range swept by the arc, of length less than 2*pi if not a full ellipse. */\r\n sweep: AngleSweep;\r\n}\r\n\r\n/**\r\n * Carrier structure for an arc with fractional data on incoming, outgoing curves.\r\n * @public\r\n */\r\nexport interface ArcBlendData {\r\n /** Constructed arc. */\r\n arc?: Arc3d;\r\n /** Fraction \"moving backward\" on the inbound curve. */\r\n fraction10: number;\r\n /** Fraction \"moving forward\" on the outbound curve. */\r\n fraction12: number;\r\n /** Optional reference point. */\r\n point?: Point3d;\r\n}\r\n\r\n/**\r\n * Enumeration of methods used to sample an elliptical arc in [[Arc3d.constructCircularArcChainApproximation]].\r\n * * Because ellipses have two axes of symmetry, samples are computed for one quadrant and reflected across each\r\n * axis to the other quadrants. Any samples that fall outside the arc sweep are filtered out.\r\n * @public\r\n */\r\nexport enum EllipticalArcSampleMethod {\r\n /** Generate n samples uniformly interpolated between the min and max parameters of a full ellipse quadrant. */\r\n UniformParameter = 0,\r\n /** Generate n samples uniformly interpolated between the min and max curvatures of a full ellipse quadrant. */\r\n UniformCurvature = 1,\r\n /**\r\n * Generate n samples interpolated between the min and max curvatures of a full ellipse quadrant, using a\r\n * [[FractionMapper]] callback to generate the interpolation weights.\r\n */\r\n NonUniformCurvature = 2,\r\n /**\r\n * Generate samples by subdividing parameter space until the approximation has less than a given max\r\n * distance to the elliptical arc.\r\n */\r\n AdaptiveSubdivision = 3,\r\n}\r\n\r\n/**\r\n * A function that maps [0,1]->[0,1].\r\n * @public\r\n */\r\nexport type FractionMapper = (f: number) => number;\r\n\r\n/**\r\n * Options for generating samples for the construction of an approximation to an elliptical arc.\r\n * * Used by [[Arc3d.constructCircularArcChainApproximation]].\r\n * @public\r\n */\r\nexport class EllipticalArcApproximationOptions {\r\n private _sampleMethod: EllipticalArcSampleMethod;\r\n private _numSamplesInQuadrant: number;\r\n private _maxError: number;\r\n private _remapFunction: FractionMapper;\r\n private _forcePath: boolean;\r\n\r\n /** Default error tolerance. */\r\n public static defaultMaxError = Constant.oneCentimeter;\r\n\r\n private constructor(\r\n method: EllipticalArcSampleMethod,\r\n numSamplesInQuadrant: number,\r\n maxError: number,\r\n remapFunction: FractionMapper,\r\n forcePath: boolean,\r\n ) {\r\n this._sampleMethod = method;\r\n this._numSamplesInQuadrant = numSamplesInQuadrant;\r\n this._maxError = maxError;\r\n this._remapFunction = remapFunction;\r\n this._forcePath = forcePath;\r\n }\r\n /**\r\n * Construct options with optional defaults.\r\n * @param method sample method, default [[EllipticalArcSampleMethod.AdaptiveSubdivision]].\r\n * @param numSamplesInQuadrant samples in each full quadrant for interpolation methods, default 4.\r\n * @param maxError positive maximum distance to ellipse for the subdivision method, default 1cm.\r\n * @param remapFunction optional callback to remap fraction space for [[EllipticalArcSampleMethod.NonUniformCurvature]],\r\n * default quadratic. For best results, this function should be a bijection.\r\n * @param forcePath whether to return a [[Path]] instead of a [[Loop]] when approximating a full elliptical arc,\r\n * default false.\r\n */\r\n public static create(\r\n method: EllipticalArcSampleMethod = EllipticalArcSampleMethod.AdaptiveSubdivision,\r\n numSamplesInQuadrant: number = 4,\r\n maxError: number = this.defaultMaxError,\r\n remapFunction: FractionMapper = (x: number) => x * x,\r\n forcePath: boolean = false,\r\n ) {\r\n if (numSamplesInQuadrant < 2)\r\n numSamplesInQuadrant = 2;\r\n if (maxError <= 0)\r\n maxError = this.defaultMaxError;\r\n return new EllipticalArcApproximationOptions(method, numSamplesInQuadrant, maxError, remapFunction, forcePath);\r\n }\r\n /** Clone the options. */\r\n public clone(): EllipticalArcApproximationOptions {\r\n return new EllipticalArcApproximationOptions(\r\n this.sampleMethod, this.numSamplesInQuadrant, this.maxError, this.remapFunction, this.forcePath,\r\n );\r\n }\r\n /** Method used to sample the elliptical arc. */\r\n public get sampleMethod(): EllipticalArcSampleMethod {\r\n return this._sampleMethod;\r\n }\r\n public set sampleMethod(method: EllipticalArcSampleMethod) {\r\n this._sampleMethod = method;\r\n }\r\n /**\r\n * Number of samples to return in each full quadrant, including endpoint(s).\r\n * * Used by interpolation sample methods.\r\n * * In general, for n samples, the approximating [[Path]] consists of n-1 primitives,\r\n * and the approximating [[Loop]] consists of n primitives.\r\n * * Minimum value is 2.\r\n */\r\n public get numSamplesInQuadrant(): number {\r\n return this._numSamplesInQuadrant;\r\n }\r\n public set numSamplesInQuadrant(numSamples: number) {\r\n this._numSamplesInQuadrant = numSamples;\r\n }\r\n /**\r\n * Maximum distance (in meters) of the computed approximation to the elliptical arc.\r\n * * Used by [[EllipticalArcSampleMethod.AdaptiveSubdivision]].\r\n */\r\n public get maxError(): number {\r\n return this._maxError;\r\n }\r\n public set maxError(error: number) {\r\n this._maxError = error;\r\n }\r\n /**\r\n * Callback function to remap fraction space to fraction space.\r\n * * Used by [[EllipticalArcSampleMethod.NonUniformCurvature]].\r\n */\r\n public get remapFunction(): FractionMapper {\r\n return this._remapFunction;\r\n }\r\n public set remapFunction(f: FractionMapper) {\r\n this._remapFunction = f;\r\n }\r\n /** Whether to return a [[Path]] instead of a [[Loop]] when approximating a full (closed) ellipse. */\r\n public get forcePath(): boolean {\r\n return this._forcePath;\r\n }\r\n public set forcePath(value: boolean) {\r\n this._forcePath = value;\r\n }\r\n}\r\n\r\n/**\r\n * Circular or elliptic arc.\r\n * * The angle to point equation is:\r\n * * `X = center + cos(theta) * vector0 + sin(theta) * vector90`\r\n * * The arc's `sweep` determines the range of theta values (angles). In particular:\r\n * * The point at `theta = n*360` degrees is `center + vector0` for any integer n.\r\n * * The point at `theta = 90 + n*360` degrees is `center + vector90` for any integer n.\r\n * * The arc's `sweep` _together with_ `vector0` and `vector90` determine the arc's orientation:\r\n * * If `sweep.startDegrees < sweep.endDegrees`, the arc's orientation is counterclockwise with respect to its\r\n * `perpendicularVector` (i.e., looking at the arc from the head of this vector).\r\n * * Similarly, if `sweep.startDegrees > sweep.endDegrees`, the arc's orientation is clockwise with respect to\r\n * its `perpendicularVector`.\r\n * * The arc's orientation is _always_ counterclockwise with respect to its `binormalVector`.\r\n * * When `vector0` and `vector90` are perpendicular and have equal length, the arc is circular.\r\n * * When they are non-perpendicular, the arc is always elliptic.\r\n * * When they have unequal length, the arc is always elliptic.\r\n * * To create an ellipse in standard major-minor axis form:\r\n * * `vector0` is the vector from the center to the major axis extreme.\r\n * * `vector90` is the vector from the center to the minor axis extreme.\r\n * * Note that constructing these vectors to the extreme points makes them perpendicular.\r\n * * The method [[Arc3d.toScaledMatrix3d]] can be called to convert an arc with unrestricted `vector0` and `vector90`\r\n * to an arc in standard major-minor axis form.\r\n * * The unrestricted form is much easier to work with for common calculations: stroking, projection to 2d,\r\n * intersection with plane.\r\n * @public\r\n */\r\nexport class Arc3d extends CurvePrimitive implements BeJSONFunctions {\r\n /** String name for schema properties. */\r\n public readonly curvePrimitiveType = \"arc\";\r\n /** Test if this and other are both instances of Arc3d. */\r\n public isSameGeometryClass(other: GeometryQuery): boolean {\r\n return other instanceof Arc3d;\r\n }\r\n private _center: Point3d;\r\n private _matrix: Matrix3d; // columns are [vector0, vector90, unit normal]\r\n private _sweep: AngleSweep; // sweep limits\r\n private static _workPointA = Point3d.create();\r\n private static _workPointB = Point3d.create();\r\n private static _workPointC = Point3d.create();\r\n private static _workVectorU = Vector3d.create();\r\n private static _workVectorV = Vector3d.create();\r\n private static _workVectorW = Vector3d.create();\r\n /** Read/write the center. Getter returns clone. */\r\n public get center(): Point3d {\r\n return this._center.clone();\r\n }\r\n public set center(center: XYAndZ) {\r\n this._center.setFrom(center);\r\n }\r\n /** Read property for (reference to) the arc center. */\r\n public get centerRef(): Point3d {\r\n return this._center;\r\n }\r\n /**\r\n * Read property for (clone of) the x-column of the arc matrix.\r\n * * This vector determines the point on the arc corresponding to angles n*360 degrees.\r\n */\r\n public get vector0(): Vector3d {\r\n return this._matrix.columnX();\r\n }\r\n /**\r\n * Read property for (clone of) the y-column of the arc matrix.\r\n * * This vector determines the point on the arc corresponding to angles 90 + n*360 degrees.\r\n */\r\n public get vector90(): Vector3d {\r\n return this._matrix.columnY();\r\n }\r\n /**\r\n * Compute an arc binormal vector with arbitrary length.\r\n * * The arc parameterization is counterclockwise with respect to this vector.\r\n * * This vector is parallel to [[perpendicularVector]] and possibly opposite.\r\n */\r\n public binormalVector(result?: Vector3d): Vector3d {\r\n const plane = this.fractionToPointAnd2Derivatives(0.0);\r\n return plane.vectorU.crossProduct(plane.vectorV, result);\r\n }\r\n /**\r\n * Read property for (clone of) the z-column of the arc matrix.\r\n * * This vector is nominally the normalized cross product: `vector0 x vector90`.\r\n * * To compute a vector with respect to which the arc sweep is counterclockwise, use [[binormalVector]].\r\n */\r\n public get perpendicularVector(): Vector3d {\r\n return this._matrix.columnZ();\r\n }\r\n /** Return a clone of the arc matrix. */\r\n public matrixClone(): Matrix3d {\r\n return this._matrix.clone();\r\n }\r\n /** Read property for (reference to) the arc matrix. */\r\n public get matrixRef(): Matrix3d {\r\n return this._matrix;\r\n }\r\n /** Read/write the sweep. Getter returns reference. */\r\n public get sweep(): AngleSweep {\r\n return this._sweep;\r\n }\r\n public set sweep(value: AngleSweep) {\r\n this._sweep.setFrom(value);\r\n }\r\n /** An Arc3d extends along its complete elliptic arc. */\r\n public override get isExtensibleFractionSpace(): boolean {\r\n return true;\r\n }\r\n /** Constructor. Captures the inputs. */\r\n private constructor(center: Point3d, matrix: Matrix3d, sweep: AngleSweep) {\r\n super();\r\n this._center = center;\r\n this._matrix = matrix;\r\n this._sweep = sweep.clampToFullCircle(sweep);\r\n }\r\n /** Return a clone of the arc, with transform applied. */\r\n public cloneTransformed(transform: Transform): Arc3d { // we know tryTransformInPlace succeeds.\r\n const c = this.clone();\r\n c.tryTransformInPlace(transform);\r\n return c;\r\n }\r\n /**\r\n * Redefine the arc with (captured references to) given data.\r\n * @param center arc center.\r\n * @param matrix matrix with columns vector0, vector90, and their unit cross product.\r\n * @param sweep angle sweep.\r\n */\r\n public setRefs(center: Point3d, matrix: Matrix3d, sweep: AngleSweep) {\r\n this._center = center;\r\n this._matrix = matrix;\r\n sweep.clampToFullCircle(this._sweep);\r\n }\r\n /**\r\n * Redefine the arc with (copies of) the given data.\r\n * * Even if an input is omitted, the corresponding instance data is set to the default value.\r\n * * For example, all default inputs result in a unit circle centered at the origin in the xy-plane.\r\n * @param center arc center. Default is zero.\r\n * @param matrix matrix with columns vector0, vector90, and their unit cross product. Default is identity.\r\n * @param sweep angle sweep. Default is full sweep.\r\n * @returns the instance\r\n */\r\n public set(center?: Point3d, matrix?: Matrix3d, sweep?: AngleSweep): Arc3d {\r\n if (center)\r\n this._center.setFrom(center);\r\n else\r\n this._center.setZero();\r\n if (matrix)\r\n this._matrix.setFrom(matrix);\r\n else\r\n this._matrix.setIdentity();\r\n if (sweep)\r\n sweep.clampToFullCircle(this._sweep);\r\n else\r\n AngleSweep.create360(0, this._sweep);\r\n return this;\r\n }\r\n /** Copy center, matrix, and sweep from other Arc3d. */\r\n public setFrom(other: Arc3d) {\r\n this._center.setFrom(other._center);\r\n this._matrix.setFrom(other._matrix);\r\n this._sweep.setFrom(other._sweep);\r\n }\r\n /** Return a clone of this arc. */\r\n public clone(): Arc3d {\r\n return new Arc3d(this._center.clone(), this._matrix.clone(), this._sweep.clone());\r\n }\r\n /**\r\n * Create an arc, capturing references to center, matrix and sweep.\r\n * * Default inputs construct a unit circle centered at the origin in the xy-plane.\r\n * @param center center point. Default is zero.\r\n * @param matrix matrix with columns vector0, vector90, and their unit cross product. Default is identity.\r\n * @param sweep sweep limits. Default is full sweep.\r\n * @param result optional preallocated result to receive copies of the inputs (or default values) and return.\r\n */\r\n public static createRefs(center?: Point3d, matrix?: Matrix3d, sweep?: AngleSweep, result?: Arc3d): Arc3d {\r\n if (result)\r\n return result.set(center, matrix, sweep);\r\n return new Arc3d(center ?? Point3d.createZero(), matrix ?? Matrix3d.createIdentity(), sweep ?? AngleSweep.create360());\r\n }\r\n /**\r\n * Create an arc from center, x column to be scaled, and y column to be scaled.\r\n * @param center center of ellipse.\r\n * @param matrix the x-column and y-column of this matrix are scaled by `radius0` and `radius90` to define the\r\n * arc's `vector0` and `vector90`.\r\n * @param radius0 radius along `vector0`.\r\n * @param radius90 radius along `vector90`.\r\n * @param sweep sweep limits.\r\n * @param result optional preallocated result.\r\n */\r\n public static createScaledXYColumns(\r\n center: Point3d | undefined, matrix: Matrix3d, radius0: number, radius90: number, sweep?: AngleSweep, result?: Arc3d,\r\n ): Arc3d {\r\n const vector0 = matrix.columnX();\r\n const vector90 = matrix.columnY();\r\n return Arc3d.create(center, vector0.scale(radius0, vector0), vector90.scale(radius90, vector90), sweep, result);\r\n }\r\n /**\r\n * Create a full circle from center, normal and radius.\r\n * @param center center of circle. If undefined, use 000.\r\n * @param normal normal vector.\r\n * @param radius radius of the circle.\r\n * @param result optional preallocated result.\r\n */\r\n public static createCenterNormalRadius(\r\n center: Point3d | undefined, normal: Vector3d, radius: number, result?: Arc3d,\r\n ): Arc3d {\r\n const frame = Matrix3d.createRigidHeadsUp(normal);\r\n return Arc3d.createScaledXYColumns(center, frame, radius, radius, undefined, result);\r\n }\r\n /**\r\n * Create an elliptical arc by center with vectors to points at 0 and 90 degrees in parameter space.\r\n * @param center arc center.\r\n * @param vector0 vector to 0 degrees (commonly major axis).\r\n * @param vector90 vector to 90 degree point (commonly minor axis).\r\n * @param sweep sweep limits; defaults to full sweep.\r\n * @param result optional preallocated result.\r\n */\r\n public static create(\r\n center: Point3d | undefined, vector0: Vector3d, vector90: Vector3d, sweep?: AngleSweep, result?: Arc3d,\r\n ): Arc3d {\r\n const normal = vector0.unitCrossProductWithDefault(vector90, 0, 0, 0); // normal will be 000 for degenerate case\r\n const matrix = Matrix3d.createColumns(vector0, vector90, normal, result?._matrix);\r\n if (result)\r\n return result.set(center, matrix, sweep);\r\n return this.createRefs(center?.clone(), matrix, sweep?.clone());\r\n }\r\n /**\r\n * Create an elliptical arc from three points on the ellipse: two points on an axis and one in between.\r\n * @param start start of arc, on an axis.\r\n * @param middle point on arc somewhere between `start` and `end`.\r\n * @param end point on arc directly opposite `start`.\r\n * @param sweep angular sweep, measured from `start` in the direction of `middle`.\r\n * For a half-ellipse from `start` to `end` passing through `middle`, pass `AngleSweep.createStartEndDegrees(0,180)`.\r\n * Default value is full sweep to create the entire ellipse.\r\n * @param result optional preallocated result.\r\n * @returns elliptical arc, or undefined if construction impossible.\r\n */\r\n public static createStartMiddleEnd(\r\n start: XYAndZ, middle: XYAndZ, end: XYAndZ, sweep?: AngleSweep, result?: Arc3d,\r\n ): Arc3d | undefined {\r\n const center = Point3d.createAdd2Scaled(start, 0.5, end, 0.5);\r\n const vector0 = Vector3d.createStartEnd(center, start);\r\n const vector1 = Vector3d.createStartEnd(center, middle);\r\n const v0DotV1 = vector0.dotProduct(vector1);\r\n const v0Len2 = vector0.magnitudeSquared();\r\n if (Math.abs(v0DotV1) >= v0Len2)\r\n return undefined; // middle point projects to end of axis or beyond (rules out negative under the radical below)\r\n const normal = vector0.crossProduct(vector1);\r\n const vector90 = normal.unitCrossProductWithDefault(vector0, 0, 0, 0);\r\n const v1DotV90 = vector1.dotProduct(vector90);\r\n // solve the standard ellipse equation for the unknown axis length, given local coords of middle (v0.v1/||v0||, v90.v1)\r\n const v90Len = Geometry.safeDivideFraction(v0Len2 * v1DotV90, Math.sqrt(v0Len2 * v0Len2 - v0DotV1 * v0DotV1), 0);\r\n if (Geometry.isSmallMetricDistanceSquared(v90Len)) // tighter than smallMetricDistance to allow flatter long elliptical arcs\r\n return undefined;\r\n vector90.scaleInPlace(v90Len);\r\n return Arc3d.create(center, vector0, vector90, sweep, result);\r\n }\r\n /**\r\n * Create a circular arc defined by start point, tangent at start point, and end point.\r\n * * The circular arc is swept from `start` to `end` in the direction of `tangentAtStart`.\r\n * * If `tangentAtStart` is parallel to the line segment from `start` to `end`, return the line segment.\r\n */\r\n public static createCircularStartTangentEnd(\r\n start: Point3d, tangentAtStart: Vector3d, end: Point3d, result?: Arc3d,\r\n ): Arc3d | LineSegment3d {\r\n // see itwinjs-core\\core\\geometry\\internaldocs\\Arc3d.md to clarify below algorithm\r\n const startToEnd = Vector3d.createStartEnd(start, end);\r\n const frame = Matrix3d.createRigidFromColumns(tangentAtStart, startToEnd, AxisOrder.XYZ);\r\n if (frame !== undefined) {\r\n const vv = startToEnd.dotProduct(startToEnd);\r\n const vw = frame.dotColumnY(startToEnd);\r\n const radius = Geometry.conditionalDivideCoordinate(vv, 2 * vw);\r\n if (radius !== undefined) {\r\n const vector0 = frame.columnY();\r\n vector0.scaleInPlace(-radius); // center to start\r\n const vector90 = frame.columnX();\r\n vector90.scaleInPlace(radius);\r\n const centerToEnd = vector0.plus(startToEnd);\r\n const sweepAngle = vector0.angleTo(centerToEnd);\r\n let sweepRadians = sweepAngle.radians; // always positive and less than PI\r\n if (tangentAtStart.dotProduct(centerToEnd) < 0.0) // sweepRadians is the wrong way\r\n sweepRadians = 2.0 * Math.PI - sweepRadians;\r\n const center = start.plusScaled(vector0, -1.0);\r\n const sweep = AngleSweep.createStartEndRadians(0.0, sweepRadians);\r\n return Arc3d.create(center, vector0, vector90, sweep, result);\r\n }\r\n }\r\n return LineSegment3d.create(start, end);\r\n }\r\n /**\r\n * Create a circular arc from start point, tangent at start, radius, optional plane normal, arc sweep.\r\n * * The vector from start point to center is in the direction of upVector crossed with tangentA.\r\n * @param start start point.\r\n * @param tangentAtStart vector in tangent direction at the start.\r\n * @param radius signed radius.\r\n * @param upVector optional out-of-plane vector. Defaults to positive Z.\r\n * @param sweep angular range. If single `Angle` is given, start angle is at 0 degrees (the start point).\r\n */\r\n public static createCircularStartTangentRadius(\r\n start: Point3d, tangentAtStart: Vector3d, radius: number, upVector?: Vector3d, sweep?: Angle | AngleSweep,\r\n ): Arc3d | undefined {\r\n if (upVector === undefined)\r\n upVector = Vector3d.unitZ();\r\n const vector0 = upVector.unitCrossProduct(tangentAtStart);\r\n if (vector0 === undefined)\r\n return undefined;\r\n const center = start.plusScaled(vector0, radius);\r\n // reverse the A-to-center vector and bring it up to scale\r\n vector0.scaleInPlace(-radius);\r\n const vector90 = tangentAtStart.scaleToLength(Math.abs(radius))!; // cannot fail; prior unitCrossProduct would have failed first\r\n return Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\r\n }\r\n /**\r\n * Create a circular arc defined by start and end points and radius.\r\n * @param start start point of the arc.\r\n * @param end end point of the arc.\r\n * @param helper a third point near the arc in its plane, or a vector in the direction of the arc normal.\r\n * @param result optional preallocated result to populate and return.\r\n * @returns the constructed arc, or undefined if desired arc cannot be constructed.\r\n */\r\n public static createCircularStartEndRadius(start: Point3d, end: Point3d, radius: number, helper: Point3d | Vector3d, result?: Arc3d): Arc3d | undefined {\r\n // Construct a line segment from start to end. It is a chord of the circle,\r\n // so the circle center is on its perpendicular bisector.\r\n const semiChordLen2 = 0.25 * start.distanceSquared(end);\r\n const radius2 = radius * radius;\r\n if (radius2 < semiChordLen2)\r\n return undefined;\r\n const height = Math.sqrt(radius2 - semiChordLen2); // Pythagoras gives us distance from chord to center\r\n const normal = Vector3d.createZero(this._workVectorU);\r\n const vecToCenter = Vector3d.createZero(this._workVectorV);\r\n // the helper gives us the circle normal\r\n if (helper instanceof Point3d)\r\n start.crossProductToPoints(helper, end, normal);\r\n else\r\n normal.setFrom(helper);\r\n // the normal and chord direction give us the side of the chord on which the center resides\r\n if (!normal.normalizeInPlace() || !normal.crossProductStartEnd(start, end, vecToCenter).scaleToLength(height, vecToCenter))\r\n return undefined;\r\n const center = Point3d.createZero(result?.centerRef);\r\n start.interpolate(0.5, end, center).addInPlace(vecToCenter);\r\n const vector0 = Vector3d.createStartEnd(center, start, this._workVectorW);\r\n const endVector = Vector3d.createStartEnd(center, end, this._workVectorV); // reuse static\r\n const sweep = AngleSweep.createStartEndRadians(0, vector0.signedRadiansTo(endVector, normal), result?.sweep);\r\n const vector90 = normal.crossProduct(vector0, this._workVectorV); // has length radius (reuse static)\r\n const matrix = Matrix3d.createColumns(vector0, vector90, normal, result?.matrixRef);\r\n return this.createRefs(center, matrix, sweep, result);\r\n }\r\n\r\n /**\r\n * Return a clone of this arc, projected to given z value.\r\n * * If `z` is omitted, the clone is at the z of the center.\r\n * * This function projects the arc into a plane parallel to xy-plane.\r\n * * Note that projection to fixed z can change circle into ellipse (and (rarely) ellipse to circle).\r\n */\r\n public cloneAtZ(z?: number): Arc3d {\r\n if (z === undefined)\r\n z = this._center.z;\r\n return Arc3d.createXYZXYZXYZ(\r\n this._center.x, this._center.y, z,\r\n this._matrix.coffs[0], this._matrix.coffs[3], 0,\r\n this._matrix.coffs[1], this._matrix.coffs[4], 0,\r\n this._sweep,\r\n );\r\n }\r\n /**\r\n * Create an arc by center (cx,cy,xz) with vectors (ux,uy,uz) and (vx,vy,vz) to points at 0 and 90 degrees in\r\n * parameter space.\r\n * @param result optional preallocated result.\r\n */\r\n public static createXYZXYZXYZ(\r\n cx: number, cy: number, cz: number,\r\n ux: number, uy: number, uz: number,\r\n vx: number, vy: number, vz: number,\r\n sweep?: AngleSweep, result?: Arc3d,\r\n ): Arc3d {\r\n return Arc3d.create(\r\n Point3d.create(cx, cy, cz), Vector3d.create(ux, uy, uz), Vector3d.create(vx, vy, vz), sweep, result,\r\n );\r\n }\r\n /**\r\n * Return a quick estimate of the eccentricity of the ellipse.\r\n * * The estimator is the cross magnitude of the product of vectors U and V, divided by square of the larger magnitude\r\n * * for typical Arc3d with perpendicular UV, this is exactly the small axis divided by large.\r\n * * note that the eccentricity is AT MOST ONE.\r\n */\r\n public quickEccentricity(): number {\r\n const magX = this._matrix.columnXMagnitude();\r\n const magY = this._matrix.columnYMagnitude();\r\n const jacobian = this._matrix.columnXYCrossProductMagnitude();\r\n const largeAxis = Geometry.maxXY(magX, magY);\r\n return jacobian / (largeAxis * largeAxis);\r\n }\r\n /**\r\n * Create a circular arc defined by start point, any intermediate point, and end point.\r\n * If the points are colinear, assemble them into a linestring.\r\n */\r\n public static createCircularStartMiddleEnd(\r\n pointA: XYAndZ, pointB: XYAndZ, pointC: XYAndZ, result?: Arc3d,\r\n ): Arc3d | LineString3d {\r\n const vectorAB = Vector3d.createStartEnd(pointA, pointB);\r\n const vectorAC = Vector3d.createStartEnd(pointA, pointC);\r\n const ab2 = vectorAB.magnitudeSquared();\r\n const ac2 = vectorAC.magnitudeSquared();\r\n const normal = vectorAB.sizedCrossProduct(vectorAC, Math.sqrt(Math.sqrt(ab2 * ac2)));\r\n if (normal) {\r\n const vectorToCenter = SmallSystem.linearSystem3d(\r\n normal.x, normal.y, normal.z,\r\n vectorAB.x, vectorAB.y, vectorAB.z,\r\n vectorAC.x, vectorAC.y, vectorAC.z,\r\n 0, // vectorToCenter DOT normal = 0 (ensure normal is perp to the plane of the 3 points)\r\n 0.5 * ab2, // vectorToCenter DOT vectorAB = ab2 / 2 (ensure the projection of vectorToCenter on AB bisects AB)\r\n 0.5 * ac2, // vectorToCenter DOT vectorAC = ac2 / 2 (ensure the projection of vectorToCenter on AC bisects AC)\r\n );\r\n if (vectorToCenter) { // i.e., the negative of vectorX\r\n const center = Point3d.create(pointA.x, pointA.y, pointA.z).plus(vectorToCenter);\r\n const vectorX = Vector3d.createStartEnd(center, pointA);\r\n const vectorY = Vector3d.createRotateVectorAroundVector(vectorX, normal, Angle.createDegrees(90));\r\n if (vectorY) {\r\n const vectorCenterToC = Vector3d.createStartEnd(center, pointC);\r\n const sweepAngle = vectorX.signedAngleTo(vectorCenterToC, normal);\r\n if (sweepAngle.radians < 0.0)\r\n sweepAngle.addMultipleOf2PiInPlace(1.0);\r\n return Arc3d.create(\r\n center, vectorX, vectorY, AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result,\r\n );\r\n }\r\n }\r\n }\r\n return LineString3d.create(pointA, pointB, pointC);\r\n }\r\n /** The arc has simple proportional arc length if and only if it is a circular arc. */\r\n public override getFractionToDistanceScale(): number | undefined {\r\n const radius = this.circularRadius();\r\n if (radius !== undefined)\r\n return Math.abs(radius * this._sweep.sweepRadians);\r\n return undefined;\r\n }\r\n /**\r\n * Convert a fractional position to xyz coordinates.\r\n * @param fraction fractional position on arc.\r\n * @param result optional preallocated result.\r\n */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n const radians = this._sweep.fractionToRadians(fraction);\r\n return this._matrix.originPlusMatrixTimesXY(this._center, Math.cos(radians), Math.sin(radians), result);\r\n }\r\n /**\r\n * Convert fractional arc and radial positions to xyz coordinates.\r\n * @param fraction fractional position on arc.\r\n * @param result optional preallocated result.\r\n */\r\n public fractionAndRadialFractionToPoint(arcFraction: number, radialFraction: number, result?: Point3d): Point3d {\r\n const radians = this._sweep.fractionToRadians(arcFraction);\r\n return this._matrix.originPlusMatrixTimesXY(\r\n this._center, radialFraction * Math.cos(radians), radialFraction * Math.sin(radians), result,\r\n );\r\n }\r\n /**\r\n * Convert a fractional position to xyz coordinates and derivative with respect to fraction.\r\n * @param fraction fractional position on arc.\r\n * @param result optional preallocated result.\r\n */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n result = this.radiansToPointAndDerivative(this._sweep.fractionToRadians(fraction), result);\r\n result.direction.scaleInPlace(this._sweep.sweepRadians);\r\n return result;\r\n }\r\n /**\r\n * Construct a plane with\r\n * * origin at the fractional position along the arc.\r\n * * x axis is the first derivative, i.e. tangent along the arc.\r\n * * y axis is the second derivative, i.e. in the plane and on the center side of the tangent.\r\n * If the arc is circular, the second derivative is directly towards the center.\r\n */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const radians = this._sweep.fractionToRadians(fraction);\r\n if (!result)\r\n result = Plane3dByOriginAndVectors.createXYPlane();\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\r\n const a = this._sweep.sweepRadians;\r\n this._matrix.multiplyXY(-a * s, a * c, result.vectorU);\r\n const aa = a * a;\r\n this._matrix.multiplyXY(-aa * c, -aa * s, result.vectorV);\r\n return result;\r\n }\r\n /**\r\n * Evaluate the point and derivative with respect to the angle (in radians).\r\n * @param radians angular position.\r\n * @param result optional preallocated ray.\r\n */\r\n public radiansToPointAndDerivative(radians: number, result?: Ray3d): Ray3d {\r\n result = result ? result : Ray3d.createZero();\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\r\n this._matrix.multiplyXY(-s, c, result.direction);\r\n return result;\r\n }\r\n /**\r\n * Evaluate the point with respect to the angle (in radians).\r\n * @param radians angular position.\r\n * @param result optional preallocated ray.\r\n */\r\n public radiansToPoint(radians: number, result?: Point3d): Point3d {\r\n result = result ? result : Point3d.create();\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result);\r\n return result;\r\n }\r\n /**\r\n * Return a parametric plane with\r\n * * origin at arc center.\r\n * * vectorU from center to arc at angle (in radians).\r\n * * vectorV from center to arc at 90 degrees past the angle.\r\n * @param radians angular position.\r\n * @param result optional preallocated plane.\r\n */\r\n public radiansToRotatedBasis(radians: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n result = result ? result : Plane3dByOriginAndVectors.createXYPlane();\r\n const c = Math.cos(radians);\r\n const s = Math.sin(radians);\r\n result.origin.setFromPoint3d(this.center);\r\n this._matrix.multiplyXY(c, s, result.vectorU);\r\n this._matrix.multiplyXY(-s, c, result.vectorV);\r\n return result;\r\n }\r\n /**\r\n * Evaluate the point and derivative with respect to the angle (in radians).\r\n * @param theta angular position.\r\n * @param result optional preallocated ray.\r\n */\r\n public angleToPointAndDerivative(theta: Angle, result?: Ray3d): Ray3d {\r\n result = result ? result : Ray3d.createZero();\r\n const c = theta.cos();\r\n const s = theta.sin();\r\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\r\n this._matrix.multiplyXY(-s, c, result.direction);\r\n return result;\r\n }\r\n /**\r\n * Return the start point of the arc.\r\n * @param result optional preallocated result.\r\n */\r\n public override startPoint(result?: Point3d): Point3d {\r\n return this.fractionToPoint(0.0, result);\r\n }\r\n /**\r\n * Return the end point of the arc.\r\n * @param result optional preallocated result.\r\n */\r\n public override endPoint(result?: Point3d): Point3d {\r\n return this.fractionToPoint(1.0, result);\r\n }\r\n /** * If this is a circular arc, return the simple length derived from radius and sweep.\r\n * * Otherwise (i.e. if this elliptical) fall through to CurvePrimitive base implementation which\r\n * Uses quadrature.\r\n */\r\n public override curveLength(): number {\r\n return this.curveLengthBetweenFractions(0, 1);\r\n }\r\n /**\r\n * Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep).\r\n * @deprecated in 5.0 - will not be removed until after 2026-06-13. Use correct spelling quadratureGaussCount.\r\n */\r\n public static readonly quadratureGuassCount = 5;\r\n /** Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep). */\r\n public static readonly quadratureGaussCount = 5;\r\n /** In quadrature for arc length, use this interval (divided by quickEccentricity). */\r\n public static readonly quadratureIntervalAngleDegrees = 10.0;\r\n /**\r\n * * If this is a circular arc, return the simple length derived from radius and sweep.\r\n * * Otherwise (i.e. if this elliptical) fall through CurvePrimitive integrator.\r\n */\r\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\r\n const simpleLength = this.getFractionToDistanceScale();\r\n if (simpleLength !== undefined)\r\n return simpleLength * Math.abs(fraction1 - fraction0);\r\n // fall through for true ellipse . .. stroke and accumulate quadrature with typical count . ..\r\n let f0 = fraction0;\r\n let f1 = fraction1;\r\n if (fraction0 > fraction1) {\r\n f0 = fraction1;\r\n f1 = fraction0;\r\n }\r\n const sweepDegrees = (f1 - f0) * this._sweep.sweepDegrees;\r\n let eccentricity = this.quickEccentricity();\r\n if (eccentricity < 0.00001)\r\n eccentricity = 0.00001;\r\n let numInterval = Math.ceil(sweepDegrees / (eccentricity * Arc3d.quadratureIntervalAngleDegrees));\r\n if (numInterval > 400)\r\n numInterval = 400;\r\n if (numInterval < 1)\r\n numInterval = 1;\r\n return super.curveLengthWithFixedIntervalCountQuadrature(f0, f1, numInterval, Arc3d.quadratureGaussCount);\r\n }\r\n /**\r\n * Return an approximate (but easy to compute) arc length.\r\n * The estimate is:\r\n * * Form 8 chords on full circle, proportionally fewer for partials (but 2 extras if less than half circle).\r\n * * Sum the chord lengths.\r\n * * For a circle, we know this crude approximation has to be increased by a factor (theta/(2*sin(theta/2))).\r\n * * Apply that factor.\r\n * * Experiments confirm that this is within 3 percent for a variety of eccentricities and arc sweeps.\r\n */\r\n public quickLength(): number {\r\n const totalSweep = Math.abs(this._sweep.sweepRadians);\r\n let numInterval = Math.ceil(4 * totalSweep / Math.PI);\r\n if (numInterval < 1)\r\n numInterval = 1;\r\n if (numInterval < 4)\r\n numInterval += 3;\r\n else if (numInterval < 6)\r\n numInterval += 2; // force extras for short arcs\r\n const pointA = Arc3d._workPointA;\r\n const pointB = Arc3d._workPointB;\r\n let chordSum = 0.0;\r\n this.fractionToPoint(0.0, pointA);\r\n for (let i = 1; i <= numInterval; i++) {\r\n this.fractionToPoint(i / numInterval, pointB);\r\n chordSum += pointA.distance(pointB);\r\n pointA.setFromPoint3d(pointB);\r\n }\r\n // The chord sum is always shorter.\r\n // if it is a true circular arc, the ratio of correct over sum is easy ...\r\n const dTheta = totalSweep / numInterval;\r\n const factor = dTheta / (2.0 * Math.sin(0.5 * dTheta));\r\n return chordSum * factor;\r\n }\r\n /**\r\n * * See extended comments on `CurvePrimitive.moveSignedDistanceFromFraction`.\r\n * * A zero length line generates `CurveSearchStatus.error`.\r\n * * Nonzero length line generates `CurveSearchStatus.success` or `CurveSearchStatus.stoppedAtBoundary`.\r\n */\r\n public override moveSignedDistanceFromFraction(\r\n startFraction: number, signedDistance: number, allowExtension: false, result?: CurveLocationDetail,\r\n ): CurveLocationDetail {\r\n if (!this.isCircular) // suppress extension !!!\r\n return super.moveSignedDistanceFromFractionGeneric(startFraction, signedDistance, allowExtension, result);\r\n const totalLength = this.curveLength();\r\n const signedFractionMove = Geometry.conditionalDivideFraction(signedDistance, totalLength);\r\n if (signedFractionMove === undefined) {\r\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\r\n this, startFraction, this.fractionToPoint(startFraction), 0.0, CurveSearchStatus.error);\r\n }\r\n return CurveLocationDetail.createConditionalMoveSignedDistance(\r\n allowExtension,\r\n this,\r\n startFraction,\r\n startFraction + signedFractionMove,\r\n signedDistance,\r\n result);\r\n }\r\n /**\r\n * Return all radian angles where the ellipse tangent is perpendicular to the vector to a spacePoint.\r\n * @param spacePoint point of origin of vectors to the ellipse.\r\n * @param _extend always true. Sweep is ignored: perpendiculars for the full ellipse are returned.\r\n * @param endpoints if true, force the end radians into the result.\r\n */\r\n public allPerpendicularAngles(spacePoint: Point3d, _extend: boolean = true, endpoints: boolean = false): number[] {\r\n const radians: number[] = [];\r\n const vectorQ = spacePoint.vectorTo(this.center);\r\n const uu = this._matrix.columnXMagnitudeSquared();\r\n const uv = this._matrix.columnXDotColumnY();\r\n const vv = this._matrix.columnYMagnitudeSquared();\r\n TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\r\n uv,\r\n vv - uu,\r\n -uv,\r\n this._matrix.dotColumnY(vectorQ),\r\n -this._matrix.dotColumnX(vectorQ),\r\n 0.0,\r\n radians,\r\n );\r\n if (endpoints) {\r\n radians.push(this.sweep.startRadians);\r\n radians.push(this.sweep.endRadians);\r\n }\r\n return radians;\r\n }\r\n /**\r\n * Return details of the closest point on the arc, optionally extending to full ellipse.\r\n * @param spacePoint search for point closest to this point.\r\n * @param extend if true, consider projections to the complete ellipse. If false, consider only endpoints and\r\n * projections within the arc sweep.\r\n * @param result optional preallocated result.\r\n */\r\n public override closestPoint(\r\n spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail,\r\n ): CurveLocationDetail {\r\n result = CurveLocationDetail.create(this, result);\r\n const allRadians = this.allPerpendicularAngles(spacePoint, true, true);\r\n let extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);\r\n let extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);\r\n // distinct extends for cyclic space are awkward ....\r\n if (this._sweep.isFullCircle) {\r\n extend0 = CurveExtendMode.None;\r\n extend1 = CurveExtendMode.None;\r\n }\r\n if (extend0 !== CurveExtendMode.None && extend1 !== CurveExtendMode.None) {\r\n allRadians.push(this._sweep.startRadians);\r\n allRadians.push(this._sweep.endRadians);\r\n }\r\n // hm... logically there must at least two angles there ... but if it happens return the start point ...\r\n const workRay = Ray3d.createZero();\r\n if (allRadians.length === 0) {\r\n result.setFR(0.0, this.radiansToPointAndDerivative(this._sweep.startRadians, workRay));\r\n result.a = spacePoint.distance(result.point);\r\n } else {\r\n let dMin = Number.MAX_VALUE;\r\n let d = 0;\r\n for (const radians of allRadians) {\r\n const fraction = CurveExtendOptions.resolveRadiansToSweepFraction(extend, radians, this.sweep);\r\n if (fraction !== undefined) {\r\n this.fractionToPointAndDerivative(fraction, workRay);\r\n\r\n d = spacePoint.distance(workRay.origin);\r\n if (d < dMin) {\r\n dMin = d;\r\n result.setFR(fraction, workRay);\r\n result.a = d;\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n /** Override of [[CurvePrimitive.emitTangents]] for Arc3d. */\r\n public override emitTangents(\r\n spacePoint: Point3d, announceTangent: (tangent: CurveLocationDetail) => any, options?: TangentOptions,\r\n ): void {\r\n const centerToPoint = Vector3d.createStartEnd(this.centerRef, spacePoint);\r\n let centerToLocalPoint: Vector3d | undefined;\r\n if (options?.vectorToEye) {\r\n const arcToView = Matrix3d.createColumns(this.matrixRef.getColumn(0), this.matrixRef.getColumn(1), options.vectorToEye);\r\n centerToLocalPoint = arcToView.multiplyInverse(centerToPoint);\r\n } else {\r\n centerToLocalPoint = this.matrixRef.multiplyInverse(centerToPoint)!;\r\n }\r\n if (centerToLocalPoint === undefined)\r\n return;\r\n // centerToLocalPoint is a vector in the local coordinate system of the as-viewed arc.\r\n // In other words, the local arc is the unit circle.\r\n // alpha is the angle from the local x-axis to centerToLocalPoint.\r\n // beta is the nonnegative angle from centerToLocalPoint to a tangency radial.\r\n // Tangency angles are preserved by local <-> world transformation.\r\n if (centerToLocalPoint !== undefined) {\r\n const hypotenuseSquared = centerToLocalPoint.magnitudeSquaredXY();\r\n if (hypotenuseSquared >= 1.0) { // localPoint lies outside or on the unit circle...\r\n // ...and forms a right triangle with unit radial leg to tangent point\r\n const distanceToTangency = Math.sqrt(hypotenuseSquared - 1.0);\r\n const alpha = Math.atan2(centerToLocalPoint.y, centerToLocalPoint.x);\r\n const beta = Math.atan2(distanceToTangency, 1);\r\n const angles = Geometry.isSmallAngleRadians(beta) ? [alpha] : [alpha + beta, alpha - beta];\r\n for (const theta of angles) {\r\n const f = CurveExtendOptions.resolveRadiansToValidSweepFraction(options?.extend ?? false, theta, this.sweep);\r\n if (f.isValid) {\r\n const tangent = CurveLocationDetail.createCurveFractionPoint(this, f.fraction, this.fractionToPoint(f.fraction));\r\n announceTangent(tangent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /** Reverse the sweep of the arc. */\r\n public reverseInPlace(): void {\r\n this._sweep.reverseInPlace();\r\n }\r\n /**\r\n * Apply a transform to the arc basis vectors.\r\n * * nonuniform (i.e. skewing) transforms are allowed.\r\n * * The transformed vector0 and vector90 are NOT squared up as major minor axes (this is a good feature).\r\n */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n this._center = transform.multiplyPoint3d(this._center, this._center);\r\n this._matrix = transform.matrix.multiplyMatrixMatrix(this._matrix, this._matrix);\r\n // force re-normalization of columnZ.\r\n this.setVector0Vector90(this._matrix.columnX(), this._matrix.columnY());\r\n return true;\r\n }\r\n /** Return true if the ellipse center and basis vectors are in the plane. */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n const normal = plane.getNormalRef();\r\n // The ellipse vectors are full-length -- true distance comparisons say things.\r\n return Geometry.isSmallMetricDistance(plane.altitude(this._center))\r\n && Geometry.isSmallMetricDistance(this._matrix.dotColumnX(normal))\r\n && Geometry.isSmallMetricDistance(this._matrix.dotColumnY(normal));\r\n }\r\n /** Return true if the vector0 and vector90 are of equal length and perpendicular. */\r\n public get isCircular(): boolean {\r\n const axx = this._matrix.columnXMagnitudeSquared();\r\n const ayy = this._matrix.columnYMagnitudeSquared();\r\n const axy = this._matrix.columnXDotColumnY();\r\n return Angle.isPerpendicularDotSet(axx, ayy, axy) && Geometry.isSameCoordinateSquared(axx, ayy);\r\n }\r\n /** Return radius if the vector0 and vector90 are of equal length and perpendicular. Ignores z. */\r\n public circularRadiusXY(): number | undefined {\r\n const ux = this._matrix.at(0, 0);\r\n const uy = this._matrix.at(1, 0);\r\n const vx = this._matrix.at(0, 1);\r\n const vy = this._matrix.at(1, 1);\r\n const dotUU = Geometry.dotProductXYXY(ux, uy, ux, uy);\r\n const dotVV = Geometry.dotProductXYXY(vx, vy, vx, vy);\r\n const dotUV = Geometry.dotProductXYXY(ux, uy, vx, vy);\r\n if (Angle.isPerpendicularDotSet(dotUU, dotVV, dotUV) && Geometry.isSameCoordinateSquared(dotUU, dotVV))\r\n return Geometry.hypotenuseXY(ux, uy);\r\n return undefined;\r\n }\r\n /** If the arc is circular, return its radius. Otherwise return undefined. */\r\n public circularRadius(): number | undefined {\r\n return this.isCircular ? this._matrix.columnXMagnitude() : undefined;\r\n }\r\n\r\n /** Return the larger length of the two defining vectors. */\r\n public maxVectorLength(): number {\r\n return Math.max(this._matrix.columnXMagnitude(), this._matrix.columnYMagnitude());\r\n }\r\n /**\r\n * Compute intersections with a plane.\r\n * @param plane plane to intersect.\r\n * @param result array of locations on the curve.\r\n */\r\n public override appendPlaneIntersectionPoints(plane: PlaneAltitudeEvaluator, result: CurveLocationDetail[]): number {\r\n const constCoff = plane.altitude(this._center);\r\n const coffs = this._matrix.coffs;\r\n const cosCoff = plane.velocityXYZ(coffs[0], coffs[3], coffs[6]);\r\n const sinCoff = plane.velocityXYZ(coffs[1], coffs[4], coffs[7]);\r\n const trigPoints = Geometry.solveTrigForm(constCoff, cosCoff, sinCoff);\r\n let numIntersection = 0;\r\n if (trigPoints !== undefined) {\r\n numIntersection = trigPoints.length;\r\n let xy;\r\n for (xy of trigPoints) {\r\n const radians = Math.atan2(xy.y, xy.x);\r\n const fraction = this._sweep.radiansToPositivePeriodicFraction(radians);\r\n const detail = CurveLocationDetail.createCurveFractionPoint(this, fraction, this.fractionToPoint(fraction));\r\n detail.intervalRole = CurveIntervalRole.isolated;\r\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._sweep.startRadians))\r\n detail.intervalRole = CurveIntervalRole.isolatedAtVertex;\r\n else if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._sweep.endRadians))\r\n detail.intervalRole = CurveIntervalRole.isolatedAtVertex;\r\n result.push(detail);\r\n }\r\n }\r\n return numIntersection;\r\n }\r\n /**\r\n * Extend a range to include the range of the arc.\r\n * @param range range being extended.\r\n * @param transform optional transform to apply to the arc.\r\n */\r\n public extendRange(range: Range3d, transform?: Transform): void {\r\n this.extendRangeInSweep(range, this._sweep, transform);\r\n }\r\n /**\r\n * Extend a range to include the range of the arc, using specified range in place of the arc range.\r\n * @param range range being extended.\r\n * @param transform optional transform to apply to the arc.\r\n */\r\n public extendRangeInSweep(range: Range3d, sweep: AngleSweep, transform?: Transform): void {\r\n const trigForm = new SineCosinePolynomial(0, 0, 0);\r\n const center = this._center.clone(Arc3d._workPointA);\r\n const vectorU = this._matrix.columnX(Arc3d._workVectorU);\r\n const vectorV = this._matrix.columnY(Arc3d._workVectorV);\r\n if (transform) {\r\n transform.multiplyPoint3d(center, center);\r\n transform.multiplyVector(vectorU, vectorU);\r\n transform.multiplyVector(vectorV, vectorV);\r\n }\r\n const lowPoint = Arc3d._workPointB;\r\n const highPoint = Arc3d._workPointC;\r\n const range1 = Range1d.createNull();\r\n for (let i = 0; i < 3; i++) {\r\n trigForm.set(center.at(i), vectorU.at(i), vectorV.at(i));\r\n trigForm.rangeInSweep(sweep, range1);\r\n lowPoint.setAt(i, range1.low);\r\n highPoint.setAt(i, range1.high);\r\n }\r\n range.extend(lowPoint);\r\n range.extend(highPoint);\r\n }\r\n /**\r\n * Returns a (high accuracy) range of the curve between fractional positions.\r\n * * Default implementation returns teh range of the curve from clonePartialCurve.\r\n */\r\n public override rangeBetweenFractions(fraction0: number, fraction1: number, transform?: Transform): Range3d {\r\n const sweep = AngleSweep.createStartEndRadians(\r\n this.sweep.fractionToRadians(fraction0), this.sweep.fractionToRadians(fraction1),\r\n );\r\n const range = Range3d.create();\r\n this.extendRangeInSweep(range, sweep, transform);\r\n return range;\r\n }\r\n /**\r\n * Set up a SineCosinePolynomial as the function c+u*cos(theta)+v*sin(theta) where\r\n * c,u,v are coefficients obtained by evaluating altitude and velocity relative to the plane.\r\n * @param plane plane for altitude calculation.\r\n * @param result optional result.\r\n * @internal\r\n */\r\n public getPlaneAltitudeSineCosinePolynomial(\r\n plane: PlaneAltitudeEvaluator, result?: SineCosinePolynomial,\r\n ): SineCosinePolynomial {\r\n if (!result)\r\n result = new SineCosinePolynomial(0, 0, 0);\r\n // altitude function of angle t, given plane with origin o and unit normal n:\r\n // A(t) = (c + u cos(t) + v sin(t)) . n = (c-o).n + u.n cos(t) + v.n sin(t)\r\n // Note the different functions for computing dot product against a point vs. a vector!\r\n result.set(plane.altitude(this._center),\r\n plane.velocityXYZ(this._matrix.coffs[0], this._matrix.coffs[3], this._matrix.coffs[6]),\r\n plane.velocityXYZ(this._matrix.coffs[1], this._matrix.coffs[4], this._matrix.coffs[7]));\r\n return result;\r\n }\r\n /**\r\n * Create a new arc which is a unit circle in the xy-plane centered at the origin.\r\n * @param result optional preallocated object to populate and return.\r\n */\r\n public static createUnitCircle(result?: Arc3d): Arc3d {\r\n return Arc3d.createRefs(undefined, undefined, undefined, result);\r\n }\r\n /**\r\n * Create a new arc which is parallel to the xy plane, with given center and radius and optional angle sweep.\r\n * @param center center of arc.\r\n * @param radius radius of arc.\r\n * @param sweep sweep limits; defaults to full circle.\r\n * @param result optional preallocated object to populate and return.\r\n */\r\n public static createXY(center: Point3d, radius: number, sweep?: AngleSweep, result?: Arc3d): Arc3d {\r\n const matrix = Matrix3d.createScale(radius, radius, 1.0, result?.matrixRef);\r\n if (result)\r\n return result.set(center, matrix, sweep);\r\n return Arc3d.createRefs(center.clone(), matrix, sweep?.clone());\r\n }\r\n /**\r\n * Create a new arc which is parallel to the xy plane, with given center and x,y radii, and optional angle sweep\r\n * @param center center of ellipse.\r\n * @param radiusA x axis radius.\r\n * @param radiusB y axis radius.\r\n * @param sweep angle sweep. Default is full circle.\r\n * @param result optional preallocated object to populate and return.\r\n */\r\n public static createXYEllipse(center: Point3d, radiusA: number, radiusB: number, sweep?: AngleSweep, result?: Arc3d): Arc3d {\r\n const matrix = Matrix3d.createScale(radiusA, radiusB, 1.0, result?.matrixRef);\r\n if (result)\r\n return result.set(center, matrix, sweep);\r\n return Arc3d.createRefs(center.clone(), matrix, sweep?.clone());\r\n }\r\n /**\r\n * Replace the arc's 0 and 90 degree vectors.\r\n * @param vector0 vector from center to ellipse point at 0 degrees in parameter space.\r\n * @param vector90 vector from center to ellipse point at 90 degrees in parameter space.\r\n */\r\n public setVector0Vector90(vector0: Vector3d, vector90: Vector3d) {\r\n this._matrix.setColumns(vector0, vector90,\r\n vector0.unitCrossProductWithDefault(vector90, 0, 0, 0), // normal will be 000 for degenerate case\r\n );\r\n }\r\n /**\r\n * Return the symmetric definition of the arc, with rigid axes and radii.\r\n * * The caller can send the returned data into [[createScaledXYColumns]] to construct the major-minor axis\r\n * version of the instance arc. This formulation of the arc has the same shape, but has perpendicular axes,\r\n * from which the arc's symmetry is readily apparent.\r\n */\r\n public toScaledMatrix3d(): { center: Point3d, axes: Matrix3d, r0: number, r90: number, sweep: AngleSweep } {\r\n const angleData = Angle.dotProductsToHalfAngleTrigValues(\r\n this._matrix.columnXMagnitudeSquared(),\r\n this._matrix.columnYMagnitudeSquared(),\r\n this._matrix.columnXDotColumnY(),\r\n true,\r\n );\r\n const vector0A = this._matrix.multiplyXY(angleData.c, angleData.s);\r\n const vector90A = this._matrix.multiplyXY(-angleData.s, angleData.c);\r\n const axes = Matrix3d.createRigidFromColumns(vector0A, vector90A, AxisOrder.XYZ);\r\n return {\r\n center: this._center.clone(),\r\n axes: (axes ? axes : Matrix3d.createIdentity()),\r\n r0: vector0A.magnitude(),\r\n r90: vector90A.magnitude(),\r\n sweep: this.sweep.cloneMinusRadians(angleData.radians),\r\n };\r\n }\r\n /** Return the arc definition with center, two vectors, and angle sweep. */\r\n public toVectors(): ArcVectors {\r\n return {\r\n center: this.center.clone(),\r\n vector0: this._matrix.columnX(),\r\n vector90: this._matrix.columnY(),\r\n sweep: this.sweep.clone(),\r\n };\r\n }\r\n /** Return the arc definition with center, two vectors, and angle sweep, optionally transformed. */\r\n public toTransformedVectors(\r\n transform?: Transform,\r\n ): { center: Point3d, vector0: Vector3d, vector90: Vector3d, sweep: AngleSweep } {\r\n return transform ? {\r\n center: transform.multiplyPoint3d(this._center),\r\n vector0: transform.multiplyVector(this._matrix.columnX()),\r\n vector90: transform.multiplyVector(this._matrix.columnY()),\r\n sweep: this.sweep.clone(),\r\n }\r\n : {\r\n center: this._center.clone(),\r\n vector0: this._matrix.columnX(),\r\n vector90: this._matrix.columnY(),\r\n sweep: this.sweep.clone(),\r\n };\r\n }\r\n /** Return the arc definition with center, two vectors, and angle sweep, transformed to 4d points. */\r\n public toTransformedPoint4d(\r\n matrix: Matrix4d,\r\n ): { center: Point4d, vector0: Point4d, vector90: Point4d, sweep: AngleSweep } {\r\n return {\r\n center: matrix.multiplyPoint3d(this._center, 1.0),\r\n vector0: matrix.multiplyPoint3d(this._matrix.columnX(), 0.0),\r\n vector90: matrix.multiplyPoint3d(this._matrix.columnY(), 0.0),\r\n sweep: this.sweep.clone(),\r\n };\r\n }\r\n /**\r\n * Set this arc from a json object with these values:\r\n * * center center point.\r\n * * vector0 vector from center to 0 degree point in parameter space (commonly but not always the major axis vector).\r\n * * vector90 vector from center to 90 degree point in parameter space (commonly but not always the minor axis vector).\r\n * @param json\r\n */\r\n public setFromJSON(json?: any) {\r\n if (json && json.center && json.vector0 && json.vector90 && json.sweep) {\r\n this._center.setFromJSON(json.center);\r\n const vector0 = Vector3d.create();\r\n const vector90 = Vector3d.create();\r\n vector0.setFromJSON(json.vector0);\r\n vector90.setFromJSON(json.vector90);\r\n this.setVector0Vector90(vector0, vector90);\r\n this._sweep.setFromJSON(json.sweep);\r\n } else {\r\n this._center.set(0, 0, 0);\r\n this._matrix.setFrom(Matrix3d.identity);\r\n this._sweep.setStartEndRadians();\r\n }\r\n }\r\n /**\r\n * Convert to a JSON object.\r\n * @return {*} [center: [], vector0:[], vector90:[], sweep []}\r\n */\r\n public toJSON(): any {\r\n return {\r\n center: this._center.toJSON(),\r\n sweep: this._sweep.toJSON(),\r\n vector0: this._matrix.columnX().toJSON(),\r\n vector90: this._matrix.columnY().toJSON(),\r\n };\r\n }\r\n /** Test if this arc is almost equal to another GeometryQuery object. */\r\n public override isAlmostEqual(otherGeometry: GeometryQuery, distanceTol: number = Geometry.smallMetricDistance, radianTol: number = Geometry.smallAngleRadians): boolean {\r\n if (otherGeometry instanceof Arc3d) {\r\n const other = otherGeometry;\r\n return this._center.isAlmostEqual(other._center, distanceTol)\r\n && this._matrix.isAlmostEqual(other._matrix, distanceTol)\r\n && this._sweep.isAlmostEqualAllowPeriodShift(other._sweep, radianTol);\r\n }\r\n return false;\r\n }\r\n /** Emit strokes to caller-supplied linestring. */\r\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\r\n const numStrokes = this.computeStrokeCountForOptions(options);\r\n dest.appendFractionalStrokePoints(this, numStrokes, 0.0, 1.0, true);\r\n }\r\n /** Emit strokes to caller-supplied handler. */\r\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\r\n const numStrokes = this.computeStrokeCountForOptions(options);\r\n handler.startCurvePrimitive(this);\r\n handler.announceIntervalForUniformStepStrokes(this, numStrokes, 0.0, 1.0);\r\n handler.endCurvePrimitive(this);\r\n }\r\n /**\r\n * Return the stroke count required for given options.\r\n * @param options StrokeOptions that determine count.\r\n */\r\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\r\n let numStroke;\r\n if (options) {\r\n const rMax = this.maxVectorLength();\r\n numStroke = options.applyTolerancesToArc(rMax, this._sweep.sweepRadians);\r\n } else {\r\n numStroke = StrokeOptions.applyAngleTol(undefined, 1, this._sweep.sweepRadians);\r\n }\r\n return numStroke;\r\n }\r\n /** Second step of double dispatch: call `handler.handleArc3d(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleArc3d(this);\r\n }\r\n /**\r\n * Return (if possible) an arc which is a portion of this curve.\r\n * @param fractionA start fraction.\r\n * @param fractionB end fraction.\r\n */\r\n public override clonePartialCurve(fractionA: number, fractionB: number): Arc3d {\r\n if (fractionB < fractionA) {\r\n const arcA = this.clonePartialCurve(fractionB, fractionA);\r\n arcA.reverseInPlace();\r\n return arcA;\r\n }\r\n const arcB = this.clone();\r\n arcB.sweep.setStartEndRadians(\r\n this.sweep.fractionToRadians(fractionA),\r\n this.sweep.fractionToRadians(fractionB),\r\n );\r\n return arcB;\r\n }\r\n /**\r\n * Return an arc whose basis vectors are rotated by given angle within the current basis space.\r\n * * The returned arc will have `vector0 = this.vector0 * cos(theta) + this.vector90 * sin(theta)`.\r\n * * The returned arc has the same shape as the instance.\r\n * * In other words, the arc's sweep is adjusted so that all fractional parameters evaluate to the same points.\r\n * * Specifically, theta is subtracted from the original start and end angles.\r\n * @param theta the angle (in the input arc space) which is to become the 0-degree point in the new arc.\r\n */\r\n public cloneInRotatedBasis(theta: Angle): Arc3d {\r\n const c = theta.cos();\r\n const s = theta.sin();\r\n const vector0 = this._matrix.multiplyXY(c, s);\r\n const vector90 = this._matrix.multiplyXY(-s, c);\r\n const newSweep = AngleSweep.createStartEndRadians(\r\n this._sweep.startRadians - theta.radians, this._sweep.endRadians - theta.radians,\r\n );\r\n const arcB = Arc3d.create(this._center.clone(), vector0, vector90, newSweep);\r\n return arcB;\r\n }\r\n /**\r\n * Return a cloned arc with basis rotated to align with the global axes. The arc's shape is unchanged.\r\n * * This method is most useful when the instance is an xy-circular arc, for then the aligned arc's stored sweep\r\n * angles can be understood as being measured from the global positive x-axis to the arc's start/end. This is *not*\r\n * the case for xy-elliptical arcs: the parameter angle difference between two points on an ellipse is in general\r\n * not the same as the angle measured between their radials.\r\n * * For an xy instance, the output arc will have:\r\n * * vector0 is in the same direction as the positive x-axis\r\n * * perpendicularVector is in the same direction as the positive z-axis\r\n * * For a general instance, the output arc will have:\r\n * * vector0 is in the same direction as the projection of the positive x-axis vector onto the arc plane\r\n * * perpendicularVector lies in the halfspace z >= 0\r\n * @returns cloned arc, or undefined (if the instance normal is parallel to the x-axis, or its matrix is singular)\r\n */\r\n public cloneAxisAligned(): Arc3d | undefined {\r\n const plane = Plane3dByOriginAndUnitNormal.create(this.center, this.perpendicularVector.crossProduct(Vector3d.unitX()));\r\n if (!plane)\r\n return undefined;\r\n const axisPts: CurveLocationDetail[] = [];\r\n if (2 !== this.appendPlaneIntersectionPoints(plane, axisPts))\r\n return undefined;\r\n const iAxisPt = plane.getNormalRef().dotProduct(this.perpendicularVector.crossProductStartEnd(this.center, axisPts[0].point)) > 0.0 ? 0 : 1;\r\n const toUnitX = this.sweep.fractionToAngle(axisPts[iAxisPt].fraction);\r\n const arc1 = this.cloneInRotatedBasis(toUnitX); // rotate in arc's plane\r\n if (this.perpendicularVector.dotProduct(Vector3d.unitZ()) < -Geometry.smallAngleRadians) {\r\n if (this.matrixRef.isSingular())\r\n return undefined;\r\n const flip = Matrix3d.createRowValues(1, 0, 0, 0, -1, 0, 0, 0, -1); // rotate 180 degrees around arc's local x-axis\r\n arc1.matrixRef.multiplyMatrixMatrix(flip, arc1.matrixRef);\r\n arc1.sweep.setStartEndDegrees(-arc1.sweep.startDegrees, -arc1.sweep.endDegrees); // rotation alone is insufficient to flip\r\n }\r\n return arc1;\r\n }\r\n /**\r\n * Find intervals of this CurvePrimitive that are interior to a clipper.\r\n * @param clipper clip structure (e.g.clip planes).\r\n * @param announce (optional) function to be called announcing fractional intervals\r\n * `announce(fraction0, fraction1, curvePrimitive)`.\r\n * @returns true if any \"in\" segments are announced.\r\n */\r\n public override announceClipIntervals(clipper: Clipper, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\r\n return clipper.announceClippedArcIntervals(this, announce);\r\n }\r\n /** Compute the center and vectors of another arc as local coordinates within this arc's frame. */\r\n public otherArcAsLocalVectors(other: Arc3d): ArcVectors | undefined {\r\n const otherOrigin = this._matrix.multiplyInverseXYZAsPoint3d(\r\n other.center.x - this.center.x,\r\n other.center.y - this.center.y,\r\n other.center.z - this.center.z,\r\n );\r\n const otherVector0 = this._matrix.multiplyInverse(other.vector0);\r\n const otherVector90 = this._matrix.multiplyInverse(other.vector90);\r\n if (otherOrigin && otherVector0 && otherVector90) {\r\n return {\r\n center: otherOrigin,\r\n vector0: otherVector0,\r\n vector90: otherVector90,\r\n sweep: this.sweep.clone(),\r\n };\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Determine an arc \"at a point of inflection\" of a point sequence.\r\n * * Return the arc along with the fractional positions of the tangency points.\r\n * * In the returned object:\r\n * * `arc` is the (bounded) arc.\r\n * * `fraction10` is the tangency point's position as an interpolating fraction of the line segment from\r\n * `point1` (backwards) to `point0`.\r\n * * `fraction12` is the tangency point's position as an interpolating fraction of the line segment from\r\n * `point1` (forward) to `point2`.\r\n * * `point` is the `point1` input.\r\n * * If unable to construct the arc:\r\n * * `point` is the `point1` input.\r\n * * both fractions are zero.\r\n * * `arc` is undefined.\r\n * @param point0 first point of path (the point before the point of inflection).\r\n * @param point1 second point of path (the point of inflection).\r\n * @param point2 third point of path (the point after the point of inflection).\r\n * @param radius arc radius.\r\n *\r\n */\r\n public static createFilletArc(point0: Point3d, point1: Point3d, point2: Point3d, radius: number): ArcBlendData {\r\n const vector10 = Vector3d.createStartEnd(point1, point0);\r\n const vector12 = Vector3d.createStartEnd(point1, point2);\r\n const d10 = vector10.magnitude();\r\n const d12 = vector12.magnitude();\r\n if (vector10.normalizeInPlace() && vector12.normalizeInPlace()) {\r\n const bisector = vector10.plus(vector12);\r\n if (bisector.normalizeInPlace()) {\r\n // const theta = vector12.angleTo(bisector);\r\n // vector10, vector12, and bisector are UNIT vectors\r\n // bisector splits the angle between vector10 and vector12\r\n const perpendicular = vector12.minus(vector10);\r\n const perpendicularMagnitude = perpendicular.magnitude(); // == 2 * sin(theta)\r\n const sinTheta = 0.5 * perpendicularMagnitude;\r\n if (!Geometry.isSmallAngleRadians(sinTheta)) { // (for small theta, sinTheta is almost equal to theta)\r\n const cosTheta = Math.sqrt(1 - sinTheta * sinTheta);\r\n const tanTheta = sinTheta / cosTheta;\r\n const alphaRadians = Math.acos(sinTheta);\r\n const distanceToCenter = radius / sinTheta;\r\n const distanceToTangency = radius / tanTheta;\r\n const f10 = distanceToTangency / d10;\r\n const f12 = distanceToTangency / d12;\r\n const center = point1.plusScaled(bisector, distanceToCenter);\r\n bisector.scaleInPlace(-radius);\r\n perpendicular.scaleInPlace(radius / perpendicularMagnitude);\r\n const arc02 = Arc3d.create(center, bisector, perpendicular, AngleSweep.createStartEndRadians(-alphaRadians, alphaRadians));\r\n return { arc: arc02, fraction10: f10, fraction12: f12, point: point1.clone() };\r\n }\r\n }\r\n }\r\n return { fraction10: 0.0, fraction12: 0.0, point: point1.clone() };\r\n }\r\n /** Scale the vector0 and vector90 vectors by `scaleFactor`. */\r\n public scaleAboutCenterInPlace(scaleFactor: number) {\r\n this._matrix.scaleColumnsInPlace(scaleFactor, scaleFactor, 1.0);\r\n }\r\n /** Return the (signed) area between (a fractional portion of) the arc and the chord between those points. */\r\n public areaToChordXY(fraction0: number, fraction1: number): number {\r\n const detJ = Geometry.crossProductXYXY(\r\n this._matrix.coffs[0], this._matrix.coffs[3],\r\n this._matrix.coffs[1], this._matrix.coffs[4],\r\n ); // area scale factor from local to world\r\n const radians0 = this._sweep.fractionToRadians(fraction0);\r\n const radians1 = this._sweep.fractionToRadians(fraction1);\r\n const alpha = 0.5 * (radians1 - radians0); // signed area of local sector\r\n // Compute signed area of local triangle (\"wedge\") formed by origin and arc endpoints p0, p1:\r\n // (p0 x p1)/2 = (cos(r0)sin(r1)-cos(r1)sin(r0))/2 = sin(r1-r0)/2 = cos(a)sin(a)\r\n const wedgeArea = Math.cos(alpha) * Math.sin(alpha);\r\n return (alpha - wedgeArea) * detJ; // to world\r\n }\r\n /**\r\n * Construct an offset of the instance curve as viewed in the xy-plane (ignoring z).\r\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object.\r\n */\r\n public override constructOffsetXY(\r\n offsetDistanceOrOptions: number | OffsetOptions,\r\n ): CurvePrimitive | CurvePrimitive[] | undefined {\r\n const options = OffsetOptions.create(offsetDistanceOrOptions);\r\n if (this.isCircular || options.preserveEllipticalArcs) {\r\n const arcXY = this.cloneAtZ();\r\n const sign = arcXY.sweep.sweepRadians * arcXY.matrixRef.coffs[8] >= 0.0 ? 1.0 : -1.0;\r\n const r0 = arcXY.matrixRef.columnXMagnitude();\r\n const r0new = r0 - sign * options.leftOffsetDistance;\r\n const r90 = this.isCircular ? r0 : arcXY.matrixRef.columnYMagnitude();\r\n const r90new = this.isCircular ? r0new : r90 - sign * options.leftOffsetDistance;\r\n if (\r\n !Geometry.isSmallMetricDistance(r0new)\r\n && (r0 * r0new > 0.0)\r\n && (this.isCircular || (!Geometry.isSmallMetricDistance(r90new) && (r90 * r90new > 0.0)))\r\n ) {\r\n const factor0 = r0new / r0;\r\n const factor90 = this.isCircular ? factor0 : r90new / r90;\r\n arcXY.matrixRef.scaleColumnsInPlace(factor0, factor90, 1.0);\r\n return arcXY;\r\n }\r\n return undefined; // zero radius\r\n }\r\n // default impl\r\n const handler = new CurveOffsetXYHandler(this, options.leftOffsetDistance);\r\n this.emitStrokableParts(handler, options.strokeOptions);\r\n return handler.claimResult();\r\n }\r\n /**\r\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\r\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\r\n * @param lowHigh optional receiver for output.\r\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the end of the ray.\r\n */\r\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\r\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\r\n }\r\n /**\r\n * Construct a circular arc chain approximation to the instance elliptical arc.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/ArcApproximationGeneral and\r\n * https://www.itwinjs.org/sandbox/SaeedTorabi/ArcApproximation\r\n * @param options bundle of options for sampling an elliptical arc (use default options if undefined).\r\n * @returns the approximating curve chain, the circular instance, or undefined if construction fails.\r\n */\r\n public constructCircularArcChainApproximation(options?: EllipticalArcApproximationOptions): CurveChain | Arc3d | undefined {\r\n if (!options)\r\n options = EllipticalArcApproximationOptions.create();\r\n const context = EllipticalArcApproximationContext.create(this);\r\n const result = context.constructCircularArcChainApproximation(options);\r\n if (!result && this.isCircular)\r\n return (this.sweep.isFullCircle && options.forcePath) ? Path.create(this) : this;\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Arc3d.js","sourceRoot":"","sources":["../../../src/curve/Arc3d.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 Curve\n */\n\nimport { Clipper } from \"../clipping/ClipUtils\";\nimport { Constant } from \"../Constant\";\nimport { AxisOrder, BeJSONFunctions, Geometry, PlaneAltitudeEvaluator } from \"../Geometry\";\nimport { Angle } from \"../geometry3d/Angle\";\nimport { AngleSweep } from \"../geometry3d/AngleSweep\";\nimport { GeometryHandler, IStrokeHandler } from \"../geometry3d/GeometryHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\nimport { Range1d, Range3d } from \"../geometry3d/Range\";\nimport { Ray3d } from \"../geometry3d/Ray3d\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { XYAndZ } from \"../geometry3d/XYZProps\";\nimport { Matrix4d } from \"../geometry4d/Matrix4d\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { SineCosinePolynomial, TrigPolynomial } from \"../numerics/Polynomials\";\nimport { SmallSystem } from \"../numerics/SmallSystem\";\nimport { CurveChain } from \"./CurveCollection\";\nimport { CurveExtendMode, CurveExtendOptions, VariantCurveExtendParameter } from \"./CurveExtendMode\";\nimport { CurveIntervalRole, CurveLocationDetail, CurveSearchStatus } from \"./CurveLocationDetail\";\nimport { AnnounceNumberNumberCurvePrimitive, CurvePrimitive, TangentOptions } from \"./CurvePrimitive\";\nimport { GeometryQuery } from \"./GeometryQuery\";\nimport { CurveOffsetXYHandler } from \"./internalContexts/CurveOffsetXYHandler\";\nimport { EllipticalArcApproximationContext } from \"./internalContexts/EllipticalArcApproximationContext\";\nimport { PlaneAltitudeRangeContext } from \"./internalContexts/PlaneAltitudeRangeContext\";\nimport { LineSegment3d } from \"./LineSegment3d\";\nimport { LineString3d } from \"./LineString3d\";\nimport { OffsetOptions } from \"./OffsetOptions\";\nimport { Path } from \"./Path\";\nimport { StrokeOptions } from \"./StrokeOptions\";\n\n// cspell:words binormal\n\n/**\n * Compact vector form of an elliptic arc defined by center, vectors at 0 and 90 degrees, and angular sweep.\n * * @see [Curve Collections]($docs/learning/geometry/CurvePrimitive.md) learning article for further details of the\n * parameterization and meaning of the vectors.\n * @public\n */\nexport interface ArcVectors {\n /** Center point of arc. */\n center: Point3d;\n /** Vector from the arc center to the arc point at parameter 0 degrees. */\n vector0: Vector3d;\n /** Vector from the arc center to the arc point at parameter 90 degrees. */\n vector90: Vector3d;\n /** Angular range swept by the arc, of length less than 2*pi if not a full ellipse. */\n sweep: AngleSweep;\n}\n\n/**\n * Carrier structure for an arc with fractional data on incoming, outgoing curves.\n * @public\n */\nexport interface ArcBlendData {\n /** Constructed arc. */\n arc?: Arc3d;\n /** Fraction \"moving backward\" on the inbound curve. */\n fraction10: number;\n /** Fraction \"moving forward\" on the outbound curve. */\n fraction12: number;\n /** Optional reference point. */\n point?: Point3d;\n}\n\n/**\n * Enumeration of methods used to sample an elliptical arc in [[Arc3d.constructCircularArcChainApproximation]].\n * * Because ellipses have two axes of symmetry, samples are computed for one quadrant and reflected across each\n * axis to the other quadrants. Any samples that fall outside the arc sweep are filtered out.\n * @public\n */\nexport enum EllipticalArcSampleMethod {\n /** Generate n samples uniformly interpolated between the min and max parameters of a full ellipse quadrant. */\n UniformParameter = 0,\n /** Generate n samples uniformly interpolated between the min and max curvatures of a full ellipse quadrant. */\n UniformCurvature = 1,\n /**\n * Generate n samples interpolated between the min and max curvatures of a full ellipse quadrant, using a\n * [[FractionMapper]] callback to generate the interpolation weights.\n */\n NonUniformCurvature = 2,\n /**\n * Generate samples by subdividing parameter space until the approximation has less than a given max\n * distance to the elliptical arc.\n */\n AdaptiveSubdivision = 3,\n}\n\n/**\n * A function that maps [0,1]->[0,1].\n * @public\n */\nexport type FractionMapper = (f: number) => number;\n\n/**\n * Options for generating samples for the construction of an approximation to an elliptical arc.\n * * Used by [[Arc3d.constructCircularArcChainApproximation]].\n * @public\n */\nexport class EllipticalArcApproximationOptions {\n private _sampleMethod: EllipticalArcSampleMethod;\n private _numSamplesInQuadrant: number;\n private _maxError: number;\n private _remapFunction: FractionMapper;\n private _forcePath: boolean;\n\n /** Default error tolerance. */\n public static defaultMaxError = Constant.oneCentimeter;\n\n private constructor(\n method: EllipticalArcSampleMethod,\n numSamplesInQuadrant: number,\n maxError: number,\n remapFunction: FractionMapper,\n forcePath: boolean,\n ) {\n this._sampleMethod = method;\n this._numSamplesInQuadrant = numSamplesInQuadrant;\n this._maxError = maxError;\n this._remapFunction = remapFunction;\n this._forcePath = forcePath;\n }\n /**\n * Construct options with optional defaults.\n * @param method sample method, default [[EllipticalArcSampleMethod.AdaptiveSubdivision]].\n * @param numSamplesInQuadrant samples in each full quadrant for interpolation methods, default 4.\n * @param maxError positive maximum distance to ellipse for the subdivision method, default 1cm.\n * @param remapFunction optional callback to remap fraction space for [[EllipticalArcSampleMethod.NonUniformCurvature]],\n * default quadratic. For best results, this function should be a bijection.\n * @param forcePath whether to return a [[Path]] instead of a [[Loop]] when approximating a full elliptical arc,\n * default false.\n */\n public static create(\n method: EllipticalArcSampleMethod = EllipticalArcSampleMethod.AdaptiveSubdivision,\n numSamplesInQuadrant: number = 4,\n maxError: number = this.defaultMaxError,\n remapFunction: FractionMapper = (x: number) => x * x,\n forcePath: boolean = false,\n ) {\n if (numSamplesInQuadrant < 2)\n numSamplesInQuadrant = 2;\n if (maxError <= 0)\n maxError = this.defaultMaxError;\n return new EllipticalArcApproximationOptions(method, numSamplesInQuadrant, maxError, remapFunction, forcePath);\n }\n /** Clone the options. */\n public clone(): EllipticalArcApproximationOptions {\n return new EllipticalArcApproximationOptions(\n this.sampleMethod, this.numSamplesInQuadrant, this.maxError, this.remapFunction, this.forcePath,\n );\n }\n /** Method used to sample the elliptical arc. */\n public get sampleMethod(): EllipticalArcSampleMethod {\n return this._sampleMethod;\n }\n public set sampleMethod(method: EllipticalArcSampleMethod) {\n this._sampleMethod = method;\n }\n /**\n * Number of samples to return in each full quadrant, including endpoint(s).\n * * Used by interpolation sample methods.\n * * In general, for n samples, the approximating [[Path]] consists of n-1 primitives,\n * and the approximating [[Loop]] consists of n primitives.\n * * Minimum value is 2.\n */\n public get numSamplesInQuadrant(): number {\n return this._numSamplesInQuadrant;\n }\n public set numSamplesInQuadrant(numSamples: number) {\n this._numSamplesInQuadrant = numSamples;\n }\n /**\n * Maximum distance (in meters) of the computed approximation to the elliptical arc.\n * * Used by [[EllipticalArcSampleMethod.AdaptiveSubdivision]].\n */\n public get maxError(): number {\n return this._maxError;\n }\n public set maxError(error: number) {\n this._maxError = error;\n }\n /**\n * Callback function to remap fraction space to fraction space.\n * * Used by [[EllipticalArcSampleMethod.NonUniformCurvature]].\n */\n public get remapFunction(): FractionMapper {\n return this._remapFunction;\n }\n public set remapFunction(f: FractionMapper) {\n this._remapFunction = f;\n }\n /** Whether to return a [[Path]] instead of a [[Loop]] when approximating a full (closed) ellipse. */\n public get forcePath(): boolean {\n return this._forcePath;\n }\n public set forcePath(value: boolean) {\n this._forcePath = value;\n }\n}\n\n/**\n * Circular or elliptic arc.\n * * The angle to point equation is:\n * * `X = center + cos(theta) * vector0 + sin(theta) * vector90`\n * * The arc's `sweep` determines the range of theta values (angles). In particular:\n * * The point at `theta = n*360` degrees is `center + vector0` for any integer n.\n * * The point at `theta = 90 + n*360` degrees is `center + vector90` for any integer n.\n * * The arc's `sweep` _together with_ `vector0` and `vector90` determine the arc's orientation:\n * * If `sweep.startDegrees < sweep.endDegrees`, the arc's orientation is counterclockwise with respect to its\n * `perpendicularVector` (i.e., looking at the arc from the head of this vector).\n * * Similarly, if `sweep.startDegrees > sweep.endDegrees`, the arc's orientation is clockwise with respect to\n * its `perpendicularVector`.\n * * The arc's orientation is _always_ counterclockwise with respect to its `binormalVector`.\n * * When `vector0` and `vector90` are perpendicular and have equal length, the arc is circular.\n * * When they are non-perpendicular, the arc is always elliptic.\n * * When they have unequal length, the arc is always elliptic.\n * * To create an ellipse in standard major-minor axis form:\n * * `vector0` is the vector from the center to the major axis extreme.\n * * `vector90` is the vector from the center to the minor axis extreme.\n * * Note that constructing these vectors to the extreme points makes them perpendicular.\n * * The method [[Arc3d.toScaledMatrix3d]] can be called to convert an arc with unrestricted `vector0` and `vector90`\n * to an arc in standard major-minor axis form.\n * * The unrestricted form is much easier to work with for common calculations: stroking, projection to 2d,\n * intersection with plane.\n * @public\n */\nexport class Arc3d extends CurvePrimitive implements BeJSONFunctions {\n /** String name for schema properties. */\n public readonly curvePrimitiveType = \"arc\";\n /** Test if this and other are both instances of Arc3d. */\n public isSameGeometryClass(other: GeometryQuery): boolean {\n return other instanceof Arc3d;\n }\n private _center: Point3d;\n private _matrix: Matrix3d; // columns are [vector0, vector90, unit normal]\n private _sweep: AngleSweep; // sweep limits\n private static _workPointA = Point3d.create();\n private static _workPointB = Point3d.create();\n private static _workPointC = Point3d.create();\n private static _workVectorU = Vector3d.create();\n private static _workVectorV = Vector3d.create();\n private static _workVectorW = Vector3d.create();\n private static _workRay0 = Ray3d.createZero();\n private static _workRay1 = Ray3d.createZero();\n private static _workRay2 = Ray3d.createZero();\n /** Read/write the center. Getter returns clone. */\n public get center(): Point3d {\n return this._center.clone();\n }\n public set center(center: XYAndZ) {\n this._center.setFrom(center);\n }\n /** Read property for (reference to) the arc center. */\n public get centerRef(): Point3d {\n return this._center;\n }\n /**\n * Read property for (clone of) the x-column of the arc matrix.\n * * This vector determines the point on the arc corresponding to angles n*360 degrees.\n */\n public get vector0(): Vector3d {\n return this._matrix.columnX();\n }\n /**\n * Read property for (clone of) the y-column of the arc matrix.\n * * This vector determines the point on the arc corresponding to angles 90 + n*360 degrees.\n */\n public get vector90(): Vector3d {\n return this._matrix.columnY();\n }\n /**\n * Compute an arc binormal vector with arbitrary length.\n * * The arc parameterization is counterclockwise with respect to this vector.\n * * This vector is parallel to [[perpendicularVector]] and possibly opposite.\n */\n public binormalVector(result?: Vector3d): Vector3d {\n const plane = this.fractionToPointAnd2Derivatives(0.0);\n return plane.vectorU.crossProduct(plane.vectorV, result);\n }\n /**\n * Read property for (clone of) the z-column of the arc matrix.\n * * This vector is nominally the normalized cross product: `vector0 x vector90`.\n * * To compute a vector with respect to which the arc sweep is counterclockwise, use [[binormalVector]].\n */\n public get perpendicularVector(): Vector3d {\n return this._matrix.columnZ();\n }\n /** Return a clone of the arc matrix. */\n public matrixClone(): Matrix3d {\n return this._matrix.clone();\n }\n /** Read property for (reference to) the arc matrix. */\n public get matrixRef(): Matrix3d {\n return this._matrix;\n }\n /** Read/write the sweep. Getter returns reference. */\n public get sweep(): AngleSweep {\n return this._sweep;\n }\n public set sweep(value: AngleSweep) {\n this._sweep.setFrom(value);\n }\n /** An Arc3d extends along its complete elliptic arc. */\n public override get isExtensibleFractionSpace(): boolean {\n return true;\n }\n /** Constructor. Captures the inputs. */\n private constructor(center: Point3d, matrix: Matrix3d, sweep: AngleSweep) {\n super();\n this._center = center;\n this._matrix = matrix;\n this._sweep = sweep.clampToFullCircle(sweep);\n }\n /** Return a clone of the arc, with transform applied. */\n public cloneTransformed(transform: Transform): Arc3d { // we know tryTransformInPlace succeeds.\n const c = this.clone();\n c.tryTransformInPlace(transform);\n return c;\n }\n /**\n * Redefine the arc with (captured references to) given data.\n * @param center arc center.\n * @param matrix matrix with columns vector0, vector90, and their unit cross product.\n * @param sweep angle sweep.\n */\n public setRefs(center: Point3d, matrix: Matrix3d, sweep: AngleSweep) {\n this._center = center;\n this._matrix = matrix;\n sweep.clampToFullCircle(this._sweep);\n }\n /**\n * Redefine the arc with (copies of) the given data.\n * * Even if an input is omitted, the corresponding instance data is set to the default value.\n * * For example, all default inputs result in a unit circle centered at the origin in the xy-plane.\n * @param center arc center. Default is zero.\n * @param matrix matrix with columns vector0, vector90, and their unit cross product. Default is identity.\n * @param sweep angle sweep. Default is full sweep.\n * @returns the instance\n */\n public set(center?: Point3d, matrix?: Matrix3d, sweep?: AngleSweep): Arc3d {\n if (center)\n this._center.setFrom(center);\n else\n this._center.setZero();\n if (matrix)\n this._matrix.setFrom(matrix);\n else\n this._matrix.setIdentity();\n if (sweep)\n sweep.clampToFullCircle(this._sweep);\n else\n AngleSweep.create360(0, this._sweep);\n return this;\n }\n /** Copy center, matrix, and sweep from other Arc3d. */\n public setFrom(other: Arc3d) {\n this._center.setFrom(other._center);\n this._matrix.setFrom(other._matrix);\n this._sweep.setFrom(other._sweep);\n }\n /** Return a clone of this arc. */\n public clone(): Arc3d {\n return new Arc3d(this._center.clone(), this._matrix.clone(), this._sweep.clone());\n }\n /**\n * Create an arc, capturing references to center, matrix and sweep.\n * * Default inputs construct a unit circle centered at the origin in the xy-plane.\n * @param center center point. Default is zero.\n * @param matrix matrix with columns vector0, vector90, and their unit cross product. Default is identity.\n * @param sweep sweep limits. Default is full sweep.\n * @param result optional preallocated result to receive copies of the inputs (or default values) and return.\n */\n public static createRefs(center?: Point3d, matrix?: Matrix3d, sweep?: AngleSweep, result?: Arc3d): Arc3d {\n if (result)\n return result.set(center, matrix, sweep);\n return new Arc3d(center ?? Point3d.createZero(), matrix ?? Matrix3d.createIdentity(), sweep ?? AngleSweep.create360());\n }\n /**\n * Create an arc from center, x column to be scaled, and y column to be scaled.\n * @param center center of ellipse.\n * @param matrix the x-column and y-column of this matrix are scaled by `radius0` and `radius90` to define the\n * arc's `vector0` and `vector90`.\n * @param radius0 radius along `vector0`.\n * @param radius90 radius along `vector90`.\n * @param sweep sweep limits.\n * @param result optional preallocated result.\n */\n public static createScaledXYColumns(\n center: Point3d | undefined, matrix: Matrix3d, radius0: number, radius90: number, sweep?: AngleSweep, result?: Arc3d,\n ): Arc3d {\n const vector0 = matrix.columnX();\n const vector90 = matrix.columnY();\n return Arc3d.create(center, vector0.scale(radius0, vector0), vector90.scale(radius90, vector90), sweep, result);\n }\n /**\n * Create a full circle from center, normal and radius.\n * @param center center of circle. If undefined, use 000.\n * @param normal normal vector.\n * @param radius radius of the circle.\n * @param result optional preallocated result.\n */\n public static createCenterNormalRadius(\n center: Point3d | undefined, normal: Vector3d, radius: number, result?: Arc3d,\n ): Arc3d {\n const frame = Matrix3d.createRigidHeadsUp(normal);\n return Arc3d.createScaledXYColumns(center, frame, radius, radius, undefined, result);\n }\n /**\n * Create an elliptical arc by center with vectors to points at 0 and 90 degrees in parameter space.\n * @param center arc center.\n * @param vector0 vector to 0 degrees (commonly major axis).\n * @param vector90 vector to 90 degree point (commonly minor axis).\n * @param sweep sweep limits; defaults to full sweep.\n * @param result optional preallocated result.\n */\n public static create(\n center: Point3d | undefined, vector0: Vector3d, vector90: Vector3d, sweep?: AngleSweep, result?: Arc3d,\n ): Arc3d {\n const normal = vector0.unitCrossProductWithDefault(vector90, 0, 0, 0); // normal will be 000 for degenerate case\n const matrix = Matrix3d.createColumns(vector0, vector90, normal, result?._matrix);\n if (result)\n return result.set(center, matrix, sweep);\n return this.createRefs(center?.clone(), matrix, sweep?.clone());\n }\n /**\n * Create an elliptical arc from three points on the ellipse: two points on an axis and one in between.\n * @param start start of arc, on an axis.\n * @param middle point on arc somewhere between `start` and `end`.\n * @param end point on arc directly opposite `start`.\n * @param sweep angular sweep, measured from `start` in the direction of `middle`.\n * For a half-ellipse from `start` to `end` passing through `middle`, pass `AngleSweep.createStartEndDegrees(0,180)`.\n * Default value is full sweep to create the entire ellipse.\n * @param result optional preallocated result.\n * @returns elliptical arc, or undefined if construction impossible.\n */\n public static createStartMiddleEnd(\n start: XYAndZ, middle: XYAndZ, end: XYAndZ, sweep?: AngleSweep, result?: Arc3d,\n ): Arc3d | undefined {\n const center = Point3d.createAdd2Scaled(start, 0.5, end, 0.5);\n const vector0 = Vector3d.createStartEnd(center, start);\n const vector1 = Vector3d.createStartEnd(center, middle);\n const v0DotV1 = vector0.dotProduct(vector1);\n const v0Len2 = vector0.magnitudeSquared();\n if (Math.abs(v0DotV1) >= v0Len2)\n return undefined; // middle point projects to end of axis or beyond (rules out negative under the radical below)\n const normal = vector0.crossProduct(vector1);\n const vector90 = normal.unitCrossProductWithDefault(vector0, 0, 0, 0);\n const v1DotV90 = vector1.dotProduct(vector90);\n // solve the standard ellipse equation for the unknown axis length, given local coords of middle (v0.v1/||v0||, v90.v1)\n const v90Len = Geometry.safeDivideFraction(v0Len2 * v1DotV90, Math.sqrt(v0Len2 * v0Len2 - v0DotV1 * v0DotV1), 0);\n if (Geometry.isSmallMetricDistanceSquared(v90Len)) // tighter than smallMetricDistance to allow flatter long elliptical arcs\n return undefined;\n vector90.scaleInPlace(v90Len);\n return Arc3d.create(center, vector0, vector90, sweep, result);\n }\n /**\n * Create a circular arc defined by start point, tangent at start point, and end point.\n * * The circular arc is swept from `start` to `end` in the direction of `tangentAtStart`.\n * * If `tangentAtStart` is parallel to the line segment from `start` to `end`, return the line segment.\n */\n public static createCircularStartTangentEnd(\n start: Point3d, tangentAtStart: Vector3d, end: Point3d, result?: Arc3d,\n ): Arc3d | LineSegment3d {\n // see itwinjs-core\\core\\geometry\\internaldocs\\Arc3d.md to clarify below algorithm\n const startToEnd = Vector3d.createStartEnd(start, end);\n const frame = Matrix3d.createRigidFromColumns(tangentAtStart, startToEnd, AxisOrder.XYZ);\n if (frame !== undefined) {\n const vv = startToEnd.dotProduct(startToEnd);\n const vw = frame.dotColumnY(startToEnd);\n const radius = Geometry.conditionalDivideCoordinate(vv, 2 * vw);\n if (radius !== undefined) {\n const vector0 = frame.columnY();\n vector0.scaleInPlace(-radius); // center to start\n const vector90 = frame.columnX();\n vector90.scaleInPlace(radius);\n const centerToEnd = vector0.plus(startToEnd);\n const sweepAngle = vector0.angleTo(centerToEnd);\n let sweepRadians = sweepAngle.radians; // always positive and less than PI\n if (tangentAtStart.dotProduct(centerToEnd) < 0.0) // sweepRadians is the wrong way\n sweepRadians = 2.0 * Math.PI - sweepRadians;\n const center = start.plusScaled(vector0, -1.0);\n const sweep = AngleSweep.createStartEndRadians(0.0, sweepRadians);\n return Arc3d.create(center, vector0, vector90, sweep, result);\n }\n }\n return LineSegment3d.create(start, end);\n }\n /**\n * Create a circular arc from start point, tangent at start, radius, optional plane normal, arc sweep.\n * * The vector from start point to center is in the direction of upVector crossed with tangentA.\n * @param start start point.\n * @param tangentAtStart vector in tangent direction at the start.\n * @param radius signed radius.\n * @param upVector optional out-of-plane vector. Defaults to positive Z.\n * @param sweep angular range. If single `Angle` is given, start angle is at 0 degrees (the start point).\n */\n public static createCircularStartTangentRadius(\n start: Point3d, tangentAtStart: Vector3d, radius: number, upVector?: Vector3d, sweep?: Angle | AngleSweep,\n ): Arc3d | undefined {\n if (upVector === undefined)\n upVector = Vector3d.unitZ();\n const vector0 = upVector.unitCrossProduct(tangentAtStart);\n if (vector0 === undefined)\n return undefined;\n const center = start.plusScaled(vector0, radius);\n // reverse the A-to-center vector and bring it up to scale\n vector0.scaleInPlace(-radius);\n const vector90 = tangentAtStart.scaleToLength(Math.abs(radius))!; // cannot fail; prior unitCrossProduct would have failed first\n return Arc3d.create(center, vector0, vector90, AngleSweep.create(sweep));\n }\n /**\n * Create a circular arc defined by start and end points and radius.\n * @param start start point of the arc.\n * @param end end point of the arc.\n * @param helper a third point near the arc in its plane, or a vector in the direction of the arc normal.\n * @param result optional preallocated result to populate and return.\n * @returns the constructed arc, or undefined if desired arc cannot be constructed.\n */\n public static createCircularStartEndRadius(start: Point3d, end: Point3d, radius: number, helper: Point3d | Vector3d, result?: Arc3d): Arc3d | undefined {\n // Construct a line segment from start to end. It is a chord of the circle,\n // so the circle center is on its perpendicular bisector.\n const semiChordLen2 = 0.25 * start.distanceSquared(end);\n const radius2 = radius * radius;\n if (radius2 < semiChordLen2)\n return undefined;\n const height = Math.sqrt(radius2 - semiChordLen2); // Pythagoras gives us distance from chord to center\n const normal = Vector3d.createZero(this._workVectorU);\n const vecToCenter = Vector3d.createZero(this._workVectorV);\n // the helper gives us the circle normal\n if (helper instanceof Point3d)\n start.crossProductToPoints(helper, end, normal);\n else\n normal.setFrom(helper);\n // the normal and chord direction give us the side of the chord on which the center resides\n if (!normal.normalizeInPlace() || !normal.crossProductStartEnd(start, end, vecToCenter).scaleToLength(height, vecToCenter))\n return undefined;\n const center = Point3d.createZero(result?.centerRef);\n start.interpolate(0.5, end, center).addInPlace(vecToCenter);\n const vector0 = Vector3d.createStartEnd(center, start, this._workVectorW);\n const endVector = Vector3d.createStartEnd(center, end, this._workVectorV); // reuse static\n const sweep = AngleSweep.createStartEndRadians(0, vector0.signedRadiansTo(endVector, normal), result?.sweep);\n const vector90 = normal.crossProduct(vector0, this._workVectorV); // has length radius (reuse static)\n const matrix = Matrix3d.createColumns(vector0, vector90, normal, result?.matrixRef);\n return this.createRefs(center, matrix, sweep, result);\n }\n\n /**\n * Return a clone of this arc, projected to given z value.\n * * If `z` is omitted, the clone is at the z of the center.\n * * This function projects the arc into a plane parallel to xy-plane.\n * * Note that projection to fixed z can change circle into ellipse (and (rarely) ellipse to circle).\n */\n public cloneAtZ(z?: number): Arc3d {\n if (z === undefined)\n z = this._center.z;\n return Arc3d.createXYZXYZXYZ(\n this._center.x, this._center.y, z,\n this._matrix.coffs[0], this._matrix.coffs[3], 0,\n this._matrix.coffs[1], this._matrix.coffs[4], 0,\n this._sweep,\n );\n }\n /**\n * Create an arc by center (cx,cy,xz) with vectors (ux,uy,uz) and (vx,vy,vz) to points at 0 and 90 degrees in\n * parameter space.\n * @param result optional preallocated result.\n */\n public static createXYZXYZXYZ(\n cx: number, cy: number, cz: number,\n ux: number, uy: number, uz: number,\n vx: number, vy: number, vz: number,\n sweep?: AngleSweep, result?: Arc3d,\n ): Arc3d {\n return Arc3d.create(\n Point3d.create(cx, cy, cz), Vector3d.create(ux, uy, uz), Vector3d.create(vx, vy, vz), sweep, result,\n );\n }\n /**\n * Return a quick estimate of the eccentricity of the ellipse.\n * * The estimator is the cross magnitude of the product of vectors U and V, divided by square of the larger magnitude\n * * for typical Arc3d with perpendicular UV, this is exactly the small axis divided by large.\n * * note that the eccentricity is AT MOST ONE.\n */\n public quickEccentricity(): number {\n const magX = this._matrix.columnXMagnitude();\n const magY = this._matrix.columnYMagnitude();\n const jacobian = this._matrix.columnXYCrossProductMagnitude();\n const largeAxis = Geometry.maxXY(magX, magY);\n return jacobian / (largeAxis * largeAxis);\n }\n /**\n * Create a circular arc defined by start point, any intermediate point, and end point.\n * If the points are colinear, assemble them into a linestring.\n */\n public static createCircularStartMiddleEnd(\n pointA: XYAndZ, pointB: XYAndZ, pointC: XYAndZ, result?: Arc3d,\n ): Arc3d | LineString3d {\n const vectorAB = Vector3d.createStartEnd(pointA, pointB);\n const vectorAC = Vector3d.createStartEnd(pointA, pointC);\n const ab2 = vectorAB.magnitudeSquared();\n const ac2 = vectorAC.magnitudeSquared();\n const normal = vectorAB.sizedCrossProduct(vectorAC, Math.sqrt(Math.sqrt(ab2 * ac2)));\n if (normal) {\n const vectorToCenter = SmallSystem.linearSystem3d(\n normal.x, normal.y, normal.z,\n vectorAB.x, vectorAB.y, vectorAB.z,\n vectorAC.x, vectorAC.y, vectorAC.z,\n 0, // vectorToCenter DOT normal = 0 (ensure normal is perp to the plane of the 3 points)\n 0.5 * ab2, // vectorToCenter DOT vectorAB = ab2 / 2 (ensure the projection of vectorToCenter on AB bisects AB)\n 0.5 * ac2, // vectorToCenter DOT vectorAC = ac2 / 2 (ensure the projection of vectorToCenter on AC bisects AC)\n );\n if (vectorToCenter) { // i.e., the negative of vectorX\n const center = Point3d.create(pointA.x, pointA.y, pointA.z).plus(vectorToCenter);\n const vectorX = Vector3d.createStartEnd(center, pointA);\n const vectorY = Vector3d.createRotateVectorAroundVector(vectorX, normal, Angle.createDegrees(90));\n if (vectorY) {\n const vectorCenterToC = Vector3d.createStartEnd(center, pointC);\n const sweepAngle = vectorX.signedAngleTo(vectorCenterToC, normal);\n if (sweepAngle.radians < 0.0)\n sweepAngle.addMultipleOf2PiInPlace(1.0);\n return Arc3d.create(\n center, vectorX, vectorY, AngleSweep.createStartEndRadians(0.0, sweepAngle.radians), result,\n );\n }\n }\n }\n return LineString3d.create(pointA, pointB, pointC);\n }\n /** The arc has simple proportional arc length if and only if it is a circular arc. */\n public override getFractionToDistanceScale(): number | undefined {\n const radius = this.circularRadius();\n if (radius !== undefined)\n return Math.abs(radius * this._sweep.sweepRadians);\n return undefined;\n }\n /**\n * Convert a fractional position to xyz coordinates.\n * @param fraction fractional position on arc.\n * @param result optional preallocated result.\n */\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\n const radians = this._sweep.fractionToRadians(fraction);\n return this._matrix.originPlusMatrixTimesXY(this._center, Math.cos(radians), Math.sin(radians), result);\n }\n /**\n * Convert fractional arc and radial positions to xyz coordinates.\n * @param fraction fractional position on arc.\n * @param result optional preallocated result.\n */\n public fractionAndRadialFractionToPoint(arcFraction: number, radialFraction: number, result?: Point3d): Point3d {\n const radians = this._sweep.fractionToRadians(arcFraction);\n return this._matrix.originPlusMatrixTimesXY(\n this._center, radialFraction * Math.cos(radians), radialFraction * Math.sin(radians), result,\n );\n }\n /**\n * Convert a fractional position to xyz coordinates and derivative with respect to fraction.\n * @param fraction fractional position on arc.\n * @param result optional preallocated result.\n */\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\n result = this.radiansToPointAndDerivative(this._sweep.fractionToRadians(fraction), result);\n result.direction.scaleInPlace(this._sweep.sweepRadians);\n return result;\n }\n /**\n * Construct a plane with\n * * origin at the fractional position along the arc.\n * * x axis is the first derivative, i.e. tangent along the arc.\n * * y axis is the second derivative, i.e. in the plane and on the center side of the tangent.\n * If the arc is circular, the second derivative is directly towards the center.\n */\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const radians = this._sweep.fractionToRadians(fraction);\n if (!result)\n result = Plane3dByOriginAndVectors.createXYPlane();\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\n const a = this._sweep.sweepRadians;\n this._matrix.multiplyXY(-a * s, a * c, result.vectorU);\n const aa = a * a;\n this._matrix.multiplyXY(-aa * c, -aa * s, result.vectorV);\n return result;\n }\n /**\n * Evaluate the point and derivative with respect to the angle (in radians).\n * @param radians angular position.\n * @param result optional preallocated ray.\n */\n public radiansToPointAndDerivative(radians: number, result?: Ray3d): Ray3d {\n result = result ? result : Ray3d.createZero();\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\n this._matrix.multiplyXY(-s, c, result.direction);\n return result;\n }\n /**\n * Evaluate the point with respect to the angle (in radians).\n * @param radians angular position.\n * @param result optional preallocated ray.\n */\n public radiansToPoint(radians: number, result?: Point3d): Point3d {\n result = result ? result : Point3d.create();\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result);\n return result;\n }\n /**\n * Return a parametric plane with\n * * origin at arc center.\n * * vectorU from center to arc at angle (in radians).\n * * vectorV from center to arc at 90 degrees past the angle.\n * @param radians angular position.\n * @param result optional preallocated plane.\n */\n public radiansToRotatedBasis(radians: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n result = result ? result : Plane3dByOriginAndVectors.createXYPlane();\n const c = Math.cos(radians);\n const s = Math.sin(radians);\n result.origin.setFromPoint3d(this.center);\n this._matrix.multiplyXY(c, s, result.vectorU);\n this._matrix.multiplyXY(-s, c, result.vectorV);\n return result;\n }\n /**\n * Evaluate the point and derivative with respect to the angle (in radians).\n * @param theta angular position.\n * @param result optional preallocated ray.\n */\n public angleToPointAndDerivative(theta: Angle, result?: Ray3d): Ray3d {\n result = result ? result : Ray3d.createZero();\n const c = theta.cos();\n const s = theta.sin();\n this._matrix.originPlusMatrixTimesXY(this._center, c, s, result.origin);\n this._matrix.multiplyXY(-s, c, result.direction);\n return result;\n }\n /**\n * Return the start point of the arc.\n * @param result optional preallocated result.\n */\n public override startPoint(result?: Point3d): Point3d {\n return this.fractionToPoint(0.0, result);\n }\n /**\n * Return the end point of the arc.\n * @param result optional preallocated result.\n */\n public override endPoint(result?: Point3d): Point3d {\n return this.fractionToPoint(1.0, result);\n }\n /** * If this is a circular arc, return the simple length derived from radius and sweep.\n * * Otherwise (i.e. if this elliptical) fall through to CurvePrimitive base implementation which\n * Uses quadrature.\n */\n public override curveLength(): number {\n return this.curveLengthBetweenFractions(0, 1);\n }\n /**\n * Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep).\n * @deprecated in 5.0 - will not be removed until after 2026-06-13. Use correct spelling quadratureGaussCount.\n */\n public static readonly quadratureGuassCount = 5;\n /** Gauss point quadrature count for evaluating curve length. (The number of intervals is adjusted to the arc sweep). */\n public static readonly quadratureGaussCount = 5;\n /** In quadrature for arc length, use this interval (divided by quickEccentricity). */\n public static readonly quadratureIntervalAngleDegrees = 10.0;\n /**\n * * If this is a circular arc, return the simple length derived from radius and sweep.\n * * Otherwise (i.e. if this elliptical) fall through CurvePrimitive integrator.\n */\n public override curveLengthBetweenFractions(fraction0: number, fraction1: number): number {\n const simpleLength = this.getFractionToDistanceScale();\n if (simpleLength !== undefined)\n return simpleLength * Math.abs(fraction1 - fraction0);\n // fall through for true ellipse . .. stroke and accumulate quadrature with typical count . ..\n let f0 = fraction0;\n let f1 = fraction1;\n if (fraction0 > fraction1) {\n f0 = fraction1;\n f1 = fraction0;\n }\n const sweepDegrees = (f1 - f0) * this._sweep.sweepDegrees;\n let eccentricity = this.quickEccentricity();\n if (eccentricity < 0.00001)\n eccentricity = 0.00001;\n let numInterval = Math.ceil(sweepDegrees / (eccentricity * Arc3d.quadratureIntervalAngleDegrees));\n if (numInterval > 400)\n numInterval = 400;\n if (numInterval < 1)\n numInterval = 1;\n return super.curveLengthWithFixedIntervalCountQuadrature(f0, f1, numInterval, Arc3d.quadratureGaussCount);\n }\n /**\n * Return an approximate (but easy to compute) arc length.\n * The estimate is:\n * * Form 8 chords on full circle, proportionally fewer for partials (but 2 extras if less than half circle).\n * * Sum the chord lengths.\n * * For a circle, we know this crude approximation has to be increased by a factor (theta/(2*sin(theta/2))).\n * * Apply that factor.\n * * Experiments confirm that this is within 3 percent for a variety of eccentricities and arc sweeps.\n */\n public quickLength(): number {\n const totalSweep = Math.abs(this._sweep.sweepRadians);\n let numInterval = Math.ceil(4 * totalSweep / Math.PI);\n if (numInterval < 1)\n numInterval = 1;\n if (numInterval < 4)\n numInterval += 3;\n else if (numInterval < 6)\n numInterval += 2; // force extras for short arcs\n const pointA = Arc3d._workPointA;\n const pointB = Arc3d._workPointB;\n let chordSum = 0.0;\n this.fractionToPoint(0.0, pointA);\n for (let i = 1; i <= numInterval; i++) {\n this.fractionToPoint(i / numInterval, pointB);\n chordSum += pointA.distance(pointB);\n pointA.setFromPoint3d(pointB);\n }\n // The chord sum is always shorter.\n // if it is a true circular arc, the ratio of correct over sum is easy ...\n const dTheta = totalSweep / numInterval;\n const factor = dTheta / (2.0 * Math.sin(0.5 * dTheta));\n return chordSum * factor;\n }\n /**\n * * See extended comments on `CurvePrimitive.moveSignedDistanceFromFraction`.\n * * A zero length line generates `CurveSearchStatus.error`.\n * * Nonzero length line generates `CurveSearchStatus.success` or `CurveSearchStatus.stoppedAtBoundary`.\n */\n public override moveSignedDistanceFromFraction(\n startFraction: number, signedDistance: number, allowExtension: false, result?: CurveLocationDetail,\n ): CurveLocationDetail {\n if (!this.isCircular) // suppress extension !!!\n return super.moveSignedDistanceFromFractionGeneric(startFraction, signedDistance, allowExtension, result);\n const totalLength = this.curveLength();\n const signedFractionMove = Geometry.conditionalDivideFraction(signedDistance, totalLength);\n if (signedFractionMove === undefined) {\n return CurveLocationDetail.createCurveFractionPointDistanceCurveSearchStatus(\n this, startFraction, this.fractionToPoint(startFraction), 0.0, CurveSearchStatus.error);\n }\n return CurveLocationDetail.createConditionalMoveSignedDistance(\n allowExtension,\n this,\n startFraction,\n startFraction + signedFractionMove,\n signedDistance,\n result);\n }\n /**\n * Return all radian angles where the ellipse tangent is perpendicular to the vector to a spacePoint.\n * @param spacePoint point of origin of vectors to the ellipse.\n * @param _extend always true. Sweep is ignored: perpendiculars for the full ellipse are returned.\n * @param endpoints if true, force the end radians into the result.\n */\n public allPerpendicularAngles(spacePoint: Point3d, _extend: boolean = true, endpoints: boolean = false): number[] {\n const radians: number[] = [];\n const vectorQ = spacePoint.vectorTo(this.center);\n const uu = this._matrix.columnXMagnitudeSquared();\n const uv = this._matrix.columnXDotColumnY();\n const vv = this._matrix.columnYMagnitudeSquared();\n TrigPolynomial.solveUnitCircleImplicitQuadricIntersection(\n uv,\n vv - uu,\n -uv,\n this._matrix.dotColumnY(vectorQ),\n -this._matrix.dotColumnX(vectorQ),\n 0.0,\n radians,\n );\n if (endpoints) {\n radians.push(this.sweep.startRadians);\n radians.push(this.sweep.endRadians);\n }\n return radians;\n }\n /**\n * Return details of the closest point on the arc, optionally extending to full ellipse.\n * @param spacePoint search for point closest to this point.\n * @param extend if true, consider projections to the complete ellipse. If false, consider only endpoints and\n * projections within the arc sweep.\n * @param result optional preallocated result.\n */\n public override closestPoint(\n spacePoint: Point3d, extend: VariantCurveExtendParameter, result?: CurveLocationDetail,\n ): CurveLocationDetail {\n result = CurveLocationDetail.create(this, result);\n const allRadians = this.allPerpendicularAngles(spacePoint, true, true);\n let extend0 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 0);\n let extend1 = CurveExtendOptions.resolveVariantCurveExtendParameterToCurveExtendMode(extend, 1);\n // distinct extends for cyclic space are awkward ....\n if (this._sweep.isFullCircle) {\n extend0 = CurveExtendMode.None;\n extend1 = CurveExtendMode.None;\n }\n if (extend0 !== CurveExtendMode.None && extend1 !== CurveExtendMode.None) {\n allRadians.push(this._sweep.startRadians);\n allRadians.push(this._sweep.endRadians);\n }\n // hm... logically there must at least two angles there ... but if it happens return the start point ...\n const workRay = Ray3d.createZero();\n if (allRadians.length === 0) {\n result.setFR(0.0, this.radiansToPointAndDerivative(this._sweep.startRadians, workRay));\n result.a = spacePoint.distance(result.point);\n } else {\n let dMin = Number.MAX_VALUE;\n let d = 0;\n for (const radians of allRadians) {\n const fraction = CurveExtendOptions.resolveRadiansToSweepFraction(extend, radians, this.sweep);\n if (fraction !== undefined) {\n this.fractionToPointAndDerivative(fraction, workRay);\n\n d = spacePoint.distance(workRay.origin);\n if (d < dMin) {\n dMin = d;\n result.setFR(fraction, workRay);\n result.a = d;\n }\n }\n }\n }\n return result;\n }\n /** Override of [[CurvePrimitive.emitTangents]] for Arc3d. */\n public override emitTangents(\n spacePoint: Point3d, announceTangent: (tangent: CurveLocationDetail) => any, options?: TangentOptions,\n ): void {\n const centerToPoint = Vector3d.createStartEnd(this.centerRef, spacePoint);\n let centerToLocalPoint: Vector3d | undefined;\n if (options?.vectorToEye) {\n const arcToView = Matrix3d.createColumns(this.matrixRef.getColumn(0), this.matrixRef.getColumn(1), options.vectorToEye);\n centerToLocalPoint = arcToView.multiplyInverse(centerToPoint);\n } else {\n centerToLocalPoint = this.matrixRef.multiplyInverse(centerToPoint)!;\n }\n if (centerToLocalPoint === undefined)\n return;\n // centerToLocalPoint is a vector in the local coordinate system of the as-viewed arc.\n // In other words, the local arc is the unit circle.\n // alpha is the angle from the local x-axis to centerToLocalPoint.\n // beta is the nonnegative angle from centerToLocalPoint to a tangency radial.\n // Tangency angles are preserved by local <-> world transformation.\n if (centerToLocalPoint !== undefined) {\n const hypotenuseSquared = centerToLocalPoint.magnitudeSquaredXY();\n if (hypotenuseSquared >= 1.0) { // localPoint lies outside or on the unit circle...\n // ...and forms a right triangle with unit radial leg to tangent point\n const distanceToTangency = Math.sqrt(hypotenuseSquared - 1.0);\n const alpha = Math.atan2(centerToLocalPoint.y, centerToLocalPoint.x);\n const beta = Math.atan2(distanceToTangency, 1);\n const angles = Geometry.isSmallAngleRadians(beta) ? [alpha] : [alpha + beta, alpha - beta];\n for (const theta of angles) {\n const f = CurveExtendOptions.resolveRadiansToValidSweepFraction(options?.extend ?? false, theta, this.sweep);\n if (f.isValid) {\n const tangent = CurveLocationDetail.createCurveFractionPoint(this, f.fraction, this.fractionToPoint(f.fraction));\n announceTangent(tangent);\n }\n }\n }\n }\n }\n /** Reverse the sweep of the arc. */\n public reverseInPlace(): void {\n this._sweep.reverseInPlace();\n }\n /**\n * Apply a transform to the arc basis vectors.\n * * nonuniform (i.e. skewing) transforms are allowed.\n * * The transformed vector0 and vector90 are NOT squared up as major minor axes (this is a good feature).\n */\n public tryTransformInPlace(transform: Transform): boolean {\n this._center = transform.multiplyPoint3d(this._center, this._center);\n this._matrix = transform.matrix.multiplyMatrixMatrix(this._matrix, this._matrix);\n // force re-normalization of columnZ.\n this.setVector0Vector90(this._matrix.columnX(), this._matrix.columnY());\n return true;\n }\n /** Return true if the ellipse center and basis vectors are in the plane. */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n const normal = plane.getNormalRef();\n // The ellipse vectors are full-length -- true distance comparisons say things.\n return Geometry.isSmallMetricDistance(plane.altitude(this._center))\n && Geometry.isSmallMetricDistance(this._matrix.dotColumnX(normal))\n && Geometry.isSmallMetricDistance(this._matrix.dotColumnY(normal));\n }\n /** Return true if the vector0 and vector90 are of equal length and perpendicular. */\n public get isCircular(): boolean {\n const axx = this._matrix.columnXMagnitudeSquared();\n const ayy = this._matrix.columnYMagnitudeSquared();\n const axy = this._matrix.columnXDotColumnY();\n return Angle.isPerpendicularDotSet(axx, ayy, axy) && Geometry.isSameCoordinateSquared(axx, ayy);\n }\n /** Return radius if the vector0 and vector90 are of equal length and perpendicular. Ignores z. */\n public circularRadiusXY(): number | undefined {\n const ux = this._matrix.at(0, 0);\n const uy = this._matrix.at(1, 0);\n const vx = this._matrix.at(0, 1);\n const vy = this._matrix.at(1, 1);\n const dotUU = Geometry.dotProductXYXY(ux, uy, ux, uy);\n const dotVV = Geometry.dotProductXYXY(vx, vy, vx, vy);\n const dotUV = Geometry.dotProductXYXY(ux, uy, vx, vy);\n if (Angle.isPerpendicularDotSet(dotUU, dotVV, dotUV) && Geometry.isSameCoordinateSquared(dotUU, dotVV))\n return Geometry.hypotenuseXY(ux, uy);\n return undefined;\n }\n /** If the arc is circular, return its radius. Otherwise return undefined. */\n public circularRadius(): number | undefined {\n return this.isCircular ? this._matrix.columnXMagnitude() : undefined;\n }\n\n /** Return the larger length of the two defining vectors. */\n public maxVectorLength(): number {\n return Math.max(this._matrix.columnXMagnitude(), this._matrix.columnYMagnitude());\n }\n /**\n * Compute intersections with a plane.\n * @param plane plane to intersect.\n * @param result array of locations on the curve.\n */\n public override appendPlaneIntersectionPoints(plane: PlaneAltitudeEvaluator, result: CurveLocationDetail[]): number {\n const constCoff = plane.altitude(this._center);\n const coffs = this._matrix.coffs;\n const cosCoff = plane.velocityXYZ(coffs[0], coffs[3], coffs[6]);\n const sinCoff = plane.velocityXYZ(coffs[1], coffs[4], coffs[7]);\n const trigPoints = Geometry.solveTrigForm(constCoff, cosCoff, sinCoff);\n let numIntersection = 0;\n if (trigPoints !== undefined) {\n numIntersection = trigPoints.length;\n let xy;\n for (xy of trigPoints) {\n const radians = Math.atan2(xy.y, xy.x);\n const fraction = this._sweep.radiansToPositivePeriodicFraction(radians);\n const detail = CurveLocationDetail.createCurveFractionPoint(this, fraction, this.fractionToPoint(fraction));\n detail.intervalRole = CurveIntervalRole.isolated;\n if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._sweep.startRadians))\n detail.intervalRole = CurveIntervalRole.isolatedAtVertex;\n else if (Angle.isAlmostEqualRadiansAllowPeriodShift(radians, this._sweep.endRadians))\n detail.intervalRole = CurveIntervalRole.isolatedAtVertex;\n result.push(detail);\n }\n }\n return numIntersection;\n }\n /**\n * Extend a range to include the range of the arc.\n * @param range range being extended.\n * @param transform optional transform to apply to the arc.\n */\n public extendRange(range: Range3d, transform?: Transform): void {\n this.extendRangeInSweep(range, this._sweep, transform);\n }\n /**\n * Extend a range to include the range of the arc, using specified range in place of the arc range.\n * @param range range being extended.\n * @param transform optional transform to apply to the arc.\n */\n public extendRangeInSweep(range: Range3d, sweep: AngleSweep, transform?: Transform): void {\n const trigForm = new SineCosinePolynomial(0, 0, 0);\n const center = this._center.clone(Arc3d._workPointA);\n const vectorU = this._matrix.columnX(Arc3d._workVectorU);\n const vectorV = this._matrix.columnY(Arc3d._workVectorV);\n if (transform) {\n transform.multiplyPoint3d(center, center);\n transform.multiplyVector(vectorU, vectorU);\n transform.multiplyVector(vectorV, vectorV);\n }\n const lowPoint = Arc3d._workPointB;\n const highPoint = Arc3d._workPointC;\n const range1 = Range1d.createNull();\n for (let i = 0; i < 3; i++) {\n trigForm.set(center.at(i), vectorU.at(i), vectorV.at(i));\n trigForm.rangeInSweep(sweep, range1);\n lowPoint.setAt(i, range1.low);\n highPoint.setAt(i, range1.high);\n }\n range.extend(lowPoint);\n range.extend(highPoint);\n }\n /**\n * Returns a (high accuracy) range of the curve between fractional positions.\n * * Default implementation returns teh range of the curve from clonePartialCurve.\n */\n public override rangeBetweenFractions(fraction0: number, fraction1: number, transform?: Transform): Range3d {\n const sweep = AngleSweep.createStartEndRadians(\n this.sweep.fractionToRadians(fraction0), this.sweep.fractionToRadians(fraction1),\n );\n const range = Range3d.create();\n this.extendRangeInSweep(range, sweep, transform);\n return range;\n }\n /**\n * Set up a SineCosinePolynomial as the function c+u*cos(theta)+v*sin(theta) where\n * c,u,v are coefficients obtained by evaluating altitude and velocity relative to the plane.\n * @param plane plane for altitude calculation.\n * @param result optional result.\n * @internal\n */\n public getPlaneAltitudeSineCosinePolynomial(\n plane: PlaneAltitudeEvaluator, result?: SineCosinePolynomial,\n ): SineCosinePolynomial {\n if (!result)\n result = new SineCosinePolynomial(0, 0, 0);\n // altitude function of angle t, given plane with origin o and unit normal n:\n // A(t) = (c + u cos(t) + v sin(t)) . n = (c-o).n + u.n cos(t) + v.n sin(t)\n // Note the different functions for computing dot product against a point vs. a vector!\n result.set(plane.altitude(this._center),\n plane.velocityXYZ(this._matrix.coffs[0], this._matrix.coffs[3], this._matrix.coffs[6]),\n plane.velocityXYZ(this._matrix.coffs[1], this._matrix.coffs[4], this._matrix.coffs[7]));\n return result;\n }\n /**\n * Create a new arc which is a unit circle in the xy-plane centered at the origin.\n * @param result optional preallocated object to populate and return.\n */\n public static createUnitCircle(result?: Arc3d): Arc3d {\n return Arc3d.createRefs(undefined, undefined, undefined, result);\n }\n /**\n * Create a new arc which is parallel to the xy plane, with given center and radius and optional angle sweep.\n * @param center center of arc.\n * @param radius radius of arc.\n * @param sweep sweep limits; defaults to full circle.\n * @param result optional preallocated object to populate and return.\n */\n public static createXY(center: Point3d, radius: number, sweep?: AngleSweep, result?: Arc3d): Arc3d {\n const matrix = Matrix3d.createScale(radius, radius, 1.0, result?.matrixRef);\n if (result)\n return result.set(center, matrix, sweep);\n return Arc3d.createRefs(center.clone(), matrix, sweep?.clone());\n }\n /**\n * Create a new arc which is parallel to the xy plane, with given center and x,y radii, and optional angle sweep\n * @param center center of ellipse.\n * @param radiusA x axis radius.\n * @param radiusB y axis radius.\n * @param sweep angle sweep. Default is full circle.\n * @param result optional preallocated object to populate and return.\n */\n public static createXYEllipse(center: Point3d, radiusA: number, radiusB: number, sweep?: AngleSweep, result?: Arc3d): Arc3d {\n const matrix = Matrix3d.createScale(radiusA, radiusB, 1.0, result?.matrixRef);\n if (result)\n return result.set(center, matrix, sweep);\n return Arc3d.createRefs(center.clone(), matrix, sweep?.clone());\n }\n /**\n * Replace the arc's 0 and 90 degree vectors.\n * @param vector0 vector from center to ellipse point at 0 degrees in parameter space.\n * @param vector90 vector from center to ellipse point at 90 degrees in parameter space.\n */\n public setVector0Vector90(vector0: Vector3d, vector90: Vector3d) {\n this._matrix.setColumns(vector0, vector90,\n vector0.unitCrossProductWithDefault(vector90, 0, 0, 0), // normal will be 000 for degenerate case\n );\n }\n /**\n * Return the symmetric definition of the arc, with rigid axes and radii.\n * * The caller can send the returned data into [[createScaledXYColumns]] to construct the major-minor axis\n * version of the instance arc. This formulation of the arc has the same shape, but has perpendicular axes,\n * from which the arc's symmetry is readily apparent.\n */\n public toScaledMatrix3d(): { center: Point3d, axes: Matrix3d, r0: number, r90: number, sweep: AngleSweep } {\n const angleData = Angle.dotProductsToHalfAngleTrigValues(\n this._matrix.columnXMagnitudeSquared(),\n this._matrix.columnYMagnitudeSquared(),\n this._matrix.columnXDotColumnY(),\n true,\n );\n const vector0A = this._matrix.multiplyXY(angleData.c, angleData.s);\n const vector90A = this._matrix.multiplyXY(-angleData.s, angleData.c);\n const axes = Matrix3d.createRigidFromColumns(vector0A, vector90A, AxisOrder.XYZ);\n return {\n center: this._center.clone(),\n axes: (axes ? axes : Matrix3d.createIdentity()),\n r0: vector0A.magnitude(),\n r90: vector90A.magnitude(),\n sweep: this.sweep.cloneMinusRadians(angleData.radians),\n };\n }\n /** Return the arc definition with center, two vectors, and angle sweep. */\n public toVectors(): ArcVectors {\n return {\n center: this.center.clone(),\n vector0: this._matrix.columnX(),\n vector90: this._matrix.columnY(),\n sweep: this.sweep.clone(),\n };\n }\n /** Return the arc definition with center, two vectors, and angle sweep, optionally transformed. */\n public toTransformedVectors(\n transform?: Transform,\n ): { center: Point3d, vector0: Vector3d, vector90: Vector3d, sweep: AngleSweep } {\n return transform ? {\n center: transform.multiplyPoint3d(this._center),\n vector0: transform.multiplyVector(this._matrix.columnX()),\n vector90: transform.multiplyVector(this._matrix.columnY()),\n sweep: this.sweep.clone(),\n }\n : {\n center: this._center.clone(),\n vector0: this._matrix.columnX(),\n vector90: this._matrix.columnY(),\n sweep: this.sweep.clone(),\n };\n }\n /** Return the arc definition with center, two vectors, and angle sweep, transformed to 4d points. */\n public toTransformedPoint4d(\n matrix: Matrix4d,\n ): { center: Point4d, vector0: Point4d, vector90: Point4d, sweep: AngleSweep } {\n return {\n center: matrix.multiplyPoint3d(this._center, 1.0),\n vector0: matrix.multiplyPoint3d(this._matrix.columnX(), 0.0),\n vector90: matrix.multiplyPoint3d(this._matrix.columnY(), 0.0),\n sweep: this.sweep.clone(),\n };\n }\n /**\n * Set this arc from a json object with these values:\n * * center center point.\n * * vector0 vector from center to 0 degree point in parameter space (commonly but not always the major axis vector).\n * * vector90 vector from center to 90 degree point in parameter space (commonly but not always the minor axis vector).\n * @param json\n */\n public setFromJSON(json?: any) {\n if (json && json.center && json.vector0 && json.vector90 && json.sweep) {\n this._center.setFromJSON(json.center);\n const vector0 = Vector3d.create();\n const vector90 = Vector3d.create();\n vector0.setFromJSON(json.vector0);\n vector90.setFromJSON(json.vector90);\n this.setVector0Vector90(vector0, vector90);\n this._sweep.setFromJSON(json.sweep);\n } else {\n this._center.set(0, 0, 0);\n this._matrix.setFrom(Matrix3d.identity);\n this._sweep.setStartEndRadians();\n }\n }\n /**\n * Convert to a JSON object.\n * @return {*} [center: [], vector0:[], vector90:[], sweep []}\n */\n public toJSON(): any {\n return {\n center: this._center.toJSON(),\n sweep: this._sweep.toJSON(),\n vector0: this._matrix.columnX().toJSON(),\n vector90: this._matrix.columnY().toJSON(),\n };\n }\n /** Test if this arc is almost equal to another GeometryQuery object. */\n public override isAlmostEqual(otherGeometry: GeometryQuery, distanceTol: number = Geometry.smallMetricDistance, radianTol: number = Geometry.smallAngleRadians): boolean {\n if (otherGeometry instanceof Arc3d) {\n const other = otherGeometry;\n return this._center.isAlmostEqual(other._center, distanceTol)\n && this._matrix.isAlmostEqual(other._matrix, distanceTol)\n && this._sweep.isAlmostEqualAllowPeriodShift(other._sweep, radianTol);\n }\n return false;\n }\n /** Emit strokes to caller-supplied linestring. */\n public emitStrokes(dest: LineString3d, options?: StrokeOptions): void {\n const numStrokes = this.computeStrokeCountForOptions(options);\n dest.appendFractionalStrokePoints(this, numStrokes, 0.0, 1.0, true);\n }\n /** Emit strokes to caller-supplied handler. */\n public emitStrokableParts(handler: IStrokeHandler, options?: StrokeOptions): void {\n const numStrokes = this.computeStrokeCountForOptions(options);\n handler.startCurvePrimitive(this);\n handler.announceIntervalForUniformStepStrokes(this, numStrokes, 0.0, 1.0);\n handler.endCurvePrimitive(this);\n }\n /**\n * Return the stroke count required for given options.\n * @param options StrokeOptions that determine count.\n */\n public computeStrokeCountForOptions(options?: StrokeOptions): number {\n let numStroke;\n if (options) {\n const rMax = this.maxVectorLength();\n numStroke = options.applyTolerancesToArc(rMax, this._sweep.sweepRadians);\n } else {\n numStroke = StrokeOptions.applyAngleTol(undefined, 1, this._sweep.sweepRadians);\n }\n return numStroke;\n }\n /** Second step of double dispatch: call `handler.handleArc3d(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleArc3d(this);\n }\n /**\n * Return (if possible) an arc which is a portion of this curve.\n * @param fractionA start fraction.\n * @param fractionB end fraction.\n */\n public override clonePartialCurve(fractionA: number, fractionB: number): Arc3d {\n if (fractionB < fractionA) {\n const arcA = this.clonePartialCurve(fractionB, fractionA);\n arcA.reverseInPlace();\n return arcA;\n }\n const arcB = this.clone();\n arcB.sweep.setStartEndRadians(\n this.sweep.fractionToRadians(fractionA),\n this.sweep.fractionToRadians(fractionB),\n );\n return arcB;\n }\n /**\n * Return an arc whose basis vectors are rotated by given angle within the current basis space.\n * * The returned arc will have `vector0 = this.vector0 * cos(theta) + this.vector90 * sin(theta)`.\n * * The returned arc has the same shape as the instance.\n * * In other words, the arc's sweep is adjusted so that all fractional parameters evaluate to the same points.\n * * Specifically, theta is subtracted from the original start and end angles.\n * @param theta the angle (in the input arc space) which is to become the 0-degree point in the new arc.\n */\n public cloneInRotatedBasis(theta: Angle): Arc3d {\n const c = theta.cos();\n const s = theta.sin();\n const vector0 = this._matrix.multiplyXY(c, s);\n const vector90 = this._matrix.multiplyXY(-s, c);\n const newSweep = AngleSweep.createStartEndRadians(\n this._sweep.startRadians - theta.radians, this._sweep.endRadians - theta.radians,\n );\n const arcB = Arc3d.create(this._center.clone(), vector0, vector90, newSweep);\n return arcB;\n }\n /**\n * Return a cloned arc with basis rotated to align with the global axes. The arc's shape is unchanged.\n * * This method is most useful when the instance is an xy-circular arc, for then the aligned arc's stored sweep\n * angles can be understood as being measured from the global positive x-axis to the arc's start/end. This is *not*\n * the case for xy-elliptical arcs: the parameter angle difference between two points on an ellipse is in general\n * not the same as the angle measured between their radials.\n * * For an xy instance, the output arc will have:\n * * vector0 is in the same direction as the positive x-axis\n * * perpendicularVector is in the same direction as the positive z-axis\n * * For a general instance, the output arc will have:\n * * vector0 is in the same direction as the projection of the positive x-axis vector onto the arc plane\n * * perpendicularVector lies in the halfspace z >= 0\n * @returns cloned arc, or undefined (if the instance normal is parallel to the x-axis, or its matrix is singular)\n */\n public cloneAxisAligned(): Arc3d | undefined {\n const plane = Plane3dByOriginAndUnitNormal.create(this.center, this.perpendicularVector.crossProduct(Vector3d.unitX()));\n if (!plane)\n return undefined;\n const axisPts: CurveLocationDetail[] = [];\n if (2 !== this.appendPlaneIntersectionPoints(plane, axisPts))\n return undefined;\n const iAxisPt = plane.getNormalRef().dotProduct(this.perpendicularVector.crossProductStartEnd(this.center, axisPts[0].point)) > 0.0 ? 0 : 1;\n const toUnitX = this.sweep.fractionToAngle(axisPts[iAxisPt].fraction);\n const arc1 = this.cloneInRotatedBasis(toUnitX); // rotate in arc's plane\n if (this.perpendicularVector.dotProduct(Vector3d.unitZ()) < -Geometry.smallAngleRadians) {\n if (this.matrixRef.isSingular())\n return undefined;\n const flip = Matrix3d.createRowValues(1, 0, 0, 0, -1, 0, 0, 0, -1); // rotate 180 degrees around arc's local x-axis\n arc1.matrixRef.multiplyMatrixMatrix(flip, arc1.matrixRef);\n arc1.sweep.setStartEndDegrees(-arc1.sweep.startDegrees, -arc1.sweep.endDegrees); // rotation alone is insufficient to flip\n }\n return arc1;\n }\n /**\n * Find intervals of this CurvePrimitive that are interior to a clipper.\n * @param clipper clip structure (e.g.clip planes).\n * @param announce (optional) function to be called announcing fractional intervals\n * `announce(fraction0, fraction1, curvePrimitive)`.\n * @returns true if any \"in\" segments are announced.\n */\n public override announceClipIntervals(clipper: Clipper, announce?: AnnounceNumberNumberCurvePrimitive): boolean {\n return clipper.announceClippedArcIntervals(this, announce);\n }\n /** Compute the center and vectors of another arc as local coordinates within this arc's frame. */\n public otherArcAsLocalVectors(other: Arc3d): ArcVectors | undefined {\n const otherOrigin = this._matrix.multiplyInverseXYZAsPoint3d(\n other.center.x - this.center.x,\n other.center.y - this.center.y,\n other.center.z - this.center.z,\n );\n const otherVector0 = this._matrix.multiplyInverse(other.vector0);\n const otherVector90 = this._matrix.multiplyInverse(other.vector90);\n if (otherOrigin && otherVector0 && otherVector90) {\n return {\n center: otherOrigin,\n vector0: otherVector0,\n vector90: otherVector90,\n sweep: this.sweep.clone(),\n };\n }\n return undefined;\n }\n /**\n * Determine an arc \"at a point of inflection\" of a point sequence.\n * * Return the arc along with the fractional positions of the tangency points.\n * * In the returned object:\n * * `arc` is the (bounded) arc.\n * * `fraction10` is the tangency point's position as an interpolating fraction of the line segment from\n * `point1` (backwards) to `point0`.\n * * `fraction12` is the tangency point's position as an interpolating fraction of the line segment from\n * `point1` (forward) to `point2`.\n * * `point` is the `point1` input.\n * * If unable to construct the arc:\n * * `point` is the `point1` input.\n * * both fractions are zero.\n * * `arc` is undefined.\n * @param point0 first point of path (the point before the point of inflection).\n * @param point1 second point of path (the point of inflection).\n * @param point2 third point of path (the point after the point of inflection).\n * @param radius arc radius.\n */\n public static createFilletArc(point0: Point3d, point1: Point3d, point2: Point3d, radius: number): ArcBlendData {\n const vector10 = Vector3d.createStartEnd(point1, point0);\n const vector12 = Vector3d.createStartEnd(point1, point2);\n const d10 = vector10.magnitude();\n const d12 = vector12.magnitude();\n if (vector10.normalizeInPlace() && vector12.normalizeInPlace()) {\n const bisector = vector10.plus(vector12);\n if (bisector.normalizeInPlace()) {\n // const theta = vector12.angleTo(bisector);\n // vector10, vector12, and bisector are UNIT vectors\n // bisector splits the angle between vector10 and vector12\n const perpendicular = vector12.minus(vector10);\n const perpendicularMagnitude = perpendicular.magnitude(); // == 2 * sin(theta)\n const sinTheta = 0.5 * perpendicularMagnitude;\n if (!Geometry.isSmallAngleRadians(sinTheta)) { // for small theta, sinTheta is almost equal to theta\n const cosTheta = Math.sqrt(1 - sinTheta * sinTheta);\n const tanTheta = sinTheta / cosTheta;\n const alphaRadians = Math.acos(sinTheta);\n const distanceToCenter = radius / sinTheta;\n const distanceToTangency = radius / tanTheta;\n const f10 = distanceToTangency / d10;\n const f12 = distanceToTangency / d12;\n const center = point1.plusScaled(bisector, distanceToCenter);\n bisector.scaleInPlace(-radius);\n perpendicular.scaleInPlace(radius / perpendicularMagnitude);\n const arc02 = Arc3d.create(\n center, bisector, perpendicular, AngleSweep.createStartEndRadians(-alphaRadians, alphaRadians),\n );\n return { arc: arc02, fraction10: f10, fraction12: f12, point: point1.clone() };\n }\n }\n }\n return { fraction10: 0.0, fraction12: 0.0, point: point1.clone() };\n }\n /** Scale the vector0 and vector90 vectors by `scaleFactor`. */\n public scaleAboutCenterInPlace(scaleFactor: number) {\n this._matrix.scaleColumnsInPlace(scaleFactor, scaleFactor, 1.0);\n }\n /** Return the (signed) area between (a fractional portion of) the arc and the chord between those points. */\n public areaToChordXY(fraction0: number, fraction1: number): number {\n const detJ = Geometry.crossProductXYXY(\n this._matrix.coffs[0], this._matrix.coffs[3],\n this._matrix.coffs[1], this._matrix.coffs[4],\n ); // area scale factor from local to world\n const radians0 = this._sweep.fractionToRadians(fraction0);\n const radians1 = this._sweep.fractionToRadians(fraction1);\n const alpha = 0.5 * (radians1 - radians0); // signed area of local sector\n // Compute signed area of local triangle (\"wedge\") formed by origin and arc endpoints p0, p1:\n // (p0 x p1)/2 = (cos(r0)sin(r1)-cos(r1)sin(r0))/2 = sin(r1-r0)/2 = cos(a)sin(a)\n const wedgeArea = Math.cos(alpha) * Math.sin(alpha);\n return (alpha - wedgeArea) * detJ; // to world\n }\n /**\n * Construct an offset of the instance curve as viewed in the xy-plane (ignoring z).\n * @param offsetDistanceOrOptions offset distance (positive to left of the instance curve), or options object.\n */\n public override constructOffsetXY(\n offsetDistanceOrOptions: number | OffsetOptions,\n ): CurvePrimitive | CurvePrimitive[] | undefined {\n const options = OffsetOptions.create(offsetDistanceOrOptions);\n if (this.isCircular || options.preserveEllipticalArcs) {\n const arcXY = this.cloneAtZ();\n const sign = arcXY.sweep.sweepRadians * arcXY.matrixRef.coffs[8] >= 0.0 ? 1.0 : -1.0;\n const r0 = arcXY.matrixRef.columnXMagnitude();\n const r0new = r0 - sign * options.leftOffsetDistance;\n const r90 = this.isCircular ? r0 : arcXY.matrixRef.columnYMagnitude();\n const r90new = this.isCircular ? r0new : r90 - sign * options.leftOffsetDistance;\n if (\n !Geometry.isSmallMetricDistance(r0new)\n && (r0 * r0new > 0.0)\n && (this.isCircular || (!Geometry.isSmallMetricDistance(r90new) && (r90 * r90new > 0.0)))\n ) {\n const factor0 = r0new / r0;\n const factor90 = this.isCircular ? factor0 : r90new / r90;\n arcXY.matrixRef.scaleColumnsInPlace(factor0, factor90, 1.0);\n return arcXY;\n }\n return undefined; // zero radius\n }\n // default impl\n const handler = new CurveOffsetXYHandler(this, options.leftOffsetDistance);\n this.emitStrokableParts(handler, options.strokeOptions);\n return handler.claimResult();\n }\n /**\n * Project instance geometry (via dispatch) onto the given ray, and return the extreme fractional parameters of projection.\n * @param ray ray onto which the instance is projected. A `Vector3d` is treated as a `Ray3d` with zero origin.\n * @param lowHigh optional receiver for output.\n * @returns range of fractional projection parameters onto the ray, where 0.0 is start of the ray and 1.0 is the end of the ray.\n */\n public override projectedParameterRange(ray: Vector3d | Ray3d, lowHigh?: Range1d): Range1d | undefined {\n return PlaneAltitudeRangeContext.findExtremeFractionsAlongDirection(this, ray, lowHigh);\n }\n /**\n * Construct a circular arc chain approximation to the instance elliptical arc.\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/ArcApproximationGeneral and\n * https://www.itwinjs.org/sandbox/SaeedTorabi/ArcApproximation\n * @param options bundle of options for sampling an elliptical arc (use default options if undefined).\n * @returns the approximating curve chain, the circular instance, or undefined if construction fails.\n */\n public constructCircularArcChainApproximation(options?: EllipticalArcApproximationOptions): CurveChain | Arc3d | undefined {\n if (!options)\n options = EllipticalArcApproximationOptions.create();\n const context = EllipticalArcApproximationContext.create(this);\n const result = context.constructCircularArcChainApproximation(options);\n if (!result && this.isCircular)\n return (this.sweep.isFullCircle && options.forcePath) ? Path.create(this) : this;\n return result;\n }\n /**\n * Compute the intersection of the tangent vectors at two fractional parameters along the arc.\n * * In the civil design context of filleting a line string, the default values yield a fillet arc's \"point of\n * intersection\", aka _PI_. This point is the line string vertex that was rounded by the fillet arc placed\n * between the vertex's adjacent segments. In other words, the original line string vertices can be recovered\n * from the fillets with this method.\n * @param f0 fractional parameter of one tangent. Default is 0 (the arc's start tangent).\n * @param f1 fractional parameter of the other tangent. Default is 1 (the arc's end tangent).\n * @param result optional point to populate and return.\n * @returns intersection point, or undefined if tangents are zero or parallel.\n */\n public computeTangentIntersection(f0: number = 0, f1: number = 1, result?: Point3d): Point3d | undefined {\n const localRay0 = this.fractionToPointAndDerivative(f0, Arc3d._workRay0);\n const localRay1 = this.fractionToPointAndDerivative(f1, Arc3d._workRay1);\n if (localRay0.direction.isParallelTo(localRay1.direction, true, true))\n return undefined;\n const worldRay0 = localRay0.clone(Arc3d._workRay2);\n if (this.matrixRef.multiplyInverseXYZAsPoint3d(localRay0.origin.x, localRay0.origin.y, localRay0.origin.z, localRay0.origin)\n && this.matrixRef.multiplyInverseXYZAsPoint3d(localRay1.origin.x, localRay1.origin.y, localRay1.origin.z, localRay1.origin)\n && this.matrixRef.multiplyInverseXYZAsVector3d(localRay0.direction.x, localRay0.direction.y, localRay0.direction.z, localRay0.direction)\n && this.matrixRef.multiplyInverseXYZAsVector3d(localRay1.direction.x, localRay1.direction.y, localRay1.direction.z, localRay1.direction)\n ) { // conversion to local coordinates allows us to intersect without z\n const intersection = SmallSystem.lineXYUVTransverseIntersection(localRay0.origin, localRay0.direction, localRay1.origin, localRay1.direction);\n if (intersection)\n return worldRay0.fractionToPoint(intersection.x, result); // intersection parameter is an affine invariant\n }\n return undefined;\n }\n}\n"]}