// This file is generated by WOK (CPPExt). // Please do not edit this file; modify original file instead. // The copyright and license terms as defined for the original file apply to // this header file considered to be the "object code" form of the original source. #ifndef _BSplCLib_HeaderFile #define _BSplCLib_HeaderFile #ifndef _Standard_HeaderFile #include #endif #ifndef _Standard_Macro_HeaderFile #include #endif #ifndef _Standard_Real_HeaderFile #include #endif #ifndef _Standard_Integer_HeaderFile #include #endif #ifndef _Standard_Boolean_HeaderFile #include #endif #ifndef _BSplCLib_KnotDistribution_HeaderFile #include #endif #ifndef _BSplCLib_MultDistribution_HeaderFile #include #endif #ifndef _Handle_TColStd_HArray1OfReal_HeaderFile #include #endif #ifndef _Handle_TColStd_HArray1OfInteger_HeaderFile #include #endif #ifndef _BSplCLib_EvaluatorFunction_HeaderFile #include #endif class TColStd_Array1OfReal; class TColStd_Array1OfInteger; class TColgp_Array1OfPnt; class TColgp_Array1OfPnt2d; class gp_Pnt; class gp_Pnt2d; class gp_Vec; class gp_Vec2d; class math_Matrix; class TColStd_HArray1OfReal; class TColStd_HArray1OfInteger; //! BSplCLib B-spline curve Library.
//!
//! The BSplCLib package is a basic library for BSplines. It
//! provides three categories of functions.
//!
//! * Management methods to process knots and multiplicities.
//!
//! * Multi-Dimensions spline methods. BSpline methods where
//! poles have an arbitrary number of dimensions. They divides
//! in two groups :
//!
//! - Global methods modifying the whole set of poles. The
//! poles are described by an array of Reals and a
//! Dimension. Example : Inserting knots.
//!
//! - Local methods computing points and derivatives. The
//! poles are described by a pointer on a local array of
//! Reals and a Dimension. The local array is modified.
//!
//! * 2D and 3D spline curves methods.
//!
//! Methods for 2d and 3d BSplines curves rational or not
//! rational.
//!
//! Those methods have the following structure :
//!
//! - They extract the pole informations in a working array.
//!
//! - They process the working array with the
//! multi-dimension methods. (for example a 3d rational
//! curve is processed as a 4 dimension curve).
//!
//! - They get back the result in the original dimension.
//!
//! Note that the bspline surface methods found in the
//! package BSplSLib uses the same structure and rely on
//! BSplCLib.
//!
//! In the following list of methods the 2d and 3d curve
//! methods will be described with the corresponding
//! multi-dimension method.
//!
//! The 3d or 2d B-spline curve is defined with :
//!
//! . its control points : TColgp_Array1OfPnt(2d) Poles
//! . its weights : TColStd_Array1OfReal Weights
//! . its knots : TColStd_Array1OfReal Knots
//! . its multiplicities : TColStd_Array1OfInteger Mults
//! . its degree : Standard_Integer Degree
//! . its periodicity : Standard_Boolean Periodic
class BSplCLib { public: void* operator new(size_t,void* anAddress) { return anAddress; } void* operator new(size_t size) { return Standard::Allocate(size); } void operator delete(void *anAddress) { if (anAddress) Standard::Free((Standard_Address&)anAddress); } //! This routine searches the position of the real
//! value X in the ordered set of real values XX.
//!
//! The elements in the table XX are either
//! monotonically increasing or monotonically
//! decreasing.
//!
//! The input value Iloc is used to initialize the
//! algorithm : if Iloc is outside of the bounds
//! [XX.Lower(), -- XX.Upper()] the bisection algorithm
//! is used else the routine searches from a previous
//! known position by increasing steps then converges
//! by bisection.
//!
//! This routine is used to locate a knot value in a
//! set of knots.
//!
Standard_EXPORT static void Hunt(const TColStd_Array1OfReal& XX,const Standard_Real X,Standard_Integer& Iloc) ; //! Computes the index of the knots value which gives
//! the start point of the curve.
Standard_EXPORT static Standard_Integer FirstUKnotIndex(const Standard_Integer Degree,const TColStd_Array1OfInteger& Mults) ; //! Computes the index of the knots value which gives
//! the end point of the curve.
Standard_EXPORT static Standard_Integer LastUKnotIndex(const Standard_Integer Degree,const TColStd_Array1OfInteger& Mults) ; //! Computes the index of the flats knots sequence
//! corresponding to in the knots sequence
//! which multiplicities are .
Standard_EXPORT static Standard_Integer FlatIndex(const Standard_Integer Degree,const Standard_Integer Index,const TColStd_Array1OfInteger& Mults,const Standard_Boolean Periodic) ; //! Locates the parametric value U in the knots
//! sequence between the knot K1 and the knot K2.
//! The value return in Index verifies.
//!
//! Knots(Index) <= U < Knots(Index + 1)
//! if U <= Knots (K1) then Index = K1
//! if U >= Knots (K2) then Index = K2 - 1
//!
//! If Periodic is True U may be modified to fit in
//! the range Knots(K1), Knots(K2). In any case the
//! correct value is returned in NewU.
//!
//! Warnings :Index is used as input data to initialize the
//! searching function.
//! Warning: Knots have to be "withe repetitions"
Standard_EXPORT static void LocateParameter(const Standard_Integer Degree,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const Standard_Real U,const Standard_Boolean IsPeriodic,const Standard_Integer FromK1,const Standard_Integer ToK2,Standard_Integer& KnotIndex,Standard_Real& NewU) ; //! Locates the parametric value U in the knots
//! sequence between the knot K1 and the knot K2.
//! The value return in Index verifies.
//!
//! Knots(Index) <= U < Knots(Index + 1)
//! if U <= Knots (K1) then Index = K1
//! if U >= Knots (K2) then Index = K2 - 1
//!
//! If Periodic is True U may be modified to fit in
//! the range Knots(K1), Knots(K2). In any case the
//! correct value is returned in NewU.
//!
//! Warnings :Index is used as input data to initialize the
//! searching function.
//! Warning: Knots have to be "flat"
Standard_EXPORT static void LocateParameter(const Standard_Integer Degree,const TColStd_Array1OfReal& Knots,const Standard_Real U,const Standard_Boolean IsPeriodic,const Standard_Integer FromK1,const Standard_Integer ToK2,Standard_Integer& KnotIndex,Standard_Real& NewU) ; Standard_EXPORT static void LocateParameter(const Standard_Integer Degree,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const Standard_Real U,const Standard_Boolean Periodic,Standard_Integer& Index,Standard_Real& NewU) ; //! Finds the greatest multiplicity in a set of knots
//! between K1 and K2. Mults is the multiplicity
//! associated with each knot value.
Standard_EXPORT static Standard_Integer MaxKnotMult(const TColStd_Array1OfInteger& Mults,const Standard_Integer K1,const Standard_Integer K2) ; //! Finds the lowest multiplicity in a set of knots
//! between K1 and K2. Mults is the multiplicity
//! associated with each knot value.
Standard_EXPORT static Standard_Integer MinKnotMult(const TColStd_Array1OfInteger& Mults,const Standard_Integer K1,const Standard_Integer K2) ; //! Returns the number of poles of the curve. Returns 0 if
//! one of the multiplicities is incorrect.
//!
//! * Non positive.
//!
//! * Greater than Degree, or Degree+1 at the first and
//! last knot of a non periodic curve.
//!
//! * The last periodicity on a periodic curve is not
//! equal to the first.
Standard_EXPORT static Standard_Integer NbPoles(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfInteger& Mults) ; //! Returns the length of the sequence of knots with
//! repetition.
//!
//! Periodic :
//!
//! Sum(Mults(i), i = Mults.Lower(); i <= Mults.Upper());
//!
//! Non Periodic :
//!
//! Sum(Mults(i); i = Mults.Lower(); i < Mults.Upper())
//! + 2 * Degree
Standard_EXPORT static Standard_Integer KnotSequenceLength(const TColStd_Array1OfInteger& Mults,const Standard_Integer Degree,const Standard_Boolean Periodic) ; Standard_EXPORT static void KnotSequence(const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColStd_Array1OfReal& KnotSeq) ; //! Computes the sequence of knots KnotSeq with
//! repetition of the knots of multiplicity greater
//! than 1.
//!
//! Length of KnotSeq must be KnotSequenceLength(Mults,Degree,Periodic)
Standard_EXPORT static void KnotSequence(const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const Standard_Integer Degree,const Standard_Boolean Periodic,TColStd_Array1OfReal& KnotSeq) ; //! Returns the length of the sequence of knots (and
//! Mults) without repetition.
Standard_EXPORT static Standard_Integer KnotsLength(const TColStd_Array1OfReal& KnotSeq,const Standard_Boolean Periodic = Standard_False) ; //! Computes the sequence of knots Knots without
//! repetition of the knots of multiplicity greater
//! than 1.
//!
//! Length of and must be
//! KnotsLength(KnotSequence,Periodic)
Standard_EXPORT static void Knots(const TColStd_Array1OfReal& KnotSeq,TColStd_Array1OfReal& Knots,TColStd_Array1OfInteger& Mults,const Standard_Boolean Periodic = Standard_False) ; //! Analyses if the knots distribution is "Uniform"
//! or "NonUniform" between the knot FromK1 and the
//! knot ToK2. There is no repetition of knot in the
//! knots'sequence .
Standard_EXPORT static BSplCLib_KnotDistribution KnotForm(const TColStd_Array1OfReal& Knots,const Standard_Integer FromK1,const Standard_Integer ToK2) ; //! Analyses the distribution of multiplicities between
//! the knot FromK1 and the Knot ToK2.
Standard_EXPORT static BSplCLib_MultDistribution MultForm(const TColStd_Array1OfInteger& Mults,const Standard_Integer FromK1,const Standard_Integer ToK2) ; //! Reparametrizes a B-spline curve to [U1, U2].
//! The knot values are recomputed such that Knots (Lower) = U1
//! and Knots (Upper) = U2 but the knot form is not modified.
//! Warnings :
//! In the array Knots the values must be in ascending order.
//! U1 must not be equal to U2 to avoid division by zero.
Standard_EXPORT static void Reparametrize(const Standard_Real U1,const Standard_Real U2,TColStd_Array1OfReal& Knots) ; //! Reverses the array knots to become the knots
//! sequence of the reversed curve.
Standard_EXPORT static void Reverse(TColStd_Array1OfReal& Knots) ; //! Reverses the array of multiplicities.
Standard_EXPORT static void Reverse(TColStd_Array1OfInteger& Mults) ; //! Reverses the array of poles. Last is the index of
//! the new first pole. On a non periodic curve last
//! is Poles.Upper(). On a periodic curve last is
//!
//! (number of flat knots - degree - 1)
//!
//! or
//!
//! (sum of multiplicities(but for the last) + degree
//! - 1)
Standard_EXPORT static void Reverse(TColgp_Array1OfPnt& Poles,const Standard_Integer Last) ; //! Reverses the array of poles.
Standard_EXPORT static void Reverse(TColgp_Array1OfPnt2d& Poles,const Standard_Integer Last) ; //! Reverses the array of poles.
Standard_EXPORT static void Reverse(TColStd_Array1OfReal& Weights,const Standard_Integer Last) ; //! Returns False if all the weights of the array
//! between I1 an I2 are identic. Epsilon is used for
//! comparing weights. If Epsilon is 0. the Epsilon of the
//! first weight is used.
Standard_EXPORT static Standard_Boolean IsRational(const TColStd_Array1OfReal& Weights,const Standard_Integer I1,const Standard_Integer I2,const Standard_Real Epsilon = 0.0) ; //! returns the degree maxima for a BSplineCurve.
static Standard_Integer MaxDegree() ; //! Perform the Boor algorithm to evaluate a point at
//! parameter , with and .
//!
//! Poles is an array of Reals of size
//!
//! * +1
//!
//! Containing the poles. At the end contains
//! the current point.
Standard_EXPORT static void Eval(const Standard_Real U,const Standard_Integer Degree,Standard_Real& Knots,const Standard_Integer Dimension,Standard_Real& Poles) ; //! Performs the Boor Algorithm at parameter with
//! the given and the array of on the
//! poles of dimension . The schema
//! is computed until level on a basis of
//! poles.
//!
//! * Knots is an array of reals of length :
//!
//! +
//!
//! * Poles is an array of reals of length :
//!
//! (2 * + 1) *
//!
//! The poles values must be set in the array at the
//! positions.
//!
//! 0..Dimension,
//!
//! 2 * Dimension ..
//! 3 * Dimension
//!
//! 4 * Dimension ..
//! 5 * Dimension
//!
//! ...
//!
//! The results are found in the array poles depending
//! on the Depth. (See the method GetPole).
Standard_EXPORT static void BoorScheme(const Standard_Real U,const Standard_Integer Degree,Standard_Real& Knots,const Standard_Integer Dimension,Standard_Real& Poles,const Standard_Integer Depth,const Standard_Integer Length) ; //! Compute the content of Pole before the BoorScheme.
//! This method is used to remove poles.
//!
//! U is the poles to remove, Knots should contains the
//! knots of the curve after knot removal.
//!
//! The first and last poles do not change, the other
//! poles are computed by averaging two possible values.
//! The distance between the two possible poles is
//! computed, if it is higher than False is
//! returned.
Standard_EXPORT static Standard_Boolean AntiBoorScheme(const Standard_Real U,const Standard_Integer Degree,Standard_Real& Knots,const Standard_Integer Dimension,Standard_Real& Poles,const Standard_Integer Depth,const Standard_Integer Length,const Standard_Real Tolerance) ; //! Computes the poles of the BSpline giving the
//! derivatives of order .
//!
//! The formula for the first order is
//!
//! Pole(i) = Degree * (Pole(i+1) - Pole(i)) /
//! (Knots(i+Degree+1) - Knots(i+1))
//!
//! This formula is repeated (Degree is decremented at
//! each step).
Standard_EXPORT static void Derivative(const Standard_Integer Degree,Standard_Real& Knots,const Standard_Integer Dimension,const Standard_Integer Length,const Standard_Integer Order,Standard_Real& Poles) ; //! Performs the Bohm Algorithm at parameter . This
//! algorithm computes the value and all the derivatives
//! up to order N (N <= Degree).
//!
//! is the original array of poles.
//!
//! The result in is the value and the
//! derivatives. Poles[0] is the value, Poles[Degree]
//! is the last derivative.
Standard_EXPORT static void Bohm(const Standard_Real U,const Standard_Integer Degree,const Standard_Integer N,Standard_Real& Knots,const Standard_Integer Dimension,Standard_Real& Poles) ; //! Used as argument for a non rational curve.
//!
static TColStd_Array1OfReal& NoWeights() ; //! Used as argument for a flatknots evaluation.
//!
static TColStd_Array1OfInteger& NoMults() ; //! Stores in LK the usefull knots for the BoorSchem
//! on the span Knots(Index) - Knots(Index+1)
Standard_EXPORT static void BuildKnots(const Standard_Integer Degree,const Standard_Integer Index,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& LK) ; //! Return the index of the first Pole to use on the
//! span Mults(Index) - Mults(Index+1). This index
//! must be added to Poles.Lower().
Standard_EXPORT static Standard_Integer PoleIndex(const Standard_Integer Degree,const Standard_Integer Index,const Standard_Boolean Periodic,const TColStd_Array1OfInteger& Mults) ; Standard_EXPORT static void BuildEval(const Standard_Integer Degree,const Standard_Integer Index,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,Standard_Real& LP) ; Standard_EXPORT static void BuildEval(const Standard_Integer Degree,const Standard_Integer Index,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,Standard_Real& LP) ; //! Copy in the poles and weights for the Eval
//! scheme. starting from Poles(Poles.Lower()+Index)
Standard_EXPORT static void BuildEval(const Standard_Integer Degree,const Standard_Integer Index,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,Standard_Real& LP) ; //! Copy in poles for Boor scheme.
//! Starting from * , copy
//! poles.
Standard_EXPORT static void BuildBoor(const Standard_Integer Index,const Standard_Integer Length,const Standard_Integer Dimension,const TColStd_Array1OfReal& Poles,Standard_Real& LP) ; //! Returns the index in the Boor result array of the
//! poles . If the Boor algorithm was perform
//! with and .
Standard_EXPORT static Standard_Integer BoorIndex(const Standard_Integer Index,const Standard_Integer Length,const Standard_Integer Depth) ; //! Copy the pole at position in the Boor
//! scheme of dimension to in
//! the array . is updated.
Standard_EXPORT static void GetPole(const Standard_Integer Index,const Standard_Integer Length,const Standard_Integer Depth,const Standard_Integer Dimension,Standard_Real& LocPoles,Standard_Integer& Position,TColStd_Array1OfReal& Pole) ; //! Returns in the new number of poles
//! and knots if the sequence of knots //! AddMults> is inserted in the sequence .
//!
//! Epsilon is used to compare knots for equality.
//!
//! If Add is True the multiplicities on equal knots are
//! added.
//!
//! If Add is False the max value of the multiplicities is
//! kept.
//!
//! Return False if :
//! The knew knots are knot increasing.
//! The new knots are not in the range.
Standard_EXPORT static Standard_Boolean PrepareInsertKnots(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& AddKnots,const TColStd_Array1OfInteger& AddMults,Standard_Integer& NbPoles,Standard_Integer& NbKnots,const Standard_Real Epsilon,const Standard_Boolean Add = Standard_True) ; Standard_EXPORT static void InsertKnots(const Standard_Integer Degree,const Standard_Boolean Periodic,const Standard_Integer Dimension,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& AddKnots,const TColStd_Array1OfInteger& AddMults,TColStd_Array1OfReal& NewPoles,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Epsilon,const Standard_Boolean Add = Standard_True) ; Standard_EXPORT static void InsertKnots(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& AddKnots,const TColStd_Array1OfInteger& AddMults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Epsilon,const Standard_Boolean Add = Standard_True) ; //! Insert a sequence of knots with
//! multiplicities . must be a non
//! decreasing sequence and verifies :
//!
//! Knots(Knots.Lower()) <= AddKnots(AddKnots.Lower())
//! Knots(Knots.Upper()) >= AddKnots(AddKnots.Upper())
//!
//! The NewPoles and NewWeights arrays must have a length :
//! Poles.Length() + Sum(AddMults())
//!
//! When a knot to insert is identic to an existing knot the
//! multiplicities are added.
//!
//! Epsilon is used to test knots for equality.
//!
//! When AddMult is negative or null the knot is not inserted.
//! No multiplicity will becomes higher than the degree.
//!
//! The new Knots and Multiplicities are copied in
//! and .
//!
//! All the New arrays should be correctly dimensioned.
//!
//! When all the new knots are existing knots, i.e. only the
//! multiplicities will change it is safe to use the same
//! arrays as input and output.
Standard_EXPORT static void InsertKnots(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& AddKnots,const TColStd_Array1OfInteger& AddMults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Epsilon,const Standard_Boolean Add = Standard_True) ; Standard_EXPORT static void InsertKnot(const Standard_Integer UIndex,const Standard_Real U,const Standard_Integer UMult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights) ; //! Insert a new knot U of multiplicity UMult in the
//! knot sequence.
//!
//! The location of the new Knot should be given as an input
//! data. UIndex locates the new knot U in the knot sequence
//! and Knots (UIndex) < U < Knots (UIndex + 1).
//!
//! The new control points corresponding to this insertion are
//! returned. Knots and Mults are not updated.
Standard_EXPORT static void InsertKnot(const Standard_Integer UIndex,const Standard_Real U,const Standard_Integer UMult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights) ; Standard_EXPORT static void RaiseMultiplicity(const Standard_Integer KnotIndex,const Standard_Integer Mult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights) ; //! Raise the multiplicity of knot to .
//!
//! The new control points are returned. Knots and Mults are
//! not updated.
Standard_EXPORT static void RaiseMultiplicity(const Standard_Integer KnotIndex,const Standard_Integer Mult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights) ; Standard_EXPORT static Standard_Boolean RemoveKnot(const Standard_Integer Index,const Standard_Integer Mult,const Standard_Integer Degree,const Standard_Boolean Periodic,const Standard_Integer Dimension,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColStd_Array1OfReal& NewPoles,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Tolerance) ; Standard_EXPORT static Standard_Boolean RemoveKnot(const Standard_Integer Index,const Standard_Integer Mult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Tolerance) ; //! Decrement the multiplicity of
//! to . If is null the knot is
//! removed.
//!
//! As there are two ways to compute the new poles
//! the midlle will be used as long as the
//! distance is lower than Tolerance.
//!
//! If a distance is bigger than tolerance the
//! methods returns False and the new arrays are
//! not modified.
//!
//! A low tolerance can be used to test if the
//! knot can be removed without modifying the
//! curve.
//!
//! A high tolerance can be used to "smooth" the
//! curve.
Standard_EXPORT static Standard_Boolean RemoveKnot(const Standard_Integer Index,const Standard_Integer Mult,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,const Standard_Real Tolerance) ; //! Returns the number of knots of a curve with
//! multiplicities after elevating the degree from
//! to . See the IncreaseDegree method
//! for more comments.
Standard_EXPORT static Standard_Integer IncreaseDegreeCountKnots(const Standard_Integer Degree,const Standard_Integer NewDegree,const Standard_Boolean Periodic,const TColStd_Array1OfInteger& Mults) ; Standard_EXPORT static void IncreaseDegree(const Standard_Integer Degree,const Standard_Integer NewDegree,const Standard_Boolean Periodic,const Standard_Integer Dimension,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColStd_Array1OfReal& NewPoles,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults) ; Standard_EXPORT static void IncreaseDegree(const Standard_Integer Degree,const Standard_Integer NewDegree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults) ; Standard_EXPORT static void IncreaseDegree(const Standard_Integer Degree,const Standard_Integer NewDegree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults) ; Standard_EXPORT static void IncreaseDegree(const Standard_Integer NewDegree,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights) ; //! Increase the degree of a bspline (or bezier) curve
//! of dimension form to
//! .
//!
//! The number of poles in the new curve is :
//!
//! Poles.Length() + (NewDegree - Degree) * Number of spans
//!
//! Where the number of spans is :
//!
//! LastUKnotIndex(Mults) - FirstUKnotIndex(Mults) + 1
//!
//! for a non-periodic curve
//!
//! And Knots.Length() - 1 for a periodic curve.
//!
//! The multiplicities of all knots are increased by
//! the degree elevation.
//!
//! The new knots are usually the same knots with the
//! exception of a non-periodic curve with the first
//! and last multiplicity not equal to Degree+1 where
//! knots are removed form the start and the bottom
//! untils the sum of the multiplicities is equal to
//! NewDegree+1 at the knots corresponding to the
//! first and last parameters of the curve.
//!
//! Example : Suppose a curve of degree 3 starting
//! with following knots and multiplicities :
//!
//! knot : 0. 1. 2.
//! mult : 1 2 1
//!
//! The FirstUKnot is 2. because the sum of
//! multiplicities is Degree+1 : 1 + 2 + 1 = 4 = 3 + 1
//!
//! i.e. the first parameter of the curve is 2. and
//! will still be 2. after degree elevation. Let
//! raises this curve to degree 4. The multiplicities
//! are increased by 2.
//!
//! They become 2 3 2. But we need a sum of
//! multiplicities of 5 at knot 2. So the first knot
//! is removed and the new knots are :
//!
//! knot : 1. 2.
//! mult : 3 2
//!
//! The multipicity of the first knot may also be
//! reduced if the sum is still to big.
//!
//! In the most common situations (periodic curve or
//! curve with first and last multiplicities equals to
//! Degree+1) the knots are knot changes.
//!
//! The method IncreaseDegreeCountKnots can be used to
//! compute the new number of knots.\
Standard_EXPORT static void IncreaseDegree(const Standard_Integer NewDegree,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights) ; //! Set in and the number of Knots and
//! Poles of the NotPeriodic Curve identical at the
//! periodic curve with a degree , a
//! knots-distribution with Multiplicities .
Standard_EXPORT static void PrepareUnperiodize(const Standard_Integer Degree,const TColStd_Array1OfInteger& Mults,Standard_Integer& NbKnots,Standard_Integer& NbPoles) ; Standard_EXPORT static void Unperiodize(const Standard_Integer Degree,const Standard_Integer Dimension,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfReal& Poles,TColStd_Array1OfInteger& NewMults,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfReal& NewPoles) ; Standard_EXPORT static void Unperiodize(const Standard_Integer Degree,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& Knots,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,TColStd_Array1OfInteger& NewMults,TColStd_Array1OfReal& NewKnots,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights) ; Standard_EXPORT static void Unperiodize(const Standard_Integer Degree,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& Knots,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,TColStd_Array1OfInteger& NewMults,TColStd_Array1OfReal& NewKnots,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights) ; //! Set in and the number of Knots and
//! Poles of the curve resulting of the trimming of the
//! BSplinecurve definded with , ,
Standard_EXPORT static void PrepareTrimming(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const Standard_Real U1,const Standard_Real U2,Standard_Integer& NbKnots,Standard_Integer& NbPoles) ; Standard_EXPORT static void Trimming(const Standard_Integer Degree,const Standard_Boolean Periodic,const Standard_Integer Dimension,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColStd_Array1OfReal& Poles,const Standard_Real U1,const Standard_Real U2,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,TColStd_Array1OfReal& NewPoles) ; Standard_EXPORT static void Trimming(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const Standard_Real U1,const Standard_Real U2,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,TColgp_Array1OfPnt& NewPoles,TColStd_Array1OfReal& NewWeights) ; Standard_EXPORT static void Trimming(const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const Standard_Real U1,const Standard_Real U2,TColStd_Array1OfReal& NewKnots,TColStd_Array1OfInteger& NewMults,TColgp_Array1OfPnt2d& NewPoles,TColStd_Array1OfReal& NewWeights) ; Standard_EXPORT static void D0(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& P) ; Standard_EXPORT static void D0(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt& P) ; Standard_EXPORT static void D0(const Standard_Real U,const Standard_Integer UIndex,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt2d& P) ; Standard_EXPORT static void D0(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& P) ; Standard_EXPORT static void D0(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& P) ; Standard_EXPORT static void D1(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& P,Standard_Real& V) ; Standard_EXPORT static void D1(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt& P,gp_Vec& V) ; Standard_EXPORT static void D1(const Standard_Real U,const Standard_Integer UIndex,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt2d& P,gp_Vec2d& V) ; Standard_EXPORT static void D1(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& P,gp_Vec& V) ; Standard_EXPORT static void D1(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& P,gp_Vec2d& V) ; Standard_EXPORT static void D2(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& P,Standard_Real& V1,Standard_Real& V2) ; Standard_EXPORT static void D2(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt& P,gp_Vec& V1,gp_Vec& V2) ; Standard_EXPORT static void D2(const Standard_Real U,const Standard_Integer UIndex,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt2d& P,gp_Vec2d& V1,gp_Vec2d& V2) ; Standard_EXPORT static void D2(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& P,gp_Vec& V1,gp_Vec& V2) ; Standard_EXPORT static void D2(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& P,gp_Vec2d& V1,gp_Vec2d& V2) ; Standard_EXPORT static void D3(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& P,Standard_Real& V1,Standard_Real& V2,Standard_Real& V3) ; Standard_EXPORT static void D3(const Standard_Real U,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt& P,gp_Vec& V1,gp_Vec& V2,gp_Vec& V3) ; Standard_EXPORT static void D3(const Standard_Real U,const Standard_Integer UIndex,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Pnt2d& P,gp_Vec2d& V1,gp_Vec2d& V2,gp_Vec2d& V3) ; Standard_EXPORT static void D3(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& P,gp_Vec& V1,gp_Vec& V2,gp_Vec& V3) ; Standard_EXPORT static void D3(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& P,gp_Vec2d& V1,gp_Vec2d& V2,gp_Vec2d& V3) ; Standard_EXPORT static void DN(const Standard_Real U,const Standard_Integer N,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,Standard_Real& VN) ; Standard_EXPORT static void DN(const Standard_Real U,const Standard_Integer N,const Standard_Integer Index,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Vec& VN) ; Standard_EXPORT static void DN(const Standard_Real U,const Standard_Integer N,const Standard_Integer UIndex,const Standard_Integer Degree,const Standard_Boolean Periodic,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& Knots,const TColStd_Array1OfInteger& Mults,gp_Vec2d& V) ; Standard_EXPORT static void DN(const Standard_Real U,const Standard_Integer N,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& P,gp_Vec& VN) ; //! The above functions compute values and
//! derivatives in the following situations :
//!
//! * 3D, 2D and 1D
//!
//! * Rational or not Rational.
//!
//! * Knots and multiplicities or "flat knots" without
//! multiplicities.
//!
//! * The is the the localization of the
//! parameter in the knot sequence. If is out
//! of range the correct value will be searched.
//!
//!
//! VERY IMPORTANT!!!
//! USE BSplCLib::NoWeights() as Weights argument for non
//! rational curves computations.
Standard_EXPORT static void DN(const Standard_Real U,const Standard_Integer N,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& P,gp_Vec2d& VN) ; //! This evaluates the Bspline Basis at a
//! given parameter Parameter up to the
//! requested DerivativeOrder and store the
//! result in the array BsplineBasis in the
//! following fashion
//! BSplineBasis(1,1) =
//! value of first non vanishing
//! Bspline function which has Index FirstNonZeroBsplineIndex
//! BsplineBasis(1,2) =
//! value of second non vanishing
//! Bspline function which has Index
//! FirstNonZeroBsplineIndex + 1
//! BsplineBasis(1,n) =
//! value of second non vanishing non vanishing
//! Bspline function which has Index
//! FirstNonZeroBsplineIndex + n (n <= Order)
//! BSplineBasis(2,1) =
//! value of derivative of first non vanishing
//! Bspline function which has Index FirstNonZeroBsplineIndex
//! BSplineBasis(N,1) =
//! value of Nth derivative of first non vanishing
//! Bspline function which has Index FirstNonZeroBsplineIndex
//! if N <= DerivativeOrder + 1
Standard_EXPORT static Standard_Integer EvalBsplineBasis(const Standard_Integer Side,const Standard_Integer DerivativeOrder,const Standard_Integer Order,const TColStd_Array1OfReal& FlatKnots,const Standard_Real Parameter,Standard_Integer& FirstNonZeroBsplineIndex,math_Matrix& BsplineBasis) ; //! This Builds a fully blown Matrix of
//! (ni)
//! Bi (tj)
//!
//! with i and j within 1..Order + NumPoles
//! The integer ni is the ith slot of the
//! array OrderArray, tj is the jth slot of
//! the array Parameters
Standard_EXPORT static Standard_Integer BuildBSpMatrix(const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& OrderArray,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer Degree,math_Matrix& Matrix,Standard_Integer& UpperBandWidth,Standard_Integer& LowerBandWidth) ; //! this factors the Banded Matrix in
//! the LU form with a Banded storage of
//! components of the L matrix
//! WARNING : do not use if the Matrix is
//! totally positive (It is the case for
//! Bspline matrices build as above with
//! parameters being the Schoenberg points
Standard_EXPORT static Standard_Integer FactorBandedMatrix(math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,Standard_Integer& PivotIndexProblem) ; //! This solves the system Matrix.X = B
//! with when Matrix is factored in LU form
//! The Array is an seen as an
//! Array[1..N][1..ArrayDimension] with N =
//! the rank of the matrix Matrix. The
//! result is stored in Array when each
//! coordinate is solved that is B is the
//! array whose values are
//! B[i] = Array[i][p] for each p in 1..ArrayDimension
Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,const Standard_Integer ArrayDimension,Standard_Real& Array) ; //! This solves the system Matrix.X = B
//! with when Matrix is factored in LU form
//! The Array has the length of
//! the rank of the matrix Matrix. The
//! result is stored in Array when each
//! coordinate is solved that is B is the
//! array whose values are
//! B[i] = Array[i][p] for each p in 1..ArrayDimension
Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,TColgp_Array1OfPnt2d& Array) ; //! This solves the system Matrix.X = B
//! with when Matrix is factored in LU form
//! The Array has the length of
//! the rank of the matrix Matrix. The
//! result is stored in Array when each
//! coordinate is solved that is B is the
//! array whose values are
//! B[i] = Array[i][p] for each p in 1..ArrayDimension
Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,TColgp_Array1OfPnt& Array) ; Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,const Standard_Boolean HomogenousFlag,const Standard_Integer ArrayDimension,Standard_Real& Array,Standard_Real& Weights) ; //! This solves the system Matrix.X = B
//! with when Matrix is factored in LU form
//! The Array is an seen as an
//! Array[1..N][1..ArrayDimension] with N =
//! the rank of the matrix Matrix. The
//! result is stored in Array when each
//! coordinate is solved that is B is the
//! array whose values are B[i] =
//! Array[i][p] for each p in
//! 1..ArrayDimension. If HomogeneousFlag ==
//! 0 the Poles are multiplied by the
//! Weights uppon Entry and once
//! interpolation is carried over the
//! result of the poles are divided by the
//! result of the interpolation of the
//! weights. Otherwise if HomogenousFlag == 1
//! the Poles and Weigths are treated homogenously
//! that is that those are interpolated as they
//! are and result is returned without division
//! by the interpolated weigths.
Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,const Standard_Boolean HomogenousFlag,TColgp_Array1OfPnt2d& Array,TColStd_Array1OfReal& Weights) ; //! This solves the system Matrix.X = B
//! with when Matrix is factored in LU form
//! The Array is an seen as an
//! Array[1..N][1..ArrayDimension] with N =
//! the rank of the matrix Matrix. The
//! result is stored in Array when each
//! coordinate is solved that is B is the
//! array whose values are
//! B[i] = Array[i][p] for each p in 1..ArrayDimension
//! If HomogeneousFlag ==
//! 0 the Poles are multiplied by the
//! Weights uppon Entry and once
//! interpolation is carried over the
//! result of the poles are divided by the
//! result of the interpolation of the
//! weights. Otherwise if HomogenousFlag == 1
//! the Poles and Weigths are treated homogenously
//! that is that those are interpolated as they
//! are and result is returned without division
//! by the interpolated weigths.
Standard_EXPORT static Standard_Integer SolveBandedSystem(const math_Matrix& Matrix,const Standard_Integer UpperBandWidth,const Standard_Integer LowerBandWidth,const Standard_Boolean HomogeneousFlag,TColgp_Array1OfPnt& Array,TColStd_Array1OfReal& Weights) ; //! Merges two knot vector by setting the starting and
//! ending values to StartValue and EndValue
Standard_EXPORT static void MergeBSplineKnots(const Standard_Real Tolerance,const Standard_Real StartValue,const Standard_Real EndValue,const Standard_Integer Degree1,const TColStd_Array1OfReal& Knots1,const TColStd_Array1OfInteger& Mults1,const Standard_Integer Degree2,const TColStd_Array1OfReal& Knots2,const TColStd_Array1OfInteger& Mults2,Standard_Integer& NumPoles,Handle(TColStd_HArray1OfReal)& NewKnots,Handle(TColStd_HArray1OfInteger)& NewMults) ; //! This function will compose a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] with a
//! function a(t) which is assumed to satisfy the
//! following:
Standard_EXPORT static void FunctionReparameterise(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const Standard_Integer PolesDimension,Standard_Real& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,Standard_Real& NewPoles,Standard_Integer& Status) ; //! This function will compose a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] with a
//! function a(t) which is assumed to satisfy the
//! following:
Standard_EXPORT static void FunctionReparameterise(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColStd_Array1OfReal& NewPoles,Standard_Integer& Status) ; //! this will compose a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] with a
//! function a(t) which is assumed to satisfy the
//! following : 1. F(a(t)) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots
//! 2. a(t) defines a differentiable
//! isomorphism between the range of FlatKnots to the range
//! of BSplineFlatKnots which is the
//! same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of F(a(t))
Standard_EXPORT static void FunctionReparameterise(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColgp_Array1OfPnt& NewPoles,Standard_Integer& Status) ; //! this will compose a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] with a
//! function a(t) which is assumed to satisfy the
//! following : 1. F(a(t)) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots
//! 2. a(t) defines a differentiable
//! isomorphism between the range of FlatKnots to the range
//! of BSplineFlatKnots which is the
//! same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of F(a(t))
Standard_EXPORT static void FunctionReparameterise(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColgp_Array1OfPnt2d& NewPoles,Standard_Integer& Status) ; //! this will multiply a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] by a
//! function a(t) which is assumed to satisfy the
//! following : 1. a(t) * F(t) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots 2. the range of a(t)
//! is the same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of a(t)*F(t)
Standard_EXPORT static void FunctionMultiply(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const Standard_Integer PolesDimension,Standard_Real& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,Standard_Real& NewPoles,Standard_Integer& Status) ; //! this will multiply a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] by a
//! function a(t) which is assumed to satisfy the
//! following : 1. a(t) * F(t) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots 2. the range of a(t)
//! is the same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of a(t)*F(t)
Standard_EXPORT static void FunctionMultiply(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColStd_Array1OfReal& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColStd_Array1OfReal& NewPoles,Standard_Integer& Status) ; //! this will multiply a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] by a
//! function a(t) which is assumed to satisfy the
//! following : 1. a(t) * F(t) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots 2. the range of a(t)
//! is the same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of a(t)*F(t)
Standard_EXPORT static void FunctionMultiply(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColgp_Array1OfPnt2d& NewPoles,Standard_Integer& Status) ; //! this will multiply a given Vectorial BSpline F(t)
//! defined by its BSplineDegree and BSplineFlatKnotsl,
//! its Poles array which are coded as an array of Real
//! of the form [1..NumPoles][1..PolesDimension] by a
//! function a(t) which is assumed to satisfy the
//! following : 1. a(t) * F(t) is a polynomial BSpline
//! that can be expressed exactly as a BSpline of degree
//! NewDegree on the knots FlatKnots 2. the range of a(t)
//! is the same as the range of F(t)
//! Warning: it is
//! the caller's responsability to insure that conditions
//! 1. and 2. above are satisfied : no check whatsoever
//! is made in this method
//! Status will return 0 if OK else it will return the pivot index
//! of the matrix that was inverted to compute the multiplied
//! BSpline : the method used is interpolation at Schoenenberg
//! points of a(t)*F(t)
Standard_EXPORT static void FunctionMultiply(const BSplCLib_EvaluatorFunction& Function,const Standard_Integer BSplineDegree,const TColStd_Array1OfReal& BSplineFlatKnots,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer NewDegree,TColgp_Array1OfPnt& NewPoles,Standard_Integer& Status) ; //! Perform the De Boor algorithm to evaluate a point at
//! parameter , with and .
//!
//! Poles is an array of Reals of size
//!
//! * +1
//!
//! Containing the poles. At the end contains
//! the current point. Poles Contain all the poles of
//! the BsplineCurve, Knots also Contains all the knots
//! of the BsplineCurve. ExtrapMode has two slots [0] =
//! Degree used to extrapolate before the first knot [1]
//! = Degre used to extrapolate after the last knot has
//! to be between 1 and Degree
Standard_EXPORT static void Eval(const Standard_Real U,const Standard_Boolean PeriodicFlag,const Standard_Integer DerivativeRequest,Standard_Integer& ExtrapMode,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer ArrayDimension,Standard_Real& Poles,Standard_Real& Result) ; //! Perform the De Boor algorithm to evaluate a point at
//! parameter , with and .
//! Evaluates by multiplying the Poles by the Weights and
//! gives the homogeneous result in PolesResult that is
//! the results of the evaluation of the numerator once it
//! has been multiplied by the weights and in
//! WeightsResult one has the result of the evaluation of
//! the denominator
//!
//! Warning: and must be dimensionned
//! properly.
Standard_EXPORT static void Eval(const Standard_Real U,const Standard_Boolean PeriodicFlag,const Standard_Integer DerivativeRequest,Standard_Integer& ExtrapMode,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer ArrayDimension,Standard_Real& Poles,Standard_Real& Weights,Standard_Real& PolesResult,Standard_Real& WeightsResult) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
Standard_EXPORT static void Eval(const Standard_Real U,const Standard_Boolean PeriodicFlag,const Standard_Boolean HomogeneousFlag,Standard_Integer& ExtrapMode,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,Standard_Real& Weight) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
//!
Standard_EXPORT static void Eval(const Standard_Real U,const Standard_Boolean PeriodicFlag,const Standard_Boolean HomogeneousFlag,Standard_Integer& ExtrapMode,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,Standard_Real& Weight) ; //! Extend a BSpline nD using the tangency map
//! is the coefficient of reparametrisation
//! must be equal to 1, 2 or 3.
//! must be greater or equal than + 1.
//!
//! Warning: and must be dimensionned
//! properly.
Standard_EXPORT static void TangExtendToConstraint(const TColStd_Array1OfReal& FlatKnots,const Standard_Real C1Coefficient,const Standard_Integer NumPoles,Standard_Real& Poles,const Standard_Integer Dimension,const Standard_Integer Degree,const TColStd_Array1OfReal& ConstraintPoint,const Standard_Integer Continuity,const Standard_Boolean After,Standard_Integer& NbPolesResult,Standard_Integer& NbKnotsRsult,Standard_Real& KnotsResult,Standard_Real& PolesResult) ; //! Perform the evaluation of the of the cache
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! this just evaluates the current point
//! the CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effects
Standard_EXPORT static void CacheD0(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! ththe CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effectsis just evaluates the current point
Standard_EXPORT static void CacheD0(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point) ; //! Calls CacheD0 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD0(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point) ; //! Calls CacheD0 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD0(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point) ; //! Perform the evaluation of the of the cache
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! this just evaluates the current point
//! the CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effects
Standard_EXPORT static void CacheD1(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! ththe CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effectsis just evaluates the current point
Standard_EXPORT static void CacheD1(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD1(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD1(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec) ; //! Perform the evaluation of the of the cache
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! this just evaluates the current point
//! the CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effects
Standard_EXPORT static void CacheD2(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec1,gp_Vec& Vec2) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! ththe CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effectsis just evaluates the current point
Standard_EXPORT static void CacheD2(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec1,gp_Vec2d& Vec2) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD2(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec1,gp_Vec& Vec2) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD2(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec1,gp_Vec2d& Vec2) ; //! Perform the evaluation of the of the cache
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! this just evaluates the current point
//! the CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effects
Standard_EXPORT static void CacheD3(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec1,gp_Vec& Vec2,gp_Vec& Vec3) ; //! Perform the evaluation of the Bspline Basis
//! and then multiplies by the weights
//! this just evaluates the current point
//! the parameter must be normalized between
//! the 0 and 1 for the span.
//! The Cache must be valid when calling this
//! routine. Geom Package will insure that.
//! and then multiplies by the weights
//! ththe CacheParameter is where the Cache was
//! constructed the SpanLength is to normalize
//! the polynomial in the cache to avoid bad conditioning
//! effectsis just evaluates the current point
Standard_EXPORT static void CacheD3(const Standard_Real U,const Standard_Integer Degree,const Standard_Real CacheParameter,const Standard_Real SpanLenght,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec1,gp_Vec2d& Vec2,gp_Vec2d& Vec3) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD3(const Standard_Real U,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt& Point,gp_Vec& Vec1,gp_Vec& Vec2,gp_Vec& Vec3) ; //! Calls CacheD1 for Bezier Curves Arrays computed with
//! the method PolesCoefficients.
//! Warning: To be used for Beziercurves ONLY!!!
static void CoefsD3(const Standard_Real U,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,gp_Pnt2d& Point,gp_Vec2d& Vec1,gp_Vec2d& Vec2,gp_Vec2d& Vec3) ; //! Perform the evaluation of the Taylor expansion
//! of the Bspline normalized between 0 and 1.
//! If rational computes the homogeneous Taylor expension
//! for the numerator and stores it in CachePoles
Standard_EXPORT static void BuildCache(const Standard_Real U,const Standard_Real InverseOfSpanDomain,const Standard_Boolean PeriodicFlag,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt& CachePoles,TColStd_Array1OfReal& CacheWeights) ; //! Perform the evaluation of the Taylor expansion
//! of the Bspline normalized between 0 and 1.
//! If rational computes the homogeneous Taylor expension
//! for the numerator and stores it in CachePoles
Standard_EXPORT static void BuildCache(const Standard_Real U,const Standard_Real InverseOfSpanDomain,const Standard_Boolean PeriodicFlag,const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt2d& CachePoles,TColStd_Array1OfReal& CacheWeights) ; static void PolesCoefficients(const TColgp_Array1OfPnt2d& Poles,TColgp_Array1OfPnt2d& CachePoles) ; Standard_EXPORT static void PolesCoefficients(const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt2d& CachePoles,TColStd_Array1OfReal& CacheWeights) ; static void PolesCoefficients(const TColgp_Array1OfPnt& Poles,TColgp_Array1OfPnt& CachePoles) ; //! Encapsulation of BuildCache to perform the
//! evaluation of the Taylor expansion for beziercurves
//! at parameter 0.
//! Warning: To be used for Beziercurves ONLY!!!
Standard_EXPORT static void PolesCoefficients(const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,TColgp_Array1OfPnt& CachePoles,TColStd_Array1OfReal& CacheWeights) ; //! Returns pointer to statically allocated array representing
//! flat knots for bezier curve of the specified degree.
//! Raises OutOfRange if Degree > MaxDegree()
Standard_EXPORT static const Standard_Real& FlatBezierKnots(const Standard_Integer Degree) ; //! builds the Schoenberg points from the flat knot
//! used to interpolate a BSpline since the
//! BSpline matrix is invertible.
Standard_EXPORT static void BuildSchoenbergPoints(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,TColStd_Array1OfReal& Parameters) ; //! Performs the interpolation of the data given in
//! the Poles array according to the requests in
//! ContactOrderArray that is : if
//! ContactOrderArray(i) has value d it means that
//! Poles(i) containes the dth derivative of the
//! function to be interpolated. The length L of the
//! following arrays must be the same :
//! Parameters, ContactOrderArray, Poles,
//! The length of FlatKnots is Degree + L + 1
//! Warning:
//! the method used to do that interpolation is
//! gauss elimination WITHOUT pivoting. Thus if the
//! diagonal is not dominant there is no guarantee
//! that the algorithm will work. Nevertheless for
//! Cubic interpolation or interpolation at Scheonberg
//! points the method will work
//! The InversionProblem will report 0 if there was no
//! problem else it will give the index of the faulty
//! pivot
Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,TColgp_Array1OfPnt& Poles,Standard_Integer& InversionProblem) ; //! Performs the interpolation of the data given in
//! the Poles array according to the requests in
//! ContactOrderArray that is : if
//! ContactOrderArray(i) has value d it means that
//! Poles(i) containes the dth derivative of the
//! function to be interpolated. The length L of the
//! following arrays must be the same :
//! Parameters, ContactOrderArray, Poles,
//! The length of FlatKnots is Degree + L + 1
//! Warning:
//! the method used to do that interpolation is
//! gauss elimination WITHOUT pivoting. Thus if the
//! diagonal is not dominant there is no guarantee
//! that the algorithm will work. Nevertheless for
//! Cubic interpolation at knots or interpolation at Scheonberg
//! points the method will work.
//! The InversionProblem w
//! ll report 0 if there was no
//! problem else it will give the index of the faulty
//! pivot
Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,TColgp_Array1OfPnt2d& Poles,Standard_Integer& InversionProblem) ; //! Performs the interpolation of the data given in
//! the Poles array according to the requests in
//! ContactOrderArray that is : if
//! ContactOrderArray(i) has value d it means that
//! Poles(i) containes the dth derivative of the
//! function to be interpolated. The length L of the
//! following arrays must be the same :
//! Parameters, ContactOrderArray, Poles,
//! The length of FlatKnots is Degree + L + 1
//! Warning:
//! the method used to do that interpolation is
//! gauss elimination WITHOUT pivoting. Thus if the
//! diagonal is not dominant there is no guarantee
//! that the algorithm will work. Nevertheless for
//! Cubic interpolation at knots or interpolation at Scheonberg
//! points the method will work.
//! The InversionProblem will report 0 if there was no
//! problem else it will give the index of the faulty
//! pivot
//!
//!
Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,TColgp_Array1OfPnt& Poles,TColStd_Array1OfReal& Weights,Standard_Integer& InversionProblem) ; //! Performs the interpolation of the data given in
//! the Poles array according to the requests in
//! ContactOrderArray that is : if
//! ContactOrderArray(i) has value d it means that
//! Poles(i) containes the dth derivative of the
//! function to be interpolated. The length L of the
//! following arrays must be the same :
//! Parameters, ContactOrderArray, Poles,
//! The length of FlatKnots is Degree + L + 1
//! Warning:
//! the method used to do that interpolation is
//! gauss elimination WITHOUT pivoting. Thus if the
//! diagonal is not dominant there is no guarantee
//! that the algorithm will work. Nevertheless for
//! Cubic interpolation at knots or interpolation at Scheonberg
//! points the method will work.
//! The InversionProblem w
//! ll report 0 if there was no
//! problem else it will give the i
Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,TColgp_Array1OfPnt2d& Poles,TColStd_Array1OfReal& Weights,Standard_Integer& InversionProblem) ; //! Performs the interpolation of the data given in
//! the Poles array according to the requests in
//! ContactOrderArray that is : if
//! ContactOrderArray(i) has value d it means that
//! Poles(i) containes the dth derivative of the
//! function to be interpolated. The length L of the
//! following arrays must be the same :
//! Parameters, ContactOrderArray
//! The length of FlatKnots is Degree + L + 1
//! The PolesArray is an seen as an
//! Array[1..N][1..ArrayDimension] with N = tge length
//! of the parameters array
//! Warning:
//! the method used to do that interpolation is
//! gauss elimination WITHOUT pivoting. Thus if the
//! diagonal is not dominant there is no guarantee
//! that the algorithm will work. Nevertheless for
//! Cubic interpolation or interpolation at Scheonberg
//! points the method will work
//! The InversionProblem will report 0 if there was no
//! problem else it will give the index of the faulty
//! pivot
//!
Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,const Standard_Integer ArrayDimension,Standard_Real& Poles,Standard_Integer& InversionProblem) ; Standard_EXPORT static void Interpolate(const Standard_Integer Degree,const TColStd_Array1OfReal& FlatKnots,const TColStd_Array1OfReal& Parameters,const TColStd_Array1OfInteger& ContactOrderArray,const Standard_Integer ArrayDimension,Standard_Real& Poles,Standard_Real& Weights,Standard_Integer& InversionProblem) ; //! Find the new poles which allows an old point (with a
//! given u as parameter) to reach a new position
//! Index1 and Index2 indicate the range of poles we can move
//! (1, NbPoles-1) or (2, NbPoles) -> no constraint for one side
//! don't enter (1,NbPoles) -> error: rigid move
//! (2, NbPoles-1) -> the ends are enforced
//! (3, NbPoles-2) -> the ends and the tangency are enforced
//! if Problem in BSplineBasis calculation, no change for the curve
//! and FirstIndex, LastIndex = 0
Standard_EXPORT static void MovePoint(const Standard_Real U,const gp_Vec2d& Displ,const Standard_Integer Index1,const Standard_Integer Index2,const Standard_Integer Degree,const Standard_Boolean Rational,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,Standard_Integer& FirstIndex,Standard_Integer& LastIndex,TColgp_Array1OfPnt2d& NewPoles) ; //! Find the new poles which allows an old point (with a
//! given u as parameter) to reach a new position
//! Index1 and Index2 indicate the range of poles we can move
//! (1, NbPoles-1) or (2, NbPoles) -> no constraint for one side
//! don't enter (1,NbPoles) -> error: rigid move
//! (2, NbPoles-1) -> the ends are enforced
//! (3, NbPoles-2) -> the ends and the tangency are enforced
//! if Problem in BSplineBasis calculation, no change for the curve
//! and FirstIndex, LastIndex = 0
Standard_EXPORT static void MovePoint(const Standard_Real U,const gp_Vec& Displ,const Standard_Integer Index1,const Standard_Integer Index2,const Standard_Integer Degree,const Standard_Boolean Rational,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,Standard_Integer& FirstIndex,Standard_Integer& LastIndex,TColgp_Array1OfPnt& NewPoles) ; //! This is the dimension free version of the utility
//! U is the parameter must be within the first FlatKnots and the
//! last FlatKnots Delta is the amount the curve has to be moved
//! DeltaDerivative is the amount the derivative has to be moved.
//! Delta and DeltaDerivative must be array of dimension
//! ArrayDimension Degree is the degree of the BSpline and the
//! FlatKnots are the knots of the BSpline Starting Condition if =
//! -1 means the starting point of the curve can move
//! = 0 means the
//! starting point of the cuve cannot move but tangen starting
//! point of the curve cannot move
//! = 1 means the starting point and tangents cannot move
//! = 2 means the starting point tangent and curvature cannot move
//! = ...
//! Same holds for EndingCondition
//! Poles are the poles of the curve
//! Weights are the weights of the curve if Rational = Standard_True
//! NewPoles are the poles of the deformed curve
//! ErrorStatus will be 0 if no error happened
//! 1 if there are not enough knots/poles
//! the imposed conditions
//! The way to solve this problem is to add knots to the BSpline
//! If StartCondition = 1 and EndCondition = 1 then you need at least
//! 4 + 2 = 6 poles so for example to have a C1 cubic you will need
//! have at least 2 internal knots.
Standard_EXPORT static void MovePointAndTangent(const Standard_Real U,const Standard_Integer ArrayDimension,Standard_Real& Delta,Standard_Real& DeltaDerivative,const Standard_Real Tolerance,const Standard_Integer Degree,const Standard_Boolean Rational,const Standard_Integer StartingCondition,const Standard_Integer EndingCondition,Standard_Real& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,Standard_Real& NewPoles,Standard_Integer& ErrorStatus) ; //! This is the dimension free version of the utility
//! U is the parameter must be within the first FlatKnots and the
//! last FlatKnots Delta is the amount the curve has to be moved
//! DeltaDerivative is the amount the derivative has to be moved.
//! Delta and DeltaDerivative must be array of dimension
//! ArrayDimension Degree is the degree of the BSpline and the
//! FlatKnots are the knots of the BSpline Starting Condition if =
//! -1 means the starting point of the curve can move
//! = 0 means the
//! starting point of the cuve cannot move but tangen starting
//! point of the curve cannot move
//! = 1 means the starting point and tangents cannot move
//! = 2 means the starting point tangent and curvature cannot move
//! = ...
//! Same holds for EndingCondition
//! Poles are the poles of the curve
//! Weights are the weights of the curve if Rational = Standard_True
//! NewPoles are the poles of the deformed curve
//! ErrorStatus will be 0 if no error happened
//! 1 if there are not enough knots/poles
//! the imposed conditions
//! The way to solve this problem is to add knots to the BSpline
//! If StartCondition = 1 and EndCondition = 1 then you need at least
//! 4 + 2 = 6 poles so for example to have a C1 cubic you will need
//! have at least 2 internal knots.
Standard_EXPORT static void MovePointAndTangent(const Standard_Real U,const gp_Vec& Delta,const gp_Vec& DeltaDerivative,const Standard_Real Tolerance,const Standard_Integer Degree,const Standard_Boolean Rational,const Standard_Integer StartingCondition,const Standard_Integer EndingCondition,const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,TColgp_Array1OfPnt& NewPoles,Standard_Integer& ErrorStatus) ; //! This is the dimension free version of the utility
//! U is the parameter must be within the first FlatKnots and the
//! last FlatKnots Delta is the amount the curve has to be moved
//! DeltaDerivative is the amount the derivative has to be moved.
//! Delta and DeltaDerivative must be array of dimension
//! ArrayDimension Degree is the degree of the BSpline and the
//! FlatKnots are the knots of the BSpline Starting Condition if =
//! -1 means the starting point of the curve can move
//! = 0 means the
//! starting point of the cuve cannot move but tangen starting
//! point of the curve cannot move
//! = 1 means the starting point and tangents cannot move
//! = 2 means the starting point tangent and curvature cannot move
//! = ...
//! Same holds for EndingCondition
//! Poles are the poles of the curve
//! Weights are the weights of the curve if Rational = Standard_True
//! NewPoles are the poles of the deformed curve
//! ErrorStatus will be 0 if no error happened
//! 1 if there are not enough knots/poles
//! the imposed conditions
//! The way to solve this problem is to add knots to the BSpline
//! If StartCondition = 1 and EndCondition = 1 then you need at least
//! 4 + 2 = 6 poles so for example to have a C1 cubic you will need
//! have at least 2 internal knots.
Standard_EXPORT static void MovePointAndTangent(const Standard_Real U,const gp_Vec2d& Delta,const gp_Vec2d& DeltaDerivative,const Standard_Real Tolerance,const Standard_Integer Degree,const Standard_Boolean Rational,const Standard_Integer StartingCondition,const Standard_Integer EndingCondition,const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,TColgp_Array1OfPnt2d& NewPoles,Standard_Integer& ErrorStatus) ; //! given a tolerance in 3D space returns a
//! tolerance in U parameter space such that
//! all u1 and u0 in the domain of the curve f(u)
//! | u1 - u0 | < UTolerance and
//! we have |f (u1) - f (u0)| < Tolerance3D
Standard_EXPORT static void Resolution(Standard_Real& PolesArray,const Standard_Integer ArrayDimension,const Standard_Integer NumPoles,const TColStd_Array1OfReal& Weights,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer Degree,const Standard_Real Tolerance3D,Standard_Real& UTolerance) ; //! given a tolerance in 3D space returns a
//! tolerance in U parameter space such that
//! all u1 and u0 in the domain of the curve f(u)
//! | u1 - u0 | < UTolerance and
//! we have |f (u1) - f (u0)| < Tolerance3D
Standard_EXPORT static void Resolution(const TColgp_Array1OfPnt& Poles,const TColStd_Array1OfReal& Weights,const Standard_Integer NumPoles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer Degree,const Standard_Real Tolerance3D,Standard_Real& UTolerance) ; //! given a tolerance in 3D space returns a
//! tolerance in U parameter space such that
//! all u1 and u0 in the domain of the curve f(u)
//! | u1 - u0 | < UTolerance and
//! we have |f (u1) - f (u0)| < Tolerance3D
Standard_EXPORT static void Resolution(const TColgp_Array1OfPnt2d& Poles,const TColStd_Array1OfReal& Weights,const Standard_Integer NumPoles,const TColStd_Array1OfReal& FlatKnots,const Standard_Integer Degree,const Standard_Real Tolerance3D,Standard_Real& UTolerance) ; protected: private: Standard_EXPORT static void LocateParameter(const TColStd_Array1OfReal& Knots,const Standard_Real U,const Standard_Boolean Periodic,const Standard_Integer K1,const Standard_Integer K2,Standard_Integer& Index,Standard_Real& NewU,const Standard_Real Uf,const Standard_Real Ue) ; }; #include // other Inline functions and methods (like "C++: function call" methods) #endif