0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / IntPatch / IntPatch_PolyLine.cxx
1 // Created on: 1993-01-29
2 // Created by: Isabelle GRIGNON
3 // Copyright (c) 1993-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 //-- lbr le 12 juin : Ajout des fleches sur les Lines
18 //-- msv 13.03.2002 : compute deflection for WLine; Error() returns deflection
19
20 #include <gp_Pnt2d.hxx>
21 #include <IntPatch_PolyLine.hxx>
22 #include <IntPatch_RLine.hxx>
23 #include <IntPatch_WLine.hxx>
24 #include <Precision.hxx>
25
26 #define INITDEFLE Precision::PConfusion()*100.
27
28 //=======================================================================
29 //function : IntPatch_PolyLine
30 //purpose  : 
31 //=======================================================================
32
33 IntPatch_PolyLine::IntPatch_PolyLine ()
34      : IntPatch_Polygo(INITDEFLE),
35        onfirst(Standard_False)
36 {
37 }
38
39 //=======================================================================
40 //function : IntPatch_PolyLine
41 //purpose  : 
42 //=======================================================================
43
44 IntPatch_PolyLine::IntPatch_PolyLine (const Standard_Real InitDefle)
45      : IntPatch_Polygo(InitDefle),
46        onfirst(Standard_False)       
47 {
48 }
49
50 //=======================================================================
51 //function : SetWLine
52 //purpose  : 
53 //=======================================================================
54
55 void IntPatch_PolyLine::SetWLine(const Standard_Boolean OnFirst, const Handle(IntPatch_WLine)& Line)
56 {
57   typ = IntPatch_Walking;
58   wpoly = Line;
59   onfirst = OnFirst;
60   Prepare();
61 }
62
63 //=======================================================================
64 //function : SetRLine
65 //purpose  : 
66 //=======================================================================
67
68 void IntPatch_PolyLine::SetRLine(const Standard_Boolean OnFirst, const Handle(IntPatch_RLine)& Line)
69 {
70   typ = IntPatch_Restriction;
71   rpoly = Line;
72   onfirst = OnFirst;
73   Prepare();
74 }
75
76 //=======================================================================
77 //function : Prepare
78 //purpose  : 
79 //=======================================================================
80
81 void IntPatch_PolyLine::Prepare()
82 {
83   Standard_Integer i;
84   myBox.SetVoid();
85   Standard_Integer n=NbPoints();
86   const Standard_Real eps_2 = myError * myError;
87
88   gp_Pnt2d P1, P2;
89   if (n >= 3) {
90     P1 = Point(1); P2 = Point(2);
91   }
92   for (i=1; i<=n ;i++) {
93     const gp_Pnt2d& P3 = Point(i);
94     if (i >= 3) {
95       gp_XY V13 = P3.XY() - P1.XY();
96       gp_XY V12 = P2.XY() - P1.XY();
97       Standard_Real d13_2 = V13.SquareModulus(), d_2;
98       if (d13_2 > eps_2)
99         d_2 = V13.CrossSquareMagnitude(V12) / d13_2;
100       else
101         d_2 = eps_2;
102       if (d_2 > myError * myError) {
103         // try to compute deflection more precisely using parabola interpolation
104         gp_XY V23 = P3.XY() - P2.XY();
105         Standard_Real d12 = V12.Modulus(), d23 = V23.Modulus();
106         // compute parameter of P2 (assume parameters of P1,P3 are 0,1)
107         Standard_Real tm = d12 / (d12+d23);
108         if (tm > 0.1 && tm < 0.9) {
109           tm -= (tm-0.5) * 0.6;
110           Standard_Real tm1mtm = tm*(1-tm);
111           // coefficients of parabola
112           Standard_Real Ax = (tm*V13.X() - V12.X()) / tm1mtm;
113           Standard_Real Bx = (V12.X() - tm*tm*V13.X()) / tm1mtm;
114           Standard_Real Cx = P1.X();
115           Standard_Real Ay = (tm*V13.Y() - V12.Y()) / tm1mtm;
116           Standard_Real By = (V12.Y() - tm*tm*V13.Y()) / tm1mtm;
117           Standard_Real Cy = P1.Y();
118           // equations of lines P1-P2 and P2-P3
119           Standard_Real A1 = V12.Y() / d12;
120           Standard_Real B1 = -V12.X() / d12;
121           Standard_Real C1 = (P2.X()*P1.Y() - P1.X()*P2.Y()) / d12;
122           Standard_Real A2 = V23.Y() / d23;
123           Standard_Real B2 = -V23.X() / d23;
124           Standard_Real C2 = (P3.X()*P2.Y() - P2.X()*P3.Y()) / d23;
125           // points on parabola with max deflection
126           Standard_Real t1 = -0.5 * (A1*Bx + B1*By) / (A1*Ax + B1*Ay);
127           Standard_Real t2 = -0.5 * (A2*Bx + B2*By) / (A2*Ax + B2*Ay);
128           Standard_Real xt1 = Ax*t1*t1 + Bx*t1 + Cx;
129           Standard_Real yt1 = Ay*t1*t1 + By*t1 + Cy;
130           Standard_Real xt2 = Ax*t2*t2 + Bx*t2 + Cx;
131           Standard_Real yt2 = Ay*t2*t2 + By*t2 + Cy;
132           // max deflection on segments P1-P2 and P2-P3
133           Standard_Real d1 = Abs (A1*xt1 + B1*yt1 + C1);
134           Standard_Real d2 = Abs (A2*xt2 + B2*yt2 + C2);
135           if (d2 > d1) d1 = d2;
136           // select min deflection from linear and parabolic ones
137           if (d1 * d1 < d_2) d_2 = d1 * d1;
138         }
139         if (d_2 > myError * myError) myError=Sqrt(d_2);
140       }
141       P1 = P2; P2 = P3;
142     }
143     myBox.Add(P3);
144   }
145   myBox.Enlarge(myError);  
146 }
147
148 //=======================================================================
149 //function : ResetError
150 //purpose  : 
151 //=======================================================================
152
153 void IntPatch_PolyLine::ResetError()
154 {
155   myError = INITDEFLE;
156 }
157
158 //=======================================================================
159 //function : NbPoints
160 //purpose  : 
161 //=======================================================================
162
163 Standard_Integer IntPatch_PolyLine::NbPoints() const
164 {
165   return (typ == IntPatch_Walking ? wpoly->NbPnts() : rpoly->NbPnts());
166 }
167
168 //=======================================================================
169 //function : Point
170 //purpose  : 
171 //=======================================================================
172
173 gp_Pnt2d IntPatch_PolyLine::Point(const Standard_Integer Index )  const 
174
175   Standard_Real X,Y,X1,Y1,DX,DY;
176   DX=DY=0;
177   if (onfirst) {
178     if (typ == IntPatch_Walking) {
179       wpoly->Point(Index).ParametersOnS1(X,Y);
180       if(Index==1) { 
181         wpoly->Point(2).ParametersOnS1(X1,Y1);
182         DX=0.0000001*(X-X1);
183         DY=0.0000001*(Y-Y1);    
184       }
185       else if(Index==wpoly->NbPnts()) { 
186         wpoly->Point(Index-1).ParametersOnS1(X1,Y1);
187         DX=0.0000001*(X-X1);
188         DY=0.0000001*(Y-Y1);    
189       }
190     }
191     else {
192       rpoly->Point(Index).ParametersOnS1(X,Y);
193     }
194   }
195   else {
196     if (typ == IntPatch_Walking) {
197       wpoly->Point(Index).ParametersOnS2(X,Y);
198       if(Index==1) { 
199         wpoly->Point(2).ParametersOnS2(X1,Y1);
200         DX=0.0000001*(X-X1);
201         DY=0.0000001*(Y-Y1);    
202       }
203       else if(Index==wpoly->NbPnts()) { 
204         wpoly->Point(Index-1).ParametersOnS2(X1,Y1);
205         DX=0.0000001*(X-X1);
206         DY=0.0000001*(Y-Y1);    
207       }
208     }
209     else {
210       rpoly->Point(Index).ParametersOnS2(X,Y);
211     }
212   }
213
214   return(gp_Pnt2d(X+DX,Y+DY));
215 }