0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / HLRBRep / HLRBRep_Surface.cxx
1 // Created on: 1992-03-13
2 // Created by: Christophe MARION
3 // Copyright (c) 1992-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <BRepAdaptor_Surface.hxx>
19 #include <BRepClass_FaceClassifier.hxx>
20 #include <Geom_BezierSurface.hxx>
21 #include <Geom_BSplineSurface.hxx>
22 #include <gp_Pln.hxx>
23 #include <gp_Pnt.hxx>
24 #include <gp_Vec.hxx>
25 #include <GProp_PEquation.hxx>
26 #include <HLRAlgo_Projector.hxx>
27 #include <HLRBRep_BSurfaceTool.hxx>
28 #include <HLRBRep_Curve.hxx>
29 #include <HLRBRep_Surface.hxx>
30 #include <Standard_DomainError.hxx>
31 #include <Standard_NoSuchObject.hxx>
32 #include <Standard_OutOfRange.hxx>
33 #include <TColgp_Array1OfPnt.hxx>
34 #include <TColStd_Array2OfReal.hxx>
35 #include <TopoDS_Face.hxx>
36
37 //=======================================================================
38 //function : HLRBRep_Surface
39 //purpose  : 
40 //=======================================================================
41 HLRBRep_Surface::HLRBRep_Surface ()
42 : myType(GeomAbs_OtherSurface),
43   myProj(NULL)
44 {
45 }
46
47 //=======================================================================
48 //function : Surface
49 //purpose  : 
50 //=======================================================================
51
52 void HLRBRep_Surface::Surface (const TopoDS_Face& F)
53 {
54   //mySurf.Initialize(F,Standard_False);
55   mySurf.Initialize(F,Standard_True);
56   GeomAbs_SurfaceType typ = HLRBRep_BSurfaceTool::GetType(mySurf);
57   switch (typ) {
58
59   case GeomAbs_Plane :
60   case GeomAbs_Cylinder :
61   case GeomAbs_Cone :
62   case GeomAbs_Sphere :
63   case GeomAbs_Torus :
64     // unchanged type
65     myType = typ;
66     break;
67     
68   case GeomAbs_BezierSurface :
69     if (HLRBRep_BSurfaceTool::UDegree(mySurf) == 1 &&
70         HLRBRep_BSurfaceTool::VDegree(mySurf) == 1) {
71       myType = GeomAbs_Plane;
72     }
73     else
74       myType = typ;
75     break;
76     
77     default :
78     myType = GeomAbs_OtherSurface;
79     break;
80   }
81 }
82
83 //=======================================================================
84 //function : SideRowsOfPoles
85 //purpose  : 
86 //=======================================================================
87
88 Standard_Boolean 
89 HLRBRep_Surface::SideRowsOfPoles (const Standard_Real tol,
90                                   const Standard_Integer nbuPoles,
91                                   const Standard_Integer nbvPoles,
92                                   TColgp_Array2OfPnt& Pnt) const
93 {
94   Standard_Integer iu,iv;
95   Standard_Real x0,y0,x,y,z;
96   Standard_Boolean result;
97   Standard_Real tole = (Standard_Real)tol;
98   const gp_Trsf& T = myProj->Transformation();
99
100   for (iu = 1; iu <= nbuPoles; iu++) {
101     
102     for (iv = 1; iv <= nbvPoles; iv++)
103       Pnt(iu,iv).Transform(T);
104   }
105   result = Standard_True;
106
107   for (iu = 1; iu <= nbuPoles && result; iu++) {         // Side iso u ?
108     Pnt(iu,1).Coord(x0,y0,z);
109     
110     for (iv = 2; iv <= nbvPoles && result; iv++) {
111       Pnt(iu,iv).Coord(x,y,z);
112       result = Abs(x-x0) < tole && Abs(y-y0) < tole;
113     }
114   }
115   if (result) return result;
116   result = Standard_True;
117   
118   for (iv = 1; iv <= nbvPoles && result; iv++) {         // Side iso v ?
119     Pnt(1,iv).Coord(x0,y0,z);
120     
121     for (iu = 2; iu <= nbuPoles && result; iu++) {
122       Pnt(iu,iv).Coord(x,y,z);
123       result = Abs(x-x0) < tole && Abs(y-y0) < tole;
124     }
125   }
126   if (result) return result;
127
128   // Are the Poles in a Side Plane ?
129   TColgp_Array1OfPnt p(1,nbuPoles*nbvPoles);
130   Standard_Integer i = 0;
131
132   for (iu = 1; iu <= nbuPoles; iu++) {
133     
134     for (iv = 1; iv <= nbvPoles; iv++) { 
135       i++;
136       p(i) = Pnt(iu,iv);
137     }
138   }
139
140   GProp_PEquation Pl(p,(Standard_Real)tol);
141   if (Pl.IsPlanar())
142     result = Abs(Pl.Plane().Axis().Direction().Z()) < 0.0001;
143
144   return result;
145 }
146
147 //=======================================================================
148 //function : IsSide
149 //purpose  : 
150 //=======================================================================
151
152 Standard_Boolean 
153 HLRBRep_Surface::IsSide (const Standard_Real tolF,
154                          const Standard_Real toler) const
155 {
156   gp_Pnt Pt;
157   gp_Vec D;
158   Standard_Real r;
159
160   if (myType == GeomAbs_Plane) {
161     gp_Pln Pl = Plane();
162     gp_Ax1 A  = Pl.Axis();
163     Pt = A.Location();
164     D  = A.Direction();
165     Pt.Transform(myProj->Transformation());
166     D .Transform(myProj->Transformation());
167     if (myProj->Perspective()) {
168       r = D.Z() * myProj->Focus() - 
169         ( D.X() * Pt.X() + D.Y() * Pt.Y() + D.Z() * Pt.Z() );
170     }
171     else r= D.Z();
172     return Abs(r) < toler;
173   }
174   else if (myType == GeomAbs_Cylinder) {
175     if (myProj->Perspective()) return Standard_False;
176     gp_Cylinder Cyl = HLRBRep_BSurfaceTool::Cylinder(mySurf);
177     gp_Ax1 A = Cyl.Axis();
178     D  = A.Direction();
179     D .Transform(myProj->Transformation());
180     r = Sqrt(D.X() * D.X() + D.Y() * D.Y());
181     return r < toler;
182   }
183   else if (myType == GeomAbs_Cone) {
184     if (!myProj->Perspective()) return Standard_False;
185     gp_Cone Con = HLRBRep_BSurfaceTool::Cone(mySurf);
186     Pt = Con.Apex();
187     Pt.Transform(myProj->Transformation());
188     Standard_Real tol = 0.001;
189     return Pt.IsEqual(gp_Pnt(0,0,myProj->Focus()),tol);
190   }
191   else if (myType == GeomAbs_BezierSurface) {
192     if (myProj->Perspective()) return Standard_False;
193     Standard_Integer nu = HLRBRep_BSurfaceTool::NbUPoles(mySurf);
194     Standard_Integer nv = HLRBRep_BSurfaceTool::NbVPoles(mySurf);
195     TColgp_Array2OfPnt Pnt(1,nu,1,nv);
196     HLRBRep_BSurfaceTool::Bezier(mySurf)->Poles(Pnt);
197     return SideRowsOfPoles (tolF,nu,nv,Pnt);
198   }
199   else if (myType == GeomAbs_BSplineSurface) {
200     if (myProj->Perspective()) return Standard_False;
201     Standard_Integer nu = HLRBRep_BSurfaceTool::NbUPoles(mySurf);
202     Standard_Integer nv = HLRBRep_BSurfaceTool::NbVPoles(mySurf);
203     TColgp_Array2OfPnt Pnt(1,nu,1,nv);
204     TColStd_Array2OfReal W(1,nu,1,nv);
205     HLRBRep_BSurfaceTool::BSpline(mySurf)->Poles(Pnt);
206     HLRBRep_BSurfaceTool::BSpline(mySurf)->Weights(W);
207     return SideRowsOfPoles (tolF,nu,nv,Pnt);
208   }
209   else return Standard_False;
210 }
211
212 //=======================================================================
213 //function : IsAbove
214 //purpose  : 
215 //=======================================================================
216
217 Standard_Boolean  
218 HLRBRep_Surface::IsAbove (const Standard_Boolean back,
219                           const HLRBRep_Curve* A,
220                           const Standard_Real tol) const
221
222   Standard_Boolean planar = (myType == GeomAbs_Plane);
223   if (planar) {
224     gp_Pln Pl = Plane();
225     Standard_Real a,b,c,d;
226     Pl.Coefficients(a,b,c,d);
227     Standard_Real u,u1,u2,dd,x,y,z;
228     gp_Pnt P;
229     u1 = A->Parameter3d(A->FirstParameter());
230     u2 = A->Parameter3d(A->LastParameter());
231     u=u1;
232     A->D0(u,P);
233     P.Coord(x,y,z);
234     dd = a*x + b*y + c*z + d;
235     if (back) dd = -dd;
236     if (dd < -tol) return Standard_False;
237     if (A->GetType() != GeomAbs_Line) {
238       Standard_Integer nbPnt = 30;
239       Standard_Real step = (u2-u1)/(nbPnt+1);
240       for (Standard_Integer i = 1; i <= nbPnt; i++) {
241         u += step;
242         A->D0(u,P);
243         P.Coord(x,y,z);
244         dd = a*x + b*y + c*z + d;
245         if (back) dd = -dd;
246         if (dd < -tol) return Standard_False;
247       }
248     }
249     u = u2;
250     A->D0(u,P);
251     P.Coord(x,y,z);
252     dd = a*x + b*y + c*z + d;
253     if (back) dd = -dd;
254     if (dd < -tol) return Standard_False;
255     return Standard_True;
256   }
257   else return Standard_False; 
258 }
259
260 //=======================================================================
261 //function : Value
262 //purpose  : 
263 //=======================================================================
264
265 gp_Pnt HLRBRep_Surface::Value (const Standard_Real U,
266                                const Standard_Real V) const
267
268   gp_Pnt P;
269   D0(U,V,P);
270   return P;
271 }
272
273 //=======================================================================
274 //function : Plane
275 //purpose  : 
276 //=======================================================================
277
278 gp_Pln  HLRBRep_Surface::Plane () const 
279 {
280   GeomAbs_SurfaceType typ = HLRBRep_BSurfaceTool::GetType(mySurf);
281   switch (typ) {
282   case GeomAbs_BezierSurface :
283     {
284       gp_Pnt P;
285       gp_Vec D1U;
286       gp_Vec D1V;
287       D1(0.5,0.5,P,D1U,D1V);
288       return gp_Pln(P,gp_Dir(D1U.Crossed(D1V)));
289     }
290     
291     default :
292     return HLRBRep_BSurfaceTool::Plane(mySurf);
293   }
294 }