-// File GeomConvert.cxx
+// Copyright (c) 1995-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 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.
+
// Jean-Claude Vauthier Novembre 1991
// Passage sur C1 Aout 1992 et ajout transformation Bezier->BSpline + Debug
// Modif JCV correction bug le 2/08/1993
//=======================================================================
-//function : law_evaluator
+//class : law_evaluator
//purpose : usefull to estimate the value of a function
//=======================================================================
-static Handle(Geom2d_BSplineCurve) Ancore = NULL ;
-
-static void law_evaluator(const Standard_Integer DerivativeRequest,
- const Standard_Real *StartEnd,
- const Standard_Real Parameter,
- Standard_Real & Result,
- Standard_Integer & ErrorCode)
-{ErrorCode = 0 ;
- if (!Ancore.IsNull() &&
- Parameter >= StartEnd[0] &&
- Parameter <= StartEnd[1] &&
- DerivativeRequest == 0){
- gp_Pnt2d a_point ;
- Ancore->D0(Parameter,
- a_point) ;
- Result = a_point.Coord(2) ;
- }
- else
- ErrorCode = 1 ;
-}
+class GeomConvert_law_evaluator : public BSplCLib_EvaluatorFunction
+{
+
+public:
+
+ GeomConvert_law_evaluator (const Handle(Geom2d_BSplineCurve)& theAncore)
+ : myAncore (theAncore) {}
+
+ virtual void Evaluate (const Standard_Integer theDerivativeRequest,
+ const Standard_Real* theStartEnd,
+ const Standard_Real theParameter,
+ Standard_Real& theResult,
+ Standard_Integer& theErrorCode) const
+ {
+ theErrorCode = 0;
+ if (!myAncore.IsNull() &&
+ theParameter >= theStartEnd[0] &&
+ theParameter <= theStartEnd[1] &&
+ theDerivativeRequest == 0)
+ {
+ gp_Pnt2d aPoint;
+ myAncore->D0 (theParameter, aPoint);
+ theResult = aPoint.Coord(2);
+ }
+ else
+ theErrorCode = 1;
+ }
+
+private:
+
+ Handle(Geom2d_BSplineCurve) myAncore;
+
+};
//=======================================================================
//function : MultNumandDenom
a->Poles(aPoles);
a->Multiplicities(aMults);
BSplCLib::Reparametrize(BS->FirstParameter(),BS->LastParameter(),aKnots);
- Ancore= new Geom2d_BSplineCurve(aPoles,aKnots,aMults,a->Degree()); //call of the law-evaluator
+ Handle(Geom2d_BSplineCurve) anAncore = new Geom2d_BSplineCurve (aPoles, aKnots, aMults, a->Degree());
BSplCLib::MergeBSplineKnots(tolerance,start_value,end_value, //merge of the knots
a->Degree(),aKnots,aMults,
for (jj=1;jj<=3;jj++)
BSPoles(ii).SetCoord(jj,BSPoles(ii).Coord(jj)*BSWeights(ii));
//POP pour WNT
- BSplCLib_EvaluatorFunction ev = law_evaluator;
-
+ GeomConvert_law_evaluator ev (anAncore);
+
BSplCLib::FunctionMultiply(ev,
BS->Degree(),
BSFlatKnots,
}
//=======================================================================
-//function :reparameterise_evaluator
-//purpose :
+//class : reparameterise_evaluator
+//purpose :
//=======================================================================
-static Standard_Real polynomial_coefficient[3] ;
-
-static void reparameterise_evaluator(
- const Standard_Integer DerivativeRequest,
-// const Standard_Real *StartEnd,
- const Standard_Real *,
- const Standard_Real Parameter,
- Standard_Real & Result,
- Standard_Integer & ErrorCode) {
- ErrorCode = 0 ;
- PLib::EvalPolynomial(Parameter,
- DerivativeRequest,
- 2,
- 1,
- polynomial_coefficient[0],
- Result) ;
-}
+class GeomConvert_reparameterise_evaluator : public BSplCLib_EvaluatorFunction
+{
+
+public:
+
+ GeomConvert_reparameterise_evaluator (const Standard_Real thePolynomialCoefficient[3])
+ {
+ memcpy (myPolynomialCoefficient, thePolynomialCoefficient, sizeof(myPolynomialCoefficient));
+ }
+
+ virtual void Evaluate (const Standard_Integer theDerivativeRequest,
+ const Standard_Real* /*theStartEnd*/,
+ const Standard_Real theParameter,
+ Standard_Real& theResult,
+ Standard_Integer& theErrorCode) const
+ {
+ theErrorCode = 0;
+ PLib::EvalPolynomial (theParameter,
+ theDerivativeRequest,
+ 2,
+ 1,
+ *((Standard_Real* )myPolynomialCoefficient), // function really only read values from this array
+ theResult);
+ }
+
+private:
+
+ Standard_Real myPolynomialCoefficient[3];
+
+};
//=======================================================================
//function : ConcatG1
index=0;
Pretreatment(ArrayOfCurves);
+ Standard_Real aPolynomialCoefficient[3];
if ((nb_group==1) && (ClosedG1Flag)){ //treatment of a particular case
indexmin=Indexmin(ArrayOfCurves);
umin=Curve1->FirstParameter(),umax=Curve1->LastParameter();
tmax=2*lambda*(umax-umin)/(1+lambda*lambda2);
a=(lambda*lambda2-1)/(2*lambda*tmax);
- polynomial_coefficient[2]=a;
+ aPolynomialCoefficient[2] = a;
b=(1/lambda);
- polynomial_coefficient[1]=b;
+ aPolynomialCoefficient[1] = b;
c=umin;
- polynomial_coefficient[0]=c;
+ aPolynomialCoefficient[0] = c;
TColStd_Array1OfReal Curve1FlatKnots(1,Curve1->NbPoles()+Curve1->Degree()+1);
TColStd_Array1OfInteger KnotC1Mults(1,Curve1->NbKnots());
Curve1->Multiplicities(KnotC1Mults);
for (jj=1;jj<=3;jj++)
Curve1Poles(ii).SetCoord(jj,Curve1Poles(ii).Coord(jj)*Curve1Weights(ii));
//POP pour WNT
- BSplCLib_EvaluatorFunction ev = reparameterise_evaluator;
+ GeomConvert_reparameterise_evaluator ev (aPolynomialCoefficient);
// BSplCLib::FunctionReparameterise(reparameterise_evaluator,
BSplCLib::FunctionReparameterise(ev,
Curve1->Degree(),
Standard_ConstructionError::Raise("GeomConvert Concatenation Error") ;
Curve2=C.BSplineCurve();
}
- Standard_Boolean rm;
Curve2->SetPeriodic();
- rm=Curve2->RemoveKnot(Curve2->LastUKnotIndex(),
+ Curve2->RemoveKnot(Curve2->LastUKnotIndex(),
Curve2->Multiplicity(Curve2->LastUKnotIndex())-1,
Precision::Confusion());
ArrayOfConcatenated->SetValue(0,Curve2);
Standard_Integer k=0;
index=0;
Pretreatment(ArrayOfCurves);
+ Standard_Real aPolynomialCoefficient[3];
if ((nb_group==1) && (ClosedG1Flag)){ //treatment of a particular case
ArrayOfIndices->SetValue(0,0);
umin=Curve1->FirstParameter(),umax=Curve1->LastParameter();
tmax=2*lambda*(umax-umin)/(1+lambda*lambda2);
a=(lambda*lambda2-1)/(2*lambda*tmax);
- polynomial_coefficient[2]=a;
+ aPolynomialCoefficient[2] = a;
b=(1/lambda);
- polynomial_coefficient[1]=b;
+ aPolynomialCoefficient[1] = b;
c=umin;
- polynomial_coefficient[0]=c;
+ aPolynomialCoefficient[0] = c;
TColStd_Array1OfReal Curve1FlatKnots(1,Curve1->NbPoles()+Curve1->Degree()+1);
TColStd_Array1OfInteger KnotC1Mults(1,Curve1->NbKnots());
Curve1->Multiplicities(KnotC1Mults);
for (jj=1;jj<=3;jj++)
Curve1Poles(ii).SetCoord(jj,Curve1Poles(ii).Coord(jj)*Curve1Weights(ii));
//POP pour WNT
- BSplCLib_EvaluatorFunction ev = reparameterise_evaluator;
+ GeomConvert_reparameterise_evaluator ev (aPolynomialCoefficient);
BSplCLib::FunctionReparameterise(ev,
Curve1->Degree(),
Curve2=C.BSplineCurve();
}
}
- Standard_Boolean rm;
Curve2->SetPeriodic(); //only one C1 curve
- rm=Curve2->RemoveKnot(Curve2->LastUKnotIndex(),
+ Curve2->RemoveKnot(Curve2->LastUKnotIndex(),
Curve2->Multiplicity(Curve2->LastUKnotIndex())-1,
Precision::Confusion());
ArrayOfConcatenated->SetValue(0,Curve2);