1 // File: Extrema_ExtSS.cxx
2 // Created: Wed Jul 19 09:00:22 1995
3 // Author: Modelistation
7 #include <Extrema_ExtSS.ixx>
9 #include <StdFail_NotDone.hxx>
10 #include <Standard_NotImplemented.hxx>
11 #include <StdFail_InfiniteSolutions.hxx>
12 #include <Precision.hxx>
13 #include <GeomAbs_SurfaceType.hxx>
17 #include <Extrema_GenExtSS.hxx>
20 Extrema_ExtSS::Extrema_ExtSS()
22 myDone = Standard_False;
25 Extrema_ExtSS::Extrema_ExtSS(const Adaptor3d_Surface& S1,
26 const Adaptor3d_Surface& S2,
27 const Standard_Real TolS1,
28 const Standard_Real TolS2)
31 Initialize(S2, S2.FirstUParameter(),
34 S2.LastVParameter(), TolS2);
36 Perform(S1, S1.FirstUParameter(),
39 S1.LastVParameter(), TolS1);
42 Extrema_ExtSS::Extrema_ExtSS(const Adaptor3d_Surface& S1,
43 const Adaptor3d_Surface& S2,
44 const Standard_Real Uinf1,
45 const Standard_Real Usup1,
46 const Standard_Real Vinf1,
47 const Standard_Real Vsup1,
48 const Standard_Real Uinf2,
49 const Standard_Real Usup2,
50 const Standard_Real Vinf2,
51 const Standard_Real Vsup2,
52 const Standard_Real TolS1,
53 const Standard_Real TolS2)
56 Initialize(S2, Uinf2, Usup2, Vinf2, Vsup2, TolS2);
57 Perform(S1, Uinf1, Usup1, Vinf1, Vsup1, TolS1);
61 void Extrema_ExtSS::Initialize(const Adaptor3d_Surface& S2,
62 const Standard_Real Uinf2,
63 const Standard_Real Usup2,
64 const Standard_Real Vinf2,
65 const Standard_Real Vsup2,
66 const Standard_Real TolS2)
68 myS2 = (Adaptor3d_SurfacePtr)&S2;
69 myIsPar = Standard_False;
75 myStype = S2.GetType();
79 void Extrema_ExtSS::Perform(const Adaptor3d_Surface& S1,
80 const Standard_Real Uinf1,
81 const Standard_Real Usup1,
82 const Standard_Real Vinf1,
83 const Standard_Real Vsup1,
84 const Standard_Real TolS1)
95 GeomAbs_SurfaceType myS1type = S1.GetType();
96 Standard_Integer NbU = 10, NbV = 10;
106 myExtElSS.Perform(S1.Plane(),myS2->Plane());
111 Extrema_GenExtSS Ext(S1, *myS2, NbU, NbV, mytolS1, mytolS2);
112 myDone = Ext.IsDone();
114 Standard_Integer NbExt = Ext.NbExt();
115 Standard_Real U1, V1,U2,V2;
118 for (i = 1; i <= NbExt; i++) {
119 PS1 = Ext.PointOnS1(i);
120 PS2 = Ext.PointOnS2(i);
121 PS1.Parameter(U1, V1);
122 PS2.Parameter(U2, V2);
123 if (S1.IsUPeriodic())
124 U1 = ElCLib::InPeriod(U1, myuinf1, myuinf1+S1.UPeriod());
125 if (S1.IsVPeriodic())
126 V1 = ElCLib::InPeriod(V1, myvinf1, myvinf1+S1.VPeriod());
127 if (myS2->IsUPeriodic())
128 U2 = ElCLib::InPeriod(U2, myuinf2, myuinf2+myS2->UPeriod());
129 if (myS2->IsVPeriodic())
130 V2 = ElCLib::InPeriod(V2, myvinf2, myvinf2+myS2->VPeriod());
132 if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
133 (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
134 (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
135 (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
136 mySqDist.Append(Ext.SquareDistance(i));
137 myPOnS1.Append(Extrema_POnSurf(U1, V1, PS1.Value()));
138 myPOnS2.Append(Extrema_POnSurf(U2, V2, PS2.Value()));
151 Extrema_GenExtSS Ext(S1, *myS2, NbU, NbV, mytolS1, mytolS2);
152 myDone = Ext.IsDone();
154 Standard_Integer NbExt = Ext.NbExt();
155 Standard_Real U1, V1,U2,V2;
158 for (i = 1; i <= NbExt; i++) {
159 PS1 = Ext.PointOnS1(i);
160 PS2 = Ext.PointOnS2(i);
161 PS1.Parameter(U1, V1);
162 PS2.Parameter(U2, V2);
163 if (S1.IsUPeriodic())
164 U1 = ElCLib::InPeriod(U1, myuinf1, myuinf1+S1.UPeriod());
165 if (S1.IsVPeriodic())
166 V1 = ElCLib::InPeriod(V1, myvinf1, myvinf1+S1.VPeriod());
167 if (myS2->IsUPeriodic())
168 U2 = ElCLib::InPeriod(U2, myuinf2, myuinf2+myS2->UPeriod());
169 if (myS2->IsVPeriodic())
170 V2 = ElCLib::InPeriod(V2, myvinf2, myvinf2+myS2->VPeriod());
172 if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
173 (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
174 (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
175 (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
176 mySqDist.Append(Ext.SquareDistance(i));
177 myPOnS1.Append(Extrema_POnSurf(U1, V1, PS1.Value()));
178 myPOnS2.Append(Extrema_POnSurf(U2, V2, PS2.Value()));
188 myDone = myExtElSS.IsDone();
190 myIsPar = myExtElSS.IsParallel();
192 mySqDist.Append(myExtElSS.SquareDistance(1));
195 Standard_Integer NbExt = myExtElSS.NbExt();
196 Standard_Real U1, V1, U2, V2;
199 for (i = 1; i <= NbExt; i++) {
200 myExtElSS.Points(i, PS1, PS2);
201 PS1.Parameter(U1, V1);
202 PS2.Parameter(U2, V2);
203 if ((myuinf1-U1) <= mytolS1 && (U1-myusup1) <= mytolS1 &&
204 (myvinf1-V1) <= mytolS1 && (V1-myvsup1) <= mytolS1 &&
205 (myuinf2-U2) <= mytolS2 && (U2-myusup2) <= mytolS2 &&
206 (myvinf2-V2) <= mytolS2 && (V2-myvsup2) <= mytolS2) {
207 mySqDist.Append(myExtElSS.SquareDistance(i));
218 Standard_Boolean Extrema_ExtSS::IsDone() const
223 Standard_Boolean Extrema_ExtSS::IsParallel() const
229 Standard_Real Extrema_ExtSS::SquareDistance(const Standard_Integer N) const
231 if(!myDone) StdFail_NotDone::Raise();
232 if (myIsPar && N != 1) StdFail_InfiniteSolutions::Raise();
233 if ((N < 1) || (N > mySqDist.Length())) Standard_OutOfRange::Raise();
234 return mySqDist.Value(N);
238 Standard_Integer Extrema_ExtSS::NbExt() const
240 if(!myDone) StdFail_NotDone::Raise();
241 return mySqDist.Length();
246 void Extrema_ExtSS::Points(const Standard_Integer N,
248 Extrema_POnSurf& P2) const
250 if(!myDone) StdFail_NotDone::Raise();
251 P1 = myPOnS1.Value(N);
252 P2 = myPOnS2.Value(N);