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 Tolpetit = 1.e-16
19 #include <Adaptor3d_HSurface.hxx>
20 #include <Adaptor3d_HSurfaceTool.hxx>
21 #include <Contap_HContTool.hxx>
22 #include <Contap_SurfFunction.hxx>
23 #include <Contap_SurfProps.hxx>
25 #include <gp_Dir2d.hxx>
28 #include <math_Matrix.hxx>
29 #include <StdFail_UndefinedDerivative.hxx>
31 Contap_SurfFunction::Contap_SurfFunction ():
33 myType(Contap_ContourStd),
35 myCosAng(0.), // PI/2 - Angle de depouille
37 computed(Standard_False),
38 derived(Standard_False)
41 void Contap_SurfFunction::Set(const Handle(Adaptor3d_HSurface)& S)
45 Standard_Integer nbs = Contap_HContTool::NbSamplePoints(S);
50 for (i = 1; i <= nbs; i++) {
51 Contap_HContTool::SamplePoint(S,i,U,V);
52 // Adaptor3d_HSurfaceTool::D1(S,U,V,solpt,d1u,d1v);
53 // myMean = myMean + d1u.Crossed(d1v).Magnitude();
54 Contap_SurfProps::Normale(S,U,V,solpt,norm);
55 myMean = myMean + norm.Magnitude();
57 myMean = myMean / ((Standard_Real)nbs);
59 computed = Standard_False;
60 derived = Standard_False;
64 Standard_Integer Contap_SurfFunction::NbVariables () const
69 Standard_Integer Contap_SurfFunction::NbEquations () const
75 Standard_Boolean Contap_SurfFunction::Value(const math_Vector& X,
78 Usol = X(1); Vsol = X(2);
79 // Adaptor3d_HSurfaceTool::D1(mySurf,Usol,Vsol,solpt,d1u,d1v);
80 // gp_Vec norm(d1u.Crossed(d1v));
82 Contap_SurfProps::Normale(mySurf,Usol,Vsol,solpt,norm);
84 case Contap_ContourStd:
86 F(1) = valf = (norm.Dot(myDir))/myMean;
89 case Contap_ContourPrs:
91 F(1) = valf = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
96 F(1) = valf = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
103 computed = Standard_False;
104 derived = Standard_False;
105 return Standard_True;
109 Standard_Boolean Contap_SurfFunction::Derivatives(const math_Vector& X,
112 // gp_Vec d2u,d2v,d2uv;
113 Usol = X(1); Vsol = X(2);
114 // Adaptor3d_HSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
117 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
120 case Contap_ContourStd:
122 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
123 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
124 Grad(1,1) = (dnu.Dot(myDir))/myMean;
125 Grad(1,2) = (dnv.Dot(myDir))/myMean;
128 case Contap_ContourPrs:
130 gp_Vec Ep(myEye,solpt);
131 Grad(1,1) = (dnu.Dot(Ep))/myMean;
132 Grad(1,2) = (dnv.Dot(Ep))/myMean;
135 case Contap_DraftStd:
137 // gp_Vec norm(d1u.Crossed(d1v).Normalized());
138 // gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
139 // Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
140 // dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
141 // Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
143 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
144 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
147 case Contap_DraftPrs:
152 Fpu = Grad(1,1); Fpv = Grad(1,2);
153 computed = Standard_False;
154 derived = Standard_True;
155 return Standard_True;
159 Standard_Boolean Contap_SurfFunction::Values (const math_Vector& X,
163 // gp_Vec d2u,d2v,d2uv;
165 Usol = X(1); Vsol = X(2);
166 // Adaptor3d_HSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
167 // gp_Vec norm(d1u.Crossed(d1v));
169 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
173 case Contap_ContourStd:
175 F(1) = (norm.Dot(myDir))/myMean;
176 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
177 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
178 Grad(1,1) = (dnu.Dot(myDir))/myMean;
179 Grad(1,2) = (dnv.Dot(myDir))/myMean;
182 case Contap_ContourPrs:
184 gp_Vec Ep(myEye,solpt);
185 F(1) = (norm.Dot(Ep))/myMean;
186 // Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
187 // Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
188 Grad(1,1) = (dnu.Dot(Ep))/myMean;
189 Grad(1,2) = (dnv.Dot(Ep))/myMean;
192 case Contap_DraftStd:
194 F(1) = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
197 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
198 Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
199 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
200 Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
202 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
203 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
206 case Contap_DraftPrs:
212 Fpu = Grad(1,1); Fpv = Grad(1,2);
213 computed = Standard_False;
214 derived = Standard_True;
215 return Standard_True;
219 Standard_Boolean Contap_SurfFunction::IsTangent ()
222 computed = Standard_True;
224 // gp_Vec d2u,d2v,d2uv;
225 // Adaptor3d_HSurfaceTool::D2(mySurf, Usol, Vsol, solpt, d1u, d1v, d2u, d2v, d2uv);
227 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
230 case Contap_ContourStd:
232 // Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
233 // Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
234 Fpu = (dnu.Dot(myDir))/myMean;
235 Fpv = (dnv.Dot(myDir))/myMean;
238 case Contap_ContourPrs:
240 gp_Vec Ep(myEye,solpt);
241 // Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
242 // Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
243 Fpu = (dnu.Dot(Ep))/myMean;
244 Fpv = (dnv.Dot(Ep))/myMean;
247 case Contap_DraftStd:
250 gp_Vec norm(d1u.Crossed(d1v).Normalized());
251 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
252 Fpu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
253 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
254 Fpv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
257 Fpu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
258 Fpv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
261 case Contap_DraftPrs:
266 derived = Standard_True;
268 tangent = Standard_False;
269 Standard_Real D = Sqrt (Fpu * Fpu + Fpv * Fpv);
271 if (D <= gp::Resolution()) {
272 tangent = Standard_True;
275 d2d = gp_Dir2d(-Fpv,Fpu);
277 Adaptor3d_HSurfaceTool::D1(mySurf, Usol, Vsol, solpt, d1u, d1v); // ajout jag 02.95
279 gp_XYZ d3dxyz(-Fpv*d1u.XYZ());
280 d3dxyz.Add(Fpu*d1v.XYZ());
283 //jag 940616 if (d3d.Magnitude() <= Tolpetit) {
284 if (d3d.Magnitude() <= tol) {
285 tangent = Standard_True;