[228] | 1 | #ifndef UNITVEC_H_SEEN
|
---|
| 2 | #define UNIITVEC_H_SEEN
|
---|
| 3 |
|
---|
| 4 | #include <math.h>
|
---|
| 5 | #include <iostream.h>
|
---|
| 6 |
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 | // Classe pour faire des vecteurs normes x,y,z a partir de Teta,Phi
|
---|
| 10 | // et l inverse. On peut calculer le produit scalaire et les vecteurs
|
---|
| 11 | // perpendiculaires.
|
---|
| 12 | // Exemple:
|
---|
| 13 | // UnitVector u1(0.5, 0.7); // Vers Teta=0.5 Phi = 0.7 Rad.
|
---|
| 14 | // UnitVector u2(1.,2.,1.); // Vecteur norme parallele a (x=1., y=2., z=1.)
|
---|
| 15 | // u2.Teta(); // Direction teta de u2
|
---|
| 16 | // u1.psc(u2); // u1 prod. scalaire u2
|
---|
| 17 | // UnitVector vp1 = u2.vperp(); // Vecteur perpendiculaire a u1 , meme phi (ou a 180 deg)
|
---|
| 18 | // UnitVector vp2 = u2.vperp2(); // Vecteur perpendiculaire a u1 , a phi+90 deg
|
---|
| 19 |
|
---|
| 20 | //
|
---|
| 21 | class UnitVector {
|
---|
| 22 | public:
|
---|
| 23 | UnitVector(double teta=0., double phi=0.)
|
---|
| 24 | { set(teta, phi); }
|
---|
| 25 | UnitVector(double vx, double vy, double vz)
|
---|
| 26 | { setxyz(vx, vy, vz); }
|
---|
| 27 |
|
---|
| 28 | inline void set(double teta, double phi)
|
---|
| 29 | { t=teta; p=phi; z = cos(teta); x = sin(teta)*cos(phi); y = sin(teta)*sin(phi); }
|
---|
| 30 | inline void setxyz(double vx, double vy, double vz)
|
---|
| 31 | { double r = sqrt(vx*vx+vy*vy+vz*vz); x = vx/r; y = vy/r; z = vz/r;
|
---|
| 32 | t = acos(z); p = atan2(y,x); }
|
---|
| 33 |
|
---|
| 34 | inline double psc(UnitVector& u) { return(x*u.x+y*u.y+z*u.z); }
|
---|
| 35 |
|
---|
| 36 | inline double Teta() { return(t); }
|
---|
| 37 | inline double Phi() { return(p); }
|
---|
| 38 | inline double X() { return(x); }
|
---|
| 39 | inline double Y() { return(y); }
|
---|
| 40 | inline double Z() { return(z); }
|
---|
| 41 |
|
---|
| 42 | inline UnitVector vperp() {double tp, pp; pp = p;
|
---|
| 43 | tp = t+0.5*M_PI; if (tp > M_PI) { tp = tp-M_PI; pp += M_PI*0.5; }
|
---|
| 44 | return(UnitVector(tp, pp)); }
|
---|
| 45 | inline UnitVector vperp2() {double tp, pp; tp = M_PI*0.5; pp = p + 0.5*M_PI;
|
---|
| 46 | return(UnitVector(tp, pp)); }
|
---|
| 47 |
|
---|
| 48 | inline friend ostream& operator << (ostream& s, UnitVector const& u)
|
---|
| 49 | { s << "UnitVector: X,Y,Z= (" << u.x << "," << u.y << "," << u.z
|
---|
| 50 | << ") Teta,Phi= " << u.t << "," << u.p << endl ; return(s); }
|
---|
| 51 |
|
---|
| 52 | double x,y,z;
|
---|
| 53 | double t,p;
|
---|
| 54 | };
|
---|
| 55 |
|
---|
| 56 |
|
---|
| 57 | #endif
|
---|