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 under
7 // the terms of the GNU Lesser General Public License 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.
16 #include <AppParCurves_HArray1OfMultiPoint.hxx>
17 #include <AppParCurves_MultiBSpCurve.hxx>
18 #include <AppParCurves_MultiCurve.hxx>
19 #include <BSplCLib.hxx>
21 #include <gp_Pnt2d.hxx>
23 #include <gp_Vec2d.hxx>
24 #include <Standard_ConstructionError.hxx>
25 #include <Standard_DimensionError.hxx>
26 #include <Standard_OutOfRange.hxx>
27 #include <TColgp_Array1OfPnt.hxx>
28 #include <TColgp_Array1OfPnt2d.hxx>
30 //=======================================================================
31 //function : ComputeDegree
33 //=======================================================================
34 static Standard_Integer ComputeDegree(const TColStd_Array1OfInteger& mults,
35 const Standard_Integer nbPoles)
37 Standard_Integer i, sum = 0;
38 for (i = mults.Lower(); i <= mults.Upper(); i++) {
41 return sum - nbPoles -1;
44 //=======================================================================
45 //function : AppParCurves_MultiBSpCurve
47 //=======================================================================
49 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve() {}
52 //=======================================================================
53 //function : AppParCurves_MultiBSpCurve
55 //=======================================================================
57 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
58 (const Standard_Integer NbPol):
59 AppParCurves_MultiCurve(NbPol)
65 //=======================================================================
66 //function : AppParCurves_MultiBSpCurve
68 //=======================================================================
70 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
71 (const AppParCurves_Array1OfMultiPoint& tabMU,
72 const TColStd_Array1OfReal& Knots,
73 const TColStd_Array1OfInteger& Mults):
74 AppParCurves_MultiCurve(tabMU)
76 myknots = new TColStd_HArray1OfReal(Knots.Lower(), Knots.Upper());
77 myknots->ChangeArray1() = Knots;
78 mymults = new TColStd_HArray1OfInteger(Mults.Lower(), Mults.Upper());
79 mymults->ChangeArray1() = Mults;
80 myDegree = ComputeDegree(Mults,NbPoles());
84 //=======================================================================
85 //function : AppParCurves_MultiBSpCurve
87 //=======================================================================
89 AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve
90 (const AppParCurves_MultiCurve& SC,
91 const TColStd_Array1OfReal& Knots,
92 const TColStd_Array1OfInteger& Mults):
93 AppParCurves_MultiCurve(SC)
95 myknots = new TColStd_HArray1OfReal(Knots.Lower(), Knots.Upper());
96 myknots->ChangeArray1() = Knots;
97 mymults = new TColStd_HArray1OfInteger(Mults.Lower(), Mults.Upper());
98 mymults->ChangeArray1() = Mults;
99 myDegree = ComputeDegree(Mults,NbPoles());
103 //=======================================================================
104 //function : SetKnots
106 //=======================================================================
108 void AppParCurves_MultiBSpCurve::SetKnots(const TColStd_Array1OfReal& theKnots)
110 myknots = new TColStd_HArray1OfReal(theKnots.Lower(), theKnots.Upper());
111 myknots->ChangeArray1() = theKnots;
114 //=======================================================================
115 //function : SetMultiplicities
117 //=======================================================================
119 void AppParCurves_MultiBSpCurve::SetMultiplicities(const TColStd_Array1OfInteger& theMults)
121 mymults = new TColStd_HArray1OfInteger(theMults.Lower(), theMults.Upper());
122 mymults->ChangeArray1() = theMults;
123 myDegree = ComputeDegree(theMults,NbPoles());
127 //=======================================================================
130 //=======================================================================
132 const TColStd_Array1OfReal& AppParCurves_MultiBSpCurve::Knots() const
134 return myknots->Array1();
137 //=======================================================================
138 //function : Multiplicities
140 //=======================================================================
142 const TColStd_Array1OfInteger& AppParCurves_MultiBSpCurve::Multiplicities() const
144 return mymults->Array1();
148 //=======================================================================
151 //=======================================================================
153 Standard_Integer AppParCurves_MultiBSpCurve::Degree() const
159 //=======================================================================
162 //=======================================================================
164 void AppParCurves_MultiBSpCurve::Value (const Standard_Integer CuIndex,
165 const Standard_Real U, gp_Pnt& Pt) const {
167 if (Dimension(CuIndex) != 3) {
168 Standard_OutOfRange::Raise();
171 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
172 Curve(CuIndex, TabPoles);
174 BSplCLib::D0(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
175 myknots->Array1(),mymults->Array1(),Pt);
179 //=======================================================================
182 //=======================================================================
184 void AppParCurves_MultiBSpCurve::Value (const Standard_Integer CuIndex,
185 const Standard_Real U, gp_Pnt2d& Pt) const {
187 if (Dimension(CuIndex) != 2) {
188 Standard_OutOfRange::Raise();
191 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
192 Curve(CuIndex, TabPoles);
194 BSplCLib::D0(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
195 myknots->Array1(),mymults->Array1(),Pt);
199 //=======================================================================
202 //=======================================================================
204 void AppParCurves_MultiBSpCurve::D1 (const Standard_Integer CuIndex,
205 const Standard_Real U, gp_Pnt& Pt, gp_Vec& V1) const {
206 if (Dimension(CuIndex) != 3) {
207 Standard_OutOfRange::Raise();
210 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
211 Curve(CuIndex, TabPoles);
213 BSplCLib::D1(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
214 myknots->Array1(),mymults->Array1(),Pt,V1);
218 //=======================================================================
221 //=======================================================================
223 void AppParCurves_MultiBSpCurve::D2 (const Standard_Integer CuIndex,
224 const Standard_Real U,
228 if (Dimension(CuIndex) != 3) {
229 Standard_OutOfRange::Raise();
232 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
233 Curve(CuIndex, TabPoles);
235 BSplCLib::D2(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
236 myknots->Array1(),mymults->Array1(),Pt,V1,V2);
240 //=======================================================================
243 //=======================================================================
245 void AppParCurves_MultiBSpCurve::D1 (const Standard_Integer CuIndex,
246 const Standard_Real U, gp_Pnt2d& Pt, gp_Vec2d& V1) const {
247 if (Dimension(CuIndex) != 2) {
248 Standard_OutOfRange::Raise();
251 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
252 Curve(CuIndex, TabPoles);
254 BSplCLib::D1(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
255 myknots->Array1(),mymults->Array1(),Pt,V1);
259 //=======================================================================
262 //=======================================================================
264 void AppParCurves_MultiBSpCurve::D2 (const Standard_Integer CuIndex,
265 const Standard_Real U,
268 gp_Vec2d& V2) const {
269 if (Dimension(CuIndex) != 2) {
270 Standard_OutOfRange::Raise();
273 TColgp_Array1OfPnt2d TabPoles(1, tabPoint->Length());
274 Curve(CuIndex, TabPoles);
276 BSplCLib::D2(U,0,myDegree,Standard_False,TabPoles,BSplCLib::NoWeights(),
277 myknots->Array1(),mymults->Array1(),Pt,V1,V2);
282 //=======================================================================
285 //=======================================================================
287 void AppParCurves_MultiBSpCurve::Dump(Standard_OStream& o) const
289 o << "AppParCurves_MultiBSpCurve dump:" << endl;
290 o << " It contains " << NbCurves() << " BSpline curves "<< endl;
291 o << " The poles are: " << endl;
292 /* for (Standard_Integer i = 1; i <= NbCurves(); i++) {
293 o << " Curve No. " << i << endl;
294 if (Dimension(i) == 3) {
295 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
296 o << " Pole No. " << j << ": " << endl;
297 o << " Pole x = " << (tabPoint->Value(j)->Point(i)).X() << endl;
298 o << " Pole y = " << (tabPoint->Value(j)->Point(i)).Y() << endl;
299 o << " Pole z = " << (tabPoint->Value(j)->Point(i)).Z() << endl;
303 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
304 o << " Pole No. " << j << ": " << endl;
305 o << " Pole x = " << (tabPoint->Value(j)->Point2d(i)).X() << endl;
306 o << " Pole y = " << (tabPoint->Value(j)->Point2d(i)).Y() << endl;