1 
2 #include "myExtrema_GenExtSS.hxx"
3 #include "myExtrema_GenExtSS.jxx"
4 #include <math_Vector.hxx>
5 #include "mymath_FunctionSetRoot.hxx"
6 
7 //=======================================================================
8 //function : myExtrema_GenExtSS
9 //purpose  :
10 //=======================================================================
11 
myExtrema_GenExtSS()12  myExtrema_GenExtSS::myExtrema_GenExtSS()
13 {
14   myDone = Standard_False;
15   myInit = Standard_False;
16 }
17 
18 //=======================================================================
19 //function : myExtrema_GenExtSS
20 //purpose  :
21 //=======================================================================
22 
myExtrema_GenExtSS(const Adaptor3d_Surface & S1,const Adaptor3d_Surface & S2,const Standard_Integer NbU,const Standard_Integer NbV,const Standard_Real Tol1,const Standard_Real Tol2)23 myExtrema_GenExtSS::myExtrema_GenExtSS(const Adaptor3d_Surface& S1,
24 				   const Adaptor3d_Surface& S2,
25 				   const Standard_Integer NbU,
26 				   const Standard_Integer NbV,
27 				   const Standard_Real    Tol1,
28 				   const Standard_Real    Tol2) : myF(S1,S2)
29 {
30   Initialize(S2, NbU, NbV, Tol2);
31   Perform(S1, Tol1);
32 }
33 
34 //=======================================================================
35 //function : myExtrema_GenExtSS
36 //purpose  :
37 //=======================================================================
38 
myExtrema_GenExtSS(const Adaptor3d_Surface & S1,const Adaptor3d_Surface & S2,const Standard_Integer NbU,const Standard_Integer NbV,const Standard_Real U1min,const Standard_Real U1sup,const Standard_Real V1min,const Standard_Real V1sup,const Standard_Real U2min,const Standard_Real U2sup,const Standard_Real V2min,const Standard_Real V2sup,const Standard_Real Tol1,const Standard_Real Tol2)39 myExtrema_GenExtSS::myExtrema_GenExtSS(const Adaptor3d_Surface& S1,
40 				   const Adaptor3d_Surface& S2,
41 				   const Standard_Integer NbU,
42 				   const Standard_Integer NbV,
43 				   const Standard_Real U1min,
44 				   const Standard_Real U1sup,
45 				   const Standard_Real V1min,
46 				   const Standard_Real V1sup,
47 				   const Standard_Real U2min,
48 				   const Standard_Real U2sup,
49 				   const Standard_Real V2min,
50 				   const Standard_Real V2sup,
51 				   const Standard_Real Tol1,
52 				   const Standard_Real Tol2): myF(S1, S2)
53 {
54   Initialize(S2, NbU, NbV, U2min,U2sup,V2min,V2sup,Tol2);
55   Perform(S1, U1min,U1sup,V1min,V1sup,Tol1);
56 }
57 
58 //=======================================================================
59 //function : Initialize
60 //purpose  :
61 //=======================================================================
62 
Initialize(const Adaptor3d_Surface & S2,const Standard_Integer NbU,const Standard_Integer NbV,const Standard_Real Tol2)63 void myExtrema_GenExtSS::Initialize(const Adaptor3d_Surface& S2,
64 				  const Standard_Integer NbU,
65 				  const Standard_Integer NbV,
66 				  const Standard_Real Tol2)
67 {
68   myu2min = S2.FirstUParameter();
69   myu2sup = S2.LastUParameter();
70   myv2min = S2.FirstVParameter();
71   myv2sup = S2.LastVParameter();
72   Initialize(S2,NbU,NbV,myu2min,myu2sup,myv2min,myv2sup,Tol2);
73 }
74 
75 //=======================================================================
76 //function : Initialize
77 //purpose  :
78 //=======================================================================
79 
Initialize(const Adaptor3d_Surface & S2,const Standard_Integer NbU,const Standard_Integer NbV,const Standard_Real U2min,const Standard_Real U2sup,const Standard_Real V2min,const Standard_Real V2sup,const Standard_Real Tol2)80 void myExtrema_GenExtSS::Initialize(const Adaptor3d_Surface& S2,
81 				  const Standard_Integer NbU,
82 				  const Standard_Integer NbV,
83 				  const Standard_Real U2min,
84 				  const Standard_Real U2sup,
85 				  const Standard_Real V2min,
86 				  const Standard_Real V2sup,
87 				  const Standard_Real Tol2)
88 {
89   myS2 = (Adaptor3d_SurfacePtr)&S2;
90   mypoints1 = new TColgp_HArray2OfPnt(0,NbU+1,0,NbV+1);
91   mypoints2 = new TColgp_HArray2OfPnt(0,NbU+1,0,NbV+1);
92   myusample = NbU;
93   myvsample = NbV;
94   myu2min = U2min;
95   myu2sup = U2sup;
96   myv2min = V2min;
97   myv2sup = V2sup;
98   mytol2 = Tol2;
99 
100 // Parametrage de l echantillon sur S2
101 
102   Standard_Real PasU = myu2sup - myu2min;
103   Standard_Real PasV = myv2sup - myv2min;
104   Standard_Real U0 = PasU / myusample / 100.;
105   Standard_Real V0 = PasV / myvsample / 100.;
106   gp_Pnt P1;
107   PasU = (PasU - U0) / (myusample - 1);
108   PasV = (PasV - V0) / (myvsample - 1);
109   U0 = myu2min + U0/2.;
110   V0 = myv2min + V0/2.;
111 
112 // Calcul des distances
113 
114   Standard_Integer NoU, NoV;
115   Standard_Real U, V;
116   for ( NoU = 1, U = U0; NoU <= myusample; NoU++, U += PasU) {
117     for ( NoV = 1, V = V0; NoV <= myvsample; NoV++, V += PasV) {
118       P1 = myS2->Value(U, V);
119       mypoints2->SetValue(NoU,NoV,P1);
120     }
121   }
122 }
123 
124 //=======================================================================
125 //function : Perform
126 //purpose  :
127 //=======================================================================
128 
Perform(const Adaptor3d_Surface & S1,const Standard_Real Tol1)129 void myExtrema_GenExtSS::Perform(const Adaptor3d_Surface& S1,
130 			       const Standard_Real    Tol1)
131 {
132   myu1min = S1.FirstUParameter();
133   myu1sup = S1.LastUParameter();
134   myv1min = S1.FirstVParameter();
135   myv1sup = S1.LastVParameter();
136   Perform(S1, myu1min, myu1sup,myv1min,myv1sup,Tol1);
137 }
138 
139 //=======================================================================
140 //function : Perform
141 //purpose  :
142 //=======================================================================
143 
Perform(const Adaptor3d_Surface & S1,const Standard_Real U1min,const Standard_Real U1sup,const Standard_Real V1min,const Standard_Real V1sup,const Standard_Real Tol1)144 void myExtrema_GenExtSS::Perform(const Adaptor3d_Surface& S1,
145 			       const Standard_Real U1min,
146 			       const Standard_Real U1sup,
147 			       const Standard_Real V1min,
148 			       const Standard_Real V1sup,
149 			       const Standard_Real Tol1)
150 {
151   myF.Initialize(S1,*myS2);
152   myu1min = U1min;
153   myu1sup = U1sup;
154   myv1min = V1min;
155   myv1sup = V1sup;
156   mytol1 = Tol1;
157 
158   Standard_Real U1, V1, U2, V2;
159   Standard_Integer NoU1, NoV1, NoU2, NoV2;
160   gp_Pnt P1, P2;
161 
162 // Parametrage de l echantillon sur S1
163 
164   Standard_Real PasU1 = myu1sup - myu1min;
165   Standard_Real PasV1 = myv1sup - myv1min;
166   Standard_Real U10 = PasU1 / myusample / 100.;
167   Standard_Real V10 = PasV1 / myvsample / 100.;
168   PasU1 = (PasU1 - U10) / (myusample - 1);
169   PasV1 = (PasV1 - V10) / (myvsample - 1);
170   U10 = myu1min + U10/2.;
171   V10 = myv1min + V10/2.;
172 
173   Standard_Real PasU2 = myu2sup - myu2min;
174   Standard_Real PasV2 = myv2sup - myv2min;
175   Standard_Real U20 = PasU2 / myusample / 100.;
176   Standard_Real V20 = PasV2 / myvsample / 100.;
177   PasU2 = (PasU2 - U20) / (myusample - 1);
178   PasV2 = (PasV2 - V20) / (myvsample - 1);
179   U20 = myu2min + U20/2.;
180   V20 = myv2min + V20/2.;
181 
182 // Calcul des distances
183 
184   for ( NoU1 = 1, U1 = U10; NoU1 <= myusample; NoU1++, U1 += PasU1) {
185     for ( NoV1 = 1, V1 = V10; NoV1 <= myvsample; NoV1++, V1 += PasV1) {
186       P1 = S1.Value(U1, V1);
187       mypoints1->SetValue(NoU1,NoV1,P1);
188     }
189   }
190 
191 /*
192 b- Calcul des minima:
193    -----------------
194    b.a) Initialisations:
195 */
196 
197   math_Vector Tol(1, 4);
198   Tol(1) = mytol1;
199   Tol(2) = mytol1;
200   Tol(3) = mytol2;
201   Tol(4) = mytol2;
202   math_Vector UV(1,4), UVinf(1,4), UVsup(1,4);
203   UVinf(1) = myu1min;
204   UVinf(2) = myv1min;
205   UVinf(3) = myu2min;
206   UVinf(4) = myv2min;
207   UVsup(1) = myu1sup;
208   UVsup(2) = myv1sup;
209   UVsup(3) = myu2sup;
210   UVsup(4) = myv2sup;
211 
212 
213   Standard_Real distmin = RealLast(), distmax = 0.0, TheDist;
214 
215   Standard_Integer N1Umin=0,N1Vmin=0,N2Umin=0,N2Vmin=0;
216   gp_Pnt PP1min, PP2min;
217   Standard_Integer N1Umax=0,N1Vmax=0,N2Umax=0,N2Vmax=0;
218   gp_Pnt PP1max, PP2max;
219 
220   for ( NoU1 = 1, U1 = U10; NoU1 <= myusample; NoU1++, U1 += PasU1) {
221     for ( NoV1 = 1, V1 = V10; NoV1 <= myvsample; NoV1++, V1 += PasV1) {
222       P1 = mypoints1->Value(NoU1, NoV1);
223       for ( NoU2 = 1, U2 = U20; NoU2 <= myusample; NoU2++, U2 += PasU2) {
224 	for ( NoV2 = 1, V2 = V20; NoV2 <= myvsample; NoV2++, V2 += PasV2) {
225 	  P2 = mypoints2->Value(NoU2, NoV2);
226 	  TheDist = P1.SquareDistance(P2);
227 	  if (TheDist < distmin) {
228 	    distmin = TheDist;
229 	    N1Umin = NoU1;
230 	    N1Vmin = NoV1;
231 	    N2Umin = NoU2;
232 	    N2Vmin = NoV2;
233 	    PP1min = P1;
234 	    PP2min = P2;
235 	  }
236 	  if (TheDist > distmax) {
237 	    distmax = TheDist;
238 	    N1Umax = NoU1;
239 	    N1Vmax = NoV1;
240 	    N2Umax = NoU2;
241 	    N2Vmax = NoV2;
242 	    PP1max = P1;
243 	    PP2max = P2;
244 	  }
245 	}
246       }
247     }
248   }
249 
250   UV(1) = U10 + (N1Umin - 1) * PasU1;
251   UV(2) = V10 + (N1Vmin - 1) * PasV1;
252   UV(3) = U20 + (N2Umin - 1) * PasU2;
253   UV(4) = V20 + (N2Vmin - 1) * PasV2;
254 
255   mymath_FunctionSetRoot SR1 (myF,UV,Tol,UVinf,UVsup);
256 
257 //   UV(1) = U10 + (N1Umax - 1) * PasU1;
258 //   UV(2) = V10 + (N1Vmax - 1) * PasV1;
259 //   UV(3) = U20 + (N2Umax - 1) * PasU2;
260 //   UV(4) = V20 + (N2Vmax - 1) * PasV2;
261 
262   //mymath_FunctionSetRoot SR2 (myF,UV,Tol,UVinf,UVsup);
263 
264   myDone = Standard_True;
265 }
266 
267 //=======================================================================
268 //function : IsDone
269 //purpose  :
270 //=======================================================================
271 
IsDone() const272 Standard_Boolean myExtrema_GenExtSS::IsDone() const
273 {
274   return myDone;
275 }
276 
277 //=======================================================================
278 //function : NbExt
279 //purpose  :
280 //=======================================================================
281 
NbExt() const282 Standard_Integer myExtrema_GenExtSS::NbExt() const
283 {
284   if (!IsDone()) { StdFail_NotDone::Raise(); }
285   return myF.NbExt();
286 
287 }
288 
289 //=======================================================================
290 //function : Value
291 //purpose  :
292 //=======================================================================
293 
Value(const Standard_Integer N) const294 Standard_Real myExtrema_GenExtSS::Value(const Standard_Integer N) const
295 {
296   if (!IsDone()) { StdFail_NotDone::Raise(); }
297   return myF.Value(N);
298 }
299 
300 //=======================================================================
301 //function : PointOnS1
302 //purpose  :
303 //=======================================================================
304 
PointOnS1(const Standard_Integer N) const305 Extrema_POnSurf myExtrema_GenExtSS::PointOnS1(const Standard_Integer N) const
306 {
307   if (!IsDone()) { StdFail_NotDone::Raise(); }
308   return myF.PointOnS1(N);
309 }
310 
311 //=======================================================================
312 //function : PointOnS2
313 //purpose  :
314 //=======================================================================
315 
PointOnS2(const Standard_Integer N) const316 Extrema_POnSurf myExtrema_GenExtSS::PointOnS2(const Standard_Integer N) const
317 {
318   if (!IsDone()) { StdFail_NotDone::Raise(); }
319   return myF.PointOnS2(N);
320 }
321 
322 //=======================================================================
323 //function : Bidon
324 //purpose  :
325 //=======================================================================
326 
Bidon() const327 Adaptor3d_SurfacePtr myExtrema_GenExtSS::Bidon() const
328 {
329   return (Adaptor3d_SurfacePtr)nullptr;
330 }
331 
332