b08756a3ecba86eed706c7bccd77017cab347f01
[occt.git] / src / BndLib / BndLib_Compute.gxx
1 #include <Precision.hxx>
2 #include <Standard_Failure.hxx>
3
4 void Compute(const Standard_Real P1,
5              const Standard_Real P2,
6              const Standard_Real Ra,
7              const Standard_Real Rb,
8              const Coord& Xd,
9              const Coord& Yd,
10              const Coord& O,
11              Bound& B) {
12
13   Standard_Real Teta1;
14   Standard_Real Teta2;
15   if (P2<P1) { 
16     Teta1 = P2;
17     Teta2 = P1;
18   }
19   else {
20     Teta1 = P1;
21     Teta2 = P2;
22   }
23   Standard_Real Delta =Abs(Teta2-Teta1); 
24
25   if (Delta > 2. * PI) {
26     Teta1 = 0.;
27     Teta2 = 2. * PI;
28   }
29   else {
30  
31     if (Teta1 < 0.) {
32       do { Teta1+=2.*PI;} while (Teta1< 0.);
33     }
34     else if (Teta1> 2.*PI) {
35       do { Teta1-=2.*PI;} while (Teta1> 2.*PI);
36     }
37     Teta2 = Teta1 + Delta;
38
39   }
40
41 // One places already both ends
42   Standard_Real Cn1,Sn1,Cn2,Sn2;
43   Cn1 = Cos(Teta1); Sn1 = Sin(Teta1);
44   Cn2 = Cos(Teta2); Sn2 = Sin(Teta2);
45   B.Add(Point(O +Ra*Cn1*Xd +Rb*Sn1*Yd));  
46   B.Add(Point(O +Ra*Cn2*Xd +Rb*Sn2*Yd));  
47   
48   Standard_Real Ram,Rbm;
49   if (Delta > PI/8.) {
50     // Main radiuses to take into account only 8 points (/cos(Pi/8.))
51     Ram=Ra/0.92387953251128674;
52     Rbm=Rb/0.92387953251128674;
53   }
54   else {
55     // Main radiuses to take into account the arrow
56     Standard_Real tc=cos(Delta/2);
57     Ram=Ra/tc;
58     Rbm=Rb/tc;
59   }
60   B.Add(Point(O +Ram*Cn1*Xd +Rbm*Sn1*Yd));  
61   B.Add(Point(O +Ram*Cn2*Xd +Rbm*Sn2*Yd));  
62   
63
64 // cos or sin PI/4.
65 #define PI4 0.70710678118654746
66
67 // 8 points of the polygon
68 #define addP0 B.Add(Point(O +Ram*Xd ))
69 #define addP1 B.Add(Point(O +Ram*PI4*Xd +Rbm*PI4*Yd))
70 #define addP2 B.Add(Point(O +Rbm*Yd))
71 #define addP3 B.Add(Point(O -Ram*PI4*Xd +Rbm*PI4*Yd))
72 #define addP4 B.Add(Point(O -Ram*Xd ))
73 #define addP5 B.Add(Point(O -Ram*PI4*Xd -Rbm*PI4*Yd))
74 #define addP6 B.Add(Point(O -Rbm*Yd)); 
75 #define addP7 B.Add(Point(O +Ram*PI4*Xd -Rbm*PI4*Yd))
76
77   Standard_Integer deb = (Standard_Integer )( Teta1/(PI/4.));
78   Standard_Integer fin = (Standard_Integer )( Teta2/(PI/4.));
79   deb++;
80
81   if (deb>fin) return;
82
83   switch (deb) {
84   case 1 : 
85     {
86       addP1;
87       if (fin <= 1) break;
88     }
89   case 2 :  
90     {
91       addP2;
92       if (fin <= 2) break;
93     }
94   case 3 :  
95     {
96       addP3;
97       if (fin <= 3) break;
98     }
99   case 4 :  
100     {
101       addP4;
102       if (fin <= 4) break;
103     }
104   case 5 :  
105     {
106       addP5;
107       if (fin <= 5) break;
108     }
109   case 6 :  
110     {
111       addP6;
112       if (fin <= 6) break;
113     }
114   case 7 :  
115     {
116       addP7;
117       if (fin <= 7) break;
118     }
119   case 8 :  
120     {
121       addP0;
122       if (fin <= 8) break;
123     }
124   case 9 :  
125     {
126       addP1;
127       if (fin <= 9) break;
128     }  
129   case 10 :  
130     {
131       addP2;
132       if (fin <= 10) break;
133     }
134   case 11:  
135     {
136       addP3;
137       if (fin <= 11) break;
138     }  
139   case 12:  
140     {
141       addP4;
142       if (fin <= 12) break;
143     }  
144   case 13:  
145     {
146       addP5;
147       if (fin <= 13) break;
148     }
149   case 14:  
150     {
151       addP6;
152       if (fin <= 14) break;
153     }
154   case 15:  
155     {
156       addP7;
157       if (fin <= 15) break;
158     }
159   }
160 }
161