1 // Created on: 1993-06-03
2 // Created by: Jacques GOUSSARD
3 // Copyright (c) 1993-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 // jag 940616 #define Tolpetit 1.e-16
23 Contap_SurfFunction::Contap_SurfFunction ():
25 myType(Contap_ContourStd),
27 myCosAng(0.), // PI/2 - Angle de depouille
29 computed(Standard_False),
30 derived(Standard_False)
33 void Contap_SurfFunction::Set(const TheSurface& S)
37 Standard_Integer nbs = TheContTool::NbSamplePoints(S);
42 for (i = 1; i <= nbs; i++) {
43 TheContTool::SamplePoint(S,i,U,V);
44 // TheSurfaceTool::D1(S,U,V,solpt,d1u,d1v);
45 // myMean = myMean + d1u.Crossed(d1v).Magnitude();
46 TheSurfProps::Normale(S,U,V,solpt,norm);
47 myMean = myMean + norm.Magnitude();
49 myMean = myMean / ((Standard_Real)nbs);
51 computed = Standard_False;
52 derived = Standard_False;
56 Standard_Integer Contap_SurfFunction::NbVariables () const
61 Standard_Integer Contap_SurfFunction::NbEquations () const
67 Standard_Boolean Contap_SurfFunction::Value(const math_Vector& X,
70 Usol = X(1); Vsol = X(2);
71 // TheSurfaceTool::D1(mySurf,Usol,Vsol,solpt,d1u,d1v);
72 // gp_Vec norm(d1u.Crossed(d1v));
74 TheSurfProps::Normale(mySurf,Usol,Vsol,solpt,norm);
76 case Contap_ContourStd:
78 F(1) = valf = (norm.Dot(myDir))/myMean;
81 case Contap_ContourPrs:
83 F(1) = valf = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
88 F(1) = valf = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
95 computed = Standard_False;
96 derived = Standard_False;
101 Standard_Boolean Contap_SurfFunction::Derivatives(const math_Vector& X,
104 // gp_Vec d2u,d2v,d2uv;
105 Usol = X(1); Vsol = X(2);
106 // TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
109 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
112 case Contap_ContourStd:
114 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
115 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
116 Grad(1,1) = (dnu.Dot(myDir))/myMean;
117 Grad(1,2) = (dnv.Dot(myDir))/myMean;
120 case Contap_ContourPrs:
122 gp_Vec Ep(myEye,solpt);
123 Grad(1,1) = (dnu.Dot(Ep))/myMean;
124 Grad(1,2) = (dnv.Dot(Ep))/myMean;
127 case Contap_DraftStd:
129 // gp_Vec norm(d1u.Crossed(d1v).Normalized());
130 // gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
131 // Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
132 // dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
133 // Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
135 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
136 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
139 case Contap_DraftPrs:
144 Fpu = Grad(1,1); Fpv = Grad(1,2);
145 computed = Standard_False;
146 derived = Standard_True;
147 return Standard_True;
151 Standard_Boolean Contap_SurfFunction::Values (const math_Vector& X,
155 // gp_Vec d2u,d2v,d2uv;
157 Usol = X(1); Vsol = X(2);
158 // TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
159 // gp_Vec norm(d1u.Crossed(d1v));
161 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
165 case Contap_ContourStd:
167 F(1) = (norm.Dot(myDir))/myMean;
168 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
169 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
170 Grad(1,1) = (dnu.Dot(myDir))/myMean;
171 Grad(1,2) = (dnv.Dot(myDir))/myMean;
174 case Contap_ContourPrs:
176 gp_Vec Ep(myEye,solpt);
177 F(1) = (norm.Dot(Ep))/myMean;
178 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
179 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
180 Grad(1,1) = (dnu.Dot(Ep))/myMean;
181 Grad(1,2) = (dnv.Dot(Ep))/myMean;
184 case Contap_DraftStd:
186 F(1) = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
189 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
190 Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
191 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
192 Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
194 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
195 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
198 case Contap_DraftPrs:
204 Fpu = Grad(1,1); Fpv = Grad(1,2);
205 computed = Standard_False;
206 derived = Standard_True;
207 return Standard_True;
211 Standard_Boolean Contap_SurfFunction::IsTangent ()
214 computed = Standard_True;
216 // gp_Vec d2u,d2v,d2uv;
217 // TheSurfaceTool::D2(mySurf, Usol, Vsol, solpt, d1u, d1v, d2u, d2v, d2uv);
219 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
222 case Contap_ContourStd:
224 // Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
225 // Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
226 Fpu = (dnu.Dot(myDir))/myMean;
227 Fpv = (dnv.Dot(myDir))/myMean;
230 case Contap_ContourPrs:
232 gp_Vec Ep(myEye,solpt);
233 // Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
234 // Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
235 Fpu = (dnu.Dot(Ep))/myMean;
236 Fpv = (dnv.Dot(Ep))/myMean;
239 case Contap_DraftStd:
242 gp_Vec norm(d1u.Crossed(d1v).Normalized());
243 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
244 Fpu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
245 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
246 Fpv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
249 Fpu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
250 Fpv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
253 case Contap_DraftPrs:
258 derived = Standard_True;
260 tangent = Standard_False;
261 Standard_Real D = Sqrt (Fpu * Fpu + Fpv * Fpv);
263 if (D <= gp::Resolution()) {
264 tangent = Standard_True;
267 d2d = gp_Dir2d(-Fpv,Fpu);
269 TheSurfaceTool::D1(mySurf, Usol, Vsol, solpt, d1u, d1v); // ajout jag 02.95
271 gp_XYZ d3dxyz(-Fpv*d1u.XYZ());
272 d3dxyz.Add(Fpu*d1v.XYZ());
275 //jag 940616 if (d3d.Magnitude() <= Tolpetit) {
276 if (d3d.Magnitude() <= tol) {
277 tangent = Standard_True;