0026586: Eliminate compile warnings obtained by building occt with vc14: declaration...
[occt.git] / src / Extrema / Extrema_GenExtCS.cxx
1 // Created on: 1995-07-18
2 // Created by: Modelistation
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Adaptor3d_Curve.hxx>
19 #include <Adaptor3d_HCurve.hxx>
20 #include <Adaptor3d_Surface.hxx>
21 #include <Extrema_ExtCC.hxx>
22 #include <Extrema_ExtPS.hxx>
23 #include <Extrema_GenExtCS.hxx>
24 #include <Extrema_GlobOptFuncCS.hxx>
25 #include <Extrema_POnCurv.hxx>
26 #include <Extrema_POnSurf.hxx>
27 #include <Geom_Line.hxx>
28 #include <GeomAdaptor_Curve.hxx>
29 #include <math_FunctionSetRoot.hxx>
30 #include <math_PSO.hxx>
31 #include <math_PSOParticlesPool.hxx>
32 #include <math_Vector.hxx>
33 #include <Precision.hxx>
34 #include <Standard_OutOfRange.hxx>
35 #include <Standard_TypeMismatch.hxx>
36 #include <StdFail_NotDone.hxx>
37 #include <TColgp_HArray1OfPnt.hxx>
38
39 const Standard_Real aMaxParamVal = 1.0e+10;
40 const Standard_Real aBorderDivisor = 1.0e+4;
41
42 //=======================================================================
43 //function : Extrema_GenExtCS
44 //purpose  : 
45 //=======================================================================
46 Extrema_GenExtCS::Extrema_GenExtCS()
47 {
48   myDone = Standard_False;
49   myInit = Standard_False;
50 }
51
52 //=======================================================================
53 //function : Extrema_GenExtCS
54 //purpose  : 
55 //=======================================================================
56 Extrema_GenExtCS::Extrema_GenExtCS(const Adaptor3d_Curve& C,
57                                    const Adaptor3d_Surface& S,
58                                    const Standard_Integer NbT,
59                                    const Standard_Integer NbU,
60                                    const Standard_Integer NbV,
61                                    const Standard_Real Tol1,
62                                    const Standard_Real Tol2)
63 {
64   Initialize(S, NbU, NbV, Tol2);
65   Perform(C, NbT, Tol1);
66 }
67
68 //=======================================================================
69 //function : Extrema_GenExtCS
70 //purpose  : 
71 //=======================================================================
72
73 Extrema_GenExtCS::Extrema_GenExtCS (const Adaptor3d_Curve& C,
74                                     const Adaptor3d_Surface& S,
75                                     const Standard_Integer NbT,
76                                     const Standard_Integer NbU,
77                                     const Standard_Integer NbV,
78                                     const Standard_Real tmin,
79                                     const Standard_Real tsup,
80                                     const Standard_Real Umin,
81                                     const Standard_Real Usup,
82                                     const Standard_Real Vmin,
83                                     const Standard_Real Vsup,
84                                     const Standard_Real Tol1,
85                                     const Standard_Real Tol2)
86 {
87   Initialize(S, NbU, NbV, Umin,Usup,Vmin,Vsup,Tol2);
88   Perform(C, NbT, tmin, tsup, Tol1);
89 }
90
91 //=======================================================================
92 //function : Initialize
93 //purpose  : 
94 //=======================================================================
95 void Extrema_GenExtCS::Initialize (const Adaptor3d_Surface& S,
96                                    const Standard_Integer NbU,
97                                    const Standard_Integer NbV,
98                                    const Standard_Real Tol2)
99 {
100   myumin = S.FirstUParameter();
101   myusup = S.LastUParameter();
102   myvmin = S.FirstVParameter();
103   myvsup = S.LastVParameter();
104   Initialize(S,NbU,NbV,myumin,myusup,myvmin,myvsup,Tol2);
105 }
106
107 //=======================================================================
108 //function : Initialize
109 //purpose  : 
110 //=======================================================================
111 void Extrema_GenExtCS::Initialize (const Adaptor3d_Surface& S,
112                                    const Standard_Integer NbU,
113                                    const Standard_Integer NbV,
114                                    const Standard_Real Umin,
115                                    const Standard_Real Usup,
116                                    const Standard_Real Vmin,
117                                    const Standard_Real Vsup,
118                                    const Standard_Real Tol2)
119 {
120   myS = (Adaptor3d_SurfacePtr)&S;
121   myusample = NbU;
122   myvsample = NbV;
123   myumin = Umin;
124   myusup = Usup;
125   myvmin = Vmin;
126   myvsup = Vsup;
127   mytol2 = Tol2;
128
129   const Standard_Real aTrimMaxU = Precision::IsInfinite (myusup) ?  aMaxParamVal : myusup;
130   const Standard_Real aTrimMinU = Precision::IsInfinite (myumin) ? -aMaxParamVal : myumin;
131   const Standard_Real aTrimMaxV = Precision::IsInfinite (myvsup) ?  aMaxParamVal : myvsup;
132   const Standard_Real aTrimMinV = Precision::IsInfinite (myvmin) ? -aMaxParamVal : myvmin;
133
134   const Standard_Real aMinU = aTrimMinU + (aTrimMaxU - aTrimMinU) / aBorderDivisor;
135   const Standard_Real aMinV = aTrimMinV + (aTrimMaxV - aTrimMinV) / aBorderDivisor;
136   const Standard_Real aMaxU = aTrimMaxU - (aTrimMaxU - aTrimMinU) / aBorderDivisor;
137   const Standard_Real aMaxV = aTrimMaxV - (aTrimMaxV - aTrimMinV) / aBorderDivisor;
138   
139   const Standard_Real aStepSU = (aMaxU - aMinU) / myusample;
140   const Standard_Real aStepSV = (aMaxV - aMinV) / myvsample;
141
142   mySurfPnts = new TColgp_HArray2OfPnt (0, myusample, 0, myvsample);
143
144   Standard_Real aSU = aMinU;
145   for (Standard_Integer aSUI = 0; aSUI <= myusample; aSUI++, aSU += aStepSU)
146   {
147     Standard_Real aSV = aMinV;
148     for (Standard_Integer aSVI = 0; aSVI <= myvsample; aSVI++, aSV += aStepSV)
149     {
150       mySurfPnts->ChangeValue (aSUI, aSVI) = myS->Value (aSU, aSV);
151     }
152   }
153 }
154
155 //=======================================================================
156 //function : Perform
157 //purpose  : 
158 //=======================================================================
159 void Extrema_GenExtCS::Perform(const Adaptor3d_Curve& C, 
160   const Standard_Integer NbT,
161   const Standard_Real Tol1)
162 {
163   mytmin = C.FirstParameter();
164   mytsup = C.LastParameter();
165   Perform(C, NbT, mytmin, mytsup,Tol1);
166 }
167
168 //=======================================================================
169 //function : Perform
170 //purpose  : 
171 //=======================================================================
172 void Extrema_GenExtCS::Perform (const Adaptor3d_Curve& C,
173                                 const Standard_Integer NbT,
174                                 const Standard_Real tmin,
175                                 const Standard_Real tsup,
176                                 const Standard_Real Tol1)
177 {
178   myDone = Standard_False;
179   myF.Initialize(C,*myS);
180   mytmin = tmin;
181   mytsup = tsup;
182   mytol1 = Tol1;
183   mytsample = NbT;
184   // Modif de lvt pour trimer la surface non pas aux infinis mais  a +/- 10000
185
186   Standard_Real trimusup = myusup, trimumin = myumin,trimvsup = myvsup,trimvmin = myvmin;
187   if (Precision::IsInfinite(trimusup)){
188     trimusup = aMaxParamVal;
189   }
190   if (Precision::IsInfinite(trimvsup)){
191     trimvsup = aMaxParamVal;
192   }
193   if (Precision::IsInfinite(trimumin)){
194     trimumin = -aMaxParamVal;
195   }
196   if (Precision::IsInfinite(trimvmin)){
197     trimvmin = -aMaxParamVal;
198   }
199   //
200   math_Vector Tol(1, 3);
201   Tol(1) = mytol1;
202   Tol(2) = mytol2;
203   Tol(3) = mytol2;
204   math_Vector TUV(1,3), TUVinf(1,3), TUVsup(1,3);
205   TUVinf(1) = mytmin;
206   TUVinf(2) = trimumin;
207   TUVinf(3) = trimvmin;
208
209   TUVsup(1) = mytsup;
210   TUVsup(2) = trimusup;
211   TUVsup(3) = trimvsup;
212
213   // Number of particles used in PSO algorithm (particle swarm optimization).
214   const Standard_Integer aNbParticles = 32;
215
216   math_PSOParticlesPool aParticles(aNbParticles, 3);
217
218   math_Vector aMinTUV(1,3);
219   aMinTUV = TUVinf + (TUVsup - TUVinf) / aBorderDivisor;
220
221   math_Vector aMaxTUV(1,3); 
222   aMaxTUV = TUVsup - (TUVsup - TUVinf) / aBorderDivisor;
223
224   Standard_Real aStepCU = (aMaxTUV(1) - aMinTUV(1)) / mytsample;
225   Standard_Real aStepSU = (aMaxTUV(2) - aMinTUV(2)) / myusample;
226   Standard_Real aStepSV = (aMaxTUV(3) - aMinTUV(3)) / myvsample;
227
228   // Correct number of curve samples in case of low resolution
229   Standard_Real aScaleFactor = 5.0;
230   Standard_Real aResolutionCU = aStepCU / C.Resolution (1.0);
231
232   Standard_Real aMinResolution = aScaleFactor * Min (aResolutionCU,
233     Min (aStepSU / myS->UResolution (1.0), aStepSV / myS->VResolution (1.0)));
234
235   if (aMinResolution > Epsilon (1.0))
236   {
237     if (aResolutionCU > aMinResolution)
238     {
239       const Standard_Integer aMaxNbNodes = 50;
240
241       mytsample = Min(aMaxNbNodes,
242         RealToInt(mytsample * aResolutionCU / aMinResolution));
243
244       aStepCU = (aMaxTUV(1) - aMinTUV(1)) / mytsample;
245     }
246   }
247
248   // Pre-compute curve sample points.
249   TColgp_HArray1OfPnt aCurvPnts (0, mytsample);
250
251   Standard_Real aCU1 = aMinTUV(1);
252   for (Standard_Integer aCUI = 0; aCUI <= mytsample; aCUI++, aCU1 += aStepCU)
253     aCurvPnts.SetValue (aCUI, C.Value (aCU1));
254
255   PSO_Particle* aParticle = aParticles.GetWorstParticle();
256   // Select specified number of particles from pre-computed set of samples
257   Standard_Real aSU = aMinTUV(2);
258   for (Standard_Integer aSUI = 0; aSUI <= myusample; aSUI++, aSU += aStepSU)
259   {
260     Standard_Real aSV = aMinTUV(3);
261     for (Standard_Integer aSVI = 0; aSVI <= myvsample; aSVI++, aSV += aStepSV)
262     {
263       Standard_Real aCU2 = aMinTUV(1);
264       for (Standard_Integer aCUI = 0; aCUI <= mytsample; aCUI++, aCU2 += aStepCU)
265       {
266         Standard_Real aSqDist = mySurfPnts->Value(aSUI, aSVI).SquareDistance(aCurvPnts.Value(aCUI)); 
267
268         if (aSqDist < aParticle->Distance)
269         {
270           aParticle->Position[0] = aCU2;
271           aParticle->Position[1] = aSU;
272           aParticle->Position[2] = aSV;
273
274           aParticle->BestPosition[0] = aCU2;
275           aParticle->BestPosition[1] = aSU;
276           aParticle->BestPosition[2] = aSV;
277
278           aParticle->Distance     = aSqDist;
279           aParticle->BestDistance = aSqDist;
280
281           aParticle = aParticles.GetWorstParticle();
282         }
283       }
284     }
285   }
286
287   math_Vector aStep(1,3);
288   aStep(1) = aStepCU;
289   aStep(2) = aStepSU;
290   aStep(3) = aStepSV;
291
292   // Find min approximation
293   Standard_Real aValue;
294   Extrema_GlobOptFuncCS aFunc(&C, myS);
295   math_PSO aPSO(&aFunc, TUVinf, TUVsup, aStep);
296   aPSO.Perform(aParticles, aNbParticles, aValue, TUV);
297
298   math_FunctionSetRoot anA(myF, Tol);
299   anA.Perform(myF, TUV, TUVinf, TUVsup);
300
301   myDone = Standard_True;
302 }
303
304 //=======================================================================
305 //function : IsDone
306 //purpose  : 
307 //=======================================================================
308 Standard_Boolean Extrema_GenExtCS::IsDone() const 
309 {
310   return myDone;
311 }
312
313 //=======================================================================
314 //function : NbExt
315 //purpose  : 
316 //=======================================================================
317 Standard_Integer Extrema_GenExtCS::NbExt() const 
318 {
319   if (!IsDone()) { StdFail_NotDone::Raise(); }
320   return myF.NbExt();
321 }
322
323 //=======================================================================
324 //function : Value
325 //purpose  : 
326 //=======================================================================
327 Standard_Real Extrema_GenExtCS::SquareDistance(const Standard_Integer N) const 
328 {
329   if (!IsDone()) { StdFail_NotDone::Raise(); }
330   return myF.SquareDistance(N);
331 }
332
333 //=======================================================================
334 //function : PointOnCurve
335 //purpose  : 
336 //=======================================================================
337 const Extrema_POnCurv& Extrema_GenExtCS::PointOnCurve(const Standard_Integer N) const 
338 {
339   if (!IsDone()) { StdFail_NotDone::Raise(); }
340   return myF.PointOnCurve(N);
341 }
342
343 //=======================================================================
344 //function : PointOnSurface
345 //purpose  : 
346 //=======================================================================
347 const Extrema_POnSurf& Extrema_GenExtCS::PointOnSurface(const Standard_Integer N) const 
348 {
349   if (!IsDone()) { StdFail_NotDone::Raise(); }
350   return myF.PointOnSurface(N);
351 }
352
353 //=======================================================================
354 //function : BidonSurface
355 //purpose  : 
356 //=======================================================================
357 Adaptor3d_SurfacePtr Extrema_GenExtCS::BidonSurface() const 
358 {
359   return (Adaptor3d_SurfacePtr)0L;
360 }
361
362 //=======================================================================
363 //function : BidonCurve
364 //purpose  : 
365 //=======================================================================
366 Adaptor3d_CurvePtr Extrema_GenExtCS::BidonCurve() const 
367 {
368   return (Adaptor3d_CurvePtr)0L;
369 }
370