0024236: Eliminate GCC compiler warning (uninitialized variables)
[occt.git] / src / Contap / Contap_SurfFunction.gxx
CommitLineData
b311480e 1// Created on: 1993-06-03
2// Created by: Jacques GOUSSARD
3// Copyright (c) 1993-1999 Matra Datavision
4// Copyright (c) 1999-2012 OPEN CASCADE SAS
5//
6// The content of this file is subject to the Open CASCADE Technology Public
7// License Version 6.5 (the "License"). You may not use the content of this file
8// except in compliance with the License. Please obtain a copy of the License
9// at http://www.opencascade.org and read it completely before using this file.
10//
11// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13//
14// The Original Code and all software distributed under the License is
15// distributed on an "AS IS" basis, without warranty of any kind, and the
16// Initial Developer hereby disclaims all such warranties, including without
17// limitation, any warranties of merchantability, fitness for a particular
18// purpose or non-infringement. Please see the License for the specific terms
19// and conditions governing the rights and limitations under the License.
20
733a0e55 21
7fd59977 22// jag 940616 #define Tolpetit 1.e-16
23
24
25#include <gp.hxx>
26
27
28Contap_SurfFunction::Contap_SurfFunction ():
29 myMean(1.),
30 myType(Contap_ContourStd),
31 myDir(0.,0.,1.),
32 myCosAng(0.), // PI/2 - Angle de depouille
33 tol(1.e-6),
34 computed(Standard_False),
35 derived(Standard_False)
36{}
37
38void Contap_SurfFunction::Set(const TheSurface& S)
39{
40 mySurf = S;
41 Standard_Integer i;
42 Standard_Integer nbs = TheContTool::NbSamplePoints(S);
43 Standard_Real U,V;
44 gp_Vec norm;
45 if (nbs > 0) {
46 myMean = 0.;
47 for (i = 1; i <= nbs; i++) {
48 TheContTool::SamplePoint(S,i,U,V);
49// TheSurfaceTool::D1(S,U,V,solpt,d1u,d1v);
50// myMean = myMean + d1u.Crossed(d1v).Magnitude();
51 TheSurfProps::Normale(S,U,V,solpt,norm);
52 myMean = myMean + norm.Magnitude();
53 }
54 myMean = myMean / ((Standard_Real)nbs);
55 }
56 computed = Standard_False;
57 derived = Standard_False;
58}
59
60
61Standard_Integer Contap_SurfFunction::NbVariables () const
62{
63 return 2;
64}
65
66Standard_Integer Contap_SurfFunction::NbEquations () const
67{
68 return 1;
69}
70
71
72Standard_Boolean Contap_SurfFunction::Value(const math_Vector& X,
73 math_Vector& F)
74{
75 Usol = X(1); Vsol = X(2);
76// TheSurfaceTool::D1(mySurf,Usol,Vsol,solpt,d1u,d1v);
77// gp_Vec norm(d1u.Crossed(d1v));
78 gp_Vec norm;
79 TheSurfProps::Normale(mySurf,Usol,Vsol,solpt,norm);
80 switch (myType) {
81 case Contap_ContourStd:
82 {
83 F(1) = valf = (norm.Dot(myDir))/myMean;
84 }
85 break;
86 case Contap_ContourPrs:
87 {
88 F(1) = valf = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
89 }
90 break;
91 case Contap_DraftStd:
92 {
93 F(1) = valf = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
94 }
95 break;
96 default:
97 {
98 }
99 }
100 computed = Standard_False;
101 derived = Standard_False;
102 return Standard_True;
103}
104
105
106Standard_Boolean Contap_SurfFunction::Derivatives(const math_Vector& X,
107 math_Matrix& Grad)
108{
109// gp_Vec d2u,d2v,d2uv;
110 Usol = X(1); Vsol = X(2);
111// TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
112
113 gp_Vec norm,dnu,dnv;
114 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
115
116 switch (myType) {
117 case Contap_ContourStd:
118 {
119// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
120// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
121 Grad(1,1) = (dnu.Dot(myDir))/myMean;
122 Grad(1,2) = (dnv.Dot(myDir))/myMean;
123 }
124 break;
125 case Contap_ContourPrs:
126 {
127 gp_Vec Ep(myEye,solpt);
128 Grad(1,1) = (dnu.Dot(Ep))/myMean;
129 Grad(1,2) = (dnv.Dot(Ep))/myMean;
130 }
131 break;
132 case Contap_DraftStd:
133 {
134// gp_Vec norm(d1u.Crossed(d1v).Normalized());
135// gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
136// Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
137// dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
138// Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
139 norm.Normalize();
140 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
141 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
142 }
143 break;
144 case Contap_DraftPrs:
145 default:
146 {
147 }
148 }
149 Fpu = Grad(1,1); Fpv = Grad(1,2);
150 computed = Standard_False;
151 derived = Standard_True;
152 return Standard_True;
153}
154
155
156Standard_Boolean Contap_SurfFunction::Values (const math_Vector& X,
157 math_Vector& F,
158 math_Matrix& Grad)
159{
160// gp_Vec d2u,d2v,d2uv;
161
162 Usol = X(1); Vsol = X(2);
163// TheSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
164// gp_Vec norm(d1u.Crossed(d1v));
165 gp_Vec norm,dnu,dnv;
166 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
167
168 switch (myType) {
169
170 case Contap_ContourStd:
171 {
172 F(1) = (norm.Dot(myDir))/myMean;
173// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
174// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
175 Grad(1,1) = (dnu.Dot(myDir))/myMean;
176 Grad(1,2) = (dnv.Dot(myDir))/myMean;
177 }
178 break;
179 case Contap_ContourPrs:
180 {
181 gp_Vec Ep(myEye,solpt);
182 F(1) = (norm.Dot(Ep))/myMean;
183// Grad(1,1) = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
184// Grad(1,2) = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
185 Grad(1,1) = (dnu.Dot(Ep))/myMean;
186 Grad(1,2) = (dnv.Dot(Ep))/myMean;
187 }
188 break;
189 case Contap_DraftStd:
190 {
191 F(1) = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
192 norm.Normalize();
193/*
194 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
195 Grad(1,1) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
196 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
197 Grad(1,2) = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
198*/
199 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
200 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
201 }
202 break;
203 case Contap_DraftPrs:
204 default:
205 {
206 }
207 }
208 valf = F(1);
209 Fpu = Grad(1,1); Fpv = Grad(1,2);
210 computed = Standard_False;
211 derived = Standard_True;
212 return Standard_True;
213}
214
215
216Standard_Boolean Contap_SurfFunction::IsTangent ()
217{
218 if (!computed) {
219 computed = Standard_True;
220 if(!derived) {
221// gp_Vec d2u,d2v,d2uv;
222// TheSurfaceTool::D2(mySurf, Usol, Vsol, solpt, d1u, d1v, d2u, d2v, d2uv);
223 gp_Vec norm,dnu,dnv;
224 TheSurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
225
226 switch (myType) {
227 case Contap_ContourStd:
228 {
229// Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(myDir))/myMean;
230// Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(myDir))/myMean;
231 Fpu = (dnu.Dot(myDir))/myMean;
232 Fpv = (dnv.Dot(myDir))/myMean;
233 }
234 break;
235 case Contap_ContourPrs:
236 {
237 gp_Vec Ep(myEye,solpt);
238// Fpu = ((d2u.Crossed(d1v) + d1u.Crossed(d2uv)).Dot(Ep))/myMean;
239// Fpv = ((d2uv.Crossed(d1v) + d1u.Crossed(d2v)).Dot(Ep))/myMean;
240 Fpu = (dnu.Dot(Ep))/myMean;
241 Fpv = (dnv.Dot(Ep))/myMean;
242 }
243 break;
244 case Contap_DraftStd:
245 {
246/*
247 gp_Vec norm(d1u.Crossed(d1v).Normalized());
248 gp_Vec dnorm(d2u.Crossed(d1v) + d1u.Crossed(d2uv));
249 Fpu = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
250 dnorm = d2uv.Crossed(d1v) + d1u.Crossed(d2v);
251 Fpv = (dnorm.Dot(myDir)-myCosAng*dnorm.Dot(norm))/myMean;
252*/
253 norm.Normalize();
254 Fpu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
255 Fpv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
256 }
257 break;
258 case Contap_DraftPrs:
259 default:
260 {
261 }
262 }
263 derived = Standard_True;
264 }
265 tangent = Standard_False;
266 Standard_Real D = Sqrt (Fpu * Fpu + Fpv * Fpv);
267
268 if (D <= gp::Resolution()) {
269 tangent = Standard_True;
270 }
271 else {
272 d2d = gp_Dir2d(-Fpv,Fpu);
273 gp_Vec d1u,d1v;
274 TheSurfaceTool::D1(mySurf, Usol, Vsol, solpt, d1u, d1v); // ajout jag 02.95
275
276 gp_XYZ d3dxyz(-Fpv*d1u.XYZ());
277 d3dxyz.Add(Fpu*d1v.XYZ());
278 d3d.SetXYZ(d3dxyz);
279
280 //jag 940616 if (d3d.Magnitude() <= Tolpetit) {
281 if (d3d.Magnitude() <= tol) {
282 tangent = Standard_True;
283 }
284 }
285 }
286 return tangent;
287}