1 // Created on: 1995-02-24
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Contap_SurfProps.ixx>
20 #include <Adaptor3d_HSurfaceTool.hxx>
22 //=======================================================================
25 //=======================================================================
27 void Contap_SurfProps::Normale(const Handle(Adaptor3d_HSurface)& S,
28 const Standard_Real U,
29 const Standard_Real V,
34 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
38 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
39 Norm = pl.Axis().Direction();
40 P = ElSLib::Value(U,V,pl);
50 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
51 P = ElSLib::Value(U,V,sp);
52 Norm = gp_Vec(sp.Location(),P);
54 Norm.Divide(sp.Radius());
57 Norm.Divide(-sp.Radius());
62 case GeomAbs_Cylinder:
64 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
65 P = ElSLib::Value(U,V,cy);
66 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
67 Sin(U),cy.YAxis().Direction());
77 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
78 P = ElSLib::Value(U,V,co);
79 Standard_Real Angle = co.SemiAngle();
80 Standard_Real Sina = sin(Angle);
81 Standard_Real Cosa = cos(Angle);
82 Standard_Real Rad = co.RefRadius();
84 Standard_Real Vcalc = V;
85 if (Abs(V*Sina + Rad) <= 1e-12) { // on est a l`apex
87 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
88 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
99 if (Rad + Vcalc*Sina < 0.) {
100 Norm.SetLinearForm(Sina, co.Axis().Direction(),
101 Cosa*cos(U),co.XAxis().Direction(),
102 Cosa*sin(U),co.YAxis().Direction());
105 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
106 Cosa*cos(U),co.XAxis().Direction(),
107 Cosa*sin(U),co.YAxis().Direction());
117 Adaptor3d_HSurfaceTool::D1(S,U,V,P,d1u,d1v);
118 Norm = d1u.Crossed(d1v);
127 //=======================================================================
128 //function : DerivAndNorm
130 //=======================================================================
132 void Contap_SurfProps::DerivAndNorm(const Handle(Adaptor3d_HSurface)& S,
133 const Standard_Real U,
134 const Standard_Real V,
141 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
145 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
146 Norm = pl.Axis().Direction();
147 ElSLib::D1(U,V,pl,P,d1u,d1v);
157 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
158 ElSLib::D1(U,V,sp,P,d1u,d1v);
159 Norm = gp_Vec(sp.Location(),P);
161 Norm.Divide(sp.Radius());
164 Norm.Divide(-sp.Radius());
169 case GeomAbs_Cylinder:
171 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
172 ElSLib::D1(U,V,cy,P,d1u,d1v);
173 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
174 Sin(U),cy.YAxis().Direction());
184 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
185 ElSLib::D1(U,V,co,P,d1u,d1v);
186 Standard_Real Angle = co.SemiAngle();
187 Standard_Real Sina = Sin(Angle);
188 Standard_Real Cosa = Cos(Angle);
189 Standard_Real Rad = co.RefRadius();
191 Standard_Real Vcalc = V;
192 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
193 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
194 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
202 if (Rad + Vcalc*Sina < 0.) {
203 Norm.SetLinearForm(Sina, co.Axis().Direction(),
204 Cosa*Cos(U),co.XAxis().Direction(),
205 Cosa*Sin(U),co.YAxis().Direction());
208 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
209 Cosa*Cos(U),co.XAxis().Direction(),
210 Cosa*Sin(U),co.YAxis().Direction());
219 Adaptor3d_HSurfaceTool::D1(S,U,V,P,d1u,d1v);
220 Norm = d1u.Crossed(d1v);
227 //=======================================================================
228 //function : NormAndDn
230 //=======================================================================
232 void Contap_SurfProps::NormAndDn(const Handle(Adaptor3d_HSurface)& S,
233 const Standard_Real U,
234 const Standard_Real V,
241 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
245 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
246 P = ElSLib::Value(U,V,pl);
247 Norm = pl.Axis().Direction();
251 Dnu = Dnv = gp_Vec(0.,0.,0.);
257 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
258 ElSLib::D1(U,V,sp,P,Dnu,Dnv);
259 Norm = gp_Vec(sp.Location(),P);
260 Standard_Real Rad = sp.Radius();
270 case GeomAbs_Cylinder:
272 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
273 P = ElSLib::Value(U,V,cy);
274 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
275 Sin(U),cy.YAxis().Direction());
276 Dnu.SetLinearForm(-Sin(U),cy.XAxis().Direction(),
277 Cos(U),cy.YAxis().Direction());
282 Dnv = gp_Vec(0.,0.,0.);
289 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
290 P = ElSLib::Value(U,V,co);
291 Standard_Real Angle = co.SemiAngle();
292 Standard_Real Sina = Sin(Angle);
293 Standard_Real Cosa = Cos(Angle);
294 Standard_Real Rad = co.RefRadius();
295 Standard_Real Vcalc = V;
296 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
297 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
298 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
306 if (Rad + Vcalc*Sina < 0.) {
307 Norm.SetLinearForm(Sina, co.Axis().Direction(),
308 Cosa*Cos(U),co.XAxis().Direction(),
309 Cosa*Sin(U),co.YAxis().Direction());
312 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
313 Cosa*Cos(U),co.XAxis().Direction(),
314 Cosa*Sin(U),co.YAxis().Direction());
316 Dnu.SetLinearForm(-Cosa*Sin(U),co.XAxis().Direction(),
317 Cosa*Cos(U),co.YAxis().Direction());
322 Dnv = gp_Vec(0.,0.,0.);
328 gp_Vec d1u,d1v,d2u,d2v,d2uv;
329 Adaptor3d_HSurfaceTool::D2(S,U,V,P,d1u,d1v,d2u,d2v,d2uv);
330 Norm = d1u.Crossed(d1v);
331 Dnu = d2u.Crossed(d1v) + d1u.Crossed(d2uv);
332 Dnv = d2uv.Crossed(d1v) + d1u.Crossed(d2v);