0026937: Eliminate NO_CXX_EXCEPTION macro support
[occt.git] / src / Extrema / Extrema_ExtSS.cxx
1 // Created on: 1995-07-19
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_Surface.hxx>
19 #include <ElCLib.hxx>
20 #include <Extrema_ExtSS.hxx>
21 #include <Extrema_GenExtSS.hxx>
22 #include <Extrema_POnSurf.hxx>
23 #include <GeomAbs_SurfaceType.hxx>
24 #include <gp_Pln.hxx>
25 #include <gp_Pnt.hxx>
26 #include <Precision.hxx>
27 #include <Standard_NotImplemented.hxx>
28 #include <Standard_OutOfRange.hxx>
29 #include <Standard_TypeMismatch.hxx>
30 #include <StdFail_InfiniteSolutions.hxx>
31 #include <StdFail_NotDone.hxx>
32
33 Extrema_ExtSS::Extrema_ExtSS() 
34 {
35   myDone = Standard_False;
36 }
37
38 Extrema_ExtSS::Extrema_ExtSS(const Adaptor3d_Surface&     S1,
39                              const Adaptor3d_Surface&     S2,
40                              const Standard_Real    TolS1,
41                              const Standard_Real    TolS2)
42
43 {
44   Initialize(S2, S2.FirstUParameter(), 
45                  S2.LastUParameter(), 
46                  S2.FirstVParameter(), 
47                  S2.LastVParameter(), TolS2);
48
49   Perform(S1, S1.FirstUParameter(),
50           S1.LastUParameter(), 
51           S1.FirstVParameter(), 
52           S1.LastVParameter(), TolS1);
53 }
54
55 Extrema_ExtSS::Extrema_ExtSS(const Adaptor3d_Surface&   S1,
56                              const Adaptor3d_Surface&   S2,
57                              const Standard_Real  Uinf1,        
58                              const Standard_Real  Usup1,
59                              const Standard_Real  Vinf1,        
60                              const Standard_Real  Vsup1,
61                              const Standard_Real  Uinf2,        
62                              const Standard_Real  Usup2,
63                              const Standard_Real  Vinf2,        
64                              const Standard_Real  Vsup2,
65                              const Standard_Real  TolS1,
66                              const Standard_Real  TolS2)
67
68 {
69   Initialize(S2, Uinf2, Usup2, Vinf2, Vsup2, TolS2);
70   Perform(S1, Uinf1, Usup1, Vinf1, Vsup1, TolS1);
71 }
72
73
74 void Extrema_ExtSS::Initialize(const Adaptor3d_Surface&  S2,
75                                const Standard_Real Uinf2,       
76                                const Standard_Real Usup2,
77                                const Standard_Real Vinf2,       
78                                const Standard_Real Vsup2,
79                                const Standard_Real TolS2)
80 {
81   myS2 = (Adaptor3d_SurfacePtr)&S2;
82   myIsPar = Standard_False;
83   myuinf2  = Uinf2;
84   myusup2  = Usup2;
85   myvinf2  = Vinf2;
86   myvsup2  = Vsup2;
87   mytolS2  = TolS2;
88   myStype  = S2.GetType();
89 }
90
91                                 
92 void Extrema_ExtSS::Perform(const Adaptor3d_Surface&   S1,      
93                             const Standard_Real  Uinf1, 
94                             const Standard_Real  Usup1,
95                             const Standard_Real  Vinf1, 
96                             const Standard_Real  Vsup1,
97                             const Standard_Real  TolS1)
98 {
99   myuinf1  = Uinf1;
100   myusup1  = Usup1;
101   myvinf1  = Vinf1;
102   myvsup1  = Vsup1;
103   mytolS1 =  TolS1;
104   myPOnS1.Clear();
105   myPOnS2.Clear();
106   mySqDist.Clear();
107   Standard_Integer i;
108   GeomAbs_SurfaceType myS1type  = S1.GetType();
109   Standard_Integer NbU = 10, NbV = 10;
110   
111   switch(myS1type) {
112
113     case GeomAbs_Plane: 
114     {
115       
116       switch(myStype) {
117       case GeomAbs_Plane:
118         {
119           myExtElSS.Perform(S1.Plane(),myS2->Plane());
120         }
121         break;
122       default:
123         {
124           Extrema_GenExtSS Ext(S1, *myS2, NbU, NbV, mytolS1, mytolS2);
125           myDone = Ext.IsDone();
126           if (myDone) {
127             Standard_Integer NbExt = Ext.NbExt();
128             Standard_Real U1, V1,U2,V2;
129             Extrema_POnSurf PS1;
130             Extrema_POnSurf PS2;
131             for (i = 1; i <= NbExt; i++) {
132               PS1 = Ext.PointOnS1(i);
133               PS2 = Ext.PointOnS2(i);
134               PS1.Parameter(U1, V1);
135               PS2.Parameter(U2, V2);
136               if (S1.IsUPeriodic())
137                 U1 = ElCLib::InPeriod(U1, myuinf1, myuinf1+S1.UPeriod());
138               if (S1.IsVPeriodic())
139                 V1 = ElCLib::InPeriod(V1, myvinf1, myvinf1+S1.VPeriod());
140               if (myS2->IsUPeriodic())
141                 U2 = ElCLib::InPeriod(U2, myuinf2, myuinf2+myS2->UPeriod());
142               if (myS2->IsVPeriodic())
143                 V2 = ElCLib::InPeriod(V2, myvinf2, myvinf2+myS2->VPeriod());
144
145               if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
146                   (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
147                   (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
148                   (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
149                 mySqDist.Append(Ext.SquareDistance(i));
150                 myPOnS1.Append(Extrema_POnSurf(U1, V1, PS1.Value()));
151                 myPOnS2.Append(Extrema_POnSurf(U2, V2, PS2.Value()));
152               }
153             }
154           }
155           return;
156           
157         }
158         break;
159       }
160       break;
161     }
162   default:
163     {
164       Extrema_GenExtSS Ext(S1, *myS2, NbU, NbV, mytolS1, mytolS2);
165       myDone = Ext.IsDone();
166       if (myDone) {
167         Standard_Integer NbExt = Ext.NbExt();
168         Standard_Real U1, V1,U2,V2;
169         Extrema_POnSurf PS1;
170         Extrema_POnSurf PS2;
171         for (i = 1; i <= NbExt; i++) {
172           PS1 = Ext.PointOnS1(i);
173           PS2 = Ext.PointOnS2(i);
174           PS1.Parameter(U1, V1);
175           PS2.Parameter(U2, V2);
176           if (S1.IsUPeriodic())
177             U1 = ElCLib::InPeriod(U1, myuinf1, myuinf1+S1.UPeriod());
178           if (S1.IsVPeriodic())
179             V1 = ElCLib::InPeriod(V1, myvinf1, myvinf1+S1.VPeriod());
180           if (myS2->IsUPeriodic())
181             U2 = ElCLib::InPeriod(U2, myuinf2, myuinf2+myS2->UPeriod());
182           if (myS2->IsVPeriodic())
183             V2 = ElCLib::InPeriod(V2, myvinf2, myvinf2+myS2->VPeriod());
184           
185           if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
186               (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
187               (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
188               (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
189             mySqDist.Append(Ext.SquareDistance(i));
190             myPOnS1.Append(Extrema_POnSurf(U1, V1, PS1.Value()));
191             myPOnS2.Append(Extrema_POnSurf(U2, V2, PS2.Value()));
192           }
193         }
194       }
195       return;
196       
197     }
198     break;
199   }
200
201   myDone = myExtElSS.IsDone();
202   if (myDone) {
203     myIsPar = myExtElSS.IsParallel();
204     if (myIsPar) {
205       mySqDist.Append(myExtElSS.SquareDistance(1));
206     }
207     else {
208       Standard_Integer NbExt = myExtElSS.NbExt();
209       Standard_Real U1, V1, U2, V2;
210       Extrema_POnSurf PS1;
211       Extrema_POnSurf PS2;
212       for (i = 1; i <= NbExt; i++) {
213         myExtElSS.Points(i, PS1, PS2);
214         PS1.Parameter(U1, V1);
215         PS2.Parameter(U2, V2);
216         if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
217             (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
218             (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
219             (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
220           mySqDist.Append(myExtElSS.SquareDistance(i));
221           myPOnS1.Append(PS1);
222           myPOnS2.Append(PS2);
223         }
224       }
225     }
226   }
227   
228 }
229
230
231 Standard_Boolean Extrema_ExtSS::IsDone() const
232 {
233   return myDone;
234 }
235
236 Standard_Boolean Extrema_ExtSS::IsParallel() const
237 {
238   return myIsPar;
239 }
240
241
242 Standard_Real Extrema_ExtSS::SquareDistance(const Standard_Integer N) const
243 {
244   if(!myDone) throw StdFail_NotDone();
245   if (myIsPar && N != 1) throw StdFail_InfiniteSolutions();
246   if ((N < 1) || (N > mySqDist.Length())) throw Standard_OutOfRange();
247   return mySqDist.Value(N);
248 }
249
250
251 Standard_Integer Extrema_ExtSS::NbExt() const
252 {
253   if(!myDone) throw StdFail_NotDone();
254   return mySqDist.Length();
255 }
256
257
258
259 void Extrema_ExtSS::Points(const Standard_Integer N,
260                            Extrema_POnSurf&       P1,
261                            Extrema_POnSurf&       P2) const
262 {
263   if(!myDone) throw StdFail_NotDone();
264   P1 = myPOnS1.Value(N);
265   P2 = myPOnS2.Value(N);
266 }