Commit | Line | Data |
---|---|---|
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 | ||
12 | Contap_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 | ||
22 | void 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 | ||
45 | Standard_Integer Contap_SurfFunction::NbVariables () const | |
46 | { | |
47 | return 2; | |
48 | } | |
49 | ||
50 | Standard_Integer Contap_SurfFunction::NbEquations () const | |
51 | { | |
52 | return 1; | |
53 | } | |
54 | ||
55 | ||
56 | Standard_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 | ||
90 | Standard_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 | ||
140 | Standard_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 | ||
200 | Standard_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 | } |