@itwin/core-geometry 5.5.0-dev.2 → 5.5.0-dev.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/lib/cjs/Constant.js.map +1 -1
- package/lib/cjs/Geometry.js.map +1 -1
- package/lib/cjs/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BSpline1dNd.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/cjs/bspline/BSplineSurface.js.map +1 -1
- package/lib/cjs/bspline/Bezier1dNd.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3d.js.map +1 -1
- package/lib/cjs/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/cjs/bspline/BezierCurveBase.js.map +1 -1
- package/lib/cjs/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/cjs/bspline/KnotVector.js.map +1 -1
- package/lib/cjs/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/cjs/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/cjs/clipping/BooleanClipNode.js.map +1 -1
- package/lib/cjs/clipping/ClipPlane.js.map +1 -1
- package/lib/cjs/clipping/ClipPrimitive.js.map +1 -1
- package/lib/cjs/clipping/ClipUtils.js.map +1 -1
- package/lib/cjs/clipping/ClipVector.js.map +1 -1
- package/lib/cjs/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/cjs/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/cjs/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/cjs/core-geometry.js.map +1 -1
- package/lib/cjs/curve/Arc3d.js.map +1 -1
- package/lib/cjs/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/cjs/curve/CoordinateXYZ.js.map +1 -1
- package/lib/cjs/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/cjs/curve/CurveCollection.js.map +1 -1
- package/lib/cjs/curve/CurveCurve.js.map +1 -1
- package/lib/cjs/curve/CurveExtendMode.js.map +1 -1
- package/lib/cjs/curve/CurveFactory.js.map +1 -1
- package/lib/cjs/curve/CurveLocationDetail.js.map +1 -1
- package/lib/cjs/curve/CurveOps.js.map +1 -1
- package/lib/cjs/curve/CurvePrimitive.js.map +1 -1
- package/lib/cjs/curve/CurveProcessor.js.map +1 -1
- package/lib/cjs/curve/CurveTypes.js.map +1 -1
- package/lib/cjs/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/cjs/curve/GeometryQuery.js.map +1 -1
- package/lib/cjs/curve/LineSegment3d.js.map +1 -1
- package/lib/cjs/curve/LineString3d.js.map +1 -1
- package/lib/cjs/curve/Loop.js.map +1 -1
- package/lib/cjs/curve/OffsetOptions.js.map +1 -1
- package/lib/cjs/curve/ParityRegion.js.map +1 -1
- package/lib/cjs/curve/Path.js.map +1 -1
- package/lib/cjs/curve/PointString3d.js.map +1 -1
- package/lib/cjs/curve/ProxyCurve.js.map +1 -1
- package/lib/cjs/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/cjs/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/cjs/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/cjs/curve/Query/InOutTests.js.map +1 -1
- package/lib/cjs/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/cjs/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/cjs/curve/RegionMomentsXY.js.map +1 -1
- package/lib/cjs/curve/RegionOps.js.map +1 -1
- package/lib/cjs/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/cjs/curve/StrokeOptions.js.map +1 -1
- package/lib/cjs/curve/UnionRegion.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/cjs/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/cjs/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/cjs/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/cjs/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/cjs/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/cjs/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/cjs/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/cjs/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/cjs/geometry3d/Angle.js.map +1 -1
- package/lib/cjs/geometry3d/AngleSweep.js.map +1 -1
- package/lib/cjs/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/cjs/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/cjs/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/cjs/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/cjs/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/cjs/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/cjs/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/cjs/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/cjs/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/cjs/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/cjs/geometry3d/Matrix3d.js.map +1 -1
- package/lib/cjs/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3d.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/cjs/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/cjs/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/cjs/geometry3d/PointHelpers.js.map +1 -1
- package/lib/cjs/geometry3d/PointStreaming.js.map +1 -1
- package/lib/cjs/geometry3d/PolygonOps.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/cjs/geometry3d/PolylineOps.js.map +1 -1
- package/lib/cjs/geometry3d/Range.js.map +1 -1
- package/lib/cjs/geometry3d/Ray2d.js.map +1 -1
- package/lib/cjs/geometry3d/Ray3d.js.map +1 -1
- package/lib/cjs/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/cjs/geometry3d/Segment1d.js.map +1 -1
- package/lib/cjs/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/cjs/geometry3d/Transform.js.map +1 -1
- package/lib/cjs/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/cjs/geometry3d/XYZProps.js.map +1 -1
- package/lib/cjs/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/cjs/geometry4d/Map4d.js.map +1 -1
- package/lib/cjs/geometry4d/Matrix4d.js.map +1 -1
- package/lib/cjs/geometry4d/MomentData.js.map +1 -1
- package/lib/cjs/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/cjs/geometry4d/Point4d.js.map +1 -1
- package/lib/cjs/numerics/BandedSystem.js.map +1 -1
- package/lib/cjs/numerics/BezierPolynomials.js.map +1 -1
- package/lib/cjs/numerics/ClusterableArray.js.map +1 -1
- package/lib/cjs/numerics/Complex.js.map +1 -1
- package/lib/cjs/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/cjs/numerics/Newton.js.map +1 -1
- package/lib/cjs/numerics/PascalCoefficients.js.map +1 -1
- package/lib/cjs/numerics/PolarData.js.map +1 -1
- package/lib/cjs/numerics/Polynomials.js.map +1 -1
- package/lib/cjs/numerics/Quadrature.js.map +1 -1
- package/lib/cjs/numerics/Range1dArray.js.map +1 -1
- package/lib/cjs/numerics/SmallSystem.js.map +1 -1
- package/lib/cjs/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/cjs/numerics/UnionFind.js.map +1 -1
- package/lib/cjs/numerics/UsageSums.js.map +1 -1
- package/lib/cjs/polyface/AuxData.js.map +1 -1
- package/lib/cjs/polyface/BoxTopology.js.map +1 -1
- package/lib/cjs/polyface/FacetFaceData.js.map +1 -1
- package/lib/cjs/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/cjs/polyface/FacetOrientation.js.map +1 -1
- package/lib/cjs/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/cjs/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/cjs/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/cjs/polyface/Polyface.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceClip.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceData.js.map +1 -1
- package/lib/cjs/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/cjs/polyface/RangeLengthData.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/cjs/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/cjs/polyface/TaggedNumericData.js.map +1 -1
- package/lib/cjs/polyface/TriangleCandidate.js.map +1 -1
- package/lib/cjs/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/cjs/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/cjs/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/cjs/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/cjs/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/cjs/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/cjs/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/cjs/serialization/BGFBAccessors.js.map +1 -1
- package/lib/cjs/serialization/BGFBReader.js.map +1 -1
- package/lib/cjs/serialization/BGFBWriter.js.map +1 -1
- package/lib/cjs/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/cjs/serialization/DeepCompare.js.map +1 -1
- package/lib/cjs/serialization/GeometrySamples.js.map +1 -1
- package/lib/cjs/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/cjs/serialization/SerializationHelpers.js.map +1 -1
- package/lib/cjs/solid/Box.js.map +1 -1
- package/lib/cjs/solid/Cone.js.map +1 -1
- package/lib/cjs/solid/LinearSweep.js.map +1 -1
- package/lib/cjs/solid/RotationalSweep.js.map +1 -1
- package/lib/cjs/solid/RuledSweep.js.map +1 -1
- package/lib/cjs/solid/SolidPrimitive.js.map +1 -1
- package/lib/cjs/solid/Sphere.js.map +1 -1
- package/lib/cjs/solid/SweepContour.js.map +1 -1
- package/lib/cjs/solid/TorusPipe.js.map +1 -1
- package/lib/cjs/topology/ChainMerge.js.map +1 -1
- package/lib/cjs/topology/Graph.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/cjs/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/cjs/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/cjs/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/cjs/topology/MaskManager.js.map +1 -1
- package/lib/cjs/topology/Merging.js.map +1 -1
- package/lib/cjs/topology/RegularizeFace.js.map +1 -1
- package/lib/cjs/topology/SignedDataSummary.js.map +1 -1
- package/lib/cjs/topology/SpaceTriangulation.js.map +1 -1
- package/lib/cjs/topology/Triangulation.js.map +1 -1
- package/lib/cjs/topology/Voronoi.js.map +1 -1
- package/lib/cjs/topology/XYParitySearchContext.js.map +1 -1
- package/lib/esm/Constant.js.map +1 -1
- package/lib/esm/Geometry.js.map +1 -1
- package/lib/esm/bspline/AkimaCurve3d.js.map +1 -1
- package/lib/esm/bspline/BSpline1dNd.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve.js.map +1 -1
- package/lib/esm/bspline/BSplineCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BSplineCurveOps.js.map +1 -1
- package/lib/esm/bspline/BSplineSurface.js.map +1 -1
- package/lib/esm/bspline/Bezier1dNd.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3d.js.map +1 -1
- package/lib/esm/bspline/BezierCurve3dH.js.map +1 -1
- package/lib/esm/bspline/BezierCurveBase.js.map +1 -1
- package/lib/esm/bspline/InterpolationCurve3d.js.map +1 -1
- package/lib/esm/bspline/KnotVector.js.map +1 -1
- package/lib/esm/bspline/SurfaceLocationDetail.js.map +1 -1
- package/lib/esm/clipping/AlternatingConvexClipTree.js.map +1 -1
- package/lib/esm/clipping/BooleanClipFactory.js.map +1 -1
- package/lib/esm/clipping/BooleanClipNode.js.map +1 -1
- package/lib/esm/clipping/ClipPlane.js.map +1 -1
- package/lib/esm/clipping/ClipPrimitive.js.map +1 -1
- package/lib/esm/clipping/ClipUtils.js.map +1 -1
- package/lib/esm/clipping/ClipVector.js.map +1 -1
- package/lib/esm/clipping/ConvexClipPlaneSet.js.map +1 -1
- package/lib/esm/clipping/UnionOfConvexClipPlaneSets.js.map +1 -1
- package/lib/esm/clipping/internalContexts/LineStringOffsetClipperContext.js.map +1 -1
- package/lib/esm/core-geometry.js.map +1 -1
- package/lib/esm/curve/Arc3d.js.map +1 -1
- package/lib/esm/curve/ConstructCurveBetweenCurves.js.map +1 -1
- package/lib/esm/curve/CoordinateXYZ.js.map +1 -1
- package/lib/esm/curve/CurveChainWithDistanceIndex.js.map +1 -1
- package/lib/esm/curve/CurveCollection.js.map +1 -1
- package/lib/esm/curve/CurveCurve.js.map +1 -1
- package/lib/esm/curve/CurveExtendMode.js.map +1 -1
- package/lib/esm/curve/CurveFactory.js.map +1 -1
- package/lib/esm/curve/CurveLocationDetail.js.map +1 -1
- package/lib/esm/curve/CurveOps.js.map +1 -1
- package/lib/esm/curve/CurvePrimitive.js.map +1 -1
- package/lib/esm/curve/CurveProcessor.js.map +1 -1
- package/lib/esm/curve/CurveTypes.js.map +1 -1
- package/lib/esm/curve/CurveWireMomentsXYZ.js.map +1 -1
- package/lib/esm/curve/GeometryQuery.js.map +1 -1
- package/lib/esm/curve/LineSegment3d.js.map +1 -1
- package/lib/esm/curve/LineString3d.js.map +1 -1
- package/lib/esm/curve/Loop.js.map +1 -1
- package/lib/esm/curve/OffsetOptions.js.map +1 -1
- package/lib/esm/curve/ParityRegion.js.map +1 -1
- package/lib/esm/curve/Path.js.map +1 -1
- package/lib/esm/curve/PointString3d.js.map +1 -1
- package/lib/esm/curve/ProxyCurve.js.map +1 -1
- package/lib/esm/curve/Query/ConsolidateAdjacentPrimitivesContext.js.map +1 -1
- package/lib/esm/curve/Query/CurveSplitContext.js.map +1 -1
- package/lib/esm/curve/Query/CylindricalRange.js.map +1 -1
- package/lib/esm/curve/Query/InOutTests.js.map +1 -1
- package/lib/esm/curve/Query/PlanarSubdivision.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountChain.js.map +1 -1
- package/lib/esm/curve/Query/StrokeCountMap.js.map +1 -1
- package/lib/esm/curve/RegionMomentsXY.js.map +1 -1
- package/lib/esm/curve/RegionOps.js.map +1 -1
- package/lib/esm/curve/RegionOpsClassificationSweeps.js.map +1 -1
- package/lib/esm/curve/StrokeOptions.js.map +1 -1
- package/lib/esm/curve/UnionRegion.js.map +1 -1
- package/lib/esm/curve/internalContexts/AnnounceTangentStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/AppendPlaneIntersectionStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/ChainCollectorContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneCurvesContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CloneWithExpandedLineStrings.js.map +1 -1
- package/lib/esm/curve/internalContexts/ClosestPointStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/CountLinearPartsSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveCloseApproachXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXY.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveCurveIntersectXYZ.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveLengthContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/CurveOffsetXYHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/EllipticalArcApproximationContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/GapSearchContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/MultiChainCollector.js.map +1 -1
- package/lib/esm/curve/internalContexts/NewtonRtoRStrokeHandler.js.map +1 -1
- package/lib/esm/curve/internalContexts/PlaneAltitudeRangeContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/PolygonOffsetContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/SumLengthsContext.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransferWithSplitArcs.js.map +1 -1
- package/lib/esm/curve/internalContexts/TransformInPlaceContext.js.map +1 -1
- package/lib/esm/curve/spiral/AustralianRailCorpXYEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/ClothoidSeries.js.map +1 -1
- package/lib/esm/curve/spiral/CubicEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/CzechSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectHalfCosineSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/DirectSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/IntegratedSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/MXCubicAlongArcSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/NormalizedTransition.js.map +1 -1
- package/lib/esm/curve/spiral/PolishCubicSpiralEvaluator.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionConditionalProperties.js.map +1 -1
- package/lib/esm/curve/spiral/TransitionSpiral3d.js.map +1 -1
- package/lib/esm/curve/spiral/XYCurveEvaluator.js.map +1 -1
- package/lib/esm/geometry3d/Angle.js.map +1 -1
- package/lib/esm/geometry3d/AngleSweep.js.map +1 -1
- package/lib/esm/geometry3d/BarycentricTriangle.js.map +1 -1
- package/lib/esm/geometry3d/BilinearPatch.js.map +1 -1
- package/lib/esm/geometry3d/CoincidentGeometryOps.js.map +1 -1
- package/lib/esm/geometry3d/Ellipsoid.js.map +1 -1
- package/lib/esm/geometry3d/FrameBuilder.js.map +1 -1
- package/lib/esm/geometry3d/FrustumAnimation.js.map +1 -1
- package/lib/esm/geometry3d/GeometryHandler.js.map +1 -1
- package/lib/esm/geometry3d/GrowableBlockedArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableFloat64Array.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYArray.js.map +1 -1
- package/lib/esm/geometry3d/GrowableXYZArray.js.map +1 -1
- package/lib/esm/geometry3d/IndexedCollectionInterval.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYCollection.js.map +1 -1
- package/lib/esm/geometry3d/IndexedXYZCollection.js.map +1 -1
- package/lib/esm/geometry3d/LongitudeLatitudeAltitude.js.map +1 -1
- package/lib/esm/geometry3d/Matrix3d.js.map +1 -1
- package/lib/esm/geometry3d/OrderedRotationAngles.js.map +1 -1
- package/lib/esm/geometry3d/Plane3d.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndUnitNormal.js.map +1 -1
- package/lib/esm/geometry3d/Plane3dByOriginAndVectors.js.map +1 -1
- package/lib/esm/geometry3d/Point2dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point2dVector2d.js.map +1 -1
- package/lib/esm/geometry3d/Point3dArrayCarrier.js.map +1 -1
- package/lib/esm/geometry3d/Point3dVector3d.js.map +1 -1
- package/lib/esm/geometry3d/PointHelpers.js.map +1 -1
- package/lib/esm/geometry3d/PointStreaming.js.map +1 -1
- package/lib/esm/geometry3d/PolygonOps.js.map +1 -1
- package/lib/esm/geometry3d/PolylineCompressionByEdgeOffset.js.map +1 -1
- package/lib/esm/geometry3d/PolylineOps.js.map +1 -1
- package/lib/esm/geometry3d/Range.js.map +1 -1
- package/lib/esm/geometry3d/Ray2d.js.map +1 -1
- package/lib/esm/geometry3d/Ray3d.js.map +1 -1
- package/lib/esm/geometry3d/ReusableObjectCache.js.map +1 -1
- package/lib/esm/geometry3d/Segment1d.js.map +1 -1
- package/lib/esm/geometry3d/SortablePolygon.js.map +1 -1
- package/lib/esm/geometry3d/Transform.js.map +1 -1
- package/lib/esm/geometry3d/UVSurfaceOps.js.map +1 -1
- package/lib/esm/geometry3d/XYZProps.js.map +1 -1
- package/lib/esm/geometry3d/YawPitchRollAngles.js.map +1 -1
- package/lib/esm/geometry4d/Map4d.js.map +1 -1
- package/lib/esm/geometry4d/Matrix4d.js.map +1 -1
- package/lib/esm/geometry4d/MomentData.js.map +1 -1
- package/lib/esm/geometry4d/PlaneByOriginAndVectors4d.js.map +1 -1
- package/lib/esm/geometry4d/Point4d.js.map +1 -1
- package/lib/esm/numerics/BandedSystem.js.map +1 -1
- package/lib/esm/numerics/BezierPolynomials.js.map +1 -1
- package/lib/esm/numerics/ClusterableArray.js.map +1 -1
- package/lib/esm/numerics/Complex.js.map +1 -1
- package/lib/esm/numerics/ConvexPolygon2d.js.map +1 -1
- package/lib/esm/numerics/Newton.js.map +1 -1
- package/lib/esm/numerics/PascalCoefficients.js.map +1 -1
- package/lib/esm/numerics/PolarData.js.map +1 -1
- package/lib/esm/numerics/Polynomials.js.map +1 -1
- package/lib/esm/numerics/Quadrature.js.map +1 -1
- package/lib/esm/numerics/Range1dArray.js.map +1 -1
- package/lib/esm/numerics/SmallSystem.js.map +1 -1
- package/lib/esm/numerics/TriDiagonalSystem.js.map +1 -1
- package/lib/esm/numerics/UnionFind.js.map +1 -1
- package/lib/esm/numerics/UsageSums.js.map +1 -1
- package/lib/esm/polyface/AuxData.js.map +1 -1
- package/lib/esm/polyface/BoxTopology.js.map +1 -1
- package/lib/esm/polyface/FacetFaceData.js.map +1 -1
- package/lib/esm/polyface/FacetLocationDetail.js.map +1 -1
- package/lib/esm/polyface/FacetOrientation.js.map +1 -1
- package/lib/esm/polyface/GreedyTriangulationBetweenLineStrings.js.map +1 -1
- package/lib/esm/polyface/IndexedEdgeMatcher.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceVisitor.js.map +1 -1
- package/lib/esm/polyface/IndexedPolyfaceWalker.js.map +1 -1
- package/lib/esm/polyface/Polyface.js.map +1 -1
- package/lib/esm/polyface/PolyfaceBuilder.js.map +1 -1
- package/lib/esm/polyface/PolyfaceClip.js.map +1 -1
- package/lib/esm/polyface/PolyfaceData.js.map +1 -1
- package/lib/esm/polyface/PolyfaceQuery.js.map +1 -1
- package/lib/esm/polyface/RangeLengthData.js.map +1 -1
- package/lib/esm/polyface/RangeTree/LineString3dRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/MinimumValueTester.js.map +1 -1
- package/lib/esm/polyface/RangeTree/Point3dArrayRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/PolyfaceRangeTreeContext.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeNode.js.map +1 -1
- package/lib/esm/polyface/RangeTree/RangeTreeSearchHandlers.js.map +1 -1
- package/lib/esm/polyface/TaggedNumericData.js.map +1 -1
- package/lib/esm/polyface/TriangleCandidate.js.map +1 -1
- package/lib/esm/polyface/multiclip/BuildAverageNormalsContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSet.js.map +1 -1
- package/lib/esm/polyface/multiclip/GriddedRaggedRange2dSetWithOverflow.js.map +1 -1
- package/lib/esm/polyface/multiclip/LinearSearchRange2dArray.js.map +1 -1
- package/lib/esm/polyface/multiclip/OffsetMeshContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/Range2dSearchInterface.js.map +1 -1
- package/lib/esm/polyface/multiclip/RangeSearch.js.map +1 -1
- package/lib/esm/polyface/multiclip/SweepLineStringToFacetContext.js.map +1 -1
- package/lib/esm/polyface/multiclip/XYPointBuckets.js.map +1 -1
- package/lib/esm/serialization/BGFBAccessors.js.map +1 -1
- package/lib/esm/serialization/BGFBReader.js.map +1 -1
- package/lib/esm/serialization/BGFBWriter.js.map +1 -1
- package/lib/esm/serialization/BentleyGeometryFlatBuffer.js.map +1 -1
- package/lib/esm/serialization/DeepCompare.js.map +1 -1
- package/lib/esm/serialization/GeometrySamples.js.map +1 -1
- package/lib/esm/serialization/IModelJsonSchema.js.map +1 -1
- package/lib/esm/serialization/SerializationHelpers.js.map +1 -1
- package/lib/esm/solid/Box.js.map +1 -1
- package/lib/esm/solid/Cone.js.map +1 -1
- package/lib/esm/solid/LinearSweep.js.map +1 -1
- package/lib/esm/solid/RotationalSweep.js.map +1 -1
- package/lib/esm/solid/RuledSweep.js.map +1 -1
- package/lib/esm/solid/SolidPrimitive.js.map +1 -1
- package/lib/esm/solid/Sphere.js.map +1 -1
- package/lib/esm/solid/SweepContour.js.map +1 -1
- package/lib/esm/solid/TorusPipe.js.map +1 -1
- package/lib/esm/topology/ChainMerge.js.map +1 -1
- package/lib/esm/topology/Graph.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphFromIndexedLoopsContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphSpineContext.js.map +1 -1
- package/lib/esm/topology/HalfEdgeGraphValidation.js.map +1 -1
- package/lib/esm/topology/HalfEdgeMarkSet.js.map +1 -1
- package/lib/esm/topology/HalfEdgeNodeXYZUV.js.map +1 -1
- package/lib/esm/topology/HalfEdgePointInGraphSearch.js.map +1 -1
- package/lib/esm/topology/HalfEdgePositionDetail.js.map +1 -1
- package/lib/esm/topology/HalfEdgePriorityQueue.js.map +1 -1
- package/lib/esm/topology/InsertAndRetriangulateContext.js.map +1 -1
- package/lib/esm/topology/MaskManager.js.map +1 -1
- package/lib/esm/topology/Merging.js.map +1 -1
- package/lib/esm/topology/RegularizeFace.js.map +1 -1
- package/lib/esm/topology/SignedDataSummary.js.map +1 -1
- package/lib/esm/topology/SpaceTriangulation.js.map +1 -1
- package/lib/esm/topology/Triangulation.js.map +1 -1
- package/lib/esm/topology/Voronoi.js.map +1 -1
- package/lib/esm/topology/XYParitySearchContext.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BSplineSurface.js","sourceRoot":"","sources":["../../../src/bspline/BSplineSurface.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Bspline\n */\n\nimport { GeometryQuery } from \"../curve/GeometryQuery\";\nimport { AxisOrder, Geometry } from \"../Geometry\";\nimport { GeometryHandler, UVSurface } from \"../geometry3d/GeometryHandler\";\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray, Point4dArray } from \"../geometry3d/PointHelpers\";\nimport { Range3d } from \"../geometry3d/Range\";\nimport { Transform } from \"../geometry3d/Transform\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\n\n/**\n * UVSelect is an integer indicating uDirection (0) or vDirection (1) in a bspline surface parameterization.\n * @public\n */\nexport enum UVSelect {\n /** index of u direction */\n uDirection = 0,\n /**\n * index of v direction\n * @deprecated in 4.3.0 - will not be removed until after 2026-06-13. Use vDirection instead.\n */\n VDirection = 1,\n /** index of v direction */\n vDirection = 1, // eslint-disable-line @typescript-eslint/no-duplicate-enum-values\n}\n/**\n * Enumeration of how weights are carried\n * * UnWeighted (0) -- there are no weights\n * * WeightsAlreadyAppliedToCoordinates (1) -- for real point (x,y,z) the homogeneous point (wx,wy,wx,w) is stored as (wx,wy,wz,w)\n * * WeightsSeparateFromCoordinates (2) -- for real point (x,y,z) the homogeneous point (wx,wy,wx,w) is stored as (x,y,z,w)\n * * Note that \"internal\" computations never use WeightsSeparateFromCoordinates.\n * * WeightsSeparateFromCoordinates is only useful as input or output state in serializer.\n * @public\n */\nexport enum WeightStyle {\n /** There are no weights. */\n UnWeighted = 0,\n /**\n * * Data is weighted.\n * * The point with normalized coordinate `[x,y,z]` and weight `w` is stored as `[x*w,y*w,z*w,w]`\n * */\n WeightsAlreadyAppliedToCoordinates = 1,\n /**\n * * Data is weighted.\n * * The point with normalized coordinate `[x,y,z]` and weight `w` is stored as `[x,y,z,w]`\n * */\n WeightsSeparateFromCoordinates = 2,\n}\n/**\n * interface for points returned from getPointGrid, with annotation of physical and weighting dimensions.\n * @public\n */\nexport interface PackedPointGrid {\n /**\n * Array of coordinate data.\n * * points[row] is all the data for a grid row.\n * * points[row][j] is the jth point across the row\n * * points[row][j][k] is numeric value k.\n */\n points: number[][][];\n /**\n * Description of how weights are present in the coordinate data.\n */\n weightStyle?: WeightStyle;\n /**\n * number of cartesian dimensions, e.g. 2 or 3.\n */\n numCartesianDimensions: number;\n}\n/** Interface for methods supported by both regular (xyz) and weighted (xyzw) bspline surfaces.\n * @public\n */\nexport interface BSplineSurface3dQuery {\n /** Evaluate xyz coordinates at fractional parameter u,v */\n fractionToPoint(uFraction: number, vFraction: number): Point3d;\n /** Evaluate a rigid frame at fractional parameter u,v\n * * origin is at the surface point\n * * x column is a unit vector in the direction of the u derivative\n * * y column is a unit vector in the direction of the v derivative\n * * z direction is the surface normal\n */\n fractionToRigidFrame(uFraction: number, vFraction: number, result?: Transform): Transform | undefined;\n /** Evaluate xyz coordinates at knot values (uKnot, vKnot) */\n knotToPoint(uKnot: number, vKnot: number): Point3d;\n /** apply a transform to the surface */\n tryTransformInPlace(transform: Transform): boolean;\n /** clone the surface */\n clone(): BSplineSurface3dQuery;\n /** clone and transform */\n cloneTransformed(transform: Transform): BSplineSurface3dQuery;\n /** Reverse one of the parameterization directions. */\n reverseInPlace(select: UVSelect): void;\n /** Test if `this` and `other` are the same geometry class. */\n isSameGeometryClass(other: any): boolean;\n /** Extend `rangeToExtend` so this surface is included. */\n extendRange(rangeToExtend: Range3d, transform?: Transform): void;\n /** test for nearly equality with `other` */\n isAlmostEqual(other: any): boolean;\n /** ask if the u or v direction could be converted to periodic form */\n isClosable(select: UVSelect): boolean;\n /** Ask if the entire surface is within a plane. */\n isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean;\n /** return the total number of poles (product of u,v counts) */\n numPolesTotal(): number;\n /**\n * turn a numeric variable into a UVSelect (strict 0 or 1).\n */\n numberToUVSelect(value: number): UVSelect;\n /**\n * Return the degree in in selected direction (0 for u, 1 for v)\n * @param select 0 for u, 1 for v\n */\n degreeUV(select: UVSelect): number;\n /**\n * Return the order in in selected direction (0 for u, 1 for v)\n * @param select 0 for u, 1 for v\n */\n orderUV(select: UVSelect): number;\n /**\n * Return the number of bezier spans in selected direction (0 for u, 1 for v)\n * @param select 0 for u, 1 for v\n */\n numSpanUV(select: UVSelect): number;\n\n /**\n * Return the number of poles in selected direction (0 for u, 1 for v)\n * @param select 0 for u, 1 for v\n */\n numPolesUV(select: UVSelect): number;\n\n /**\n * Return the step between adjacent poles in selected direction (0 for u, 1 for v)\n * @param select 0 for u, 1 for v\n */\n poleStepUV(select: UVSelect): number;\n\n /**\n * Return control points json arrays.\n * * Each row of points is an an array.\n * * Within the array for each row, each point is an array [x,y,z] or [x,y,z,w].\n * * The PackedPointGrid indicates if weights are present.\n */\n getPointGridJSON(): PackedPointGrid;\n}\n/** Bspline knots and poles for 2d-to-Nd.\n * * This abstract class in not independently instantiable -- GeometryQuery methods must be implemented by derived classes.\n * @public\n */\nexport abstract class BSpline2dNd extends GeometryQuery {\n /** String name for schema properties */\n public readonly geometryCategory = \"bsurf\";\n /** Array of (exactly 2) knot vectors for the u, v directions */\n public knots: KnotVector[];\n /** flat array of coordinate data, blocked by poleDimension and row */\n public coffs: Float64Array;\n /**\n * Number of components per pole.\n * * 3 for conventional xyz surface\n * * 4 for weighted (wx, wy, wz, w) surface.\n */\n public poleDimension: number;\n private _numPoles: number[];\n /** Return the degree (one less than order) for the `select` direction (0 or 1) */\n public degreeUV(select: UVSelect): number { return this.knots[select].degree; }\n /** Return the order (one more than degree) for the `select` direction (0 or 1) */\n public orderUV(select: UVSelect): number { return this.knots[select].degree + 1; }\n /** Return the number of spans (INCLUDING NULL SPANS) for the `select` direction (0 or 1) */\n public numSpanUV(select: UVSelect): number { return this._numPoles[select] - this.knots[select].degree; }\n /** Return the total number of poles (product of x and y pole counts) */\n public numPolesTotal(): number { return this.coffs.length / this.poleDimension; }\n /** Return the number of poles for the `select` direction (0 or 1) */\n public numPolesUV(select: UVSelect): number { return this._numPoles[select]; }\n /** Return the step between adjacent poles for the `select` direction (0 or 1) */\n public poleStepUV(select: UVSelect): number { return select === 0 ? 1 : this._numPoles[0]; }\n /** Confirm that order and pole counts agree for both u and v directions */\n public static validOrderAndPoleCounts(orderU: number, numPolesU: number, orderV: number, numPolesV: number, numUV: number): boolean {\n if (orderU < 2 || numPolesU < orderU)\n return false;\n if (orderV < 2 || numPolesV < orderV)\n return false;\n if (numPolesU * numPolesV !== numUV)\n return false;\n return true;\n }\n /** Get the indexed Point3d.\n * * (IMPORTANT) This assumes this is an xyz surface. Data will be incorrect if this is an xyzw surface.\n * @param i index in [0, numPolesU)\n * @param j index in [0, numPolesV)\n */\n public getPoint3dPole(i: number, j: number, result?: Point3d): Point3d | undefined {\n return Point3d.createFromPacked(this.coffs, i + j * this._numPoles[0], result);\n }\n /** Get the indexed Point3d, projecting the weight away to get to xyz.\n * * (IMPORTANT) This assumes this is an xyzw surface. Data will be incorrect if this is an xyz surface.\n * @param i index in [0, numPolesU)\n * @param j index in [0, numPolesV)\n */\n public getPoint3dPoleXYZW(i: number, j: number, result?: Point3d): Point3d | undefined {\n return Point3d.createFromPackedXYZW(this.coffs, i + j * this._numPoles[0], result);\n }\n /** Get the indexed Point4d.\n * * (IMPORTANT) This assumes this is an xyzw surface. Data will be incorrect if this is an xyz surface.\n * @param i index in [0, numPolesU)\n * @param j index in [0, numPolesV)\n */\n public getPoint4dPole(i: number, j: number, result?: Point4d): Point4d | undefined {\n return Point4d.createFromPacked(this.coffs, (i + j * this._numPoles[0]) * 4, result);\n }\n /**\n * Return 0 for 0 input, 1 for any nonzero input.\n * @param value numeric value to convert to strict 0 or 1.\n */\n public numberToUVSelect(value: number): UVSelect { return value === 0 ? 0 : 1; }\n /** extend a range, treating each block as simple XYZ */\n public extendRangeXYZ(rangeToExtend: Range3d, transform?: Transform) {\n const buffer = this.coffs;\n const pd = this.poleDimension;\n const n = buffer.length + 1 - pd;\n if (transform) {\n for (let i0 = 0; i0 < n; i0 += pd)\n rangeToExtend.extendTransformedXYZ(transform, buffer[i0], buffer[i0 + 1], buffer[i0 + 2]);\n } else {\n for (let i0 = 0; i0 < n; i0 += pd)\n rangeToExtend.extendXYZ(buffer[i0], buffer[i0 + 1], buffer[i0 + 2]);\n }\n }\n\n /** extend a range, treating each block as homogeneous xyzw, with weight at offset 3 */\n public extendRangeXYZH(rangeToExtend: Range3d, transform?: Transform) {\n const buffer = this.coffs;\n const pd = this.poleDimension;\n const n = buffer.length + 1 - pd;\n let w = 0;\n let divW = 0;\n if (transform) {\n for (let i0 = 0; i0 < n; i0 += pd) {\n w = buffer[i0 + 3];\n if (w !== 0.0) {\n divW = 1.0 / w;\n rangeToExtend.extendTransformedXYZ(transform,\n buffer[i0] * divW,\n buffer[i0 + 1] * divW,\n buffer[i0 + 2] * divW);\n }\n }\n } else {\n for (let i0 = 0; i0 < n; i0 += pd) {\n w = buffer[i0 + 3];\n if (w !== 0.0) {\n divW = 1.0 / w;\n rangeToExtend.extendXYZ(\n buffer[i0] * divW,\n buffer[i0 + 1] * divW,\n buffer[i0 + 2] * divW);\n }\n }\n }\n }\n /**\n * abstract declaration for evaluation of (unweighted) 3d point and derivatives.\n * Derived classes must implement to get fractionToRigidFrame support.\n * @param _fractionU u parameter\n * @param _fractionV v parameter\n * @param _result optional result.\n */\n public abstract fractionToPointAndDerivatives(_fractionU: number, _fractionV: number, _result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined;\n /**\n * evaluate the surface at u and v fractions. Return a (squared, right handed) coordinate frame at that point on the surface.\n * @param fractionU u parameter\n * @param fractionV v parameter\n * @param result undefined if surface derivatives are parallel (or either alone is zero)\n */\n public fractionToRigidFrame(fractionU: number, fractionV: number, result?: Transform): Transform | undefined {\n const skewVectors = this.fractionToPointAndDerivatives(fractionU, fractionV);\n if (!skewVectors)\n return undefined;\n const axes = Matrix3d.createColumnsInAxisOrder(AxisOrder.XYZ,\n skewVectors.vectorU, skewVectors.vectorV, undefined);\n const axes1 = Matrix3d.createRigidFromMatrix3d(axes, AxisOrder.XYZ, axes);\n if (axes1)\n result = Transform.createOriginAndMatrix(skewVectors.origin, axes1, result);\n return result;\n }\n /** a scratch array sized for `order` numbers */\n protected _basisBufferUV: Float64Array[]; // basis function buffers for u, v directions. ALLOCATED BY CTOR FOR FREQUENT REUSE\n /** a scratch array sized for `order` numbers */\n protected _basisBuffer1UV: Float64Array[]; // basis function buffers for u, v directions. ALLOCATED BY CTOR FOR FREQUENT REUSE\n\n /** a scratch array sized for one pole */\n protected _poleBuffer: Float64Array; // one set of target values. ALLOCATED BY CTOR FOR FREQUENT REUSE\n /** array of 2 scratch array, each sized for one pole\n * * used in derivative evaluations, with respective u and v derivatives in the respective arrays.\n */\n protected _poleBuffer1UV: Float64Array[]; // one set of target values. ALLOCATED BY CTOR FOR FREQUENT REUSE\n\n /**\n * initialize arrays for given spline dimensions.\n * coffs length must be poleLength * numPolesU * numPolesV !!!!\n */\n protected constructor(numPolesU: number, numPolesV: number, poleLength: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\n super();\n const orderU = knotsU.degree + 1;\n const orderV = knotsV.degree + 1;\n this.knots = [knotsU, knotsV];\n this.coffs = coffs;\n this.poleDimension = poleLength;\n this._basisBufferUV = [new Float64Array(orderU), new Float64Array(orderV)];\n this._basisBuffer1UV = [new Float64Array(orderU), new Float64Array(orderV)];\n this._numPoles = [numPolesU, numPolesV];\n this._poleBuffer = new Float64Array(poleLength);\n this._poleBuffer1UV = [new Float64Array(poleLength), new Float64Array(poleLength)];\n\n }\n /**\n * Map a position, specified as (uv direction, bezier span, fraction within the bezier), to an overall knot value.\n * @param select selector indicating U or V direction.\n * @param span index of bezier span\n * @param localFraction fractional coordinate within the bezier span\n */\n public spanFractionToKnot(select: UVSelect, span: number, localFraction: number): number {\n return this.knots[select].spanFractionToKnot(span, localFraction);\n }\n\n /** Evaluate basis functions given\n * * choice of u or v\n * * span index\n * * local fraction within the span.\n * @returns true if and only if output arrays are sufficiently sized\n */\n public spanFractionsToBasisFunctions(select: UVSelect, spanIndex: number, spanFraction: number, f: Float64Array, df?: Float64Array): boolean {\n spanIndex = Geometry.clampToStartEnd(spanIndex, 0, this.numSpanUV(select));\n const knotIndex0 = spanIndex + this.degreeUV(select) - 1;\n const globalKnot = this.knots[select].baseKnotFractionToKnot(knotIndex0, spanFraction);\n return df ?\n this.knots[select].evaluateBasisFunctions1(knotIndex0, globalKnot, f, df) :\n this.knots[select].evaluateBasisFunctions(knotIndex0, globalKnot, f);\n }\n /** sum poles by the weights in the basisBuffer, using poles for given span */\n public sumPoleBufferForSpan(spanIndexU: number, spanIndexV: number) {\n const poleBuffer = this._poleBuffer;\n const coffs = this.coffs;\n poleBuffer.fill(0);\n const m = this.poleDimension;\n const stepV = this.poleDimension * this._numPoles[0];\n let kU = m * spanIndexU + spanIndexV * stepV;\n let g = 0;\n for (const fV of this._basisBufferUV[1]) {\n let k = kU;\n for (const fU of this._basisBufferUV[0]) {\n g = fU * fV;\n for (let j = 0; j < m; j++) {\n poleBuffer[j] += g * coffs[k++];\n }\n }\n kU += stepV;\n }\n }\n /**\n * sum poles by the weights in the basisBuffer, using poles for given span\n * @deprecated in 4.3.0 - will not be removed until after 2026-06-13. Use sumPoleBufferDerivativesForSpan instead.\n */\n public sumpoleBufferDerivativesForSpan(spanIndexU: number, spanIndexV: number) {\n return this.sumPoleBufferDerivativesForSpan(spanIndexU, spanIndexV);\n }\n /** sum derivatives by the weights in the basisBuffer, using poles for given span */\n public sumPoleBufferDerivativesForSpan(spanIndexU: number, spanIndexV: number) {\n const poleBuffer1U = this._poleBuffer1UV[0];\n const poleBuffer1V = this._poleBuffer1UV[1];\n poleBuffer1U.fill(0);\n poleBuffer1V.fill(0);\n const m = this.poleDimension;\n const stepV = this.poleDimension * this._numPoles[0];\n let kU = m * spanIndexU + spanIndexV * stepV;\n // U partial derivatives ...\n let g = 0;\n for (const fV of this._basisBufferUV[1]) {\n let k = kU;\n for (const fU of this._basisBuffer1UV[0]) {\n g = fU * fV;\n for (let j = 0; j < m; j++) {\n poleBuffer1U[j] += g * this.coffs[k++];\n }\n }\n kU += stepV;\n }\n\n // V partial derivatives ...\n kU = m * spanIndexU + spanIndexV * stepV;\n for (const fV of this._basisBuffer1UV[1]) {\n let k = kU;\n for (const fU of this._basisBufferUV[0]) {\n g = fU * fV;\n for (let j = 0; j < m; j++) {\n poleBuffer1V[j] += g * this.coffs[k++];\n }\n }\n kU += stepV;\n }\n }\n /**\n * Evaluate the _basisBuffer, _poleBuffer and (optionally) _basisBuffer1 and _poleBuffer1 arrays at given knot.\n *\n * @param u u knot value\n * @param v v not value\n * @param numDerivative number of derivatives needed\n */\n public evaluateBuffersAtKnot(u: number, v: number, numDerivative: number = 0) {\n const knotIndex0U = this.knots[0].knotToLeftKnotIndex(u);\n const knotIndex0V = this.knots[1].knotToLeftKnotIndex(v);\n const poleIndex0U = knotIndex0U - this.degreeUV(0) + 1;\n const poleIndex0V = knotIndex0V - this.degreeUV(1) + 1;\n\n if (numDerivative < 1) {\n this.knots[0].evaluateBasisFunctions(knotIndex0U, u, this._basisBufferUV[0]);\n this.knots[1].evaluateBasisFunctions(knotIndex0V, v, this._basisBufferUV[1]);\n this.sumPoleBufferForSpan(poleIndex0U, poleIndex0V);\n } else {\n this.knots[0].evaluateBasisFunctions1(knotIndex0U, u, this._basisBufferUV[0], this._basisBuffer1UV[0]);\n this.knots[1].evaluateBasisFunctions1(knotIndex0V, v, this._basisBufferUV[1], this._basisBuffer1UV[1]);\n this.sumPoleBufferForSpan(poleIndex0U, poleIndex0V);\n this.sumPoleBufferDerivativesForSpan(poleIndex0U, poleIndex0V);\n }\n }\n // Swap numSwap entries in coffs, starting at i0 and i1 (absolute indices -- not blocks)\n private swapBlocks(i0: number, i1: number, numSwap: number) {\n let a: number;\n for (let i = 0; i < numSwap; i++) {\n a = this.coffs[i0 + i];\n this.coffs[i0 + i] = this.coffs[i1 + i];\n this.coffs[i1 + i] = a;\n }\n }\n /**\n * Reverse the parameter direction for either u or v.\n * @param select direction to reverse -- 0 for u, 1 for v.\n */\n public reverseInPlace(select: UVSelect): void {\n const m = this.poleDimension;\n const numU = this.numPolesUV(0);\n const numV = this.numPolesUV(1);\n if (select === 0) {\n // reverse within rows.\n for (let j = 0; j < numV; j++) {\n const rowStart = j * numU * m;\n for (let i0 = 0, i1 = numU - 1; i0 < i1; i0++, i1--) {\n this.swapBlocks(rowStart + i0 * m, rowStart + i1 * m, m);\n }\n }\n } else {\n // swap full rows ..\n const numPerRow = m * numU;\n for (let i0 = 0, i1 = (numV - 1) * numPerRow;\n i0 < i1;\n i0 += numPerRow, i1 -= numPerRow) {\n this.swapBlocks(i0, i1, numPerRow);\n }\n }\n this.knots[select].reflectKnots();\n }\n /**\n * Get the flag indicating the surface might be suitable for having wrapped \"closed\" interpretation.\n */\n public getWrappable(select: UVSelect): BSplineWrapMode {\n return this.knots[select].wrappable;\n }\n /**\n * Set the flag indicating the surface might be suitable for having wrapped \"closed\" interpretation.\n */\n public setWrappable(select: UVSelect, value: BSplineWrapMode) {\n this.knots[select].wrappable = value;\n }\n /**\n * Test if leading and trailing blocks of points match in a given direction.\n * @param data packed array of points in row-major order (numRows x numColumns x dimension numbers)\n * @param numRows number of rows of points in the array\n * @param numColumns number of columns of points in the array (equal to the number of points in each row)\n * @param dimension point dimension (e.g., 2,3,4)\n * @param blockLength number of leading/trailing points to check\n * @param select 0 to test first/last columns of points; 1 to test first/last rows of points\n * @returns true if coordinates matched\n */\n public static isWrappedGrid(data: Float64Array, numRows: number, numColumns: number, dimension: number, blockLength: number, select: UVSelect): boolean {\n const rowToRowStep = numColumns * dimension;\n if (UVSelect.uDirection === select) {\n // Test the contiguous block at the start/end of each row\n const numTest = dimension * blockLength;\n for (let row = 0; row < numRows; row++) {\n const i0 = row * rowToRowStep;\n const i1 = i0 + rowToRowStep - numTest;\n for (let i = 0; i < numTest; i++) {\n if (!Geometry.isSameCoordinate(data[i0 + i], data[i1 + i]))\n return false;\n }\n }\n } else {\n // Test the entire multi-row contiguous block at the start/end of the array\n const numTest = blockLength * rowToRowStep;\n const i1 = numRows * numColumns * dimension - numTest;\n for (let i = 0; i < numTest; i++) {\n if (!Geometry.isSameCoordinate(data[i], data[i1 + i]))\n return false;\n }\n }\n return true;\n }\n /**\n * Test if `degree` leading and trailing (one of U or V) blocks match, as if the data is a non-periodic physically closed spline in the selected direction.\n * @param select select U or V direction\n * @returns true if coordinates matched.\n */\n public testClosableGrid(select: UVSelect, mode?: BSplineWrapMode): boolean {\n if (mode === undefined)\n mode = this.knots[select].wrappable;\n if (mode === BSplineWrapMode.OpenByAddingControlPoints) // the last degree poles equal the first degree poles\n return BSpline2dNd.isWrappedGrid(this.coffs, this.numPolesUV(UVSelect.vDirection), this.numPolesUV(UVSelect.uDirection), this.poleDimension, this.degreeUV(select), select);\n if (mode === BSplineWrapMode.OpenByRemovingKnots) // the last pole equals the first pole\n return BSpline2dNd.isWrappedGrid(this.coffs, this.numPolesUV(UVSelect.vDirection), this.numPolesUV(UVSelect.uDirection), this.poleDimension, 1, select);\n return false;\n }\n /**\n * Test knots and control points to determine if it is possible to close (aka \"wrap\") the surface in the selected parametric direction.\n * @param select select U or V direction\n * @return whether the surface can be wrapped in the given parametric direction.\n */\n public isClosable(select: UVSelect): boolean {\n return BSplineWrapMode.None !== this.isClosableSurface(select);\n }\n /**\n * Test knots and control points to determine if it is possible to close (aka \"wrap\") the surface in the selected parametric direction.\n * @param select select U or V direction\n * @return the manner of closing. See `BSplineWrapMode` for particulars of each mode.\n */\n public isClosableSurface(select: UVSelect): BSplineWrapMode {\n const mode = this.knots[select].wrappable;\n if (mode === BSplineWrapMode.None)\n return BSplineWrapMode.None;\n if (!this.knots[select].testClosable(mode))\n return BSplineWrapMode.None;\n if (!this.testClosableGrid(select, mode))\n return BSplineWrapMode.None;\n return mode;\n }\n}\n\n/** BSplineSurface3d is a parametric surface in xyz space.\n * * This (BSplineSurface3d) is an unweighted surface. Use the separate class BSplineSurface3dH for a weighted surface.\n *\n * The various static \"create\" methods have subtle differences in how grid sizes are conveyed:\n * | Method | control point array | counts |\n * | create | flat array of [x,y,z] | arguments numPolesU, numPolesV |\n * | createGrid | array of array of [x,y,z ] | There are no `numPolesU` or `numPolesV` args. The counts are conveyed by the deep arrays |\n * @public\n */\nexport class BSplineSurface3d extends BSpline2dNd implements BSplineSurface3dQuery, UVSurface {\n /** Test if `other` is an instance of `BSplineSurface3d */\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineSurface3d; }\n /** Apply the transform to the poles */\n public tryTransformInPlace(transform: Transform): boolean { Point3dArray.multiplyInPlace(transform, this.coffs); return true; }\n /** Return a pole by u and v indices */\n public getPole(i: number, j: number, result?: Point3d): Point3d | undefined {\n return this.getPoint3dPole(i, j, result);\n }\n\n private constructor(numPolesU: number, numPolesV: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\n super(numPolesU, numPolesV, 3, knotsU, knotsV, coffs);\n }\n /**\n * Return control points json arrays.\n * * if `flatArray===true`, each point appears as an array [x,y,z] in row-major order of a containing array.\n * * if `flatArray===false` each row of points is an an array of [x,y,z] in an array. Each of these row arrays is in the result array.\n */\n public getPointArray(flatArray: boolean = true): any[] {\n if (flatArray)\n return Point3dArray.unpackNumbersToNestedArrays(this.coffs, 3);\n return Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 3, this.numPolesUV(0));\n }\n /**\n * Return control points json arrays.\n * * Each row of points is an an array.\n * * Within the array for each row, each point is an array [x,y,z]\n */\n public getPointGridJSON(): PackedPointGrid {\n const result = {\n points: Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 3, this.numPolesUV(0)),\n weightStyle: WeightStyle.UnWeighted,\n numCartesianDimensions: 3,\n };\n return result;\n }\n\n /** Return a simple array of the control points coordinates */\n public copyPointsFloat64Array(): Float64Array { return this.coffs.slice(); }\n /**\n * return a simple array form of the knots. optionally replicate the first and last\n * in classic over-clamped manner\n */\n public copyKnots(select: UVSelect, includeExtraEndKnot: boolean): number[] { return this.knots[select].copyKnots(includeExtraEndKnot); }\n\n /**\n * Create a bspline surface.\n * * This `create` variant takes control points in a \"flattened\" array, with\n * points from succeeding U rows packed together in one array. Use `createGrid` if the points are in\n * a row-by-row grid structure\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\n * * When knots are given, two knot count conditions are recognized:\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\n * extraneous knots of classic clamping.\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\n * the classic unused first and last knot.\n * @param controlPointArray Array of points, ordered along the U direction.\n * @param numPoleU number of poles in each row\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayU knots for the V direction. See note above about knot counts.\n * @param numPoleV number of rows of poles\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayV knots for the V direction. See note above about knot counts.\n */\n public static create(controlPointArray: Point3d[] | Float64Array,\n numPolesU: number,\n orderU: number,\n knotArrayU: number[] | Float64Array | undefined,\n numPolesV: number,\n orderV: number,\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3d | undefined {\n let numPoles = controlPointArray.length;\n if (controlPointArray instanceof Float64Array)\n numPoles /= 3;\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\n return undefined;\n // shift knots-of-interest limits for over-clamped case ...\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\n\n const knotsU = knotArrayU ?\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\n const knotsV = knotArrayV ?\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\n const coffs = new Float64Array(3 * numPolesU * numPolesV);\n if (controlPointArray instanceof Float64Array) {\n let i = 0;\n for (const coordinate of controlPointArray) { coffs[i++] = coordinate; }\n } else {\n let i = 0;\n for (const p of controlPointArray) {\n coffs[i++] = p.x;\n coffs[i++] = p.y;\n coffs[i++] = p.z;\n }\n }\n const surface = new BSplineSurface3d(numPolesU, numPolesV, knotsU, knotsV, coffs);\n return surface;\n }\n\n /**\n * Create a bspline surface.\n * * This `create` variant takes control points in a \"grid\" array, with the points from\n * each grid row `[rowIndex]` being an independent array `points[rowIndex][indexAlongRow][x,y,z]`\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\n * * When knots are given, two knot count conditions are recognized in each direction:\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\n * extraneous knots of classic clamping.\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\n * the classic unused first and last knot.\n * @param points Array of points, ordered along the U direction.\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayU knots for the V direction. See note above about knot counts.\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayV knots for the V direction. See note above about knot counts.\n */\n public static createGrid(points: number[][][],\n orderU: number,\n knotArrayU: number[] | Float64Array | undefined,\n orderV: number,\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3d | undefined {\n const numPolesV = points.length;\n const numPolesU = points[0].length;\n const numPoles = numPolesU * numPolesV;\n if (3 !== points[0][0].length)\n return undefined;\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\n return undefined;\n\n // shift knots-of-interest limits for overclamped case ...\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\n\n const knotsU = knotArrayU ?\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\n const knotsV = knotArrayV ?\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\n\n const coffs = new Float64Array(3 * numPolesU * numPolesV);\n let i = 0;\n for (const row of points) {\n for (const xyz of row) {\n coffs[i++] = xyz[0];\n coffs[i++] = xyz[1];\n coffs[i++] = xyz[2];\n }\n }\n return new BSplineSurface3d(numPolesU, numPolesV, knotsU, knotsV, coffs);\n }\n\n /**\n * Return a complete copy of the bspline surface.\n */\n public clone(): BSplineSurface3d {\n const knotVector1U = this.knots[0].clone();\n const knotVector1V = this.knots[1].clone();\n const surface1 = new BSplineSurface3d(this.numPolesUV(0), this.numPolesUV(1), knotVector1U, knotVector1V, this.coffs.slice());\n return surface1;\n }\n /**\n * Return a complete copy of the bspline surface, with a transform applied to the control points.\n * @param transform transform to apply to the control points\n */\n public cloneTransformed(transform: Transform): BSplineSurface3d {\n const surface1 = this.clone();\n surface1.tryTransformInPlace(transform);\n return surface1;\n }\n\n /** Evaluate at a position given by u and v coordinates in knot space.\n * @param u u value, in knot range.\n * @param v v value in knot range.\n * @returns Return the xyz coordinates on the surface.\n */\n public knotToPoint(u: number, v: number): Point3d {\n this.evaluateBuffersAtKnot(u, v);\n return Point3d.createFrom(this._poleBuffer);\n }\n /** Evaluate at a position given by a knot value. */\n public knotToPointAndDerivatives(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n this.evaluateBuffersAtKnot(u, v, 1);\n return Plane3dByOriginAndVectors.createOriginAndVectorsArrays(\n this._poleBuffer, this._poleBuffer1UV[0], this._poleBuffer1UV[1], result);\n }\n /** Evaluate at a position given by fractional coordinate in each direction.\n * @param fractionU u coordinate, as a fraction of the knot range.\n * @param fractionV v coordinate, as a fraction of the knot range.\n * @returns Return the xyz coordinates on the surface.\n */\n public fractionToPoint(fractionU: number, fractionV: number): Point3d {\n return this.knotToPoint(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV));\n }\n\n /**\n * evaluate the surface at u and v fractions.\n * @returns plane with origin at the surface point, direction vectors are derivatives in the u and v directions.\n * @param fractionU u coordinate, as a fraction of the knot range.\n * @param fractionV v coordinate, as a fraction of the knot range.\n * @param result optional pre-allocated object for return values.\n * @returns Returns point and derivative directions.\n */\n public override fractionToPointAndDerivatives(fractionU: number, fractionV: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const knotU = this.knots[0].fractionToKnot(fractionU);\n const knotV = this.knots[1].fractionToKnot(fractionV);\n return this.knotToPointAndDerivatives(knotU, knotV, result);\n }\n\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\n public uvFractionToPoint(u: number, v: number): Point3d {\n return this.fractionToPoint(u, v);\n }\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n return this.fractionToPointAndDerivatives(u, v, result);\n }\n\n /** test for identical counts and near-equal coordinates */\n public override isAlmostEqual(other: any): boolean {\n if (other instanceof BSplineSurface3d) {\n return this.knots[0].isAlmostEqual(other.knots[0])\n && this.knots[1].isAlmostEqual(other.knots[1])\n && Point3dArray.isAlmostEqual(this.coffs, other.coffs);\n }\n return false;\n }\n /** Test if all poles are in a plane */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n return Point3dArray.isCloseToPlane(this.coffs, plane);\n }\n /** Second step of double dispatch: call `handler.handleBSplineSurface3d(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleBSplineSurface3d(this);\n }\n /** Extend the range to include all poles\n * * This is not a tight range.\n */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n this.extendRangeXYZ(rangeToExtend, transform);\n }\n\n}\n\n/** BSpline Surface in xyzw homogeneous space\n * @public\n */\nexport class BSplineSurface3dH extends BSpline2dNd implements BSplineSurface3dQuery, UVSurface {\n /** Test if `other` is an instance of `BSplineSurface3dH */\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineSurface3dH; }\n /** Apply the transform to the poles */\n public tryTransformInPlace(transform: Transform): boolean {\n Point4dArray.multiplyInPlace(transform, this.coffs); return true;\n }\n /** Return a pole by u and v indices */\n public getPole(i: number, j: number, result?: Point3d): Point3d | undefined {\n return this.getPoint3dPoleXYZW(i, j, result);\n }\n\n private constructor(numPolesU: number, numPolesV: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\n super(numPolesU, numPolesV, 4, knotsU, knotsV, coffs);\n }\n /** Unpack the control points to a Point4d array of form [wx,wy,wz,w]. */\n public copyPoints4d(): Point4d[] { return Point4dArray.unpackToPoint4dArray(this.coffs); }\n\n /**\n * Unpack the control points to a Point3d array and an array of weights.\n * @param points output xyz, weighted by default formatter\n * @param weights output weights\n * @param formatter optional xyz formatter. By default, returns a Point3d of form [wx,wy,wz].\n */\n public copyPointsAndWeights(points: Point3d[], weights: number[],\n formatter: (x: number, y: number, z: number) => any = (x, y, z) => Point3d.create(x, y, z)) {\n Point4dArray.unpackFloat64ArrayToPointsAndWeights(this.coffs, points, weights, formatter);\n }\n /**\n * Copy the control points to a packed 3D array.\n * @param unweight if true, output array has form x,y,z; if false, output array has form wx,wy,wz.\n */\n public copyXYZToFloat64Array(unweight: boolean): Float64Array {\n const numPoints = Math.floor(this.coffs.length / 4);\n const result = new Float64Array(numPoints * 3);\n let j = 0;\n for (let i = 0; i < numPoints; i++) {\n const ix = i * 4;\n if (unweight) {\n const dw = 1.0 / this.coffs[ix + 3];\n result[j++] = this.coffs[ix] * dw;\n result[j++] = this.coffs[ix + 1] * dw;\n result[j++] = this.coffs[ix + 2] * dw;\n } else {\n result[j++] = this.coffs[ix];\n result[j++] = this.coffs[ix + 1];\n result[j++] = this.coffs[ix + 2];\n\n }\n }\n return result;\n }\n /** unpack from xyzw xyzw ... to packed weights\n */\n public copyWeightsToFloat64Array(): Float64Array {\n const numPoints = Math.floor(this.coffs.length / 4);\n const result = new Float64Array(numPoints);\n let i = 0;\n let j = 0;\n for (; i < numPoints; i++) {\n result[j++] = this.coffs[4 * i + 3];\n }\n return result;\n }\n /**\n * return a simple array form of the knots. optionally replicate the first and last\n * in classic over-clamped manner\n */\n public copyKnots(select: UVSelect, includeExtraEndKnot: boolean): number[] { return this.knots[select].copyKnots(includeExtraEndKnot); }\n\n /**\n * Create a weighted bspline surface, with control points and weights each organized as flattened arrays continuing from one U row to the next.\n * * Use `createGrid` if the control points are in a deeper grid array structure.\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\n * * When knots are given, two knot count conditions are recognized:\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\n * extraneous knots of classic clamping.\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\n * the classic unused first and last knot.\n * @param controlPointArray Array of [wx,wy,wz] points, ordered along the U direction.\n * @param weightArray array of weights, ordered along the U direction. If undefined, unit weights are installed.\n * @param numPolesU number of poles in each row in the U direction.\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayU optional knots for the V direction. See note above about knot counts.\n * @param numPolesV number of poles in each column in the V direction (the number of rows).\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayV optional knots for the V direction. See note above about knot counts.\n */\n public static create(\n controlPointArray: Point3d[] | Float64Array,\n weightArray: number[] | Float64Array | undefined,\n numPolesU: number,\n orderU: number,\n knotArrayU: number[] | Float64Array | undefined,\n numPolesV: number,\n orderV: number,\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3dH | undefined {\n const numPoles = numPolesU * numPolesV;\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\n return undefined;\n\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\n\n const knotsU = knotArrayU ?\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\n const knotsV = knotArrayV ?\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\n if (undefined === weightArray)\n weightArray = Array(numPoles).fill(1.0); // unit weights\n const coffs = Point4dArray.packPointsAndWeightsToFloat64Array(controlPointArray, weightArray);\n if (coffs === undefined || coffs.length !== 4 * numPolesU * numPolesV)\n return undefined;\n const surface = new BSplineSurface3dH(numPolesU, numPolesV, knotsU, knotsV, coffs);\n return surface;\n }\n\n /**\n * Create a bspline surface with given knots.\n * * This `create` variant takes control points in a \"grid\" array, with the points from\n * each grid row `[rowIndex]` being an independent array `points[rowIndex][indexAlongRow][x,y,z,w]`\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\n * * When knots are given, two count conditions are recognized in each direction:\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\n * extraneous knots of classic clamping.\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\n * the classic unused first and last knot.\n * @param xyzwGrid Array of points, ordered along the U direction.\n * @param weightStyle how the points are weighted\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayU knots for the V direction. See note above about knot counts.\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\n * @param knotArrayV knots for the V direction. See note above about knot counts.\n */\n public static createGrid(\n xyzwGrid: number[][][],\n weightStyle: WeightStyle,\n orderU: number,\n knotArrayU: number[] | Float64Array | undefined,\n orderV: number,\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3dH | undefined {\n const numPolesV = xyzwGrid.length;\n const numPolesU = xyzwGrid[0].length;\n const numPoles = numPolesU * numPolesV;\n if (4 !== xyzwGrid[0][0].length)\n return undefined;\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\n return undefined;\n\n // validate knot counts\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU); // classic over-clamped input knots\n if (!skipFirstAndLastU && numPolesU + orderU !== numKnotsU + 2) // modern knots\n return undefined;\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV); // classic\n if (!skipFirstAndLastV && numPolesV + orderV !== numKnotsV + 2) // modern\n return undefined;\n\n const knotsU = knotArrayU ?\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\n const knotsV = knotArrayV ?\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\n\n const coffs = new Float64Array(4 * numPoles);\n let i = 0;\n switch (weightStyle) {\n case WeightStyle.WeightsSeparateFromCoordinates: {\n for (const row of xyzwGrid) {\n for (const point of row) {\n const w = point[3];\n coffs[i++] = point[0] * w;\n coffs[i++] = point[1] * w;\n coffs[i++] = point[2] * w;\n coffs[i++] = point[3];\n }\n }\n break;\n }\n case WeightStyle.WeightsAlreadyAppliedToCoordinates: {\n for (const row of xyzwGrid) {\n for (const point of row) {\n coffs[i++] = point[0];\n coffs[i++] = point[1];\n coffs[i++] = point[2];\n coffs[i++] = point[3];\n }\n }\n break;\n }\n case WeightStyle.UnWeighted: {\n for (const row of xyzwGrid) {\n for (const point of row) {\n coffs[i++] = point[0];\n coffs[i++] = point[1];\n coffs[i++] = point[2];\n coffs[i++] = 1.0;\n }\n }\n break;\n }\n default:\n return undefined; // unrecognized WeightStyle\n }\n return new BSplineSurface3dH(numPolesU, numPolesV, knotsU, knotsV, coffs);\n }\n\n /** Return a deep clone */\n public clone(): BSplineSurface3dH {\n const knotVector1U = this.knots[0].clone();\n const knotVector1V = this.knots[1].clone();\n const surface1 = new BSplineSurface3dH(this.numPolesUV(0), this.numPolesUV(1), knotVector1U, knotVector1V,\n this.coffs.slice());\n surface1.coffs = this.coffs.slice();\n return surface1;\n }\n /** Return a transformed clone */\n public cloneTransformed(transform: Transform): BSplineSurface3dH {\n const surface1 = this.clone();\n surface1.tryTransformInPlace(transform);\n return surface1;\n }\n /**\n * Return control points json arrays.\n * * Each row of points is an an array.\n * * Within the array for each row, each point is an array [wx,wy,wz,w].\n */\n public getPointGridJSON(): PackedPointGrid {\n const result = {\n points: Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 4, this.numPolesUV(0)),\n numCartesianDimensions: 3,\n weightStyle: WeightStyle.WeightsAlreadyAppliedToCoordinates,\n };\n return result;\n }\n\n /** Evaluate at a position given by a knot value. If deweight fails, returns 000. */\n public knotToPoint4d(u: number, v: number, result?: Point4d): Point4d {\n this.evaluateBuffersAtKnot(u, v);\n result = Point4d.createFromPacked(this._poleBuffer, 0, result);\n return result ? result : Point4d.createZero();\n }\n /** Evaluate at a position given by a knot value. */\n public knotToPointAndDerivatives(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n this.evaluateBuffersAtKnot(u, v, 1);\n return Plane3dByOriginAndVectors.createOriginAndVectorsWeightedArrays(this._poleBuffer, this._poleBuffer1UV[0], this._poleBuffer1UV[1], result);\n }\n\n /** Evaluate the Point4d (leaving weights in the point) at given fractional coordinates. If deweight fails, returns 000. */\n public fractionToPoint4d(fractionU: number, fractionV: number, result?: Point4d): Point4d {\n result = this.knotToPoint4d(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV), result);\n return result ? result : Point4d.createZero();\n }\n /**\n * Evaluate the surface and return the Cartesian point (weight = 1).\n * * If the surface XYZW point has weight 0, returns 000.\n * @param fractionU u direction fraction\n * @param fractionV v direction fraction\n * @param result optional result\n */\n public fractionToPoint(fractionU: number, fractionV: number, result?: Point3d): Point3d {\n const point4d = this.knotToPoint4d(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV));\n return point4d.realPointDefault000(result);\n }\n /**\n * * evaluate the surface and return the cartesian (weight = 1) point.\n * * if the surface XYZW point has weight0, returns point3d at 000.\n * @param knotU u direction knot\n * @param knotV v direction knot\n * @param result optional result\n */\n public knotToPoint(knotU: number, knotV: number, result?: Point3d): Point3d {\n const point4d = this.knotToPoint4d(knotU, knotV);\n return point4d.realPointDefault000(result);\n }\n /**\n * evaluate the surface at u and v fractions.\n * @returns plane with origin at the surface point, direction vectors are derivatives in the u and v directions.\n * @param fractionU u coordinate, as a fraction of the knot range.\n * @param fractionV v coordinate, as a fraction of the knot range.\n * @param result optional pre-allocated object for return values.\n * @returns Returns point and derivative directions.\n */\n public override fractionToPointAndDerivatives(fractionU: number, fractionV: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n const knotU = this.knots[0].fractionToKnot(fractionU);\n const knotV = this.knots[1].fractionToKnot(fractionV);\n return this.knotToPointAndDerivatives(knotU, knotV, result);\n }\n\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\n public uvFractionToPoint(u: number, v: number): Point3d {\n return this.fractionToPoint(u, v);\n }\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\n return this.fractionToPointAndDerivatives(u, v, result);\n }\n\n /** test for identical counts and near-equal coordinates */\n public override isAlmostEqual(other: any): boolean {\n if (other instanceof BSplineSurface3dH) {\n return this.knots[0].isAlmostEqual(other.knots[0])\n && this.knots[1].isAlmostEqual(other.knots[1])\n && Point4dArray.isAlmostEqual(this.coffs, other.coffs);\n }\n return false;\n }\n /** Test if all poles are in a plane */\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\n return Point4dArray.isCloseToPlane(this.coffs, plane);\n }\n /** Second step of double dispatch: call `handler.handleBSplineSurface3dH(this)` */\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\n return handler.handleBSplineSurface3dH(this);\n }\n /**\n * extend a range to include the (optionally transformed) points of this surface\n * @param rangeToExtend range that is updated to include this surface range\n * @param transform transform to apply to the surface points\n */\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\n this.extendRangeXYZH(rangeToExtend, transform);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"BSplineSurface.js","sourceRoot":"","sources":["../../../src/bspline/BSplineSurface.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 { GeometryQuery } from \"../curve/GeometryQuery\";\r\nimport { AxisOrder, Geometry } from \"../Geometry\";\r\nimport { GeometryHandler, UVSurface } from \"../geometry3d/GeometryHandler\";\r\nimport { Matrix3d } from \"../geometry3d/Matrix3d\";\r\nimport { Plane3dByOriginAndUnitNormal } from \"../geometry3d/Plane3dByOriginAndUnitNormal\";\r\nimport { Plane3dByOriginAndVectors } from \"../geometry3d/Plane3dByOriginAndVectors\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray, Point4dArray } from \"../geometry3d/PointHelpers\";\r\nimport { Range3d } from \"../geometry3d/Range\";\r\nimport { Transform } from \"../geometry3d/Transform\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BSplineWrapMode, KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * UVSelect is an integer indicating uDirection (0) or vDirection (1) in a bspline surface parameterization.\r\n * @public\r\n */\r\nexport enum UVSelect {\r\n /** index of u direction */\r\n uDirection = 0,\r\n /**\r\n * index of v direction\r\n * @deprecated in 4.3.0 - will not be removed until after 2026-06-13. Use vDirection instead.\r\n */\r\n VDirection = 1,\r\n /** index of v direction */\r\n vDirection = 1, // eslint-disable-line @typescript-eslint/no-duplicate-enum-values\r\n}\r\n/**\r\n * Enumeration of how weights are carried\r\n * * UnWeighted (0) -- there are no weights\r\n * * WeightsAlreadyAppliedToCoordinates (1) -- for real point (x,y,z) the homogeneous point (wx,wy,wx,w) is stored as (wx,wy,wz,w)\r\n * * WeightsSeparateFromCoordinates (2) -- for real point (x,y,z) the homogeneous point (wx,wy,wx,w) is stored as (x,y,z,w)\r\n * * Note that \"internal\" computations never use WeightsSeparateFromCoordinates.\r\n * * WeightsSeparateFromCoordinates is only useful as input or output state in serializer.\r\n * @public\r\n */\r\nexport enum WeightStyle {\r\n /** There are no weights. */\r\n UnWeighted = 0,\r\n /**\r\n * * Data is weighted.\r\n * * The point with normalized coordinate `[x,y,z]` and weight `w` is stored as `[x*w,y*w,z*w,w]`\r\n * */\r\n WeightsAlreadyAppliedToCoordinates = 1,\r\n /**\r\n * * Data is weighted.\r\n * * The point with normalized coordinate `[x,y,z]` and weight `w` is stored as `[x,y,z,w]`\r\n * */\r\n WeightsSeparateFromCoordinates = 2,\r\n}\r\n/**\r\n * interface for points returned from getPointGrid, with annotation of physical and weighting dimensions.\r\n * @public\r\n */\r\nexport interface PackedPointGrid {\r\n /**\r\n * Array of coordinate data.\r\n * * points[row] is all the data for a grid row.\r\n * * points[row][j] is the jth point across the row\r\n * * points[row][j][k] is numeric value k.\r\n */\r\n points: number[][][];\r\n /**\r\n * Description of how weights are present in the coordinate data.\r\n */\r\n weightStyle?: WeightStyle;\r\n /**\r\n * number of cartesian dimensions, e.g. 2 or 3.\r\n */\r\n numCartesianDimensions: number;\r\n}\r\n/** Interface for methods supported by both regular (xyz) and weighted (xyzw) bspline surfaces.\r\n * @public\r\n */\r\nexport interface BSplineSurface3dQuery {\r\n /** Evaluate xyz coordinates at fractional parameter u,v */\r\n fractionToPoint(uFraction: number, vFraction: number): Point3d;\r\n /** Evaluate a rigid frame at fractional parameter u,v\r\n * * origin is at the surface point\r\n * * x column is a unit vector in the direction of the u derivative\r\n * * y column is a unit vector in the direction of the v derivative\r\n * * z direction is the surface normal\r\n */\r\n fractionToRigidFrame(uFraction: number, vFraction: number, result?: Transform): Transform | undefined;\r\n /** Evaluate xyz coordinates at knot values (uKnot, vKnot) */\r\n knotToPoint(uKnot: number, vKnot: number): Point3d;\r\n /** apply a transform to the surface */\r\n tryTransformInPlace(transform: Transform): boolean;\r\n /** clone the surface */\r\n clone(): BSplineSurface3dQuery;\r\n /** clone and transform */\r\n cloneTransformed(transform: Transform): BSplineSurface3dQuery;\r\n /** Reverse one of the parameterization directions. */\r\n reverseInPlace(select: UVSelect): void;\r\n /** Test if `this` and `other` are the same geometry class. */\r\n isSameGeometryClass(other: any): boolean;\r\n /** Extend `rangeToExtend` so this surface is included. */\r\n extendRange(rangeToExtend: Range3d, transform?: Transform): void;\r\n /** test for nearly equality with `other` */\r\n isAlmostEqual(other: any): boolean;\r\n /** ask if the u or v direction could be converted to periodic form */\r\n isClosable(select: UVSelect): boolean;\r\n /** Ask if the entire surface is within a plane. */\r\n isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean;\r\n /** return the total number of poles (product of u,v counts) */\r\n numPolesTotal(): number;\r\n /**\r\n * turn a numeric variable into a UVSelect (strict 0 or 1).\r\n */\r\n numberToUVSelect(value: number): UVSelect;\r\n /**\r\n * Return the degree in in selected direction (0 for u, 1 for v)\r\n * @param select 0 for u, 1 for v\r\n */\r\n degreeUV(select: UVSelect): number;\r\n /**\r\n * Return the order in in selected direction (0 for u, 1 for v)\r\n * @param select 0 for u, 1 for v\r\n */\r\n orderUV(select: UVSelect): number;\r\n /**\r\n * Return the number of bezier spans in selected direction (0 for u, 1 for v)\r\n * @param select 0 for u, 1 for v\r\n */\r\n numSpanUV(select: UVSelect): number;\r\n\r\n /**\r\n * Return the number of poles in selected direction (0 for u, 1 for v)\r\n * @param select 0 for u, 1 for v\r\n */\r\n numPolesUV(select: UVSelect): number;\r\n\r\n /**\r\n * Return the step between adjacent poles in selected direction (0 for u, 1 for v)\r\n * @param select 0 for u, 1 for v\r\n */\r\n poleStepUV(select: UVSelect): number;\r\n\r\n /**\r\n * Return control points json arrays.\r\n * * Each row of points is an an array.\r\n * * Within the array for each row, each point is an array [x,y,z] or [x,y,z,w].\r\n * * The PackedPointGrid indicates if weights are present.\r\n */\r\n getPointGridJSON(): PackedPointGrid;\r\n}\r\n/** Bspline knots and poles for 2d-to-Nd.\r\n * * This abstract class in not independently instantiable -- GeometryQuery methods must be implemented by derived classes.\r\n * @public\r\n */\r\nexport abstract class BSpline2dNd extends GeometryQuery {\r\n /** String name for schema properties */\r\n public readonly geometryCategory = \"bsurf\";\r\n /** Array of (exactly 2) knot vectors for the u, v directions */\r\n public knots: KnotVector[];\r\n /** flat array of coordinate data, blocked by poleDimension and row */\r\n public coffs: Float64Array;\r\n /**\r\n * Number of components per pole.\r\n * * 3 for conventional xyz surface\r\n * * 4 for weighted (wx, wy, wz, w) surface.\r\n */\r\n public poleDimension: number;\r\n private _numPoles: number[];\r\n /** Return the degree (one less than order) for the `select` direction (0 or 1) */\r\n public degreeUV(select: UVSelect): number { return this.knots[select].degree; }\r\n /** Return the order (one more than degree) for the `select` direction (0 or 1) */\r\n public orderUV(select: UVSelect): number { return this.knots[select].degree + 1; }\r\n /** Return the number of spans (INCLUDING NULL SPANS) for the `select` direction (0 or 1) */\r\n public numSpanUV(select: UVSelect): number { return this._numPoles[select] - this.knots[select].degree; }\r\n /** Return the total number of poles (product of x and y pole counts) */\r\n public numPolesTotal(): number { return this.coffs.length / this.poleDimension; }\r\n /** Return the number of poles for the `select` direction (0 or 1) */\r\n public numPolesUV(select: UVSelect): number { return this._numPoles[select]; }\r\n /** Return the step between adjacent poles for the `select` direction (0 or 1) */\r\n public poleStepUV(select: UVSelect): number { return select === 0 ? 1 : this._numPoles[0]; }\r\n /** Confirm that order and pole counts agree for both u and v directions */\r\n public static validOrderAndPoleCounts(orderU: number, numPolesU: number, orderV: number, numPolesV: number, numUV: number): boolean {\r\n if (orderU < 2 || numPolesU < orderU)\r\n return false;\r\n if (orderV < 2 || numPolesV < orderV)\r\n return false;\r\n if (numPolesU * numPolesV !== numUV)\r\n return false;\r\n return true;\r\n }\r\n /** Get the indexed Point3d.\r\n * * (IMPORTANT) This assumes this is an xyz surface. Data will be incorrect if this is an xyzw surface.\r\n * @param i index in [0, numPolesU)\r\n * @param j index in [0, numPolesV)\r\n */\r\n public getPoint3dPole(i: number, j: number, result?: Point3d): Point3d | undefined {\r\n return Point3d.createFromPacked(this.coffs, i + j * this._numPoles[0], result);\r\n }\r\n /** Get the indexed Point3d, projecting the weight away to get to xyz.\r\n * * (IMPORTANT) This assumes this is an xyzw surface. Data will be incorrect if this is an xyz surface.\r\n * @param i index in [0, numPolesU)\r\n * @param j index in [0, numPolesV)\r\n */\r\n public getPoint3dPoleXYZW(i: number, j: number, result?: Point3d): Point3d | undefined {\r\n return Point3d.createFromPackedXYZW(this.coffs, i + j * this._numPoles[0], result);\r\n }\r\n /** Get the indexed Point4d.\r\n * * (IMPORTANT) This assumes this is an xyzw surface. Data will be incorrect if this is an xyz surface.\r\n * @param i index in [0, numPolesU)\r\n * @param j index in [0, numPolesV)\r\n */\r\n public getPoint4dPole(i: number, j: number, result?: Point4d): Point4d | undefined {\r\n return Point4d.createFromPacked(this.coffs, (i + j * this._numPoles[0]) * 4, result);\r\n }\r\n /**\r\n * Return 0 for 0 input, 1 for any nonzero input.\r\n * @param value numeric value to convert to strict 0 or 1.\r\n */\r\n public numberToUVSelect(value: number): UVSelect { return value === 0 ? 0 : 1; }\r\n /** extend a range, treating each block as simple XYZ */\r\n public extendRangeXYZ(rangeToExtend: Range3d, transform?: Transform) {\r\n const buffer = this.coffs;\r\n const pd = this.poleDimension;\r\n const n = buffer.length + 1 - pd;\r\n if (transform) {\r\n for (let i0 = 0; i0 < n; i0 += pd)\r\n rangeToExtend.extendTransformedXYZ(transform, buffer[i0], buffer[i0 + 1], buffer[i0 + 2]);\r\n } else {\r\n for (let i0 = 0; i0 < n; i0 += pd)\r\n rangeToExtend.extendXYZ(buffer[i0], buffer[i0 + 1], buffer[i0 + 2]);\r\n }\r\n }\r\n\r\n /** extend a range, treating each block as homogeneous xyzw, with weight at offset 3 */\r\n public extendRangeXYZH(rangeToExtend: Range3d, transform?: Transform) {\r\n const buffer = this.coffs;\r\n const pd = this.poleDimension;\r\n const n = buffer.length + 1 - pd;\r\n let w = 0;\r\n let divW = 0;\r\n if (transform) {\r\n for (let i0 = 0; i0 < n; i0 += pd) {\r\n w = buffer[i0 + 3];\r\n if (w !== 0.0) {\r\n divW = 1.0 / w;\r\n rangeToExtend.extendTransformedXYZ(transform,\r\n buffer[i0] * divW,\r\n buffer[i0 + 1] * divW,\r\n buffer[i0 + 2] * divW);\r\n }\r\n }\r\n } else {\r\n for (let i0 = 0; i0 < n; i0 += pd) {\r\n w = buffer[i0 + 3];\r\n if (w !== 0.0) {\r\n divW = 1.0 / w;\r\n rangeToExtend.extendXYZ(\r\n buffer[i0] * divW,\r\n buffer[i0 + 1] * divW,\r\n buffer[i0 + 2] * divW);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * abstract declaration for evaluation of (unweighted) 3d point and derivatives.\r\n * Derived classes must implement to get fractionToRigidFrame support.\r\n * @param _fractionU u parameter\r\n * @param _fractionV v parameter\r\n * @param _result optional result.\r\n */\r\n public abstract fractionToPointAndDerivatives(_fractionU: number, _fractionV: number, _result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors | undefined;\r\n /**\r\n * evaluate the surface at u and v fractions. Return a (squared, right handed) coordinate frame at that point on the surface.\r\n * @param fractionU u parameter\r\n * @param fractionV v parameter\r\n * @param result undefined if surface derivatives are parallel (or either alone is zero)\r\n */\r\n public fractionToRigidFrame(fractionU: number, fractionV: number, result?: Transform): Transform | undefined {\r\n const skewVectors = this.fractionToPointAndDerivatives(fractionU, fractionV);\r\n if (!skewVectors)\r\n return undefined;\r\n const axes = Matrix3d.createColumnsInAxisOrder(AxisOrder.XYZ,\r\n skewVectors.vectorU, skewVectors.vectorV, undefined);\r\n const axes1 = Matrix3d.createRigidFromMatrix3d(axes, AxisOrder.XYZ, axes);\r\n if (axes1)\r\n result = Transform.createOriginAndMatrix(skewVectors.origin, axes1, result);\r\n return result;\r\n }\r\n /** a scratch array sized for `order` numbers */\r\n protected _basisBufferUV: Float64Array[]; // basis function buffers for u, v directions. ALLOCATED BY CTOR FOR FREQUENT REUSE\r\n /** a scratch array sized for `order` numbers */\r\n protected _basisBuffer1UV: Float64Array[]; // basis function buffers for u, v directions. ALLOCATED BY CTOR FOR FREQUENT REUSE\r\n\r\n /** a scratch array sized for one pole */\r\n protected _poleBuffer: Float64Array; // one set of target values. ALLOCATED BY CTOR FOR FREQUENT REUSE\r\n /** array of 2 scratch array, each sized for one pole\r\n * * used in derivative evaluations, with respective u and v derivatives in the respective arrays.\r\n */\r\n protected _poleBuffer1UV: Float64Array[]; // one set of target values. ALLOCATED BY CTOR FOR FREQUENT REUSE\r\n\r\n /**\r\n * initialize arrays for given spline dimensions.\r\n * coffs length must be poleLength * numPolesU * numPolesV !!!!\r\n */\r\n protected constructor(numPolesU: number, numPolesV: number, poleLength: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\r\n super();\r\n const orderU = knotsU.degree + 1;\r\n const orderV = knotsV.degree + 1;\r\n this.knots = [knotsU, knotsV];\r\n this.coffs = coffs;\r\n this.poleDimension = poleLength;\r\n this._basisBufferUV = [new Float64Array(orderU), new Float64Array(orderV)];\r\n this._basisBuffer1UV = [new Float64Array(orderU), new Float64Array(orderV)];\r\n this._numPoles = [numPolesU, numPolesV];\r\n this._poleBuffer = new Float64Array(poleLength);\r\n this._poleBuffer1UV = [new Float64Array(poleLength), new Float64Array(poleLength)];\r\n\r\n }\r\n /**\r\n * Map a position, specified as (uv direction, bezier span, fraction within the bezier), to an overall knot value.\r\n * @param select selector indicating U or V direction.\r\n * @param span index of bezier span\r\n * @param localFraction fractional coordinate within the bezier span\r\n */\r\n public spanFractionToKnot(select: UVSelect, span: number, localFraction: number): number {\r\n return this.knots[select].spanFractionToKnot(span, localFraction);\r\n }\r\n\r\n /** Evaluate basis functions given\r\n * * choice of u or v\r\n * * span index\r\n * * local fraction within the span.\r\n * @returns true if and only if output arrays are sufficiently sized\r\n */\r\n public spanFractionsToBasisFunctions(select: UVSelect, spanIndex: number, spanFraction: number, f: Float64Array, df?: Float64Array): boolean {\r\n spanIndex = Geometry.clampToStartEnd(spanIndex, 0, this.numSpanUV(select));\r\n const knotIndex0 = spanIndex + this.degreeUV(select) - 1;\r\n const globalKnot = this.knots[select].baseKnotFractionToKnot(knotIndex0, spanFraction);\r\n return df ?\r\n this.knots[select].evaluateBasisFunctions1(knotIndex0, globalKnot, f, df) :\r\n this.knots[select].evaluateBasisFunctions(knotIndex0, globalKnot, f);\r\n }\r\n /** sum poles by the weights in the basisBuffer, using poles for given span */\r\n public sumPoleBufferForSpan(spanIndexU: number, spanIndexV: number) {\r\n const poleBuffer = this._poleBuffer;\r\n const coffs = this.coffs;\r\n poleBuffer.fill(0);\r\n const m = this.poleDimension;\r\n const stepV = this.poleDimension * this._numPoles[0];\r\n let kU = m * spanIndexU + spanIndexV * stepV;\r\n let g = 0;\r\n for (const fV of this._basisBufferUV[1]) {\r\n let k = kU;\r\n for (const fU of this._basisBufferUV[0]) {\r\n g = fU * fV;\r\n for (let j = 0; j < m; j++) {\r\n poleBuffer[j] += g * coffs[k++];\r\n }\r\n }\r\n kU += stepV;\r\n }\r\n }\r\n /**\r\n * sum poles by the weights in the basisBuffer, using poles for given span\r\n * @deprecated in 4.3.0 - will not be removed until after 2026-06-13. Use sumPoleBufferDerivativesForSpan instead.\r\n */\r\n public sumpoleBufferDerivativesForSpan(spanIndexU: number, spanIndexV: number) {\r\n return this.sumPoleBufferDerivativesForSpan(spanIndexU, spanIndexV);\r\n }\r\n /** sum derivatives by the weights in the basisBuffer, using poles for given span */\r\n public sumPoleBufferDerivativesForSpan(spanIndexU: number, spanIndexV: number) {\r\n const poleBuffer1U = this._poleBuffer1UV[0];\r\n const poleBuffer1V = this._poleBuffer1UV[1];\r\n poleBuffer1U.fill(0);\r\n poleBuffer1V.fill(0);\r\n const m = this.poleDimension;\r\n const stepV = this.poleDimension * this._numPoles[0];\r\n let kU = m * spanIndexU + spanIndexV * stepV;\r\n // U partial derivatives ...\r\n let g = 0;\r\n for (const fV of this._basisBufferUV[1]) {\r\n let k = kU;\r\n for (const fU of this._basisBuffer1UV[0]) {\r\n g = fU * fV;\r\n for (let j = 0; j < m; j++) {\r\n poleBuffer1U[j] += g * this.coffs[k++];\r\n }\r\n }\r\n kU += stepV;\r\n }\r\n\r\n // V partial derivatives ...\r\n kU = m * spanIndexU + spanIndexV * stepV;\r\n for (const fV of this._basisBuffer1UV[1]) {\r\n let k = kU;\r\n for (const fU of this._basisBufferUV[0]) {\r\n g = fU * fV;\r\n for (let j = 0; j < m; j++) {\r\n poleBuffer1V[j] += g * this.coffs[k++];\r\n }\r\n }\r\n kU += stepV;\r\n }\r\n }\r\n /**\r\n * Evaluate the _basisBuffer, _poleBuffer and (optionally) _basisBuffer1 and _poleBuffer1 arrays at given knot.\r\n *\r\n * @param u u knot value\r\n * @param v v not value\r\n * @param numDerivative number of derivatives needed\r\n */\r\n public evaluateBuffersAtKnot(u: number, v: number, numDerivative: number = 0) {\r\n const knotIndex0U = this.knots[0].knotToLeftKnotIndex(u);\r\n const knotIndex0V = this.knots[1].knotToLeftKnotIndex(v);\r\n const poleIndex0U = knotIndex0U - this.degreeUV(0) + 1;\r\n const poleIndex0V = knotIndex0V - this.degreeUV(1) + 1;\r\n\r\n if (numDerivative < 1) {\r\n this.knots[0].evaluateBasisFunctions(knotIndex0U, u, this._basisBufferUV[0]);\r\n this.knots[1].evaluateBasisFunctions(knotIndex0V, v, this._basisBufferUV[1]);\r\n this.sumPoleBufferForSpan(poleIndex0U, poleIndex0V);\r\n } else {\r\n this.knots[0].evaluateBasisFunctions1(knotIndex0U, u, this._basisBufferUV[0], this._basisBuffer1UV[0]);\r\n this.knots[1].evaluateBasisFunctions1(knotIndex0V, v, this._basisBufferUV[1], this._basisBuffer1UV[1]);\r\n this.sumPoleBufferForSpan(poleIndex0U, poleIndex0V);\r\n this.sumPoleBufferDerivativesForSpan(poleIndex0U, poleIndex0V);\r\n }\r\n }\r\n // Swap numSwap entries in coffs, starting at i0 and i1 (absolute indices -- not blocks)\r\n private swapBlocks(i0: number, i1: number, numSwap: number) {\r\n let a: number;\r\n for (let i = 0; i < numSwap; i++) {\r\n a = this.coffs[i0 + i];\r\n this.coffs[i0 + i] = this.coffs[i1 + i];\r\n this.coffs[i1 + i] = a;\r\n }\r\n }\r\n /**\r\n * Reverse the parameter direction for either u or v.\r\n * @param select direction to reverse -- 0 for u, 1 for v.\r\n */\r\n public reverseInPlace(select: UVSelect): void {\r\n const m = this.poleDimension;\r\n const numU = this.numPolesUV(0);\r\n const numV = this.numPolesUV(1);\r\n if (select === 0) {\r\n // reverse within rows.\r\n for (let j = 0; j < numV; j++) {\r\n const rowStart = j * numU * m;\r\n for (let i0 = 0, i1 = numU - 1; i0 < i1; i0++, i1--) {\r\n this.swapBlocks(rowStart + i0 * m, rowStart + i1 * m, m);\r\n }\r\n }\r\n } else {\r\n // swap full rows ..\r\n const numPerRow = m * numU;\r\n for (let i0 = 0, i1 = (numV - 1) * numPerRow;\r\n i0 < i1;\r\n i0 += numPerRow, i1 -= numPerRow) {\r\n this.swapBlocks(i0, i1, numPerRow);\r\n }\r\n }\r\n this.knots[select].reflectKnots();\r\n }\r\n /**\r\n * Get the flag indicating the surface might be suitable for having wrapped \"closed\" interpretation.\r\n */\r\n public getWrappable(select: UVSelect): BSplineWrapMode {\r\n return this.knots[select].wrappable;\r\n }\r\n /**\r\n * Set the flag indicating the surface might be suitable for having wrapped \"closed\" interpretation.\r\n */\r\n public setWrappable(select: UVSelect, value: BSplineWrapMode) {\r\n this.knots[select].wrappable = value;\r\n }\r\n /**\r\n * Test if leading and trailing blocks of points match in a given direction.\r\n * @param data packed array of points in row-major order (numRows x numColumns x dimension numbers)\r\n * @param numRows number of rows of points in the array\r\n * @param numColumns number of columns of points in the array (equal to the number of points in each row)\r\n * @param dimension point dimension (e.g., 2,3,4)\r\n * @param blockLength number of leading/trailing points to check\r\n * @param select 0 to test first/last columns of points; 1 to test first/last rows of points\r\n * @returns true if coordinates matched\r\n */\r\n public static isWrappedGrid(data: Float64Array, numRows: number, numColumns: number, dimension: number, blockLength: number, select: UVSelect): boolean {\r\n const rowToRowStep = numColumns * dimension;\r\n if (UVSelect.uDirection === select) {\r\n // Test the contiguous block at the start/end of each row\r\n const numTest = dimension * blockLength;\r\n for (let row = 0; row < numRows; row++) {\r\n const i0 = row * rowToRowStep;\r\n const i1 = i0 + rowToRowStep - numTest;\r\n for (let i = 0; i < numTest; i++) {\r\n if (!Geometry.isSameCoordinate(data[i0 + i], data[i1 + i]))\r\n return false;\r\n }\r\n }\r\n } else {\r\n // Test the entire multi-row contiguous block at the start/end of the array\r\n const numTest = blockLength * rowToRowStep;\r\n const i1 = numRows * numColumns * dimension - numTest;\r\n for (let i = 0; i < numTest; i++) {\r\n if (!Geometry.isSameCoordinate(data[i], data[i1 + i]))\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Test if `degree` leading and trailing (one of U or V) blocks match, as if the data is a non-periodic physically closed spline in the selected direction.\r\n * @param select select U or V direction\r\n * @returns true if coordinates matched.\r\n */\r\n public testClosableGrid(select: UVSelect, mode?: BSplineWrapMode): boolean {\r\n if (mode === undefined)\r\n mode = this.knots[select].wrappable;\r\n if (mode === BSplineWrapMode.OpenByAddingControlPoints) // the last degree poles equal the first degree poles\r\n return BSpline2dNd.isWrappedGrid(this.coffs, this.numPolesUV(UVSelect.vDirection), this.numPolesUV(UVSelect.uDirection), this.poleDimension, this.degreeUV(select), select);\r\n if (mode === BSplineWrapMode.OpenByRemovingKnots) // the last pole equals the first pole\r\n return BSpline2dNd.isWrappedGrid(this.coffs, this.numPolesUV(UVSelect.vDirection), this.numPolesUV(UVSelect.uDirection), this.poleDimension, 1, select);\r\n return false;\r\n }\r\n /**\r\n * Test knots and control points to determine if it is possible to close (aka \"wrap\") the surface in the selected parametric direction.\r\n * @param select select U or V direction\r\n * @return whether the surface can be wrapped in the given parametric direction.\r\n */\r\n public isClosable(select: UVSelect): boolean {\r\n return BSplineWrapMode.None !== this.isClosableSurface(select);\r\n }\r\n /**\r\n * Test knots and control points to determine if it is possible to close (aka \"wrap\") the surface in the selected parametric direction.\r\n * @param select select U or V direction\r\n * @return the manner of closing. See `BSplineWrapMode` for particulars of each mode.\r\n */\r\n public isClosableSurface(select: UVSelect): BSplineWrapMode {\r\n const mode = this.knots[select].wrappable;\r\n if (mode === BSplineWrapMode.None)\r\n return BSplineWrapMode.None;\r\n if (!this.knots[select].testClosable(mode))\r\n return BSplineWrapMode.None;\r\n if (!this.testClosableGrid(select, mode))\r\n return BSplineWrapMode.None;\r\n return mode;\r\n }\r\n}\r\n\r\n/** BSplineSurface3d is a parametric surface in xyz space.\r\n * * This (BSplineSurface3d) is an unweighted surface. Use the separate class BSplineSurface3dH for a weighted surface.\r\n *\r\n * The various static \"create\" methods have subtle differences in how grid sizes are conveyed:\r\n * | Method | control point array | counts |\r\n * | create | flat array of [x,y,z] | arguments numPolesU, numPolesV |\r\n * | createGrid | array of array of [x,y,z ] | There are no `numPolesU` or `numPolesV` args. The counts are conveyed by the deep arrays |\r\n * @public\r\n */\r\nexport class BSplineSurface3d extends BSpline2dNd implements BSplineSurface3dQuery, UVSurface {\r\n /** Test if `other` is an instance of `BSplineSurface3d */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineSurface3d; }\r\n /** Apply the transform to the poles */\r\n public tryTransformInPlace(transform: Transform): boolean { Point3dArray.multiplyInPlace(transform, this.coffs); return true; }\r\n /** Return a pole by u and v indices */\r\n public getPole(i: number, j: number, result?: Point3d): Point3d | undefined {\r\n return this.getPoint3dPole(i, j, result);\r\n }\r\n\r\n private constructor(numPolesU: number, numPolesV: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\r\n super(numPolesU, numPolesV, 3, knotsU, knotsV, coffs);\r\n }\r\n /**\r\n * Return control points json arrays.\r\n * * if `flatArray===true`, each point appears as an array [x,y,z] in row-major order of a containing array.\r\n * * if `flatArray===false` each row of points is an an array of [x,y,z] in an array. Each of these row arrays is in the result array.\r\n */\r\n public getPointArray(flatArray: boolean = true): any[] {\r\n if (flatArray)\r\n return Point3dArray.unpackNumbersToNestedArrays(this.coffs, 3);\r\n return Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 3, this.numPolesUV(0));\r\n }\r\n /**\r\n * Return control points json arrays.\r\n * * Each row of points is an an array.\r\n * * Within the array for each row, each point is an array [x,y,z]\r\n */\r\n public getPointGridJSON(): PackedPointGrid {\r\n const result = {\r\n points: Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 3, this.numPolesUV(0)),\r\n weightStyle: WeightStyle.UnWeighted,\r\n numCartesianDimensions: 3,\r\n };\r\n return result;\r\n }\r\n\r\n /** Return a simple array of the control points coordinates */\r\n public copyPointsFloat64Array(): Float64Array { return this.coffs.slice(); }\r\n /**\r\n * return a simple array form of the knots. optionally replicate the first and last\r\n * in classic over-clamped manner\r\n */\r\n public copyKnots(select: UVSelect, includeExtraEndKnot: boolean): number[] { return this.knots[select].copyKnots(includeExtraEndKnot); }\r\n\r\n /**\r\n * Create a bspline surface.\r\n * * This `create` variant takes control points in a \"flattened\" array, with\r\n * points from succeeding U rows packed together in one array. Use `createGrid` if the points are in\r\n * a row-by-row grid structure\r\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\r\n * * When knots are given, two knot count conditions are recognized:\r\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\r\n * extraneous knots of classic clamping.\r\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\r\n * the classic unused first and last knot.\r\n * @param controlPointArray Array of points, ordered along the U direction.\r\n * @param numPoleU number of poles in each row\r\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayU knots for the V direction. See note above about knot counts.\r\n * @param numPoleV number of rows of poles\r\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayV knots for the V direction. See note above about knot counts.\r\n */\r\n public static create(controlPointArray: Point3d[] | Float64Array,\r\n numPolesU: number,\r\n orderU: number,\r\n knotArrayU: number[] | Float64Array | undefined,\r\n numPolesV: number,\r\n orderV: number,\r\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3d | undefined {\r\n let numPoles = controlPointArray.length;\r\n if (controlPointArray instanceof Float64Array)\r\n numPoles /= 3;\r\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\r\n return undefined;\r\n // shift knots-of-interest limits for over-clamped case ...\r\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\r\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\r\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\r\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\r\n\r\n const knotsU = knotArrayU ?\r\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\r\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\r\n const knotsV = knotArrayV ?\r\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\r\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\r\n const coffs = new Float64Array(3 * numPolesU * numPolesV);\r\n if (controlPointArray instanceof Float64Array) {\r\n let i = 0;\r\n for (const coordinate of controlPointArray) { coffs[i++] = coordinate; }\r\n } else {\r\n let i = 0;\r\n for (const p of controlPointArray) {\r\n coffs[i++] = p.x;\r\n coffs[i++] = p.y;\r\n coffs[i++] = p.z;\r\n }\r\n }\r\n const surface = new BSplineSurface3d(numPolesU, numPolesV, knotsU, knotsV, coffs);\r\n return surface;\r\n }\r\n\r\n /**\r\n * Create a bspline surface.\r\n * * This `create` variant takes control points in a \"grid\" array, with the points from\r\n * each grid row `[rowIndex]` being an independent array `points[rowIndex][indexAlongRow][x,y,z]`\r\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\r\n * * When knots are given, two knot count conditions are recognized in each direction:\r\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\r\n * extraneous knots of classic clamping.\r\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\r\n * the classic unused first and last knot.\r\n * @param points Array of points, ordered along the U direction.\r\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayU knots for the V direction. See note above about knot counts.\r\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayV knots for the V direction. See note above about knot counts.\r\n */\r\n public static createGrid(points: number[][][],\r\n orderU: number,\r\n knotArrayU: number[] | Float64Array | undefined,\r\n orderV: number,\r\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3d | undefined {\r\n const numPolesV = points.length;\r\n const numPolesU = points[0].length;\r\n const numPoles = numPolesU * numPolesV;\r\n if (3 !== points[0][0].length)\r\n return undefined;\r\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\r\n return undefined;\r\n\r\n // shift knots-of-interest limits for overclamped case ...\r\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\r\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\r\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\r\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\r\n\r\n const knotsU = knotArrayU ?\r\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\r\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\r\n const knotsV = knotArrayV ?\r\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\r\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\r\n\r\n const coffs = new Float64Array(3 * numPolesU * numPolesV);\r\n let i = 0;\r\n for (const row of points) {\r\n for (const xyz of row) {\r\n coffs[i++] = xyz[0];\r\n coffs[i++] = xyz[1];\r\n coffs[i++] = xyz[2];\r\n }\r\n }\r\n return new BSplineSurface3d(numPolesU, numPolesV, knotsU, knotsV, coffs);\r\n }\r\n\r\n /**\r\n * Return a complete copy of the bspline surface.\r\n */\r\n public clone(): BSplineSurface3d {\r\n const knotVector1U = this.knots[0].clone();\r\n const knotVector1V = this.knots[1].clone();\r\n const surface1 = new BSplineSurface3d(this.numPolesUV(0), this.numPolesUV(1), knotVector1U, knotVector1V, this.coffs.slice());\r\n return surface1;\r\n }\r\n /**\r\n * Return a complete copy of the bspline surface, with a transform applied to the control points.\r\n * @param transform transform to apply to the control points\r\n */\r\n public cloneTransformed(transform: Transform): BSplineSurface3d {\r\n const surface1 = this.clone();\r\n surface1.tryTransformInPlace(transform);\r\n return surface1;\r\n }\r\n\r\n /** Evaluate at a position given by u and v coordinates in knot space.\r\n * @param u u value, in knot range.\r\n * @param v v value in knot range.\r\n * @returns Return the xyz coordinates on the surface.\r\n */\r\n public knotToPoint(u: number, v: number): Point3d {\r\n this.evaluateBuffersAtKnot(u, v);\r\n return Point3d.createFrom(this._poleBuffer);\r\n }\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPointAndDerivatives(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n this.evaluateBuffersAtKnot(u, v, 1);\r\n return Plane3dByOriginAndVectors.createOriginAndVectorsArrays(\r\n this._poleBuffer, this._poleBuffer1UV[0], this._poleBuffer1UV[1], result);\r\n }\r\n /** Evaluate at a position given by fractional coordinate in each direction.\r\n * @param fractionU u coordinate, as a fraction of the knot range.\r\n * @param fractionV v coordinate, as a fraction of the knot range.\r\n * @returns Return the xyz coordinates on the surface.\r\n */\r\n public fractionToPoint(fractionU: number, fractionV: number): Point3d {\r\n return this.knotToPoint(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV));\r\n }\r\n\r\n /**\r\n * evaluate the surface at u and v fractions.\r\n * @returns plane with origin at the surface point, direction vectors are derivatives in the u and v directions.\r\n * @param fractionU u coordinate, as a fraction of the knot range.\r\n * @param fractionV v coordinate, as a fraction of the knot range.\r\n * @param result optional pre-allocated object for return values.\r\n * @returns Returns point and derivative directions.\r\n */\r\n public override fractionToPointAndDerivatives(fractionU: number, fractionV: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const knotU = this.knots[0].fractionToKnot(fractionU);\r\n const knotV = this.knots[1].fractionToKnot(fractionV);\r\n return this.knotToPointAndDerivatives(knotU, knotV, result);\r\n }\r\n\r\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\r\n public uvFractionToPoint(u: number, v: number): Point3d {\r\n return this.fractionToPoint(u, v);\r\n }\r\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\r\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n return this.fractionToPointAndDerivatives(u, v, result);\r\n }\r\n\r\n /** test for identical counts and near-equal coordinates */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BSplineSurface3d) {\r\n return this.knots[0].isAlmostEqual(other.knots[0])\r\n && this.knots[1].isAlmostEqual(other.knots[1])\r\n && Point3dArray.isAlmostEqual(this.coffs, other.coffs);\r\n }\r\n return false;\r\n }\r\n /** Test if all poles are in a plane */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return Point3dArray.isCloseToPlane(this.coffs, plane);\r\n }\r\n /** Second step of double dispatch: call `handler.handleBSplineSurface3d(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBSplineSurface3d(this);\r\n }\r\n /** Extend the range to include all poles\r\n * * This is not a tight range.\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n this.extendRangeXYZ(rangeToExtend, transform);\r\n }\r\n\r\n}\r\n\r\n/** BSpline Surface in xyzw homogeneous space\r\n * @public\r\n */\r\nexport class BSplineSurface3dH extends BSpline2dNd implements BSplineSurface3dQuery, UVSurface {\r\n /** Test if `other` is an instance of `BSplineSurface3dH */\r\n public isSameGeometryClass(other: any): boolean { return other instanceof BSplineSurface3dH; }\r\n /** Apply the transform to the poles */\r\n public tryTransformInPlace(transform: Transform): boolean {\r\n Point4dArray.multiplyInPlace(transform, this.coffs); return true;\r\n }\r\n /** Return a pole by u and v indices */\r\n public getPole(i: number, j: number, result?: Point3d): Point3d | undefined {\r\n return this.getPoint3dPoleXYZW(i, j, result);\r\n }\r\n\r\n private constructor(numPolesU: number, numPolesV: number, knotsU: KnotVector, knotsV: KnotVector, coffs: Float64Array) {\r\n super(numPolesU, numPolesV, 4, knotsU, knotsV, coffs);\r\n }\r\n /** Unpack the control points to a Point4d array of form [wx,wy,wz,w]. */\r\n public copyPoints4d(): Point4d[] { return Point4dArray.unpackToPoint4dArray(this.coffs); }\r\n\r\n /**\r\n * Unpack the control points to a Point3d array and an array of weights.\r\n * @param points output xyz, weighted by default formatter\r\n * @param weights output weights\r\n * @param formatter optional xyz formatter. By default, returns a Point3d of form [wx,wy,wz].\r\n */\r\n public copyPointsAndWeights(points: Point3d[], weights: number[],\r\n formatter: (x: number, y: number, z: number) => any = (x, y, z) => Point3d.create(x, y, z)) {\r\n Point4dArray.unpackFloat64ArrayToPointsAndWeights(this.coffs, points, weights, formatter);\r\n }\r\n /**\r\n * Copy the control points to a packed 3D array.\r\n * @param unweight if true, output array has form x,y,z; if false, output array has form wx,wy,wz.\r\n */\r\n public copyXYZToFloat64Array(unweight: boolean): Float64Array {\r\n const numPoints = Math.floor(this.coffs.length / 4);\r\n const result = new Float64Array(numPoints * 3);\r\n let j = 0;\r\n for (let i = 0; i < numPoints; i++) {\r\n const ix = i * 4;\r\n if (unweight) {\r\n const dw = 1.0 / this.coffs[ix + 3];\r\n result[j++] = this.coffs[ix] * dw;\r\n result[j++] = this.coffs[ix + 1] * dw;\r\n result[j++] = this.coffs[ix + 2] * dw;\r\n } else {\r\n result[j++] = this.coffs[ix];\r\n result[j++] = this.coffs[ix + 1];\r\n result[j++] = this.coffs[ix + 2];\r\n\r\n }\r\n }\r\n return result;\r\n }\r\n /** unpack from xyzw xyzw ... to packed weights\r\n */\r\n public copyWeightsToFloat64Array(): Float64Array {\r\n const numPoints = Math.floor(this.coffs.length / 4);\r\n const result = new Float64Array(numPoints);\r\n let i = 0;\r\n let j = 0;\r\n for (; i < numPoints; i++) {\r\n result[j++] = this.coffs[4 * i + 3];\r\n }\r\n return result;\r\n }\r\n /**\r\n * return a simple array form of the knots. optionally replicate the first and last\r\n * in classic over-clamped manner\r\n */\r\n public copyKnots(select: UVSelect, includeExtraEndKnot: boolean): number[] { return this.knots[select].copyKnots(includeExtraEndKnot); }\r\n\r\n /**\r\n * Create a weighted bspline surface, with control points and weights each organized as flattened arrays continuing from one U row to the next.\r\n * * Use `createGrid` if the control points are in a deeper grid array structure.\r\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\r\n * * When knots are given, two knot count conditions are recognized:\r\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\r\n * extraneous knots of classic clamping.\r\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\r\n * the classic unused first and last knot.\r\n * @param controlPointArray Array of [wx,wy,wz] points, ordered along the U direction.\r\n * @param weightArray array of weights, ordered along the U direction. If undefined, unit weights are installed.\r\n * @param numPolesU number of poles in each row in the U direction.\r\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayU optional knots for the V direction. See note above about knot counts.\r\n * @param numPolesV number of poles in each column in the V direction (the number of rows).\r\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayV optional knots for the V direction. See note above about knot counts.\r\n */\r\n public static create(\r\n controlPointArray: Point3d[] | Float64Array,\r\n weightArray: number[] | Float64Array | undefined,\r\n numPolesU: number,\r\n orderU: number,\r\n knotArrayU: number[] | Float64Array | undefined,\r\n numPolesV: number,\r\n orderV: number,\r\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3dH | undefined {\r\n const numPoles = numPolesU * numPolesV;\r\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\r\n return undefined;\r\n\r\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\r\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\r\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU);\r\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV);\r\n\r\n const knotsU = knotArrayU ?\r\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\r\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\r\n const knotsV = knotArrayV ?\r\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\r\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\r\n if (undefined === weightArray)\r\n weightArray = Array(numPoles).fill(1.0); // unit weights\r\n const coffs = Point4dArray.packPointsAndWeightsToFloat64Array(controlPointArray, weightArray);\r\n if (coffs === undefined || coffs.length !== 4 * numPolesU * numPolesV)\r\n return undefined;\r\n const surface = new BSplineSurface3dH(numPolesU, numPolesV, knotsU, knotsV, coffs);\r\n return surface;\r\n }\r\n\r\n /**\r\n * Create a bspline surface with given knots.\r\n * * This `create` variant takes control points in a \"grid\" array, with the points from\r\n * each grid row `[rowIndex]` being an independent array `points[rowIndex][indexAlongRow][x,y,z,w]`\r\n * * knotArrayU and knotArrayV are optional -- uniform knots are implied if they are omitted (undefined).\r\n * * When knots are given, two count conditions are recognized in each direction:\r\n * * If poleArray.length + order == knotArray.length, the first and last are assumed to be the\r\n * extraneous knots of classic clamping.\r\n * * If poleArray.length + order == knotArray.length + 2, the knots are in modern form that does not have\r\n * the classic unused first and last knot.\r\n * @param xyzwGrid Array of points, ordered along the U direction.\r\n * @param weightStyle how the points are weighted\r\n * @param orderU order for the U direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayU knots for the V direction. See note above about knot counts.\r\n * @param orderV order for the V direction polynomial (`order` is one more than the `degree`. \"cubic\" polynomial is order 4.)\r\n * @param knotArrayV knots for the V direction. See note above about knot counts.\r\n */\r\n public static createGrid(\r\n xyzwGrid: number[][][],\r\n weightStyle: WeightStyle,\r\n orderU: number,\r\n knotArrayU: number[] | Float64Array | undefined,\r\n orderV: number,\r\n knotArrayV: number[] | Float64Array | undefined): BSplineSurface3dH | undefined {\r\n const numPolesV = xyzwGrid.length;\r\n const numPolesU = xyzwGrid[0].length;\r\n const numPoles = numPolesU * numPolesV;\r\n if (4 !== xyzwGrid[0][0].length)\r\n return undefined;\r\n if (!this.validOrderAndPoleCounts(orderU, numPolesU, orderV, numPolesV, numPoles))\r\n return undefined;\r\n\r\n // validate knot counts\r\n const numKnotsU = knotArrayU ? knotArrayU.length : numPolesU + orderU - 2;\r\n const numKnotsV = knotArrayV ? knotArrayV.length : numPolesV + orderV - 2;\r\n const skipFirstAndLastU = (numPolesU + orderU === numKnotsU); // classic over-clamped input knots\r\n if (!skipFirstAndLastU && numPolesU + orderU !== numKnotsU + 2) // modern knots\r\n return undefined;\r\n const skipFirstAndLastV = (numPolesV + orderV === numKnotsV); // classic\r\n if (!skipFirstAndLastV && numPolesV + orderV !== numKnotsV + 2) // modern\r\n return undefined;\r\n\r\n const knotsU = knotArrayU ?\r\n KnotVector.create(knotArrayU, orderU - 1, skipFirstAndLastU) :\r\n KnotVector.createUniformClamped(numPolesU, orderU - 1, 0.0, 1.0);\r\n const knotsV = knotArrayV ?\r\n KnotVector.create(knotArrayV, orderV - 1, skipFirstAndLastV) :\r\n KnotVector.createUniformClamped(numPolesV, orderV - 1, 0.0, 1.0);\r\n\r\n const coffs = new Float64Array(4 * numPoles);\r\n let i = 0;\r\n switch (weightStyle) {\r\n case WeightStyle.WeightsSeparateFromCoordinates: {\r\n for (const row of xyzwGrid) {\r\n for (const point of row) {\r\n const w = point[3];\r\n coffs[i++] = point[0] * w;\r\n coffs[i++] = point[1] * w;\r\n coffs[i++] = point[2] * w;\r\n coffs[i++] = point[3];\r\n }\r\n }\r\n break;\r\n }\r\n case WeightStyle.WeightsAlreadyAppliedToCoordinates: {\r\n for (const row of xyzwGrid) {\r\n for (const point of row) {\r\n coffs[i++] = point[0];\r\n coffs[i++] = point[1];\r\n coffs[i++] = point[2];\r\n coffs[i++] = point[3];\r\n }\r\n }\r\n break;\r\n }\r\n case WeightStyle.UnWeighted: {\r\n for (const row of xyzwGrid) {\r\n for (const point of row) {\r\n coffs[i++] = point[0];\r\n coffs[i++] = point[1];\r\n coffs[i++] = point[2];\r\n coffs[i++] = 1.0;\r\n }\r\n }\r\n break;\r\n }\r\n default:\r\n return undefined; // unrecognized WeightStyle\r\n }\r\n return new BSplineSurface3dH(numPolesU, numPolesV, knotsU, knotsV, coffs);\r\n }\r\n\r\n /** Return a deep clone */\r\n public clone(): BSplineSurface3dH {\r\n const knotVector1U = this.knots[0].clone();\r\n const knotVector1V = this.knots[1].clone();\r\n const surface1 = new BSplineSurface3dH(this.numPolesUV(0), this.numPolesUV(1), knotVector1U, knotVector1V,\r\n this.coffs.slice());\r\n surface1.coffs = this.coffs.slice();\r\n return surface1;\r\n }\r\n /** Return a transformed clone */\r\n public cloneTransformed(transform: Transform): BSplineSurface3dH {\r\n const surface1 = this.clone();\r\n surface1.tryTransformInPlace(transform);\r\n return surface1;\r\n }\r\n /**\r\n * Return control points json arrays.\r\n * * Each row of points is an an array.\r\n * * Within the array for each row, each point is an array [wx,wy,wz,w].\r\n */\r\n public getPointGridJSON(): PackedPointGrid {\r\n const result = {\r\n points: Point3dArray.unpackNumbersToNestedArraysIJK(this.coffs, 4, this.numPolesUV(0)),\r\n numCartesianDimensions: 3,\r\n weightStyle: WeightStyle.WeightsAlreadyAppliedToCoordinates,\r\n };\r\n return result;\r\n }\r\n\r\n /** Evaluate at a position given by a knot value. If deweight fails, returns 000. */\r\n public knotToPoint4d(u: number, v: number, result?: Point4d): Point4d {\r\n this.evaluateBuffersAtKnot(u, v);\r\n result = Point4d.createFromPacked(this._poleBuffer, 0, result);\r\n return result ? result : Point4d.createZero();\r\n }\r\n /** Evaluate at a position given by a knot value. */\r\n public knotToPointAndDerivatives(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n this.evaluateBuffersAtKnot(u, v, 1);\r\n return Plane3dByOriginAndVectors.createOriginAndVectorsWeightedArrays(this._poleBuffer, this._poleBuffer1UV[0], this._poleBuffer1UV[1], result);\r\n }\r\n\r\n /** Evaluate the Point4d (leaving weights in the point) at given fractional coordinates. If deweight fails, returns 000. */\r\n public fractionToPoint4d(fractionU: number, fractionV: number, result?: Point4d): Point4d {\r\n result = this.knotToPoint4d(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV), result);\r\n return result ? result : Point4d.createZero();\r\n }\r\n /**\r\n * Evaluate the surface and return the Cartesian point (weight = 1).\r\n * * If the surface XYZW point has weight 0, returns 000.\r\n * @param fractionU u direction fraction\r\n * @param fractionV v direction fraction\r\n * @param result optional result\r\n */\r\n public fractionToPoint(fractionU: number, fractionV: number, result?: Point3d): Point3d {\r\n const point4d = this.knotToPoint4d(this.knots[0].fractionToKnot(fractionU), this.knots[1].fractionToKnot(fractionV));\r\n return point4d.realPointDefault000(result);\r\n }\r\n /**\r\n * * evaluate the surface and return the cartesian (weight = 1) point.\r\n * * if the surface XYZW point has weight0, returns point3d at 000.\r\n * @param knotU u direction knot\r\n * @param knotV v direction knot\r\n * @param result optional result\r\n */\r\n public knotToPoint(knotU: number, knotV: number, result?: Point3d): Point3d {\r\n const point4d = this.knotToPoint4d(knotU, knotV);\r\n return point4d.realPointDefault000(result);\r\n }\r\n /**\r\n * evaluate the surface at u and v fractions.\r\n * @returns plane with origin at the surface point, direction vectors are derivatives in the u and v directions.\r\n * @param fractionU u coordinate, as a fraction of the knot range.\r\n * @param fractionV v coordinate, as a fraction of the knot range.\r\n * @param result optional pre-allocated object for return values.\r\n * @returns Returns point and derivative directions.\r\n */\r\n public override fractionToPointAndDerivatives(fractionU: number, fractionV: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n const knotU = this.knots[0].fractionToKnot(fractionU);\r\n const knotV = this.knots[1].fractionToKnot(fractionV);\r\n return this.knotToPointAndDerivatives(knotU, knotV, result);\r\n }\r\n\r\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\r\n public uvFractionToPoint(u: number, v: number): Point3d {\r\n return this.fractionToPoint(u, v);\r\n }\r\n /** Implementation of the UVSurface interface; allows `PolyfaceBuilder.addUVGridBody` to facet this B-spline surface. */\r\n public uvFractionToPointAndTangents(u: number, v: number, result?: Plane3dByOriginAndVectors): Plane3dByOriginAndVectors {\r\n return this.fractionToPointAndDerivatives(u, v, result);\r\n }\r\n\r\n /** test for identical counts and near-equal coordinates */\r\n public override isAlmostEqual(other: any): boolean {\r\n if (other instanceof BSplineSurface3dH) {\r\n return this.knots[0].isAlmostEqual(other.knots[0])\r\n && this.knots[1].isAlmostEqual(other.knots[1])\r\n && Point4dArray.isAlmostEqual(this.coffs, other.coffs);\r\n }\r\n return false;\r\n }\r\n /** Test if all poles are in a plane */\r\n public isInPlane(plane: Plane3dByOriginAndUnitNormal): boolean {\r\n return Point4dArray.isCloseToPlane(this.coffs, plane);\r\n }\r\n /** Second step of double dispatch: call `handler.handleBSplineSurface3dH(this)` */\r\n public dispatchToGeometryHandler(handler: GeometryHandler): any {\r\n return handler.handleBSplineSurface3dH(this);\r\n }\r\n /**\r\n * extend a range to include the (optionally transformed) points of this surface\r\n * @param rangeToExtend range that is updated to include this surface range\r\n * @param transform transform to apply to the surface points\r\n */\r\n public extendRange(rangeToExtend: Range3d, transform?: Transform): void {\r\n this.extendRangeXYZH(rangeToExtend, transform);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bezier1dNd.js","sourceRoot":"","sources":["../../../src/bspline/Bezier1dNd.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Bspline\n */\n\nimport { Geometry } from \"../Geometry\";\nimport { Point2d } from \"../geometry3d/Point2dVector2d\";\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\nimport { Segment1d } from \"../geometry3d/Segment1d\";\nimport { Point4d } from \"../geometry4d/Point4d\";\nimport { BezierCoffs, UnivariateBezier } from \"../numerics/BezierPolynomials\";\nimport { KnotVector } from \"./KnotVector\";\n\n/**\n * Shared implementation details for derived bezier curve classes\n * * BezierCurve3d implements with blockSize 3.\n * * BezierCurve3dH implements with blockSize 4.\n * @public\n */\nexport class Bezier1dNd {\n private _packedData: Float64Array;\n private _order: number; // bezier order. probably low\n private _blockSize: number; // loosely expected to be 1 to 4.\n private _basis: BezierCoffs; // server for basis queries. It carries coefficients that we don't use.\n // constructor CAPTURES the control points array.\n public constructor(blockSize: number, polygon: Float64Array) {\n this._blockSize = blockSize;\n this._order = Math.floor(polygon.length / blockSize); // This should be an integer!!!\n this._packedData = polygon;\n this._basis = new UnivariateBezier(this._order);\n }\n /**\n * Return a clone of the data array.\n * @param result optional destination array. If not the _same_ size as the data array, a new array is returned.\n */\n public clonePolygon(result?: Float64Array): Float64Array {\n const n = this._packedData.length;\n if (!result || result.length !== n)\n return this._packedData.slice();\n /** move data into the supplied result */\n for (let i = 0; i < n; i++)\n result[i] = this._packedData[i];\n return result;\n }\n /** Return the bezier order */\n public get order() { return this._order; }\n /** return the packed data array. This is a REFERENCE to the array. */\n public get packedData() { return this._packedData; }\n /** Create a Bezier1dNd, using the structure of `data[0]` to determine the bezier order. */\n public static create(data: Point2d[] | Point3d[] | Point4d[]): Bezier1dNd | undefined {\n if (data.length < 1)\n return undefined;\n if (data[0] instanceof Point3d) {\n const polygon = new Float64Array(data.length * 3);\n let i = 0;\n for (const p of (data as Point3d[])) {\n polygon[i++] = p.x;\n polygon[i++] = p.y;\n polygon[i++] = p.z;\n }\n return new Bezier1dNd(3, polygon);\n } else if (data[0] instanceof Point4d) {\n const polygon = new Float64Array(data.length * 4);\n let i = 0;\n for (const p of (data as Point4d[])) {\n polygon[i++] = p.x;\n polygon[i++] = p.y;\n polygon[i++] = p.z;\n polygon[i++] = p.w;\n }\n return new Bezier1dNd(4, polygon);\n } else if (data[0] instanceof Point2d) {\n const polygon = new Float64Array(data.length * 2);\n let i = 0;\n for (const p of (data as Point2d[])) {\n polygon[i++] = p.x;\n polygon[i++] = p.y;\n }\n return new Bezier1dNd(2, polygon);\n }\n return undefined;\n }\n /**\n * Return the curve value at bezier fraction `s`.\n * @param s bezier parameter for evaluation\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\n * @return buffer of length `blockSize`.\n */\n public evaluate(s: number, buffer?: Float64Array): Float64Array {\n return this._basis.sumBasisFunctions(s, this._packedData, this._blockSize, buffer);\n }\n /**\n * Return the curve derivative value at bezier fraction `s`.\n * @param s bezier parameter for evaluation\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\n * @return buffer of length `blockSize`.\n */\n public evaluateDerivative(s: number, buffer?: Float64Array): Float64Array {\n return this._basis.sumBasisFunctionDerivatives(s, this._packedData, this._blockSize, buffer);\n }\n /**\n * Return a point of the polygon as a simple array.\n * @param i index of desired point\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\n * @return point as simple array of length `blockSize`, or undefined if index out of range.\n */\n public getPolygonPoint(i: number, buffer?: Float64Array): Float64Array | undefined {\n if (!buffer || buffer.length < this._blockSize)\n buffer = new Float64Array(this._blockSize);\n if (i >= 0 && i < this._order) {\n const k0 = this._blockSize * i;\n for (let k = 0; k < this._blockSize; k++)\n buffer[k] = this._packedData[k0 + k];\n return buffer;\n }\n return undefined;\n }\n /** set a single point of the polygon as a simple array. */\n public setPolygonPoint(i: number, buffer: Float64Array) {\n if (i >= 0 && i < this._order) {\n const k0 = this._blockSize * i;\n for (let k = 0; k < this._blockSize; k++)\n this._packedData[k0 + k] = buffer[k];\n }\n }\n /** Load order * dimension doubles from data[dimension * spanIndex] as poles\n * @param data packed source array. block size in `data` assumed to match dimension for this.\n * @param spanIndex block index in data.\n */\n public loadSpanPoles(data: Float64Array, spanIndex: number) {\n let k = spanIndex * this._blockSize;\n for (let i = 0; i < this._packedData.length; i++)\n this._packedData[i] = data[k++];\n }\n /** Load order * (dataDimension + 1) doubles from data[dataDimension * spanIndex] as poles with weight inserted\n * @param data packed array of data.\n * @param dataDimension dimension of data. Must have `dataDimension+1=this.order`\n * @param spanIndex index of first data block to access.\n * @param weight weight to append to each block\n */\n public loadSpanPolesWithWeight(data: Float64Array, dataDimension: number, spanIndex: number, weight: number) {\n let destIndex = 0;\n const order = this._order;\n let dataIndex = spanIndex * dataDimension;\n for (let i = 0; i < order; i++) {\n for (let j = 0; j < dataDimension; j++)\n this._packedData[destIndex++] = data[dataIndex++];\n this._packedData[destIndex++] = weight;\n }\n }\n /** return a json array of arrays with each control point as a lower level array of numbers */\n public unpackToJsonArrays(): any[] {\n return Point3dArray.unpackNumbersToNestedArrays(this._packedData, this._blockSize);\n }\n /** equality test with usual metric tolerances */\n public isAlmostEqual(other: any): boolean {\n if (other instanceof Bezier1dNd) {\n if (this._blockSize !== other._blockSize)\n return false;\n if (this._order !== other._order)\n return false;\n if (this._packedData.length !== other._packedData.length)\n return false;\n for (let i = 0; i < this._packedData.length; i++) {\n if (!Geometry.isSameCoordinate(this._packedData[i], other._packedData[i]))\n return false;\n }\n return true;\n }\n return false;\n }\n /** block-by-block reversal */\n public reverseInPlace() {\n const m = this._blockSize;\n const n = this._order;\n let i, j;\n let a;\n for (i = 0, j = (n - 1) * m; i < j; i += m, j -= m) {\n for (let k = 0; k < m; k++) {\n a = this._packedData[i + k];\n this._packedData[i + k] = this._packedData[j + k];\n this._packedData[j + k] = a;\n }\n }\n }\n\n /**\n * interpolate at `fraction` between poleA and poleB.\n * * Data is left \"in place\" in poleIndexA\n * @param poleIndexA first pole index\n * @param fraction fractional position\n * @param poleIndexB second pole index\n */\n public interpolatePoleInPlace(poleIndexA: number, fraction: number, poleIndexB: number) {\n let i0 = poleIndexA * this._blockSize;\n let i1 = poleIndexB * this._blockSize;\n const data = this._packedData;\n for (let i = 0; i < this._blockSize; i++ , i0++ , i1++) {\n data[i0] += fraction * (data[i1] - data[i0]);\n }\n }\n\n /**\n * Compute new control points to \"clamp\" bspline unsaturated support to saturated form.\n * * At input time, the control points are associated with the input knots (unsaturated)\n * * At output, the control points are modified by repeated knot insertion to be fully clamped.\n * @param knots knot values for the current (unsaturated) pole set\n * @param spanIndex index of span whose (unsaturated) poles are in the bezier.\n */\n public saturateInPlace(knots: KnotVector, spanIndex: number): boolean {\n const degree = knots.degree;\n const kA = spanIndex + degree - 1; // left knot index of the active span\n const kB = kA + 1;\n if (spanIndex < 0 || spanIndex >= knots.numSpans)\n return false;\n const knotArray = knots.knots;\n const knotA = knotArray[kA];\n const knotB = knotArray[kB];\n this.setInterval(knotA, knotB);\n if (knotB <= knotA + KnotVector.knotTolerance)\n return false;\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\n // left numInsert poles are pulled forward\n let k0 = kA - numInsert;\n if (knotArray[k0] < knotA) {\n let k1 = kB;\n for (let i = 0; i < numInsert; i++ , k0++ , k1++) {\n const knot0 = knotArray[k0];\n const knot1 = knotArray[k1];\n const fraction = (knotA - knot0) / (knot1 - knot0);\n this.interpolatePoleInPlace(i, fraction, i + 1);\n }\n }\n }\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\n let k2 = kB + numInsert;\n if (knotArray[k2] > knotB) {\n for (let i = 0; i < numInsert; i++ , k2--) {\n const knot2 = knotArray[k2]; // right side of moving window\n // left side of window ia always the (previously saturated) knotA\n const fraction = (knotB - knot2) / (knotA - knot2);\n this.interpolatePoleInPlace(degree - i, fraction, degree - i - 1);\n }\n }\n }\n return true;\n }\n /**\n * Saturate a univariate bspline coefficient array in place\n * * On input, the array is the coefficients of one span of a bspline, packed in an array of `(knots.order)` values.\n * * These are modified in place, and on return are a bezier for the same knot interval.\n * @param coffs input as bspline coefficients, returned as bezier coefficients\n * @param knots knot vector\n * @param spanIndex index of span whose (unsaturated) poles are in the coefficients.\n */\n public static saturate1dInPlace(coffs: Float64Array, knots: KnotVector, spanIndex: number): boolean {\n const degree = knots.degree;\n const kA = spanIndex + degree - 1; // left knot index of the active span\n const kB = kA + 1;\n if (spanIndex < 0 || spanIndex >= knots.numSpans)\n return false;\n const knotArray = knots.knots;\n const knotA = knotArray[kA];\n const knotB = knotArray[kB];\n if (knotB <= knotA + KnotVector.knotTolerance)\n return false;\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\n // left numInsert poles are pulled forward\n let k0 = kA - numInsert;\n if (knotArray[k0] < knotA) {\n let k1 = kB;\n for (let i = 0; i < numInsert; i++ , k0++ , k1++) {\n const knot0 = knotArray[k0];\n const knot1 = knotArray[k1];\n const fraction = (knotA - knot0) / (knot1 - knot0);\n coffs[i] = coffs[i] + fraction * (coffs[i + 1] - coffs[i]);\n }\n }\n }\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\n let k2 = kB + numInsert;\n let k;\n if (knotArray[k2] > knotB) {\n for (let i = 0; i < numInsert; i++ , k2--) {\n const knot2 = knotArray[k2]; // right side of moving window\n // left side of window is always the (previously saturated) knotA\n const fraction = (knotB - knot2) / (knotA - knot2);\n k = degree - i;\n coffs[k] += fraction * (coffs[k - 1] - coffs[k]);\n }\n }\n }\n return true;\n }\n /**\n * Apply deCasteljau interpolations to isolate a smaller bezier polygon, representing interval 0..fraction of the original\n * @param fraction \"end\" fraction for split.\n * @returns false if fraction is 0 or 1 -- no changes applied.\n */\n public subdivideInPlaceKeepLeft(fraction: number): boolean {\n if (Geometry.isAlmostEqualNumber(fraction, 1.0))\n return true;\n if (Geometry.isAlmostEqualNumber(fraction, 0.0))\n return false;\n const g = 1.0 - fraction; // interpolations will pull towards right indices\n const order = this.order;\n for (let level = 1; level < order; level++) {\n for (let i1 = order - 1; i1 >= level; i1--) {\n this.interpolatePoleInPlace(i1, g, i1 - 1); // leave updates to right\n }\n }\n return true;\n }\n\n /**\n * Apply deCasteljau interpolations to isolate a smaller bezier polygon, representing interval fraction..1 of the original\n * @param fraction \"start\" fraction for split.\n * @returns false if fraction is 0 or 1 -- no changes applied.\n */\n public subdivideInPlaceKeepRight(fraction: number): boolean {\n if (Geometry.isAlmostEqualNumber(fraction, 0.0))\n return true;\n if (Geometry.isAlmostEqualNumber(fraction, 1.0))\n return false;\n const order = this.order;\n for (let level = 1; level < order; level++) {\n for (let i0 = 0; i0 + level < order; i0++)\n this.interpolatePoleInPlace(i0, fraction, i0 + 1); // leave updates to left.\n }\n return true;\n }\n\n /**\n * Saturate a univariate bspline coefficient array in place\n * @param fraction0 fraction for first split. This is the start of the output polygon\n * @param fraction1 fraction for second split. This is the end of the output polygon\n * @return false if fractions are (almost) identical.\n */\n public subdivideToIntervalInPlace(fraction0: number, fraction1: number): boolean {\n if (Geometry.isAlmostEqualNumber(fraction0, fraction1))\n return false;\n if (fraction1 < fraction0) {\n this.subdivideToIntervalInPlace(fraction1, fraction0);\n this.reverseInPlace();\n return true;\n }\n this.subdivideInPlaceKeepLeft(fraction1);\n this.subdivideInPlaceKeepRight(fraction0 / fraction1);\n return true;\n }\n\n /** optional interval for mapping to a parent object */\n public interval?: Segment1d;\n /** create or update the mapping to parent curve. */\n public setInterval(a: number, b: number) {\n this.interval = Segment1d.create(a, b, this.interval);\n }\n /** map a fraction to the parent space. */\n public fractionToParentFraction(fraction: number): number { return this.interval ? this.interval.fractionToPoint(fraction) : fraction; }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Bezier1dNd.js","sourceRoot":"","sources":["../../../src/bspline/Bezier1dNd.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 { Point2d } from \"../geometry3d/Point2dVector2d\";\r\nimport { Point3d } from \"../geometry3d/Point3dVector3d\";\r\nimport { Point3dArray } from \"../geometry3d/PointHelpers\";\r\nimport { Segment1d } from \"../geometry3d/Segment1d\";\r\nimport { Point4d } from \"../geometry4d/Point4d\";\r\nimport { BezierCoffs, UnivariateBezier } from \"../numerics/BezierPolynomials\";\r\nimport { KnotVector } from \"./KnotVector\";\r\n\r\n/**\r\n * Shared implementation details for derived bezier curve classes\r\n * * BezierCurve3d implements with blockSize 3.\r\n * * BezierCurve3dH implements with blockSize 4.\r\n * @public\r\n */\r\nexport class Bezier1dNd {\r\n private _packedData: Float64Array;\r\n private _order: number; // bezier order. probably low\r\n private _blockSize: number; // loosely expected to be 1 to 4.\r\n private _basis: BezierCoffs; // server for basis queries. It carries coefficients that we don't use.\r\n // constructor CAPTURES the control points array.\r\n public constructor(blockSize: number, polygon: Float64Array) {\r\n this._blockSize = blockSize;\r\n this._order = Math.floor(polygon.length / blockSize); // This should be an integer!!!\r\n this._packedData = polygon;\r\n this._basis = new UnivariateBezier(this._order);\r\n }\r\n /**\r\n * Return a clone of the data array.\r\n * @param result optional destination array. If not the _same_ size as the data array, a new array is returned.\r\n */\r\n public clonePolygon(result?: Float64Array): Float64Array {\r\n const n = this._packedData.length;\r\n if (!result || result.length !== n)\r\n return this._packedData.slice();\r\n /** move data into the supplied result */\r\n for (let i = 0; i < n; i++)\r\n result[i] = this._packedData[i];\r\n return result;\r\n }\r\n /** Return the bezier order */\r\n public get order() { return this._order; }\r\n /** return the packed data array. This is a REFERENCE to the array. */\r\n public get packedData() { return this._packedData; }\r\n /** Create a Bezier1dNd, using the structure of `data[0]` to determine the bezier order. */\r\n public static create(data: Point2d[] | Point3d[] | Point4d[]): Bezier1dNd | undefined {\r\n if (data.length < 1)\r\n return undefined;\r\n if (data[0] instanceof Point3d) {\r\n const polygon = new Float64Array(data.length * 3);\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 Bezier1dNd(3, polygon);\r\n } else if (data[0] instanceof Point4d) {\r\n const polygon = new Float64Array(data.length * 4);\r\n let i = 0;\r\n for (const p of (data as Point4d[])) {\r\n polygon[i++] = p.x;\r\n polygon[i++] = p.y;\r\n polygon[i++] = p.z;\r\n polygon[i++] = p.w;\r\n }\r\n return new Bezier1dNd(4, polygon);\r\n } else if (data[0] instanceof Point2d) {\r\n const polygon = new Float64Array(data.length * 2);\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 }\r\n return new Bezier1dNd(2, polygon);\r\n }\r\n return undefined;\r\n }\r\n /**\r\n * Return the curve value at bezier fraction `s`.\r\n * @param s bezier parameter for evaluation\r\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\r\n * @return buffer of length `blockSize`.\r\n */\r\n public evaluate(s: number, buffer?: Float64Array): Float64Array {\r\n return this._basis.sumBasisFunctions(s, this._packedData, this._blockSize, buffer);\r\n }\r\n /**\r\n * Return the curve derivative value at bezier fraction `s`.\r\n * @param s bezier parameter for evaluation\r\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\r\n * @return buffer of length `blockSize`.\r\n */\r\n public evaluateDerivative(s: number, buffer?: Float64Array): Float64Array {\r\n return this._basis.sumBasisFunctionDerivatives(s, this._packedData, this._blockSize, buffer);\r\n }\r\n /**\r\n * Return a point of the polygon as a simple array.\r\n * @param i index of desired point\r\n * @param buffer optional destination of length `blockSize`. If insufficient length, a new array is returned.\r\n * @return point as simple array of length `blockSize`, or undefined if index out of range.\r\n */\r\n public getPolygonPoint(i: number, buffer?: Float64Array): Float64Array | undefined {\r\n if (!buffer || buffer.length < this._blockSize)\r\n buffer = new Float64Array(this._blockSize);\r\n if (i >= 0 && i < this._order) {\r\n const k0 = this._blockSize * i;\r\n for (let k = 0; k < this._blockSize; k++)\r\n buffer[k] = this._packedData[k0 + k];\r\n return buffer;\r\n }\r\n return undefined;\r\n }\r\n /** set a single point of the polygon as a simple array. */\r\n public setPolygonPoint(i: number, buffer: Float64Array) {\r\n if (i >= 0 && i < this._order) {\r\n const k0 = this._blockSize * i;\r\n for (let k = 0; k < this._blockSize; k++)\r\n this._packedData[k0 + k] = buffer[k];\r\n }\r\n }\r\n /** Load order * dimension doubles from data[dimension * spanIndex] as poles\r\n * @param data packed source array. block size in `data` assumed to match dimension for this.\r\n * @param spanIndex block index in data.\r\n */\r\n public loadSpanPoles(data: Float64Array, spanIndex: number) {\r\n let k = spanIndex * this._blockSize;\r\n for (let i = 0; i < this._packedData.length; i++)\r\n this._packedData[i] = data[k++];\r\n }\r\n /** Load order * (dataDimension + 1) doubles from data[dataDimension * spanIndex] as poles with weight inserted\r\n * @param data packed array of data.\r\n * @param dataDimension dimension of data. Must have `dataDimension+1=this.order`\r\n * @param spanIndex index of first data block to access.\r\n * @param weight weight to append to each block\r\n */\r\n public loadSpanPolesWithWeight(data: Float64Array, dataDimension: number, spanIndex: number, weight: number) {\r\n let destIndex = 0;\r\n const order = this._order;\r\n let dataIndex = spanIndex * dataDimension;\r\n for (let i = 0; i < order; i++) {\r\n for (let j = 0; j < dataDimension; j++)\r\n this._packedData[destIndex++] = data[dataIndex++];\r\n this._packedData[destIndex++] = weight;\r\n }\r\n }\r\n /** return a json array of arrays with each control point as a lower level array of numbers */\r\n public unpackToJsonArrays(): any[] {\r\n return Point3dArray.unpackNumbersToNestedArrays(this._packedData, this._blockSize);\r\n }\r\n /** equality test with usual metric tolerances */\r\n public isAlmostEqual(other: any): boolean {\r\n if (other instanceof Bezier1dNd) {\r\n if (this._blockSize !== other._blockSize)\r\n return false;\r\n if (this._order !== other._order)\r\n return false;\r\n if (this._packedData.length !== other._packedData.length)\r\n return false;\r\n for (let i = 0; i < this._packedData.length; i++) {\r\n if (!Geometry.isSameCoordinate(this._packedData[i], other._packedData[i]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** block-by-block reversal */\r\n public reverseInPlace() {\r\n const m = this._blockSize;\r\n const n = this._order;\r\n let i, j;\r\n let a;\r\n for (i = 0, j = (n - 1) * m; i < j; i += m, j -= m) {\r\n for (let k = 0; k < m; k++) {\r\n a = this._packedData[i + k];\r\n this._packedData[i + k] = this._packedData[j + k];\r\n this._packedData[j + k] = a;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * interpolate at `fraction` between poleA and poleB.\r\n * * Data is left \"in place\" in poleIndexA\r\n * @param poleIndexA first pole index\r\n * @param fraction fractional position\r\n * @param poleIndexB second pole index\r\n */\r\n public interpolatePoleInPlace(poleIndexA: number, fraction: number, poleIndexB: number) {\r\n let i0 = poleIndexA * this._blockSize;\r\n let i1 = poleIndexB * this._blockSize;\r\n const data = this._packedData;\r\n for (let i = 0; i < this._blockSize; i++ , i0++ , i1++) {\r\n data[i0] += fraction * (data[i1] - data[i0]);\r\n }\r\n }\r\n\r\n /**\r\n * Compute new control points to \"clamp\" bspline unsaturated support to saturated form.\r\n * * At input time, the control points are associated with the input knots (unsaturated)\r\n * * At output, the control points are modified by repeated knot insertion to be fully clamped.\r\n * @param knots knot values for the current (unsaturated) pole set\r\n * @param spanIndex index of span whose (unsaturated) poles are in the bezier.\r\n */\r\n public saturateInPlace(knots: KnotVector, spanIndex: number): boolean {\r\n const degree = knots.degree;\r\n const kA = spanIndex + degree - 1; // left knot index of the active span\r\n const kB = kA + 1;\r\n if (spanIndex < 0 || spanIndex >= knots.numSpans)\r\n return false;\r\n const knotArray = knots.knots;\r\n const knotA = knotArray[kA];\r\n const knotB = knotArray[kB];\r\n this.setInterval(knotA, knotB);\r\n if (knotB <= knotA + KnotVector.knotTolerance)\r\n return false;\r\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\r\n // left numInsert poles are pulled forward\r\n let k0 = kA - numInsert;\r\n if (knotArray[k0] < knotA) {\r\n let k1 = kB;\r\n for (let i = 0; i < numInsert; i++ , k0++ , k1++) {\r\n const knot0 = knotArray[k0];\r\n const knot1 = knotArray[k1];\r\n const fraction = (knotA - knot0) / (knot1 - knot0);\r\n this.interpolatePoleInPlace(i, fraction, i + 1);\r\n }\r\n }\r\n }\r\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\r\n let k2 = kB + numInsert;\r\n if (knotArray[k2] > knotB) {\r\n for (let i = 0; i < numInsert; i++ , k2--) {\r\n const knot2 = knotArray[k2]; // right side of moving window\r\n // left side of window ia always the (previously saturated) knotA\r\n const fraction = (knotB - knot2) / (knotA - knot2);\r\n this.interpolatePoleInPlace(degree - i, fraction, degree - i - 1);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Saturate a univariate bspline coefficient array in place\r\n * * On input, the array is the coefficients of one span of a bspline, packed in an array of `(knots.order)` values.\r\n * * These are modified in place, and on return are a bezier for the same knot interval.\r\n * @param coffs input as bspline coefficients, returned as bezier coefficients\r\n * @param knots knot vector\r\n * @param spanIndex index of span whose (unsaturated) poles are in the coefficients.\r\n */\r\n public static saturate1dInPlace(coffs: Float64Array, knots: KnotVector, spanIndex: number): boolean {\r\n const degree = knots.degree;\r\n const kA = spanIndex + degree - 1; // left knot index of the active span\r\n const kB = kA + 1;\r\n if (spanIndex < 0 || spanIndex >= knots.numSpans)\r\n return false;\r\n const knotArray = knots.knots;\r\n const knotA = knotArray[kA];\r\n const knotB = knotArray[kB];\r\n if (knotB <= knotA + KnotVector.knotTolerance)\r\n return false;\r\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\r\n // left numInsert poles are pulled forward\r\n let k0 = kA - numInsert;\r\n if (knotArray[k0] < knotA) {\r\n let k1 = kB;\r\n for (let i = 0; i < numInsert; i++ , k0++ , k1++) {\r\n const knot0 = knotArray[k0];\r\n const knot1 = knotArray[k1];\r\n const fraction = (knotA - knot0) / (knot1 - knot0);\r\n coffs[i] = coffs[i] + fraction * (coffs[i + 1] - coffs[i]);\r\n }\r\n }\r\n }\r\n for (let numInsert = degree - 1; numInsert > 0; numInsert--) {\r\n let k2 = kB + numInsert;\r\n let k;\r\n if (knotArray[k2] > knotB) {\r\n for (let i = 0; i < numInsert; i++ , k2--) {\r\n const knot2 = knotArray[k2]; // right side of moving window\r\n // left side of window is always the (previously saturated) knotA\r\n const fraction = (knotB - knot2) / (knotA - knot2);\r\n k = degree - i;\r\n coffs[k] += fraction * (coffs[k - 1] - coffs[k]);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Apply deCasteljau interpolations to isolate a smaller bezier polygon, representing interval 0..fraction of the original\r\n * @param fraction \"end\" fraction for split.\r\n * @returns false if fraction is 0 or 1 -- no changes applied.\r\n */\r\n public subdivideInPlaceKeepLeft(fraction: number): boolean {\r\n if (Geometry.isAlmostEqualNumber(fraction, 1.0))\r\n return true;\r\n if (Geometry.isAlmostEqualNumber(fraction, 0.0))\r\n return false;\r\n const g = 1.0 - fraction; // interpolations will pull towards right indices\r\n const order = this.order;\r\n for (let level = 1; level < order; level++) {\r\n for (let i1 = order - 1; i1 >= level; i1--) {\r\n this.interpolatePoleInPlace(i1, g, i1 - 1); // leave updates to right\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Apply deCasteljau interpolations to isolate a smaller bezier polygon, representing interval fraction..1 of the original\r\n * @param fraction \"start\" fraction for split.\r\n * @returns false if fraction is 0 or 1 -- no changes applied.\r\n */\r\n public subdivideInPlaceKeepRight(fraction: number): boolean {\r\n if (Geometry.isAlmostEqualNumber(fraction, 0.0))\r\n return true;\r\n if (Geometry.isAlmostEqualNumber(fraction, 1.0))\r\n return false;\r\n const order = this.order;\r\n for (let level = 1; level < order; level++) {\r\n for (let i0 = 0; i0 + level < order; i0++)\r\n this.interpolatePoleInPlace(i0, fraction, i0 + 1); // leave updates to left.\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Saturate a univariate bspline coefficient array in place\r\n * @param fraction0 fraction for first split. This is the start of the output polygon\r\n * @param fraction1 fraction for second split. This is the end of the output polygon\r\n * @return false if fractions are (almost) identical.\r\n */\r\n public subdivideToIntervalInPlace(fraction0: number, fraction1: number): boolean {\r\n if (Geometry.isAlmostEqualNumber(fraction0, fraction1))\r\n return false;\r\n if (fraction1 < fraction0) {\r\n this.subdivideToIntervalInPlace(fraction1, fraction0);\r\n this.reverseInPlace();\r\n return true;\r\n }\r\n this.subdivideInPlaceKeepLeft(fraction1);\r\n this.subdivideInPlaceKeepRight(fraction0 / fraction1);\r\n return true;\r\n }\r\n\r\n /** optional interval for mapping to a parent object */\r\n public interval?: Segment1d;\r\n /** create or update the mapping to parent curve. */\r\n public setInterval(a: number, b: number) {\r\n this.interval = Segment1d.create(a, b, this.interval);\r\n }\r\n /** map a fraction to the parent space. */\r\n public fractionToParentFraction(fraction: number): number { return this.interval ? this.interval.fractionToPoint(fraction) : fraction; }\r\n}\r\n"]}
|