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.
18 #include <Adaptor3d_HSurfaceTool.hxx>
19 #include <Contap_SurfProps.hxx>
24 //=======================================================================
27 //=======================================================================
28 void Contap_SurfProps::Normale(const Handle(Adaptor3d_Surface)& S,
29 const Standard_Real U,
30 const Standard_Real V,
35 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
39 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
40 Norm = pl.Axis().Direction();
41 P = ElSLib::Value(U,V,pl);
51 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
52 P = ElSLib::Value(U,V,sp);
53 Norm = gp_Vec(sp.Location(),P);
55 Norm.Divide(sp.Radius());
58 Norm.Divide(-sp.Radius());
63 case GeomAbs_Cylinder:
65 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
66 P = ElSLib::Value(U,V,cy);
67 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
68 Sin(U),cy.YAxis().Direction());
78 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
79 P = ElSLib::Value(U,V,co);
80 Standard_Real Angle = co.SemiAngle();
81 Standard_Real Sina = sin(Angle);
82 Standard_Real Cosa = cos(Angle);
83 Standard_Real Rad = co.RefRadius();
85 Standard_Real Vcalc = V;
86 if (Abs(V*Sina + Rad) <= 1e-12) { // on est a l`apex
88 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
89 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
100 if (Rad + Vcalc*Sina < 0.) {
101 Norm.SetLinearForm(Sina, co.Axis().Direction(),
102 Cosa*cos(U),co.XAxis().Direction(),
103 Cosa*sin(U),co.YAxis().Direction());
106 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
107 Cosa*cos(U),co.XAxis().Direction(),
108 Cosa*sin(U),co.YAxis().Direction());
118 Adaptor3d_HSurfaceTool::D1(S,U,V,P,d1u,d1v);
119 Norm = d1u.Crossed(d1v);
128 //=======================================================================
129 //function : DerivAndNorm
131 //=======================================================================
133 void Contap_SurfProps::DerivAndNorm(const Handle(Adaptor3d_Surface)& S,
134 const Standard_Real U,
135 const Standard_Real V,
142 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
146 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
147 Norm = pl.Axis().Direction();
148 ElSLib::D1(U,V,pl,P,d1u,d1v);
158 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
159 ElSLib::D1(U,V,sp,P,d1u,d1v);
160 Norm = gp_Vec(sp.Location(),P);
162 Norm.Divide(sp.Radius());
165 Norm.Divide(-sp.Radius());
170 case GeomAbs_Cylinder:
172 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
173 ElSLib::D1(U,V,cy,P,d1u,d1v);
174 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
175 Sin(U),cy.YAxis().Direction());
185 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
186 ElSLib::D1(U,V,co,P,d1u,d1v);
187 Standard_Real Angle = co.SemiAngle();
188 Standard_Real Sina = Sin(Angle);
189 Standard_Real Cosa = Cos(Angle);
190 Standard_Real Rad = co.RefRadius();
192 Standard_Real Vcalc = V;
193 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
194 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
195 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
203 if (Rad + Vcalc*Sina < 0.) {
204 Norm.SetLinearForm(Sina, co.Axis().Direction(),
205 Cosa*Cos(U),co.XAxis().Direction(),
206 Cosa*Sin(U),co.YAxis().Direction());
209 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
210 Cosa*Cos(U),co.XAxis().Direction(),
211 Cosa*Sin(U),co.YAxis().Direction());
220 Adaptor3d_HSurfaceTool::D1(S,U,V,P,d1u,d1v);
221 Norm = d1u.Crossed(d1v);
228 //=======================================================================
229 //function : NormAndDn
231 //=======================================================================
233 void Contap_SurfProps::NormAndDn(const Handle(Adaptor3d_Surface)& S,
234 const Standard_Real U,
235 const Standard_Real V,
242 GeomAbs_SurfaceType typS = Adaptor3d_HSurfaceTool::GetType(S);
246 gp_Pln pl(Adaptor3d_HSurfaceTool::Plane(S));
247 P = ElSLib::Value(U,V,pl);
248 Norm = pl.Axis().Direction();
252 Dnu = Dnv = gp_Vec(0.,0.,0.);
258 gp_Sphere sp(Adaptor3d_HSurfaceTool::Sphere(S));
259 ElSLib::D1(U,V,sp,P,Dnu,Dnv);
260 Norm = gp_Vec(sp.Location(),P);
261 Standard_Real Rad = sp.Radius();
271 case GeomAbs_Cylinder:
273 gp_Cylinder cy(Adaptor3d_HSurfaceTool::Cylinder(S));
274 P = ElSLib::Value(U,V,cy);
275 Norm.SetLinearForm(Cos(U),cy.XAxis().Direction(),
276 Sin(U),cy.YAxis().Direction());
277 Dnu.SetLinearForm(-Sin(U),cy.XAxis().Direction(),
278 Cos(U),cy.YAxis().Direction());
283 Dnv = gp_Vec(0.,0.,0.);
290 gp_Cone co(Adaptor3d_HSurfaceTool::Cone(S));
291 P = ElSLib::Value(U,V,co);
292 Standard_Real Angle = co.SemiAngle();
293 Standard_Real Sina = Sin(Angle);
294 Standard_Real Cosa = Cos(Angle);
295 Standard_Real Rad = co.RefRadius();
296 Standard_Real Vcalc = V;
297 if (Abs(V*Sina + Rad) <= RealEpsilon()) { // on est a l`apex
298 Standard_Real Vfi = Adaptor3d_HSurfaceTool::FirstVParameter(S);
299 if (Vfi < -Rad/Sina) { // partie valide pour V < Vapex
307 if (Rad + Vcalc*Sina < 0.) {
308 Norm.SetLinearForm(Sina, co.Axis().Direction(),
309 Cosa*Cos(U),co.XAxis().Direction(),
310 Cosa*Sin(U),co.YAxis().Direction());
313 Norm.SetLinearForm(-Sina, co.Axis().Direction(),
314 Cosa*Cos(U),co.XAxis().Direction(),
315 Cosa*Sin(U),co.YAxis().Direction());
317 Dnu.SetLinearForm(-Cosa*Sin(U),co.XAxis().Direction(),
318 Cosa*Cos(U),co.YAxis().Direction());
323 Dnv = gp_Vec(0.,0.,0.);
329 gp_Vec d1u,d1v,d2u,d2v,d2uv;
330 Adaptor3d_HSurfaceTool::D2(S,U,V,P,d1u,d1v,d2u,d2v,d2uv);
331 Norm = d1u.Crossed(d1v);
332 Dnu = d2u.Crossed(d1v) + d1u.Crossed(d2uv);
333 Dnv = d2uv.Crossed(d1v) + d1u.Crossed(d2v);