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