0022792: Globally defined symbol PI conflicts with VTK definition (Intel compiler)
[occt.git] / src / IntImpParGen / IntImpParGen.cxx
1 // File:        IntImpParGen_Tool.hxx
2 // Created:     Wed Jun 10 15:04:00 1992
3 // Author:      Laurent BUCHARD
4 //              <lbr@sdsun2>
5
6
7
8 #include <IntImpParGen.ixx>
9 #include <IntRes2d_Domain.hxx>
10 #include <IntRes2d_Position.hxx>
11 #include <IntRes2d_Transition.hxx>
12 #include <gp_Vec2d.hxx>
13 #include <gp_Pnt2d.hxx>
14
15
16
17
18 #include <IntImpParGen_Tool.hxx>
19 #include <gp.hxx>
20
21
22 #define TOLERANCE_ANGULAIRE     0.00000001
23 #define DERIVEE_PREMIERE_NULLE  0.000000000001
24 //----------------------------------------------------------------------
25 Standard_Real IntImpParGen::NormalizeOnDomain(Standard_Real& Param,
26                                               const IntRes2d_Domain& TheDomain) {
27   Standard_Real modParam = Param;
28   if(TheDomain.IsClosed()) {
29     Standard_Real Periode,t;
30     TheDomain.EquivalentParameters(t,Periode);
31     Periode-=t;
32     while(   modParam<TheDomain.FirstParameter()
33           && modParam+Periode < TheDomain.LastParameter()) {
34       modParam+=Periode;
35     }
36     while(   modParam>TheDomain.LastParameter()
37           && modParam-Periode > TheDomain.FirstParameter()) {
38       modParam-=Periode;
39     }
40   }  
41   return(modParam);
42 }
43 //----------------------------------------------------------------------
44 void IntImpParGen::DeterminePosition(IntRes2d_Position& Pos1,
45                                      const IntRes2d_Domain& TheDomain,
46                                      const gp_Pnt2d& Pnt1,
47                                      const Standard_Real Param1) {
48   
49   Pos1=IntRes2d_Middle;
50
51   if(TheDomain.HasFirstPoint()) { 
52     if(Pnt1.Distance(TheDomain.FirstPoint()) 
53        <= TheDomain.FirstTolerance()) {
54       Pos1=IntRes2d_Head;       
55     }
56   }
57    
58   if(TheDomain.HasLastPoint()) {
59     if(Pnt1.Distance(TheDomain.LastPoint()) 
60        <= TheDomain.LastTolerance()) {
61       if(Pos1==IntRes2d_Head) {
62         if(Abs(Param1-TheDomain.LastParameter())
63            < Abs(Param1-TheDomain.FirstParameter()))
64           Pos1=IntRes2d_End;    
65       }
66       else {
67         Pos1=IntRes2d_End; 
68       }
69     } 
70   }
71 }   
72 //----------------------------------------------------------------------
73 void IntImpParGen::DetermineTransition(const IntRes2d_Position    Pos1,
74                                        gp_Vec2d&                  Tan1,
75                                        const gp_Vec2d&            Norm1,
76                                        IntRes2d_Transition&       T1,
77                                        const IntRes2d_Position    Pos2,
78                                        gp_Vec2d&                  Tan2,
79                                        const gp_Vec2d&            Norm2,
80                                        IntRes2d_Transition&       T2,
81                                        const Standard_Real        ) {
82   
83   Standard_Boolean courbure1=Standard_True;
84   Standard_Boolean courbure2=Standard_True;
85   Standard_Boolean decide=Standard_True;
86       
87   T1.SetPosition(Pos1);
88   T2.SetPosition(Pos2);
89
90
91   if (Tan1.SquareMagnitude()<=DERIVEE_PREMIERE_NULLE) {
92     Tan1=Norm1;
93     courbure1=Standard_False;
94     if (Tan1.SquareMagnitude()<=DERIVEE_PREMIERE_NULLE) {    // transition undecided
95       decide=Standard_False;
96     }
97   }
98   
99   if (Tan2.SquareMagnitude()<=DERIVEE_PREMIERE_NULLE) {
100     Tan2=Norm2;
101     courbure2=Standard_False;
102     if (Tan2.SquareMagnitude()<=DERIVEE_PREMIERE_NULLE) {    // transition undecided
103       decide=Standard_False;
104     }
105   }
106   
107   if (!decide) {
108     T1.SetValue(Pos1);
109     T2.SetValue(Pos2);
110   }
111   else {
112     Standard_Real sgn=Tan1.Crossed(Tan2);
113     Standard_Real norm=Tan1.Magnitude()*Tan2.Magnitude();
114
115     if (Abs(sgn)<=TOLERANCE_ANGULAIRE*norm) {   // Transition TOUCH #########
116       Standard_Boolean opos=(Tan1.Dot(Tan2))<0;
117       if (!(courbure1||courbure2)) {
118         T1.SetValue(Standard_True,Pos1,IntRes2d_Unknown,opos);
119         T2.SetValue(Standard_True,Pos2,IntRes2d_Unknown,opos);
120       }
121       else {
122         gp_Vec2d Norm;
123         Tan1.Normalized();
124         Norm.SetCoord(-Tan1.Y(),Tan1.X());
125         Standard_Real Val1,Val2;
126         if (!courbure1) {
127           Val1=0.0;
128         }
129         else {
130           Val1=Norm.Dot(Norm1);
131         }
132         if (!courbure2) {
133           Val2=0.0;
134         }
135         else {
136           Val2=Norm.Dot(Norm2);
137         }
138         
139         if (Abs(Val1-Val2) <= TOLERANCE_ANGULAIRE) {
140           T1.SetValue(Standard_True,Pos1,IntRes2d_Unknown,opos);
141           T2.SetValue(Standard_True,Pos2,IntRes2d_Unknown,opos);
142         }
143         else if (Val2 > Val1) {
144           T2.SetValue(Standard_True,Pos2,IntRes2d_Inside,opos);
145           if (opos) {
146             T1.SetValue(Standard_True,Pos1,IntRes2d_Inside,opos);
147           }
148           else {
149             T1.SetValue(Standard_True,Pos1,IntRes2d_Outside,opos);
150           }
151         }
152         else {         // Val1 > Val2
153           T2.SetValue(Standard_True,Pos2,IntRes2d_Outside,opos);
154           if (opos) {
155             T1.SetValue(Standard_True,Pos1,IntRes2d_Outside,opos);
156           }
157           else {
158             T1.SetValue(Standard_True,Pos1,IntRes2d_Inside,opos);
159           }
160         }
161       }
162     }
163     else if (sgn<0) {
164       T1.SetValue(Standard_False,Pos1,IntRes2d_In);
165       T2.SetValue(Standard_False,Pos2,IntRes2d_Out);
166     }
167     else {     // sgn>0
168       T1.SetValue(Standard_False,Pos1,IntRes2d_Out);
169       T2.SetValue(Standard_False,Pos2,IntRes2d_In);
170     }
171   }
172 }
173
174 //----------------------------------------------------------------------
175 Standard_Boolean  IntImpParGen::DetermineTransition(const IntRes2d_Position    Pos1,
176                                                     gp_Vec2d&                  Tan1,
177                                                     IntRes2d_Transition&       T1,
178                                                     const IntRes2d_Position    Pos2,
179                                                     gp_Vec2d&                  Tan2,
180                                                     IntRes2d_Transition&       T2,
181                                                     const Standard_Real        ) {
182
183   T1.SetPosition(Pos1);
184   T2.SetPosition(Pos2);
185
186   Standard_Real Tan1Magnitude = Tan1.Magnitude();
187   if (Tan1Magnitude<=DERIVEE_PREMIERE_NULLE) {
188     return(Standard_False);
189   }
190
191   Standard_Real Tan2Magnitude = Tan2.Magnitude();  
192   if (Tan2Magnitude<=DERIVEE_PREMIERE_NULLE) {
193     return(Standard_False);
194   }
195
196   Standard_Real sgn=Tan1.Crossed(Tan2);
197   Standard_Real norm=Tan1Magnitude*Tan2Magnitude;
198   
199   if (Abs(sgn)<=TOLERANCE_ANGULAIRE*norm) {   // Transition TOUCH #########
200     return(Standard_False);
201   }
202   else if (sgn<0) {
203     T1.SetValue(Standard_False,Pos1,IntRes2d_In);
204     T2.SetValue(Standard_False,Pos2,IntRes2d_Out);
205   }
206   else {     // sgn>0
207     T1.SetValue(Standard_False,Pos1,IntRes2d_Out);
208     T2.SetValue(Standard_False,Pos2,IntRes2d_In);
209   }
210   return(Standard_True);
211 }
212
213
214
215
216
217
218
219
220