0026850: Replace nested instantiations of TCollection generic classes by NCollection...
[occt.git] / src / Contap / Contap_SurfFunction.cxx
CommitLineData
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
42cf5bc1 19#include <Adaptor3d_HSurface.hxx>
e2065c2f 20#include <Adaptor3d_HSurfaceTool.hxx>
42cf5bc1 21#include <Contap_HContTool.hxx>
22#include <Contap_SurfFunction.hxx>
23#include <Contap_SurfProps.hxx>
24#include <gp_Dir.hxx>
25#include <gp_Dir2d.hxx>
26#include <gp_Pnt.hxx>
27#include <gp_Vec.hxx>
28#include <math_Matrix.hxx>
29#include <StdFail_UndefinedDerivative.hxx>
7fd59977 30
31Contap_SurfFunction::Contap_SurfFunction ():
e2065c2f 32 myMean(1.),
33 myType(Contap_ContourStd),
34 myDir(0.,0.,1.),
35 myCosAng(0.), // PI/2 - Angle de depouille
36 tol(1.e-6),
37 computed(Standard_False),
38 derived(Standard_False)
7fd59977 39{}
40
e2065c2f 41void Contap_SurfFunction::Set(const Handle(Adaptor3d_HSurface)& S)
7fd59977 42{
43 mySurf = S;
44 Standard_Integer i;
e2065c2f 45 Standard_Integer nbs = Contap_HContTool::NbSamplePoints(S);
7fd59977 46 Standard_Real U,V;
47 gp_Vec norm;
48 if (nbs > 0) {
49 myMean = 0.;
50 for (i = 1; i <= nbs; i++) {
e2065c2f 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);
7fd59977 55 myMean = myMean + norm.Magnitude();
56 }
57 myMean = myMean / ((Standard_Real)nbs);
58 }
59 computed = Standard_False;
60 derived = Standard_False;
61}
62
63
64Standard_Integer Contap_SurfFunction::NbVariables () const
65{
66 return 2;
67}
68
69Standard_Integer Contap_SurfFunction::NbEquations () const
70{
71 return 1;
72}
73
74
75Standard_Boolean Contap_SurfFunction::Value(const math_Vector& X,
e2065c2f 76 math_Vector& F)
7fd59977 77{
78 Usol = X(1); Vsol = X(2);
e2065c2f 79 // Adaptor3d_HSurfaceTool::D1(mySurf,Usol,Vsol,solpt,d1u,d1v);
80 // gp_Vec norm(d1u.Crossed(d1v));
7fd59977 81 gp_Vec norm;
e2065c2f 82 Contap_SurfProps::Normale(mySurf,Usol,Vsol,solpt,norm);
7fd59977 83 switch (myType) {
84 case Contap_ContourStd:
85 {
86 F(1) = valf = (norm.Dot(myDir))/myMean;
87 }
88 break;
89 case Contap_ContourPrs:
90 {
91 F(1) = valf = (norm.Dot(gp_Vec(myEye,solpt)))/myMean;
92 }
93 break;
94 case Contap_DraftStd:
95 {
96 F(1) = valf = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
97 }
98 break;
99 default:
100 {
101 }
102 }
103 computed = Standard_False;
104 derived = Standard_False;
105 return Standard_True;
106}
107
108
109Standard_Boolean Contap_SurfFunction::Derivatives(const math_Vector& X,
e2065c2f 110 math_Matrix& Grad)
7fd59977 111{
e2065c2f 112 // gp_Vec d2u,d2v,d2uv;
7fd59977 113 Usol = X(1); Vsol = X(2);
e2065c2f 114 // Adaptor3d_HSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
7fd59977 115
116 gp_Vec norm,dnu,dnv;
e2065c2f 117 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
7fd59977 118
119 switch (myType) {
120 case Contap_ContourStd:
121 {
e2065c2f 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;
7fd59977 124 Grad(1,1) = (dnu.Dot(myDir))/myMean;
125 Grad(1,2) = (dnv.Dot(myDir))/myMean;
126 }
127 break;
128 case Contap_ContourPrs:
129 {
130 gp_Vec Ep(myEye,solpt);
131 Grad(1,1) = (dnu.Dot(Ep))/myMean;
132 Grad(1,2) = (dnv.Dot(Ep))/myMean;
133 }
134 break;
135 case Contap_DraftStd:
136 {
e2065c2f 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;
7fd59977 142 norm.Normalize();
143 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
144 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
145 }
146 break;
147 case Contap_DraftPrs:
148 default:
149 {
150 }
151 }
152 Fpu = Grad(1,1); Fpv = Grad(1,2);
153 computed = Standard_False;
154 derived = Standard_True;
155 return Standard_True;
156}
157
158
159Standard_Boolean Contap_SurfFunction::Values (const math_Vector& X,
e2065c2f 160 math_Vector& F,
161 math_Matrix& Grad)
7fd59977 162{
e2065c2f 163 // gp_Vec d2u,d2v,d2uv;
7fd59977 164
165 Usol = X(1); Vsol = X(2);
e2065c2f 166 // Adaptor3d_HSurfaceTool::D2(mySurf,Usol,Vsol,solpt,d1u,d1v,d2u,d2v,d2uv);
167 // gp_Vec norm(d1u.Crossed(d1v));
7fd59977 168 gp_Vec norm,dnu,dnv;
e2065c2f 169 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
7fd59977 170
171 switch (myType) {
172
173 case Contap_ContourStd:
174 {
175 F(1) = (norm.Dot(myDir))/myMean;
e2065c2f 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;
7fd59977 178 Grad(1,1) = (dnu.Dot(myDir))/myMean;
179 Grad(1,2) = (dnv.Dot(myDir))/myMean;
180 }
181 break;
182 case Contap_ContourPrs:
183 {
184 gp_Vec Ep(myEye,solpt);
185 F(1) = (norm.Dot(Ep))/myMean;
e2065c2f 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;
7fd59977 188 Grad(1,1) = (dnu.Dot(Ep))/myMean;
189 Grad(1,2) = (dnv.Dot(Ep))/myMean;
190 }
191 break;
192 case Contap_DraftStd:
193 {
194 F(1) = (norm.Dot(myDir)-myCosAng*norm.Magnitude())/myMean;
195 norm.Normalize();
e2065c2f 196 /*
7fd59977 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;
e2065c2f 201 */
7fd59977 202 Grad(1,1) = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
203 Grad(1,2) = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
204 }
205 break;
206 case Contap_DraftPrs:
207 default:
208 {
209 }
210 }
211 valf = F(1);
212 Fpu = Grad(1,1); Fpv = Grad(1,2);
213 computed = Standard_False;
214 derived = Standard_True;
215 return Standard_True;
216}
217
218
219Standard_Boolean Contap_SurfFunction::IsTangent ()
220{
221 if (!computed) {
222 computed = Standard_True;
223 if(!derived) {
e2065c2f 224 // gp_Vec d2u,d2v,d2uv;
225 // Adaptor3d_HSurfaceTool::D2(mySurf, Usol, Vsol, solpt, d1u, d1v, d2u, d2v, d2uv);
7fd59977 226 gp_Vec norm,dnu,dnv;
e2065c2f 227 Contap_SurfProps::NormAndDn(mySurf,Usol,Vsol,solpt,norm,dnu,dnv);
7fd59977 228
229 switch (myType) {
230 case Contap_ContourStd:
e2065c2f 231 {
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;
236 }
237 break;
7fd59977 238 case Contap_ContourPrs:
e2065c2f 239 {
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;
245 }
246 break;
7fd59977 247 case Contap_DraftStd:
e2065c2f 248 {
249 /*
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;
255 */
256 norm.Normalize();
257 Fpu = (dnu.Dot(myDir)-myCosAng*dnu.Dot(norm))/myMean;
258 Fpv = (dnv.Dot(myDir)-myCosAng*dnv.Dot(norm))/myMean;
259 }
260 break;
7fd59977 261 case Contap_DraftPrs:
262 default:
e2065c2f 263 {
264 }
7fd59977 265 }
266 derived = Standard_True;
267 }
268 tangent = Standard_False;
269 Standard_Real D = Sqrt (Fpu * Fpu + Fpv * Fpv);
270
271 if (D <= gp::Resolution()) {
272 tangent = Standard_True;
273 }
274 else {
275 d2d = gp_Dir2d(-Fpv,Fpu);
276 gp_Vec d1u,d1v;
e2065c2f 277 Adaptor3d_HSurfaceTool::D1(mySurf, Usol, Vsol, solpt, d1u, d1v); // ajout jag 02.95
7fd59977 278
279 gp_XYZ d3dxyz(-Fpv*d1u.XYZ());
280 d3dxyz.Add(Fpu*d1v.XYZ());
281 d3d.SetXYZ(d3dxyz);
e2065c2f 282
7fd59977 283 //jag 940616 if (d3d.Magnitude() <= Tolpetit) {
284 if (d3d.Magnitude() <= tol) {
e2065c2f 285 tangent = Standard_True;
7fd59977 286 }
287 }
288 }
289 return tangent;
290}