1 //File AppParCurves_MultiCurve.cxx
4 #include <AppParCurves_MultiCurve.ixx>
5 #include <TColgp_Array1OfPnt.hxx>
6 #include <TColgp_Array1OfPnt2d.hxx>
7 #include <Standard_OutOfRange.hxx>
8 #include <BSplCLib.hxx>
12 AppParCurves_MultiCurve::AppParCurves_MultiCurve() {}
15 AppParCurves_MultiCurve::AppParCurves_MultiCurve (const Standard_Integer NbPol)
17 tabPoint = new AppParCurves_HArray1OfMultiPoint(1, NbPol);
22 AppParCurves_MultiCurve::AppParCurves_MultiCurve (const AppParCurves_Array1OfMultiPoint& tabMU)
24 tabPoint = new AppParCurves_HArray1OfMultiPoint(1, tabMU.Length());
25 Standard_Integer i, Lower = tabMU.Lower();
26 for (i = 1; i <= tabMU.Length(); i++) {
27 tabPoint->SetValue(i, tabMU.Value(Lower+i-1));
32 void AppParCurves_MultiCurve::Delete()
35 Standard_Integer AppParCurves_MultiCurve::Dimension (const Standard_Integer Index) const {
36 Standard_Integer Lo = tabPoint->Lower();
37 Standard_Integer nb = tabPoint->Value(Lo).NbPoints() + tabPoint->Value(Lo).NbPoints2d();
38 if ((Index <= 0) || (Index > nb)) {
39 Standard_OutOfRange::Raise();
41 return tabPoint->Value(Lo).Dimension(Index);
45 Standard_Integer AppParCurves_MultiCurve::NbCurves () const {
46 if (tabPoint.IsNull())
48 AppParCurves_MultiPoint MP = tabPoint->Value(1);
49 return MP.NbPoints() + MP.NbPoints2d();
53 Standard_Integer AppParCurves_MultiCurve::NbPoles() const {
54 if (tabPoint.IsNull())
56 return tabPoint->Length();
60 Standard_Integer AppParCurves_MultiCurve::Degree() const {
61 return tabPoint->Length()-1;
65 void AppParCurves_MultiCurve::SetNbPoles(const Standard_Integer nbPoles)
67 tabPoint = new AppParCurves_HArray1OfMultiPoint(1, nbPoles);
71 void AppParCurves_MultiCurve::SetValue (const Standard_Integer Index,
72 const AppParCurves_MultiPoint& MPoint) {
74 if ((Index <= 0) || (Index > tabPoint->Length())) {
75 Standard_OutOfRange::Raise();
77 tabPoint->SetValue(Index, MPoint);
81 void AppParCurves_MultiCurve::Curve (const Standard_Integer CuIndex,
82 TColgp_Array1OfPnt& TabPnt) const {
84 Standard_OutOfRange::Raise();
86 for ( Standard_Integer i = 1; i <= tabPoint->Length(); i++) {
87 TabPnt(i) = tabPoint->Value(i).Point(CuIndex);
92 void AppParCurves_MultiCurve::Curve (const Standard_Integer CuIndex,
93 TColgp_Array1OfPnt2d& TabPnt2d) const {
95 Standard_OutOfRange::Raise();
97 for ( Standard_Integer i = 1; i <= tabPoint->Length(); i++) {
98 TabPnt2d(i) = tabPoint->Value(i).Point2d(CuIndex);
104 const gp_Pnt& AppParCurves_MultiCurve::Pole(const Standard_Integer CuIndex,
105 const Standard_Integer Nieme) const
107 if ((CuIndex <= 0) && Nieme <= 0) {
108 Standard_OutOfRange::Raise();
110 return tabPoint->Value(Nieme).Point(CuIndex);
113 const gp_Pnt2d& AppParCurves_MultiCurve::Pole2d(const Standard_Integer CuIndex,
114 const Standard_Integer Nieme)const
116 if ((CuIndex <= 0) && Nieme <= 0) {
117 Standard_OutOfRange::Raise();
119 return tabPoint->Value(Nieme).Point2d(CuIndex);
124 const AppParCurves_MultiPoint& AppParCurves_MultiCurve::Value (const Standard_Integer Index) const {
125 if ((Index <= 0) || (Index > tabPoint->Length())) {
126 Standard_OutOfRange::Raise();
128 return tabPoint->Value(Index);
131 void AppParCurves_MultiCurve::Transform(const Standard_Integer CuIndex,
132 const Standard_Real x,
133 const Standard_Real dx,
134 const Standard_Real y,
135 const Standard_Real dy,
136 const Standard_Real z,
137 const Standard_Real dz)
139 if (Dimension(CuIndex) != 3) Standard_OutOfRange::Raise();
141 for (Standard_Integer i = 1 ; i <= tabPoint->Length(); i++) {
142 (tabPoint->ChangeValue(i)).Transform(CuIndex, x, dx, y, dy, z, dz);
146 void AppParCurves_MultiCurve::Transform2d(const Standard_Integer CuIndex,
147 const Standard_Real x,
148 const Standard_Real dx,
149 const Standard_Real y,
150 const Standard_Real dy)
152 if (Dimension(CuIndex) != 2) Standard_OutOfRange::Raise();
154 for (Standard_Integer i = 1 ; i <= tabPoint->Length(); i++) {
155 (tabPoint->ChangeValue(i)).Transform2d(CuIndex, x, dx, y, dy);
160 void AppParCurves_MultiCurve::Value (const Standard_Integer CuIndex,
161 const Standard_Real U, gp_Pnt& Pt) const {
163 if (Dimension(CuIndex) != 3)Standard_OutOfRange::Raise();
165 TColgp_Array1OfPnt TabPoles(1, tabPoint->Length());
167 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
168 TabPoles(i) = tabPoint->Value(i).Point(CuIndex);
171 BSplCLib::D0 (U, TabPoles,PLib::NoWeights(), Pt);
175 void AppParCurves_MultiCurve::Value (const Standard_Integer CuIndex,
176 const Standard_Real U, gp_Pnt2d& Pt) const {
177 if (Dimension(CuIndex) != 2) {
178 Standard_OutOfRange::Raise();
181 TColgp_Array1OfPnt2d TabPole(1, tabPoint->Length());
183 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
184 TabPole(i) = tabPoint->Value(i).Point2d(CuIndex);
187 BSplCLib::D0 (U, TabPole, PLib::NoWeights(), Pt);
191 void AppParCurves_MultiCurve::D1 (const Standard_Integer CuIndex,
192 const Standard_Real U,
196 if (Dimension(CuIndex) != 3) {
197 Standard_OutOfRange::Raise();
200 TColgp_Array1OfPnt TabPole(1, tabPoint->Length());
202 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
203 TabPole(i) = tabPoint->Value(i).Point(CuIndex);
206 BSplCLib::D1 (U, TabPole, PLib::NoWeights(), Pt, V1);
210 void AppParCurves_MultiCurve::D2 (const Standard_Integer CuIndex,
211 const Standard_Real U,
216 if (Dimension(CuIndex) != 3) {
217 Standard_OutOfRange::Raise();
220 TColgp_Array1OfPnt TabPole(1, tabPoint->Length());
222 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
223 TabPole(i) = tabPoint->Value(i).Point(CuIndex);
226 BSplCLib::D2 (U, TabPole, PLib::NoWeights(), Pt, V1, V2);
230 void AppParCurves_MultiCurve::D1 (const Standard_Integer CuIndex,
231 const Standard_Real U, gp_Pnt2d& Pt, gp_Vec2d& V1) const {
233 if (Dimension(CuIndex) != 2) {
234 Standard_OutOfRange::Raise();
237 TColgp_Array1OfPnt2d TabPole(1, tabPoint->Length());
239 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
240 TabPole(i) = tabPoint->Value(i).Point2d(CuIndex);
243 BSplCLib::D1 (U, TabPole, PLib::NoWeights(), Pt, V1);
247 void AppParCurves_MultiCurve::D2 (const Standard_Integer CuIndex,
248 const Standard_Real U,
251 gp_Vec2d& V2) const {
253 if (Dimension(CuIndex) != 2) {
254 Standard_OutOfRange::Raise();
257 TColgp_Array1OfPnt2d TabPole(1, tabPoint->Length());
259 for (Standard_Integer i =1 ; i <= tabPoint->Length(); i++) {
260 TabPole(i) = tabPoint->Value(i).Point2d(CuIndex);
263 BSplCLib::D2(U, TabPole, PLib::NoWeights(), Pt, V1, V2);
268 void AppParCurves_MultiCurve::Dump(Standard_OStream& o) const
270 o << "AppParCurves_MultiCurve dump:" << endl;
271 o << " It contains " << NbCurves() << " Bezier curves of degree " << tabPoint->Length()-1 << endl;
272 o << " The poles are: " << endl;
273 /* for (Standard_Integer i = 1; i <= NbCurves(); i++) {
274 o << " Curve No. " << i << endl;
275 if (Dimension(i) == 3) {
276 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
277 o << " Pole No. " << j << ": " << endl;
278 o << " Pole x = " << (tabPoint->Value(j)->Point(i)).X() << endl;
279 o << " Pole y = " << (tabPoint->Value(j)->Point(i)).Y() << endl;
280 o << " Pole z = " << (tabPoint->Value(j)->Point(i)).Z() << endl;
284 for (Standard_Integer j = 1; j <= tabPoint->Length(); j++) {
285 o << " Pole No. " << j << ": " << endl;
286 o << " Pole x = " << (tabPoint->Value(j)->Point2d(i)).X() << endl;
287 o << " Pole y = " << (tabPoint->Value(j)->Point2d(i)).Y() << endl;