1 // File: Contap_SurfProps.gxx
2 // Created: Fri Feb 24 15:37:28 1995
3 // Author: Jacques GOUSSARD
4 // Copyright: OPEN CASCADE 2000
8 //=======================================================================
11 //=======================================================================
13 void Contap_SurfProps::Normale(const TheSurface& S,
14 const Standard_Real U,
15 const Standard_Real V,
20 GeomAbs_SurfaceType typS = TheSurfaceTool::GetType(S);
24 gp_Pln pl(TheSurfaceTool::Plane(S));
25 Norm = pl.Axis().Direction();
26 P = ElSLib::Value(U,V,pl);
36 gp_Sphere sp(TheSurfaceTool::Sphere(S));
37 P = ElSLib::Value(U,V,sp);
38 Norm = gp_Vec(sp.Location(),P);
40 Norm.Divide(sp.Radius());
43 Norm.Divide(-sp.Radius());
48 case GeomAbs_Cylinder:
50 gp_Cylinder cy(TheSurfaceTool::Cylinder(S));
51 P = ElSLib::Value(U,V,cy);
52 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
53 Sin(U),cy.YAxis().Direction());
63 gp_Cone co(TheSurfaceTool::Cone(S));
64 P = ElSLib::Value(U,V,co);
65 Standard_Real Angle = co.SemiAngle();
66 Standard_Real Sina = sin(Angle);
67 Standard_Real Cosa = cos(Angle);
68 Standard_Real Rad = co.RefRadius();
70 Standard_Real Vcalc = V;
71 if (Abs(V*Sina + Rad) <= 1e-12) { // on est a l`apex
73 Standard_Real Vfi = TheSurfaceTool::FirstVParameter(S);
74 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
85 if (Rad + Vcalc*Sina < 0.) {
86 Norm.SetLinearForm(Sina, co.Axis().Direction(),
87 Cosa*cos(U),co.XAxis().Direction(),
88 Cosa*sin(U),co.YAxis().Direction());
91 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
92 Cosa*cos(U),co.XAxis().Direction(),
93 Cosa*sin(U),co.YAxis().Direction());
103 TheSurfaceTool::D1(S,U,V,P,d1u,d1v);
104 Norm = d1u.Crossed(d1v);
113 //=======================================================================
114 //function : DerivAndNorm
116 //=======================================================================
118 void Contap_SurfProps::DerivAndNorm(const TheSurface& S,
119 const Standard_Real U,
120 const Standard_Real V,
127 GeomAbs_SurfaceType typS = TheSurfaceTool::GetType(S);
131 gp_Pln pl(TheSurfaceTool::Plane(S));
132 Norm = pl.Axis().Direction();
133 ElSLib::D1(U,V,pl,P,d1u,d1v);
143 gp_Sphere sp(TheSurfaceTool::Sphere(S));
144 ElSLib::D1(U,V,sp,P,d1u,d1v);
145 Norm = gp_Vec(sp.Location(),P);
147 Norm.Divide(sp.Radius());
150 Norm.Divide(-sp.Radius());
155 case GeomAbs_Cylinder:
157 gp_Cylinder cy(TheSurfaceTool::Cylinder(S));
158 ElSLib::D1(U,V,cy,P,d1u,d1v);
159 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
160 Sin(U),cy.YAxis().Direction());
170 gp_Cone co(TheSurfaceTool::Cone(S));
171 ElSLib::D1(U,V,co,P,d1u,d1v);
172 Standard_Real Angle = co.SemiAngle();
173 Standard_Real Sina = Sin(Angle);
174 Standard_Real Cosa = Cos(Angle);
175 Standard_Real Rad = co.RefRadius();
177 Standard_Real Vcalc = V;
178 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
179 Standard_Real Vfi = TheSurfaceTool::FirstVParameter(S);
180 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
188 if (Rad + Vcalc*Sina < 0.) {
189 Norm.SetLinearForm(Sina, co.Axis().Direction(),
190 Cosa*Cos(U),co.XAxis().Direction(),
191 Cosa*Sin(U),co.YAxis().Direction());
194 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
195 Cosa*Cos(U),co.XAxis().Direction(),
196 Cosa*Sin(U),co.YAxis().Direction());
205 TheSurfaceTool::D1(S,U,V,P,d1u,d1v);
206 Norm = d1u.Crossed(d1v);
213 //=======================================================================
214 //function : NormAndDn
216 //=======================================================================
218 void Contap_SurfProps::NormAndDn(const TheSurface& S,
219 const Standard_Real U,
220 const Standard_Real V,
227 GeomAbs_SurfaceType typS = TheSurfaceTool::GetType(S);
231 gp_Pln pl(TheSurfaceTool::Plane(S));
232 P = ElSLib::Value(U,V,pl);
233 Norm = pl.Axis().Direction();
237 Dnu = Dnv = gp_Vec(0.,0.,0.);
243 gp_Sphere sp(TheSurfaceTool::Sphere(S));
244 ElSLib::D1(U,V,sp,P,Dnu,Dnv);
245 Norm = gp_Vec(sp.Location(),P);
246 Standard_Real Rad = sp.Radius();
256 case GeomAbs_Cylinder:
258 gp_Cylinder cy(TheSurfaceTool::Cylinder(S));
259 P = ElSLib::Value(U,V,cy);
260 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
261 Sin(U),cy.YAxis().Direction());
262 Dnu.SetLinearForm(-Sin(U),cy.XAxis().Direction(),
263 Cos(U),cy.YAxis().Direction());
268 Dnv = gp_Vec(0.,0.,0.);
275 gp_Cone co(TheSurfaceTool::Cone(S));
276 P = ElSLib::Value(U,V,co);
277 Standard_Real Angle = co.SemiAngle();
278 Standard_Real Sina = Sin(Angle);
279 Standard_Real Cosa = Cos(Angle);
280 Standard_Real Rad = co.RefRadius();
281 Standard_Real Vcalc = V;
282 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
283 Standard_Real Vfi = TheSurfaceTool::FirstVParameter(S);
284 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
292 if (Rad + Vcalc*Sina < 0.) {
293 Norm.SetLinearForm(Sina, co.Axis().Direction(),
294 Cosa*Cos(U),co.XAxis().Direction(),
295 Cosa*Sin(U),co.YAxis().Direction());
298 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
299 Cosa*Cos(U),co.XAxis().Direction(),
300 Cosa*Sin(U),co.YAxis().Direction());
302 Dnu.SetLinearForm(-Cosa*Sin(U),co.XAxis().Direction(),
303 Cosa*Cos(U),co.YAxis().Direction());
308 Dnv = gp_Vec(0.,0.,0.);
314 gp_Vec d1u,d1v,d2u,d2v,d2uv;
315 TheSurfaceTool::D2(S,U,V,P,d1u,d1v,d2u,d2v,d2uv);
316 Norm = d1u.Crossed(d1v);
317 Dnu = d2u.Crossed(d1v) + d1u.Crossed(d2uv);
318 Dnv = d2uv.Crossed(d1v) + d1u.Crossed(d2v);