source: Sophya/trunk/SophyaLib/Samba/circle.cc@ 396

Last change on this file since 396 was 262, checked in by ansari, 26 years ago

Ajout de fichiers de calcul de geometrie Vector3d, UnitVector, Circle, de Benoit Revenu Reza 23/04/99

File size: 4.9 KB
Line 
1#include <math.h>
2#include "circle.h"
3
4Circle::Circle()
5{
6 UnitVector temp;
7 SetCircle(temp,M_PI/2.);
8}
9
10Circle::Circle(double theta, double phi, double aperture)
11{
12 UnitVector temp(theta,phi);
13 SetCircle(temp,aperture);
14}
15
16Circle::Circle(double x, double y, double z, double aperture)
17{
18 UnitVector temp(x,y,z);
19 SetCircle(temp,aperture);
20}
21
22Circle::Circle(const Vector3d& v, double aperture)
23{
24 UnitVector temp=v;
25 SetCircle(temp,aperture);
26}
27
28Circle::Circle(const Circle& c)
29{
30 UnitVector temp=c.Omega();
31 SetCircle(temp,c._angouv);
32}
33
34void Circle::SetCircle(const UnitVector& temp, double aperture)
35{
36 _spinunitaxis=temp;
37 _angouv=aperture;
38 _spinaxis=_spinunitaxis*fabs(cos(_angouv));
39 _theta=_spinunitaxis.Theta();
40 _phi=_spinunitaxis.Phi();
41 _x=_spinunitaxis.X();
42 _y=_spinunitaxis.Y();
43 _z=_spinunitaxis.Z();
44}
45
46void Circle::SetSpinAxis(double theta, double phi)
47{
48 UnitVector temp(theta,phi);
49 SetCircle(temp,_angouv);
50}
51
52void Circle::SetSpinAxis(const Vector3d& u)
53{
54 UnitVector temp=u;
55 SetCircle(temp,_angouv);
56}
57
58void Circle::SetSpinAxis(double x, double y, double z)
59{
60 UnitVector temp(x,y,z);
61 SetCircle(temp,_angouv);
62}
63
64void Circle::SetApertureAngle(double aperture)
65{
66 SetCircle(_spinunitaxis,aperture);
67}
68
69void Circle::SetApertureAngle(const Circle& c)
70{
71 SetCircle(_spinunitaxis,c._angouv);
72}
73
74bool Circle::Intersection(const Circle& c, double* psi) const
75{
76 double alphak=_angouv;
77 double alphal=c._angouv;
78 Vector3d ok=_spinaxis;
79 Vector3d ol=c._spinaxis;
80 double gamma=ok.SepAngle(ol);
81 if( fabs(alphak-alphal) < gamma && gamma <= (alphak+alphal) && this != &c )
82 {
83 // then the 2 circles intersect
84 double sg=sin(gamma),cg=cos(gamma);
85 double sak=sin(alphak),cak=cos(alphak);
86 double sal=sin(alphal),cal=cos(alphal);
87 double st=sin(_theta),ct=cos(_theta);
88 double stc=sin(c._theta),ctc=cos(c._theta);
89 double dphi=_phi-c._phi;
90 double sdphi=sin(dphi),cdphi=cos(dphi);
91 double sinusk=stc*sdphi/sg,cosinusk=(ctc*st-stc*ct*cdphi)/sg;
92 double sinusl=-st*sdphi/sg,cosinusl=(ct*stc-st*ctc*cdphi)/sg;
93 double gammaik=scangle(sinusk,cosinusk);
94 double gammail=scangle(sinusl,cosinusl);
95 double omegak=acos((cal-cak*cg)/sg/sak);
96 double omegal=acos((cak-cal*cg)/sg/sal);
97 psi[0]=fmod(gammaik-omegak+pi2,pi2);
98 psi[1]=fmod(gammaik+omegak+pi2,pi2);
99 psi[2]=fmod(gammail-omegal+pi2,pi2);
100 psi[3]=fmod(gammail+omegal+pi2,pi2);
101 if( psi[0] > psi[1] )
102 {
103 // psi[0]=psi(i,j,0)
104 // psi[1]=psi(i,j,1)
105 // psi[2]=psi(j,i,0)
106 // psi[3]=psi(j,i,1)
107 swap(psi[0],psi[1]);
108 swap(psi[2],psi[3]);
109 }
110 return true;
111 }
112 else
113 {
114 psi[0] = -1.;
115 psi[1] = -1.;
116 psi[2] = -1.;
117 psi[3] = -1.;
118 return false;
119 }
120}
121
122UnitVector Circle::ConvCircleSphere(double psi) const
123{
124 psi=mod(psi,pi2);
125 double xout, yout, zout;
126 double cosa=cos(_angouv);
127 double sina=sin(_angouv);
128 double cost=cos(_theta);
129 double sint=sin(_theta);
130 double cosphi=cos(_phi);
131 double sinphi=sin(_phi);
132 double cosp=cos(psi);
133 double sinp=sin(psi);
134 xout = cosa*sint*cosphi+sina*(sinphi*sinp-cost*cosphi*cosp);
135 yout = cosa*sint*sinphi-sina*(cosphi*sinp+cost*sinphi*cosp);
136 zout = cosa*cost+sina*sint*cosp;
137 return UnitVector(xout,yout,zout);
138}
139
140UnitVector Circle::TanOnCircle(double psi) const
141{
142 psi=mod(psi,pi2);
143 double xout, yout, zout;
144 double cost=cos(_theta);
145 double sint=sin(_theta);
146 double cosphi=cos(_phi);
147 double sinphi=sin(_phi);
148 double cosp=cos(psi);
149 double sinp=sin(psi);
150 xout = cosp*sinphi+sinp*sint*cosphi;
151 yout = -cosp*cosphi+sinp*sint*sinphi;
152 zout = -sinp*cost;
153 return UnitVector(xout,yout,zout);
154}
155
156UnitVector Circle::EPhi(double psi) const
157{
158 psi=mod(psi,pi2);
159 return ConvCircleSphere(psi).EPhi();
160}
161
162UnitVector Circle::ETheta(double psi) const
163{
164 psi=mod(psi,pi2);
165 return ConvCircleSphere(psi).ETheta();
166}
167
168double Circle::SepAngleTanEPhi02PI(double psi) const
169{
170 psi=mod(psi,pi2);
171 UnitVector pol=this->TanOnCircle(psi);
172 UnitVector ephi=this->EPhi(psi);
173 double angle=pol.SepAngle(ephi);
174 if( pol.Z() <= 0 ) angle=pi2-angle;
175 return angle;
176}
177
178Circle& Circle::operator=(const Circle& c)
179{
180 if( this != &c )
181 {
182 UnitVector temp(c.Omega());
183 SetCircle(temp,c.ApertureAngle());
184 }
185 return *this;
186}
187
188bool Circle::operator==(const Circle& c) const
189{
190 bool flag;
191 if( this == &c ) flag=true;
192 else flag=false;
193 return flag;
194}
195
196bool Circle::operator!=(const Circle& c) const
197{
198 return (bool)(1-(this->operator==(c)));
199}
200
201void Circle::Print(ostream& os) const
202{
203 os << "1 - Circle - Axe de Spin Unitaire : " << _spinunitaxis << endl;
204 os << "1 - Circle - Axe de Spin : " << _spinaxis << endl;
205 os << "2 - Circle - Angle d'ouverture : " << _angouv << endl;
206 os << "3 - Circle - Theta,Phi : " << _theta << "," << _phi << endl;
207 os << "4 - Circle - x,y,z : " << _x << "," << _y << "," << _z << endl;
208}
Note: See TracBrowser for help on using the repository browser.