0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / BSplCLib / BSplCLib.hxx
diff --git a/src/BSplCLib/BSplCLib.hxx b/src/BSplCLib/BSplCLib.hxx
new file mode 100644 (file)
index 0000000..57936d9
--- /dev/null
@@ -0,0 +1,1484 @@
+// Created on: 1991-08-09
+// Created by: Jean Claude VAUTHIER
+// Copyright (c) 1991-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BSplCLib_HeaderFile
+#define _BSplCLib_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Handle.hxx>
+
+#include <TColStd_Array1OfReal.hxx>
+#include <Standard_Real.hxx>
+#include <Standard_Integer.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <Standard_Boolean.hxx>
+#include <BSplCLib_KnotDistribution.hxx>
+#include <BSplCLib_MultDistribution.hxx>
+#include <GeomAbs_BSplKnotDistribution.hxx>
+#include <TColgp_Array1OfPnt.hxx>
+#include <TColgp_Array1OfPnt2d.hxx>
+#include <TColStd_HArray1OfReal.hxx>
+#include <TColStd_HArray1OfInteger.hxx>
+#include <BSplCLib_EvaluatorFunction.hxx>
+#include <TColStd_Array2OfReal.hxx>
+class gp_Pnt;
+class gp_Pnt2d;
+class gp_Vec;
+class gp_Vec2d;
+class math_Matrix;
+
+
+//! 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
+//!
+//! Warnings :
+//! The bounds of Poles and Weights should be the same.
+//! The bounds of Knots and Mults   should be the same.
+//!
+//! Weights can be a null reference (BSplCLib::NoWeights())
+//! the curve is non rational.
+//!
+//! Mults can be a null reference   (BSplCLib::NoMults())
+//! the knots are "flat" knots.
+//!
+//! KeyWords :
+//! B-spline curve, Functions, Library
+//!
+//! References :
+//! . A survey of curves and surfaces methods in CADG Wolfgang
+//! BOHM CAGD 1 (1984)
+//! . On de Boor-like algorithms and blossoming Wolfgang BOEHM
+//! cagd 5 (1988)
+//! . Blossoming and knot insertion algorithms for B-spline curves
+//! Ronald N. GOLDMAN
+//! . Modelisation des surfaces en CAO, Henri GIAUME Peugeot SA
+//! . Curves and Surfaces for Computer Aided Geometric Design,
+//! a practical guide Gerald Farin
+class BSplCLib 
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  
+  //! 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  <Index> in  the  knots sequence
+  //! which multiplicities are <Mults>.
+  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, const Standard_Boolean Periodic = Standard_False);
+  
+  //! 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 <Knots> and  <Mults> 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 <Knots>.
+  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);
+  
+  //! Analyzes the array of knots.
+  //! Returns the form and the maximum knot multiplicity.
+  Standard_EXPORT static void KnotAnalysis (const Standard_Integer Degree, const Standard_Boolean Periodic, const TColStd_Array1OfReal& CKnots, const TColStd_Array1OfInteger& CMults, GeomAbs_BSplKnotDistribution& KnotForm, Standard_Integer& MaxKnotMult);
+  
+
+  //! 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 <Weights>
+  //! 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 <U>, with <Degree> and <Dimension>.
+  //!
+  //! Poles is  an array of  Reals of size
+  //!
+  //! <Dimension> *  <Degree>+1
+  //!
+  //! Containing  the poles.  At  the end <Poles> 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 <U> with
+  //! the given <Degree> and the  array of <Knots> on  the
+  //! poles <Poles> of dimension  <Dimension>.  The schema
+  //! is  computed  until  level  <Depth>  on a   basis of
+  //! <Length+1> poles.
+  //!
+  //! * Knots is an array of reals of length :
+  //!
+  //! <Length> + <Degree>
+  //!
+  //! * Poles is an array of reals of length :
+  //!
+  //! (2 * <Length> + 1) * <Dimension>
+  //!
+  //! 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 <Tolerance> 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 <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 <U>. This
+  //! algorithm computes the value and all the derivatives
+  //! up to order N (N <= Degree).
+  //!
+  //! <Poles> is the original array of poles.
+  //!
+  //! The   result in  <Poles>  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 <LP>  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 <LP>  poles for <Dimension>  Boor  scheme.
+  //! Starting  from    <Index>     *  <Dimension>, copy
+  //! <Length+1> 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 <Index>. If  the Boor  algorithm was perform
+  //! with <Length> and <Depth>.
+  Standard_EXPORT static Standard_Integer BoorIndex (const Standard_Integer Index, const Standard_Integer Length, const Standard_Integer Depth);
+  
+  //! Copy  the  pole at  position  <Index>  in  the Boor
+  //! scheme of   dimension <Dimension> to  <Position> in
+  //! the array <Pole>. <Position> 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 <NbPoles, NbKnots> the  new number of poles
+  //! and  knots    if  the  sequence   of  knots <AddKnots,
+  //! AddMults> is inserted in the sequence <Knots, Mults>.
+  //!
+  //! 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 <AddKnots> with
+  //! multiplicities   <AddMults>. <AddKnots>   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 <NewKnots>
+  //! and  <NewMults>.
+  //!
+  //! 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 <UMult>.
+  //!
+  //! 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 <Knots(Index)>
+  //! to <Mult>. If <Mult>   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 <Mults> after elevating the degree from
+  //! <Degree> to <NewDegree>. 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  <Dimension>  form <Degree>      to
+  //! <NewDegree>.
+  //!
+  //! 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 <NbKnots> and <NbPolesToAdd> the number of Knots and
+  //! Poles   of  the NotPeriodic  Curve   identical  at the
+  //! periodic     curve with    a  degree    <Degree>  ,  a
+  //! knots-distribution with Multiplicities <Mults>.
+  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 <NbKnots> and <NbPoles> the number of Knots and
+  //! Poles of the  curve resulting  of  the trimming of the
+  //! BSplinecurve definded with <degree>, <knots>, <mults>
+  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  <Index>  is   the the  localization  of  the
+  //! parameter in the knot sequence.  If <Index> 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, const Standard_Boolean isPeriodic = Standard_False);
+  
+  //! 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:
+  //!
+  //! 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 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:
+  //!
+  //! 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 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 <U>, with <Degree> and <Dimension>.
+  //!
+  //! Poles is  an array of  Reals of size
+  //!
+  //! <Dimension> *  <Degree>+1
+  //!
+  //! Containing the  poles.  At  the end <Poles> 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   <U>,  with   <Degree>    and  <Dimension>.
+  //! 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:   <PolesResult> and <WeightsResult>  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
+  //! <C1Coefficient> is the coefficient of reparametrisation
+  //! <Continuity> must be equal to 1, 2 or 3.
+  //! <Degree> must be greater or equal than <Continuity> + 1.
+  //!
+  //! Warning:   <KnotsResult> and <PolesResult>  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);
+  
+  //! Perform the evaluation of the Taylor expansion
+  //! of the Bspline normalized between 0 and 1.
+  //! Structure of result optimized for BSplCLib_Cache.
+  Standard_EXPORT static void BuildCache (const Standard_Real theParameter, const Standard_Real theSpanDomain, const Standard_Boolean thePeriodicFlag, const Standard_Integer theDegree, const TColStd_Array1OfReal& theFlatKnots, const TColgp_Array1OfPnt& thePoles, const TColStd_Array1OfReal& theWeights, TColStd_Array2OfReal& theCacheArray);
+  
+  //! Perform the evaluation of the Taylor expansion
+  //! of the Bspline normalized between 0 and 1.
+  //! Structure of result optimized for BSplCLib_Cache.
+  Standard_EXPORT static void BuildCache (const Standard_Real theParameter, const Standard_Real theSpanDomain, const Standard_Boolean thePeriodicFlag, const Standard_Integer theDegree, const TColStd_Array1OfReal& theFlatKnots, const TColgp_Array1OfPnt2d& thePoles, const TColStd_Array1OfReal& theWeights, TColStd_Array2OfReal& theCacheArray);
+  
+    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 <BSplCLib.lxx>
+
+
+
+
+
+#endif // _BSplCLib_HeaderFile