0022550: Fixing data races
[occt.git] / src / Intf / Intf_InterferencePolygon3d.gxx
CommitLineData
7fd59977 1// File: Intf_InterferencePolygon3d.gxx
2// Created: Fri Oct 9 10:28:57 1992
3// Author: Didier PIFFAULT
4// <dpf@sdsun1>
5
6#include <gp_Pnt.hxx>
7#include <gp_Vec.hxx>
8#include <Intf_SectionPoint.hxx>
9#include <Intf_SeqOfSectionPoint.hxx>
10#include <Intf_SectionLine.hxx>
11#include <Intf_SeqOfSectionLine.hxx>
12#include <Intf_SeqOfTangentZone.hxx>
13#include <Intf_TangentZone.hxx>
14
15//=======================================================================
16//function : Intf_InterferencePolygon3d
17//purpose : Empty constructor.
18//=======================================================================
19
20Intf_InterferencePolygon3d::Intf_InterferencePolygon3d()
41194117
K
21: Intf_Interference (Standard_False),
22 IndexMin (0),
23 iObje1 (0),
24 iObje2 (0),
25 beginOfNotClosedFirst (Standard_True),
26 beginOfNotClosedSecon (Standard_True)
7fd59977 27{}
28
29//=======================================================================
30//function : Intf_InterferencePolygon3d
31//purpose : Constructor of the interference beetween two Polygon.
32//=======================================================================
33
7fd59977 34Intf_InterferencePolygon3d::Intf_InterferencePolygon3d
35 (const Polygon3d1& Obje1, const Polygon3d2& Obje2)
41194117
K
36: Intf_Interference (Standard_False),
37 IndexMin (0),
38 iObje1 (0),
39 iObje2 (0),
40 beginOfNotClosedFirst (Standard_True),
41 beginOfNotClosedSecon (Standard_True)
7fd59977 42{
43 Tolerance=ToolPolygon3d1::DeflectionOverEstimation(Obje1)+
44 ToolPolygon3d2::DeflectionOverEstimation(Obje2);
45 if (Tolerance<=0.) Tolerance=Epsilon(1000.);
46 Interference(Obje1, Obje2);
47}
48
49
50//=======================================================================
51//function : Intf_InterferencePolygon3d
52//purpose : Constructor of the auto interference of a Polygon.
53//=======================================================================
54
55Intf_InterferencePolygon3d::Intf_InterferencePolygon3d
56 (const Polygon3d1& Obje)
41194117
K
57: Intf_Interference (Standard_True),
58 IndexMin(0),
59 iObje1 (0),
60 iObje2 (0),
61 beginOfNotClosedFirst (Standard_True),
62 beginOfNotClosedSecon (Standard_True)
7fd59977 63{
64 Tolerance=ToolPolygon3d1::DeflectionOverEstimation(Obje)*2;
65 Interference(Obje);
66}
67
68
69//=======================================================================
70//function : Perform
71//purpose :
72//=======================================================================
73
74void Intf_InterferencePolygon3d::Perform
75 (const Polygon3d1& Obje1, const Polygon3d2& Obje2)
76{
77 SelfInterference(Standard_False);
78 IndexMin=0;
79 Tolerance=ToolPolygon3d1::DeflectionOverEstimation(Obje1)+
80 ToolPolygon3d2::DeflectionOverEstimation(Obje2);
81 if (Tolerance<=0.) Tolerance=Epsilon(1000.);
82 Interference(Obje1, Obje2);
83}
84
85
86//=======================================================================
87//function : Perform
88//purpose :
89//=======================================================================
90
91void Intf_InterferencePolygon3d::Perform
92 (const Polygon3d1& Obje)
93{
94 SelfInterference(Standard_True);
95 IndexMin=0;
96 Tolerance=ToolPolygon3d1::DeflectionOverEstimation(Obje)*2;
97 Interference(Obje);
98}
99
100//--------------------------------------------------------
101// Return the number of singularity in the interference.
102//--------------------------------------------------------
103Standard_Integer Intf_InterferencePolygon3d::NbResults () const
104{
105 return mySLines.Length();
106}
107
108//----------------------------------------------------------
109// Give the result of range Index in the interference.
110//----------------------------------------------------------
111const Intf_SectionLine& Intf_InterferencePolygon3d::ResultLine
112 (const Standard_Integer Index) const
113{
114 return mySLines(Index);
115}
116
117//=======================================================================
118//function : ResultValue
119//purpose : give the distance beetween the two polygons for this result.
120//=======================================================================
121
122Standard_Real Intf_InterferencePolygon3d::ResultValue
123 (const Standard_Integer Index) const
124{
125 return mySLines(Index).GetPoint(1).Pnt().Distance
126 (mySLines(Index).GetPoint(2).Pnt());
127}
128
129//=======================================================================
130//function : MinimalDistance
131//purpose :
132//=======================================================================
133
134Standard_Real Intf_InterferencePolygon3d::MinimalDistance () const
135{
136 return MinimalDist;
137}
138
139
140//=======================================================================
141//function : MinimalResult
142//purpose : give the result of minimal distance.
143//=======================================================================
144
145Standard_Integer Intf_InterferencePolygon3d::MinimalResult () const
146{
147 return IndexMin;
148}
149
150//=======================================================================
151//function : Interference
152//purpose :
153//=======================================================================
154
7fd59977 155void Intf_InterferencePolygon3d::Interference
156 (const Polygon3d1& Obje1,
157 const Polygon3d2& Obje2)
158{
159 beginOfNotClosedFirst=!ToolPolygon3d1::Closed(Obje1);
160 for (iObje1=1; iObje1<=ToolPolygon3d1::NbSegments(Obje1); iObje1++) {
161 beginOfNotClosedSecon=!ToolPolygon3d2::Closed(Obje2);
162 for (iObje2=1; iObje2<=ToolPolygon3d2::NbSegments(Obje2); iObje2++) {
163
164 CommonPerpen(ToolPolygon3d1::BeginOfSeg(Obje1, iObje1),
165 ToolPolygon3d1::EndOfSeg(Obje1, iObje1),
166 ToolPolygon3d2::BeginOfSeg(Obje2, iObje2),
167 ToolPolygon3d2::EndOfSeg(Obje2, iObje2));
168
169 Projections(ToolPolygon3d1::BeginOfSeg(Obje1, iObje1),
170 ToolPolygon3d1::EndOfSeg(Obje1, iObje1),
171 ToolPolygon3d2::BeginOfSeg(Obje2, iObje2),
172 ToolPolygon3d2::EndOfSeg(Obje2, iObje2));
173
174 beginOfNotClosedSecon=Standard_False;
175 }
176 beginOfNotClosedFirst=Standard_False;
177 }
178}
179
180//=======================================================================
181//function : Interference
182//purpose :
183//=======================================================================
184
185void Intf_InterferencePolygon3d::Interference
186 (const Polygon3d1& Obje)
187{
188 beginOfNotClosedFirst=!ToolPolygon3d1::Closed(Obje);
189 beginOfNotClosedSecon=Standard_False;
190 for (iObje1=1; iObje1<=ToolPolygon3d1::NbSegments(Obje); iObje1++) {
191 for (iObje2=iObje1+1; iObje2<=ToolPolygon3d1::NbSegments(Obje); iObje2++) {
192
193 CommonPerpen(ToolPolygon3d1::BeginOfSeg(Obje, iObje1),
194 ToolPolygon3d1::EndOfSeg(Obje, iObje1),
195 ToolPolygon3d1::BeginOfSeg(Obje, iObje2),
196 ToolPolygon3d1::EndOfSeg(Obje, iObje2));
197
198 Projections(ToolPolygon3d1::BeginOfSeg(Obje, iObje1),
199 ToolPolygon3d1::EndOfSeg(Obje, iObje1),
200 ToolPolygon3d1::BeginOfSeg(Obje, iObje2),
201 ToolPolygon3d1::EndOfSeg(Obje, iObje2));
202
203 }
204 beginOfNotClosedFirst=Standard_False;
205 }
206}
207
208
209
210//=======================================================================
211//function : CommonPerpen
212//purpose :
213//=======================================================================
214
215void Intf_InterferencePolygon3d::CommonPerpen
216 (const gp_Pnt& BegO, const gp_Pnt& EndO,
217 const gp_Pnt& BegT, const gp_Pnt& EndT)
218{
219 gp_XYZ segT=EndT.XYZ()-BegT.XYZ();
220 gp_XYZ segO=EndO.XYZ()-BegO.XYZ();
221 gp_XYZ refPlane=segT^segO;
222 Standard_Real lgsO=Sqrt(segT*segT);
223 Standard_Real lgsT=Sqrt(segO*segO);
224
225 if (lgsO<=Tolerance || lgsT<=Tolerance) {
226 // Un des segments n a pas une longueur significative
227 }
228 else if (refPlane.Modulus()<Tolerance) {
229 // Les deux segments sont paralleles
230 }
231 else {
232 // Les deux segments ne sont pas parralleles
233 Standard_Real distOP=(BegT.XYZ()*refPlane)/refPlane.Modulus();
234 Standard_Real distTP=(BegO.XYZ()*refPlane)/refPlane.Modulus();
235 Standard_Real lgPC=distOP-distTP;
236
237 if (Abs(lgPC)< Tolerance) {
238 // Les deux segments sont dans le meme plan
239 }
240 else {
241 // Les deux segments ne sont pas dans le meme plan
242
243 gp_XYZ pO=refPlane^segO; // Plan contenant segO normal a refPlane
244 pO.Normalize();
245 Standard_Real dpO=pO*BegO.XYZ();
246
247 Standard_Real distBegTpO=(pO*BegT.XYZ())-dpO;
248 Standard_Real distEndTpO=(pO*EndT.XYZ())-dpO;
249 Standard_Real parT=-1.;
250
251 if (distBegTpO*distEndTpO<0.)
252 parT=distBegTpO/(distBegTpO-distEndTpO);
253 else if (Abs(distBegTpO)<=Tolerance)
254 parT=0.;
255 else if (Abs(distEndTpO)<=Tolerance)
256 parT=1.;
257
258 if (parT>=0.) {
259 gp_XYZ pT=refPlane^segT; // Plan contenant segT normal a refPlane
260 pT.Normalize();
261 Standard_Real dpT=pT*BegT.XYZ();
262
263 Standard_Real distBegOpT=(pT*BegO.XYZ())-dpT;
264 Standard_Real distEndOpT=(pT*EndO.XYZ())-dpT;
265 Standard_Real parO=-1.;
266
267 if (distBegOpT*distEndOpT<0.)
268 parO=distBegOpT/(distBegOpT-distEndOpT);
269 else if (Abs(distBegOpT)<=Tolerance)
270 parO=0.;
271 else if (Abs(distEndOpT)<=Tolerance)
272 parO=1.;
273
274 if (parO>=0.) {
275 // Il y a une perpendiculaire commune interessante
276 Intf_SectionLine PC;
277 PC.Append(Intf_SectionPoint
278 (BegO.Translated(gp_Vec(segO*parO)),
279 Intf_EDGE, iObje1, 0, parO,
280 Intf_EXTERNAL, 0, 0, 0., 0));
281 PC.Append(Intf_SectionPoint
282 (BegT.Translated(gp_Vec(segT*parT)),
283 Intf_EXTERNAL, 0, 0, 0.,
284 Intf_EDGE, iObje2, 0, parT, 0.));
285 mySLines.Append(PC);
286 Standard_Real dist=PC.GetPoint(1).Pnt().Distance
287 (PC.GetPoint(2).Pnt());
288 if (dist< MinimalDist) {
289 MinimalDist=dist;
290 IndexMin=mySLines.Length();
291 }
292 }
293 }
294 }
295 }
296}
297
298//=======================================================================
299//function : Projections
300//purpose :
301//=======================================================================
302
303void Intf_InterferencePolygon3d::Projections
304 (const gp_Pnt& BegO, const gp_Pnt& EndO,
305 const gp_Pnt& BegT, const gp_Pnt& EndT)
306{
307}
308
309// EOF File: Intf_InterferencePolygon3d.gxx