0022312: Translation of french commentaries in OCCT files
[occt.git] / src / Contap / Contap_SurfFunction.gxx
CommitLineData
733a0e55
S
1// File: Contap_SurfFunction.gxx
2// Created: Thu Jun 3 15:23:20 1993
3// Author: Jacques GOUSSARD
4// Copyright: OPEN CASCADE 2000
5
7fd59977 6// jag 940616 #define Tolpetit 1.e-16
7
8
9#include <gp.hxx>
10
11
12Contap_SurfFunction::Contap_SurfFunction ():
13 myMean(1.),
14 myType(Contap_ContourStd),
15 myDir(0.,0.,1.),
16 myCosAng(0.), // PI/2 - Angle de depouille
17 tol(1.e-6),
18 computed(Standard_False),
19 derived(Standard_False)
20{}
21
22void Contap_SurfFunction::Set(const TheSurface& S)
23{
24 mySurf = S;
25 Standard_Integer i;
26 Standard_Integer nbs = TheContTool::NbSamplePoints(S);
27 Standard_Real U,V;
28 gp_Vec norm;
29 if (nbs > 0) {
30 myMean = 0.;
31 for (i = 1; i <= nbs; i++) {
32 TheContTool::SamplePoint(S,i,U,V);
33// TheSurfaceTool::D1(S,U,V,solpt,d1u,d1v);
34// myMean = myMean + d1u.Crossed(d1v).Magnitude();
35 TheSurfProps::Normale(S,U,V,solpt,norm);
36 myMean = myMean + norm.Magnitude();
37 }
38 myMean = myMean / ((Standard_Real)nbs);
39 }
40 computed = Standard_False;
41 derived = Standard_False;
42}
43
44
45Standard_Integer Contap_SurfFunction::NbVariables () const
46{
47 return 2;
48}
49
50Standard_Integer Contap_SurfFunction::NbEquations () const
51{
52 return 1;
53}
54
55
56Standard_Boolean Contap_SurfFunction::Value(const math_Vector& X,
57 math_Vector& F)
58{
59 Usol = X(1); Vsol = X(2);
60// TheSurfaceTool::D1(mySurf,Usol,Vsol,solpt,d1u,d1v);
61// gp_Vec norm(d1u.Crossed(d1v));
62 gp_Vec norm;
63 TheSurfProps::Normale(mySurf,Usol,Vsol,solpt,norm);
64 switch (myType) {
65 case Contap_ContourStd:
66 {
67 F(1) = valf = (norm.Dot(myDir))/myMean;
68 }
69 break;
70 case Contap_ContourPrs:
71 {
72 F(1) = valf = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
73 }
74 break;
75 case Contap_DraftStd:
76 {
77 F(1) = valf = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
78 }
79 break;
80 default:
81 {
82 }
83 }
84 computed = Standard_False;
85 derived = Standard_False;
86 return Standard_True;
87}
88
89
90Standard_Boolean Contap_SurfFunction::Derivatives(const math_Vector& X,
91 math_Matrix& Grad)
92{
93// gp_Vec d2u,d2v,d2uv;
94 Usol = X(1); Vsol = X(2);
95// TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
96
97 gp_Vec norm,dnu,dnv;
98 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
99
100 switch (myType) {
101 case Contap_ContourStd:
102 {
103// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
104// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
105 Grad(1,1) = (dnu.Dot(myDir))/myMean;
106 Grad(1,2) = (dnv.Dot(myDir))/myMean;
107 }
108 break;
109 case Contap_ContourPrs:
110 {
111 gp_Vec Ep(myEye,solpt);
112 Grad(1,1) = (dnu.Dot(Ep))/myMean;
113 Grad(1,2) = (dnv.Dot(Ep))/myMean;
114 }
115 break;
116 case Contap_DraftStd:
117 {
118// gp_Vec norm(d1u.Crossed(d1v).Normalized());
119// gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
120// Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
121// dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
122// Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
123 norm.Normalize();
124 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
125 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
126 }
127 break;
128 case Contap_DraftPrs:
129 default:
130 {
131 }
132 }
133 Fpu = Grad(1,1); Fpv = Grad(1,2);
134 computed = Standard_False;
135 derived = Standard_True;
136 return Standard_True;
137}
138
139
140Standard_Boolean Contap_SurfFunction::Values (const math_Vector& X,
141 math_Vector& F,
142 math_Matrix& Grad)
143{
144// gp_Vec d2u,d2v,d2uv;
145
146 Usol = X(1); Vsol = X(2);
147// TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
148// gp_Vec norm(d1u.Crossed(d1v));
149 gp_Vec norm,dnu,dnv;
150 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
151
152 switch (myType) {
153
154 case Contap_ContourStd:
155 {
156 F(1) = (norm.Dot(myDir))/myMean;
157// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
158// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
159 Grad(1,1) = (dnu.Dot(myDir))/myMean;
160 Grad(1,2) = (dnv.Dot(myDir))/myMean;
161 }
162 break;
163 case Contap_ContourPrs:
164 {
165 gp_Vec Ep(myEye,solpt);
166 F(1) = (norm.Dot(Ep))/myMean;
167// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
168// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
169 Grad(1,1) = (dnu.Dot(Ep))/myMean;
170 Grad(1,2) = (dnv.Dot(Ep))/myMean;
171 }
172 break;
173 case Contap_DraftStd:
174 {
175 F(1) = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
176 norm.Normalize();
177/*
178 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
179 Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
180 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
181 Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
182*/
183 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
184 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
185 }
186 break;
187 case Contap_DraftPrs:
188 default:
189 {
190 }
191 }
192 valf = F(1);
193 Fpu = Grad(1,1); Fpv = Grad(1,2);
194 computed = Standard_False;
195 derived = Standard_True;
196 return Standard_True;
197}
198
199
200Standard_Boolean Contap_SurfFunction::IsTangent ()
201{
202 if (!computed) {
203 computed = Standard_True;
204 if(!derived) {
205// gp_Vec d2u,d2v,d2uv;
206// TheSurfaceTool::D2(mySurf, Usol, Vsol, solpt, d1u, d1v, d2u, d2v, d2uv);
207 gp_Vec norm,dnu,dnv;
208 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
209
210 switch (myType) {
211 case Contap_ContourStd:
212 {
213// Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
214// Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
215 Fpu = (dnu.Dot(myDir))/myMean;
216 Fpv = (dnv.Dot(myDir))/myMean;
217 }
218 break;
219 case Contap_ContourPrs:
220 {
221 gp_Vec Ep(myEye,solpt);
222// Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
223// Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
224 Fpu = (dnu.Dot(Ep))/myMean;
225 Fpv = (dnv.Dot(Ep))/myMean;
226 }
227 break;
228 case Contap_DraftStd:
229 {
230/*
231 gp_Vec norm(d1u.Crossed(d1v).Normalized());
232 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
233 Fpu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
234 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
235 Fpv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
236*/
237 norm.Normalize();
238 Fpu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
239 Fpv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
240 }
241 break;
242 case Contap_DraftPrs:
243 default:
244 {
245 }
246 }
247 derived = Standard_True;
248 }
249 tangent = Standard_False;
250 Standard_Real D = Sqrt (Fpu * Fpu + Fpv * Fpv);
251
252 if (D <= gp::Resolution()) {
253 tangent = Standard_True;
254 }
255 else {
256 d2d = gp_Dir2d(-Fpv,Fpu);
257 gp_Vec d1u,d1v;
258 TheSurfaceTool::D1(mySurf, Usol, Vsol, solpt, d1u, d1v); // ajout jag 02.95
259
260 gp_XYZ d3dxyz(-Fpv*d1u.XYZ());
261 d3dxyz.Add(Fpu*d1v.XYZ());
262 d3d.SetXYZ(d3dxyz);
263
264 //jag 940616 if (d3d.Magnitude() <= Tolpetit) {
265 if (d3d.Magnitude() <= tol) {
266 tangent = Standard_True;
267 }
268 }
269 }
270 return tangent;
271}