1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and / or modify it
7 // under the terms of the GNU Lesser General Public version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <AppParCurves_MultiBSpCurve.ixx>
16 #include <TColgp_Array1OfPnt.hxx>
17 #include <TColgp_Array1OfPnt2d.hxx>
18 #include <Standard_OutOfRange.hxx>
19 #include <AppParCurves_HArray1OfMultiPoint.hxx>
20 #include <BSplCLib.hxx>
22 //=======================================================================
23 //function : ComputeDegree
25 //=======================================================================
27 static Standard_Integer ComputeDegree(const TColStd_Array1OfInteger& mults,
28 const Standard_Integer nbPoles)
30 Standard_Integer i, sum = 0;
31 for (i = mults.Lower(); i <= mults.Upper(); i++) {
34 return sum - nbPoles -1;
37 //=======================================================================
38 //function : AppParCurves_MultiBSpCurve
40 //=======================================================================
42 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve() {}
45 //=======================================================================
46 //function : AppParCurves_MultiBSpCurve
48 //=======================================================================
50 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
51 (const Standard_Integer NbPol):
52 AppParCurves_MultiCurve(NbPol)
58 //=======================================================================
59 //function : AppParCurves_MultiBSpCurve
61 //=======================================================================
63 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
64 (const AppParCurves_Array1OfMultiPoint& tabMU,
65 const TColStd_Array1OfReal& Knots,
66 const TColStd_Array1OfInteger& Mults):
67 AppParCurves_MultiCurve(tabMU)
69 myknots = new TColStd_HArray1OfReal(Knots.Lower(), Knots.Upper());
70 myknots->ChangeArray1() = Knots;
71 mymults = new TColStd_HArray1OfInteger(Mults.Lower(), Mults.Upper());
72 mymults->ChangeArray1() = Mults;
73 myDegree = ComputeDegree(Mults,NbPoles());
77 //=======================================================================
78 //function : AppParCurves_MultiBSpCurve
80 //=======================================================================
82 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
83 (const AppParCurves_MultiCurve& SC,
84 const TColStd_Array1OfReal& Knots,
85 const TColStd_Array1OfInteger& Mults):
86 AppParCurves_MultiCurve(SC)
88 myknots = new TColStd_HArray1OfReal(Knots.Lower(), Knots.Upper());
89 myknots->ChangeArray1() = Knots;
90 mymults = new TColStd_HArray1OfInteger(Mults.Lower(), Mults.Upper());
91 mymults->ChangeArray1() = Mults;
92 myDegree = ComputeDegree(Mults,NbPoles());
96 //=======================================================================
99 //=======================================================================
101 void AppParCurves_MultiBSpCurve::SetKnots(const TColStd_Array1OfReal& theKnots)
103 myknots = new TColStd_HArray1OfReal(theKnots.Lower(), theKnots.Upper());
104 myknots->ChangeArray1() = theKnots;
107 //=======================================================================
108 //function : SetMultiplicities
110 //=======================================================================
112 void AppParCurves_MultiBSpCurve::SetMultiplicities(const TColStd_Array1OfInteger& theMults)
114 mymults = new TColStd_HArray1OfInteger(theMults.Lower(), theMults.Upper());
115 mymults->ChangeArray1() = theMults;
116 myDegree = ComputeDegree(theMults,NbPoles());
120 //=======================================================================
123 //=======================================================================
125 const TColStd_Array1OfReal& AppParCurves_MultiBSpCurve::Knots() const
127 return myknots->Array1();
130 //=======================================================================
131 //function : Multiplicities
133 //=======================================================================
135 const TColStd_Array1OfInteger& AppParCurves_MultiBSpCurve::Multiplicities() const
137 return mymults->Array1();
141 //=======================================================================
144 //=======================================================================
146 Standard_Integer AppParCurves_MultiBSpCurve::Degree() const
152 //=======================================================================
155 //=======================================================================
157 void AppParCurves_MultiBSpCurve::Value (const Standard_Integer CuIndex,
158 const Standard_Real U, gp_Pnt& Pt) const {
160 if (Dimension(CuIndex) != 3) {
161 Standard_OutOfRange::Raise();
164 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
165 Curve(CuIndex, TabPoles);
167 BSplCLib::D0(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
168 myknots->Array1(),mymults->Array1(),Pt);
172 //=======================================================================
175 //=======================================================================
177 void AppParCurves_MultiBSpCurve::Value (const Standard_Integer CuIndex,
178 const Standard_Real U, gp_Pnt2d& Pt) const {
180 if (Dimension(CuIndex) != 2) {
181 Standard_OutOfRange::Raise();
184 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
185 Curve(CuIndex, TabPoles);
187 BSplCLib::D0(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
188 myknots->Array1(),mymults->Array1(),Pt);
192 //=======================================================================
195 //=======================================================================
197 void AppParCurves_MultiBSpCurve::D1 (const Standard_Integer CuIndex,
198 const Standard_Real U, gp_Pnt& Pt, gp_Vec& V1) const {
199 if (Dimension(CuIndex) != 3) {
200 Standard_OutOfRange::Raise();
203 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
204 Curve(CuIndex, TabPoles);
206 BSplCLib::D1(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
207 myknots->Array1(),mymults->Array1(),Pt,V1);
211 //=======================================================================
214 //=======================================================================
216 void AppParCurves_MultiBSpCurve::D2 (const Standard_Integer CuIndex,
217 const Standard_Real U,
221 if (Dimension(CuIndex) != 3) {
222 Standard_OutOfRange::Raise();
225 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
226 Curve(CuIndex, TabPoles);
228 BSplCLib::D2(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
229 myknots->Array1(),mymults->Array1(),Pt,V1,V2);
233 //=======================================================================
236 //=======================================================================
238 void AppParCurves_MultiBSpCurve::D1 (const Standard_Integer CuIndex,
239 const Standard_Real U, gp_Pnt2d& Pt, gp_Vec2d& V1) const {
240 if (Dimension(CuIndex) != 2) {
241 Standard_OutOfRange::Raise();
244 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
245 Curve(CuIndex, TabPoles);
247 BSplCLib::D1(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
248 myknots->Array1(),mymults->Array1(),Pt,V1);
252 //=======================================================================
255 //=======================================================================
257 void AppParCurves_MultiBSpCurve::D2 (const Standard_Integer CuIndex,
258 const Standard_Real U,
261 gp_Vec2d& V2) const {
262 if (Dimension(CuIndex) != 2) {
263 Standard_OutOfRange::Raise();
266 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
267 Curve(CuIndex, TabPoles);
269 BSplCLib::D2(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
270 myknots->Array1(),mymults->Array1(),Pt,V1,V2);
275 //=======================================================================
278 //=======================================================================
280 void AppParCurves_MultiBSpCurve::Dump(Standard_OStream& o) const
282 o << "AppParCurves_MultiBSpCurve dump:" << endl;
283 o << " It contains " << NbCurves() << " BSpline curves "<< endl;
284 o << " The poles are: " << endl;
285 /* for (Standard_Integer i = 1; i <= NbCurves(); i++) {
286 o << " Curve No. " << i << endl;
287 if (Dimension(i) == 3) {
288 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
289 o << " Pole No. " << j << ": " << endl;
290 o << " Pole x = " << (tabPoint->Value(j)->Point(i)).X() << endl;
291 o << " Pole y = " << (tabPoint->Value(j)->Point(i)).Y() << endl;
292 o << " Pole z = " << (tabPoint->Value(j)->Point(i)).Z() << endl;
296 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
297 o << " Pole No. " << j << ": " << endl;
298 o << " Pole x = " << (tabPoint->Value(j)->Point2d(i)).X() << endl;
299 o << " Pole y = " << (tabPoint->Value(j)->Point2d(i)).Y() << endl;