1 // File: Extrema_FuncExtSS.cxx
2 // Created: Tue Jan 9 10:13:04 1996
3 // Author: Laurent PAINNOT
7 #include <Extrema_FuncExtSS.ixx>
8 #include <Standard_TypeMismatch.hxx>
12 /*----------------------------------------------------------------------------
13 Si on note Du1s et Dv1s, les derivees en u1 et v1, les 2 fonctions a annuler sont:
14 Si on note Du2s et Dv2s, les derivees en u2 et v2, les 2 fonctions a annuler sont:
16 { F1(u1,v1,u2,v2) = (S1(u1,v1)-S2(u2,v2)).Du1s1(u1,v1) }
17 { F2(u1,v1,u2,v2) = (S1(u1,v1)-S2(u2,v2)).Dv1s1(u1,v1) }
18 { F3(u1,v1,u2,v2) = (S1(u1,v1)-S2(u2,v2)).Du2s2(u2,v2) }
19 { F4(u1,v1,u2,v2) = (S1(u1,v1)-S2(u2,v2)).Dv2s2(u2,v2) }
21 { du1f1(u1,v1,u2,v2) = Du1s1(u1,v1).Du1s1(u1,v1)+(S1(u1,v1)-S2(u2,v2)).Du1u1s1(u1,v1)
22 = ||Du1s1(u1,v1)||**2 +(S1(u1,v1)-S2(u2,v2)).Du1u1s1(u1,v1) }
23 { dv1f1(u1,v1,u2,v2) = Dv1s1(u1,v1).Du1s1(u1,v1)+(S1(u1,v1)-S2(u2,v2)).Du1v1s1(u1,v1) }
24 { du2f1(u1,v1,u2,v2) = -Du2s2(u2,v2).Du1s1(u1,v1) }
25 { dv2f1(u1,v1,u2,v2) = -Dv2s2(u2,v2).Du1s1(u1,v1) }
27 { du1f2(u1,v1,u2,v2) = Du1s1(u1,v1).Dv1s1(u1,v1)+(S1(u1,v1)-S2(u2,v2)).Du1v1s1(u1,v1) }
28 { dv1f2(u1,v1,u2,v2) = Dv1s1(u1,v1).Dv1s1(u1,v1)+(S1(u1,v1)-S2(u2,v2)).Dv1v1s1(u1,v1)
29 = ||Dv1s1(u1,v1)||**2 +(S1(u1,v1)-S2(u2,v2)).Dv1v1s1(u1,v1) }
30 { du2f2(u1,v1,u2,v2) = -Du2s2(u2,v2).Dv1s1(u1,v1) }
31 { dv2f2(u1,v1,u2,v2) = -Dv2s2(u2,v2).Dv1s1(u1,v1) }
33 { du1f3(u1,v1,u2,v2) = Du1s1(u1,v1).Du2s2(u2,v2) }
34 { dv1f3(u1,v1,u2,v2) = Dv1s1(u1,v1).Du2s2(u2,v2) }
35 { du2f3(u1,v1,u2,v2) = -Du2s2(u2,v2).Du2s2(u2,v2)+(S1(u1,v1)-S2(u2,v2)).Du2u2s2(u2,v2)
36 = -||Du2s2(u2,v2)||**2 +(S1(u1,v1)-S2(u2,v2)).Du2u2s2(u2,v2) }
37 { dv2f3(u1,v1,u2,v2) = -Dv2s2(u2,v2).Du2s2(u2,v2)+(S1(u1,v1)-S2(u2,v2)).Dv2u2s2(u2,v2) }
39 { du1f4(u1,v1,u2,v2) = Du1s1(u1,v1).Dv2s2(u2,v2) }
40 { dv1f4(u1,v1,u2,v2) = Dv1s1(u1,v1).Dv2s2(u2,v2) }
41 { du2f4(u1,v1,u2,v2) = -Du2s2(u2,v2).Dv2s2(u2,v2)+(S1(u1,v1)-S2(u2,v2)).Du2v2s2(u2,v2) }
42 { dv2f4(u1,v1,u2,v2) = -Dv2s2(u2,v2).Dv2s2(u2,v2)+(S1(u1,v1)-S2(u2,v2)).Dv2v2s2(u2,v2)
43 = -||Dv2s2(u2,v2)||**2 +(S1(u1,v1)-S2(u2,v2)).Dv2v2s2(u2,v2) }
45 ----------------------------------------------------------------------------*/
48 //=======================================================================
49 //function : Extrema_FuncExtSS
51 //=======================================================================
53 Extrema_FuncExtSS::Extrema_FuncExtSS ()
55 myS1init = Standard_False;
56 myS2init = Standard_False;
59 //=======================================================================
60 //function : Extrema_FuncExtSS
62 //=======================================================================
64 Extrema_FuncExtSS::Extrema_FuncExtSS (const Adaptor3d_Surface& S1,
65 const Adaptor3d_Surface& S2)
67 myS1 = (Adaptor3d_SurfacePtr)&S1;
68 myS2 = (Adaptor3d_SurfacePtr)&S2;
69 myS1init = Standard_True;
70 myS2init = Standard_True;
73 //=======================================================================
74 //function : Initialize
76 //=======================================================================
78 void Extrema_FuncExtSS::Initialize(const Adaptor3d_Surface& S1,
79 const Adaptor3d_Surface& S2)
81 myS1 = (Adaptor3d_SurfacePtr)&S1;
82 myS2 = (Adaptor3d_SurfacePtr)&S2;
83 myS1init = Standard_True;
84 myS2init = Standard_True;
92 //=======================================================================
93 //function : NbVariables
95 //=======================================================================
97 Standard_Integer Extrema_FuncExtSS::NbVariables () const { return 4;}
100 //=======================================================================
101 //function : NbEquations
103 //=======================================================================
105 Standard_Integer Extrema_FuncExtSS::NbEquations () const { return 4;}
108 //=======================================================================
111 //=======================================================================
113 Standard_Boolean Extrema_FuncExtSS::Value (const math_Vector& UV,
116 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
123 myS1->D1(myU1,myV1,myP1,Du1s1,Dv1s1);
124 myS2->D1(myU2,myV2,myP2,Du2s2,Dv2s2);
126 gp_Vec P1P2 (myP2,myP1);
128 F(1) = P1P2.Dot(Du1s1);
129 F(2) = P1P2.Dot(Dv1s1);
130 F(3) = P1P2.Dot(Du2s2);
131 F(4) = P1P2.Dot(Dv2s2);
133 return Standard_True;
136 //=======================================================================
137 //function : Derivatives
139 //=======================================================================
141 Standard_Boolean Extrema_FuncExtSS::Derivatives (const math_Vector& UV,
145 return Values(UV,F,Df);
148 //=======================================================================
151 //=======================================================================
153 Standard_Boolean Extrema_FuncExtSS::Values (const math_Vector& UV,
157 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
162 gp_Vec Du1s1, Dv1s1, Du1u1s1, Dv1v1s1, Du1v1s1;
163 gp_Vec Du2s2, Dv2s2, Du2u2s2, Dv2v2s2, Du2v2s2;
164 myS1->D2(myU1,myV1,myP1,Du1s1,Dv1s1,Du1u1s1,Dv1v1s1,Du1v1s1);
165 myS2->D2(myU2,myV2,myP2,Du2s2,Dv2s2,Du2u2s2,Dv2v2s2,Du2v2s2);
167 gp_Vec P1P2 (myP2,myP1);
169 F(1) = P1P2.Dot(Du1s1);
170 F(2) = P1P2.Dot(Dv1s1);
171 F(3) = P1P2.Dot(Du2s2);
172 F(4) = P1P2.Dot(Dv2s2);
174 Df(1,1) = Du1s1.SquareMagnitude() + P1P2.Dot(Du1u1s1);
175 Df(1,2) = Dv1s1.Dot(Du1s1) + P1P2.Dot(Du1v1s1);
176 Df(1,3) = -Du2s2.Dot(Du1s1);
177 Df(1,4) = -Dv2s2.Dot(Du1s1);
179 Df(2,1) = Df(1, 2); // Du1s1.Dot(Dv1s1) + P1P2.Dot(Du1v1s1);
180 Df(2,2) = Dv1s1.SquareMagnitude() + P1P2.Dot(Dv1v1s1);
181 Df(2,3) = -Du2s2.Dot(Dv1s1);
182 Df(2,4) = -Dv2s2.Dot(Dv1s1);
184 Df(3,1) = -Df(1,3); // Du1s1.Dot(Du2s2);
185 Df(3,2) = -Df(2,3); // Dv1s1.Dot(Du2s2);
186 Df(3,3) = -Du2s2.SquareMagnitude() + P1P2.Dot(Du2u2s2);
187 Df(3,4) = -Dv2s2.Dot(Du2s2) + P1P2.Dot(Du2v2s2);
189 Df(4,1) = -Df(1,4); // Du1s1.Dot(Dv2s2);
190 Df(4,2) = -Df(2,4); // Dv1s1.Dot(Dv2s2);
191 Df(4,3) = Df(3,4); // -Du2s2.Dot(Dv2s2) + P1P2.Dot(Du2v2s2);
192 Df(4,4) = -Dv2s2.SquareMagnitude() + P1P2.Dot(Dv2v2s2);
194 return Standard_True;
197 //=======================================================================
198 //function : GetStateNumber
200 //=======================================================================
202 Standard_Integer Extrema_FuncExtSS::GetStateNumber ()
204 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
206 math_Vector Sol(1, 4), UVSol(1, 4);
207 UVSol(1) = myU1; UVSol(2) = myV1; UVSol(3) = myU2; UVSol(4) = myV2;
209 cout <<"F(1)= "<<Sol(1)<<" F(2)= "<<Sol(2)<<" F(3)= "<<Sol(3)<<" F(4)= "<<Sol(4)<<endl;
212 mySqDist.Append(myP1.SquareDistance(myP2));
213 myPoint1.Append(Extrema_POnSurf(myU1,myV1,myP1));
214 myPoint2.Append(Extrema_POnSurf(myU2,myV2,myP2));
218 //=======================================================================
221 //=======================================================================
223 Standard_Integer Extrema_FuncExtSS::NbExt () const
225 return mySqDist.Length();
228 //=======================================================================
229 //function : SquareDistance
231 //=======================================================================
233 Standard_Real Extrema_FuncExtSS::SquareDistance (const Standard_Integer N) const
235 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
236 return mySqDist.Value(N);
239 //=======================================================================
240 //function : PointOnS1
242 //=======================================================================
244 Extrema_POnSurf Extrema_FuncExtSS::PointOnS1 (const Standard_Integer N) const
246 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
247 return myPoint1.Value(N);
249 //=======================================================================
250 //function : PointOnS2
252 //=======================================================================
254 Extrema_POnSurf Extrema_FuncExtSS::PointOnS2 (const Standard_Integer N) const
256 if (!myS1init || !myS2init) Standard_TypeMismatch::Raise();
257 return myPoint2.Value(N);