1 // File: GccIter_FunctionTanCuCuOnCu.cxx
2 // Created: Mon Jan 20 16:35:40 1992
6 #include <Standard_ConstructionError.hxx>
9 void GccIter_FunctionTanCuCuOnCu::
10 InitDerivative(const math_Vector& X,
21 case GccIter_CuCuOnCu:
23 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
24 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
25 TheCurveTool::D2(Curvon,X(3),Point3,Tan3,D23);
28 case GccIter_CiCuOnCu:
30 ElCLib::D2(X(1),Circ1,Point1,Tan1,D21);
31 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
32 TheCurveTool::D2(Curvon,X(3),Point3,Tan3,D23);
35 case GccIter_LiCuOnCu:
37 ElCLib::D1(X(1),Lin1,Point1,Tan1);
38 D21 = gp_Vec2d(0.,0.);
39 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
40 TheCurveTool::D2(Curvon,X(3),Point3,Tan3,D23);
43 case GccIter_CuPtOnCu:
45 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
46 TheCurveTool::D2(Curvon,X(3),Point3,Tan3,D23);
48 Tan2 = gp_Vec2d(0.,0.);
49 D22 = gp_Vec2d(0.,0.);
52 case GccIter_CuCuOnCi:
54 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
55 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
56 ElCLib::D2(X(3),Circon,Point3,Tan3,D23);
59 case GccIter_CiCuOnCi:
61 ElCLib::D2(X(1),Circ1,Point1,Tan1,D21);
62 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
63 ElCLib::D2(X(3),Circon,Point3,Tan3,D23);
66 case GccIter_LiCuOnCi:
68 ElCLib::D1(X(1),Lin1,Point1,Tan1);
69 D21 = gp_Vec2d(0.,0.);
70 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
71 ElCLib::D2(X(3),Circon,Point3,Tan3,D23);
74 case GccIter_CuPtOnCi:
76 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
78 Tan2 = gp_Vec2d(0.,0.);
79 D22 = gp_Vec2d(0.,0.);
80 ElCLib::D2(X(3),Circon,Point3,Tan3,D23);
83 case GccIter_CuCuOnLi:
85 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
86 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
87 ElCLib::D1(X(3),Linon,Point3,Tan3);
88 D23 = gp_Vec2d(0.,0.);
91 case GccIter_CiCuOnLi:
93 ElCLib::D2(X(1),Circ1,Point1,Tan1,D21);
94 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
95 ElCLib::D1(X(3),Linon,Point3,Tan3);
96 D23 = gp_Vec2d(0.,0.);
99 case GccIter_LiCuOnLi:
101 ElCLib::D1(X(1),Lin1,Point1,Tan1);
102 TheCurveTool::D2(Curv2,X(2),Point2,Tan2,D22);
103 D21 = gp_Vec2d(0.,0.);
104 ElCLib::D1(X(3),Linon,Point3,Tan3);
105 D23 = gp_Vec2d(0.,0.);
108 case GccIter_CuPtOnLi:
110 TheCurveTool::D2(Curv1,X(1),Point1,Tan1,D21);
112 Tan2 = gp_Vec2d(0.,0.);
113 D22 = gp_Vec2d(0.,0.);
114 ElCLib::D1(X(3),Linon,Point3,Tan3);
115 D23 = gp_Vec2d(0.,0.);
120 Standard_ConstructionError::Raise();
125 GccIter_FunctionTanCuCuOnCu::
126 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
129 const Standard_Real Rad ) {
134 TheType = GccIter_CuCuOnCu;
137 GccIter_FunctionTanCuCuOnCu::
138 GccIter_FunctionTanCuCuOnCu(const gp_Circ2d& C1 ,
141 const Standard_Real Rad ) {
146 TheType = GccIter_CiCuOnCu;
149 GccIter_FunctionTanCuCuOnCu::
150 GccIter_FunctionTanCuCuOnCu(const gp_Lin2d& L1 ,
153 const Standard_Real Rad ) {
158 TheType = GccIter_LiCuOnCu;
161 GccIter_FunctionTanCuCuOnCu::
162 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
165 const Standard_Real Rad ) {
170 TheType = GccIter_CuPtOnCu;
173 GccIter_FunctionTanCuCuOnCu::
174 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
176 const gp_Lin2d& OnLi ,
177 const Standard_Real Rad ) {
182 TheType = GccIter_CuCuOnLi;
185 GccIter_FunctionTanCuCuOnCu::
186 GccIter_FunctionTanCuCuOnCu(const gp_Circ2d& C1 ,
188 const gp_Lin2d& OnLi ,
189 const Standard_Real Rad ) {
194 TheType = GccIter_CiCuOnLi;
197 GccIter_FunctionTanCuCuOnCu::
198 GccIter_FunctionTanCuCuOnCu(const gp_Lin2d& L1 ,
200 const gp_Lin2d& OnLi ,
201 const Standard_Real Rad ) {
206 TheType = GccIter_LiCuOnLi;
209 GccIter_FunctionTanCuCuOnCu::
210 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
212 const gp_Lin2d& OnLi ,
213 const Standard_Real Rad ) {
218 TheType = GccIter_CuPtOnLi;
221 GccIter_FunctionTanCuCuOnCu::
222 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
224 const gp_Circ2d& OnCi ,
225 const Standard_Real Rad ) {
230 TheType = GccIter_CuCuOnCi;
233 GccIter_FunctionTanCuCuOnCu::
234 GccIter_FunctionTanCuCuOnCu(const gp_Circ2d& C1 ,
236 const gp_Circ2d& OnCi ,
237 const Standard_Real Rad ) {
242 TheType = GccIter_CuCuOnCi;
245 GccIter_FunctionTanCuCuOnCu::
246 GccIter_FunctionTanCuCuOnCu(const gp_Lin2d& L1 ,
248 const gp_Circ2d& OnCi ,
249 const Standard_Real Rad ) {
254 TheType = GccIter_LiCuOnCi;
257 GccIter_FunctionTanCuCuOnCu::
258 GccIter_FunctionTanCuCuOnCu(const TheCurve& C1 ,
260 const gp_Circ2d& OnCi ,
261 const Standard_Real Rad ) {
266 TheType = GccIter_CuPtOnCi;
269 Standard_Integer GccIter_FunctionTanCuCuOnCu::
270 NbVariables () const { return 4; }
272 Standard_Integer GccIter_FunctionTanCuCuOnCu::
273 NbEquations () const { return 4; }
275 Standard_Boolean GccIter_FunctionTanCuCuOnCu::
276 Value (const math_Vector& X ,
277 math_Vector& Fval ) {
278 gp_Pnt2d Point1,Point2,Point3;
279 gp_Vec2d Tan1,Tan2,Tan3,D21,D22,D23;
280 InitDerivative(X,Point1,Point2,Point3,Tan1,Tan2,Tan3,D21,D22,D23);
281 //pipj (normes) et PiPj (non Normes).
282 gp_Vec2d P1P2(Point1,Point2);
283 gp_Vec2d P2P3(Point2,Point3);
284 gp_Vec2d P3P1(Point3,Point1);
285 gp_Vec2d p1p2,p2p3,p3p1;
286 // if (FirstRad < 1.) {FirstRad = 1.; }
287 p1p2 = P1P2/FirstRad;
288 p2p3 = P2P3/FirstRad;
289 p3p1 = P3P1/FirstRad;
291 Standard_Real nnor1 = Tan1.Magnitude();
292 Standard_Real nnor2 = Tan2.Magnitude();
295 Fval(1) = (P3P1.Dot(P3P1)-X(4)*X(4))/(FirstRad*FirstRad);
296 Fval(2) = (P2P3.Dot(P2P3)-X(4)*X(4))/(FirstRad*FirstRad);
297 Fval(3) = P3P1.Dot(Tan1)/(nnor1*FirstRad);
298 Fval(4) = P2P3.Dot(Tan2)/(nnor2*FirstRad);
299 return Standard_True;
302 Standard_Boolean GccIter_FunctionTanCuCuOnCu::
303 Derivatives (const math_Vector& X ,
304 math_Matrix& Deriv ) {
305 gp_Pnt2d Point1,Point2,Point3;
306 gp_Vec2d Tan1,Tan2,Tan3;
307 gp_Vec2d D21,D22,D23;
308 InitDerivative(X,Point1,Point2,Point3,Tan1,Tan2,Tan3,D21,D22,D23);
309 //pipj (normes) et PiPj (non Normes).
310 gp_Vec2d P1P2(Point1,Point2);
311 gp_Vec2d P2P3(Point2,Point3);
312 gp_Vec2d P3P1(Point3,Point1);
313 gp_Vec2d p1p2,p2p3,p3p1;
314 // if (FirstRad < 1.) {FirstRad = 1.; }
315 p1p2 = P1P2/FirstRad;
316 p2p3 = P2P3/FirstRad;
317 p3p1 = P3P1/FirstRad;
318 //normales au courbes normees Nori et non nromees nori et norme des nori.
319 Standard_Real nnor1 = Tan1.Magnitude();
320 Standard_Real nnor2 = Tan2.Magnitude();
321 // Derivees dFui/uj 1 <= ui <= 3 , 1 <= uj <= 3
322 // =============================================
323 Deriv(1,1) = 2.*Tan1.Dot(P3P1)/(FirstRad*FirstRad);
325 Deriv(1,3) = -2.*Tan3.Dot(P3P1)/(FirstRad*FirstRad);
326 Deriv(1,4) = -2.*X(4)/(FirstRad*FirstRad);
329 Deriv(2,2) = -2.*Tan2.Dot(P2P3)/(FirstRad*FirstRad);
330 Deriv(2,3) = 2.*Tan3.Dot(P2P3)/(FirstRad*FirstRad);
331 Deriv(2,4) = -2.*X(4)/(FirstRad*FirstRad);
333 Deriv(3,1) = (P3P1.Dot(D21)+Tan1.Dot(Tan1))/(FirstRad*nnor1)-
334 (P3P1.Dot(Tan1)*D21.Dot(Tan1))/(FirstRad*nnor1*nnor1*nnor1);
336 Deriv(3,3) = -(Tan3.Dot(Tan1))/(FirstRad*nnor1);
340 Deriv(4,2) = (P2P3.Dot(D22)-Tan2.Dot(Tan2))/(FirstRad*nnor2)-
341 P2P3.Dot(Tan2)*Tan2.Dot(D22)/(FirstRad*nnor2*nnor2*nnor2);
342 Deriv(4,3) = Tan3.Dot(Tan2)/(FirstRad*nnor1);
344 return Standard_True;
347 Standard_Boolean GccIter_FunctionTanCuCuOnCu::
348 Values (const math_Vector& X ,
350 math_Matrix& Deriv ) {
351 gp_Pnt2d Point1,Point2,Point3;
352 gp_Vec2d Tan1,Tan2,Tan3;
353 gp_Vec2d D21,D22,D23;
354 InitDerivative(X,Point1,Point2,Point3,Tan1,Tan2,Tan3,D21,D22,D23);
355 //pipj (normes) et PiPj (non Normes).
356 gp_Vec2d P1P2(Point1,Point2);
357 gp_Vec2d P2P3(Point2,Point3);
358 gp_Vec2d P3P1(Point3,Point1);
359 gp_Vec2d p1p2,p2p3,p3p1;
360 // if (FirstRad < 1.) {FirstRad = 1.; }
361 p1p2 = P1P2/FirstRad;
362 p2p3 = P2P3/FirstRad;
363 p3p1 = P3P1/FirstRad;
364 //normales au courbes normees Nori et non nromees nori et norme des nori.
365 Standard_Real nnor1 = Tan1.Magnitude();
366 Standard_Real nnor2 = Tan2.Magnitude();
369 Fval(1) = (P3P1.Dot(P3P1)-X(4)*X(4))/(FirstRad*FirstRad);
370 Fval(2) = (P2P3.Dot(P2P3)-X(4)*X(4))/(FirstRad*FirstRad);
371 Fval(3) = P3P1.Dot(Tan1)/(nnor1*FirstRad);
372 Fval(4) = P2P3.Dot(Tan2)/(nnor2*FirstRad);
373 // Derivees dFui/uj 1 <= ui <= 3 , 1 <= uj <= 3
374 // =============================================
375 Deriv(1,1) = 2.*Tan1.Dot(P3P1)/(FirstRad*FirstRad);
377 Deriv(1,3) = -2.*Tan3.Dot(P3P1)/(FirstRad*FirstRad);
378 Deriv(1,4) = -2.*X(4)/(FirstRad*FirstRad);
381 Deriv(2,2) = -2.*Tan2.Dot(P2P3)/(FirstRad*FirstRad);
382 Deriv(2,3) = 2.*Tan3.Dot(P2P3)/(FirstRad*FirstRad);
383 Deriv(2,4) = -2.*X(4)/(FirstRad*FirstRad);
385 Deriv(3,1) = (P3P1.Dot(D21)+Tan1.Dot(Tan1))/(FirstRad*nnor1)-
386 (P3P1.Dot(Tan1)*D21.Dot(Tan1))/(FirstRad*nnor1*nnor1*nnor1);
388 Deriv(3,3) = -(Tan3.Dot(Tan1))/(FirstRad*nnor1);
392 Deriv(4,2) = (P2P3.Dot(D22)-Tan2.Dot(Tan2))/(FirstRad*nnor2)-
393 P2P3.Dot(Tan2)*Tan2.Dot(D22)/(FirstRad*nnor2*nnor2*nnor2);
394 Deriv(4,3) = Tan3.Dot(Tan2)/(FirstRad*nnor1);
396 return Standard_True;