0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / Geom2dHatch / Geom2dHatch_Elements.cxx
1 // Created on: 1994-12-16
2 // Created by: Laurent BUCHARD
3 // Copyright (c) 1994-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 //  Modified by skv - Fri Jul 14 17:03:47 2006 OCC12627
18
19 #include <Geom2dAdaptor_Curve.hxx>
20 #include <Geom2dHatch_Element.hxx>
21 #include <Geom2dHatch_Elements.hxx>
22 #include <gp.hxx>
23 #include <gp_Lin2d.hxx>
24 #include <gp_Pnt2d.hxx>
25 #include <gp_Vec2d.hxx>
26 #include <Standard_DomainError.hxx>
27 #include <Standard_Integer.hxx>
28 #include <Standard_NoSuchObject.hxx>
29 #include <TColStd_MapIntegerHasher.hxx>
30 #include <TopAbs_Orientation.hxx>
31 #include <Precision.hxx>
32
33 static const Standard_Real Probing_Start = 0.123;
34 static const Standard_Real Probing_End = 0.8;
35 static const Standard_Real Probing_Step = 0.2111;
36
37 Geom2dHatch_Elements::Geom2dHatch_Elements(const Geom2dHatch_Elements& )
38 : NumWire(0),
39   NumEdge(0),
40   myCurEdge(0),
41   myCurEdgePar(0.0)
42 {
43 #ifdef OCCT_DEBUG
44   std::cout<<" Magic Constructor in Geom2dHatch_Elements:: "<<std::endl;
45 #endif
46 }
47
48 Geom2dHatch_Elements::Geom2dHatch_Elements()
49 {
50   NumWire = 0;
51   NumEdge = 0;
52   myCurEdge = 1;
53   myCurEdgePar = Probing_Start;
54 }
55
56 void Geom2dHatch_Elements::Clear()
57 {
58   myMap.Clear();
59 }
60
61 Standard_Boolean Geom2dHatch_Elements::IsBound(const Standard_Integer K) const
62 {
63   return(myMap.IsBound(K));
64 }
65
66 Standard_Boolean Geom2dHatch_Elements::UnBind(const Standard_Integer K)
67 {
68   return(myMap.UnBind(K));
69 }
70
71 Standard_Boolean Geom2dHatch_Elements::Bind(const Standard_Integer K,const Geom2dHatch_Element& I)
72 {
73   return(myMap.Bind(K,I));
74 }
75
76 const Geom2dHatch_Element& Geom2dHatch_Elements::Find(const Standard_Integer K) const
77 {
78   return(myMap.Find(K));
79 }
80
81 Geom2dHatch_Element& Geom2dHatch_Elements::ChangeFind(const Standard_Integer K)
82 {
83   return(myMap.ChangeFind(K));
84 }
85
86 //=======================================================================
87 //function : CheckPoint
88 //purpose  : 
89 //=======================================================================
90
91 Standard_Boolean  Geom2dHatch_Elements::CheckPoint(gp_Pnt2d&)
92 {
93   return Standard_True;
94 }
95
96 //=======================================================================
97 //function : Reject
98 //purpose  : 
99 //=======================================================================
100
101 Standard_Boolean  Geom2dHatch_Elements::Reject(const gp_Pnt2d&) const  {
102   return Standard_False;
103 }
104
105 //=======================================================================
106 //function : Segment
107 //purpose  : 
108 //=======================================================================
109
110 Standard_Boolean Geom2dHatch_Elements::Segment(const gp_Pnt2d& P, 
111                                                      gp_Lin2d& L, 
112                                                      Standard_Real& Par)
113 {
114   myCurEdge = 1;
115   myCurEdgePar = Probing_Start;
116   return OtherSegment(P, L, Par);
117 }
118
119 //=======================================================================
120 //function : Segment
121 //purpose  : 
122 //=======================================================================
123
124 Standard_Boolean Geom2dHatch_Elements::OtherSegment (const gp_Pnt2d& P, 
125                                                      gp_Lin2d& L, 
126                                                      Standard_Real& Par)
127 {
128   Geom2dHatch_DataMapIteratorOfMapOfElements Itertemp;
129   Standard_Integer                        i;
130   
131   for (Itertemp.Initialize (myMap), i = 1; Itertemp.More(); Itertemp.Next(), i++)
132   {
133     if (i < myCurEdge)
134       continue;
135
136     void *ptrmyMap = (void *)(&myMap);
137     Geom2dHatch_Element& Item = ((Geom2dHatch_MapOfElements*)ptrmyMap)->ChangeFind (Itertemp.Key());
138     Geom2dAdaptor_Curve& E = Item.ChangeCurve();
139     TopAbs_Orientation Or = Item.Orientation();
140     if (Or == TopAbs_FORWARD || Or == TopAbs_REVERSED)
141     {
142       Standard_Real aFPar = E.FirstParameter(), aLPar = E.LastParameter();
143       if (Precision::IsNegativeInfinite (aFPar))
144       {
145         if (Precision::IsPositiveInfinite (aLPar))
146         {
147           aFPar = -1.;
148           aLPar = 1.;
149         }
150         else
151           aFPar = aLPar - 1.;
152       }
153       else if (Precision::IsPositiveInfinite (aLPar))
154         aLPar = aFPar + 1.;
155
156       for (; myCurEdgePar < Probing_End; myCurEdgePar += Probing_Step)
157       {
158         Standard_Real aParam = myCurEdgePar * aFPar + (1. - myCurEdgePar) * aLPar;
159         gp_Vec2d aTanVec;
160         gp_Pnt2d aPOnC;
161         E.D1 (aParam, aPOnC, aTanVec);
162         gp_Vec2d aLinVec (P, aPOnC);
163         Par = aLinVec.SquareMagnitude();
164         if (Par > Precision::SquarePConfusion())
165         {
166           gp_Dir2d aLinDir (aLinVec);
167           Standard_Real aTanMod = aTanVec.SquareMagnitude();
168           if (aTanMod < Precision::SquarePConfusion())
169             continue;
170
171           aTanVec /= Sqrt (aTanMod);
172           Standard_Real aSinA = aTanVec.Crossed (aLinDir);
173           if (Abs (aSinA) < 0.001)
174           {
175             // too small angle - line and edge may be considered
176             // as tangent which is bad for classifier
177             if (myCurEdgePar + Probing_Step < Probing_End)
178               continue;
179           }
180
181           L = gp_Lin2d (P, aLinDir);
182
183           aPOnC = E.Value (aFPar);
184           if (L.SquareDistance (aPOnC) > Precision::SquarePConfusion())
185           {
186             aPOnC = E.Value (aLPar);
187             if (L.SquareDistance (aPOnC) > Precision::SquarePConfusion())
188             {
189               myCurEdgePar += Probing_Step;
190               if (myCurEdgePar >= Probing_End)
191               {
192                 myCurEdge++;
193                 myCurEdgePar = Probing_Start;
194               }
195               Par = Sqrt (Par);
196               return Standard_True;
197             }
198           }
199         }
200       }
201     }
202     myCurEdge++;
203     myCurEdgePar = Probing_Start;
204   }
205
206   Par = RealLast();
207   L = gp_Lin2d (P, gp_Dir2d (1, 0));
208
209   return Standard_False;
210 }
211
212 //=======================================================================
213 //function : InitWires
214 //purpose  : 
215 //=======================================================================
216
217 void  Geom2dHatch_Elements::InitWires()  {
218   NumWire = 0;
219 }
220
221 //=======================================================================
222 //function : RejectWire NYI
223 //purpose  : 
224 //=======================================================================
225
226 Standard_Boolean Geom2dHatch_Elements::RejectWire(const gp_Lin2d& , 
227                                                    const Standard_Real) const 
228 {
229   return Standard_False;
230 }
231
232 //=======================================================================
233 //function : InitEdges
234 //purpose  : 
235 //=======================================================================
236
237 void  Geom2dHatch_Elements::InitEdges()  {
238   NumEdge = 0;
239   Iter.Initialize(myMap);
240 }
241
242 //=======================================================================
243 //function : RejectEdge NYI
244 //purpose  : 
245 //=======================================================================
246
247 Standard_Boolean Geom2dHatch_Elements::RejectEdge(const gp_Lin2d& , 
248                                                   const Standard_Real ) const 
249 {
250   return Standard_False;
251 }
252
253
254 //=======================================================================
255 //function : CurrentEdge
256 //purpose  : 
257 //=======================================================================
258
259 void  Geom2dHatch_Elements::CurrentEdge(Geom2dAdaptor_Curve& E, 
260                                         TopAbs_Orientation& Or) const 
261 {
262   void *ptrmyMap = (void *)(&myMap);
263   Geom2dHatch_Element& Item=((Geom2dHatch_MapOfElements*)ptrmyMap)->ChangeFind(Iter.Key());
264
265   E = Item.ChangeCurve();
266   Or= Item.Orientation();
267 #if 0 
268   E.Edge() = TopoDS::Edge(myEExplorer.Current());
269   E.Face() = myFace;
270   Or = E.Edge().Orientation();
271 #endif
272 }
273
274
275 //=======================================================================
276 //function : MoreWires
277 //purpose  : 
278 //=======================================================================
279
280 Standard_Boolean  Geom2dHatch_Elements::MoreWires() const 
281 {
282   return (NumWire == 0);
283 }
284
285 //=======================================================================
286 //function : NextWire
287 //purpose  : 
288 //=======================================================================
289
290 void Geom2dHatch_Elements::NextWire()  {
291   NumWire++;
292 }
293
294 //=======================================================================
295 //function : MoreEdges
296 //purpose  : 
297 //=======================================================================
298
299 Standard_Boolean  Geom2dHatch_Elements::MoreEdges() const  {
300   return(Iter.More());
301 }
302
303 //=======================================================================
304 //function : NextEdge
305 //purpose  : 
306 //=======================================================================
307
308 void Geom2dHatch_Elements::NextEdge()  {
309   Iter.Next();
310 }
311
312
313