0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / GCPnts / GCPnts_TangentialDeflection.cxx
1 // Created on: 1996-11-08
2 // Created by: Jean Claude VAUTHIER
3 // Copyright (c) 1996-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 <Adaptor2d_Curve2d.hxx>
19 #include <Adaptor3d_Curve.hxx>
20 #include <GCPnts_TangentialDeflection.hxx>
21 #include <gp_Pnt.hxx>
22 #include <gp_Pnt2d.hxx>
23 #include <gp_Vec.hxx>
24 #include <gp_Vec2d.hxx>
25 #include <gp_XYZ.hxx>
26 #include <Precision.hxx>
27 #include <Standard_ConstructionError.hxx>
28 #include <Standard_OutOfRange.hxx>
29 #include <TColStd_Array1OfReal.hxx>
30
31 inline static void D0 (const Adaptor3d_Curve& C, const Standard_Real U, gp_Pnt& P)
32 {
33   C.D0 (U, P);
34 }
35
36 inline static void D2 (const Adaptor3d_Curve& C, const Standard_Real U, 
37                        gp_Pnt& P, gp_Vec& V1, gp_Vec& V2)
38 {
39   C.D2 (U, P, V1, V2);
40 }
41
42
43 static void D0 (const Adaptor2d_Curve2d& C, const Standard_Real U, gp_Pnt& PP)
44 {
45   Standard_Real X, Y;
46   gp_Pnt2d P;
47   C.D0 (U, P);
48   P.Coord (X, Y);
49   PP.SetCoord (X, Y, 0.0);
50 }
51
52 static void D2 (const Adaptor2d_Curve2d& C, const Standard_Real U,
53                 gp_Pnt& PP, gp_Vec& VV1, gp_Vec& VV2)
54 {
55   Standard_Real X, Y;
56   gp_Pnt2d P;
57   gp_Vec2d V1,V2;
58   C.D2 (U, P, V1, V2);
59   P.Coord (X, Y);
60   PP.SetCoord  (X, Y, 0.0);
61   V1.Coord (X, Y);
62   VV1.SetCoord (X, Y, 0.0);
63   V2.Coord (X, Y);
64   VV2.SetCoord (X, Y, 0.0);
65 }
66
67 static Standard_Real EstimAngl(const gp_Pnt& P1, const gp_Pnt& Pm, const gp_Pnt& P2)
68 {
69   gp_Vec V1(P1, Pm), V2(Pm, P2);
70   Standard_Real L = V1.Magnitude() * V2.Magnitude();
71   //
72   if(L > gp::Resolution())
73   {
74     return V1.CrossMagnitude(V2)/L;
75   }
76   else
77   {
78     return 0.;
79   }
80 }
81
82
83 // Return number of interval of continuity on which theParam is located.
84 // Last parameter is used to increase search speed.
85 static Standard_Integer getIntervalIdx(const Standard_Real theParam, 
86                                        TColStd_Array1OfReal& theIntervs,
87                                        const Standard_Integer thePreviousIdx)
88 {
89   Standard_Integer anIdx;
90   for(anIdx = thePreviousIdx; anIdx < theIntervs.Upper(); anIdx++)
91   {
92     if (theParam >= theIntervs(anIdx) && 
93         theParam <= theIntervs(anIdx + 1)) // Inside of anIdx interval.
94     {
95       break;
96     }
97   }
98   return anIdx;
99 }
100 //
101 //=======================================================================
102 //function : CPnts_TangentialDeflection
103 //purpose  : 
104 //=======================================================================
105
106 GCPnts_TangentialDeflection::GCPnts_TangentialDeflection ()
107 : angularDeflection(0.0),
108   curvatureDeflection(0.0),
109   uTol(0.0),
110   minNbPnts(0),
111   myMinLen(0.0),
112   lastu(0.0),
113   firstu(0.0)
114 {
115 }
116
117 //=======================================================================
118 //function : AddPoint
119 //purpose  : 
120 //=======================================================================
121
122 Standard_Integer GCPnts_TangentialDeflection::AddPoint
123  (const gp_Pnt& thePnt,
124   const Standard_Real theParam,
125   const Standard_Boolean theIsReplace)
126 {
127   const Standard_Real tol = Precision::PConfusion();
128   Standard_Integer index = -1;
129   const Standard_Integer nb = parameters.Length();
130   for ( Standard_Integer i = 1; index == -1 && i <= nb; i++ )
131   {
132     Standard_Real dist = parameters.Value( i ) - theParam;
133     if ( fabs( dist ) <= tol )
134     {
135       index = i;
136       if ( theIsReplace )
137       {
138         points.ChangeValue(i) = thePnt;
139         parameters.ChangeValue(i) = theParam;
140       }
141     }
142     else if ( dist > tol )
143     {
144       points.InsertBefore( i, thePnt );
145       parameters.InsertBefore( i, theParam );
146       index = i;
147     }
148   }
149   if ( index == -1 )
150   {
151     points.Append( thePnt );
152     parameters.Append( theParam );
153     index = parameters.Length();
154   }
155   return index;
156 }
157
158 //=======================================================================
159 //function : ArcAngularStep
160 //purpose  : 
161 //=======================================================================
162 Standard_Real GCPnts_TangentialDeflection::ArcAngularStep(
163   const Standard_Real theRadius,
164   const Standard_Real theLinearDeflection,
165   const Standard_Real theAngularDeflection,
166   const Standard_Real theMinLength)
167 {
168   Standard_ConstructionError_Raise_if(theRadius < 0.0, "Negative radius");
169
170   const Standard_Real aPrecision = Precision::Confusion();
171
172   Standard_Real Du = 0.0, aMinSizeAng = 0.0;
173   if (theRadius > aPrecision)
174   {
175     Du = Max(1.0 - (theLinearDeflection / theRadius), 0.0);
176
177     // It is not suitable to consider min size greater than 1/4 arc len.
178     if (theMinLength > aPrecision)
179       aMinSizeAng = Min(theMinLength / theRadius, M_PI_2);
180   }
181   Du = 2.0 * ACos(Du);
182   Du = Max(Min(Du, theAngularDeflection), aMinSizeAng);
183   return Du;
184 }
185
186 #include <Geom_BezierCurve.hxx>
187 #include <Geom_BSplineCurve.hxx>
188 #include <gp_Circ.hxx>
189 #include <GCPnts_DistFunction.hxx>
190
191 #define TheCurve Adaptor3d_Curve
192 #define Handle_TheBezierCurve   Handle(Geom_BezierCurve)
193 #define Handle_TheBSplineCurve  Handle(Geom_BSplineCurve)
194 #define TheMaxCurvLinDist GCPnts_DistFunction
195 #define TheMaxCurvLinDistMV GCPnts_DistFunctionMV
196 #include "GCPnts_TangentialDeflection.pxx"
197 #undef Handle_TheBezierCurve
198 #undef Handle_TheBSplineCurve
199 #undef TheCurve
200 #undef TheMaxCurvLinDist
201 #undef TheMaxCurvLinDistMV
202
203
204 #include <Geom2d_BezierCurve.hxx>
205 #include <Geom2d_BSplineCurve.hxx>
206 #include <gp_Circ2d.hxx>
207 #include <GCPnts_DistFunction2d.hxx>
208 #define TheCurve Adaptor2d_Curve2d
209 #define Handle_TheBezierCurve   Handle(Geom2d_BezierCurve)
210 #define Handle_TheBSplineCurve  Handle(Geom2d_BSplineCurve)
211 #define TheMaxCurvLinDist GCPnts_DistFunction2d
212 #define TheMaxCurvLinDistMV GCPnts_DistFunction2dMV
213 #include "GCPnts_TangentialDeflection.pxx"
214 #undef Handle_TheBezierCurve
215 #undef Handle_TheBSplineCurve
216 #undef TheCurve
217 #undef TheMaxCurvLinDist
218 #undef TheMaxCurvLinDistMV