0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / HLRAlgo / HLRAlgo_PolyAlgo.cxx
CommitLineData
b311480e 1// Created on: 1995-05-05
2// Created by: Christophe MARION
3// Copyright (c) 1995-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
733a0e55 16
7fd59977 17#ifndef No_Exception
18//#define No_Exception
19#endif
42cf5bc1 20
21
7fd59977 22#include <HLRAlgo_BiPoint.hxx>
42cf5bc1 23#include <HLRAlgo_EdgeStatus.hxx>
24#include <HLRAlgo_ListOfBPoint.hxx>
25#include <HLRAlgo_PolyAlgo.hxx>
42cf5bc1 26#include <HLRAlgo_PolyShellData.hxx>
681f3919 27#include <HLRAlgo_PolyMask.hxx>
28
7fd59977 29#include <Precision.hxx>
42cf5bc1 30#include <Standard_Type.hxx>
7fd59977 31
25e59720 32IMPLEMENT_STANDARD_RTTIEXT(HLRAlgo_PolyAlgo,Standard_Transient)
92efcf78 33
7fd59977 34//static Standard_Integer ERROR = Standard_False;
35
36//=======================================================================
37//function : HLRAlgo_PolyAlgo
38//purpose :
39//=======================================================================
40
41HLRAlgo_PolyAlgo::HLRAlgo_PolyAlgo ()
d533dafb 42: myNbrShell(0),
43 myCurShell(0),
44 myFound(Standard_False)
7fd59977 45{
681f3919 46 myTriangle.TolParam = 0.00000001;
47 myTriangle.TolAng = 0.0001;
7fd59977 48}
49
50//=======================================================================
51//function : Init
52//purpose :
53//=======================================================================
54
55void
56HLRAlgo_PolyAlgo::Init (const Handle(TColStd_HArray1OfTransient)& HShell)
57{ myHShell = HShell; }
58
59//=======================================================================
60//function : Clear
61//purpose :
62//=======================================================================
63
64void HLRAlgo_PolyAlgo::Clear ()
65{
66 if (!myHShell.IsNull()) {
67 myHShell.Nullify();
68 }
69 myNbrShell = 0;
70}
71
72//=======================================================================
73//function : Update
74//purpose :
75//=======================================================================
76
77void HLRAlgo_PolyAlgo::Update ()
78{
79 Standard_Integer i,j;
80 Standard_Integer nxMin,nyMin,nzMin,nxMax,nyMax,nzMax;
81 Standard_Real xShellMin,yShellMin,zShellMin;
82 Standard_Real xShellMax,yShellMax,zShellMax;
83 Standard_Real xPolyTMin,yPolyTMin,zPolyTMin;
84 Standard_Real xPolyTMax,yPolyTMax,zPolyTMax;
85 Standard_Real xTrianMin,yTrianMin,zTrianMin;
86 Standard_Real xTrianMax,yTrianMax,zTrianMax;
87 Standard_Real xSegmnMin,ySegmnMin,zSegmnMin;
88 Standard_Real xSegmnMax,ySegmnMax,zSegmnMax;
7fd59977 89 Standard_Real Big = Precision::Infinite();
681f3919 90 HLRAlgo_PolyData::Box aBox(Big, Big, Big, -Big, -Big, -Big);
7fd59977 91 TColStd_Array1OfTransient& Shell = myHShell->ChangeArray1();
92 myNbrShell = Shell.Upper();
93 Handle(HLRAlgo_PolyShellData)* psd1 =
94 (Handle(HLRAlgo_PolyShellData)*)&(Shell.ChangeValue(1));
95
96 for (i = 1; i <= myNbrShell; i++) {
681f3919 97 (*psd1)->UpdateGlobalMinMax(aBox);
7fd59977 98 psd1++;
99 }
100
681f3919 101 Standard_Real dx = aBox.XMax - aBox.XMin;
102 Standard_Real dy = aBox.YMax - aBox.YMin;
103 Standard_Real dz = aBox.ZMax - aBox.ZMin;
7fd59977 104 Standard_Real precad = dx;
105 if (precad < dy) precad = dy;
106 if (precad < dz) precad = dz;
681f3919 107 myTriangle.Tolerance = precad * myTriangle.TolParam;
7fd59977 108 precad = precad * 0.01;
109 Standard_Real SurDX = 1020 / (dx + precad);
110 Standard_Real SurDY = 1020 / (dy + precad);
111 Standard_Real SurDZ = 508 / (dz + precad);
112 precad = precad * 0.5;
681f3919 113 Standard_Real DecaX = - aBox.XMin + precad;
114 Standard_Real DecaY = - aBox.YMin + precad;
115 Standard_Real DecaZ = - aBox.ZMin + precad;
7fd59977 116
117 Handle(HLRAlgo_PolyShellData)* psd2 =
118 (Handle(HLRAlgo_PolyShellData)*)&(Shell.ChangeValue(1));
119
120 for (i = 1; i <= myNbrShell; i++) {
681f3919 121 HLRAlgo_PolyShellData::ShellIndices& aShellIndices = (*psd2)->Indices();
7fd59977 122 xShellMin = Big;
123 yShellMin = Big;
124 zShellMin = Big;
125 xShellMax = -Big;
126 yShellMax = -Big;
127 zShellMax = -Big;
128
129 for (mySegListIt.Initialize((*psd2)->Edges());
130 mySegListIt.More();
131 mySegListIt.Next()) {
132 HLRAlgo_BiPoint& BP = mySegListIt.Value();
681f3919 133 HLRAlgo_BiPoint::PointsT& aPoints = BP.Points();
134 HLRAlgo_BiPoint::IndicesT& theIndices = BP.Indices();
135 if (aPoints.PntP1.X() < aPoints.PntP2.X()) { xSegmnMin = aPoints.PntP1.X(); xSegmnMax = aPoints.PntP2.X(); }
136 else { xSegmnMin = aPoints.PntP2.X(); xSegmnMax = aPoints.PntP1.X(); }
137 if (aPoints.PntP1.Y() < aPoints.PntP2.Y()) { ySegmnMin = aPoints.PntP1.Y(); ySegmnMax = aPoints.PntP2.Y(); }
138 else { ySegmnMin = aPoints.PntP2.Y(); ySegmnMax = aPoints.PntP1.Y(); }
139 if (aPoints.PntP1.Z() < aPoints.PntP2.Z()) { zSegmnMin = aPoints.PntP1.Z(); zSegmnMax = aPoints.PntP2.Z(); }
140 else { zSegmnMin = aPoints.PntP2.Z(); zSegmnMax = aPoints.PntP1.Z(); }
7fd59977 141 nxMin = (Standard_Integer)((DecaX + xSegmnMin) * SurDX);
142 nyMin = (Standard_Integer)((DecaY + ySegmnMin) * SurDY);
143 nzMin = (Standard_Integer)((DecaZ + zSegmnMin) * SurDZ);
144 nxMax = (Standard_Integer)((DecaX + xSegmnMax) * SurDX);
145 nyMax = (Standard_Integer)((DecaY + ySegmnMax) * SurDY);
146 nzMax = (Standard_Integer)((DecaZ + zSegmnMax) * SurDZ);
681f3919 147 theIndices.MinSeg = nyMin + (nxMin << 11);
148 theIndices.MinSeg <<= 10;
149 theIndices.MinSeg += nzMin;
150 theIndices.MaxSeg = nyMax + (nxMax << 11);
151 theIndices.MaxSeg <<= 10;
152 theIndices.MaxSeg += nzMax + 0x00000200;
7fd59977 153 if (xShellMin > xSegmnMin) xShellMin = xSegmnMin;
154 if (xShellMax < xSegmnMax) xShellMax = xSegmnMax;
155 if (yShellMin > ySegmnMin) yShellMin = ySegmnMin;
156 if (yShellMax < ySegmnMax) yShellMax = ySegmnMax;
157 if (zShellMin > zSegmnMin) zShellMin = zSegmnMin;
158 if (zShellMax < zSegmnMax) zShellMax = zSegmnMax;
159 }
160 TColStd_Array1OfTransient& Polyg = (*psd2)->PolyData();
161 Standard_Integer nbFace = Polyg.Upper();
162 Standard_Integer nbFaHi = 0;
1d47d8d0 163 Handle(HLRAlgo_PolyData)* pd = NULL;
7fd59977 164 if(nbFace > 0) pd = (Handle(HLRAlgo_PolyData)*)&(Polyg.ChangeValue(1));
165
166 for (j = 1; j <= nbFace; j++) {
167 if ((*pd)->Hiding()) {
168 nbFaHi++;
169 xPolyTMin = Big;
170 yPolyTMin = Big;
171 zPolyTMin = Big;
172 xPolyTMax = -Big;
173 yPolyTMax = -Big;
174 zPolyTMax = -Big;
175 Standard_Integer otheri,nbHide = 0;//min,max;
176 Standard_Real X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3;
177 Standard_Real dn,dnx,dny,dnz,dx1,dy1,dz1,dx2,dy2,dz2,dx3,dy3;
178 Standard_Real adx1,ady1,adx2,ady2,adx3,ady3;
7fd59977 179 Standard_Real a =0.,b =0.,c =0.,d =0.;
681f3919 180 HLRAlgo_PolyData::FaceIndices& PolyTIndices = (*pd)->Indices();
7fd59977 181 TColgp_Array1OfXYZ & Nodes = (*pd)->Nodes();
182 HLRAlgo_Array1OfTData& TData = (*pd)->TData();
183 HLRAlgo_Array1OfPHDat& PHDat = (*pd)->PHDat();
184 Standard_Integer nbT = TData.Upper();
185 HLRAlgo_TriangleData* TD = &(TData.ChangeValue(1));
186
187 for (otheri = 1; otheri <= nbT; otheri++) {
681f3919 188 if (TD->Flags & HLRAlgo_PolyMask_FMskHiding) {
189 const gp_XYZ& P1 = Nodes(TD->Node1);
190 const gp_XYZ& P2 = Nodes(TD->Node2);
191 const gp_XYZ& P3 = Nodes(TD->Node3);
7fd59977 192 X1 = P1.X();
193 Y1 = P1.Y();
194 Z1 = P1.Z();
195 X2 = P2.X();
196 Y2 = P2.Y();
197 Z2 = P2.Z();
198 X3 = P3.X();
199 Y3 = P3.Y();
200 Z3 = P3.Z();
201 xTrianMax = xTrianMin = X1;
202 yTrianMax = yTrianMin = Y1;
203 zTrianMax = zTrianMin = Z1;
204 if (xTrianMin > X2) xTrianMin = X2;
205 else if (xTrianMax < X2) xTrianMax = X2;
206 if (yTrianMin > Y2) yTrianMin = Y2;
207 else if (yTrianMax < Y2) yTrianMax = Y2;
208 if (zTrianMin > Z2) zTrianMin = Z2;
209 else if (zTrianMax < Z2) zTrianMax = Z2;
210 if (xTrianMin > X3) xTrianMin = X3;
211 else if (xTrianMax < X3) xTrianMax = X3;
212 if (yTrianMin > Y3) yTrianMin = Y3;
213 else if (yTrianMax < Y3) yTrianMax = Y3;
214 if (zTrianMin > Z3) zTrianMin = Z3;
215 else if (zTrianMax < Z3) zTrianMax = Z3;
216 nxMin = (Standard_Integer)((DecaX + xTrianMin) * SurDX);
217 nyMin = (Standard_Integer)((DecaY + yTrianMin) * SurDY);
218 nzMin = (Standard_Integer)((DecaZ + zTrianMin) * SurDZ);
219 nxMax = (Standard_Integer)((DecaX + xTrianMax) * SurDX);
220 nyMax = (Standard_Integer)((DecaY + yTrianMax) * SurDY);
221 nzMax = (Standard_Integer)((DecaZ + zTrianMax) * SurDZ);
222 Standard_Integer MinTrian,MaxTrian;
223 MinTrian = nyMin + (nxMin << 11);
224 MinTrian <<= 10;
225 MinTrian += nzMin - 0x00000200;
226 MaxTrian = nyMax + (nxMax << 11);
227 MaxTrian <<= 10;
228 MaxTrian += nzMax;
229 dx1 = X2 - X1;
230 dy1 = Y2 - Y1;
231 dz1 = Z2 - Z1;
232 dx2 = X3 - X2;
233 dy2 = Y3 - Y2;
234 dz2 = Z3 - Z2;
235 dx3 = X1 - X3;
236 dy3 = Y1 - Y3;
237 dnx = dy1 * dz2 - dy2 * dz1;
238 dny = dz1 * dx2 - dz2 * dx1;
239 dnz = dx1 * dy2 - dx2 * dy1;
240 dn = sqrt(dnx * dnx + dny * dny + dnz * dnz);
241 if (dn > 0) {
242 a = dnx / dn;
243 b = dny / dn;
244 c = dnz / dn;
245 }
246 d = a * X1 + b * Y1 + c * Z1;
247 nbHide++;
248 PHDat(nbHide).Set(otheri,MinTrian,MaxTrian,a,b,c,d);
249 adx1 = dx1;
250 ady1 = dy1;
251 if (dx1 < 0) adx1 = -dx1;
252 if (dy1 < 0) ady1 = -dy1;
253 adx2 = dx2;
254 ady2 = dy2;
255 if (dx2 < 0) adx2 = -dx2;
256 if (dy2 < 0) ady2 = -dy2;
257 adx3 = dx3;
258 ady3 = dy3;
259 if (dx3 < 0) adx3 = -dx3;
260 if (dy3 < 0) ady3 = -dy3;
681f3919 261 if (adx1 > ady1) TD->Flags |= HLRAlgo_PolyMask_EMskGrALin1;
262 else TD->Flags &= ~HLRAlgo_PolyMask_EMskGrALin1;
263 if (adx2 > ady2) TD->Flags |= HLRAlgo_PolyMask_EMskGrALin2;
264 else TD->Flags &= ~HLRAlgo_PolyMask_EMskGrALin2;
265 if (adx3 > ady3) TD->Flags |= HLRAlgo_PolyMask_EMskGrALin3;
266 else TD->Flags &= ~HLRAlgo_PolyMask_EMskGrALin3;
7fd59977 267 if (xPolyTMin > xTrianMin) xPolyTMin = xTrianMin;
268 if (xPolyTMax < xTrianMax) xPolyTMax = xTrianMax;
269 if (yPolyTMin > yTrianMin) yPolyTMin = yTrianMin;
270 if (yPolyTMax < yTrianMax) yPolyTMax = yTrianMax;
271 if (zPolyTMin > zTrianMin) zPolyTMin = zTrianMin;
272 if (zPolyTMax < zTrianMax) zPolyTMax = zTrianMax;
273 }
274 TD++;
275 }
276 nxMin = (Standard_Integer)((DecaX + xPolyTMin) * SurDX);
277 nyMin = (Standard_Integer)((DecaY + yPolyTMin) * SurDY);
278 nzMin = (Standard_Integer)((DecaZ + zPolyTMin) * SurDZ);
279 nxMax = (Standard_Integer)((DecaX + xPolyTMax) * SurDX);
280 nyMax = (Standard_Integer)((DecaY + yPolyTMax) * SurDY);
281 nzMax = (Standard_Integer)((DecaZ + zPolyTMax) * SurDZ);
681f3919 282 PolyTIndices.Min = nyMin + (nxMin << 11);
283 PolyTIndices.Min <<= 10;
284 PolyTIndices.Min += nzMin - 0x00000200;
285 PolyTIndices.Max = nyMax + (nxMax << 11);
286 PolyTIndices.Max <<= 10;
287 PolyTIndices.Max += nzMax;
7fd59977 288 if (xShellMin > xPolyTMin) xShellMin = xPolyTMin;
289 if (xShellMax < xPolyTMax) xShellMax = xPolyTMax;
290 if (yShellMin > yPolyTMin) yShellMin = yPolyTMin;
291 if (yShellMax < yPolyTMax) yShellMax = yPolyTMax;
292 if (zShellMin > zPolyTMin) zShellMin = zPolyTMin;
293 if (zShellMax < zPolyTMax) zShellMax = zPolyTMax;
294 }
295 pd++;
296 }
297 if (nbFaHi > 0) {
298 nxMin = (Standard_Integer)((DecaX + xShellMin) * SurDX);
299 nyMin = (Standard_Integer)((DecaY + yShellMin) * SurDY);
300 nzMin = (Standard_Integer)((DecaZ + zShellMin) * SurDZ);
301 nxMax = (Standard_Integer)((DecaX + xShellMax) * SurDX);
302 nyMax = (Standard_Integer)((DecaY + yShellMax) * SurDY);
303 nzMax = (Standard_Integer)((DecaZ + zShellMax) * SurDZ);
681f3919 304 aShellIndices.Min = nyMin + (nxMin << 11);
305 aShellIndices.Min <<= 10;
306 aShellIndices.Min += nzMin - 0x00000200;
307 aShellIndices.Max = nyMax + (nxMax << 11);
308 aShellIndices.Max <<= 10;
309 aShellIndices.Max += nzMax;
7fd59977 310 (*psd2)->UpdateHiding(nbFaHi);
311 TColStd_Array1OfTransient& PolHi = (*psd2)->HidingPolyData();
312 pd = (Handle(HLRAlgo_PolyData)*)&(Polyg.ChangeValue(1));
313 Handle(HLRAlgo_PolyData)* phd =
314 (Handle(HLRAlgo_PolyData)*)&(PolHi.ChangeValue(1));
315
316 for (j = 1; j <= nbFace; j++) {
317 if ((*pd)->Hiding()) {
318 *phd = *pd;
319 phd++;
320 }
321 pd++;
322 }
323 }
324 else {
325 (*psd2)->UpdateHiding(0);
681f3919 326 aShellIndices.Min = 0;
327 aShellIndices.Max = 0;
7fd59977 328 }
329 psd2++;
330 }
331}
332
333//=======================================================================
334//function : NextHide
335//purpose :
336//=======================================================================
337
338void HLRAlgo_PolyAlgo::NextHide ()
339{
340 myFound = Standard_False;
341 if (myCurShell != 0) {
342 mySegListIt.Next();
343 if (mySegListIt.More()) myFound = Standard_True;
344 }
345 if (!myFound) {
346 myCurShell++;
347
348//POP ADN pour que cela marche sur WNT
349// while (myCurShell <= myNbrShell && !myFound) {
350// mySegListIt.Initialize((*(Handle(HLRAlgo_PolyShellData)*)&
351// (myHShell->ChangeValue(myCurShell)))
352// ->Edges());
353 while (myCurShell <= myNbrShell && !myFound) {
354 Handle(HLRAlgo_PolyShellData) data =
355 Handle(HLRAlgo_PolyShellData)::DownCast(myHShell->Value(myCurShell));
356 mySegListIt.Initialize(data->Edges());
357 if (mySegListIt.More()) myFound = Standard_True;
358 else myCurShell++;
359 }
360 }
361}
362
363//=======================================================================
364//function : Hide
365//purpose :
366//=======================================================================
367
681f3919 368HLRAlgo_BiPoint::PointsT& HLRAlgo_PolyAlgo::Hide (
7fd59977 369 HLRAlgo_EdgeStatus& status,
370 Standard_Integer& Index,
371 Standard_Boolean& reg1,
372 Standard_Boolean& regn,
373 Standard_Boolean& outl,
374 Standard_Boolean& intl)
375{
376 HLRAlgo_BiPoint& BP = mySegListIt.Value();
681f3919 377 HLRAlgo_BiPoint::PointsT& aPoints = BP.Points();
378 HLRAlgo_BiPoint::IndicesT& theIndices = BP.Indices();
379 status = HLRAlgo_EdgeStatus(0.,(Standard_ShortReal)myTriangle.TolParam,1.,(Standard_ShortReal)myTriangle.TolParam);
380 Index = theIndices.ShapeIndex;
7fd59977 381 reg1 = BP.Rg1Line();
382 regn = BP.RgNLine();
383 outl = BP.OutLine();
384 intl = BP.IntLine();
385 if (BP.Hidden())
386 status.HideAll();
387 else {
388 Standard_Boolean HidingShell;
389 TColStd_Array1OfTransient& Shell = myHShell->ChangeArray1();
390 Handle(HLRAlgo_PolyShellData)* psd =
391 (Handle(HLRAlgo_PolyShellData)*)&(Shell.ChangeValue(1));
392
393 for (Standard_Integer s = 1; s <= myNbrShell; s++) {
394 if ((*psd)->Hiding()) {
681f3919 395 HLRAlgo_PolyShellData::ShellIndices& aShellIndices = (*psd)->Indices();
396 if (((aShellIndices.Max - theIndices.MinSeg) & 0x80100200) == 0 &&
397 ((theIndices.MaxSeg - aShellIndices.Min) & 0x80100000) == 0) {
7fd59977 398 HidingShell = (s == myCurShell);
399 TColStd_Array1OfTransient& Face = (*psd)->HidingPolyData();
400 Standard_Integer nbFace = Face.Upper();
401 Handle(HLRAlgo_PolyData)* pd =
402 (Handle(HLRAlgo_PolyData)*)&(Face.ChangeValue(1));
403
404 for (Standard_Integer f = 1; f <= nbFace; f++) {
681f3919 405 (*pd)->HideByPolyData(aPoints,
406 myTriangle,
407 theIndices,
7fd59977 408 HidingShell,
409 status);
410 pd++;
411 }
412 }
413 }
414 psd++;
415 }
416 }
681f3919 417 return aPoints;
7fd59977 418}
419
420//=======================================================================
421//function : NextShow
422//purpose :
423//=======================================================================
424
425void HLRAlgo_PolyAlgo::NextShow ()
426{
427 myFound = Standard_False;
428 if (myCurShell != 0) {
429 mySegListIt.Next();
430 if (mySegListIt.More()) myFound = Standard_True;
431 }
432 if (!myFound) {
433 myCurShell++;
434
435 while (myCurShell <= myNbrShell && !myFound) {
436 mySegListIt.Initialize((*(Handle(HLRAlgo_PolyShellData)*)&
437 (myHShell->ChangeValue(myCurShell)))
438 ->Edges());
439 if (mySegListIt.More()) myFound = Standard_True;
440 else myCurShell++;
441 }
442 }
443}
444
445//=======================================================================
446//function : Show
447//purpose :
448//=======================================================================
449
681f3919 450HLRAlgo_BiPoint::PointsT& HLRAlgo_PolyAlgo::Show (
7fd59977 451 Standard_Integer& Index,
452 Standard_Boolean& reg1,
453 Standard_Boolean& regn,
454 Standard_Boolean& outl,
455 Standard_Boolean& intl)
456{
457 HLRAlgo_BiPoint& BP = mySegListIt.Value();
681f3919 458 HLRAlgo_BiPoint::IndicesT& theIndices = BP.Indices();
459 HLRAlgo_BiPoint::PointsT& aPoints = BP.Points();
460 Index = theIndices.ShapeIndex;
7fd59977 461 reg1 = BP.Rg1Line();
462 regn = BP.RgNLine();
463 outl = BP.OutLine();
464 intl = BP.IntLine();
681f3919 465 return aPoints;
7fd59977 466}
467