@itwin/core-geometry 5.5.0-dev.4 → 5.5.0-dev.5
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/lib/cjs/Geometry.d.ts +7 -0
- package/lib/cjs/Geometry.d.ts.map +1 -1
- package/lib/cjs/Geometry.js +9 -0
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js +2 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js +4 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js +14 -4
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.d.ts +2 -0
- package/lib/cjs/bspline/BezierCurve3dH.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js +19 -3
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.d.ts +8 -2
- package/lib/cjs/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js +10 -4
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js +4 -4
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.d.ts +0 -3
- package/lib/cjs/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js +9 -2
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.d.ts +59 -9
- package/lib/cjs/clipping/ClipPrimitive.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js +124 -55
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.d.ts.map +1 -1
- package/lib/cjs/clipping/ClipVector.js +12 -8
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts +0 -2
- package/lib/cjs/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js +19 -18
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.d.ts +0 -1
- package/lib/cjs/core-geometry.d.ts.map +1 -1
- package/lib/cjs/core-geometry.js +0 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js +2 -2
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts +12 -4
- package/lib/cjs/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js +52 -33
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.d.ts.map +1 -1
- package/lib/cjs/curve/CurveCollection.js +13 -6
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.d.ts.map +1 -1
- package/lib/cjs/curve/CurveFactory.js +13 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.d.ts +12 -4
- package/lib/cjs/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js +14 -5
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.d.ts +5 -4
- package/lib/cjs/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js +7 -4
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/LineString3d.d.ts +25 -16
- package/lib/cjs/curve/LineString3d.d.ts.map +1 -1
- package/lib/cjs/curve/LineString3d.js +90 -72
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Path.d.ts +0 -3
- package/lib/cjs/curve/Path.d.ts.map +1 -1
- package/lib/cjs/curve/Path.js +9 -2
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js +25 -31
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts +7 -1
- package/lib/cjs/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js +27 -36
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js +7 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.d.ts.map +1 -1
- package/lib/cjs/curve/RegionOps.js +8 -5
- 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 +6 -6
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js +238 -110
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts +1 -4
- package/lib/cjs/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js +9 -9
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js +18 -18
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.d.ts +19 -7
- package/lib/cjs/geometry3d/Ellipsoid.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js +26 -11
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.d.ts.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js +11 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts +5 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js +11 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.d.ts +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts +49 -8
- package/lib/cjs/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js +90 -37
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts +100 -3
- package/lib/cjs/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js +125 -0
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts +10 -1
- package/lib/cjs/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js +53 -34
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts +49 -2
- package/lib/cjs/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js +67 -9
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.d.ts +24 -32
- package/lib/cjs/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js +147 -180
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js +13 -3
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.d.ts +0 -3
- package/lib/cjs/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js +5 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.d.ts +2 -2
- package/lib/cjs/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js +14 -18
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.d.ts +8 -0
- package/lib/cjs/geometry3d/Transform.d.ts.map +1 -1
- package/lib/cjs/geometry3d/Transform.js +15 -9
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.d.ts +4 -2
- package/lib/cjs/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js +6 -4
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Newton.d.ts +3 -1
- package/lib/cjs/numerics/Newton.d.ts.map +1 -1
- package/lib/cjs/numerics/Newton.js +5 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/polyface/AuxData.d.ts +1 -4
- package/lib/cjs/polyface/AuxData.d.ts.map +1 -1
- package/lib/cjs/polyface/AuxData.js +5 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/Polyface.d.ts.map +1 -1
- package/lib/cjs/polyface/Polyface.js +14 -16
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts +84 -28
- package/lib/cjs/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js +277 -217
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.d.ts +4 -3
- package/lib/cjs/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js +11 -4
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- 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 +9 -7
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js +2 -2
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js +4 -3
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js +4 -8
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js +1 -0
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js +37 -7
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.d.ts +4 -4
- package/lib/cjs/serialization/BGFBWriter.d.ts.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js +24 -40
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js +9 -3
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.d.ts +0 -3
- package/lib/cjs/serialization/SerializationHelpers.d.ts.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js +16 -7
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.d.ts +2 -2
- package/lib/cjs/solid/Box.d.ts.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.d.ts +3 -2
- package/lib/cjs/solid/Cone.d.ts.map +1 -1
- package/lib/cjs/solid/Cone.js +4 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts +1 -1
- package/lib/cjs/solid/LinearSweep.d.ts.map +1 -1
- package/lib/cjs/solid/LinearSweep.js +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js +1 -3
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.d.ts +4 -3
- package/lib/cjs/solid/TorusPipe.d.ts.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.d.ts +4 -4
- package/lib/cjs/topology/ChainMerge.d.ts.map +1 -1
- package/lib/cjs/topology/ChainMerge.js +11 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.d.ts +2 -0
- package/lib/cjs/topology/Graph.d.ts.map +1 -1
- package/lib/cjs/topology/Graph.js +5 -0
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js +2 -0
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js +23 -16
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts +20 -9
- package/lib/cjs/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js +17 -13
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js +3 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts +6 -2
- package/lib/cjs/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js +41 -35
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.d.ts +7 -3
- package/lib/cjs/topology/MaskManager.d.ts.map +1 -1
- package/lib/cjs/topology/MaskManager.js +10 -4
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/Triangulation.d.ts +2 -1
- package/lib/cjs/topology/Triangulation.d.ts.map +1 -1
- package/lib/cjs/topology/Triangulation.js +12 -7
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/esm/Geometry.d.ts +7 -0
- package/lib/esm/Geometry.d.ts.map +1 -1
- package/lib/esm/Geometry.js +9 -0
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js +2 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.d.ts.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js +4 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js +14 -4
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.d.ts +2 -0
- package/lib/esm/bspline/BezierCurve3dH.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js +19 -3
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.d.ts +8 -2
- package/lib/esm/bspline/BezierCurveBase.d.ts.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js +10 -4
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js +4 -4
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.d.ts +0 -3
- package/lib/esm/clipping/ClipPlane.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPlane.js +9 -2
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.d.ts +59 -9
- package/lib/esm/clipping/ClipPrimitive.d.ts.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js +124 -55
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.d.ts.map +1 -1
- package/lib/esm/clipping/ClipVector.js +12 -8
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts +0 -2
- package/lib/esm/clipping/ConvexClipPlaneSet.d.ts.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js +20 -19
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.d.ts.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js +4 -5
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.d.ts +0 -1
- package/lib/esm/core-geometry.d.ts.map +1 -1
- package/lib/esm/core-geometry.js +0 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js +2 -2
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts +12 -4
- package/lib/esm/curve/CurveChainWithDistanceIndex.d.ts.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js +53 -34
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.d.ts.map +1 -1
- package/lib/esm/curve/CurveCollection.js +13 -6
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveFactory.d.ts.map +1 -1
- package/lib/esm/curve/CurveFactory.js +13 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.d.ts +12 -4
- package/lib/esm/curve/CurveLocationDetail.d.ts.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js +14 -5
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.d.ts +5 -4
- package/lib/esm/curve/CurvePrimitive.d.ts.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js +7 -4
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/LineString3d.d.ts +25 -16
- package/lib/esm/curve/LineString3d.d.ts.map +1 -1
- package/lib/esm/curve/LineString3d.js +90 -72
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Path.d.ts +0 -3
- package/lib/esm/curve/Path.d.ts.map +1 -1
- package/lib/esm/curve/Path.js +9 -2
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.d.ts.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js +25 -31
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts +7 -1
- package/lib/esm/curve/Query/StrokeCountChain.d.ts.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js +27 -36
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.d.ts.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js +7 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.d.ts.map +1 -1
- package/lib/esm/curve/RegionOps.js +8 -5
- 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 +6 -6
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js +4 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js +6 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts +5 -21
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js +29 -73
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts +55 -13
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.d.ts.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js +239 -111
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts +1 -4
- package/lib/esm/curve/spiral/DirectSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js +9 -9
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts +11 -14
- package/lib/esm/curve/spiral/IntegratedSpiral3d.d.ts.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js +18 -18
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts +7 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.d.ts.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.d.ts +19 -7
- package/lib/esm/geometry3d/Ellipsoid.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js +26 -11
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.d.ts.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js +11 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts +5 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js +11 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.d.ts +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts +49 -8
- package/lib/esm/geometry3d/GrowableXYZArray.d.ts.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js +90 -37
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts +100 -3
- package/lib/esm/geometry3d/IndexedXYZCollection.d.ts.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js +125 -0
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts +10 -1
- package/lib/esm/geometry3d/Matrix3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js +53 -34
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts +49 -2
- package/lib/esm/geometry3d/Point3dArrayCarrier.d.ts.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js +67 -9
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.d.ts +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.d.ts +24 -32
- package/lib/esm/geometry3d/PolygonOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js +147 -180
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js +5 -5
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.d.ts.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js +13 -3
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.d.ts +0 -3
- package/lib/esm/geometry3d/Ray3d.d.ts.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js +5 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.d.ts +2 -2
- package/lib/esm/geometry3d/SortablePolygon.d.ts.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js +14 -18
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.d.ts +8 -0
- package/lib/esm/geometry3d/Transform.d.ts.map +1 -1
- package/lib/esm/geometry3d/Transform.js +15 -9
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.d.ts +4 -2
- package/lib/esm/numerics/ClusterableArray.d.ts.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js +6 -4
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Newton.d.ts +3 -1
- package/lib/esm/numerics/Newton.d.ts.map +1 -1
- package/lib/esm/numerics/Newton.js +5 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/polyface/AuxData.d.ts +1 -4
- package/lib/esm/polyface/AuxData.d.ts.map +1 -1
- package/lib/esm/polyface/AuxData.js +5 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js +3 -3
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/Polyface.d.ts.map +1 -1
- package/lib/esm/polyface/Polyface.js +14 -16
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.d.ts +84 -28
- package/lib/esm/polyface/PolyfaceBuilder.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js +277 -217
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.d.ts +4 -3
- package/lib/esm/polyface/PolyfaceClip.d.ts.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js +11 -4
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- 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 +9 -7
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js +3 -2
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.d.ts +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js +2 -2
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.d.ts.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js +14 -12
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js +10 -6
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js +4 -3
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js +3 -5
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.d.ts.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js +4 -8
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js +1 -0
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBReader.js +37 -7
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.d.ts +4 -4
- package/lib/esm/serialization/BGFBWriter.d.ts.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js +24 -40
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.d.ts.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js +9 -3
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.d.ts +0 -3
- package/lib/esm/serialization/SerializationHelpers.d.ts.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js +16 -7
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.d.ts +2 -2
- package/lib/esm/solid/Box.d.ts.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.d.ts +3 -2
- package/lib/esm/solid/Cone.d.ts.map +1 -1
- package/lib/esm/solid/Cone.js +4 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.d.ts +1 -1
- package/lib/esm/solid/LinearSweep.d.ts.map +1 -1
- package/lib/esm/solid/LinearSweep.js +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.d.ts.map +1 -1
- package/lib/esm/solid/RotationalSweep.js +1 -3
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/TorusPipe.d.ts +4 -3
- package/lib/esm/solid/TorusPipe.d.ts.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.d.ts +4 -4
- package/lib/esm/topology/ChainMerge.d.ts.map +1 -1
- package/lib/esm/topology/ChainMerge.js +11 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.d.ts +2 -0
- package/lib/esm/topology/Graph.d.ts.map +1 -1
- package/lib/esm/topology/Graph.js +5 -0
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js +2 -0
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js +23 -16
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts +20 -9
- package/lib/esm/topology/HalfEdgePositionDetail.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js +17 -13
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.d.ts.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js +4 -2
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts +6 -2
- package/lib/esm/topology/InsertAndRetriangulateContext.d.ts.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js +41 -35
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.d.ts +7 -3
- package/lib/esm/topology/MaskManager.d.ts.map +1 -1
- package/lib/esm/topology/MaskManager.js +10 -4
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.d.ts.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/Triangulation.d.ts +2 -1
- package/lib/esm/topology/Triangulation.d.ts.map +1 -1
- package/lib/esm/topology/Triangulation.js +12 -7
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/package.json +3 -3
- package/lib/cjs/serialization/GeometrySamples.d.ts +0 -705
- package/lib/cjs/serialization/GeometrySamples.d.ts.map +0 -1
- package/lib/cjs/serialization/GeometrySamples.js +0 -2433
- package/lib/cjs/serialization/GeometrySamples.js.map +0 -1
- package/lib/esm/serialization/GeometrySamples.d.ts +0 -705
- package/lib/esm/serialization/GeometrySamples.d.ts.map +0 -1
- package/lib/esm/serialization/GeometrySamples.js +0 -2428
- package/lib/esm/serialization/GeometrySamples.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BSplineCurveOps.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurveOps.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/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { BandedSystem } from \"../numerics/BandedSystem\";\r\nimport { BSplineCurve3d } from \"./BSplineCurve\";\r\nimport { InterpolationCurve3dOptions, InterpolationCurve3dProps } from \"./InterpolationCurve3d\";\r\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * A class with static methods for creating B-spline curves.\r\n * @public\r\n */\r\nexport class BSplineCurveOps {\r\n /**\r\n * Greville knot algorithm: alternative to traditional c2 cubic algorithm allowing for any order, but no end conditions or periodicity.\r\n * @param points pass-through points.\r\n * @param order bspline order (1 more than degree)\r\n */\r\n public static createThroughPoints(points: IndexedXYZCollection | Point3d[], order: number): BSplineCurve3d | undefined {\r\n const numPoints = points.length;\r\n if (order > numPoints || order < 2)\r\n return undefined;\r\n const degree = order - 1;\r\n const bw = 1 + 2 * degree; // probably less than that . . just zeros at fringe.\r\n const matrix = new Float64Array(bw * numPoints);\r\n const basisFunctions = new Float64Array(order);\r\n const rhs = new GrowableXYZArray();\r\n const knots = KnotVector.createUniformClamped(numPoints, order - 1, 0.0, 1.0);\r\n const xyz = Point3d.create();\r\n for (let basePointIndex = 0; basePointIndex < numPoints; basePointIndex++) {\r\n const u = knots.grevilleKnot(basePointIndex);\r\n const spanIndex = knots.knotToLeftKnotIndex(u);\r\n knots.evaluateBasisFunctions(spanIndex, u, basisFunctions);\r\n // puzzlement .. how do the max points shift within the order spots?\r\n let maxIndex = 0;\r\n for (let i = 1; i < order; i++)\r\n if (basisFunctions[i] > basisFunctions[maxIndex])\r\n maxIndex = i;\r\n const basisFunctionStartWithinRow = degree - maxIndex;\r\n const rowStart = basePointIndex * bw;\r\n for (let i = 0; i < order; i++) {\r\n const realColumn = basePointIndex - degree + basisFunctionStartWithinRow + i;\r\n if (rowStart + realColumn >= 0 && realColumn < numPoints)\r\n matrix[rowStart + basisFunctionStartWithinRow + i] = basisFunctions[i];\r\n }\r\n if (points instanceof IndexedXYZCollection) {\r\n rhs.push(points.getPoint3dAtUncheckedPointIndex(basePointIndex, xyz));\r\n } else {\r\n rhs.push(points[basePointIndex].clone());\r\n }\r\n }\r\n const poles = BandedSystem.solveBandedSystemMultipleRHS(numPoints, bw, matrix, 3, rhs.float64Data());\r\n if (poles) {\r\n return BSplineCurve3d.create(poles, knots.knots, order);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Construct BSplineCurve3d that fit points using the C2 cubic algorithm.\r\n * @param options curve definition, unmodified\r\n */\r\n public static createThroughPointsC2Cubic(options: InterpolationCurve3dOptions): BSplineCurve3d | undefined {\r\n // Work on a copy rather than installing computed knots/tangents that could become stale when fit points change\r\n // Knots/tangents that come in, however, are used without recomputation.\r\n const validatedOptions = options.clone();\r\n if (!this.C2CubicFit.validateOptions(validatedOptions))\r\n return undefined;\r\n\r\n const poles = this.C2CubicFit.constructPoles(validatedOptions);\r\n if (undefined === poles)\r\n return undefined;\r\n\r\n const fullKnots = this.C2CubicFit.convertFitParamsToCubicKnotVector(validatedOptions.knots, validatedOptions.closed);\r\n if (undefined === fullKnots)\r\n return undefined;\r\n\r\n const interpolant = BSplineCurve3d.create(poles, fullKnots, validatedOptions.order);\r\n\r\n if (validatedOptions.closed)\r\n interpolant?.setWrappable(BSplineWrapMode.OpenByAddingControlPoints);\r\n\r\n return interpolant;\r\n }\r\n}\r\n\r\n/**\r\n * Namespace for collecting curve fit API\r\n * @public\r\n */\r\nexport namespace BSplineCurveOps {\r\n /**\r\n * A helper class for creating C2 cubic fit curves.\r\n * Knots herein are understood to be *interior* knots (including the start/end knot),\r\n * so that there is one knot per fit point. In other words, the knots are fit parameters.\r\n * @private\r\n */\r\n export class C2CubicFit {\r\n /** Transform fit parameters to span [0,1]\r\n * @param knots fit parameters, normalized in place\r\n */\r\n private static normalizeKnots(knots: number[] | undefined): boolean {\r\n if (undefined === knots || knots.length < 2) {\r\n knots = undefined;\r\n return false;\r\n }\r\n const myKnots = KnotVector.create(knots, 1, false); // no extra knots at start/end\r\n if (!myKnots.normalize()) {\r\n knots = undefined;\r\n return false;\r\n }\r\n for (let i = 0; i < knots.length; ++i)\r\n knots[i] = myKnots.knots[i];\r\n return true;\r\n }\r\n\r\n /** Compute chord-length fit parameters for C2 cubic fit algorithm */\r\n private static constructChordLengthParameters(fitPoints: Point3d[]): number[] | undefined {\r\n if (fitPoints.length < 2)\r\n return undefined;\r\n const params: number[] = [0.0];\r\n for (let i = 1; i < fitPoints.length; ++i)\r\n params[i] = params[i - 1] + fitPoints[i].distance(fitPoints[i - 1]);\r\n if (!this.normalizeKnots(params))\r\n return undefined;\r\n return params;\r\n }\r\n\r\n /** Compute uniform fit parameters for C2 cubic fit algorithm */\r\n private static constructUniformParameters(numParams: number): number[] | undefined {\r\n if (numParams < 2)\r\n return undefined;\r\n const knots = KnotVector.createUniformClamped(numParams + 2, 3, 0.0, 1.0);\r\n const params: number[] = [];\r\n for (let i = knots.leftKnotIndex; i <= knots.rightKnotIndex; ++i)\r\n params.push(knots.knots[i]);\r\n return params;\r\n }\r\n\r\n /** Remove duplicate fit points, and their given knots in parallel */\r\n private static removeDuplicateFitPoints(options: InterpolationCurve3dOptions): boolean {\r\n if (undefined !== options.knots && options.knots.length !== options.fitPoints.length)\r\n options.knots = undefined;\r\n const carrier = new Point3dArrayCarrier(options.fitPoints);\r\n const indices = carrier.findOrderedDuplicates(undefined, true); // use default tolerance\r\n if (indices.length > 0) {\r\n // remove duplicate fit points, and their corresponding params\r\n let iWrite = 0;\r\n for (let iRead = 0, iIndex = 0; iRead < options.fitPoints.length; ++iRead) {\r\n if (iIndex < indices.length && iRead === indices[iIndex])\r\n ++iIndex; // skip the duplicate\r\n else {\r\n options.fitPoints[iWrite] = options.fitPoints[iRead];\r\n if (options.knots)\r\n options.knots[iWrite] = options.knots[iRead];\r\n ++iWrite;\r\n }\r\n }\r\n options.fitPoints.splice(iWrite);\r\n if (options.knots)\r\n options.knots.splice(iWrite);\r\n }\r\n return true;\r\n }\r\n\r\n /** Construct fit parameters for the c2 cubic fit algorithm.\r\n * @param fitPoints validated fit points (should not contain duplicates)\r\n * @param isChordLength whether knots are computed using distances between successive fit points\r\n * @param closed whether curve is periodically defined\r\n * @return fit parameters, one per fit point\r\n */\r\n public static constructFitParametersFromPoints(fitPoints: Point3d[], isChordLength: number | undefined, closed: boolean | undefined): number[] | undefined {\r\n let params: number[] | undefined;\r\n if (isChordLength || !closed)\r\n params = this.constructChordLengthParameters(fitPoints);\r\n if (undefined === params)\r\n params = this.constructUniformParameters(fitPoints.length);\r\n return params;\r\n }\r\n\r\n /** Construct fit parameters for the c2 cubic fit algorithm, if they are missing.\r\n * @param options validated as per validateOptions, possibly modified\r\n * @return whether fit parameters are valid\r\n */\r\n public static constructFitParameters(options: InterpolationCurve3dOptions): boolean {\r\n if (undefined === options.knots)\r\n options.knots = this.constructFitParametersFromPoints(options.fitPoints, options.isChordLenKnots, options.closed);\r\n return options.knots?.length === options.fitPoints.length;\r\n }\r\n\r\n /** Compute a row of the tridiagonal system matrix from Farin.\r\n * @param alpha sub-diagonal, length = # fit points\r\n * @param beta diagonal, length = # fit points\r\n * @param gamma super-diagonal, length = # fit points\r\n * @param index 0-based row index to set\r\n */\r\n private static computeAlphaBetaGamma(alpha: number[], beta: number[], gamma: number[], index: number, deltaIPlus1: number, deltaI: number, deltaIMinus1: number, deltaIMinus2: number) {\r\n let denomReciprocal = 1.0 / (deltaIMinus2 + deltaIMinus1 + deltaI);\r\n alpha[index] = deltaI * deltaI * denomReciprocal;\r\n beta[index] = deltaI * (deltaIMinus2 + deltaIMinus1) * denomReciprocal;\r\n\r\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI + deltaIPlus1);\r\n beta[index] += deltaIMinus1 * (deltaI + deltaIPlus1) * denomReciprocal;\r\n gamma[index] = deltaIMinus1 * deltaIMinus1 * denomReciprocal;\r\n\r\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI);\r\n alpha[index] *= denomReciprocal;\r\n beta[index] *= denomReciprocal;\r\n gamma[index] *= denomReciprocal;\r\n }\r\n\r\n /** Setup tridiagonal system for 2 fit points\r\n * @param alpha sub-diagonal, length = 2\r\n * @param beta diagonal, length = 2\r\n * @param gamma super-diagonal, length = 2\r\n */\r\n private static setUpSystem2Points(alpha: number[], beta: number[], gamma: number[]): boolean {\r\n if (alpha.length !== 2 || beta.length !== 2 || gamma.length !== 2)\r\n return false;\r\n\r\n // identity matrix\r\n alpha[0] = alpha[1] = gamma[0] = gamma[1] = 0.0;\r\n beta[0] = beta[1] = 1.0;\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system for 3 fit points\r\n * @param alpha sub-diagonal, length = 3\r\n * @param beta diagonal, length = 3\r\n * @param gamma super-diagonal, length = 3\r\n * @param options validated as per validateOptions, unmodified\r\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\r\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\r\n */\r\n private static setUpSystem3Points(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\r\n if (undefined === options.knots)\r\n return false;\r\n if (alpha.length !== 3 || beta.length !== 3 || gamma.length !== 3)\r\n return false;\r\n if (options.knots.length !== 3 || options.fitPoints.length !== 3)\r\n return false;\r\n\r\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\r\n\r\n // first row\r\n if (useNaturalStartTangent) {\r\n alpha[0] = 0.0;\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n sum = deltaI + deltaIPlus1;\r\n sumReciprocal = 1.0 / sum;\r\n beta[0] = (deltaI + sum) * sumReciprocal;\r\n gamma[0] = -deltaI * sumReciprocal;\r\n } else {\r\n alpha[0] = gamma[0] = 0.0;\r\n beta[0] = 1.0;\r\n }\r\n\r\n // middle row\r\n deltaIMinus1 = options.knots[1] - options.knots[0];\r\n deltaI = options.knots[2] - options.knots[1];\r\n sumReciprocal = 1.0 / (deltaIMinus1 + deltaI);\r\n sumReciprocal *= sumReciprocal;\r\n alpha[1] = deltaI * deltaI * sumReciprocal;\r\n beta[1] = 2.0 * (deltaI * deltaIMinus1) * sumReciprocal;\r\n gamma[1] = deltaIMinus1 * deltaIMinus1 * sumReciprocal;\r\n\r\n // last row\r\n if (useNaturalEndTangent) {\r\n deltaIMinus1 = options.knots[2] - options.knots[1];\r\n deltaIMinus2 = options.knots[1] - options.knots[0];\r\n sum = deltaIMinus2 + deltaIMinus1;\r\n sumReciprocal = 1.0 / sum;\r\n alpha[2] = -deltaIMinus1 * sumReciprocal;\r\n beta[2] = (deltaIMinus1 + sum) * sumReciprocal;\r\n gamma[2] = 0.0;\r\n } else {\r\n alpha[2] = gamma[2] = 0.0;\r\n beta[2] = 1.0;\r\n }\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system for 4 fit points or more\r\n * @param alpha sub-diagonal, length = # fit points\r\n * @param beta diagonal, length = # fit points\r\n * @param gamma super-diagonal, length = # fit points\r\n * @param options validated as per validateOptions, unmodified\r\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\r\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\r\n */\r\n private static setUpSystem4PointsOrMore(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\r\n if (undefined === options.knots)\r\n return false;\r\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== options.knots.length)\r\n return false;\r\n if (options.knots.length !== options.fitPoints.length)\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n const numIntervalsMinus1 = numIntervals - 1;\r\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\r\n\r\n if (options.closed) {\r\n // first row\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 0, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // second row\r\n deltaIMinus2 = deltaIMinus1;\r\n deltaIMinus1 = deltaI;\r\n deltaI = options.knots[2] - options.knots[1];\r\n deltaIPlus1 = options.knots[3] - options.knots[2];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // last row; there's one less equation than open case\r\n deltaIPlus1 = deltaIMinus1;\r\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n } else { // open\r\n // first row\r\n if (useNaturalStartTangent) {\r\n alpha[0] = 0.0;\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n sum = deltaI + deltaIPlus1;\r\n sumReciprocal = 1.0 / sum;\r\n beta[0] = (deltaI + sum) * sumReciprocal;\r\n gamma[0] = -deltaI * sumReciprocal;\r\n } else {\r\n alpha[0] = gamma[0] = 0.0;\r\n beta[0] = 1.0;\r\n }\r\n\r\n // second row\r\n deltaI = options.knots[2] - options.knots[1];\r\n deltaIMinus1 = options.knots[1] - options.knots[0];\r\n deltaIMinus2 = 0.0;\r\n deltaIPlus1 = options.knots[3] - options.knots[2];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // penultimate row\r\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\r\n deltaIPlus1 = 0.0;\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // last row\r\n if (useNaturalEndTangent) {\r\n deltaIMinus1 = options.knots[numIntervals] - options.knots[numIntervals - 1];\r\n deltaIMinus2 = options.knots[numIntervals - 1] - options.knots[numIntervals - 2];\r\n sum = deltaIMinus2 + deltaIMinus1;\r\n sumReciprocal = 1.0 / sum;\r\n alpha[numIntervals] = -deltaIMinus1 * sumReciprocal;\r\n beta[numIntervals] = (deltaIMinus1 + sum) * sumReciprocal;\r\n gamma[numIntervals] = 0.0;\r\n } else {\r\n alpha[numIntervals] = gamma[numIntervals] = 0.0;\r\n beta[numIntervals] = 1.0;\r\n }\r\n }\r\n\r\n // middle rows\r\n for (let i = 2; i < numIntervalsMinus1; ++i) {\r\n deltaI = options.knots[i + 1] - options.knots[i];\r\n deltaIMinus2 = options.knots[i - 1] - options.knots[i - 2];\r\n deltaIMinus1 = options.knots[i] - options.knots[i - 1];\r\n deltaIPlus1 = options.knots[i + 2] - options.knots[i + 1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, i, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n }\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system\r\n * @param alpha sub-diagonal, length = # fitPoints\r\n * @param beta diagonal, length = # fitPoints\r\n * @param gamma super-diagonal, length = # fitPoints\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setUpSystem(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions): boolean {\r\n let useNaturalStartTangent = false;\r\n let useNaturalEndTangent = false;\r\n if (options.isNaturalTangents && !options.closed) {\r\n useNaturalStartTangent = (undefined === options.startTangent);\r\n useNaturalEndTangent = (undefined === options.endTangent);\r\n }\r\n\r\n let succeeded = false;\r\n if (2 === options.fitPoints.length)\r\n succeeded = this.setUpSystem2Points(alpha, beta, gamma);\r\n else if (3 === options.fitPoints.length)\r\n succeeded = this.setUpSystem3Points(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\r\n else if (4 <= options.fitPoints.length)\r\n succeeded = this.setUpSystem4PointsOrMore(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\r\n\r\n return succeeded;\r\n }\r\n\r\n /** Set the Bessel end condition for the linear system.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setBesselEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n if (undefined === options.knots)\r\n return false;\r\n\r\n const scale = 1.0/3.0;\r\n const numIntervals = options.fitPoints.length - 1;\r\n\r\n if (1 === numIntervals) { // linear Bezier\r\n if (atStart)\r\n dataPts[0].interpolate(scale, dataPts[3], dataPts[1]);\r\n else\r\n dataPts[3].interpolate(scale, dataPts[0], dataPts[2]);\r\n return true;\r\n }\r\n\r\n if (2 === numIntervals) {\r\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[4], -beta * beta);\r\n if (atStart)\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\r\n else\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[4], beta).interpolate(scale, dataPts[4], dataPts[3]);\r\n return true;\r\n }\r\n\r\n // numIntervals > 2\r\n if (atStart) {\r\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[3], -beta * beta);\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\r\n } else {\r\n const alpha = (options.knots[numIntervals] - options.knots[numIntervals - 1]) / (options.knots[numIntervals] - options.knots[numIntervals - 2]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[numIntervals].plus2Scaled(dataPts[numIntervals - 1], -alpha * alpha, dataPts[numIntervals + 2], -beta * beta);\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[numIntervals + 2], beta).interpolate(scale, dataPts[numIntervals + 2], dataPts[numIntervals + 1]);\r\n }\r\n return true;\r\n }\r\n\r\n /** Set the natural end condition for the linear system.\r\n * This is the end condition used by ADSK for fit-splines with a given zero tangent.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setNaturalEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (1 === numIntervals)\r\n return this.setBesselEndCondition(dataPts, options, atStart);\r\n\r\n if (atStart)\r\n dataPts[1] = dataPts[0];\r\n else\r\n dataPts[dataPts.length - 2] = dataPts[dataPts.length - 1];\r\n return true;\r\n }\r\n\r\n /** Set the end condition for the linear system to the given tangent, scaled by chord length.\r\n * This is the end condition used by ADSK for fit-splines with a given nonzero tangent.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setChordLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const tangent = atStart ? options.startTangent : options.endTangent;\r\n if (undefined === tangent)\r\n return false;\r\n\r\n let iExt = 0; // index of first/last fitPoint\r\n let iSet = 0; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\r\n let iInt = 0; // index of 2nd/penultimate fitPoint\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (1 === numIntervals) { // no interior fit points\r\n if (atStart) {\r\n iExt = 0;\r\n iSet = 1;\r\n iInt = 3;\r\n } else {\r\n iExt = 3;\r\n iSet = 2;\r\n iInt = 0;\r\n }\r\n } else {\r\n if (atStart) {\r\n iExt = 0;\r\n iSet = 1;\r\n iInt = 2;\r\n } else {\r\n iExt = numIntervals + 2;\r\n iSet = numIntervals + 1;\r\n iInt = numIntervals;\r\n }\r\n }\r\n\r\n // NOTE: tangent points INTO curve\r\n const chordLength = dataPts[iInt].distance(dataPts[iExt]);\r\n dataPts[iExt].plusScaled(tangent, chordLength / 3.0, dataPts[iSet]);\r\n return true;\r\n }\r\n\r\n /** Set the end condition for the linear system to the given tangent, scaled by bessel length.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setBesselLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const tangent = atStart ? options.startTangent : options.endTangent;\r\n if (undefined === tangent)\r\n return false;\r\n\r\n // temporarily set bessel end condition\r\n if (!this.setBesselEndCondition(dataPts, options, atStart))\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n const iExt = atStart ? 0 : numIntervals + 2; // index of first/last fitPoint\r\n const iSet = atStart ? 1 : numIntervals + 1; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\r\n\r\n // reset end condition with our tangent, but scaled to the bessel tangent's length\r\n dataPts[iExt].plusScaled(tangent, dataPts[iExt].distance(dataPts[iSet]), dataPts[iSet]);\r\n return true;\r\n }\r\n\r\n /** Set the end condition for a physically closed (non-periodic) interpolant.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setPhysicallyClosedEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (!options.isColinearTangents\r\n || numIntervals <= 2\r\n || (undefined !== options.startTangent && undefined !== options.endTangent)\r\n || options.isNaturalTangents\r\n || !dataPts[0].isAlmostEqual(dataPts[numIntervals + 2])) {\r\n return true;\r\n }\r\n // force parallel start/end tangents, using chord length scale for undefined tangents\r\n if (undefined !== options.startTangent) { // start tangent is supplied; compute a parallel end tangent\r\n const outwardStartTangent = Vector3d.createStartEnd(dataPts[1], dataPts[0]).normalize();\r\n if (undefined !== outwardStartTangent) {\r\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\r\n dataPts[numIntervals + 2].plusScaled(outwardStartTangent, endTangentMag, dataPts[numIntervals + 1]);\r\n }\r\n } else if (undefined !== options.endTangent) { // end tangent is supplied; compute a parallel start tangent\r\n const outwardEndTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[numIntervals + 2]).normalize();\r\n if (undefined !== outwardEndTangent) {\r\n const startTangentMag = dataPts[0].distance(dataPts[1]);\r\n dataPts[0].plusScaled(outwardEndTangent, startTangentMag, dataPts[1]);\r\n }\r\n } else { // neither tangent is supplied, compute both along same vector\r\n const commonTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[1]).normalize();\r\n if (undefined !== commonTangent) {\r\n const startTangentMag = dataPts[0].distance(dataPts[1]);\r\n dataPts[0].plusScaled(commonTangent, startTangentMag, dataPts[1]);\r\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\r\n dataPts[numIntervals + 2].plusScaled(commonTangent, -endTangentMag, dataPts[numIntervals + 1]);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Set end conditions for the linear system to solve for the poles of the open interpolant, as per Farin 3e/4e.\r\n * @param dataPts array whose interior is the system rhs and whose first/last entries are the first/last fitPoints;\r\n * points are inserted to become the 2nd and penultimate dataPts, the first/last rows of the system rhs.\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setEndConditions(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\r\n if (dataPts.length !== options.fitPoints.length)\r\n return false;\r\n\r\n // insert dummy points to be computed below\r\n const dummy0 = Point3d.createZero();\r\n const dummy1 = Point3d.createZero();\r\n dataPts.splice(1, 0, dummy0);\r\n dataPts.splice(dataPts.length - 1, 0, dummy1);\r\n\r\n let succeeded = false;\r\n if (undefined === options.startTangent) {\r\n if (options.isNaturalTangents)\r\n succeeded = this.setNaturalEndCondition(dataPts, options, true);\r\n else\r\n succeeded = this.setBesselEndCondition(dataPts, options, true);\r\n } else { // scale startTangent\r\n if (options.isChordLenTangents)\r\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, true);\r\n else\r\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, true);\r\n }\r\n\r\n if (undefined === options.endTangent) {\r\n if (options.isNaturalTangents)\r\n succeeded = this.setNaturalEndCondition(dataPts, options, false);\r\n else\r\n succeeded = this.setBesselEndCondition(dataPts, options, false);\r\n } else { // scale endTangent\r\n if (options.isChordLenTangents)\r\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, false);\r\n else\r\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, false);\r\n }\r\n\r\n if (succeeded)\r\n succeeded = this.setPhysicallyClosedEndCondition(dataPts, options);\r\n\r\n return succeeded;\r\n }\r\n\r\n /** Solve the near tridiagonal system for a periodic C2 cubic interpolant.\r\n * Alpha, beta, gamma are computed by setUpSystem, have same length as fitPts, and are overwritten.\r\n */\r\n private static solveNearTridiagonal(fitPts: Point3d[], alpha: number[], beta: number[], gamma: number[]): Point3d[] | undefined {\r\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== fitPts.length)\r\n return undefined;\r\n const poles: Point3d[] = [];\r\n const numIntervals = fitPts.length - 1;\r\n const leftPts = fitPts.slice(0, -1); // last fitPt is ignored\r\n let tmp: number | undefined = 0.0;\r\n\r\n // first forward substitution\r\n for (let i = 1; i < numIntervals; ++i) {\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(- alpha[i], beta[i - 1])))\r\n return undefined;\r\n beta[i] += tmp * gamma[i - 1];\r\n alpha[i] = tmp * alpha[i - 1];\r\n leftPts[i].addScaledInPlace(leftPts[i - 1], tmp);\r\n }\r\n\r\n // first backward substitution\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[numIntervals - 1] + alpha[numIntervals - 1])))\r\n return undefined;\r\n gamma[numIntervals - 1] *= tmp;\r\n leftPts[numIntervals - 1].scaleInPlace(tmp);\r\n for (let i = numIntervals - 2; i >= 0; --i) {\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[i])))\r\n return undefined;\r\n Point3d.createScale(leftPts[i].plus2Scaled(leftPts[i + 1], - gamma[i], leftPts[numIntervals - 1], - alpha[i]), tmp, leftPts[i]);\r\n gamma[i] = - (gamma[i] * gamma[i + 1] + alpha[i] * gamma[numIntervals - 1]) * tmp;\r\n }\r\n\r\n // second forward substitution\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, 1.0 + gamma[0])))\r\n return undefined;\r\n poles.push(Point3d.createScale(leftPts[0], tmp));\r\n for (let i = 1; i < numIntervals; ++i) {\r\n poles.push(leftPts[i].plusScaled(poles[0], - gamma[i]));\r\n }\r\n return poles;\r\n }\r\n\r\n /** Adjust options by correcting invalid combinations\r\n * @param options curve definition, possibly modified\r\n */\r\n public static validateOptions(options: InterpolationCurve3dOptions): boolean {\r\n options.order = 4;\r\n\r\n // remove relevant exterior knots so knots and fit points align *before* we start compressing fit points.\r\n options.knots = this.convertCubicKnotVectorToFitParams(options.knots, options.fitPoints.length, true);\r\n\r\n // compress out duplicate fit points (and their corresponding knots)\r\n if (!this.removeDuplicateFitPoints(options))\r\n return false;\r\n\r\n let hasClosurePoint = (options.fitPoints.length > 1) && options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\r\n\r\n // if only 2 unique points, then must create open curve\r\n if (3 === options.fitPoints.length && hasClosurePoint) {\r\n options.fitPoints.pop();\r\n if (undefined !== options.knots)\r\n options.knots.pop();\r\n hasClosurePoint = options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\r\n }\r\n if (options.fitPoints.length <= 2) {\r\n if (hasClosurePoint)\r\n return false;\r\n options.closed = false;\r\n }\r\n\r\n // append closure point if missing\r\n if (options.closed) {\r\n if (!hasClosurePoint) {\r\n options.fitPoints.push(options.fitPoints[0].clone());\r\n if (undefined !== options.knots) { // best guess: uniform knots\r\n options.knots.push(options.knots[options.knots.length - 1] + (options.knots[options.knots.length - 1] - options.knots[0]) / (options.knots.length - 1));\r\n }\r\n }\r\n if (options.fitPoints.length <= 4)\r\n options.closed = false; // can't fit cubic closed curve to 3 unique points\r\n }\r\n\r\n if (options.fitPoints.length < 2)\r\n return false;\r\n\r\n // ASSUME: tangents point INTO curve\r\n if (undefined !== options.startTangent) {\r\n if (options.startTangent.isAlmostZero)\r\n options.startTangent = undefined;\r\n else\r\n options.startTangent.normalizeInPlace();\r\n }\r\n if (undefined !== options.endTangent) {\r\n if (options.endTangent.isAlmostZero)\r\n options.endTangent = undefined;\r\n else\r\n options.endTangent.normalizeInPlace();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Converts a full cubic knot vector of expected length into fit parameters, by removing extraneous exterior knots.\r\n * @param knots cubic knot vector, unmodified\r\n * @param numFitPoints number of fit points\r\n * @return fit parameters, or undefined if unexpected input\r\n **/\r\n public static convertCubicKnotVectorToFitParams(knots: number[] | undefined, numFitPoints: number, normalize?: boolean): number[] | undefined {\r\n let params = knots?.slice();\r\n if (undefined !== params) {\r\n const numExtraKnots = params.length - numFitPoints;\r\n switch (numExtraKnots) {\r\n case 0: { // ASSUME caller passed in interior knots\r\n break;\r\n }\r\n case 4: // modern full cubic knots\r\n case 6: { // legacy full cubic knots\r\n for (let i = 0; i < numExtraKnots / 2; ++i) {\r\n params.pop();\r\n params.shift();\r\n }\r\n break;\r\n }\r\n default: { // other knot configurations are unusable\r\n params = undefined;\r\n break;\r\n }\r\n }\r\n if (normalize && !this.normalizeKnots(params))\r\n params = undefined;\r\n }\r\n return params;\r\n }\r\n\r\n /** Return fit parameters augmented to a full cubic knot vector.\r\n * @param params fit parameters, unmodified\r\n * @param legacy whether to create a legacy (DGN) full knot vector, or modern vector with two less knots\r\n **/\r\n public static convertFitParamsToCubicKnotVector(params: number[] | undefined, closed?: boolean, legacy?: boolean): number[] | undefined {\r\n const knots = params?.slice();\r\n if (undefined !== knots) {\r\n const numExtraKnots = legacy ? 6 : 4;\r\n if (closed) {\r\n const iTail = knots.length - 2;\r\n for (let iHead = 2; iHead <= numExtraKnots; iHead += 2) {\r\n knots.unshift(knots[iTail] - 1.0); // index is constant\r\n knots.push(1.0 + knots[iHead]); // index increments by two\r\n }\r\n } else {\r\n for (let i = 0; i < numExtraKnots / 2; ++i) {\r\n knots.unshift(0.0);\r\n knots.push(1.0);\r\n }\r\n }\r\n }\r\n return knots;\r\n }\r\n\r\n /** Ensure full legacy knot vector for JSON export **/\r\n public static convertToJsonKnots(props: InterpolationCurve3dProps) {\r\n if (undefined !== props.knots) {\r\n props.knots = this.convertCubicKnotVectorToFitParams(props.knots, props.fitPoints.length, false);\r\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\r\n } else {\r\n props.knots = this.constructFitParametersFromPoints(Point3dArray.clonePoint3dArray(props.fitPoints), props.isChordLenKnots, props.closed);\r\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\r\n }\r\n }\r\n\r\n /** Construct the control points for the c2 cubic fit algorithm\r\n * @param options validated as per validateOptions, possibly modified\r\n */\r\n public static constructPoles(options: InterpolationCurve3dOptions): Point3d[] | Float64Array | undefined {\r\n if (!this.constructFitParameters(options) || (undefined === options.knots))\r\n return undefined;\r\n\r\n const numRow = options.fitPoints.length;\r\n const alpha: number[] = Array(numRow);\r\n const beta: number[] = Array(numRow);\r\n const gamma: number[] = Array(numRow);\r\n if (!this.setUpSystem(alpha, beta, gamma, options))\r\n return undefined;\r\n\r\n let poles: Point3d[] | Float64Array | undefined = [];\r\n if (!options.closed) {\r\n const dataPts = options.fitPoints.slice();\r\n if (!this.setEndConditions(dataPts, options))\r\n return undefined;\r\n if (dataPts.length !== numRow + 2)\r\n return undefined; // sanity check: we added 2nd/penultimate points, rhs is middle numRow entries.\r\n\r\n // construct tridiagonal banded system components\r\n const matrix = new Float64Array(numRow * 3);\r\n const rhs = new Float64Array(numRow * 3);\r\n for (let iRow = 0, iMatrixRead = 0, iRhsRead = 0; iRow < numRow; ++iRow) {\r\n matrix[iMatrixRead++] = alpha[iRow];\r\n matrix[iMatrixRead++] = beta[iRow];\r\n matrix[iMatrixRead++] = gamma[iRow];\r\n rhs[iRhsRead++] = dataPts[iRow+1].x;\r\n rhs[iRhsRead++] = dataPts[iRow+1].y;\r\n rhs[iRhsRead++] = dataPts[iRow+1].z;\r\n }\r\n\r\n const solution = BandedSystem.solveBandedSystemMultipleRHS(numRow, 3, matrix, 3, rhs);\r\n if (undefined === solution)\r\n return undefined;\r\n\r\n // pre/append first/last poles/fitPoints\r\n poles = new Float64Array(3 + solution.length + 3);\r\n let iWrite = 0;\r\n poles[iWrite++] = options.fitPoints[0].x;\r\n poles[iWrite++] = options.fitPoints[0].y;\r\n poles[iWrite++] = options.fitPoints[0].z;\r\n for (let iRead = 0; iRead < solution.length; ) {\r\n poles[iWrite++] = solution[iRead++];\r\n }\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].x;\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].y;\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].z;\r\n } else { // closed\r\n if (undefined !== (poles = this.solveNearTridiagonal(options.fitPoints, alpha, beta, gamma))) {\r\n if (poles.length > 2) {\r\n poles.unshift(poles.pop()!); // shift poles right to line up with the knots\r\n for (let i = 0; i < options.order - 1; ++i)\r\n poles.push(poles[i].clone()); // periodically extend (the modern way)\r\n }\r\n }\r\n }\r\n return poles;\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BSplineCurveOps.js","sourceRoot":"","sources":["../../../src/bspline/BSplineCurveOps.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/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Geometry } from \"../Geometry\";\r\nimport { GrowableXYZArray } from \"../geometry3d/GrowableXYZArray\";\r\nimport { IndexedXYZCollection } from \"../geometry3d/IndexedXYZCollection\";\r\nimport { Point3dArrayCarrier } from \"../geometry3d/Point3dArrayCarrier\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { BandedSystem } from \"../numerics/BandedSystem\";\r\nimport { BSplineCurve3d } from \"./BSplineCurve\";\r\nimport { InterpolationCurve3dOptions, InterpolationCurve3dProps } from \"./InterpolationCurve3d\";\r\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * A class with static methods for creating B-spline curves.\r\n * @public\r\n */\r\nexport class BSplineCurveOps {\r\n /**\r\n * Greville knot algorithm: alternative to traditional c2 cubic algorithm allowing for any order, but no end conditions or periodicity.\r\n * @param points pass-through points.\r\n * @param order bspline order (1 more than degree)\r\n */\r\n public static createThroughPoints(points: IndexedXYZCollection | Point3d[], order: number): BSplineCurve3d | undefined {\r\n const numPoints = points.length;\r\n if (order > numPoints || order < 2)\r\n return undefined;\r\n const degree = order - 1;\r\n const bw = 1 + 2 * degree; // probably less than that . . just zeros at fringe.\r\n const matrix = new Float64Array(bw * numPoints);\r\n const basisFunctions = new Float64Array(order);\r\n const rhs = new GrowableXYZArray();\r\n const knots = KnotVector.createUniformClamped(numPoints, order - 1, 0.0, 1.0);\r\n const xyz = Point3d.create();\r\n for (let basePointIndex = 0; basePointIndex < numPoints; basePointIndex++) {\r\n const u = knots.grevilleKnot(basePointIndex);\r\n const spanIndex = knots.knotToLeftKnotIndex(u);\r\n knots.evaluateBasisFunctions(spanIndex, u, basisFunctions);\r\n // puzzlement .. how do the max points shift within the order spots?\r\n let maxIndex = 0;\r\n for (let i = 1; i < order; i++)\r\n if (basisFunctions[i] > basisFunctions[maxIndex])\r\n maxIndex = i;\r\n const basisFunctionStartWithinRow = degree - maxIndex;\r\n const rowStart = basePointIndex * bw;\r\n for (let i = 0; i < order; i++) {\r\n const realColumn = basePointIndex - degree + basisFunctionStartWithinRow + i;\r\n if (rowStart + realColumn >= 0 && realColumn < numPoints)\r\n matrix[rowStart + basisFunctionStartWithinRow + i] = basisFunctions[i];\r\n }\r\n if (points instanceof IndexedXYZCollection) {\r\n rhs.push(points.getPoint3dAtUncheckedPointIndex(basePointIndex, xyz));\r\n } else {\r\n rhs.push(points[basePointIndex].clone());\r\n }\r\n }\r\n const poles = BandedSystem.solveBandedSystemMultipleRHS(numPoints, bw, matrix, 3, rhs.float64Data());\r\n if (poles) {\r\n return BSplineCurve3d.create(poles, knots.knots, order);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Construct BSplineCurve3d that fit points using the C2 cubic algorithm.\r\n * @param options curve definition, unmodified\r\n */\r\n public static createThroughPointsC2Cubic(options: InterpolationCurve3dOptions): BSplineCurve3d | undefined {\r\n // Work on a copy rather than installing computed knots/tangents that could become stale when fit points change\r\n // Knots/tangents that come in, however, are used without recomputation.\r\n const validatedOptions = options.clone();\r\n if (!this.C2CubicFit.validateOptions(validatedOptions))\r\n return undefined;\r\n\r\n const poles = this.C2CubicFit.constructPoles(validatedOptions);\r\n if (undefined === poles)\r\n return undefined;\r\n\r\n const fullKnots = this.C2CubicFit.convertFitParamsToCubicKnotVector(validatedOptions.knots, validatedOptions.closed);\r\n if (undefined === fullKnots)\r\n return undefined;\r\n\r\n const interpolant = BSplineCurve3d.create(poles, fullKnots, validatedOptions.order);\r\n\r\n if (validatedOptions.closed)\r\n interpolant?.setWrappable(BSplineWrapMode.OpenByAddingControlPoints);\r\n\r\n return interpolant;\r\n }\r\n}\r\n\r\n/**\r\n * Namespace for collecting curve fit API\r\n * @public\r\n */\r\nexport namespace BSplineCurveOps {\r\n /**\r\n * A helper class for creating C2 cubic fit curves.\r\n * Knots herein are understood to be *interior* knots (including the start/end knot),\r\n * so that there is one knot per fit point. In other words, the knots are fit parameters.\r\n * @private\r\n */\r\n export class C2CubicFit {\r\n /** Transform fit parameters to span [0,1]\r\n * @param knots fit parameters, normalized in place\r\n */\r\n private static normalizeKnots(knots: number[] | undefined): boolean {\r\n if (undefined === knots || knots.length < 2) {\r\n knots = undefined;\r\n return false;\r\n }\r\n const myKnots = KnotVector.create(knots, 1, false); // no extra knots at start/end\r\n if (!myKnots.normalize()) {\r\n knots = undefined;\r\n return false;\r\n }\r\n for (let i = 0; i < knots.length; ++i)\r\n knots[i] = myKnots.knots[i];\r\n return true;\r\n }\r\n\r\n /** Compute chord-length fit parameters for C2 cubic fit algorithm */\r\n private static constructChordLengthParameters(fitPoints: Point3d[]): number[] | undefined {\r\n if (fitPoints.length < 2)\r\n return undefined;\r\n const params: number[] = [0.0];\r\n for (let i = 1; i < fitPoints.length; ++i)\r\n params[i] = params[i - 1] + fitPoints[i].distance(fitPoints[i - 1]);\r\n if (!this.normalizeKnots(params))\r\n return undefined;\r\n return params;\r\n }\r\n\r\n /** Compute uniform fit parameters for C2 cubic fit algorithm */\r\n private static constructUniformParameters(numParams: number): number[] | undefined {\r\n if (numParams < 2)\r\n return undefined;\r\n const knots = KnotVector.createUniformClamped(numParams + 2, 3, 0.0, 1.0);\r\n const params: number[] = [];\r\n for (let i = knots.leftKnotIndex; i <= knots.rightKnotIndex; ++i)\r\n params.push(knots.knots[i]);\r\n return params;\r\n }\r\n\r\n /** Remove duplicate fit points, and their given knots in parallel */\r\n private static removeDuplicateFitPoints(options: InterpolationCurve3dOptions): boolean {\r\n if (undefined !== options.knots && options.knots.length !== options.fitPoints.length)\r\n options.knots = undefined;\r\n const carrier = new Point3dArrayCarrier(options.fitPoints);\r\n const indices = carrier.findOrderedDuplicates(undefined, true); // use default tolerance\r\n if (indices.length > 0) {\r\n // remove duplicate fit points, and their corresponding params\r\n let iWrite = 0;\r\n for (let iRead = 0, iIndex = 0; iRead < options.fitPoints.length; ++iRead) {\r\n if (iIndex < indices.length && iRead === indices[iIndex])\r\n ++iIndex; // skip the duplicate\r\n else {\r\n options.fitPoints[iWrite] = options.fitPoints[iRead];\r\n if (options.knots)\r\n options.knots[iWrite] = options.knots[iRead];\r\n ++iWrite;\r\n }\r\n }\r\n options.fitPoints.splice(iWrite);\r\n if (options.knots)\r\n options.knots.splice(iWrite);\r\n }\r\n return true;\r\n }\r\n\r\n /** Construct fit parameters for the c2 cubic fit algorithm.\r\n * @param fitPoints validated fit points (should not contain duplicates)\r\n * @param isChordLength whether knots are computed using distances between successive fit points\r\n * @param closed whether curve is periodically defined\r\n * @return fit parameters, one per fit point\r\n */\r\n public static constructFitParametersFromPoints(fitPoints: Point3d[], isChordLength: number | undefined, closed: boolean | undefined): number[] | undefined {\r\n let params: number[] | undefined;\r\n if (isChordLength || !closed)\r\n params = this.constructChordLengthParameters(fitPoints);\r\n if (undefined === params)\r\n params = this.constructUniformParameters(fitPoints.length);\r\n return params;\r\n }\r\n\r\n /** Construct fit parameters for the c2 cubic fit algorithm, if they are missing.\r\n * @param options validated as per validateOptions, possibly modified\r\n * @return whether fit parameters are valid\r\n */\r\n public static constructFitParameters(options: InterpolationCurve3dOptions): boolean {\r\n if (undefined === options.knots)\r\n options.knots = this.constructFitParametersFromPoints(options.fitPoints, options.isChordLenKnots, options.closed);\r\n return options.knots?.length === options.fitPoints.length;\r\n }\r\n\r\n /** Compute a row of the tridiagonal system matrix from Farin.\r\n * @param alpha sub-diagonal, length = # fit points\r\n * @param beta diagonal, length = # fit points\r\n * @param gamma super-diagonal, length = # fit points\r\n * @param index 0-based row index to set\r\n */\r\n private static computeAlphaBetaGamma(alpha: number[], beta: number[], gamma: number[], index: number, deltaIPlus1: number, deltaI: number, deltaIMinus1: number, deltaIMinus2: number) {\r\n let denomReciprocal = 1.0 / (deltaIMinus2 + deltaIMinus1 + deltaI);\r\n alpha[index] = deltaI * deltaI * denomReciprocal;\r\n beta[index] = deltaI * (deltaIMinus2 + deltaIMinus1) * denomReciprocal;\r\n\r\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI + deltaIPlus1);\r\n beta[index] += deltaIMinus1 * (deltaI + deltaIPlus1) * denomReciprocal;\r\n gamma[index] = deltaIMinus1 * deltaIMinus1 * denomReciprocal;\r\n\r\n denomReciprocal = 1.0 / (deltaIMinus1 + deltaI);\r\n alpha[index] *= denomReciprocal;\r\n beta[index] *= denomReciprocal;\r\n gamma[index] *= denomReciprocal;\r\n }\r\n\r\n /** Setup tridiagonal system for 2 fit points\r\n * @param alpha sub-diagonal, length = 2\r\n * @param beta diagonal, length = 2\r\n * @param gamma super-diagonal, length = 2\r\n */\r\n private static setUpSystem2Points(alpha: number[], beta: number[], gamma: number[]): boolean {\r\n if (alpha.length !== 2 || beta.length !== 2 || gamma.length !== 2)\r\n return false;\r\n\r\n // identity matrix\r\n alpha[0] = alpha[1] = gamma[0] = gamma[1] = 0.0;\r\n beta[0] = beta[1] = 1.0;\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system for 3 fit points\r\n * @param alpha sub-diagonal, length = 3\r\n * @param beta diagonal, length = 3\r\n * @param gamma super-diagonal, length = 3\r\n * @param options validated as per validateOptions, unmodified\r\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\r\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\r\n */\r\n private static setUpSystem3Points(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\r\n if (undefined === options.knots)\r\n return false;\r\n if (alpha.length !== 3 || beta.length !== 3 || gamma.length !== 3)\r\n return false;\r\n if (options.knots.length !== 3 || options.fitPoints.length !== 3)\r\n return false;\r\n\r\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\r\n\r\n // first row\r\n if (useNaturalStartTangent) {\r\n alpha[0] = 0.0;\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n sum = deltaI + deltaIPlus1;\r\n sumReciprocal = 1.0 / sum;\r\n beta[0] = (deltaI + sum) * sumReciprocal;\r\n gamma[0] = -deltaI * sumReciprocal;\r\n } else {\r\n alpha[0] = gamma[0] = 0.0;\r\n beta[0] = 1.0;\r\n }\r\n\r\n // middle row\r\n deltaIMinus1 = options.knots[1] - options.knots[0];\r\n deltaI = options.knots[2] - options.knots[1];\r\n sumReciprocal = 1.0 / (deltaIMinus1 + deltaI);\r\n sumReciprocal *= sumReciprocal;\r\n alpha[1] = deltaI * deltaI * sumReciprocal;\r\n beta[1] = 2.0 * (deltaI * deltaIMinus1) * sumReciprocal;\r\n gamma[1] = deltaIMinus1 * deltaIMinus1 * sumReciprocal;\r\n\r\n // last row\r\n if (useNaturalEndTangent) {\r\n deltaIMinus1 = options.knots[2] - options.knots[1];\r\n deltaIMinus2 = options.knots[1] - options.knots[0];\r\n sum = deltaIMinus2 + deltaIMinus1;\r\n sumReciprocal = 1.0 / sum;\r\n alpha[2] = -deltaIMinus1 * sumReciprocal;\r\n beta[2] = (deltaIMinus1 + sum) * sumReciprocal;\r\n gamma[2] = 0.0;\r\n } else {\r\n alpha[2] = gamma[2] = 0.0;\r\n beta[2] = 1.0;\r\n }\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system for 4 fit points or more\r\n * @param alpha sub-diagonal, length = # fit points\r\n * @param beta diagonal, length = # fit points\r\n * @param gamma super-diagonal, length = # fit points\r\n * @param options validated as per validateOptions, unmodified\r\n * @param useNaturalStartTangent whether to bake the natural end condition into the first row\r\n * @param useNaturalEndTangent whether to bake the natural end condition into the last row\r\n */\r\n private static setUpSystem4PointsOrMore(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions, useNaturalStartTangent: boolean, useNaturalEndTangent: boolean): boolean {\r\n if (undefined === options.knots)\r\n return false;\r\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== options.knots.length)\r\n return false;\r\n if (options.knots.length !== options.fitPoints.length)\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n const numIntervalsMinus1 = numIntervals - 1;\r\n let deltaIPlus1 = 0, deltaI = 0, deltaIMinus1 = 0, deltaIMinus2 = 0, sum = 0, sumReciprocal = 0;\r\n\r\n if (options.closed) {\r\n // first row\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 0, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // second row\r\n deltaIMinus2 = deltaIMinus1;\r\n deltaIMinus1 = deltaI;\r\n deltaI = options.knots[2] - options.knots[1];\r\n deltaIPlus1 = options.knots[3] - options.knots[2];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // last row; there's one less equation than open case\r\n deltaIPlus1 = deltaIMinus1;\r\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n } else { // open\r\n // first row\r\n if (useNaturalStartTangent) {\r\n alpha[0] = 0.0;\r\n deltaI = options.knots[1] - options.knots[0];\r\n deltaIPlus1 = options.knots[2] - options.knots[1];\r\n sum = deltaI + deltaIPlus1;\r\n sumReciprocal = 1.0 / sum;\r\n beta[0] = (deltaI + sum) * sumReciprocal;\r\n gamma[0] = -deltaI * sumReciprocal;\r\n } else {\r\n alpha[0] = gamma[0] = 0.0;\r\n beta[0] = 1.0;\r\n }\r\n\r\n // second row\r\n deltaI = options.knots[2] - options.knots[1];\r\n deltaIMinus1 = options.knots[1] - options.knots[0];\r\n deltaIMinus2 = 0.0;\r\n deltaIPlus1 = options.knots[3] - options.knots[2];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, 1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // penultimate row\r\n deltaI = options.knots[numIntervalsMinus1 + 1] - options.knots[numIntervalsMinus1];\r\n deltaIMinus1 = options.knots[numIntervalsMinus1] - options.knots[numIntervalsMinus1 - 1];\r\n deltaIMinus2 = options.knots[numIntervalsMinus1 - 1] - options.knots[numIntervalsMinus1 - 2];\r\n deltaIPlus1 = 0.0;\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, numIntervalsMinus1, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n\r\n // last row\r\n if (useNaturalEndTangent) {\r\n deltaIMinus1 = options.knots[numIntervals] - options.knots[numIntervals - 1];\r\n deltaIMinus2 = options.knots[numIntervals - 1] - options.knots[numIntervals - 2];\r\n sum = deltaIMinus2 + deltaIMinus1;\r\n sumReciprocal = 1.0 / sum;\r\n alpha[numIntervals] = -deltaIMinus1 * sumReciprocal;\r\n beta[numIntervals] = (deltaIMinus1 + sum) * sumReciprocal;\r\n gamma[numIntervals] = 0.0;\r\n } else {\r\n alpha[numIntervals] = gamma[numIntervals] = 0.0;\r\n beta[numIntervals] = 1.0;\r\n }\r\n }\r\n\r\n // middle rows\r\n for (let i = 2; i < numIntervalsMinus1; ++i) {\r\n deltaI = options.knots[i + 1] - options.knots[i];\r\n deltaIMinus2 = options.knots[i - 1] - options.knots[i - 2];\r\n deltaIMinus1 = options.knots[i] - options.knots[i - 1];\r\n deltaIPlus1 = options.knots[i + 2] - options.knots[i + 1];\r\n this.computeAlphaBetaGamma(alpha, beta, gamma, i, deltaIPlus1, deltaI, deltaIMinus1, deltaIMinus2);\r\n }\r\n return true;\r\n }\r\n\r\n /** Setup tridiagonal system\r\n * @param alpha sub-diagonal, length = # fitPoints\r\n * @param beta diagonal, length = # fitPoints\r\n * @param gamma super-diagonal, length = # fitPoints\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setUpSystem(alpha: number[], beta: number[], gamma: number[], options: InterpolationCurve3dOptions): boolean {\r\n let useNaturalStartTangent = false;\r\n let useNaturalEndTangent = false;\r\n if (options.isNaturalTangents && !options.closed) {\r\n useNaturalStartTangent = (undefined === options.startTangent);\r\n useNaturalEndTangent = (undefined === options.endTangent);\r\n }\r\n\r\n let succeeded = false;\r\n if (2 === options.fitPoints.length)\r\n succeeded = this.setUpSystem2Points(alpha, beta, gamma);\r\n else if (3 === options.fitPoints.length)\r\n succeeded = this.setUpSystem3Points(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\r\n else if (4 <= options.fitPoints.length)\r\n succeeded = this.setUpSystem4PointsOrMore(alpha, beta, gamma, options, useNaturalStartTangent, useNaturalEndTangent);\r\n\r\n return succeeded;\r\n }\r\n\r\n /** Set the Bessel end condition for the linear system.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setBesselEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n if (undefined === options.knots)\r\n return false;\r\n\r\n const scale = 1.0/3.0;\r\n const numIntervals = options.fitPoints.length - 1;\r\n\r\n if (1 === numIntervals) { // linear Bezier\r\n if (atStart)\r\n dataPts[0].interpolate(scale, dataPts[3], dataPts[1]);\r\n else\r\n dataPts[3].interpolate(scale, dataPts[0], dataPts[2]);\r\n return true;\r\n }\r\n\r\n if (2 === numIntervals) {\r\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[4], -beta * beta);\r\n if (atStart)\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\r\n else\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[4], beta).interpolate(scale, dataPts[4], dataPts[3]);\r\n return true;\r\n }\r\n\r\n // numIntervals > 2\r\n if (atStart) {\r\n const alpha = (options.knots[2] - options.knots[1]) / (options.knots[2] - options.knots[0]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[2].plus2Scaled(dataPts[0], -alpha * alpha, dataPts[3], -beta * beta);\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * alpha), dataPts[0], alpha).interpolate(scale, dataPts[0], dataPts[1]);\r\n } else {\r\n const alpha = (options.knots[numIntervals] - options.knots[numIntervals - 1]) / (options.knots[numIntervals] - options.knots[numIntervals - 2]);\r\n const beta = 1.0 - alpha;\r\n const temp = dataPts[numIntervals].plus2Scaled(dataPts[numIntervals - 1], -alpha * alpha, dataPts[numIntervals + 2], -beta * beta);\r\n Point3d.createAdd2Scaled(temp, 1.0 / (2.0 * beta), dataPts[numIntervals + 2], beta).interpolate(scale, dataPts[numIntervals + 2], dataPts[numIntervals + 1]);\r\n }\r\n return true;\r\n }\r\n\r\n /** Set the natural end condition for the linear system.\r\n * This is the end condition used by ADSK for fit-splines with a given zero tangent.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setNaturalEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (1 === numIntervals)\r\n return this.setBesselEndCondition(dataPts, options, atStart);\r\n\r\n if (atStart)\r\n dataPts[1] = dataPts[0];\r\n else\r\n dataPts[dataPts.length - 2] = dataPts[dataPts.length - 1];\r\n return true;\r\n }\r\n\r\n /** Set the end condition for the linear system to the given tangent, scaled by chord length.\r\n * This is the end condition used by ADSK for fit-splines with a given nonzero tangent.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setChordLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const tangent = atStart ? options.startTangent : options.endTangent;\r\n if (undefined === tangent)\r\n return false;\r\n\r\n let iExt = 0; // index of first/last fitPoint\r\n let iSet = 0; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\r\n let iInt = 0; // index of 2nd/penultimate fitPoint\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (1 === numIntervals) { // no interior fit points\r\n if (atStart) {\r\n iExt = 0;\r\n iSet = 1;\r\n iInt = 3;\r\n } else {\r\n iExt = 3;\r\n iSet = 2;\r\n iInt = 0;\r\n }\r\n } else {\r\n if (atStart) {\r\n iExt = 0;\r\n iSet = 1;\r\n iInt = 2;\r\n } else {\r\n iExt = numIntervals + 2;\r\n iSet = numIntervals + 1;\r\n iInt = numIntervals;\r\n }\r\n }\r\n\r\n // NOTE: tangent points INTO curve\r\n const chordLength = dataPts[iInt].distance(dataPts[iExt]);\r\n dataPts[iExt].plusScaled(tangent, chordLength / 3.0, dataPts[iSet]);\r\n return true;\r\n }\r\n\r\n /** Set the end condition for the linear system to the given tangent, scaled by bessel length.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n * @param atStart whether end condition is for start of curve (false: end of curve)\r\n */\r\n private static setBesselLengthScaledEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions, atStart: boolean): boolean {\r\n if (dataPts.length !== options.fitPoints.length + 2)\r\n return false;\r\n\r\n const tangent = atStart ? options.startTangent : options.endTangent;\r\n if (undefined === tangent)\r\n return false;\r\n\r\n // temporarily set bessel end condition\r\n if (!this.setBesselEndCondition(dataPts, options, atStart))\r\n return false;\r\n\r\n const numIntervals = options.fitPoints.length - 1;\r\n const iExt = atStart ? 0 : numIntervals + 2; // index of first/last fitPoint\r\n const iSet = atStart ? 1 : numIntervals + 1; // index of 2nd/penultimate Bezier point to set (determines start/end tangent of the curve)\r\n\r\n // reset end condition with our tangent, but scaled to the bessel tangent's length\r\n dataPts[iExt].plusScaled(tangent, dataPts[iExt].distance(dataPts[iSet]), dataPts[iSet]);\r\n return true;\r\n }\r\n\r\n /** Set the end condition for a physically closed (non-periodic) interpolant.\r\n * @param dataPts array whose middle is the system rhs (augmented with first/last fitPoint at beginning/end);\r\n * 2nd or penultimate point is set by this function.\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setPhysicallyClosedEndCondition(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\r\n const numIntervals = options.fitPoints.length - 1;\r\n if (!options.isColinearTangents\r\n || numIntervals <= 2\r\n || (undefined !== options.startTangent && undefined !== options.endTangent)\r\n || options.isNaturalTangents\r\n || !dataPts[0].isAlmostEqual(dataPts[numIntervals + 2])) {\r\n return true;\r\n }\r\n // force parallel start/end tangents, using chord length scale for undefined tangents\r\n if (undefined !== options.startTangent) { // start tangent is supplied; compute a parallel end tangent\r\n const outwardStartTangent = Vector3d.createStartEnd(dataPts[1], dataPts[0]).normalize();\r\n if (undefined !== outwardStartTangent) {\r\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\r\n dataPts[numIntervals + 2].plusScaled(outwardStartTangent, endTangentMag, dataPts[numIntervals + 1]);\r\n }\r\n } else if (undefined !== options.endTangent) { // end tangent is supplied; compute a parallel start tangent\r\n const outwardEndTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[numIntervals + 2]).normalize();\r\n if (undefined !== outwardEndTangent) {\r\n const startTangentMag = dataPts[0].distance(dataPts[1]);\r\n dataPts[0].plusScaled(outwardEndTangent, startTangentMag, dataPts[1]);\r\n }\r\n } else { // neither tangent is supplied, compute both along same vector\r\n const commonTangent = Vector3d.createStartEnd(dataPts[numIntervals + 1], dataPts[1]).normalize();\r\n if (undefined !== commonTangent) {\r\n const startTangentMag = dataPts[0].distance(dataPts[1]);\r\n dataPts[0].plusScaled(commonTangent, startTangentMag, dataPts[1]);\r\n const endTangentMag = dataPts[numIntervals + 2].distance(dataPts[numIntervals + 1]);\r\n dataPts[numIntervals + 2].plusScaled(commonTangent, -endTangentMag, dataPts[numIntervals + 1]);\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** Set end conditions for the linear system to solve for the poles of the open interpolant, as per Farin 3e/4e.\r\n * @param dataPts array whose interior is the system rhs and whose first/last entries are the first/last fitPoints;\r\n * points are inserted to become the 2nd and penultimate dataPts, the first/last rows of the system rhs.\r\n * @param options validated as per validateOptions, unmodified\r\n */\r\n private static setEndConditions(dataPts: Point3d[], options: InterpolationCurve3dOptions): boolean {\r\n if (dataPts.length !== options.fitPoints.length)\r\n return false;\r\n\r\n // insert dummy points to be computed below\r\n const dummy0 = Point3d.createZero();\r\n const dummy1 = Point3d.createZero();\r\n dataPts.splice(1, 0, dummy0);\r\n dataPts.splice(dataPts.length - 1, 0, dummy1);\r\n\r\n let succeeded = false;\r\n if (undefined === options.startTangent) {\r\n if (options.isNaturalTangents)\r\n succeeded = this.setNaturalEndCondition(dataPts, options, true);\r\n else\r\n succeeded = this.setBesselEndCondition(dataPts, options, true);\r\n } else { // scale startTangent\r\n if (options.isChordLenTangents)\r\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, true);\r\n else\r\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, true);\r\n }\r\n\r\n if (undefined === options.endTangent) {\r\n if (options.isNaturalTangents)\r\n succeeded = this.setNaturalEndCondition(dataPts, options, false);\r\n else\r\n succeeded = this.setBesselEndCondition(dataPts, options, false);\r\n } else { // scale endTangent\r\n if (options.isChordLenTangents)\r\n succeeded = this.setChordLengthScaledEndCondition(dataPts, options, false);\r\n else\r\n succeeded = this.setBesselLengthScaledEndCondition(dataPts, options, false);\r\n }\r\n\r\n if (succeeded)\r\n succeeded = this.setPhysicallyClosedEndCondition(dataPts, options);\r\n\r\n return succeeded;\r\n }\r\n\r\n /** Solve the near tridiagonal system for a periodic C2 cubic interpolant.\r\n * Alpha, beta, gamma are computed by setUpSystem, have same length as fitPts, and are overwritten.\r\n */\r\n private static solveNearTridiagonal(fitPts: Point3d[], alpha: number[], beta: number[], gamma: number[]): Point3d[] | undefined {\r\n if (alpha.length !== beta.length || alpha.length !== gamma.length || alpha.length !== fitPts.length)\r\n return undefined;\r\n const poles: Point3d[] = [];\r\n const numIntervals = fitPts.length - 1;\r\n const leftPts = fitPts.slice(0, -1); // last fitPt is ignored\r\n let tmp: number | undefined = 0.0;\r\n\r\n // first forward substitution\r\n for (let i = 1; i < numIntervals; ++i) {\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(- alpha[i], beta[i - 1])))\r\n return undefined;\r\n beta[i] += tmp * gamma[i - 1];\r\n alpha[i] = tmp * alpha[i - 1];\r\n leftPts[i].addScaledInPlace(leftPts[i - 1], tmp);\r\n }\r\n\r\n // first backward substitution\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[numIntervals - 1] + alpha[numIntervals - 1])))\r\n return undefined;\r\n gamma[numIntervals - 1] *= tmp;\r\n leftPts[numIntervals - 1].scaleInPlace(tmp);\r\n for (let i = numIntervals - 2; i >= 0; --i) {\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, beta[i])))\r\n return undefined;\r\n Point3d.createScale(leftPts[i].plus2Scaled(leftPts[i + 1], - gamma[i], leftPts[numIntervals - 1], - alpha[i]), tmp, leftPts[i]);\r\n gamma[i] = - (gamma[i] * gamma[i + 1] + alpha[i] * gamma[numIntervals - 1]) * tmp;\r\n }\r\n\r\n // second forward substitution\r\n if (undefined === (tmp = Geometry.conditionalDivideFraction(1.0, 1.0 + gamma[0])))\r\n return undefined;\r\n poles.push(Point3d.createScale(leftPts[0], tmp));\r\n for (let i = 1; i < numIntervals; ++i) {\r\n poles.push(leftPts[i].plusScaled(poles[0], - gamma[i]));\r\n }\r\n return poles;\r\n }\r\n\r\n /** Adjust options by correcting invalid combinations\r\n * @param options curve definition, possibly modified\r\n */\r\n public static validateOptions(options: InterpolationCurve3dOptions): boolean {\r\n options.order = 4;\r\n\r\n // remove relevant exterior knots so knots and fit points align *before* we start compressing fit points.\r\n options.knots = this.convertCubicKnotVectorToFitParams(options.knots, options.fitPoints.length, true);\r\n\r\n // compress out duplicate fit points (and their corresponding knots)\r\n if (!this.removeDuplicateFitPoints(options))\r\n return false;\r\n\r\n let hasClosurePoint = (options.fitPoints.length > 1) && options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\r\n\r\n // if only 2 unique points, then must create open curve\r\n if (3 === options.fitPoints.length && hasClosurePoint) {\r\n options.fitPoints.pop();\r\n if (undefined !== options.knots)\r\n options.knots.pop();\r\n hasClosurePoint = options.fitPoints[0].isAlmostEqual(options.fitPoints[options.fitPoints.length - 1]);\r\n }\r\n if (options.fitPoints.length <= 2) {\r\n if (hasClosurePoint)\r\n return false;\r\n options.closed = false;\r\n }\r\n\r\n // append closure point if missing\r\n if (options.closed) {\r\n if (!hasClosurePoint) {\r\n options.fitPoints.push(options.fitPoints[0].clone());\r\n if (undefined !== options.knots) { // best guess: uniform knots\r\n options.knots.push(options.knots[options.knots.length - 1] + (options.knots[options.knots.length - 1] - options.knots[0]) / (options.knots.length - 1));\r\n }\r\n }\r\n if (options.fitPoints.length <= 4)\r\n options.closed = false; // can't fit cubic closed curve to 3 unique points\r\n }\r\n\r\n if (options.fitPoints.length < 2)\r\n return false;\r\n\r\n // ASSUME: tangents point INTO curve\r\n if (undefined !== options.startTangent) {\r\n if (options.startTangent.isAlmostZero)\r\n options.startTangent = undefined;\r\n else\r\n options.startTangent.normalizeInPlace();\r\n }\r\n if (undefined !== options.endTangent) {\r\n if (options.endTangent.isAlmostZero)\r\n options.endTangent = undefined;\r\n else\r\n options.endTangent.normalizeInPlace();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Converts a full cubic knot vector of expected length into fit parameters, by removing extraneous exterior knots.\r\n * @param knots cubic knot vector, unmodified\r\n * @param numFitPoints number of fit points\r\n * @return fit parameters, or undefined if unexpected input\r\n **/\r\n public static convertCubicKnotVectorToFitParams(knots: number[] | undefined, numFitPoints: number, normalize?: boolean): number[] | undefined {\r\n let params = knots?.slice();\r\n if (undefined !== params) {\r\n const numExtraKnots = params.length - numFitPoints;\r\n switch (numExtraKnots) {\r\n case 0: { // ASSUME caller passed in interior knots\r\n break;\r\n }\r\n case 4: // modern full cubic knots\r\n case 6: { // legacy full cubic knots\r\n for (let i = 0; i < numExtraKnots / 2; ++i) {\r\n params.pop();\r\n params.shift();\r\n }\r\n break;\r\n }\r\n default: { // other knot configurations are unusable\r\n params = undefined;\r\n break;\r\n }\r\n }\r\n if (normalize && !this.normalizeKnots(params))\r\n params = undefined;\r\n }\r\n return params;\r\n }\r\n\r\n /** Return fit parameters augmented to a full cubic knot vector.\r\n * @param params fit parameters, unmodified\r\n * @param legacy whether to create a legacy (DGN) full knot vector, or modern vector with two less knots\r\n **/\r\n public static convertFitParamsToCubicKnotVector(params: number[] | undefined, closed?: boolean, legacy?: boolean): number[] | undefined {\r\n const knots = params?.slice();\r\n if (undefined !== knots) {\r\n const numExtraKnots = legacy ? 6 : 4;\r\n if (closed) {\r\n const iTail = knots.length - 2;\r\n for (let iHead = 2; iHead <= numExtraKnots; iHead += 2) {\r\n knots.unshift(knots[iTail] - 1.0); // index is constant\r\n knots.push(1.0 + knots[iHead]); // index increments by two\r\n }\r\n } else {\r\n for (let i = 0; i < numExtraKnots / 2; ++i) {\r\n knots.unshift(0.0);\r\n knots.push(1.0);\r\n }\r\n }\r\n }\r\n return knots;\r\n }\r\n\r\n /** Ensure full legacy knot vector for JSON export **/\r\n public static convertToJsonKnots(props: InterpolationCurve3dProps) {\r\n if (undefined !== props.knots) {\r\n props.knots = this.convertCubicKnotVectorToFitParams(props.knots, props.fitPoints.length, false);\r\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\r\n } else {\r\n props.knots = this.constructFitParametersFromPoints(Point3dArray.clonePoint3dArray(props.fitPoints), props.isChordLenKnots, props.closed);\r\n props.knots = this.convertFitParamsToCubicKnotVector(props.knots, props.closed, true);\r\n }\r\n }\r\n\r\n /** Construct the control points for the c2 cubic fit algorithm\r\n * @param options validated as per validateOptions, possibly modified\r\n */\r\n public static constructPoles(options: InterpolationCurve3dOptions): Point3d[] | Float64Array | undefined {\r\n if (!this.constructFitParameters(options) || (undefined === options.knots))\r\n return undefined;\r\n\r\n const numRow = options.fitPoints.length;\r\n const alpha: number[] = Array(numRow);\r\n const beta: number[] = Array(numRow);\r\n const gamma: number[] = Array(numRow);\r\n if (!this.setUpSystem(alpha, beta, gamma, options))\r\n return undefined;\r\n\r\n let poles: Point3d[] | Float64Array | undefined = [];\r\n if (!options.closed) {\r\n const dataPts = options.fitPoints.slice();\r\n if (!this.setEndConditions(dataPts, options))\r\n return undefined;\r\n if (dataPts.length !== numRow + 2)\r\n return undefined; // sanity check: we added 2nd/penultimate points, rhs is middle numRow entries.\r\n\r\n // construct tridiagonal banded system components\r\n const matrix = new Float64Array(numRow * 3);\r\n const rhs = new Float64Array(numRow * 3);\r\n for (let iRow = 0, iMatrixRead = 0, iRhsRead = 0; iRow < numRow; ++iRow) {\r\n matrix[iMatrixRead++] = alpha[iRow];\r\n matrix[iMatrixRead++] = beta[iRow];\r\n matrix[iMatrixRead++] = gamma[iRow];\r\n rhs[iRhsRead++] = dataPts[iRow+1].x;\r\n rhs[iRhsRead++] = dataPts[iRow+1].y;\r\n rhs[iRhsRead++] = dataPts[iRow+1].z;\r\n }\r\n\r\n const solution = BandedSystem.solveBandedSystemMultipleRHS(numRow, 3, matrix, 3, rhs);\r\n if (undefined === solution)\r\n return undefined;\r\n\r\n // pre/append first/last poles/fitPoints\r\n poles = new Float64Array(3 + solution.length + 3);\r\n let iWrite = 0;\r\n poles[iWrite++] = options.fitPoints[0].x;\r\n poles[iWrite++] = options.fitPoints[0].y;\r\n poles[iWrite++] = options.fitPoints[0].z;\r\n for (let iRead = 0; iRead < solution.length; ) {\r\n poles[iWrite++] = solution[iRead++];\r\n }\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].x;\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].y;\r\n poles[iWrite++] = options.fitPoints[options.fitPoints.length - 1].z;\r\n } else { // closed\r\n if (undefined !== (poles = this.solveNearTridiagonal(options.fitPoints, alpha, beta, gamma))) {\r\n if (poles.length > 2) {\r\n const pole = poles.pop();\r\n assert(pole !== undefined, \"expect pop to succeed since length > 2\");\r\n poles.unshift(pole); // shift poles right to line up with the knots\r\n for (let i = 0; i < options.order - 1; ++i)\r\n poles.push(poles[i].clone()); // periodically extend (the modern way)\r\n }\r\n }\r\n }\r\n return poles;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BezierCurve3d.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3d.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"BezierCurve3d.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3d.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAY,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,eAAe;IAChD,+CAA+C;IACxC,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAC/C,iDAAiD;IAC1C,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;IASzD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAQ;IACzB,yDAAyD;IAClD,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAMvE,kEAAkE;IAC3D,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAMvE;;;OAGG;IACH,OAAO;IAKP,mCAAmC;IAC5B,sBAAsB,IAAI,YAAY;IAS7C;;;;OAIG;WACW,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,aAAa,GAAG,SAAS;IAuB5E,kEAAkE;WACpD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAIvD,+DAA+D;IACxD,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;IAG1D,4BAA4B;IACZ,KAAK,IAAI,aAAa;IAGtC,iFAAiF;IAC1E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO;IAInE,wDAAwD;IACjD,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK;IAK5E;;;;;OAKG;IACI,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,yBAAyB,GAAG,yBAAyB;IAatH,mCAAmC;IACnB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAMlD,gFAAgF;IACzE,yBAAyB,CAAC,OAAO,EAAE,eAAe,GAAG,GAAG;IAG/D;;;OAGG;IACI,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS;CAkDjE"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.BezierCurve3d = void 0;
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
12
|
const LineString3d_1 = require("../curve/LineString3d");
|
|
12
13
|
const Plane3dByOriginAndVectors_1 = require("../geometry3d/Plane3dByOriginAndVectors");
|
|
13
14
|
const Point2dVector2d_1 = require("../geometry3d/Point2dVector2d");
|
|
@@ -64,8 +65,11 @@ class BezierCurve3d extends BezierCurveBase_1.BezierCurveBase {
|
|
|
64
65
|
/** Return poles as a linestring */
|
|
65
66
|
copyPointsAsLineString() {
|
|
66
67
|
const result = LineString3d_1.LineString3d.create();
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
const point = Point3dVector3d_1.Point3d.createZero();
|
|
69
|
+
for (let i = 0; i < this._polygon.order; i++) {
|
|
70
|
+
this.getPolePoint3d(i, point);
|
|
71
|
+
result.addPoint(point);
|
|
72
|
+
}
|
|
69
73
|
return result;
|
|
70
74
|
}
|
|
71
75
|
/** Create a curve with given points.
|
|
@@ -157,9 +161,13 @@ class BezierCurve3d extends BezierCurveBase_1.BezierCurveBase {
|
|
|
157
161
|
*/
|
|
158
162
|
extendRange(rangeToExtend, transform) {
|
|
159
163
|
const order = this.order;
|
|
164
|
+
if (order < 2) // guarantee the work arrays are allocated below
|
|
165
|
+
return;
|
|
166
|
+
const productOrder = order - 1;
|
|
160
167
|
if (!transform) {
|
|
161
|
-
this.allocateAndZeroBezierWorkData(
|
|
168
|
+
this.allocateAndZeroBezierWorkData(productOrder, 0, 0);
|
|
162
169
|
const bezier = this._workBezier;
|
|
170
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
163
171
|
this.getPolePoint3d(0, this._workPoint0);
|
|
164
172
|
rangeToExtend.extend(this._workPoint0);
|
|
165
173
|
this.getPolePoint3d(order - 1, this._workPoint0);
|
|
@@ -176,9 +184,11 @@ class BezierCurve3d extends BezierCurveBase_1.BezierCurveBase {
|
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
186
|
else {
|
|
179
|
-
this.allocateAndZeroBezierWorkData(
|
|
187
|
+
this.allocateAndZeroBezierWorkData(productOrder, order, 0);
|
|
180
188
|
const bezier = this._workBezier;
|
|
181
189
|
const componentCoffs = this._workCoffsA; // to hold transformed copy of x,y,z in turn.
|
|
190
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
191
|
+
(0, core_bentley_1.assert)(componentCoffs !== undefined, "expect defined because order > 0");
|
|
182
192
|
this.getPolePoint3d(0, this._workPoint0);
|
|
183
193
|
rangeToExtend.extendTransformedPoint(transform, this._workPoint0);
|
|
184
194
|
this.getPolePoint3d(order - 1, this._workPoint0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BezierCurve3d.js","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3d.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/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BezierPolynomialAlgebra } from \"../numerics/BezierPolynomials\";\r\nimport { BezierCurveBase } from \"./BezierCurveBase\";\r\n\r\n\r\n/**\r\n * 3d Bezier curve class.\r\n * * Use BezierCurve3dH if the curve has weights.\r\n * * The control points (xyz) are managed as the _packedData buffer in the _polygon member of BezierCurveBase.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Bezier/\r\n * @public\r\n */\r\nexport class BezierCurve3d extends BezierCurveBase {\r\n /** test if `other` is also a BezierCurve3d. */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BezierCurve3d; }\r\n /** apply the transform to the control points. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n const data = this._workData0;\r\n for (let i = 0; i < this._polygon.order; i++) {\r\n this._polygon.getPolygonPoint(i, data);\r\n transform.multiplyXYZToFloat64Array(data[0], data[1], data[2], data);\r\n this._polygon.setPolygonPoint(i, data);\r\n }\r\n return true;\r\n }\r\n private _workRay0: Ray3d;\r\n private _workRay1: Ray3d;\r\n /** Return a specific pole as a full `[x,y,z] Point3d` */\r\n public getPolePoint3d(i: number, result?: Point3d): Point3d | undefined {\r\n const data = this._polygon.getPolygonPoint(i, this._workData0);\r\n if (data)\r\n return Point3d.create(data[0], data[1], data[2], result);\r\n return undefined;\r\n }\r\n /** Return a specific pole as a full `[w*x,w*y,w*z, w] Point4d` */\r\n public getPolePoint4d(i: number, result?: Point4d): Point4d | undefined {\r\n const data = this._polygon.getPolygonPoint(i, this._workData0);\r\n if (data)\r\n return Point4d.create(data[0], data[1], data[2], 1.0, result);\r\n return undefined;\r\n }\r\n /**\r\n * Capture a polygon as the data for a new `BezierCurve3d`\r\n * @param polygon complete packed data and order.\r\n */\r\n private constructor(polygon: Float64Array) {\r\n super(3, polygon);\r\n this._workRay0 = Ray3d.createXAxis();\r\n this._workRay1 = Ray3d.createXAxis();\r\n }\r\n /** Return poles as a linestring */\r\n public copyPointsAsLineString(): LineString3d {\r\n const result = LineString3d.create();\r\n for (let i = 0; i < this._polygon.order; i++)\r\n result.addPoint(this.getPolePoint3d(i)!);\r\n return result;\r\n }\r\n /** Create a curve with given points.\r\n * * If input is `Point2d[]`, the points are promoted with `z=0` and `w=1`\r\n * * If input is `Point3d[]`, the points are promoted with w=1`\r\n *\r\n */\r\n public static create(data: Point3d[] | Point2d[]): BezierCurve3d | undefined {\r\n if (data.length < 1)\r\n return undefined;\r\n const polygon = new Float64Array(data.length * 3);\r\n if (data[0] instanceof Point3d) {\r\n let i = 0;\r\n for (const p of (data as Point3d[])) {\r\n polygon[i++] = p.x;\r\n polygon[i++] = p.y;\r\n polygon[i++] = p.z;\r\n }\r\n return new BezierCurve3d(polygon);\r\n } else if (data[0] instanceof Point2d) {\r\n let i = 0;\r\n for (const p of (data as Point2d[])) {\r\n polygon[i++] = p.x;\r\n polygon[i++] = p.y;\r\n polygon[i++] = 0.0;\r\n }\r\n return new BezierCurve3d(polygon);\r\n }\r\n return undefined;\r\n }\r\n /** create a bezier curve of specified order, filled with zeros */\r\n public static createOrder(order: number): BezierCurve3d {\r\n const polygonArray = new Float64Array(order * 3); // This is initialized to zeros!!\r\n return new BezierCurve3d(polygonArray);\r\n }\r\n /** Load order * 3 doubles from data[3 * spanIndex] as poles */\r\n public loadSpanPoles(data: Float64Array, spanIndex: number) {\r\n this._polygon.loadSpanPoles(data, spanIndex);\r\n }\r\n /** Clone as a bezier 3d. */\r\n public override clone(): BezierCurve3d {\r\n return new BezierCurve3d(this._polygon.clonePolygon());\r\n }\r\n /** Return a (de-weighted) point on the curve. If de-weight fails, returns 000 */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n this._polygon.evaluate(fraction, this._workData0);\r\n return Point3d.create(this._workData0[0], this._workData0[1], this._workData0[2], result);\r\n }\r\n /** Return the cartesian point and derivative vector. */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n this._polygon.evaluate(fraction, this._workData0);\r\n this._polygon.evaluateDerivative(fraction, this._workData1);\r\n return Ray3d.createXYZUVW(this._workData0[0], this._workData0[1], this._workData0[2], this._workData1[0], this._workData1[1], this._workData1[2], result);\r\n }\r\n /** Construct a plane with\r\n * * origin at the fractional position along the arc\r\n * * x axis is the first derivative, i.e. tangent along the arc\r\n * * y axis is the second derivative, i.e. in the plane and on the center side of the tangent.\r\n * If the arc is circular, the second derivative is directly towards the center\r\n */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const epsilon = 1.0e-8;\r\n const a = 1.0 / (2.0 * epsilon);\r\n if (!result)\r\n result = Plane3dByOriginAndVectors.createXYPlane();\r\n const ray = this.fractionToPointAndDerivative(fraction, this._workRay0);\r\n result.origin.setFrom(ray.origin);\r\n result.vectorU.setFrom(ray.direction);\r\n const ray0 = this.fractionToPointAndDerivative(fraction - epsilon, this._workRay0);\r\n const ray1 = this.fractionToPointAndDerivative(fraction + epsilon, this._workRay1);\r\n Vector3d.createAdd2Scaled(ray0.direction, -a, ray1.direction, a, result.vectorV);\r\n return result;\r\n }\r\n /** Near-equality test on poles. */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BezierCurve3d) {\r\n return this._polygon.isAlmostEqual(other._polygon);\r\n }\r\n return false;\r\n }\r\n /** Second step of double dispatch: call `handler.handleBezierCurve3d(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBezierCurve3d(this);\r\n }\r\n /** Extend `rangeToExtend`, using candidate extrema at\r\n * * both end points\r\n * * any internal extrema in x,y,z\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const order = this.order;\r\n if (!transform) {\r\n this.allocateAndZeroBezierWorkData(order - 1, 0, 0);\r\n const bezier = this._workBezier!;\r\n this.getPolePoint3d(0, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n this.getPolePoint3d(order - 1, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n for (let axisIndex = 0; axisIndex < 3; axisIndex++) {\r\n BezierPolynomialAlgebra.componentDifference(bezier.coffs, this._polygon.packedData, 3, order, axisIndex);\r\n const roots = bezier.roots(0.0, true);\r\n if (roots) {\r\n for (const r of roots) {\r\n this.fractionToPoint(r, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n }\r\n }\r\n }\r\n } else {\r\n this.allocateAndZeroBezierWorkData(order - 1, order, 0);\r\n const bezier = this._workBezier!;\r\n const componentCoffs = this._workCoffsA!; // to hold transformed copy of x,y,z in turn.\r\n\r\n this.getPolePoint3d(0, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n this.getPolePoint3d(order - 1, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n const data = this._polygon.packedData;\r\n for (let axisIndex = 0; axisIndex < 3; axisIndex++) {\r\n // apply one row of the transform to get the transformed coff by itself\r\n for (let i = 0, k = 0; i < order; i++, k += 3)\r\n componentCoffs[i] = transform.multiplyComponentXYZ(axisIndex, data[k], data[k + 1], data[k + 2]);\r\n BezierPolynomialAlgebra.univariateDifference(componentCoffs, bezier.coffs);\r\n const roots = bezier.roots(0.0, true);\r\n if (roots && roots.length > 0) {\r\n for (const r of roots) {\r\n this.fractionToPoint(r, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BezierCurve3d.js","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3d.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/** @packageDocumentation\r\n * @module Bspline\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { LineString3d } from \"../curve/LineString3d\";\r\nimport { GeometryHandler } from \"../geometry3d/GeometryHandler\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d, Vector3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Ray3d } from \"../geometry3d/Ray3d\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BezierPolynomialAlgebra } from \"../numerics/BezierPolynomials\";\r\nimport { BezierCurveBase } from \"./BezierCurveBase\";\r\n\r\n/**\r\n * 3d Bezier curve class.\r\n * * Use BezierCurve3dH if the curve has weights.\r\n * * The control points (xyz) are managed as the _packedData buffer in the _polygon member of BezierCurveBase.\r\n * * Visualization can be found at https://www.itwinjs.org/sandbox/SaeedTorabi/Bezier/\r\n * @public\r\n */\r\nexport class BezierCurve3d extends BezierCurveBase {\r\n /** test if `other` is also a BezierCurve3d. */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BezierCurve3d; }\r\n /** apply the transform to the control points. */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n const data = this._workData0;\r\n for (let i = 0; i < this._polygon.order; i++) {\r\n this._polygon.getPolygonPoint(i, data);\r\n transform.multiplyXYZToFloat64Array(data[0], data[1], data[2], data);\r\n this._polygon.setPolygonPoint(i, data);\r\n }\r\n return true;\r\n }\r\n private _workRay0: Ray3d;\r\n private _workRay1: Ray3d;\r\n /** Return a specific pole as a full `[x,y,z] Point3d` */\r\n public getPolePoint3d(i: number, result?: Point3d): Point3d | undefined {\r\n const data = this._polygon.getPolygonPoint(i, this._workData0);\r\n if (data)\r\n return Point3d.create(data[0], data[1], data[2], result);\r\n return undefined;\r\n }\r\n /** Return a specific pole as a full `[w*x,w*y,w*z, w] Point4d` */\r\n public getPolePoint4d(i: number, result?: Point4d): Point4d | undefined {\r\n const data = this._polygon.getPolygonPoint(i, this._workData0);\r\n if (data)\r\n return Point4d.create(data[0], data[1], data[2], 1.0, result);\r\n return undefined;\r\n }\r\n /**\r\n * Capture a polygon as the data for a new `BezierCurve3d`\r\n * @param polygon complete packed data and order.\r\n */\r\n private constructor(polygon: Float64Array) {\r\n super(3, polygon);\r\n this._workRay0 = Ray3d.createXAxis();\r\n this._workRay1 = Ray3d.createXAxis();\r\n }\r\n /** Return poles as a linestring */\r\n public copyPointsAsLineString(): LineString3d {\r\n const result = LineString3d.create();\r\n const point = Point3d.createZero();\r\n for (let i = 0; i < this._polygon.order; i++) {\r\n this.getPolePoint3d(i, point);\r\n result.addPoint(point);\r\n }\r\n return result;\r\n }\r\n /** Create a curve with given points.\r\n * * If input is `Point2d[]`, the points are promoted with `z=0` and `w=1`\r\n * * If input is `Point3d[]`, the points are promoted with w=1`\r\n *\r\n */\r\n public static create(data: Point3d[] | Point2d[]): BezierCurve3d | undefined {\r\n if (data.length < 1)\r\n return undefined;\r\n const polygon = new Float64Array(data.length * 3);\r\n if (data[0] instanceof Point3d) {\r\n let i = 0;\r\n for (const p of (data as Point3d[])) {\r\n polygon[i++] = p.x;\r\n polygon[i++] = p.y;\r\n polygon[i++] = p.z;\r\n }\r\n return new BezierCurve3d(polygon);\r\n } else if (data[0] instanceof Point2d) {\r\n let i = 0;\r\n for (const p of (data as Point2d[])) {\r\n polygon[i++] = p.x;\r\n polygon[i++] = p.y;\r\n polygon[i++] = 0.0;\r\n }\r\n return new BezierCurve3d(polygon);\r\n }\r\n return undefined;\r\n }\r\n /** create a bezier curve of specified order, filled with zeros */\r\n public static createOrder(order: number): BezierCurve3d {\r\n const polygonArray = new Float64Array(order * 3); // This is initialized to zeros!!\r\n return new BezierCurve3d(polygonArray);\r\n }\r\n /** Load order * 3 doubles from data[3 * spanIndex] as poles */\r\n public loadSpanPoles(data: Float64Array, spanIndex: number) {\r\n this._polygon.loadSpanPoles(data, spanIndex);\r\n }\r\n /** Clone as a bezier 3d. */\r\n public override clone(): BezierCurve3d {\r\n return new BezierCurve3d(this._polygon.clonePolygon());\r\n }\r\n /** Return a (de-weighted) point on the curve. If de-weight fails, returns 000 */\r\n public fractionToPoint(fraction: number, result?: Point3d): Point3d {\r\n this._polygon.evaluate(fraction, this._workData0);\r\n return Point3d.create(this._workData0[0], this._workData0[1], this._workData0[2], result);\r\n }\r\n /** Return the cartesian point and derivative vector. */\r\n public fractionToPointAndDerivative(fraction: number, result?: Ray3d): Ray3d {\r\n this._polygon.evaluate(fraction, this._workData0);\r\n this._polygon.evaluateDerivative(fraction, this._workData1);\r\n return Ray3d.createXYZUVW(this._workData0[0], this._workData0[1], this._workData0[2], this._workData1[0], this._workData1[1], this._workData1[2], result);\r\n }\r\n /** Construct a plane with\r\n * * origin at the fractional position along the arc\r\n * * x axis is the first derivative, i.e. tangent along the arc\r\n * * y axis is the second derivative, i.e. in the plane and on the center side of the tangent.\r\n * If the arc is circular, the second derivative is directly towards the center\r\n */\r\n public fractionToPointAnd2Derivatives(fraction: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const epsilon = 1.0e-8;\r\n const a = 1.0 / (2.0 * epsilon);\r\n if (!result)\r\n result = Plane3dByOriginAndVectors.createXYPlane();\r\n const ray = this.fractionToPointAndDerivative(fraction, this._workRay0);\r\n result.origin.setFrom(ray.origin);\r\n result.vectorU.setFrom(ray.direction);\r\n const ray0 = this.fractionToPointAndDerivative(fraction - epsilon, this._workRay0);\r\n const ray1 = this.fractionToPointAndDerivative(fraction + epsilon, this._workRay1);\r\n Vector3d.createAdd2Scaled(ray0.direction, -a, ray1.direction, a, result.vectorV);\r\n return result;\r\n }\r\n /** Near-equality test on poles. */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BezierCurve3d) {\r\n return this._polygon.isAlmostEqual(other._polygon);\r\n }\r\n return false;\r\n }\r\n /** Second step of double dispatch: call `handler.handleBezierCurve3d(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBezierCurve3d(this);\r\n }\r\n /** Extend `rangeToExtend`, using candidate extrema at\r\n * * both end points\r\n * * any internal extrema in x,y,z\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform) {\r\n const order = this.order;\r\n if (order < 2) // guarantee the work arrays are allocated below\r\n return;\r\n const productOrder = order - 1;\r\n if (!transform) {\r\n this.allocateAndZeroBezierWorkData(productOrder, 0, 0);\r\n const bezier = this._workBezier;\r\n assert(bezier !== undefined, \"expect defined because productOrder > 0\");\r\n this.getPolePoint3d(0, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n this.getPolePoint3d(order - 1, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n for (let axisIndex = 0; axisIndex < 3; axisIndex++) {\r\n BezierPolynomialAlgebra.componentDifference(bezier.coffs, this._polygon.packedData, 3, order, axisIndex);\r\n const roots = bezier.roots(0.0, true);\r\n if (roots) {\r\n for (const r of roots) {\r\n this.fractionToPoint(r, this._workPoint0);\r\n rangeToExtend.extend(this._workPoint0);\r\n }\r\n }\r\n }\r\n } else {\r\n this.allocateAndZeroBezierWorkData(productOrder, order, 0);\r\n const bezier = this._workBezier;\r\n const componentCoffs = this._workCoffsA; // to hold transformed copy of x,y,z in turn.\r\n assert(bezier !== undefined, \"expect defined because productOrder > 0\");\r\n assert(componentCoffs !== undefined, \"expect defined because order > 0\");\r\n this.getPolePoint3d(0, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n this.getPolePoint3d(order - 1, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n const data = this._polygon.packedData;\r\n for (let axisIndex = 0; axisIndex < 3; axisIndex++) {\r\n // apply one row of the transform to get the transformed coff by itself\r\n for (let i = 0, k = 0; i < order; i++, k += 3)\r\n componentCoffs[i] = transform.multiplyComponentXYZ(axisIndex, data[k], data[k + 1], data[k + 2]);\r\n BezierPolynomialAlgebra.univariateDifference(componentCoffs, bezier.coffs);\r\n const roots = bezier.roots(0.0, true);\r\n if (roots && roots.length > 0) {\r\n for (const r of roots) {\r\n this.fractionToPoint(r, this._workPoint0);\r\n rangeToExtend.extendTransformedPoint(transform, this._workPoint0);\r\n }\r\n }\r\n }\r\n\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -98,6 +98,8 @@ export declare class BezierCurve3dH extends BezierCurveBase {
|
|
|
98
98
|
/** Extend `rangeToExtend`, using candidate extrema at
|
|
99
99
|
* * both end points
|
|
100
100
|
* * any internal extrema in x,y,z
|
|
101
|
+
*
|
|
102
|
+
* Extend fails if Bezier curve order is too low.
|
|
101
103
|
*/
|
|
102
104
|
extendRange(rangeToExtend: Range3d, transform?: Transform): void;
|
|
103
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BezierCurve3dH.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3dH.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"BezierCurve3dH.d.ts","sourceRoot":"","sources":["../../../src/bspline/BezierCurve3dH.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.BezierCurve3dH = void 0;
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
12
|
const Geometry_1 = require("../Geometry");
|
|
12
13
|
const Plane3dByOriginAndVectors_1 = require("../geometry3d/Plane3dByOriginAndVectors");
|
|
13
14
|
const Point2dVector2d_1 = require("../geometry3d/Point2dVector2d");
|
|
@@ -222,11 +223,14 @@ class BezierCurve3dH extends BezierCurveBase_1.BezierCurveBase {
|
|
|
222
223
|
updateClosestPointByTruePerpendicular(spacePoint, detail, testAt0 = false, testAt1 = false) {
|
|
223
224
|
let numUpdates = 0;
|
|
224
225
|
let roots;
|
|
226
|
+
if (this.order < 2) // guarantee the work arrays are allocated below
|
|
227
|
+
return false;
|
|
225
228
|
if (this.isUnitWeight()) {
|
|
226
229
|
// unweighted !!!
|
|
227
230
|
const productOrder = 2 * this.order - 2;
|
|
228
231
|
this.allocateAndZeroBezierWorkData(productOrder, 0, 0);
|
|
229
232
|
const bezier = this._workBezier;
|
|
233
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
230
234
|
// closestPoint condition is:
|
|
231
235
|
// (spacePoint - curvePoint) DOT curveTangent = 0;
|
|
232
236
|
// Each product (x,y,z) of the DOT is the product of two bezier polynomials
|
|
@@ -248,6 +252,9 @@ class BezierCurve3dH extends BezierCurveBase_1.BezierCurveBase {
|
|
|
248
252
|
const bezier = this._workBezier;
|
|
249
253
|
const workA = this._workCoffsA;
|
|
250
254
|
const workB = this._workCoffsB;
|
|
255
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
256
|
+
(0, core_bentley_1.assert)(workA !== undefined, "expect defined because orderA > 0");
|
|
257
|
+
(0, core_bentley_1.assert)(workB !== undefined, "expect defined because orderB > 0");
|
|
251
258
|
const packedData = this._polygon.packedData;
|
|
252
259
|
for (let i = 0; i < 3; i++) {
|
|
253
260
|
// x representing loop pass: (w * spacePoint.x - curve.x(s)) * (curveDelta.x(s) * curve.w(s) - curve.x(s) * curveDelta.w(s))
|
|
@@ -285,12 +292,18 @@ class BezierCurve3dH extends BezierCurveBase_1.BezierCurveBase {
|
|
|
285
292
|
/** Extend `rangeToExtend`, using candidate extrema at
|
|
286
293
|
* * both end points
|
|
287
294
|
* * any internal extrema in x,y,z
|
|
295
|
+
*
|
|
296
|
+
* Extend fails if Bezier curve order is too low.
|
|
288
297
|
*/
|
|
289
298
|
extendRange(rangeToExtend, transform) {
|
|
290
299
|
const order = this.order;
|
|
300
|
+
if (order < 2) // guarantee the work arrays are allocated below
|
|
301
|
+
return;
|
|
302
|
+
const productOrder = order * 2 - 2;
|
|
291
303
|
if (!transform) {
|
|
292
|
-
this.allocateAndZeroBezierWorkData(
|
|
304
|
+
this.allocateAndZeroBezierWorkData(productOrder, 0, 0);
|
|
293
305
|
const bezier = this._workBezier;
|
|
306
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
294
307
|
const data = this._polygon.packedData;
|
|
295
308
|
this.getPolePoint3d(0, this._workPoint0);
|
|
296
309
|
rangeToExtend.extend(this._workPoint0);
|
|
@@ -318,10 +331,13 @@ class BezierCurve3dH extends BezierCurveBase_1.BezierCurveBase {
|
|
|
318
331
|
}
|
|
319
332
|
}
|
|
320
333
|
else {
|
|
321
|
-
this.allocateAndZeroBezierWorkData(
|
|
334
|
+
this.allocateAndZeroBezierWorkData(productOrder, order, order);
|
|
335
|
+
const bezier = this._workBezier;
|
|
322
336
|
const componentCoffs = this._workCoffsA; // to hold transformed copy of x,y,z in turn.
|
|
323
337
|
const weightCoffs = this._workCoffsB; // to hold weights
|
|
324
|
-
|
|
338
|
+
(0, core_bentley_1.assert)(bezier !== undefined, "expect defined because productOrder > 0");
|
|
339
|
+
(0, core_bentley_1.assert)(componentCoffs !== undefined, "expect defined because order > 0");
|
|
340
|
+
(0, core_bentley_1.assert)(weightCoffs !== undefined, "expect defined because order > 0");
|
|
325
341
|
this.getPolePoint3d(0, this._workPoint0);
|
|
326
342
|
rangeToExtend.extendTransformedPoint(transform, this._workPoint0);
|
|
327
343
|
this.getPolePoint3d(order - 1, this._workPoint0);
|