@itwin/core-geometry 5.2.0-dev.8 → 5.2.1
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.
- package/CHANGELOG.md +46 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.d.ts +30 -10
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +74 -10
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/cjs/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js +21 -5
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts +3 -3
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +6 -6
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts +2 -2
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +4 -6
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/cjs/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js +17 -7
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +19 -6
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +17 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.d.ts +14 -1
- package/lib/cjs/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +21 -3
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.d.ts +27 -17
- package/lib/cjs/curve/Arc3d.d.ts.map +1 -1
- package/lib/cjs/curve/Arc3d.js +66 -42
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts +1 -0
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +1 -0
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +8 -7
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.d.ts +48 -1
- package/lib/cjs/curve/CurveOps.d.ts.map +1 -1
- package/lib/cjs/curve/CurveOps.js +94 -3
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +4 -4
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +8 -8
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts +51 -12
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +106 -83
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts +49 -25
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +79 -39
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js +8 -8
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +104 -93
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts +4 -4
- package/lib/cjs/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js +21 -18
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +30 -50
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +6 -2
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts +5 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js +0 -3
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.d.ts +6 -2
- package/lib/cjs/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js +12 -3
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/cjs/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js +14 -18
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +2 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +2 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +9 -16
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts +18 -2
- package/lib/cjs/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js +37 -4
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +1 -0
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/cjs/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +18 -2
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +53 -26
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +20 -4
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.d.ts +34 -32
- package/lib/cjs/geometry3d/Range.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Range.js +28 -21
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.d.ts +16 -6
- package/lib/cjs/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js +28 -4
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +3 -4
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +1 -1
- package/lib/cjs/geometry3d/Transform.js +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts +12 -1
- package/lib/cjs/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js +17 -2
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.d.ts +16 -0
- package/lib/cjs/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js +26 -0
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js +5 -9
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +2 -2
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.d.ts +13 -7
- package/lib/cjs/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js +13 -7
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts +1 -3
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +2 -6
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +59 -8
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.d.ts +2 -0
- package/lib/cjs/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js +7 -3
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js +8 -10
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts +2 -1
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js +2 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +38 -12
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +91 -23
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +43 -39
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.d.ts +22 -11
- package/lib/cjs/topology/Merging.d.ts.map +1 -1
- package/lib/cjs/topology/Merging.js +31 -21
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +13 -11
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +40 -36
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.d.ts +195 -0
- package/lib/cjs/topology/Voronoi.d.ts.map +1 -0
- package/lib/cjs/topology/Voronoi.js +700 -0
- package/lib/cjs/topology/Voronoi.js.map +1 -0
- package/lib/cjs/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/cjs/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.d.ts +30 -10
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +74 -10
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.d.ts +19 -6
- package/lib/esm/bspline/AkimaCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js +21 -5
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts +3 -3
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +6 -6
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts +2 -2
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +4 -6
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.d.ts +27 -17
- package/lib/esm/bspline/InterpolationCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js +17 -7
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +19 -6
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +17 -2
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.d.ts +14 -1
- package/lib/esm/clipping/ClipUtils.d.ts.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +21 -3
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +14 -11
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +23 -16
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts +20 -3
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.d.ts.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js +22 -5
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.d.ts +27 -17
- package/lib/esm/curve/Arc3d.d.ts.map +1 -1
- package/lib/esm/curve/Arc3d.js +66 -42
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts +1 -0
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +1 -0
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +8 -7
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.d.ts +48 -1
- package/lib/esm/curve/CurveOps.d.ts.map +1 -1
- package/lib/esm/curve/CurveOps.js +95 -4
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +4 -4
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +8 -8
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js +3 -3
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts +51 -12
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +106 -83
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts +49 -25
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +77 -37
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js +8 -8
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +1 -0
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +104 -93
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts +4 -4
- package/lib/esm/curve/internalContexts/MultiChainCollector.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js +21 -18
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +30 -50
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +6 -2
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +2 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +6 -2
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts +5 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js +0 -3
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.d.ts +6 -2
- package/lib/esm/geometry3d/AngleSweep.d.ts.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js +12 -3
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts +2 -1
- package/lib/esm/geometry3d/FrameBuilder.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js +14 -18
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +2 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +2 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +2 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +9 -16
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +3 -3
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.d.ts +18 -2
- package/lib/esm/geometry3d/Point2dVector2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js +37 -4
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +1 -0
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.d.ts +8 -0
- package/lib/esm/geometry3d/PointStreaming.d.ts.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +18 -2
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +18 -9
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +53 -26
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts +8 -2
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +10 -4
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts +14 -3
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +20 -4
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.d.ts +34 -32
- package/lib/esm/geometry3d/Range.d.ts.map +1 -1
- package/lib/esm/geometry3d/Range.js +28 -21
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.d.ts +16 -6
- package/lib/esm/geometry3d/Ray2d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js +28 -4
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +3 -4
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +1 -1
- package/lib/esm/geometry3d/Transform.js +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.d.ts +12 -1
- package/lib/esm/geometry3d/XYZProps.d.ts.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js +16 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.d.ts +16 -0
- package/lib/esm/geometry4d/Matrix4d.d.ts.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js +26 -0
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.d.ts.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js +5 -9
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +2 -2
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.d.ts +13 -7
- package/lib/esm/numerics/SmallSystem.d.ts.map +1 -1
- package/lib/esm/numerics/SmallSystem.js +13 -7
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts +1 -3
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +2 -6
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +25 -6
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +59 -8
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.d.ts +2 -0
- package/lib/esm/polyface/PolyfaceData.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js +7 -3
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js +8 -10
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts +8 -5
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js +8 -4
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts +3 -3
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +4 -2
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +9 -12
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts +8 -3
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +13 -6
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +2 -1
- package/lib/esm/serialization/GeometrySamples.d.ts.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js +2 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +38 -12
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +92 -24
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts +5 -4
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js +6 -5
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts +20 -11
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +43 -39
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.d.ts +22 -11
- package/lib/esm/topology/Merging.d.ts.map +1 -1
- package/lib/esm/topology/Merging.js +32 -22
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +13 -11
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +40 -36
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.d.ts +195 -0
- package/lib/esm/topology/Voronoi.d.ts.map +1 -0
- package/lib/esm/topology/Voronoi.js +696 -0
- package/lib/esm/topology/Voronoi.js.map +1 -0
- package/lib/esm/topology/XYParitySearchContext.d.ts +1 -1
- package/lib/esm/topology/XYParitySearchContext.d.ts.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EllipticalArcApproximationContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/EllipticalArcApproximationContext.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\nimport { assert, OrderedComparator, OrderedSet, SortedArray } from \"@itwin/core-bentley\";\nimport { Geometry } from \"../../Geometry\";\nimport { Angle } from \"../../geometry3d/Angle\";\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\nimport { Range1d } from \"../../geometry3d/Range\";\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\nimport { Transform } from \"../../geometry3d/Transform\";\nimport { Arc3d, EllipticalArcApproximationOptions, EllipticalArcSampleMethod } from \"../Arc3d\";\nimport { CurveChain } from \"../CurveCollection\";\nimport { CurveLocationDetailPair } from \"../CurveLocationDetail\";\nimport { Loop } from \"../Loop\";\nimport { Path } from \"../Path\";\nimport { CurveCurveCloseApproachXY } from \"./CurveCurveCloseApproachXY\";\n\n/** @packageDocumentation\n * @module Curve\n */\n\n/**\n * Comparison callback to sort fractions in increasing order with suitable tolerance for equality.\n * @internal\n */\nfunction compareFractionsIncreasing(f0: number, f1: number): number {\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\n return 0;\n return f0 < f1 ? -1 : 1;\n};\n/**\n * Comparison callback to sort fractions in decreasing order with suitable tolerance for equality.\n * @internal\n */\nfunction compareFractionsDecreasing(f0: number, f1: number): number {\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\n return 0;\n return f0 < f1 ? 1 : -1;\n};\n\n/**\n * Structured data carrier used by the elliptical arc sampler.\n * @internal\n*/\nexport class QuadrantFractions {\n private _quadrant: 1 | 2 | 3 | 4;\n private _fractions: number[];\n private _interpolateStartTangent: boolean;\n private _interpolateEndTangent: boolean;\n private _averageAdded: boolean;\n private constructor(\n quadrant: 1 | 2 | 3 | 4, fractions: number[], interpolateStartTangent: boolean, interpolateEndTangent: boolean,\n ) {\n this._quadrant = quadrant;\n this._fractions = fractions;\n this._interpolateStartTangent = interpolateStartTangent;\n this._interpolateEndTangent = interpolateEndTangent;\n this._averageAdded = false;\n }\n /** Constructor, captures the array. */\n public static create(\n quadrant: 1 | 2 | 3 | 4,\n fractions: number[] = [],\n interpolateStartTangent: boolean = true,\n interpolateEndTangent: boolean = true,\n ): QuadrantFractions {\n return new QuadrantFractions(quadrant, fractions, interpolateStartTangent, interpolateEndTangent);\n }\n /**\n * Quadrant of the full ellipse containing the samples.\n * * Quadrants are labeled proceeding in counterclockwise angular sweeps of length pi/2 starting at vector0.\n * * For example, Quadrant 1 starts at vector0 and ends at vector90, and Quadrant 4 ends at vector0.\n * * For purposes of angle classification, quadrants are half-open intervals, closed at their start angle,\n * as determined by the ellipse's sweep direction.\n */\n public get quadrant(): 1 | 2 | 3 | 4 {\n return this._quadrant;\n }\n /** Sample locations in this quadrant of the elliptical arc, as fractions of its sweep. */\n public get fractions(): number[] {\n return this._fractions;\n }\n public set fractions(f: number[]) {\n this._fractions = f;\n }\n /**\n * Whether to interpolate the elliptical arc tangent at the first fraction.\n * * If true (default), the first approximating arc is computed from the first two fractions and approximates the\n * elliptical arc between the first and second fractions, interpolating both point and tangent at the first fraction,\n * and point at the second fraction.\n * * If false, the first approximating arc is computed from the first three fractions and approximates the\n * elliptical arc between the second and third fractions, where it interpolates position only.\n */\n public get interpolateStartTangent(): boolean {\n return this._interpolateStartTangent;\n }\n public set interpolateStartTangent(interpolate: boolean) {\n this._interpolateStartTangent = interpolate;\n }\n /**\n * Whether to interpolate the elliptical arc tangent at the last fraction.\n * * If true (default), the last approximating arc is computed from the last two fractions and approximates the\n * elliptical arc between the penultimate and last fractions, interpolating point at the penultimate fraction, and\n * both point and tangent at the last fraction.\n * * If false, the last approximating arc is computed from the last three fractions and approximates the\n * elliptical arc between the penultimate and last fractions, where it interpolates position only.\n */\n public get interpolateEndTangent(): boolean {\n return this._interpolateEndTangent;\n }\n public set interpolateEndTangent(interpolate: boolean) {\n this._interpolateEndTangent = interpolate;\n }\n /**\n * Whether the average of the first and last fractions was added to satisfy a minimum fractions array length of three.\n * * There are always at least two fractions per quadrant, but three are needed to interpolate both end tangents\n * with circular arcs.\n * * This flag is set if a given sample method/arc yielded only two fractions, so their average was inserted in the\n * fractions array to meet this minimum three-sample requirement.\n */\n public get averageAdded(): boolean {\n return this._fractions.length === 3 ? this._averageAdded : false;\n }\n public set averageAdded(added: boolean) {\n this._averageAdded = added;\n }\n /**\n * Compute quadrant data for the given angles.\n * @param radians0 first radian angle.\n * @param radians1 second radian angle.\n * @return quadrant number and start/end radian angles for the quadrant that contains both input angles, or\n * `undefined` if no such quadrant.\n * * The returned sweep is always counterclockwise: angle0 < angle1.\n */\n public static getQuadrantRadians(\n radians0: number, radians1: number,\n ): { quadrant: 1 | 2 | 3 | 4, angle0: number, angle1: number } | undefined {\n if (AngleSweep.isRadiansInStartEnd(radians0, 0, Angle.piOver2Radians)\n && AngleSweep.isRadiansInStartEnd(radians1, 0, Angle.piOver2Radians))\n return { quadrant: 1, angle0: 0, angle1: Angle.piOver2Radians };\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piOver2Radians, Angle.piRadians)\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piOver2Radians, Angle.piRadians))\n return { quadrant: 2, angle0: Angle.piOver2Radians, angle1: Angle.piRadians };\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piRadians, Angle.pi3Over2Radians)\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piRadians, Angle.pi3Over2Radians))\n return { quadrant: 3, angle0: Angle.piRadians, angle1: Angle.pi3Over2Radians };\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.pi3Over2Radians, Angle.pi2Radians)\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.pi3Over2Radians, Angle.pi2Radians))\n return { quadrant: 4, angle0: Angle.pi3Over2Radians, angle1: Angle.pi2Radians };\n return undefined;\n }\n /** Compute the fractional range of Quadrant 1 for the given full sweep. */\n public static getQ1FractionalRange(fullSweep: AngleSweep): Range1d {\n const angle0 = 0;\n const angle90 = 0.5 * Math.PI;\n let f0 = fullSweep.radiansToSignedPeriodicFraction(angle0);\n let f1 = fullSweep.radiansToSignedPeriodicFraction(angle90);\n if (!fullSweep.isCCW)\n [f0, f1] = [f1, f0];\n if (f1 < f0)\n f1 += 1;\n return Range1d.createXX(f0, f1);\n }\n /** Reverse the fractions array and flags. */\n public reverse(): void {\n this._fractions.reverse();\n [this._interpolateStartTangent, this._interpolateEndTangent] = [this._interpolateEndTangent, this._interpolateStartTangent];\n }\n};\n\n/**\n * Base class specifying callbacks for processing samples of an elliptical arc.\n * @internal\n */\nclass QuadrantFractionsProcessor {\n /**\n * Announce the beginning of processing for quadrant `q`.\n * @param _reversed whether `q.reverse()` was invoked before this call for symmetry reasons. If so, arcs will be\n * announced in the opposite order and with the opposite orientation.\n * @return whether to process `q`.\n */\n public announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean { return true; }\n /**\n * Retrieve the fraction preceding the input fraction in process order.\n * * This optional callback facilitates processors like [[AdaptiveSubdivisionQ1ErrorProcessor]] whose implementation\n * of [[announceArc]] depends upon the result of the previous invocation of [[announceArc]].\n * @param f0 fraction to look up.\n * @return fraction preceding f0 in process order, or undefined if no such fraction.\n */\n public getPreviousFraction?(f0: number): number | undefined;\n /**\n * Announce a circular arc approximating the elliptical arc E between the given fractions.\n * * The given fractions are different. If `announceQuadrantBegin` was invoked with `reversed === false` then\n * `fPrev < f0 < f1`; otherwise, `fPrev > f0 > f1`.\n * @param _arc circular arc that interpolates E at f0 and f1. Processor can capture `arc`; it is unused afterwards.\n * @param _fPrev fractional parameter of E used to define the 3-point parent circle through the points at `fPrev`,\n * `f0`, and `f1` from which `arc` was constructed. If undefined, `arc` was generated from the circle defined by\n * the points at `f0` and `f1` and one of their tangents.\n * @param _f0 fractional parameter of E at which point `arc` starts.\n * @param _f1 fractional parameter of E at which point `arc` ends.\n */\n public announceArc(_arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void { }\n /**\n * Announce the end of processing for quadrant `q`.\n * @param _reversed whether `q.reverse()` was invoked before processing (see [[announceQuadrantBegin]]). If so,\n * after this call `q.reverse()` is invoked again.\n */\n public announceQuadrantEnd(_q: QuadrantFractions, _reversed: boolean): void { }\n};\n\n/**\n * Processor for computing the error of a sample-based arc chain approximation.\n * @internal\n */\nclass ArcChainErrorProcessor extends QuadrantFractionsProcessor {\n private _ellipticalArc: Arc3d;\n private _maxPerpendicular: CurveLocationDetailPair | undefined;\n protected constructor(ellipticalArc: Arc3d) {\n super();\n this._ellipticalArc = ellipticalArc;\n this._maxPerpendicular = undefined;\n }\n public static create(ellipticalArc: Arc3d): ArcChainErrorProcessor {\n return new ArcChainErrorProcessor(ellipticalArc);\n }\n public get ellipticalArc(): Arc3d {\n return this._ellipticalArc;\n }\n /**\n * Compute the maximum xy-distance between an elliptical arc and its approximation.\n * * Inputs should be in horizontal plane(s), as z-coordinates are ignored.\n * @param circularArc circular arc approximant. Assumed to start and end on the elliptical arc.\n * @param ellipticalArc elliptical arc being approximated.\n * For best results, `f0` and `f1` should correspond to the start/end of `circularArc`.\n * @param f0 optional `ellipticalArc` start fraction to restrict its sweep.\n * @param f1 optional `ellipticalArc` end fraction to restrict its sweep.\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\n * For each of `detailA` (refers to `circularArc`) and `detailB` (refers to unrestricted `ellipticalArc`):\n * * `point` is the end of the perpendicular on each curve.\n * * `fraction` is the curve parameter of the point.\n * * `a` is the distance between the points.\n */\n public static computePrimitiveErrorXY(\n circularArc: Arc3d, ellipticalArc: Arc3d, f0?: number, f1?: number,\n ): CurveLocationDetailPair | undefined {\n const handler = new CurveCurveCloseApproachXY();\n handler.maxDistanceToAccept = circularArc.quickLength() / 2;\n const trimEllipse = undefined !== f0 && undefined !== f1;\n const trimmedEllipticalArc = trimEllipse ? ellipticalArc.clonePartialCurve(f0, f1) : ellipticalArc;\n // we expect only one perpendicular, not near an endpoint.\n handler.allPerpendicularsArcArcBounded(circularArc, trimmedEllipticalArc);\n let maxPerp: CurveLocationDetailPair | undefined;\n for (const perp of handler.grabPairedResults()) {\n if (Geometry.isAlmostEqualEitherNumber(perp.detailA.fraction, 0, 1, Geometry.smallFraction))\n continue; // rule out perpendiculars on circular arc ends\n if (Geometry.isAlmostEqualEitherNumber(perp.detailB.fraction, 0, 1, Geometry.smallFraction))\n continue; // rule out perpendiculars on elliptical arc ends\n const error = perp.detailA.point.distanceXY(perp.detailB.point);\n if (!maxPerp || maxPerp.detailA.a < error) {\n if (trimEllipse) { // reset ellipticalArc fraction to unrestricted range\n perp.detailB.fraction = Geometry.interpolate(f0, perp.detailB.fraction, f1);\n perp.detailB.setCurve(ellipticalArc);\n }\n perp.detailA.a = perp.detailB.a = error;\n maxPerp = perp;\n }\n }\n return maxPerp;\n }\n public get maxPerpendicular(): CurveLocationDetailPair | undefined {\n return this._maxPerpendicular;\n }\n public set maxPerpendicular(newMaxPerp: CurveLocationDetailPair) {\n this._maxPerpendicular = newMaxPerp;\n }\n /**\n * Update the chain approximation error for a given chain child that approximates the elliptical arc between the\n * given fractions.\n * * Fractional sweep [f0, f1] of the elliptical arc is the smaller of the cyclic sweeps.\n */\n public updateMaxPerpendicular(childApproximation: Arc3d, f0: number, f1: number): void {\n const childPerp = ArcChainErrorProcessor.computePrimitiveErrorXY(childApproximation, this.ellipticalArc, f0, f1);\n if (childPerp && (!this.maxPerpendicular || this.maxPerpendicular.detailA.a < childPerp.detailA.a))\n this.maxPerpendicular = childPerp;\n };\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\n this.updateMaxPerpendicular(arc, f0, f1);\n }\n}\n\n/**\n * Processor for computing an optimal refinement of a single Q1 ordered interval [f0,f1] by perturbing an interior\n * seed fraction f.\n * * Typically the caller (cf. [[AdaptiveSubdivisionQ1ErrorProcessor.announceArc]] processes a\n * QuadrantFractions `q` with `q.quadrant` = 1 until convergence. The `q.fractions` array is expected to have\n * one of two forms:\n * * [fPrev, f0, f, f1], where fPrev is from the adjacent interval (possibly just refined), or\n * * [f0, f, f1], if `q.interpolateStartTangent === true`.\n * * This processor implements a bisection algorithm that iteratively shrinks a sub-interval that brackets f,\n * starting with [f0,f1]:\n * * During processing, `announceArc` will be called twice to compute the approximation errors of the circular\n * arcs on either side of f in the current bracket.\n * * In `announceQuadrantEnd` if these two errors are almost equal, we are done refining [f0,f1]. Otherwise,\n * we move f halfway to the endpoint of the bracket that decreases the error delta, and shrink our bracket.\n * @internal\n */\nclass AdaptiveSubdivisionQ1IntervalErrorProcessor extends QuadrantFractionsProcessor {\n private _fullEllipseXY: Arc3d;\n private _f: number;\n private _bracket0: number;\n private _bracket1: number;\n private _error0: number;\n private _error1: number;\n private constructor(fullEllipseXY: Arc3d, f0: number, f: number, f1: number) {\n super();\n this._fullEllipseXY = fullEllipseXY;\n this._bracket0 = f0;\n this._f = f;\n this._bracket1 = f1;\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\n }\n public static create(fullEllipseXY: Arc3d, f0: number, f: number, f1: number): AdaptiveSubdivisionQ1IntervalErrorProcessor {\n return new AdaptiveSubdivisionQ1IntervalErrorProcessor(fullEllipseXY, f0, f, f1);\n }\n /**\n * The arc to approximate, transformed to local coordinates, and with full sweep.\n * * Local coordinates allows us to ignore z in determining approximation error.\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\n */\n public get fullEllipseXY(): Arc3d {\n return this._fullEllipseXY;\n }\n public get f(): number {\n return this._f;\n }\n public get isConverged(): boolean {\n if (Geometry.isSmallMetricDistance(this._error0 - this._error1))\n return true;\n if (Geometry.isSmallRelative(this._bracket0 - this._bracket1))\n return true;\n return false;\n }\n /** Remember the initial value of the fraction f to be perturbed. */\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\n assert(q.quadrant === 1);\n assert(!reversed); // ASSUME [bracket0, bracket1] and q.fractions have the same ordering\n // the first fraction might be an extra point for computing the first 3-pt arc\n assert(q.fractions.length === 4 || (q.fractions.length === 3 && q.interpolateStartTangent));\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\n return true;\n }\n /** Compute approximation error over the interval adjacent to f. */\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\n if (Geometry.isAlmostEqualEitherNumber(this.f, f0, f1, 0)) {\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\n if (perp) {\n if (this.f === f1)\n this._error0 = perp.detailA.a; // first arc error\n else // f === f0\n this._error1 = perp.detailA.a; // second arc error\n }\n }\n }\n /** Update `q.fractions` with a perturbed value of f that is expected to decrease error delta. */\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\n if (Geometry.isLargeCoordinateResult(this._error0) || Geometry.isLargeCoordinateResult(this._error1))\n return;\n if (this.isConverged)\n return;\n // set up for next call to processQuadrantFractions\n const n = q.fractions.length;\n if (this._error0 < this._error1)\n this._bracket0 = this._f; // HEURISTIC: move f toward f1 to decrease e1\n else\n this._bracket1 = this._f; // HEURISTIC: move f toward f0 to decrease e0\n this._f = q.fractions[n - 2] = Geometry.interpolate(this._bracket0, 0.5, this._bracket1);\n }\n}\n/**\n * Processor for computing samples in Q1 for a subdivision-based arc chain approximation.\n * * The basic idea is to build a refinement of `q.fractions` for a QuadrantFractions q with q.quadrant = 1.\n * * In `announceQuadrantBegin` we start off the refinement with a copy of `q.fractions`.\n * * In `announceArc` we are called to process the interval [f0,f1] in `q.fractions`. First we test if the\n * announced arc's approximation error over [f0,f1] exceeds maxError.\n * * If so, we employ [[AdaptiveSubdivisionQ1IntervalErrorProcessor]] to compute an interior fraction f\n * that best refines the interval, which becomes [f0,f,f1].\n * * Otherwise, the fraction span [f0,f1] is unchanged---no additional samples are needed to decrease the\n * approximation error.\n * * In `announceQuadrantEnd`, `q.fractions` is updated in place with the computed refinement.\n * * The caller (e.g., [[AdaptiveSubdivisionSampler.computeRadiansStrictlyInsideQuadrant1]]) typically\n * re-processes `q` until `isRefined` returns false, at which point construction of an approximation that is\n * guaranteed not to exceed the desired error can commence.\n * @internal\n */\nclass AdaptiveSubdivisionQ1ErrorProcessor extends QuadrantFractionsProcessor {\n private _fullEllipseXY: Arc3d;\n private _fractionRangeQ1: Range1d;\n private _refinement?: SortedArray<number>;\n private _maxError: number;\n private _originalRefinementCount: number;\n private static _maxIters = 50;\n private constructor(fullEllipseXY: Arc3d, maxError: number) {\n super();\n this._fullEllipseXY = fullEllipseXY;\n this._fractionRangeQ1 = QuadrantFractions.getQ1FractionalRange(fullEllipseXY.sweep);\n this._maxError = maxError > 0 ? maxError : EllipticalArcApproximationOptions.defaultMaxError;\n this._originalRefinementCount = 0;\n }\n public static create(fullEllipseXY: Arc3d, maxError: number): AdaptiveSubdivisionQ1ErrorProcessor {\n return new AdaptiveSubdivisionQ1ErrorProcessor(fullEllipseXY, maxError);\n }\n /**\n * The arc to approximate, transformed to local coordinates, and with full sweep.\n * * Local coordinates allows us to ignore z in determining approximation error.\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\n */\n public get fullEllipseXY(): Arc3d {\n return this._fullEllipseXY;\n }\n /** Whether the processor refined the current `QuadrantFractions` fractions array to decrease approximation error. */\n public get isRefined(): boolean {\n if (undefined === this._refinement || 0 === this._refinement.length)\n return false;\n return this._originalRefinementCount < this._refinement.length;\n }\n /** Initialize the refinement from the quadrant fractions array. */\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\n assert(q.quadrant === 1);\n this._refinement = new SortedArray<number>(reversed ? compareFractionsDecreasing : compareFractionsIncreasing, false);\n for (const f of q.fractions) {\n if (this._fractionRangeQ1.containsX(f))\n this._refinement.insert(f);\n }\n return 2 <= (this._originalRefinementCount = this._refinement.length);\n }\n /**\n * Return the adjacent fraction from the previously refined interval.\n * * This is used to refine the interval of an inner arc, which depends on the most recent refinement of the\n * previous interval.\n */\n public override getPreviousFraction(f0: number): number | undefined {\n if (undefined === this._refinement)\n return undefined;\n const iPrev = this._refinement.indexOf(f0);\n return (iPrev >= 1) ? this._refinement.get(iPrev - 1) : undefined;\n }\n /** If this arc needs to be refined, add a refinement point. */\n public override announceArc(arc: Arc3d, fPrev: number | undefined, f0: number, f1: number): void {\n if (undefined === this._refinement)\n return;\n if (this._originalRefinementCount > 2) { // no early out for a single interval; it gets refined below\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\n if (!perp || perp.detailA.a <= this._maxError)\n return;\n }\n // throughout this function, f0 and f1 may be in either order\n const f = Geometry.interpolate(f0, 0.5, f1);\n const interpolateStartTangent = Geometry.isAlmostEqualEitherNumber(f0, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\n const interpolateEndTangent = Geometry.isAlmostEqualEitherNumber(f1, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\n if (!interpolateStartTangent && undefined === fPrev)\n fPrev = this.getPreviousFraction(f0); // createLastArc doesn't supply fPrev to announceArc\n const fractions = (undefined === fPrev) ? [f0, f, f1] : [fPrev, f0, f, f1];\n const q1 = [QuadrantFractions.create(1, fractions, interpolateStartTangent, interpolateEndTangent)];\n const processor = AdaptiveSubdivisionQ1IntervalErrorProcessor.create(this.fullEllipseXY, f0, f, f1);\n let iter = 0;\n do { // bisect to refine f (starting at avg) to balance the approx error of the arcs on either side\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\n } while (iter++ < AdaptiveSubdivisionQ1ErrorProcessor._maxIters && !processor.isConverged);\n this._refinement.insert(processor.f);\n }\n /** Update the quadrant fractions array with the current refinement. */\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\n if (this._refinement)\n q.fractions = [...this._refinement];\n }\n /**\n * Compute radian angles for the fractions in the current refinement that are strictly inside Q1.\n * @param result optional preallocated array to clear and populate.\n * @return angles suitable for output from [[EllipticalArcSampler.computeRadiansStrictlyInsideQuadrant1]].\n */\n public getRefinedInteriorQ1Angles(result?: number[]): number[] {\n if (!result)\n result = [];\n else\n result.length = 0;\n if (this._refinement) {\n for (const f of this._refinement) {\n if (this._fractionRangeQ1.containsXOpen(f))\n result.push(this.fullEllipseXY.sweep.fractionToRadians(f));\n }\n }\n return result;\n }\n}\n\n/**\n * Interface implemented by sampler classes.\n * * Implementation constructors are assumed to supply the sampler with the elliptical arc to be approximated,\n * as well as relevant options for computing the samples.\n * * The elliptical arc to be approximated is assumed to have perpendicular axes so that we can take advantage of\n * ellipse symmetry: we only need to compute samples in the ellipse's first quadrant.\n * @internal\n */\ninterface EllipticalArcSampler {\n /**\n * Return samples interior to the first quadrant of the (full) ellipse.\n * * Samples are returned as an unordered array of radian angles in the open interval (0, pi/2).\n * @param result optional preallocated array to populate and return.\n * @return array of radian angles.\n */\n computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[];\n};\n\n/**\n * Implementation for method `EllipticalArcSampleMethod.UniformParameter`\n * @internal\n */\nclass UniformParameterSampler implements EllipticalArcSampler {\n private _context: EllipticalArcApproximationContext;\n private _options: EllipticalArcApproximationOptions;\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\n this._context = c;\n this._options = o;\n }\n public static create(\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\n ): UniformParameterSampler {\n return new UniformParameterSampler(context, options);\n }\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\n if (!result)\n result = [];\n if (this._context.isValidEllipticalArc) {\n const aDelta = Angle.piOver2Radians / (this._options.numSamplesInQuadrant - 1);\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i)\n result.push(i * aDelta);\n }\n return result;\n }\n};\n\n/**\n * Implementation for method `EllipticalArcSampleMethod.NonUniformCurvature`\n * @internal\n */\nclass NonUniformCurvatureSampler implements EllipticalArcSampler {\n protected _context: EllipticalArcApproximationContext;\n protected _options: EllipticalArcApproximationOptions;\n private _xMag2: number;\n private _yMag2: number;\n private _curvatureRange: Range1d;\n protected constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\n this._context = c;\n this._options = o;\n this._xMag2 = c.ellipticalArc.matrixRef.columnXMagnitudeSquared();\n this._yMag2 = c.ellipticalArc.matrixRef.columnYMagnitudeSquared();\n // extreme curvatures occur at the ellipse's axis points because its axes are perpendicular\n this._curvatureRange = Range1d.createXX(Math.sqrt(this._xMag2) / this._yMag2, Math.sqrt(this._yMag2) / this._xMag2);\n }\n public static create(\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\n ): NonUniformCurvatureSampler {\n return new NonUniformCurvatureSampler(context, options);\n }\n /**\n * Compute the angle corresponding to the point in the ellipse's first quadrant with the given curvature.\n * * The elliptical arc is assumed to be non-circular and have perpendicular axes of positive length; its sweep is ignored.\n * * This is a scaled inverse of [[Arc3d.fractionToCurvature]] restricted to fractions in [0, 1/4].\n * @return radian angle in [0, pi/2] or undefined if the ellipse is invalid, or does not attain the given curvature.\n */\n private curvatureToRadians(curvature: number): number | undefined {\n /*\n Let the elliptical arc be parameterized with axes u,v of different length and u.v = 0:\n f(t) = c + u cos(t) + v sin(t),\n f'(t) = -u sin(t) + v cos(t),\n f\"(t) = -u cos(t) - v sin(t)\n We seek a formula for t(K), the inverse of the standard curvature formula\n K(t) := ||f'(t) x f\"(t)|| / ||f'(t)||^3\n for a parametric function f(t):R->R^3. We'll restrict K to Q1 (i.e., t in [0, pi/2]), where K is monotonic.\n By linearity of the cross product and the above formulas, the numerator of K(t) reduces to ||u x v||, and so:\n cbrt(||u x v||/K) = ||f'(t)|| = sqrt(f'(t).f'(t))\n Leveraging u,v perpendicularity we can define:\n lambda(K) := (||u x v||/K)^(2/3) = (||u|| ||v|| / K)^(2/3) = cbrt(u.u v.v / K^2)\n Then substituting and using perpendicularity again:\n lambda(K) = f'(t).f'(t)\n = sin^2(t)u.u + cos^2(t)v.v - 2sin(t)cos(t)u.v\n = u.u + cos^2(t)(v.v - u.u)\n Taking the positive root because cos(t)>=0 in Q1, and relying on u,v having different lengths:\n cos(t) = sqrt((lambda(K) - u.u)/(v.v - u.u))\n Solving for t yields the formula for t(K).\n */\n if (!this._curvatureRange.containsX(curvature))\n return undefined; // ellipse does not attain this curvature\n const lambda = Math.cbrt((this._xMag2 * this._yMag2) / (curvature * curvature));\n const cosTheta = Math.sqrt(Math.abs((lambda - this._xMag2) / (this._yMag2 - this._xMag2)));\n return Math.acos(cosTheta);\n }\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\n if (!result)\n result = [];\n if (this._context.isValidEllipticalArc) {\n const tDelta = 1.0 / (this._options.numSamplesInQuadrant - 1);\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i) {\n const j = this._options.remapFunction(i * tDelta);\n const curvature = (1 - j) * this._curvatureRange.low + j * this._curvatureRange.high;\n const angle = this.curvatureToRadians(curvature);\n if (undefined !== angle)\n result.push(angle);\n }\n }\n return result;\n }\n};\n\n/**\n * Implementation for method `EllipticalArcSampleMethod.UniformCurvature`.\n * * Basically this is just `NonUniformCurvature` method with uniformity preserved via identity remap function.\n * @internal\n */\nclass UniformCurvatureSampler extends NonUniformCurvatureSampler implements EllipticalArcSampler {\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\n super(c, o.clone());\n this._options.remapFunction = (x: number) => x; // identity map\n }\n public static override create(\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\n ): UniformCurvatureSampler {\n return new UniformCurvatureSampler(context, options);\n }\n};\n\n/**\n * Implementation for method `EllipticalArcSampleMethod.AdaptiveSubdivision`\n * @internal\n */\nclass AdaptiveSubdivisionSampler implements EllipticalArcSampler {\n private _context: EllipticalArcApproximationContext;\n private _options: EllipticalArcApproximationOptions;\n private _fullEllipseXY: Arc3d;\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\n this._context = c;\n this._options = o;\n this._fullEllipseXY = c.cloneLocalArc(true) ?? Arc3d.createUnitCircle();\n }\n public static create(context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions): AdaptiveSubdivisionSampler {\n return new AdaptiveSubdivisionSampler(context, options);\n }\n /**\n * Return a copy of the arc to approximate, transformed to local coordinates, and with full sweep.\n * * Local coordinates allows us to ignore z in determining approximation error.\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\n */\n public get fullEllipseXY(): Arc3d {\n return this._fullEllipseXY;\n }\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\n if (!this._context.isValidEllipticalArc)\n return [];\n const rangeQ1 = QuadrantFractions.getQ1FractionalRange(this.fullEllipseXY.sweep);\n const q1 = [QuadrantFractions.create(1, [rangeQ1.low, rangeQ1.high], true, true)];\n const processor = AdaptiveSubdivisionQ1ErrorProcessor.create(this.fullEllipseXY, this._options.maxError);\n do {\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\n } while (processor.isRefined);\n return processor.getRefinedInteriorQ1Angles(result);\n }\n};\n\n/**\n * Processor for constructing a sample-based circular arc chain approximation.\n * @internal\n */\nclass ArcChainConstructionProcessor extends QuadrantFractionsProcessor {\n private _chain: CurveChain;\n private _quadrantChain?: CurveChain;\n private constructor(ellipticalArc: Arc3d, forcePath: boolean) {\n super();\n this._chain = (ellipticalArc.sweep.isFullCircle && !forcePath) ? Loop.create() : Path.create();\n }\n public static create(ellipticalArc: Arc3d, forcePath: boolean = false): ArcChainConstructionProcessor {\n return new ArcChainConstructionProcessor(ellipticalArc, forcePath);\n }\n public get chain(): CurveChain | undefined {\n return this._chain.children.length > 0 ? this._chain : undefined;\n }\n public override announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean {\n this._quadrantChain = undefined;\n return true;\n }\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void {\n if (!this._quadrantChain)\n this._quadrantChain = Path.create(); // the arc chain in a quadrant is always open\n this._quadrantChain.tryAddChild(arc); // captured!\n }\n public override announceQuadrantEnd(_q: QuadrantFractions, reversed: boolean): void {\n if (this._quadrantChain) {\n if (reversed)\n this._quadrantChain.reverseChildrenInPlace();\n for (const child of this._quadrantChain.children)\n this._chain.tryAddChild(child); // captured!\n }\n }\n};\n\n/**\n * Context for sampling a non-circular Arc3d and for constructing an approximation to it based on interpolation\n * of the samples.\n * * [[EllipticalArcApproximationContext.constructCircularArcChainApproximation]] constructs a `CurveChain`\n * approximation consisting of circular arcs.\n * * Various sample methods are supported, cf. [[EllipticalArcApproximationOptions]].\n * @internal\n */\nexport class EllipticalArcApproximationContext {\n private _ellipticalArc: Arc3d;\n private _localToWorld: Transform;\n private _isValidEllipticalArc: boolean;\n private static workPt0 = Point3d.createZero();\n private static workPt1 = Point3d.createZero();\n private static workPt2 = Point3d.createZero();\n private static workRay = Ray3d.createZero();\n\n /** Constructor, captures input. */\n private constructor(ellipticalArc: Arc3d) {\n this._isValidEllipticalArc = false;\n const data = ellipticalArc.toScaledMatrix3d();\n this._ellipticalArc = Arc3d.createScaledXYColumns(\n data.center, data.axes, data.r0, data.r90, data.sweep,\n ); // work on the major-minor axis version of the arc to take advantage of its symmetry\n this._localToWorld = Transform.createRefs(data.center, data.axes);\n if (this._localToWorld.matrix.isSingular())\n return;\n if (this._ellipticalArc.sweep.isEmpty)\n return; // ellipse must have a nonzero sweep\n const xMag2 = ellipticalArc.matrixRef.columnXMagnitudeSquared();\n const yMag2 = ellipticalArc.matrixRef.columnYMagnitudeSquared();\n if (Geometry.isSmallMetricDistanceSquared(xMag2) || Geometry.isSmallMetricDistanceSquared(yMag2))\n return; // ellipse must have positive radii\n if (Geometry.isSameCoordinateSquared(xMag2, yMag2))\n return; // ellipse must not be circular\n this._isValidEllipticalArc = true;\n }\n /** Constructor, clones input. */\n public static create(ellipticalArc: Arc3d) {\n return new EllipticalArcApproximationContext(ellipticalArc);\n }\n /**\n * The arc to be sampled.\n * * Its axes are forced to be perpendicular.\n * * It is stored in world coordinates.\n */\n public get ellipticalArc(): Arc3d {\n return this._ellipticalArc;\n }\n /**\n * The rigid transformation that maps `ellipticalArc` from local coordinates to world coordinates.\n * * In local coordinates, the arc center lies at the origin and its (perpendicular) axes of symmetry lie along\n * the positive x- and y-axes.\n */\n public get localToWorld(): Transform {\n return this._localToWorld;\n }\n /**\n * Whether the elliptical arc is amenable to sampling.\n * * The arc is valid if it is non-circular, has nonzero sweep, and has positive radii (nonsingular matrix).\n */\n public get isValidEllipticalArc(): boolean {\n return this._isValidEllipticalArc;\n }\n /**\n * Create a clone of the context's arc in local coordinates (with axes aligned to x-axis and y-axis).\n * @param fullSweep Optionally set full sweep on the returned local arc. Start angle is preserved.\n * @returns local arc, or undefined if the arc is invalid.\n */\n public cloneLocalArc(fullSweep?: boolean): Arc3d | undefined {\n if (!this.isValidEllipticalArc)\n return undefined;\n const worldToLocal = this.localToWorld.inverse();\n if (!worldToLocal)\n return undefined;\n const arcXY = this.ellipticalArc.cloneTransformed(worldToLocal);\n if (fullSweep) {\n let sweep = 2 * Math.PI;\n if (!arcXY.sweep.isCCW)\n sweep = -sweep;\n arcXY.sweep.setStartEndRadians(arcXY.sweep.startRadians, arcXY.sweep.startRadians + sweep);\n }\n return arcXY;\n }\n /**\n * Process structured sample data for the given elliptical arc.\n * * Circular arcs are announced to the processor for each sample interval in each quadrant.\n * * Each quadrant is processed separately to allow the elliptical arc's axis points and tangents to be interpolated.\n * * A 2-point plus tangent construction is used to create the first and last circular arc in each quadrant.\n * * Symmetry of the announced circular arcs matching that of a multi-quadrant spanning elliptical arc is ensured by\n * processing the samples consistently, starting along the elliptical arc's major axis in each quadrant.\n * @param ellipticalArc source arc to approximate.\n * @param quadrants structured samples, may be temporarily reversed for symmetry.\n * @param processor callbacks for handling the constructed arcs.\n * @internal\n */\n public static processQuadrantFractions(\n ellipticalArc: Arc3d, quadrants: QuadrantFractions[], processor: QuadrantFractionsProcessor,\n ): void {\n const pt0 = this.workPt0;\n const pt1 = this.workPt1;\n const pt2 = this.workPt2;\n const ray = this.workRay;\n const arcBetween2Samples = (arcStart: Ray3d, arcEnd: Point3d, reverse: boolean): Arc3d | undefined => {\n // assume non-colinear inputs\n const myArc = Arc3d.createCircularStartTangentEnd(arcStart.origin, arcStart.direction, arcEnd);\n if (!(myArc instanceof Arc3d))\n return undefined;\n if (reverse)\n myArc.reverseInPlace();\n return myArc;\n };\n const arcBetweenLast2Of3Samples = (p0: Point3d, arcStart: Point3d, arcEnd: Point3d): Arc3d | undefined => {\n // assume non-colinear inputs; initial arc starts at p0, ends at arcEnd\n const arc = Arc3d.createCircularStartMiddleEnd(p0, arcStart, arcEnd);\n if (!(arc instanceof Arc3d))\n return undefined; // colinear?\n const startAngle = arc.vector0.signedAngleTo(Vector3d.createStartEnd(arc.center, arcStart), arc.matrixRef.columnZ());\n arc.sweep.setStartEndRadians(startAngle.radians, arc.sweep.endRadians);\n return arc; // returned arc starts at arcStart, ends at arcEnd\n };\n const createFirstArc = (f0: number, f1: number): void => {\n // This arc starts at the first sample f0 and ends at f1.\n // This arc interpolates point and tangent at f0, but only point at f1.\n ellipticalArc.fractionToPointAndDerivative(f0, ray);\n ellipticalArc.fractionToPoint(f1, pt1);\n if (f0 > f1)\n ray.direction.scaleInPlace(-1); // computed arc is retrograde\n const arc = arcBetween2Samples(ray, pt1, false);\n if (arc)\n processor.announceArc(arc, undefined, f0, f1);\n };\n const createInnerArc = (f0: number, f1: number, f2: number) => {\n // This arc starts at f1 and ends at f2\n let fPrev = f0;\n if (processor.getPreviousFraction)\n fPrev = processor.getPreviousFraction(f1) ?? f0;\n ellipticalArc.fractionToPoint(fPrev, pt0);\n ellipticalArc.fractionToPoint(f1, pt1);\n ellipticalArc.fractionToPoint(f2, pt2);\n const arc = arcBetweenLast2Of3Samples(pt0, pt1, pt2);\n if (arc)\n processor.announceArc(arc, fPrev, f1, f2);\n };\n const createLastArc = (f0: number, f1: number): void => {\n // This arc starts at f0 and ends at the last sample f1.\n // This arc interpolates point and tangent at f1, but only point at f0.\n ellipticalArc.fractionToPoint(f0, pt0);\n ellipticalArc.fractionToPointAndDerivative(f1, ray);\n if (f1 > f0)\n ray.direction.scaleInPlace(-1); // computed arc is retrograde\n // compute last arc from f1 to f0, then reverse\n const arc = arcBetween2Samples(ray, pt0, true);\n if (arc)\n processor.announceArc(arc, undefined, f0, f1);\n };\n const reverseFractionsForSymmetry = (q: QuadrantFractions): boolean => {\n // If q interpolates an axis, we process q.fractions in a consistent direction (increasing or decreasing) so that the\n // approximating arc chain exhibits fourfold axial symmetry. We do this by ensuring q.fractions starts along the\n // major axis (or ends along the minor axis). This choice is arbitrary, but consistently made across all quadrants.\n if (!q.interpolateStartTangent && !q.interpolateEndTangent)\n return false;\n const n = q.fractions.length;\n if (n < 2)\n return false;\n const xAxisIsMajor = ellipticalArc.vector0.magnitudeSquared() > ellipticalArc.vector90.magnitudeSquared();\n const processCCWQuadrantInReverse = xAxisIsMajor ? (q.quadrant === 2 || q.quadrant === 4) : (q.quadrant === 1 || q.quadrant === 3);\n const isAlreadyReversed = q.fractions[0] > q.fractions[n - 1];\n const doReverse = !isAlreadyReversed && (processCCWQuadrantInReverse === ellipticalArc.sweep.isCCW);\n if (doReverse)\n q.reverse(); // for symmetry we sometimes process decreasing fractions. This creates slightly different arcs.\n return doReverse;\n };\n\n for (const q of quadrants) {\n const n = q.fractions.length;\n if (n < 2)\n continue;\n const reversed = reverseFractionsForSymmetry(q);\n if (!processor.announceQuadrantBegin(q, reversed))\n continue;\n if (q.interpolateStartTangent)\n createFirstArc(q.fractions[0], q.fractions[1]);\n // the first inner arc approximates the ellipse over [f[1],f[2]]; the last inner arc, over [f[n-3],f[n-2]]\n for (let i = 0; i + 2 < n - 1; ++i)\n createInnerArc(q.fractions[i], q.fractions[i + 1], q.fractions[i + 2]);\n if (n > 2) { // the final arc approximates [f[n-2],f[n-1]]\n if (q.interpolateEndTangent)\n createLastArc(q.fractions[n - 2], q.fractions[n - 1]);\n else\n createInnerArc(q.fractions[n - 3], q.fractions[n - 2], q.fractions[n - 1]);\n }\n processor.announceQuadrantEnd(q, reversed);\n if (reversed)\n q.reverse(); // undo the reverse above\n }\n }\n /**\n * Compute the maximum error of the circular arc chain approximation determined by the given samples.\n * * This is measured by the longest perpendicular between the elliptical arc and its approximation.\n * @param samples structured sample data from the instance's elliptical arc.\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\n * For each of `detailA` and `detailB`:\n * * `point` is the end of the perpendicular on each curve.\n * * `fraction` is the curve parameter of the point.\n * * `a` is the distance between the points.\n * @internal\n */\n public computeApproximationError(samples: QuadrantFractions[]): CurveLocationDetailPair | undefined {\n const arcXY = this.cloneLocalArc();\n if (!arcXY)\n return undefined;\n const processor = ArcChainErrorProcessor.create(arcXY);\n EllipticalArcApproximationContext.processQuadrantFractions(arcXY, samples, processor);\n const maxError = processor.maxPerpendicular;\n return (maxError && maxError.tryTransformInPlace(this.localToWorld)) ? maxError : undefined;\n }\n /**\n * Compute samples for the elliptical arc as fraction parameters.\n * * This method houses the sampling framework for all sampling methods, which are customized via implementations\n * of the [[EllipticalArcSampler]] interface.\n * * Note that the returned samples are fractions in the parameterization of the context's arc (whose axes have been\n * forced to be perpendicular), not the input arc passed into the context's constructor.\n * @param options options that determine how the elliptical arc is sampled.\n * @param structuredOutput flag indicating output format as follows:\n * * If false (default), return all fractions in one sorted (increasing), deduplicated array (a full ellipse includes\n * both 0 and 1).\n * * If true, fractions are assembled by quadrants:\n * * Each [[QuadrantFractions]] object holds at least three sorted (increasing), deduplicated fractions in a\n * specified quadrant of the arc.\n * * If only two fractions would be computed for a given `QuadrantFractions`, their midpoint is inserted to enable\n * tangent interpolation at both ends. Such a quadrant `q` is marked with `q.averageAdded = true`.\n * * The `QuadrantFractions` objects themselves are sorted by increasing order of the fractions they contain.\n * * If the arc sweep spans adjacent quadrants, the fraction bordering the quadrants appears in both `QuadrantFractions`.\n * * If the arc starts and ends in the same quadrant, two `QuadrantFractions` objects can be returned.\n * * This means there are between 1 and 5 objects in the `QuadrantFractions` array.\n * @internal\n */\n public computeSampleFractions(\n options: EllipticalArcApproximationOptions, structuredOutput: boolean = false,\n ): QuadrantFractions[] | number[] {\n if (!this.isValidEllipticalArc)\n return [];\n const compareRadiansIncreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\n return 0;\n return a0 < a1 ? -1 : 1;\n };\n const compareRadiansDecreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\n return 0;\n return a0 < a1 ? 1 : -1;\n };\n const compareQuadrantFractions: OrderedComparator<QuadrantFractions> = (\n q0: QuadrantFractions, q1: QuadrantFractions,\n ): number => {\n // ASSUME QuadrantFractions.fractions arrays are sorted (increasing) and have only trivial overlap\n if (compareFractionsIncreasing(q0.fractions[q0.fractions.length - 1], q1.fractions[0]) <= 0)\n return -1;\n if (compareFractionsIncreasing(q1.fractions[q1.fractions.length - 1], q0.fractions[0]) <= 0)\n return 1;\n return 0;\n };\n const shiftRadiansToSweep = (angle: number, sweep: AngleSweep): { angle: number, inSweep: boolean } => {\n const inSweep = sweep.isRadiansInSweep(angle, true);\n if (inSweep) {\n const fraction = sweep.radiansToSignedPeriodicFraction(angle);\n if (Geometry.isIn01(fraction))\n angle = sweep.fractionToRadians(fraction);\n }\n return { angle, inSweep };\n };\n const convertAndAddRadiansToFractionInRange = (\n dest: OrderedSet<number>, radians: number, sweep: AngleSweep, f0?: number, f1?: number,\n ): number | undefined => {\n if (undefined === f0)\n f0 = 0;\n if (undefined === f1)\n f1 = 1;\n if (f0 > f1)\n return convertAndAddRadiansToFractionInRange(dest, radians, sweep, f1, f0);\n const fraction = sweep.radiansToSignedPeriodicFraction(radians);\n if (fraction < (f0 - Geometry.smallFraction) || (f1 + Geometry.smallFraction) < fraction)\n return undefined; // angle is outside sweep\n Geometry.restrictToInterval(fraction, 0, 1);\n dest.add(fraction);\n return fraction;\n };\n const convertQ1RadiansInSweepToQuadrantFractions = (\n anglesInQ1: number[], angle0: number, angle1: number, sweep: AngleSweep,\n ): QuadrantFractions | undefined => {\n if (angle0 > angle1)\n return convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, angle1, angle0, sweep);\n if (Angle.isAlmostEqualRadiansNoPeriodShift(angle0, angle1))\n return undefined; // empty sweep\n const qData = QuadrantFractions.getQuadrantRadians(angle0, angle1);\n if (undefined === qData)\n return undefined; // no containing quadrant\n const qFractions = new OrderedSet<number>(compareFractionsIncreasing);\n const f0 = convertAndAddRadiansToFractionInRange(qFractions, angle0, sweep);\n const f1 = convertAndAddRadiansToFractionInRange(qFractions, angle1, sweep);\n if (undefined === f0 || undefined === f1)\n return undefined;\n for (const a0 of anglesInQ1) {\n let angle = a0;\n if (2 === qData.quadrant)\n angle = Angle.piRadians - angle;\n else if (3 === qData.quadrant)\n angle = Angle.piRadians + angle;\n else if (4 === qData.quadrant)\n angle = Angle.pi2Radians - angle;\n convertAndAddRadiansToFractionInRange(qFractions, angle, sweep, f0, f1);\n }\n const qf = QuadrantFractions.create(qData.quadrant, [...qFractions]);\n const n = qf.fractions.length;\n if (2 === n) { // e.g. elliptical arc is so small it contains no interior samples in this quadrant\n qf.fractions.splice(1, 0, Geometry.interpolate(qf.fractions[0], 0.5, qf.fractions[1]));\n qf.averageAdded = true;\n }\n return qf;\n };\n const computeStructuredOutput = (anglesInQ1: number[], arcSweep: AngleSweep): QuadrantFractions[] => {\n const qEndAngles = new OrderedSet<number>(arcSweep.isCCW ? compareRadiansIncreasing : compareRadiansDecreasing);\n qEndAngles.add(arcSweep.endRadians);\n for (const qAngle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians, Angle.pi2Radians]) {\n const shifted = shiftRadiansToSweep(qAngle, arcSweep);\n if (shifted.inSweep)\n qEndAngles.add(shifted.angle);\n }\n const quadrants = new OrderedSet<QuadrantFractions>(compareQuadrantFractions);\n let a0 = arcSweep.startRadians;\n for (const a1 of qEndAngles) {\n const quadrant = convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, a0, a1, arcSweep);\n if (quadrant)\n quadrants.add(quadrant);\n a0 = a1;\n }\n return [...quadrants];\n };\n const computeFlatOutput = (anglesInQ1: number[], arcSweep: AngleSweep): number[] => {\n // first add the quadrant fractions so the set prefers them over nearby interior fractions\n const fractions = new OrderedSet<number>(compareFractionsIncreasing);\n fractions.add(0);\n fractions.add(1);\n for (const angle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians])\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\n // add interior Q1 fractions, reflect to the other quadrants, filter by sweep and extant entry\n for (const angle0 of anglesInQ1) {\n for (const angle of [angle0, Angle.piRadians - angle0, Angle.piRadians + angle0, Angle.pi2Radians - angle0])\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\n }\n return [...fractions];\n };\n // sample the (full) ellipse as angles in strict interior of Quadrant 1\n const radiansQ1: number[] = []; // unordered\n switch (options.sampleMethod) {\n case EllipticalArcSampleMethod.UniformParameter: {\n UniformParameterSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\n break;\n }\n case EllipticalArcSampleMethod.UniformCurvature: {\n UniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\n break;\n }\n case EllipticalArcSampleMethod.NonUniformCurvature: {\n NonUniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\n break;\n }\n case EllipticalArcSampleMethod.AdaptiveSubdivision: {\n AdaptiveSubdivisionSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\n break;\n }\n default:\n break;\n }\n return structuredOutput ?\n computeStructuredOutput(radiansQ1, this.ellipticalArc.sweep) :\n computeFlatOutput(radiansQ1, this.ellipticalArc.sweep);\n }\n /** Construct a circular arc chain approximation to the elliptical arc. */\n public constructCircularArcChainApproximation(options?: EllipticalArcApproximationOptions): CurveChain | undefined {\n if (!this.isValidEllipticalArc)\n return undefined;\n if (!options)\n options = EllipticalArcApproximationOptions.create();\n const samples = this.computeSampleFractions(options, true) as QuadrantFractions[];\n const processor = ArcChainConstructionProcessor.create(this.ellipticalArc, options.forcePath);\n EllipticalArcApproximationContext.processQuadrantFractions(this.ellipticalArc, samples, processor);\n return processor.chain;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"EllipticalArcApproximationContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/EllipticalArcApproximationContext.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\nimport { assert, OrderedComparator, OrderedSet, SortedArray } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../../Geometry\";\r\nimport { Angle } from \"../../geometry3d/Angle\";\r\nimport { AngleSweep } from \"../../geometry3d/AngleSweep\";\r\nimport { Point3d, Vector3d } from \"../../geometry3d/Point3dVector3d\";\r\nimport { Range1d } from \"../../geometry3d/Range\";\r\nimport { Ray3d } from \"../../geometry3d/Ray3d\";\r\nimport { Transform } from \"../../geometry3d/Transform\";\r\nimport { Arc3d, EllipticalArcApproximationOptions, EllipticalArcSampleMethod } from \"../Arc3d\";\r\nimport { CurveChain } from \"../CurveCollection\";\r\nimport { CurveLocationDetailPair } from \"../CurveLocationDetail\";\r\nimport { Loop } from \"../Loop\";\r\nimport { Path } from \"../Path\";\r\nimport { CurveCurveCloseApproachXY } from \"./CurveCurveCloseApproachXY\";\r\n\r\n/** @packageDocumentation\r\n * @module Curve\r\n */\r\n\r\n/**\r\n * Comparison callback to sort fractions in increasing order with suitable tolerance for equality.\r\n * @internal\r\n */\r\nfunction compareFractionsIncreasing(f0: number, f1: number): number {\r\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\r\n return 0;\r\n return f0 < f1 ? -1 : 1;\r\n};\r\n/**\r\n * Comparison callback to sort fractions in decreasing order with suitable tolerance for equality.\r\n * @internal\r\n */\r\nfunction compareFractionsDecreasing(f0: number, f1: number): number {\r\n if (Geometry.isAlmostEqualNumber(f0, f1, Geometry.smallFraction))\r\n return 0;\r\n return f0 < f1 ? 1 : -1;\r\n};\r\n\r\n/**\r\n * Structured data carrier used by the elliptical arc sampler.\r\n * @internal\r\n*/\r\nexport class QuadrantFractions {\r\n private _quadrant: 1 | 2 | 3 | 4;\r\n private _fractions: number[];\r\n private _interpolateStartTangent: boolean;\r\n private _interpolateEndTangent: boolean;\r\n private _averageAdded: boolean;\r\n private constructor(\r\n quadrant: 1 | 2 | 3 | 4, fractions: number[], interpolateStartTangent: boolean, interpolateEndTangent: boolean,\r\n ) {\r\n this._quadrant = quadrant;\r\n this._fractions = fractions;\r\n this._interpolateStartTangent = interpolateStartTangent;\r\n this._interpolateEndTangent = interpolateEndTangent;\r\n this._averageAdded = false;\r\n }\r\n /** Constructor, captures the array. */\r\n public static create(\r\n quadrant: 1 | 2 | 3 | 4,\r\n fractions: number[] = [],\r\n interpolateStartTangent: boolean = true,\r\n interpolateEndTangent: boolean = true,\r\n ): QuadrantFractions {\r\n return new QuadrantFractions(quadrant, fractions, interpolateStartTangent, interpolateEndTangent);\r\n }\r\n /**\r\n * Quadrant of the full ellipse containing the samples.\r\n * * Quadrants are labeled proceeding in counterclockwise angular sweeps of length pi/2 starting at vector0.\r\n * * For example, Quadrant 1 starts at vector0 and ends at vector90, and Quadrant 4 ends at vector0.\r\n * * For purposes of angle classification, quadrants are half-open intervals, closed at their start angle,\r\n * as determined by the ellipse's sweep direction.\r\n */\r\n public get quadrant(): 1 | 2 | 3 | 4 {\r\n return this._quadrant;\r\n }\r\n /** Sample locations in this quadrant of the elliptical arc, as fractions of its sweep. */\r\n public get fractions(): number[] {\r\n return this._fractions;\r\n }\r\n public set fractions(f: number[]) {\r\n this._fractions = f;\r\n }\r\n /**\r\n * Whether to interpolate the elliptical arc tangent at the first fraction.\r\n * * If true (default), the first approximating arc is computed from the first two fractions and approximates the\r\n * elliptical arc between the first and second fractions, interpolating both point and tangent at the first fraction,\r\n * and point at the second fraction.\r\n * * If false, the first approximating arc is computed from the first three fractions and approximates the\r\n * elliptical arc between the second and third fractions, where it interpolates position only.\r\n */\r\n public get interpolateStartTangent(): boolean {\r\n return this._interpolateStartTangent;\r\n }\r\n public set interpolateStartTangent(interpolate: boolean) {\r\n this._interpolateStartTangent = interpolate;\r\n }\r\n /**\r\n * Whether to interpolate the elliptical arc tangent at the last fraction.\r\n * * If true (default), the last approximating arc is computed from the last two fractions and approximates the\r\n * elliptical arc between the penultimate and last fractions, interpolating point at the penultimate fraction, and\r\n * both point and tangent at the last fraction.\r\n * * If false, the last approximating arc is computed from the last three fractions and approximates the\r\n * elliptical arc between the penultimate and last fractions, where it interpolates position only.\r\n */\r\n public get interpolateEndTangent(): boolean {\r\n return this._interpolateEndTangent;\r\n }\r\n public set interpolateEndTangent(interpolate: boolean) {\r\n this._interpolateEndTangent = interpolate;\r\n }\r\n /**\r\n * Whether the average of the first and last fractions was added to satisfy a minimum fractions array length of three.\r\n * * There are always at least two fractions per quadrant, but three are needed to interpolate both end tangents\r\n * with circular arcs.\r\n * * This flag is set if a given sample method/arc yielded only two fractions, so their average was inserted in the\r\n * fractions array to meet this minimum three-sample requirement.\r\n */\r\n public get averageAdded(): boolean {\r\n return this._fractions.length === 3 ? this._averageAdded : false;\r\n }\r\n public set averageAdded(added: boolean) {\r\n this._averageAdded = added;\r\n }\r\n /**\r\n * Compute quadrant data for the given angles.\r\n * @param radians0 first radian angle.\r\n * @param radians1 second radian angle.\r\n * @return quadrant number and start/end radian angles for the quadrant that contains both input angles, or\r\n * `undefined` if no such quadrant.\r\n * * The returned sweep is always counterclockwise: angle0 < angle1.\r\n */\r\n public static getQuadrantRadians(\r\n radians0: number, radians1: number,\r\n ): { quadrant: 1 | 2 | 3 | 4, angle0: number, angle1: number } | undefined {\r\n if (AngleSweep.isRadiansInStartEnd(radians0, 0, Angle.piOver2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, 0, Angle.piOver2Radians))\r\n return { quadrant: 1, angle0: 0, angle1: Angle.piOver2Radians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piOver2Radians, Angle.piRadians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piOver2Radians, Angle.piRadians))\r\n return { quadrant: 2, angle0: Angle.piOver2Radians, angle1: Angle.piRadians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.piRadians, Angle.pi3Over2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.piRadians, Angle.pi3Over2Radians))\r\n return { quadrant: 3, angle0: Angle.piRadians, angle1: Angle.pi3Over2Radians };\r\n if (AngleSweep.isRadiansInStartEnd(radians0, Angle.pi3Over2Radians, Angle.pi2Radians)\r\n && AngleSweep.isRadiansInStartEnd(radians1, Angle.pi3Over2Radians, Angle.pi2Radians))\r\n return { quadrant: 4, angle0: Angle.pi3Over2Radians, angle1: Angle.pi2Radians };\r\n return undefined;\r\n }\r\n /** Compute the fractional range of Quadrant 1 for the given full sweep. */\r\n public static getQ1FractionalRange(fullSweep: AngleSweep): Range1d {\r\n const angle0 = 0;\r\n const angle90 = 0.5 * Math.PI;\r\n let f0 = fullSweep.radiansToSignedPeriodicFraction(angle0);\r\n let f1 = fullSweep.radiansToSignedPeriodicFraction(angle90);\r\n if (!fullSweep.isCCW)\r\n [f0, f1] = [f1, f0];\r\n if (f1 < f0)\r\n f1 += 1;\r\n return Range1d.createXX(f0, f1);\r\n }\r\n /** Reverse the fractions array and flags. */\r\n public reverse(): void {\r\n this._fractions.reverse();\r\n [this._interpolateStartTangent, this._interpolateEndTangent] = [this._interpolateEndTangent, this._interpolateStartTangent];\r\n }\r\n};\r\n\r\n/**\r\n * Base class specifying callbacks for processing samples of an elliptical arc.\r\n * @internal\r\n */\r\nclass QuadrantFractionsProcessor {\r\n /**\r\n * Announce the beginning of processing for quadrant `q`.\r\n * @param _reversed whether `q.reverse()` was invoked before this call for symmetry reasons. If so, arcs will be\r\n * announced in the opposite order and with the opposite orientation.\r\n * @return whether to process `q`.\r\n */\r\n public announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean { return true; }\r\n /**\r\n * Retrieve the fraction preceding the input fraction in process order.\r\n * * This optional callback facilitates processors like [[AdaptiveSubdivisionQ1ErrorProcessor]] whose implementation\r\n * of [[announceArc]] depends upon the result of the previous invocation of [[announceArc]].\r\n * @param f0 fraction to look up.\r\n * @return fraction preceding f0 in process order, or undefined if no such fraction.\r\n */\r\n public getPreviousFraction?(f0: number): number | undefined;\r\n /**\r\n * Announce a circular arc approximating the elliptical arc E between the given fractions.\r\n * * The given fractions are different. If `announceQuadrantBegin` was invoked with `reversed === false` then\r\n * `fPrev < f0 < f1`; otherwise, `fPrev > f0 > f1`.\r\n * @param _arc circular arc that interpolates E at f0 and f1. Processor can capture `arc`; it is unused afterwards.\r\n * @param _fPrev fractional parameter of E used to define the 3-point parent circle through the points at `fPrev`,\r\n * `f0`, and `f1` from which `arc` was constructed. If undefined, `arc` was generated from the circle defined by\r\n * the points at `f0` and `f1` and one of their tangents.\r\n * @param _f0 fractional parameter of E at which point `arc` starts.\r\n * @param _f1 fractional parameter of E at which point `arc` ends.\r\n */\r\n public announceArc(_arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void { }\r\n /**\r\n * Announce the end of processing for quadrant `q`.\r\n * @param _reversed whether `q.reverse()` was invoked before processing (see [[announceQuadrantBegin]]). If so,\r\n * after this call `q.reverse()` is invoked again.\r\n */\r\n public announceQuadrantEnd(_q: QuadrantFractions, _reversed: boolean): void { }\r\n};\r\n\r\n/**\r\n * Processor for computing the error of a sample-based arc chain approximation.\r\n * @internal\r\n */\r\nclass ArcChainErrorProcessor extends QuadrantFractionsProcessor {\r\n private _ellipticalArc: Arc3d;\r\n private _maxPerpendicular: CurveLocationDetailPair | undefined;\r\n protected constructor(ellipticalArc: Arc3d) {\r\n super();\r\n this._ellipticalArc = ellipticalArc;\r\n this._maxPerpendicular = undefined;\r\n }\r\n public static create(ellipticalArc: Arc3d): ArcChainErrorProcessor {\r\n return new ArcChainErrorProcessor(ellipticalArc);\r\n }\r\n public get ellipticalArc(): Arc3d {\r\n return this._ellipticalArc;\r\n }\r\n /**\r\n * Compute the maximum xy-distance between an elliptical arc and its approximation.\r\n * * Inputs should be in horizontal plane(s), as z-coordinates are ignored.\r\n * @param circularArc circular arc approximant. Assumed to start and end on the elliptical arc.\r\n * @param ellipticalArc elliptical arc being approximated.\r\n * For best results, `f0` and `f1` should correspond to the start/end of `circularArc`.\r\n * @param f0 optional `ellipticalArc` start fraction to restrict its sweep.\r\n * @param f1 optional `ellipticalArc` end fraction to restrict its sweep.\r\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\r\n * For each of `detailA` (refers to `circularArc`) and `detailB` (refers to unrestricted `ellipticalArc`):\r\n * * `point` is the end of the perpendicular on each curve.\r\n * * `fraction` is the curve parameter of the point.\r\n * * `a` is the distance between the points.\r\n */\r\n public static computePrimitiveErrorXY(\r\n circularArc: Arc3d, ellipticalArc: Arc3d, f0?: number, f1?: number,\r\n ): CurveLocationDetailPair | undefined {\r\n const handler = new CurveCurveCloseApproachXY();\r\n handler.maxDistanceToAccept = circularArc.quickLength() / 2;\r\n const trimEllipse = undefined !== f0 && undefined !== f1;\r\n const trimmedEllipticalArc = trimEllipse ? ellipticalArc.clonePartialCurve(f0, f1) : ellipticalArc;\r\n // we expect only one perpendicular, not near an endpoint.\r\n handler.allPerpendicularsArcArcBounded(circularArc, trimmedEllipticalArc);\r\n let maxPerp: CurveLocationDetailPair | undefined;\r\n for (const perp of handler.grabPairedResults()) {\r\n if (Geometry.isAlmostEqualEitherNumber(perp.detailA.fraction, 0, 1, Geometry.smallFraction))\r\n continue; // rule out perpendiculars on circular arc ends\r\n if (Geometry.isAlmostEqualEitherNumber(perp.detailB.fraction, 0, 1, Geometry.smallFraction))\r\n continue; // rule out perpendiculars on elliptical arc ends\r\n const error = perp.detailA.point.distanceXY(perp.detailB.point);\r\n if (!maxPerp || maxPerp.detailA.a < error) {\r\n if (trimEllipse) { // reset ellipticalArc fraction to unrestricted range\r\n perp.detailB.fraction = Geometry.interpolate(f0, perp.detailB.fraction, f1);\r\n perp.detailB.setCurve(ellipticalArc);\r\n }\r\n perp.detailA.a = perp.detailB.a = error;\r\n maxPerp = perp;\r\n }\r\n }\r\n return maxPerp;\r\n }\r\n public get maxPerpendicular(): CurveLocationDetailPair | undefined {\r\n return this._maxPerpendicular;\r\n }\r\n public set maxPerpendicular(newMaxPerp: CurveLocationDetailPair) {\r\n this._maxPerpendicular = newMaxPerp;\r\n }\r\n /**\r\n * Update the chain approximation error for a given chain child that approximates the elliptical arc between the\r\n * given fractions.\r\n * * Fractional sweep [f0, f1] of the elliptical arc is the smaller of the cyclic sweeps.\r\n */\r\n public updateMaxPerpendicular(childApproximation: Arc3d, f0: number, f1: number): void {\r\n const childPerp = ArcChainErrorProcessor.computePrimitiveErrorXY(childApproximation, this.ellipticalArc, f0, f1);\r\n if (childPerp && (!this.maxPerpendicular || this.maxPerpendicular.detailA.a < childPerp.detailA.a))\r\n this.maxPerpendicular = childPerp;\r\n };\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\r\n this.updateMaxPerpendicular(arc, f0, f1);\r\n }\r\n}\r\n\r\n/**\r\n * Processor for computing an optimal refinement of a single Q1 ordered interval [f0,f1] by perturbing an interior\r\n * seed fraction f.\r\n * * Typically the caller (cf. [[AdaptiveSubdivisionQ1ErrorProcessor.announceArc]] processes a\r\n * QuadrantFractions `q` with `q.quadrant` = 1 until convergence. The `q.fractions` array is expected to have\r\n * one of two forms:\r\n * * [fPrev, f0, f, f1], where fPrev is from the adjacent interval (possibly just refined), or\r\n * * [f0, f, f1], if `q.interpolateStartTangent === true`.\r\n * * This processor implements a bisection algorithm that iteratively shrinks a sub-interval that brackets f,\r\n * starting with [f0,f1]:\r\n * * During processing, `announceArc` will be called twice to compute the approximation errors of the circular\r\n * arcs on either side of f in the current bracket.\r\n * * In `announceQuadrantEnd` if these two errors are almost equal, we are done refining [f0,f1]. Otherwise,\r\n * we move f halfway to the endpoint of the bracket that decreases the error delta, and shrink our bracket.\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionQ1IntervalErrorProcessor extends QuadrantFractionsProcessor {\r\n private _fullEllipseXY: Arc3d;\r\n private _f: number;\r\n private _bracket0: number;\r\n private _bracket1: number;\r\n private _error0: number;\r\n private _error1: number;\r\n private constructor(fullEllipseXY: Arc3d, f0: number, f: number, f1: number) {\r\n super();\r\n this._fullEllipseXY = fullEllipseXY;\r\n this._bracket0 = f0;\r\n this._f = f;\r\n this._bracket1 = f1;\r\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\r\n }\r\n public static create(fullEllipseXY: Arc3d, f0: number, f: number, f1: number): AdaptiveSubdivisionQ1IntervalErrorProcessor {\r\n return new AdaptiveSubdivisionQ1IntervalErrorProcessor(fullEllipseXY, f0, f, f1);\r\n }\r\n /**\r\n * The arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n public get f(): number {\r\n return this._f;\r\n }\r\n public get isConverged(): boolean {\r\n if (Geometry.isSmallMetricDistance(this._error0 - this._error1))\r\n return true;\r\n if (Geometry.isSmallRelative(this._bracket0 - this._bracket1))\r\n return true;\r\n return false;\r\n }\r\n /** Remember the initial value of the fraction f to be perturbed. */\r\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\r\n assert(q.quadrant === 1);\r\n assert(!reversed); // ASSUME [bracket0, bracket1] and q.fractions have the same ordering\r\n // the first fraction might be an extra point for computing the first 3-pt arc\r\n assert(q.fractions.length === 4 || (q.fractions.length === 3 && q.interpolateStartTangent));\r\n this._error0 = this._error1 = Geometry.largeCoordinateResult;\r\n return true;\r\n }\r\n /** Compute approximation error over the interval adjacent to f. */\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, f0: number, f1: number): void {\r\n if (Geometry.isAlmostEqualEitherNumber(this.f, f0, f1, 0)) {\r\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\r\n if (perp) {\r\n if (this.f === f1)\r\n this._error0 = perp.detailA.a; // first arc error\r\n else // f === f0\r\n this._error1 = perp.detailA.a; // second arc error\r\n }\r\n }\r\n }\r\n /** Update `q.fractions` with a perturbed value of f that is expected to decrease error delta. */\r\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\r\n if (Geometry.isLargeCoordinateResult(this._error0) || Geometry.isLargeCoordinateResult(this._error1))\r\n return;\r\n if (this.isConverged)\r\n return;\r\n // set up for next call to processQuadrantFractions\r\n const n = q.fractions.length;\r\n if (this._error0 < this._error1)\r\n this._bracket0 = this._f; // HEURISTIC: move f toward f1 to decrease e1\r\n else\r\n this._bracket1 = this._f; // HEURISTIC: move f toward f0 to decrease e0\r\n this._f = q.fractions[n - 2] = Geometry.interpolate(this._bracket0, 0.5, this._bracket1);\r\n }\r\n}\r\n/**\r\n * Processor for computing samples in Q1 for a subdivision-based arc chain approximation.\r\n * * The basic idea is to build a refinement of `q.fractions` for a QuadrantFractions q with q.quadrant = 1.\r\n * * In `announceQuadrantBegin` we start off the refinement with a copy of `q.fractions`.\r\n * * In `announceArc` we are called to process the interval [f0,f1] in `q.fractions`. First we test if the\r\n * announced arc's approximation error over [f0,f1] exceeds maxError.\r\n * * If so, we employ [[AdaptiveSubdivisionQ1IntervalErrorProcessor]] to compute an interior fraction f\r\n * that best refines the interval, which becomes [f0,f,f1].\r\n * * Otherwise, the fraction span [f0,f1] is unchanged---no additional samples are needed to decrease the\r\n * approximation error.\r\n * * In `announceQuadrantEnd`, `q.fractions` is updated in place with the computed refinement.\r\n * * The caller (e.g., [[AdaptiveSubdivisionSampler.computeRadiansStrictlyInsideQuadrant1]]) typically\r\n * re-processes `q` until `isRefined` returns false, at which point construction of an approximation that is\r\n * guaranteed not to exceed the desired error can commence.\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionQ1ErrorProcessor extends QuadrantFractionsProcessor {\r\n private _fullEllipseXY: Arc3d;\r\n private _fractionRangeQ1: Range1d;\r\n private _refinement?: SortedArray<number>;\r\n private _maxError: number;\r\n private _originalRefinementCount: number;\r\n private static _maxIters = 50;\r\n private constructor(fullEllipseXY: Arc3d, maxError: number) {\r\n super();\r\n this._fullEllipseXY = fullEllipseXY;\r\n this._fractionRangeQ1 = QuadrantFractions.getQ1FractionalRange(fullEllipseXY.sweep);\r\n this._maxError = maxError > 0 ? maxError : EllipticalArcApproximationOptions.defaultMaxError;\r\n this._originalRefinementCount = 0;\r\n }\r\n public static create(fullEllipseXY: Arc3d, maxError: number): AdaptiveSubdivisionQ1ErrorProcessor {\r\n return new AdaptiveSubdivisionQ1ErrorProcessor(fullEllipseXY, maxError);\r\n }\r\n /**\r\n * The arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n /** Whether the processor refined the current `QuadrantFractions` fractions array to decrease approximation error. */\r\n public get isRefined(): boolean {\r\n if (undefined === this._refinement || 0 === this._refinement.length)\r\n return false;\r\n return this._originalRefinementCount < this._refinement.length;\r\n }\r\n /** Initialize the refinement from the quadrant fractions array. */\r\n public override announceQuadrantBegin(q: QuadrantFractions, reversed: boolean): boolean {\r\n assert(q.quadrant === 1);\r\n this._refinement = new SortedArray<number>(reversed ? compareFractionsDecreasing : compareFractionsIncreasing, false);\r\n for (const f of q.fractions) {\r\n if (this._fractionRangeQ1.containsX(f))\r\n this._refinement.insert(f);\r\n }\r\n return 2 <= (this._originalRefinementCount = this._refinement.length);\r\n }\r\n /**\r\n * Return the adjacent fraction from the previously refined interval.\r\n * * This is used to refine the interval of an inner arc, which depends on the most recent refinement of the\r\n * previous interval.\r\n */\r\n public override getPreviousFraction(f0: number): number | undefined {\r\n if (undefined === this._refinement)\r\n return undefined;\r\n const iPrev = this._refinement.indexOf(f0);\r\n return (iPrev >= 1) ? this._refinement.get(iPrev - 1) : undefined;\r\n }\r\n /** If this arc needs to be refined, add a refinement point. */\r\n public override announceArc(arc: Arc3d, fPrev: number | undefined, f0: number, f1: number): void {\r\n if (undefined === this._refinement)\r\n return;\r\n if (this._originalRefinementCount > 2) { // no early out for a single interval; it gets refined below\r\n const perp = ArcChainErrorProcessor.computePrimitiveErrorXY(arc, this.fullEllipseXY, f0, f1);\r\n if (!perp || perp.detailA.a <= this._maxError)\r\n return;\r\n }\r\n // throughout this function, f0 and f1 may be in either order\r\n const f = Geometry.interpolate(f0, 0.5, f1);\r\n const interpolateStartTangent = Geometry.isAlmostEqualEitherNumber(f0, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\r\n const interpolateEndTangent = Geometry.isAlmostEqualEitherNumber(f1, this._fractionRangeQ1.low, this._fractionRangeQ1.high, 0);\r\n if (!interpolateStartTangent && undefined === fPrev)\r\n fPrev = this.getPreviousFraction(f0); // createLastArc doesn't supply fPrev to announceArc\r\n const fractions = (undefined === fPrev) ? [f0, f, f1] : [fPrev, f0, f, f1];\r\n const q1 = [QuadrantFractions.create(1, fractions, interpolateStartTangent, interpolateEndTangent)];\r\n const processor = AdaptiveSubdivisionQ1IntervalErrorProcessor.create(this.fullEllipseXY, f0, f, f1);\r\n let iter = 0;\r\n do { // bisect to refine f (starting at avg) to balance the approx error of the arcs on either side\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\r\n } while (iter++ < AdaptiveSubdivisionQ1ErrorProcessor._maxIters && !processor.isConverged);\r\n this._refinement.insert(processor.f);\r\n }\r\n /** Update the quadrant fractions array with the current refinement. */\r\n public override announceQuadrantEnd(q: QuadrantFractions, _reversed: boolean): void {\r\n if (this._refinement)\r\n q.fractions = [...this._refinement];\r\n }\r\n /**\r\n * Compute radian angles for the fractions in the current refinement that are strictly inside Q1.\r\n * @param result optional preallocated array to clear and populate.\r\n * @return angles suitable for output from [[EllipticalArcSampler.computeRadiansStrictlyInsideQuadrant1]].\r\n */\r\n public getRefinedInteriorQ1Angles(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n else\r\n result.length = 0;\r\n if (this._refinement) {\r\n for (const f of this._refinement) {\r\n if (this._fractionRangeQ1.containsXOpen(f))\r\n result.push(this.fullEllipseXY.sweep.fractionToRadians(f));\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n/**\r\n * Interface implemented by sampler classes.\r\n * * Implementation constructors are assumed to supply the sampler with the elliptical arc to be approximated,\r\n * as well as relevant options for computing the samples.\r\n * * The elliptical arc to be approximated is assumed to have perpendicular axes so that we can take advantage of\r\n * ellipse symmetry: we only need to compute samples in the ellipse's first quadrant.\r\n * @internal\r\n */\r\ninterface EllipticalArcSampler {\r\n /**\r\n * Return samples interior to the first quadrant of the (full) ellipse.\r\n * * Samples are returned as an unordered array of radian angles in the open interval (0, pi/2).\r\n * @param result optional preallocated array to populate and return.\r\n * @return array of radian angles.\r\n */\r\n computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[];\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.UniformParameter`\r\n * @internal\r\n */\r\nclass UniformParameterSampler implements EllipticalArcSampler {\r\n private _context: EllipticalArcApproximationContext;\r\n private _options: EllipticalArcApproximationOptions;\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n }\r\n public static create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): UniformParameterSampler {\r\n return new UniformParameterSampler(context, options);\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n if (this._context.isValidEllipticalArc) {\r\n const aDelta = Angle.piOver2Radians / (this._options.numSamplesInQuadrant - 1);\r\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i)\r\n result.push(i * aDelta);\r\n }\r\n return result;\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.NonUniformCurvature`\r\n * @internal\r\n */\r\nclass NonUniformCurvatureSampler implements EllipticalArcSampler {\r\n protected _context: EllipticalArcApproximationContext;\r\n protected _options: EllipticalArcApproximationOptions;\r\n private _xMag2: number;\r\n private _yMag2: number;\r\n private _curvatureRange: Range1d;\r\n protected constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n this._xMag2 = c.ellipticalArc.matrixRef.columnXMagnitudeSquared();\r\n this._yMag2 = c.ellipticalArc.matrixRef.columnYMagnitudeSquared();\r\n // extreme curvatures occur at the ellipse's axis points because its axes are perpendicular\r\n this._curvatureRange = Range1d.createXX(Math.sqrt(this._xMag2) / this._yMag2, Math.sqrt(this._yMag2) / this._xMag2);\r\n }\r\n public static create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): NonUniformCurvatureSampler {\r\n return new NonUniformCurvatureSampler(context, options);\r\n }\r\n /**\r\n * Compute the angle corresponding to the point in the ellipse's first quadrant with the given curvature.\r\n * * The elliptical arc is assumed to be non-circular and have perpendicular axes of positive length; its sweep is ignored.\r\n * * This is a scaled inverse of [[Arc3d.fractionToCurvature]] restricted to fractions in [0, 1/4].\r\n * @return radian angle in [0, pi/2] or undefined if the ellipse is invalid, or does not attain the given curvature.\r\n */\r\n private curvatureToRadians(curvature: number): number | undefined {\r\n /*\r\n Let the elliptical arc be parameterized with axes u,v of different length and u.v = 0:\r\n f(t) = c + u cos(t) + v sin(t),\r\n f'(t) = -u sin(t) + v cos(t),\r\n f\"(t) = -u cos(t) - v sin(t)\r\n We seek a formula for t(K), the inverse of the standard curvature formula\r\n K(t) := ||f'(t) x f\"(t)|| / ||f'(t)||^3\r\n for a parametric function f(t):R->R^3. We'll restrict K to Q1 (i.e., t in [0, pi/2]), where K is monotonic.\r\n By linearity of the cross product and the above formulas, the numerator of K(t) reduces to ||u x v||, and so:\r\n cbrt(||u x v||/K) = ||f'(t)|| = sqrt(f'(t).f'(t))\r\n Leveraging u,v perpendicularity we can define:\r\n lambda(K) := (||u x v||/K)^(2/3) = (||u|| ||v|| / K)^(2/3) = cbrt(u.u v.v / K^2)\r\n Then substituting and using perpendicularity again:\r\n lambda(K) = f'(t).f'(t)\r\n = sin^2(t)u.u + cos^2(t)v.v - 2sin(t)cos(t)u.v\r\n = u.u + cos^2(t)(v.v - u.u)\r\n Taking the positive root because cos(t)>=0 in Q1, and relying on u,v having different lengths:\r\n cos(t) = sqrt((lambda(K) - u.u)/(v.v - u.u))\r\n Solving for t yields the formula for t(K).\r\n */\r\n if (!this._curvatureRange.containsX(curvature))\r\n return undefined; // ellipse does not attain this curvature\r\n const lambda = Math.cbrt((this._xMag2 * this._yMag2) / (curvature * curvature));\r\n const cosTheta = Math.sqrt(Math.abs((lambda - this._xMag2) / (this._yMag2 - this._xMag2)));\r\n return Math.acos(cosTheta);\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!result)\r\n result = [];\r\n if (this._context.isValidEllipticalArc) {\r\n const tDelta = 1.0 / (this._options.numSamplesInQuadrant - 1);\r\n for (let i = 1; i < this._options.numSamplesInQuadrant - 1; ++i) {\r\n const j = this._options.remapFunction(i * tDelta);\r\n const curvature = (1 - j) * this._curvatureRange.low + j * this._curvatureRange.high;\r\n const angle = this.curvatureToRadians(curvature);\r\n if (undefined !== angle)\r\n result.push(angle);\r\n }\r\n }\r\n return result;\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.UniformCurvature`.\r\n * * Basically this is just `NonUniformCurvature` method with uniformity preserved via identity remap function.\r\n * @internal\r\n */\r\nclass UniformCurvatureSampler extends NonUniformCurvatureSampler implements EllipticalArcSampler {\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n super(c, o.clone());\r\n this._options.remapFunction = (x: number) => x; // identity map\r\n }\r\n public static override create(\r\n context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions,\r\n ): UniformCurvatureSampler {\r\n return new UniformCurvatureSampler(context, options);\r\n }\r\n};\r\n\r\n/**\r\n * Implementation for method `EllipticalArcSampleMethod.AdaptiveSubdivision`\r\n * @internal\r\n */\r\nclass AdaptiveSubdivisionSampler implements EllipticalArcSampler {\r\n private _context: EllipticalArcApproximationContext;\r\n private _options: EllipticalArcApproximationOptions;\r\n private _fullEllipseXY: Arc3d;\r\n private constructor(c: EllipticalArcApproximationContext, o: EllipticalArcApproximationOptions) {\r\n this._context = c;\r\n this._options = o;\r\n this._fullEllipseXY = c.cloneLocalArc(true) ?? Arc3d.createUnitCircle();\r\n }\r\n public static create(context: EllipticalArcApproximationContext, options: EllipticalArcApproximationOptions): AdaptiveSubdivisionSampler {\r\n return new AdaptiveSubdivisionSampler(context, options);\r\n }\r\n /**\r\n * Return a copy of the arc to approximate, transformed to local coordinates, and with full sweep.\r\n * * Local coordinates allows us to ignore z in determining approximation error.\r\n * * Full sweep guarantees we have the first quadrant in which to do our computations.\r\n */\r\n public get fullEllipseXY(): Arc3d {\r\n return this._fullEllipseXY;\r\n }\r\n public computeRadiansStrictlyInsideQuadrant1(result?: number[]): number[] {\r\n if (!this._context.isValidEllipticalArc)\r\n return [];\r\n const rangeQ1 = QuadrantFractions.getQ1FractionalRange(this.fullEllipseXY.sweep);\r\n const q1 = [QuadrantFractions.create(1, [rangeQ1.low, rangeQ1.high], true, true)];\r\n const processor = AdaptiveSubdivisionQ1ErrorProcessor.create(this.fullEllipseXY, this._options.maxError);\r\n do {\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.fullEllipseXY, q1, processor);\r\n } while (processor.isRefined);\r\n return processor.getRefinedInteriorQ1Angles(result);\r\n }\r\n};\r\n\r\n/**\r\n * Processor for constructing a sample-based circular arc chain approximation.\r\n * @internal\r\n */\r\nclass ArcChainConstructionProcessor extends QuadrantFractionsProcessor {\r\n private _chain: CurveChain;\r\n private _quadrantChain?: CurveChain;\r\n private constructor(ellipticalArc: Arc3d, forcePath: boolean) {\r\n super();\r\n this._chain = (ellipticalArc.sweep.isFullCircle && !forcePath) ? Loop.create() : Path.create();\r\n }\r\n public static create(ellipticalArc: Arc3d, forcePath: boolean = false): ArcChainConstructionProcessor {\r\n return new ArcChainConstructionProcessor(ellipticalArc, forcePath);\r\n }\r\n public get chain(): CurveChain | undefined {\r\n return this._chain.children.length > 0 ? this._chain : undefined;\r\n }\r\n public override announceQuadrantBegin(_q: QuadrantFractions, _reversed: boolean): boolean {\r\n this._quadrantChain = undefined;\r\n return true;\r\n }\r\n public override announceArc(arc: Arc3d, _fPrev: number | undefined, _f0: number, _f1: number): void {\r\n if (!this._quadrantChain)\r\n this._quadrantChain = Path.create(); // the arc chain in a quadrant is always open\r\n this._quadrantChain.tryAddChild(arc); // captured!\r\n }\r\n public override announceQuadrantEnd(_q: QuadrantFractions, reversed: boolean): void {\r\n if (this._quadrantChain) {\r\n if (reversed)\r\n this._quadrantChain.reverseChildrenInPlace();\r\n for (const child of this._quadrantChain.children)\r\n this._chain.tryAddChild(child); // captured!\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Context for sampling a non-circular Arc3d and for constructing an approximation to it based on interpolation\r\n * of the samples.\r\n * * [[EllipticalArcApproximationContext.constructCircularArcChainApproximation]] constructs a `CurveChain`\r\n * approximation consisting of circular arcs.\r\n * * Various sample methods are supported, cf. [[EllipticalArcApproximationOptions]].\r\n * @internal\r\n */\r\nexport class EllipticalArcApproximationContext {\r\n private _ellipticalArc: Arc3d;\r\n private _localToWorld: Transform;\r\n private _isValidEllipticalArc: boolean;\r\n private static workPt0 = Point3d.createZero();\r\n private static workPt1 = Point3d.createZero();\r\n private static workPt2 = Point3d.createZero();\r\n private static workRay = Ray3d.createZero();\r\n\r\n /** Constructor, captures input. */\r\n private constructor(ellipticalArc: Arc3d) {\r\n this._isValidEllipticalArc = false;\r\n const data = ellipticalArc.toScaledMatrix3d();\r\n this._ellipticalArc = Arc3d.createScaledXYColumns(\r\n data.center, data.axes, data.r0, data.r90, data.sweep,\r\n ); // work on the major-minor axis version of the arc to take advantage of its symmetry\r\n this._localToWorld = Transform.createRefs(data.center, data.axes);\r\n if (this._localToWorld.matrix.isSingular())\r\n return;\r\n if (this._ellipticalArc.sweep.isEmpty)\r\n return; // ellipse must have a nonzero sweep\r\n const xMag2 = ellipticalArc.matrixRef.columnXMagnitudeSquared();\r\n const yMag2 = ellipticalArc.matrixRef.columnYMagnitudeSquared();\r\n if (Geometry.isSmallMetricDistanceSquared(xMag2) || Geometry.isSmallMetricDistanceSquared(yMag2))\r\n return; // ellipse must have positive radii\r\n if (Geometry.isSameCoordinateSquared(xMag2, yMag2))\r\n return; // ellipse must not be circular\r\n this._isValidEllipticalArc = true;\r\n }\r\n /** Constructor, clones input. */\r\n public static create(ellipticalArc: Arc3d) {\r\n return new EllipticalArcApproximationContext(ellipticalArc);\r\n }\r\n /**\r\n * The arc to be sampled.\r\n * * Its axes are forced to be perpendicular.\r\n * * It is stored in world coordinates.\r\n */\r\n public get ellipticalArc(): Arc3d {\r\n return this._ellipticalArc;\r\n }\r\n /**\r\n * The rigid transformation that maps `ellipticalArc` from local coordinates to world coordinates.\r\n * * In local coordinates, the arc center lies at the origin and its (perpendicular) axes of symmetry lie along\r\n * the positive x- and y-axes.\r\n */\r\n public get localToWorld(): Transform {\r\n return this._localToWorld;\r\n }\r\n /**\r\n * Whether the elliptical arc is amenable to sampling.\r\n * * The arc is valid if it is non-circular, has nonzero sweep, and has positive radii (nonsingular matrix).\r\n */\r\n public get isValidEllipticalArc(): boolean {\r\n return this._isValidEllipticalArc;\r\n }\r\n /**\r\n * Create a clone of the context's arc in local coordinates (with axes aligned to x-axis and y-axis).\r\n * @param fullSweep Optionally set full sweep on the returned local arc. Start angle is preserved.\r\n * @returns local arc, or undefined if the arc is invalid.\r\n */\r\n public cloneLocalArc(fullSweep?: boolean): Arc3d | undefined {\r\n if (!this.isValidEllipticalArc)\r\n return undefined;\r\n const worldToLocal = this.localToWorld.inverse();\r\n if (!worldToLocal)\r\n return undefined;\r\n const arcXY = this.ellipticalArc.cloneTransformed(worldToLocal);\r\n if (fullSweep) {\r\n let sweep = 2 * Math.PI;\r\n if (!arcXY.sweep.isCCW)\r\n sweep = -sweep;\r\n arcXY.sweep.setStartEndRadians(arcXY.sweep.startRadians, arcXY.sweep.startRadians + sweep);\r\n }\r\n return arcXY;\r\n }\r\n /**\r\n * Process structured sample data for the given elliptical arc.\r\n * * Circular arcs are announced to the processor for each sample interval in each quadrant.\r\n * * Each quadrant is processed separately to allow the elliptical arc's axis points and tangents to be interpolated.\r\n * * A 2-point plus tangent construction is used to create the first and last circular arc in each quadrant.\r\n * * Symmetry of the announced circular arcs matching that of a multi-quadrant spanning elliptical arc is ensured by\r\n * processing the samples consistently, starting along the elliptical arc's major axis in each quadrant.\r\n * @param ellipticalArc source arc to approximate.\r\n * @param quadrants structured samples, may be temporarily reversed for symmetry.\r\n * @param processor callbacks for handling the constructed arcs.\r\n * @internal\r\n */\r\n public static processQuadrantFractions(\r\n ellipticalArc: Arc3d, quadrants: QuadrantFractions[], processor: QuadrantFractionsProcessor,\r\n ): void {\r\n const pt0 = this.workPt0;\r\n const pt1 = this.workPt1;\r\n const pt2 = this.workPt2;\r\n const ray = this.workRay;\r\n const arcBetween2Samples = (arcStart: Ray3d, arcEnd: Point3d, reverse: boolean): Arc3d | undefined => {\r\n // assume non-colinear inputs\r\n const myArc = Arc3d.createCircularStartTangentEnd(arcStart.origin, arcStart.direction, arcEnd);\r\n if (!(myArc instanceof Arc3d))\r\n return undefined;\r\n if (reverse)\r\n myArc.reverseInPlace();\r\n return myArc;\r\n };\r\n const arcBetweenLast2Of3Samples = (p0: Point3d, arcStart: Point3d, arcEnd: Point3d): Arc3d | undefined => {\r\n // assume non-colinear inputs; initial arc starts at p0, ends at arcEnd\r\n const arc = Arc3d.createCircularStartMiddleEnd(p0, arcStart, arcEnd);\r\n if (!(arc instanceof Arc3d))\r\n return undefined; // colinear?\r\n const startAngle = arc.vector0.signedAngleTo(Vector3d.createStartEnd(arc.center, arcStart), arc.matrixRef.columnZ());\r\n arc.sweep.setStartEndRadians(startAngle.radians, arc.sweep.endRadians);\r\n return arc; // returned arc starts at arcStart, ends at arcEnd\r\n };\r\n const createFirstArc = (f0: number, f1: number): void => {\r\n // This arc starts at the first sample f0 and ends at f1.\r\n // This arc interpolates point and tangent at f0, but only point at f1.\r\n ellipticalArc.fractionToPointAndDerivative(f0, ray);\r\n ellipticalArc.fractionToPoint(f1, pt1);\r\n if (f0 > f1)\r\n ray.direction.scaleInPlace(-1); // computed arc is retrograde\r\n const arc = arcBetween2Samples(ray, pt1, false);\r\n if (arc)\r\n processor.announceArc(arc, undefined, f0, f1);\r\n };\r\n const createInnerArc = (f0: number, f1: number, f2: number) => {\r\n // This arc starts at f1 and ends at f2\r\n let fPrev = f0;\r\n if (processor.getPreviousFraction)\r\n fPrev = processor.getPreviousFraction(f1) ?? f0;\r\n ellipticalArc.fractionToPoint(fPrev, pt0);\r\n ellipticalArc.fractionToPoint(f1, pt1);\r\n ellipticalArc.fractionToPoint(f2, pt2);\r\n const arc = arcBetweenLast2Of3Samples(pt0, pt1, pt2);\r\n if (arc)\r\n processor.announceArc(arc, fPrev, f1, f2);\r\n };\r\n const createLastArc = (f0: number, f1: number): void => {\r\n // This arc starts at f0 and ends at the last sample f1.\r\n // This arc interpolates point and tangent at f1, but only point at f0.\r\n ellipticalArc.fractionToPoint(f0, pt0);\r\n ellipticalArc.fractionToPointAndDerivative(f1, ray);\r\n if (f1 > f0)\r\n ray.direction.scaleInPlace(-1); // computed arc is retrograde\r\n // compute last arc from f1 to f0, then reverse\r\n const arc = arcBetween2Samples(ray, pt0, true);\r\n if (arc)\r\n processor.announceArc(arc, undefined, f0, f1);\r\n };\r\n const reverseFractionsForSymmetry = (q: QuadrantFractions): boolean => {\r\n // If q interpolates an axis, we process q.fractions in a consistent direction (increasing or decreasing) so that the\r\n // approximating arc chain exhibits fourfold axial symmetry. We do this by ensuring q.fractions starts along the\r\n // major axis (or ends along the minor axis). This choice is arbitrary, but consistently made across all quadrants.\r\n if (!q.interpolateStartTangent && !q.interpolateEndTangent)\r\n return false;\r\n const n = q.fractions.length;\r\n if (n < 2)\r\n return false;\r\n const xAxisIsMajor = ellipticalArc.vector0.magnitudeSquared() > ellipticalArc.vector90.magnitudeSquared();\r\n const processCCWQuadrantInReverse = xAxisIsMajor ? (q.quadrant === 2 || q.quadrant === 4) : (q.quadrant === 1 || q.quadrant === 3);\r\n const isAlreadyReversed = q.fractions[0] > q.fractions[n - 1];\r\n const doReverse = !isAlreadyReversed && (processCCWQuadrantInReverse === ellipticalArc.sweep.isCCW);\r\n if (doReverse)\r\n q.reverse(); // for symmetry we sometimes process decreasing fractions. This creates slightly different arcs.\r\n return doReverse;\r\n };\r\n\r\n for (const q of quadrants) {\r\n const n = q.fractions.length;\r\n if (n < 2)\r\n continue;\r\n const reversed = reverseFractionsForSymmetry(q);\r\n if (!processor.announceQuadrantBegin(q, reversed))\r\n continue;\r\n if (q.interpolateStartTangent)\r\n createFirstArc(q.fractions[0], q.fractions[1]);\r\n // the first inner arc approximates the ellipse over [f[1],f[2]]; the last inner arc, over [f[n-3],f[n-2]]\r\n for (let i = 0; i + 2 < n - 1; ++i)\r\n createInnerArc(q.fractions[i], q.fractions[i + 1], q.fractions[i + 2]);\r\n if (n > 2) { // the final arc approximates [f[n-2],f[n-1]]\r\n if (q.interpolateEndTangent)\r\n createLastArc(q.fractions[n - 2], q.fractions[n - 1]);\r\n else\r\n createInnerArc(q.fractions[n - 3], q.fractions[n - 2], q.fractions[n - 1]);\r\n }\r\n processor.announceQuadrantEnd(q, reversed);\r\n if (reversed)\r\n q.reverse(); // undo the reverse above\r\n }\r\n }\r\n /**\r\n * Compute the maximum error of the circular arc chain approximation determined by the given samples.\r\n * * This is measured by the longest perpendicular between the elliptical arc and its approximation.\r\n * @param samples structured sample data from the instance's elliptical arc.\r\n * @return details of the perpendicular measuring the max approximation error, or undefined if no such perpendicular.\r\n * For each of `detailA` and `detailB`:\r\n * * `point` is the end of the perpendicular on each curve.\r\n * * `fraction` is the curve parameter of the point.\r\n * * `a` is the distance between the points.\r\n * @internal\r\n */\r\n public computeApproximationError(samples: QuadrantFractions[]): CurveLocationDetailPair | undefined {\r\n const arcXY = this.cloneLocalArc();\r\n if (!arcXY)\r\n return undefined;\r\n const processor = ArcChainErrorProcessor.create(arcXY);\r\n EllipticalArcApproximationContext.processQuadrantFractions(arcXY, samples, processor);\r\n const maxError = processor.maxPerpendicular;\r\n return (maxError && maxError.tryTransformInPlace(this.localToWorld)) ? maxError : undefined;\r\n }\r\n /**\r\n * Compute samples for the elliptical arc as fraction parameters.\r\n * * This method houses the sampling framework for all sampling methods, which are customized via implementations\r\n * of the [[EllipticalArcSampler]] interface.\r\n * * Note that the returned samples are fractions in the parameterization of the context's arc (whose axes have been\r\n * forced to be perpendicular), not the input arc passed into the context's constructor.\r\n * @param options options that determine how the elliptical arc is sampled.\r\n * @param structuredOutput flag indicating output format as follows:\r\n * * If false (default), return all fractions in one sorted (increasing), deduplicated array (a full ellipse includes\r\n * both 0 and 1).\r\n * * If true, fractions are assembled by quadrants:\r\n * * Each [[QuadrantFractions]] object holds at least three sorted (increasing), deduplicated fractions in a\r\n * specified quadrant of the arc.\r\n * * If only two fractions would be computed for a given `QuadrantFractions`, their midpoint is inserted to enable\r\n * tangent interpolation at both ends. Such a quadrant `q` is marked with `q.averageAdded = true`.\r\n * * The `QuadrantFractions` objects themselves are sorted by increasing order of the fractions they contain.\r\n * * If the arc sweep spans adjacent quadrants, the fraction bordering the quadrants appears in both `QuadrantFractions`.\r\n * * If the arc starts and ends in the same quadrant, two `QuadrantFractions` objects can be returned.\r\n * * This means there are between 1 and 5 objects in the `QuadrantFractions` array.\r\n * @internal\r\n */\r\n public computeSampleFractions(\r\n options: EllipticalArcApproximationOptions, structuredOutput: boolean = false,\r\n ): QuadrantFractions[] | number[] {\r\n if (!this.isValidEllipticalArc)\r\n return [];\r\n const compareRadiansIncreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\r\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\r\n return 0;\r\n return a0 < a1 ? -1 : 1;\r\n };\r\n const compareRadiansDecreasing: OrderedComparator<number> = (a0: number, a1: number): number => {\r\n if (Geometry.isAlmostEqualNumber(a0, a1, Geometry.smallAngleRadians))\r\n return 0;\r\n return a0 < a1 ? 1 : -1;\r\n };\r\n const compareQuadrantFractions: OrderedComparator<QuadrantFractions> = (\r\n q0: QuadrantFractions, q1: QuadrantFractions,\r\n ): number => {\r\n // ASSUME QuadrantFractions.fractions arrays are sorted (increasing) and have only trivial overlap\r\n if (compareFractionsIncreasing(q0.fractions[q0.fractions.length - 1], q1.fractions[0]) <= 0)\r\n return -1;\r\n if (compareFractionsIncreasing(q1.fractions[q1.fractions.length - 1], q0.fractions[0]) <= 0)\r\n return 1;\r\n return 0;\r\n };\r\n const shiftRadiansToSweep = (angle: number, sweep: AngleSweep): { angle: number, inSweep: boolean } => {\r\n const inSweep = sweep.isRadiansInSweep(angle, true);\r\n if (inSweep) {\r\n const fraction = sweep.radiansToSignedPeriodicFraction(angle);\r\n if (Geometry.isIn01(fraction))\r\n angle = sweep.fractionToRadians(fraction);\r\n }\r\n return { angle, inSweep };\r\n };\r\n const convertAndAddRadiansToFractionInRange = (\r\n dest: OrderedSet<number>, radians: number, sweep: AngleSweep, f0?: number, f1?: number,\r\n ): number | undefined => {\r\n if (undefined === f0)\r\n f0 = 0;\r\n if (undefined === f1)\r\n f1 = 1;\r\n if (f0 > f1)\r\n return convertAndAddRadiansToFractionInRange(dest, radians, sweep, f1, f0);\r\n const fraction = sweep.radiansToSignedPeriodicFraction(radians);\r\n if (fraction < (f0 - Geometry.smallFraction) || (f1 + Geometry.smallFraction) < fraction)\r\n return undefined; // angle is outside sweep\r\n Geometry.restrictToInterval(fraction, 0, 1);\r\n dest.add(fraction);\r\n return fraction;\r\n };\r\n const convertQ1RadiansInSweepToQuadrantFractions = (\r\n anglesInQ1: number[], angle0: number, angle1: number, sweep: AngleSweep,\r\n ): QuadrantFractions | undefined => {\r\n if (angle0 > angle1)\r\n return convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, angle1, angle0, sweep);\r\n if (Angle.isAlmostEqualRadiansNoPeriodShift(angle0, angle1))\r\n return undefined; // empty sweep\r\n const qData = QuadrantFractions.getQuadrantRadians(angle0, angle1);\r\n if (undefined === qData)\r\n return undefined; // no containing quadrant\r\n const qFractions = new OrderedSet<number>(compareFractionsIncreasing);\r\n const f0 = convertAndAddRadiansToFractionInRange(qFractions, angle0, sweep);\r\n const f1 = convertAndAddRadiansToFractionInRange(qFractions, angle1, sweep);\r\n if (undefined === f0 || undefined === f1)\r\n return undefined;\r\n for (const a0 of anglesInQ1) {\r\n let angle = a0;\r\n if (2 === qData.quadrant)\r\n angle = Angle.piRadians - angle;\r\n else if (3 === qData.quadrant)\r\n angle = Angle.piRadians + angle;\r\n else if (4 === qData.quadrant)\r\n angle = Angle.pi2Radians - angle;\r\n convertAndAddRadiansToFractionInRange(qFractions, angle, sweep, f0, f1);\r\n }\r\n const qf = QuadrantFractions.create(qData.quadrant, [...qFractions]);\r\n const n = qf.fractions.length;\r\n if (2 === n) { // e.g. elliptical arc is so small it contains no interior samples in this quadrant\r\n qf.fractions.splice(1, 0, Geometry.interpolate(qf.fractions[0], 0.5, qf.fractions[1]));\r\n qf.averageAdded = true;\r\n }\r\n return qf;\r\n };\r\n const computeStructuredOutput = (anglesInQ1: number[], arcSweep: AngleSweep): QuadrantFractions[] => {\r\n const qEndAngles = new OrderedSet<number>(arcSweep.isCCW ? compareRadiansIncreasing : compareRadiansDecreasing);\r\n qEndAngles.add(arcSweep.endRadians);\r\n for (const qAngle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians, Angle.pi2Radians]) {\r\n const shifted = shiftRadiansToSweep(qAngle, arcSweep);\r\n if (shifted.inSweep)\r\n qEndAngles.add(shifted.angle);\r\n }\r\n const quadrants = new OrderedSet<QuadrantFractions>(compareQuadrantFractions);\r\n let a0 = arcSweep.startRadians;\r\n for (const a1 of qEndAngles) {\r\n const quadrant = convertQ1RadiansInSweepToQuadrantFractions(anglesInQ1, a0, a1, arcSweep);\r\n if (quadrant)\r\n quadrants.add(quadrant);\r\n a0 = a1;\r\n }\r\n return [...quadrants];\r\n };\r\n const computeFlatOutput = (anglesInQ1: number[], arcSweep: AngleSweep): number[] => {\r\n // first add the quadrant fractions so the set prefers them over nearby interior fractions\r\n const fractions = new OrderedSet<number>(compareFractionsIncreasing);\r\n fractions.add(0);\r\n fractions.add(1);\r\n for (const angle of [0, Angle.piOver2Radians, Angle.piRadians, Angle.pi3Over2Radians])\r\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\r\n // add interior Q1 fractions, reflect to the other quadrants, filter by sweep and extant entry\r\n for (const angle0 of anglesInQ1) {\r\n for (const angle of [angle0, Angle.piRadians - angle0, Angle.piRadians + angle0, Angle.pi2Radians - angle0])\r\n convertAndAddRadiansToFractionInRange(fractions, angle, arcSweep);\r\n }\r\n return [...fractions];\r\n };\r\n // sample the (full) ellipse as angles in strict interior of Quadrant 1\r\n const radiansQ1: number[] = []; // unordered\r\n switch (options.sampleMethod) {\r\n case EllipticalArcSampleMethod.UniformParameter: {\r\n UniformParameterSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.UniformCurvature: {\r\n UniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.NonUniformCurvature: {\r\n NonUniformCurvatureSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n case EllipticalArcSampleMethod.AdaptiveSubdivision: {\r\n AdaptiveSubdivisionSampler.create(this, options).computeRadiansStrictlyInsideQuadrant1(radiansQ1);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n return structuredOutput ?\r\n computeStructuredOutput(radiansQ1, this.ellipticalArc.sweep) :\r\n computeFlatOutput(radiansQ1, this.ellipticalArc.sweep);\r\n }\r\n /** Construct a circular arc chain approximation to the elliptical arc. */\r\n public constructCircularArcChainApproximation(options?: EllipticalArcApproximationOptions): CurveChain | undefined {\r\n if (!this.isValidEllipticalArc)\r\n return undefined;\r\n if (!options)\r\n options = EllipticalArcApproximationOptions.create();\r\n const samples = this.computeSampleFractions(options, true) as QuadrantFractions[];\r\n const processor = ArcChainConstructionProcessor.create(this.ellipticalArc, options.forcePath);\r\n EllipticalArcApproximationContext.processQuadrantFractions(this.ellipticalArc, samples, processor);\r\n return processor.chain;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GapSearchContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/GapSearchContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAErE,qJAAqJ;AACrJ;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gCAAgC;IAC7D,MAAM,CAAS;IACtB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,MAAuB;QAC1C,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACe,sBAAsB,CAAC,KAAqB,EAAE,cAAsB;QAClF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,MAAM,CAAC;gBACrB,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBACjE,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF","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 */\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\nimport { CurvePrimitive } from \"../CurvePrimitive\";\nimport { RecursiveCurveProcessorWithStack } from \"../CurveProcessor\";\n\n// import { SumLengthsContext, GapSearchContext, CountLinearPartsSearchContext, CloneCurvesContext, TransformInPlaceContext } from \"./CurveSearches\";\n/**\n * Algorithmic class: Accumulate maximum gap between adjacent primitives of CurveChain.\n * @internal\n */\nexport class GapSearchContext extends RecursiveCurveProcessorWithStack {\n public maxGap: number;\n constructor() {\n super();\n this.maxGap = 0.0;\n }\n public static maxGap(target: CurveCollection): number {\n const context = new GapSearchContext();\n target.announceToCurveProcessor(context);\n return context.maxGap;\n }\n public override announceCurvePrimitive(curve: CurvePrimitive, _indexInParent: number): void {\n if (this._stack.length > 0) {\n const parent = this._stack[this._stack.length - 1];\n if (parent instanceof CurveChain) {\n const chain = parent;\n const nextCurve = chain.cyclicCurvePrimitive(_indexInParent + 1);\n if (curve !== undefined && nextCurve !== undefined) {\n this.maxGap = Math.max(this.maxGap, curve.endPoint().distance(nextCurve.startPoint()));\n }\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GapSearchContext.js","sourceRoot":"","sources":["../../../../src/curve/internalContexts/GapSearchContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AACH,OAAO,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAErE,qJAAqJ;AACrJ;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gCAAgC;IAC7D,MAAM,CAAS;IACtB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,MAAuB;QAC1C,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACe,sBAAsB,CAAC,KAAqB,EAAE,cAAsB;QAClF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,MAAM,CAAC;gBACrB,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBACjE,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF","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\nimport { CurveChain, CurveCollection } from \"../CurveCollection\";\r\nimport { CurvePrimitive } from \"../CurvePrimitive\";\r\nimport { RecursiveCurveProcessorWithStack } from \"../CurveProcessor\";\r\n\r\n// import { SumLengthsContext, GapSearchContext, CountLinearPartsSearchContext, CloneCurvesContext, TransformInPlaceContext } from \"./CurveSearches\";\r\n/**\r\n * Algorithmic class: Accumulate maximum gap between adjacent primitives of CurveChain.\r\n * @internal\r\n */\r\nexport class GapSearchContext extends RecursiveCurveProcessorWithStack {\r\n public maxGap: number;\r\n constructor() {\r\n super();\r\n this.maxGap = 0.0;\r\n }\r\n public static maxGap(target: CurveCollection): number {\r\n const context = new GapSearchContext();\r\n target.announceToCurveProcessor(context);\r\n return context.maxGap;\r\n }\r\n public override announceCurvePrimitive(curve: CurvePrimitive, _indexInParent: number): void {\r\n if (this._stack.length > 0) {\r\n const parent = this._stack[this._stack.length - 1];\r\n if (parent instanceof CurveChain) {\r\n const chain = parent;\r\n const nextCurve = chain.cyclicCurvePrimitive(_indexInParent + 1);\r\n if (curve !== undefined && nextCurve !== undefined) {\r\n this.maxGap = Math.max(this.maxGap, curve.endPoint().distance(nextCurve.startPoint()));\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -21,7 +21,7 @@ export declare class MultiChainCollector {
|
|
|
21
21
|
private _chains;
|
|
22
22
|
/** Largest gap distance to close. */
|
|
23
23
|
private _gapTolerance;
|
|
24
|
-
/** End point snap tolerance
|
|
24
|
+
/** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
|
|
25
25
|
private _snapTolerance;
|
|
26
26
|
/** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
|
|
27
27
|
private _planeTolerance;
|
|
@@ -30,14 +30,14 @@ export declare class MultiChainCollector {
|
|
|
30
30
|
private _xyzWork0?;
|
|
31
31
|
private _xyzWork1?;
|
|
32
32
|
/** Initialize with an empty array of chains.
|
|
33
|
-
* @param gapTolerance tolerance for calling endpoints identical
|
|
34
|
-
* @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
33
|
+
* @param gapTolerance distance tolerance for calling endpoints identical
|
|
34
|
+
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
35
35
|
*/
|
|
36
36
|
constructor(gapTolerance?: number, planeTolerance?: number);
|
|
37
37
|
/**
|
|
38
38
|
* Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
|
|
39
39
|
* @param xyz endpoint to check
|
|
40
|
-
* @param
|
|
40
|
+
* @param distanceTol absolute distance tolerance for equating endpoints
|
|
41
41
|
* @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
|
|
42
42
|
*/
|
|
43
43
|
private findAnyChainToConnect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,
|
|
1
|
+
{"version":3,"file":"MultiChainCollector.d.ts","sourceRoot":"","sources":["../../../../src/curve/internalContexts/MultiChainCollector.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAC9B,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAqB;IACpC,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,oFAAoF;IACpF,OAAO,CAAC,cAAc,CAAS;IAC/B,gIAAgI;IAChI,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAU;IACtC,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAU;IAE5B;;;OAGG;gBACgB,YAAY,SAA+B,EAAE,cAAc,CAAC,EAAE,MAAM;IAMvF;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;OAKG;IACI,qBAAqB,CAAC,SAAS,EAAE,cAAc;IAStD;;;;;OAKG;IACI,YAAY,CAAC,SAAS,EAAE,QAAQ;IAQvC,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAejC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAiC7B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA8CjC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAYjC,wCAAwC;IACxC,OAAO,CAAC,YAAY;IAMpB,qGAAqG;IACrG,OAAO,CAAC,wBAAwB;IAuBhC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA+B5B,wEAAwE;IACxE,OAAO,CAAC,mBAAmB;IAS3B,8EAA8E;IACvE,UAAU,CAAC,gBAAgB,GAAE,OAAe,GAAG,QAAQ,GAAG,SAAS;IAa1E;;;MAGE;IACK,4BAA4B,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;CAc9G"}
|
|
@@ -35,7 +35,7 @@ export class MultiChainCollector {
|
|
|
35
35
|
_chains;
|
|
36
36
|
/** Largest gap distance to close. */
|
|
37
37
|
_gapTolerance;
|
|
38
|
-
/** End point snap tolerance
|
|
38
|
+
/** End point snap tolerance. Internally, this is an upper bound on gapTolerance. */
|
|
39
39
|
_snapTolerance;
|
|
40
40
|
/** Planarity tolerance, used to determine whether to return a Path or Loop in `grabResult(true)`. If undefined, always Path. */
|
|
41
41
|
_planeTolerance;
|
|
@@ -44,8 +44,8 @@ export class MultiChainCollector {
|
|
|
44
44
|
_xyzWork0;
|
|
45
45
|
_xyzWork1;
|
|
46
46
|
/** Initialize with an empty array of chains.
|
|
47
|
-
* @param gapTolerance tolerance for calling endpoints identical
|
|
48
|
-
* @param planeTolerance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
47
|
+
* @param gapTolerance distance tolerance for calling endpoints identical
|
|
48
|
+
* @param planeTolerance distance tolerance for considering a closed chain to be planar. If undefined, only create Path. If defined, create Loops for closed chains within tolerance of a plane.
|
|
49
49
|
*/
|
|
50
50
|
constructor(gapTolerance = Geometry.smallMetricDistance, planeTolerance) {
|
|
51
51
|
this._chains = [];
|
|
@@ -56,19 +56,19 @@ export class MultiChainCollector {
|
|
|
56
56
|
/**
|
|
57
57
|
* Find a chain (with index _other than_ exceptChainIndex) that starts or ends at xyz
|
|
58
58
|
* @param xyz endpoint to check
|
|
59
|
-
* @param
|
|
59
|
+
* @param distanceTol absolute distance tolerance for equating endpoints
|
|
60
60
|
* @param exceptChainIndex index of chain to ignore. Send -1 to consider all chains.
|
|
61
61
|
*/
|
|
62
|
-
findAnyChainToConnect(xyz,
|
|
62
|
+
findAnyChainToConnect(xyz, distanceTol, exceptChainIndex = -1) {
|
|
63
63
|
for (let chainIndexA = 0; chainIndexA < this._chains.length; chainIndexA++) {
|
|
64
64
|
if (exceptChainIndex === chainIndexA)
|
|
65
65
|
continue;
|
|
66
66
|
const chain = this._chains[chainIndexA];
|
|
67
67
|
this._xyzWork1 = chain[chain.length - 1].endPoint(this._xyzWork1);
|
|
68
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
68
|
+
if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
|
|
69
69
|
return { chainIndex: chainIndexA, atEnd: true };
|
|
70
70
|
this._xyzWork1 = chain[0].startPoint(this._xyzWork1);
|
|
71
|
-
if (this._xyzWork1.isAlmostEqual(xyz,
|
|
71
|
+
if (this._xyzWork1.isAlmostEqual(xyz, distanceTol))
|
|
72
72
|
return { chainIndex: chainIndexA, atEnd: false };
|
|
73
73
|
}
|
|
74
74
|
return undefined;
|
|
@@ -165,17 +165,20 @@ export class MultiChainCollector {
|
|
|
165
165
|
* * If a "nearby" connection is possible, insert the candidate in the chain and force endpoint match.
|
|
166
166
|
* * Otherwise start a new chain.
|
|
167
167
|
*/
|
|
168
|
-
attachPrimitiveToAnyChain(candidate,
|
|
169
|
-
if (candidate) {
|
|
168
|
+
attachPrimitiveToAnyChain(candidate, distanceTol) {
|
|
169
|
+
if (candidate.curveLength() < distanceTol) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
170
173
|
this._xyzWork0 = candidate.startPoint(this._xyzWork0);
|
|
171
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
174
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
|
|
172
175
|
if (connect) {
|
|
173
176
|
if (connect.atEnd) {
|
|
174
177
|
const chain = this._chains[connect.chainIndex];
|
|
175
178
|
const index0 = chain.length - 1;
|
|
176
179
|
this._chains[connect.chainIndex].push(candidate);
|
|
177
180
|
MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
|
|
178
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
181
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
179
182
|
return true;
|
|
180
183
|
}
|
|
181
184
|
else {
|
|
@@ -183,13 +186,13 @@ export class MultiChainCollector {
|
|
|
183
186
|
const chain = this._chains[connect.chainIndex];
|
|
184
187
|
chain.splice(0, 0, candidate);
|
|
185
188
|
MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
|
|
186
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
189
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
187
190
|
return true;
|
|
188
191
|
}
|
|
189
192
|
}
|
|
190
193
|
else {
|
|
191
194
|
this._xyzWork0 = candidate.endPoint(this._xyzWork0);
|
|
192
|
-
connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
195
|
+
connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol);
|
|
193
196
|
if (connect) {
|
|
194
197
|
if (connect.atEnd) {
|
|
195
198
|
candidate.reverseInPlace();
|
|
@@ -197,14 +200,14 @@ export class MultiChainCollector {
|
|
|
197
200
|
const index0 = chain.length - 1;
|
|
198
201
|
this._chains[connect.chainIndex].push(candidate);
|
|
199
202
|
MultiChainCollector.moveHeadOrTail(chain[index0], chain[index0 + 1], this._gapTolerance);
|
|
200
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
203
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
201
204
|
return true;
|
|
202
205
|
}
|
|
203
206
|
else {
|
|
204
207
|
const chain = this._chains[connect.chainIndex];
|
|
205
208
|
chain.splice(0, 0, candidate);
|
|
206
209
|
MultiChainCollector.moveHeadOrTail(chain[0], chain[1], this._gapTolerance);
|
|
207
|
-
this.searchAndMergeChainIndex(connect.chainIndex,
|
|
210
|
+
this.searchAndMergeChainIndex(connect.chainIndex, distanceTol);
|
|
208
211
|
return true;
|
|
209
212
|
}
|
|
210
213
|
}
|
|
@@ -241,13 +244,13 @@ export class MultiChainCollector {
|
|
|
241
244
|
p.reverseInPlace();
|
|
242
245
|
}
|
|
243
246
|
/** See if the head or tail of chainIndex matches any existing chain. If so, merge the two chains. */
|
|
244
|
-
searchAndMergeChainIndex(chainIndex,
|
|
247
|
+
searchAndMergeChainIndex(chainIndex, distanceTol) {
|
|
245
248
|
// ASSUME valid index of non-empty chain
|
|
246
249
|
const chain = this._chains[chainIndex];
|
|
247
250
|
const lastIndexInChain = chain.length - 1;
|
|
248
251
|
this._xyzWork0 = chain[0].startPoint(this._xyzWork0);
|
|
249
252
|
// try start with any other chain
|
|
250
|
-
let connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
253
|
+
let connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
|
|
251
254
|
if (connect) {
|
|
252
255
|
if (!connect.atEnd)
|
|
253
256
|
this.reverseChain(connect.chainIndex);
|
|
@@ -256,7 +259,7 @@ export class MultiChainCollector {
|
|
|
256
259
|
}
|
|
257
260
|
// try end with any other chain
|
|
258
261
|
this._xyzWork0 = chain[lastIndexInChain].endPoint(this._xyzWork0);
|
|
259
|
-
connect = this.findAnyChainToConnect(this._xyzWork0,
|
|
262
|
+
connect = this.findAnyChainToConnect(this._xyzWork0, distanceTol, chainIndex);
|
|
260
263
|
if (connect) {
|
|
261
264
|
if (connect.atEnd)
|
|
262
265
|
this.reverseChain(connect.chainIndex);
|