1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #define No_Standard_RangeError
17 #define No_Standard_OutOfRange
21 #include <IntImp_ComputeTangence.hxx>
22 #include <Standard_ConstructionError.hxx>
23 #include <Precision.hxx>
25 #define SURF1 (*((ThePSurface *)(surf1)))
26 #define SURF2 (*((ThePSurface *)(surf2)))
29 IntImp_ZerParFunc::IntImp_ZerParFunc() {
30 Standard_ConstructionError::Raise(" Empty Constructor : IntImp_ZerParFunc");
33 IntImp_ZerParFunc::IntImp_ZerParFunc(const ThePSurface& S1 ,
34 const ThePSurface& S2) {
35 surf1 = (Standard_Address)(&S1);
36 surf2 = (Standard_Address)(&S2);
38 ua0 = ThePSurfaceTool::FirstUParameter(SURF1); //-- ThePSurfaceTool::UIntervalFirst(surf1);
39 va0 = ThePSurfaceTool::FirstVParameter(SURF1); //-- ThePSurfaceTool::VIntervalFirst(surf1);
40 ua1 = ThePSurfaceTool::LastUParameter(SURF1); //-- ThePSurfaceTool::UIntervalLast(surf1);
41 va1 = ThePSurfaceTool::LastVParameter(SURF1); //-- ThePSurfaceTool::VIntervalLast(surf1);
43 ub0 = ThePSurfaceTool::FirstUParameter(SURF2); //-- ThePSurfaceTool::UIntervalFirst(SURF2);
44 vb0 = ThePSurfaceTool::FirstVParameter(SURF2); //-- ThePSurfaceTool::VIntervalFirst(surf2);
45 ub1 = ThePSurfaceTool::LastUParameter(SURF2); //-- ThePSurfaceTool::UIntervalLast(surf2);
46 vb1 = ThePSurfaceTool::LastVParameter(SURF2); //-- ThePSurfaceTool::VIntervalLast(surf2);
48 ures1 = ThePSurfaceTool::UResolution(SURF1,Precision::Confusion());
49 vres1 = ThePSurfaceTool::VResolution(SURF1,Precision::Confusion());
51 ures2 = ThePSurfaceTool::UResolution(SURF2,Precision::Confusion());
52 vres2 = ThePSurfaceTool::VResolution(SURF2,Precision::Confusion());
54 compute = Standard_False;
55 tangent = Standard_False;
58 Standard_Integer IntImp_ZerParFunc::NbVariables() const { return 3;}
60 Standard_Integer IntImp_ZerParFunc::NbEquations() const { return 3;}
62 Standard_Boolean IntImp_ZerParFunc::Value(const math_Vector& X,
66 case IntImp_UIsoparametricOnCaro1:
68 pntsol1= ThePSurfaceTool::Value(SURF1,paramConst,X(1));
69 pntsol2= ThePSurfaceTool::Value(SURF2,X(2),X(3));
72 case IntImp_VIsoparametricOnCaro1:
74 pntsol1= ThePSurfaceTool::Value(SURF1,X(1),paramConst);
75 pntsol2= ThePSurfaceTool::Value(SURF2,X(2),X(3));
78 case IntImp_UIsoparametricOnCaro2:
80 pntsol1= ThePSurfaceTool::Value(SURF1,X(1),X(2));
81 pntsol2= ThePSurfaceTool::Value(SURF2,paramConst,X(3));
84 case IntImp_VIsoparametricOnCaro2:
86 pntsol1= ThePSurfaceTool::Value(SURF1,X(1),X(2));
87 pntsol2= ThePSurfaceTool::Value(SURF2,X(3),paramConst);
92 f[0] = F(1) = pntsol1.X() - pntsol2.X();
93 f[1] = F(2) = pntsol1.Y() - pntsol2.Y();
94 f[2] = F(3) = pntsol1.Z() - pntsol2.Z();
98 Standard_Boolean IntImp_ZerParFunc::Derivatives (const math_Vector& X,
102 case IntImp_UIsoparametricOnCaro1:
104 ThePSurfaceTool::D1(SURF1,paramConst,X(1),pntsol1,dpuv[0],dpuv[1]);
105 ThePSurfaceTool::D1(SURF2,X(2),X(3),pntsol2,dpuv[2],dpuv[3]);
106 D(1,1) = dpuv[1].X();
107 D(1,2) =-dpuv[2].X();
108 D(1,3) =-dpuv[3].X();
109 D(2,1) = dpuv[1].Y();
110 D(2,2) =-dpuv[2].Y();
111 D(2,3) =-dpuv[3].Y();
112 D(3,1) = dpuv[1].Z();
113 D(3,2) =-dpuv[2].Z();
114 D(3,3) =-dpuv[3].Z();
117 case IntImp_VIsoparametricOnCaro1:
119 ThePSurfaceTool::D1(SURF1,X(1),paramConst,pntsol1,dpuv[0],dpuv[1]);
120 ThePSurfaceTool::D1(SURF2,X(2),X(3),pntsol2,dpuv[2],dpuv[3]);
121 D(1,1) = dpuv[0].X();
122 D(1,2) =-dpuv[2].X();
123 D(1,3) =-dpuv[3].X();
124 D(2,1) = dpuv[0].Y();
125 D(2,2) =-dpuv[2].Y();
126 D(2,3) =-dpuv[3].Y();
127 D(3,1) = dpuv[0].Z();
128 D(3,2) =-dpuv[2].Z();
129 D(3,3) =-dpuv[3].Z();
132 case IntImp_UIsoparametricOnCaro2:
134 ThePSurfaceTool::D1(SURF1,X(1),X(2),pntsol1,dpuv[0],dpuv[1]);
135 ThePSurfaceTool::D1(SURF2,paramConst,X(3),pntsol2,dpuv[2],dpuv[3]);
136 D(1,1) = dpuv[0].X();
137 D(1,2) = dpuv[1].X();
138 D(1,3) =-dpuv[3].X();
139 D(2,1) = dpuv[0].Y();
140 D(2,2) = dpuv[1].Y();
141 D(2,3) =-dpuv[3].Y();
142 D(3,1) = dpuv[0].Z();
143 D(3,2) = dpuv[1].Z();
144 D(3,3) =-dpuv[3].Z();
147 case IntImp_VIsoparametricOnCaro2:
149 ThePSurfaceTool::D1(SURF1,X(1),X(2),pntsol1,dpuv[0],dpuv[1]);
150 ThePSurfaceTool::D1(SURF2,X(3),paramConst,pntsol2,dpuv[2],dpuv[3]);
151 D(1,1) = dpuv[0].X();
152 D(1,2) = dpuv[1].X();
153 D(1,3) =-dpuv[2].X();
154 D(2,1) = dpuv[0].Y();
155 D(2,2) = dpuv[1].Y();
156 D(2,3) =-dpuv[2].Y();
157 D(3,1) = dpuv[0].Z();
158 D(3,2) = dpuv[1].Z();
159 D(3,3) =-dpuv[2].Z();
163 return Standard_True;
166 Standard_Boolean IntImp_ZerParFunc::Values( const math_Vector& X,
171 case IntImp_UIsoparametricOnCaro1:
173 ThePSurfaceTool::D1(SURF1,paramConst,X(1),pntsol1,dpuv[0],dpuv[1]);
174 ThePSurfaceTool::D1(SURF2,X(2),X(3),pntsol2,dpuv[2],dpuv[3]);
175 D(1,1) = dpuv[1].X();
176 D(1,2) =-dpuv[2].X();
177 D(1,3) =-dpuv[3].X();
178 D(2,1) = dpuv[1].Y();
179 D(2,2) =-dpuv[2].Y();
180 D(2,3) =-dpuv[3].Y();
181 D(3,1) = dpuv[1].Z();
182 D(3,2) =-dpuv[2].Z();
183 D(3,3) =-dpuv[3].Z();
186 case IntImp_VIsoparametricOnCaro1:
188 ThePSurfaceTool::D1(SURF1,X(1),paramConst,pntsol1,dpuv[0],dpuv[1]);
189 ThePSurfaceTool::D1(SURF2,X(2),X(3),pntsol2,dpuv[2],dpuv[3]);
190 D(1,1) = dpuv[0].X();
191 D(1,2) =-dpuv[2].X();
192 D(1,3) =-dpuv[3].X();
193 D(2,1) = dpuv[0].Y();
194 D(2,2) =-dpuv[2].Y();
195 D(2,3) =-dpuv[3].Y();
196 D(3,1) = dpuv[0].Z();
197 D(3,2) =-dpuv[2].Z();
198 D(3,3) =-dpuv[3].Z();
201 case IntImp_UIsoparametricOnCaro2:
203 ThePSurfaceTool::D1(SURF1,X(1),X(2),pntsol1,dpuv[0],dpuv[1]);
204 ThePSurfaceTool::D1(SURF2,paramConst,X(3),pntsol2,dpuv[2],dpuv[3]);
205 D(1,1) = dpuv[0].X();
206 D(1,2) = dpuv[1].X();
207 D(1,3) =-dpuv[3].X();
208 D(2,1) = dpuv[0].Y();
209 D(2,2) = dpuv[1].Y();
210 D(2,3) =-dpuv[3].Y();
211 D(3,1) = dpuv[0].Z();
212 D(3,2) = dpuv[1].Z();
213 D(3,3) =-dpuv[3].Z();
216 case IntImp_VIsoparametricOnCaro2:
218 ThePSurfaceTool::D1(SURF1,X(1),X(2),pntsol1,dpuv[0],dpuv[1]);
219 ThePSurfaceTool::D1(SURF2,X(3),paramConst,pntsol2,dpuv[2],dpuv[3]);
220 D(1,1) = dpuv[0].X();
221 D(1,2) = dpuv[1].X();
222 D(1,3) =-dpuv[2].X();
223 D(2,1) = dpuv[0].Y();
224 D(2,2) = dpuv[1].Y();
225 D(2,3) =-dpuv[2].Y();
226 D(3,1) = dpuv[0].Z();
227 D(3,2) = dpuv[1].Z();
228 D(3,3) =-dpuv[2].Z();
232 f[0] = F(1) = pntsol1.X() - pntsol2.X();
233 f[1] = F(2) = pntsol1.Y() - pntsol2.Y();
234 f[2] = F(3) = pntsol1.Z() - pntsol2.Z();
235 return Standard_True;
238 void IntImp_ZerParFunc::ComputeParameters(
239 const IntImp_ConstIsoparametric ChoixIso,
240 const TColStd_Array1OfReal& Param,
242 math_Vector& BornInf,
243 math_Vector& BornSup,
244 math_Vector& Tolerance ) {
248 case IntImp_UIsoparametricOnCaro1:
250 paramConst = Param(1);
268 case IntImp_VIsoparametricOnCaro1:
270 paramConst = Param(2);
287 case IntImp_UIsoparametricOnCaro2:
289 paramConst = Param(3);
307 case IntImp_VIsoparametricOnCaro2:
309 paramConst = Param(4);
329 Standard_Real Incr1 = (BornSup(1)-BornInf(1))*0.01;
330 Standard_Real Incr2 = (BornSup(2)-BornInf(2))*0.01;
331 Standard_Real Incr3 = (BornSup(3)-BornInf(3))*0.01;
341 Standard_Boolean IntImp_ZerParFunc::IsTangent(
342 const math_Vector& UVap,
343 TColStd_Array1OfReal& Param,
344 IntImp_ConstIsoparametric& BestChoix)
347 case IntImp_UIsoparametricOnCaro1:
349 Param(1) = paramConst;
355 case IntImp_VIsoparametricOnCaro1:
357 Param(2) = paramConst;
363 case IntImp_UIsoparametricOnCaro2:
365 Param(3) = paramConst;
371 case IntImp_VIsoparametricOnCaro2:
373 Param(4) = paramConst;
381 IntImp_ConstIsoparametric TabIso[4];
382 Standard_Real EpsUV[4];
390 tangent = IntImp_ComputeTangence(dpuv,EpsUV,tgduv,TabIso);