1 // Created on: 1993-10-20
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // modified 25/06/1996 PMN : Ajout d'une tolerance Angulaire dans le
18 // constructeur pour le test de continuite G1 (1 Radians c'etait trop
20 //rln 20.06.99 work-around
22 #include <BSplCLib.hxx>
24 #include <gp_Pnt2d.hxx>
25 #include <gp_Vec2d.hxx>
27 #include <Precision.hxx>
28 #include <ShapeConstruct_CompBezierCurves2dToBSplineCurve2d.hxx>
29 #include <Standard_ConstructionError.hxx>
30 #include <TColgp_HArray1OfPnt2d.hxx>
32 //=======================================================================
33 //function : ShapeConstruct_CompBezierCurves2dToBSplineCurve2d
35 //=======================================================================
36 ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::
37 ShapeConstruct_CompBezierCurves2dToBSplineCurve2d(
38 const Standard_Real AngularTolerance) :
39 myAngular(AngularTolerance),
40 myDone(Standard_False)
45 //=======================================================================
48 //=======================================================================
50 void ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::AddCurve
51 (const TColgp_Array1OfPnt2d& Poles)
53 if ( !mySequence.IsEmpty()) {
55 P1 = mySequence.Last()->Value(mySequence.Last()->Upper());
56 P2 = Poles(Poles.Lower());
58 // User defined tolerance NYI
59 // Standard_ConstructionError_Raise_if
60 // ( !P1.IsEqual(P2,Precision::Confusion()),
61 // "ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::Addcurve");
64 myDone = Standard_False;
65 Handle(TColgp_HArray1OfPnt2d) HPoles =
66 new TColgp_HArray1OfPnt2d(Poles.Lower(),Poles.Upper());
67 HPoles->ChangeArray1() = Poles;
68 mySequence.Append(HPoles);
72 //=======================================================================
75 //=======================================================================
77 Standard_Integer ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::Degree()
83 //=======================================================================
86 //=======================================================================
88 Standard_Integer ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::NbPoles()
90 return CurvePoles.Length();
94 //=======================================================================
97 //=======================================================================
99 void ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::Poles
100 (TColgp_Array1OfPnt2d& Poles) const
102 Standard_Integer i, Lower = Poles.Lower(), Upper = Poles.Upper();
103 Standard_Integer k = 1;
104 for (i = Lower; i <= Upper; i++) {
105 Poles(i) = CurvePoles(k++);
110 //=======================================================================
113 //=======================================================================
115 Standard_Integer ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::NbKnots()
117 return CurveKnots.Length();
121 //=======================================================================
122 //function : KnotsAndMults
124 //=======================================================================
126 void ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::KnotsAndMults
127 (TColStd_Array1OfReal& Knots,
128 TColStd_Array1OfInteger& Mults ) const
130 Standard_Integer i, LowerK = Knots.Lower(), UpperK = Knots.Upper();
131 Standard_Integer LowerM = Mults.Lower(), UpperM = Mults.Upper();
132 Standard_Integer k = 1;
133 for (i = LowerK; i <= UpperK; i++) {
134 Knots(i) = CurveKnots(k++);
137 for (i = LowerM; i <= UpperM; i++) {
138 Mults(i) = KnotsMultiplicities(k++);
146 //=======================================================================
149 //=======================================================================
151 void ShapeConstruct_CompBezierCurves2dToBSplineCurve2d::Perform()
153 myDone = Standard_True;
156 KnotsMultiplicities.Clear();
157 Standard_Integer LowerI = 1;
158 Standard_Integer UpperI = mySequence.Length();
159 Standard_Integer NbrCurv = UpperI-LowerI+1;
160 TColStd_Array1OfReal CurveKnVals (1,NbrCurv);
164 for ( i = 1; i <= mySequence.Length(); i++) {
165 myDegree = Max( myDegree, (mySequence(i))->Length() -1);
168 Standard_Real D1, D2, Lambda, Det=0.;
170 Standard_Integer Deg, Inc, MaxDegree = myDegree;
171 TColgp_Array1OfPnt2d Points(1, myDegree+1);
173 for (i = LowerI ; i <= UpperI ; i++) {
174 // 1- Elever la courbe de Bezier au degre maximum.
175 Deg = mySequence(i)->Length()-1;
176 Inc = myDegree - Deg;
178 BSplCLib::IncreaseDegree(myDegree,
179 mySequence(i)->Array1(), BSplCLib::NoWeights(),
180 Points, BSplCLib::NoWeights());
183 Points = mySequence(i)->Array1();
186 // 2- Traiter le noeud de jonction entre 2 courbes de Bezier.
188 // Traitement du noeud initial de la BSpline.
189 for (Standard_Integer j = 1 ; j <= MaxDegree ; j++) {
190 CurvePoles.Append(Points(j));
192 CurveKnVals(1) = 1.; // Pour amorcer la serie.
193 KnotsMultiplicities.Append(MaxDegree+1);
201 gp_Vec2d V1(P1, P2), V2(P2, P3);
202 D1 = P1.SquareDistance(P2);
203 D2 = P3.SquareDistance(P2);
204 Lambda = Sqrt(D2/D1);
207 // Traitement de la tangence entre la Bezier et sa precedente.
208 // Ceci permet d''assurer au moins une continuite C1 si
209 // les tangentes sont coherentes.
212 // Test de l'angle a myAngular
214 if (V1.Magnitude() > gp::Resolution() &&
215 V2.Magnitude() > gp::Resolution() &&
216 V1.IsParallel(V2, myAngular) &&
217 MaxDegree > 1) {//rln 20.06.99 work-around
218 KnotsMultiplicities.Append(MaxDegree-1);
219 CurveKnVals(i) = CurveKnVals(i-1) * Lambda;
220 Det += CurveKnVals(i);
224 CurveKnVals(i) = 1.0e0 ;
225 Det += CurveKnVals(i) ;
226 CurvePoles.Append(Points(1));
227 KnotsMultiplicities.Append(MaxDegree);
230 // Stocker les poles.
231 for (Standard_Integer j = 2 ; j <= MaxDegree ; j++) {
232 CurvePoles.Append(Points(j));
239 // Traitement du noeud terminal de la BSpline.
240 CurvePoles.Append(Points(MaxDegree+1));
241 KnotsMultiplicities.Append(MaxDegree+1);
243 P1 = Points(MaxDegree);
246 // Corriger les valeurs nodales pour les faire varier dans [0.,1.].
247 CurveKnots.Append(0.0);
248 for (i = 2 ; i <= NbrCurv ; i++) {
249 CurveKnots.Append(CurveKnots(i-1) + (CurveKnVals(i-1)/Det));
251 CurveKnots.Append(1.0);