0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / BlendFunc / BlendFunc_GenChamfer.cxx
1 // Created by: Julia GERASIMOVA
2 // Copyright (c) 2015 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
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.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <Adaptor3d_HCurve.hxx>
16 #include <Adaptor3d_HSurface.hxx>
17 #include <Blend_Point.hxx>
18 #include <BlendFunc.hxx>
19 #include <BlendFunc_Chamfer.hxx>
20 #include <ElCLib.hxx>
21 #include <gp_Lin.hxx>
22 #include <gp_Pnt.hxx>
23 #include <gp_Vec.hxx>
24 #include <gp_Vec2d.hxx>
25 #include <math_Matrix.hxx>
26 #include <Precision.hxx>
27 #include <Standard_NotImplemented.hxx>
28
29
30 //=======================================================================
31 //function : BlendFunc_GenChamfer
32 //purpose  : 
33 //=======================================================================
34 BlendFunc_GenChamfer::BlendFunc_GenChamfer(const Handle(Adaptor3d_HSurface)& S1,
35                                            const Handle(Adaptor3d_HSurface)& S2,
36                                            const Handle(Adaptor3d_HCurve)&   CG)
37 : surf1(S1),
38   surf2(S2),
39   curv(CG),
40   choix(0),
41   tol(0.0),
42   distmin(RealLast())
43 {
44 }
45
46 //=======================================================================
47 //function : NbEquations
48 //purpose  : 
49 //=======================================================================
50
51 Standard_Integer BlendFunc_GenChamfer::NbEquations () const
52 {
53   return 4;
54 }
55
56 //=======================================================================
57 //function : Set
58 //purpose  : 
59 //=======================================================================
60
61 void BlendFunc_GenChamfer::Set(const Standard_Real, const Standard_Real)
62 {
63 }
64
65 //=======================================================================
66 //function : GetTolerance
67 //purpose  : 
68 //=======================================================================
69
70 void BlendFunc_GenChamfer::GetTolerance(math_Vector& Tolerance, const Standard_Real Tol) const
71 {
72   Tolerance(1) = surf1->UResolution(Tol);
73   Tolerance(2) = surf1->VResolution(Tol);
74   Tolerance(3) = surf2->UResolution(Tol);
75   Tolerance(4) = surf2->VResolution(Tol);
76 }
77
78 //=======================================================================
79 //function : GetBounds
80 //purpose  : 
81 //=======================================================================
82
83 void BlendFunc_GenChamfer::GetBounds(math_Vector& InfBound, math_Vector& SupBound) const
84 {
85   InfBound(1) = surf1->FirstUParameter();
86   InfBound(2) = surf1->FirstVParameter();
87   InfBound(3) = surf2->FirstUParameter();
88   InfBound(4) = surf2->FirstVParameter();
89   SupBound(1) = surf1->LastUParameter();
90   SupBound(2) = surf1->LastVParameter();
91   SupBound(3) = surf2->LastUParameter();
92   SupBound(4) = surf2->LastVParameter();
93
94   for(Standard_Integer i = 1; i <= 4; i++){
95     if(!Precision::IsInfinite(InfBound(i)) &&
96        !Precision::IsInfinite(SupBound(i))) {
97       const Standard_Real range = (SupBound(i) - InfBound(i));
98       InfBound(i) -= range;
99       SupBound(i) += range;
100     }
101   }
102 }
103
104 //=======================================================================
105 //function : GetMinimalDistance
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Real BlendFunc_GenChamfer::GetMinimalDistance() const
110 {
111   return distmin;
112 }
113
114 //=======================================================================
115 //function : Values
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Boolean BlendFunc_GenChamfer::Values(const math_Vector& X, math_Vector& F, math_Matrix& D)
120 {
121   Standard_Boolean val = Value(X,F);
122   return (val && Derivatives(X,D));
123 }
124
125 //=======================================================================
126 //function : Section
127 //purpose  : 
128 //=======================================================================
129
130 void BlendFunc_GenChamfer::Section(const Standard_Real /*Param*/,
131                                    const Standard_Real U1,
132                                    const Standard_Real V1,
133                                    const Standard_Real U2,
134                                    const Standard_Real V2,
135                                    Standard_Real& Pdeb,
136                                    Standard_Real& Pfin,
137                                    gp_Lin& C)
138 {
139   const gp_Pnt pts1 = surf1->Value(U1,V1);
140   const gp_Pnt pts2 = surf2->Value(U2,V2);
141   const gp_Dir dir( gp_Vec(pts1,pts2) );
142
143   C.SetLocation(pts1);
144   C.SetDirection(dir);
145
146   Pdeb = 0.;
147   Pfin = ElCLib::Parameter(C,pts2);
148 }  
149
150 //=======================================================================
151 //function : IsRational
152 //purpose  : 
153 //=======================================================================
154
155 Standard_Boolean BlendFunc_GenChamfer::IsRational() const
156 {
157   return Standard_False;
158 }
159
160 //=======================================================================
161 //function : GetMinimalWeight
162 //purpose  : 
163 //=======================================================================
164 void BlendFunc_GenChamfer::GetMinimalWeight(TColStd_Array1OfReal& Weights) const 
165 {
166   Weights.Init(1);
167 }
168
169
170 //=======================================================================
171 //function : NbIntervals
172 //purpose  : 
173 //=======================================================================
174
175 Standard_Integer BlendFunc_GenChamfer::NbIntervals (const GeomAbs_Shape S) const
176 {
177   return  curv->NbIntervals(BlendFunc::NextShape(S));
178 }
179
180
181 //=======================================================================
182 //function : Intervals
183 //purpose  : 
184 //=======================================================================
185
186 void BlendFunc_GenChamfer::Intervals (TColStd_Array1OfReal& T, const GeomAbs_Shape S) const
187 {
188   curv->Intervals(T, BlendFunc::NextShape(S)); 
189 }
190
191 //=======================================================================
192 //function : GetShape
193 //purpose  : 
194 //=======================================================================
195
196 void BlendFunc_GenChamfer::GetShape (Standard_Integer& NbPoles,
197                                   Standard_Integer& NbKnots,
198                                   Standard_Integer& Degree,
199                                   Standard_Integer& NbPoles2d)
200 {
201   NbPoles = 2;
202   NbPoles2d = 2;
203   NbKnots = 2;
204   Degree = 1;  
205 }
206   
207 //=======================================================================
208 //function : GetTolerance
209 //purpose  : Determine les Tolerance a utiliser dans les approximations.
210 //=======================================================================
211 void BlendFunc_GenChamfer::GetTolerance(const Standard_Real BoundTol, 
212                                         const Standard_Real, 
213                                         const Standard_Real, 
214                                         math_Vector& Tol3d, 
215                                         math_Vector&) const
216 {
217   Tol3d.Init(BoundTol);
218 }
219
220 //=======================================================================
221 //function : Knots
222 //purpose  : 
223 //=======================================================================
224
225 void BlendFunc_GenChamfer::Knots(TColStd_Array1OfReal& TKnots)
226 {
227   TKnots(1) = 0.;
228   TKnots(2) = 1.;
229 }
230
231
232 //=======================================================================
233 //function : Mults
234 //purpose  : 
235 //=======================================================================
236
237 void BlendFunc_GenChamfer::Mults(TColStd_Array1OfInteger& TMults)
238 {
239   TMults(1) = 2;
240   TMults(2) = 2;
241 }
242
243 //=======================================================================
244 //function : Section
245 //purpose  : 
246 //=======================================================================
247
248 Standard_Boolean BlendFunc_GenChamfer::Section
249   (const Blend_Point& /*P*/,
250    TColgp_Array1OfPnt& /*Poles*/,
251    TColgp_Array1OfVec& /*DPoles*/,
252    TColgp_Array1OfVec& /*D2Poles*/,
253    TColgp_Array1OfPnt2d& /*Poles2d*/,
254    TColgp_Array1OfVec2d& /*DPoles2d*/,
255    TColgp_Array1OfVec2d& /*D2Poles2d*/,
256    TColStd_Array1OfReal& /*Weights*/,
257    TColStd_Array1OfReal& /*DWeights*/,
258    TColStd_Array1OfReal& /*D2Weights*/)
259 {
260   return Standard_False;
261 }
262
263 //=======================================================================
264 //function : Section
265 //purpose  : 
266 //=======================================================================
267
268 Standard_Boolean BlendFunc_GenChamfer::Section
269   (const Blend_Point& P,
270    TColgp_Array1OfPnt& Poles,
271    TColgp_Array1OfVec& DPoles,
272    TColgp_Array1OfPnt2d& Poles2d,
273    TColgp_Array1OfVec2d& DPoles2d,
274    TColStd_Array1OfReal& Weights,
275    TColStd_Array1OfReal& DWeights)
276 {
277   math_Vector sol(1,4),valsol(1,4),secmember(1,4);
278   math_Matrix gradsol(1,4,1,4);
279
280   Standard_Real prm = P.Parameter();
281   Standard_Integer low = Poles.Lower();
282   Standard_Integer upp = Poles.Upper();
283   Standard_Boolean istgt;
284
285   P.ParametersOnS1(sol(1),sol(2));
286   P.ParametersOnS2(sol(3),sol(4));
287
288   Set(prm);
289   
290   Values(sol,valsol,gradsol);
291   IsSolution(sol,tol); 
292
293   istgt = IsTangencyPoint();
294
295   Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
296   Poles2d(Poles2d.Upper()).SetCoord(sol(3),sol(4));
297   if (!istgt) {
298   DPoles2d(Poles2d.Lower()).SetCoord(Tangent2dOnS1().X(),
299                                      Tangent2dOnS1().Y());
300   DPoles2d(Poles2d.Upper()).SetCoord(Tangent2dOnS2().X(),
301                                      Tangent2dOnS2().Y());
302   }
303   Poles(low) = PointOnS1();
304   Poles(upp) = PointOnS2();
305   Weights(low) = 1.0;
306   Weights(upp) = 1.0;
307   if (!istgt) {
308     DPoles(low) = TangentOnS1();
309     DPoles(upp) = TangentOnS2();
310     DWeights(low) = 0.0;
311     DWeights(upp) = 0.0;  
312   }
313
314   return (!istgt);
315 }
316
317 //=======================================================================
318 //function : Section
319 //purpose  : 
320 //=======================================================================
321
322 void BlendFunc_GenChamfer::Section(const Blend_Point& P,
323                                    TColgp_Array1OfPnt& Poles,
324                                    TColgp_Array1OfPnt2d& Poles2d,
325                                    TColStd_Array1OfReal& Weights)
326 {
327   Standard_Real u1,v1,u2,v2,prm = P.Parameter();
328   Standard_Integer low = Poles.Lower();
329   Standard_Integer upp = Poles.Upper();
330   math_Vector X(1,4), F(1,4);
331
332   P.ParametersOnS1(u1,v1);
333   P.ParametersOnS2(u2,v2);
334   X(1)=u1;
335   X(2)=v1;
336   X(3)=u2;
337   X(4)=v2;
338   Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
339   Poles2d(Poles2d.Upper()).SetCoord(u2,v2);
340
341   Set(prm);
342   Value(X,F);
343   Poles(low) = PointOnS1();
344   Poles(upp) = PointOnS2();
345   Weights(low) = 1.0;
346   Weights(upp) = 1.0;
347 }
348
349 void BlendFunc_GenChamfer::Resolution(const Standard_Integer IC2d, const Standard_Real Tol,
350                                       Standard_Real& TolU, Standard_Real& TolV) const
351 {
352   if(IC2d == 1){
353     TolU = surf1->UResolution(Tol);
354     TolV = surf1->VResolution(Tol);
355   }
356   else {
357     TolU = surf2->UResolution(Tol);
358     TolV = surf2->VResolution(Tol);
359   }
360 }