[254] | 1 | #include "machdefs.h"
|
---|
[228] | 2 | #include <stdlib.h>
|
---|
| 3 | #include <stdio.h>
|
---|
[254] | 4 | #include <math.h>
|
---|
[228] | 5 |
|
---|
| 6 | #include "scan.h"
|
---|
| 7 |
|
---|
| 8 | // valeurs de Pi, 2*Pi, etc
|
---|
| 9 | #include "nbmath.h"
|
---|
| 10 |
|
---|
| 11 |
|
---|
| 12 | //
|
---|
| 13 | //++
|
---|
| 14 | // Class Scan
|
---|
| 15 | //
|
---|
| 16 | // include scan.h nbmath.h
|
---|
| 17 | //
|
---|
| 18 | // Cette classe permet de stocker et traiter les données pour un balayage
|
---|
| 19 | // d'une portion de ciel pour un jeu de valeurs fixé des paramètres précisé
|
---|
| 20 | // dans le constructeur.
|
---|
| 21 | //--
|
---|
| 22 | //++
|
---|
| 23 | //
|
---|
| 24 | // Links Parents
|
---|
| 25 | //
|
---|
| 26 | //
|
---|
| 27 | //--
|
---|
| 28 | //++
|
---|
| 29 | //
|
---|
| 30 | // Links Descendants
|
---|
| 31 | //
|
---|
| 32 | //
|
---|
| 33 | //--
|
---|
| 34 | //++
|
---|
| 35 | // Titre Constructeurs
|
---|
| 36 | //--
|
---|
| 37 | //++
|
---|
| 38 | Scan::Scan(float Ouv,float* Omega,float Fech,float T,
|
---|
| 39 | float t0=0., float phi0=0.)
|
---|
| 40 |
|
---|
| 41 | //
|
---|
| 42 | // * Ouv = angle d'ouverture (rad)
|
---|
| 43 | // * Omega[3] = direction de l'axe de rotation du satellite (teta,phi)
|
---|
| 44 | // et vitesse de rotation (rad/s)
|
---|
| 45 | // * Fech = fréquence d'échantillonnage (Hz)
|
---|
| 46 | // * T = temps total de prise des données (s)
|
---|
| 47 | // * t0 = instant de départ (s)
|
---|
| 48 | // * phi0 = offset antenne (rad)
|
---|
| 49 | //--
|
---|
| 50 | {
|
---|
| 51 | mInfo_=NULL;
|
---|
| 52 | // On memorise les arguments d'appel
|
---|
| 53 | Ouverture_= Ouv;
|
---|
| 54 | OmegaTeta_= Omega[0];
|
---|
| 55 | //
|
---|
| 56 | // je ne comprends pas ce qui se passe ci-apres (GLM)
|
---|
| 57 | if( (Omega[0]== 0.0) || (Omega[0]==(float)Pi) )
|
---|
| 58 | OmegaPhi_ = Omega[1];
|
---|
| 59 | else
|
---|
| 60 | OmegaPhi_ = Omega[1]+(float)Pi/2.;
|
---|
| 61 | OmegaRad_ = Omega[2];
|
---|
| 62 | FrequenceEch_ = Fech;
|
---|
| 63 | TempsFinal_ = T;
|
---|
| 64 | TempsInitial_ = t0;
|
---|
| 65 | PhiZero_ = phi0;
|
---|
| 66 |
|
---|
| 67 | float aux= 0.0;
|
---|
| 68 | // Nombre total de points
|
---|
| 69 | aux= (TempsFinal_-TempsInitial_)*FrequenceEch_;
|
---|
| 70 | NmaxPts_= (int_4)(aux);
|
---|
| 71 |
|
---|
| 72 | // Nombre total de tours
|
---|
| 73 | aux= OmegaRad_*(TempsFinal_-TempsInitial_)/(2.*Pi);
|
---|
| 74 | NmaxTrs_= (int_4)(aux);
|
---|
| 75 |
|
---|
| 76 | // Nombre de points par tour
|
---|
| 77 | aux= 2.*Pi*FrequenceEch_/OmegaRad_;
|
---|
| 78 | NPts1Tr_= (int_4)(aux);
|
---|
| 79 |
|
---|
| 80 | // Creation et initialisation du vecteur des mesures aux points
|
---|
| 81 | sPix_ = new r_8[NmaxPts_];
|
---|
| 82 | for( int_4 i=0; i<NmaxPts_; i++ ) sPix_[i]= 0.;
|
---|
| 83 |
|
---|
| 84 | // matrice de passage du systeme lie au satellite au systeme fixe
|
---|
| 85 |
|
---|
| 86 | Rota_[0]= cos((double)OmegaPhi_);
|
---|
| 87 | Rota_[1]= -sin((double)OmegaPhi_)*cos((double)OmegaTeta_);
|
---|
| 88 | Rota_[2]= sin((double)OmegaPhi_)*sin((double)OmegaTeta_);
|
---|
| 89 | Rota_[3]= sin((double)OmegaPhi_);
|
---|
| 90 | Rota_[4]= cos((double)OmegaPhi_)*cos((double)OmegaTeta_);
|
---|
| 91 | Rota_[5]= -cos((double)OmegaPhi_)*sin((double)OmegaTeta_);
|
---|
| 92 | Rota_[6]= 0.0;
|
---|
| 93 | Rota_[7]= sin((double)OmegaTeta_);
|
---|
| 94 | Rota_[8]= cos((double)OmegaTeta_);
|
---|
| 95 |
|
---|
| 96 |
|
---|
| 97 | // printf("%f %f %f \n",Rota_[0],Rota_[1],Rota_[2]);
|
---|
| 98 | // printf("%f %f %f \n",Rota_[3],Rota_[4],Rota_[5]);
|
---|
| 99 | // printf("%f %f %f \n",Rota_[6],Rota_[7],Rota_[8]);
|
---|
| 100 |
|
---|
| 101 | }
|
---|
| 102 | //++
|
---|
| 103 | Scan::Scan(const Scan& s)
|
---|
| 104 |
|
---|
| 105 | // Constructeur de copie
|
---|
| 106 | //--
|
---|
| 107 | {
|
---|
| 108 | NmaxPts_ = s. NmaxPts_;
|
---|
| 109 | Ouverture_ = s.Ouverture_;
|
---|
| 110 | OmegaTeta_ = s.OmegaTeta_;
|
---|
| 111 | OmegaPhi_ = s.OmegaPhi_;
|
---|
| 112 | OmegaRad_ = s.OmegaRad_;
|
---|
| 113 | FrequenceEch_ = s. FrequenceEch_;
|
---|
| 114 | TempsFinal_ = s.TempsFinal_;
|
---|
| 115 | TempsInitial_ = s.TempsInitial_;
|
---|
| 116 | PhiZero_ = s. PhiZero_;
|
---|
| 117 | sPix_=new r_8[ NmaxPts_];
|
---|
| 118 | for (int_4 k=0; k<NmaxPts_; k++) sPix_[k]=s.sPix_[k];
|
---|
| 119 | for (int k=0; k<9; k++) Rota_[k]=s. Rota_[k];
|
---|
| 120 | }
|
---|
| 121 | //++
|
---|
| 122 | // Titre Destructeur
|
---|
| 123 | //--
|
---|
| 124 | //++
|
---|
| 125 | Scan::~Scan()
|
---|
| 126 |
|
---|
| 127 | //
|
---|
| 128 | //--
|
---|
| 129 | {
|
---|
| 130 | delete[] sPix_ ;
|
---|
| 131 | }
|
---|
| 132 | //++
|
---|
| 133 | void Scan::WriteSelf(POutPersist& s) const
|
---|
| 134 |
|
---|
| 135 | // créer un fichier persistant
|
---|
| 136 | //--
|
---|
| 137 | {
|
---|
| 138 | char strg[256];
|
---|
| 139 | if (mInfo_) {sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f HasInfo", (float)OmegaTeta_, (float)OmegaPhi_, (float)OmegaRad_);
|
---|
| 140 | }
|
---|
| 141 | else {sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f ", (float)OmegaTeta_, (float)OmegaPhi_, (float)OmegaRad_);
|
---|
| 142 | }
|
---|
| 143 | s.PutLine(strg);
|
---|
| 144 | if (mInfo_) mInfo_->Write(s);
|
---|
| 145 | s.PutI4( NmaxPts_);
|
---|
| 146 | s.PutI4(NmaxTrs_);
|
---|
| 147 | s.PutI4( NPts1Tr_);
|
---|
| 148 | s.PutR4(Ouverture_);
|
---|
| 149 | s.PutR4(OmegaTeta_);
|
---|
| 150 | s.PutR4(OmegaPhi_);
|
---|
| 151 | s.PutR4(OmegaRad_);
|
---|
| 152 | s.PutR4(FrequenceEch_);
|
---|
| 153 | s.PutR4(TempsFinal_);
|
---|
| 154 | s.PutR4( TempsInitial_);
|
---|
| 155 | s.PutR4( PhiZero_);
|
---|
| 156 | s.PutR8s(sPix_,NmaxPts_);
|
---|
| 157 | s.PutR8s(Rota_, 9);
|
---|
| 158 | return;
|
---|
| 159 | }
|
---|
| 160 |
|
---|
| 161 |
|
---|
| 162 | //++
|
---|
| 163 | void Scan::ReadSelf(PInPersist& s)
|
---|
| 164 |
|
---|
| 165 | // relire un fichier persistant
|
---|
| 166 | //--
|
---|
| 167 | {
|
---|
| 168 | Clear();
|
---|
| 169 | char strg[256];
|
---|
| 170 | s.GetLine(strg,255);
|
---|
| 171 | // Pour savoir s'il y avait un DVList Info associe
|
---|
| 172 | bool hadinfo = false;
|
---|
| 173 | if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0) hadinfo = true;
|
---|
| 174 | // Pour savoir s'il y avait un DVList Info associe
|
---|
| 175 | if (hadinfo) { // Lecture eventuelle du DVList Info
|
---|
| 176 | if (mInfo_ == NULL) mInfo_ = new DVList;
|
---|
| 177 | mInfo_->Read(s);
|
---|
| 178 | }
|
---|
| 179 | s.GetI4( NmaxPts_);
|
---|
| 180 | s.GetI4(NmaxTrs_);
|
---|
| 181 | s.GetI4( NPts1Tr_);
|
---|
| 182 | s.GetR4(Ouverture_);
|
---|
| 183 | s.GetR4(OmegaTeta_);
|
---|
| 184 | s.GetR4(OmegaPhi_);
|
---|
| 185 | s.GetR4(OmegaRad_);
|
---|
| 186 | s.GetR4(FrequenceEch_);
|
---|
| 187 | s.GetR4(TempsFinal_);
|
---|
| 188 | s.GetR4( TempsInitial_);
|
---|
| 189 | s.GetR4( PhiZero_);
|
---|
| 190 | sPix_=new r_8[NmaxPts_];
|
---|
| 191 | s.GetR8s(sPix_,NmaxPts_);
|
---|
| 192 | s.GetR8s(Rota_, 9);
|
---|
| 193 | }
|
---|
| 194 |
|
---|
| 195 |
|
---|
| 196 | //++
|
---|
| 197 | // Titre Méthodes
|
---|
| 198 | //--
|
---|
| 199 |
|
---|
| 200 | //++
|
---|
| 201 | int_4 Scan::NbPoints() const
|
---|
| 202 |
|
---|
| 203 | // Retourne le nombre de Points du scan
|
---|
| 204 | //--
|
---|
| 205 | {
|
---|
| 206 | return(NmaxPts_);
|
---|
| 207 | }
|
---|
| 208 |
|
---|
| 209 | /* --Methode-- */
|
---|
| 210 | //++
|
---|
| 211 | int_4 Scan::NbTours() const
|
---|
| 212 |
|
---|
| 213 | // Retourne le nombre total de tours
|
---|
| 214 | //--
|
---|
| 215 | {
|
---|
| 216 | return(NmaxTrs_);
|
---|
| 217 | }
|
---|
| 218 |
|
---|
| 219 | /* --Methode-- */
|
---|
| 220 | //++
|
---|
| 221 | int_4 Scan::NbPts1Tr() const
|
---|
| 222 |
|
---|
| 223 | // Retourne le nombre de points pour 1 tour
|
---|
| 224 | //--
|
---|
| 225 | {
|
---|
| 226 | return(NPts1Tr_);
|
---|
| 227 | }
|
---|
| 228 |
|
---|
| 229 | /* --Methode-- */
|
---|
| 230 | //++
|
---|
| 231 | int_4 Scan::ValueIndex(float t) const
|
---|
| 232 |
|
---|
| 233 | // Retourne l'indice du pixel associé au temps t
|
---|
| 234 | //--
|
---|
| 235 | {
|
---|
| 236 | int_4 k;
|
---|
| 237 | float eps= 1.0E-06;
|
---|
| 238 |
|
---|
| 239 | // verification si t est dans [TempsInitial_,TempsFinal_]
|
---|
| 240 | if( (t< TempsInitial_) || (t> TempsFinal_) ) {
|
---|
| 241 | printf("\n ValueIndex:: probleme sur le temps t= %f",t);
|
---|
| 242 | return(-1);
|
---|
| 243 | }
|
---|
| 244 |
|
---|
| 245 | k= (int_4)((t-TempsInitial_)*FrequenceEch_+eps);
|
---|
| 246 | if ( (k< 0) || (k >= NmaxPts_) ) {
|
---|
| 247 | printf("\n ValueIndex:: probleme sur l'indice du point k= %d",k);
|
---|
| 248 | return(-1);
|
---|
| 249 | }
|
---|
| 250 | return(k);
|
---|
| 251 | }
|
---|
| 252 |
|
---|
| 253 | /* --Methode-- */
|
---|
| 254 | //++
|
---|
| 255 | void Scan::Direction(float t, float& teta , float& phi)
|
---|
| 256 |
|
---|
| 257 | // Retourne les coordonnées (teta,phi) du pixel lié au temps t
|
---|
| 258 | //--
|
---|
| 259 | {
|
---|
| 260 | r_8 alfa,xs,ys,zs,x,y,z;
|
---|
| 261 |
|
---|
| 262 | // coordonnees dans le systeme du satellite
|
---|
| 263 | alfa= OmegaRad_*(t-TempsInitial_)+PhiZero_;
|
---|
| 264 | xs = sin((double)Ouverture_)*cos(alfa);
|
---|
| 265 | ys = sin((double)Ouverture_)*sin(alfa);
|
---|
| 266 | zs = cos((double)Ouverture_);
|
---|
| 267 |
|
---|
| 268 | // coordonnees dans le systeme fixe
|
---|
| 269 | x = Rota_[0]*xs+Rota_[1]*ys+Rota_[2]*zs;
|
---|
| 270 | y = Rota_[3]*xs+Rota_[4]*ys+Rota_[5]*zs;
|
---|
| 271 | z = Rota_[6]*xs+Rota_[7]*ys+Rota_[8]*zs;
|
---|
| 272 |
|
---|
| 273 | // angles teta,phi
|
---|
| 274 | teta = acos(z);
|
---|
| 275 | phi = atan2(y,x);
|
---|
| 276 | if( phi< 0. ) phi= DeuxPi+phi;
|
---|
| 277 | }
|
---|
| 278 |
|
---|
| 279 | /* --Methode-- */
|
---|
| 280 | //++
|
---|
| 281 | void Scan::DirectionIndex(int_4 k, float& teta, float& phi)
|
---|
| 282 |
|
---|
| 283 | // Retourne les coordonnées (teta,phi) du pixel d'indice k
|
---|
| 284 | //--
|
---|
| 285 | {
|
---|
| 286 | float t;
|
---|
| 287 |
|
---|
| 288 | //recupere le temps associe a l'indice k du pixel
|
---|
| 289 | t= TempsInitial_+(float)k/FrequenceEch_;
|
---|
| 290 |
|
---|
| 291 | // angles teta,phi
|
---|
| 292 | Direction(t, teta, phi);
|
---|
| 293 | }
|
---|
| 294 |
|
---|
| 295 | static r_8 dummy_pixel = 0;
|
---|
| 296 | /* --Methode-- */
|
---|
| 297 | //++
|
---|
| 298 | r_8& Scan::PixelValue(int_4 k) const
|
---|
| 299 |
|
---|
| 300 | // Retourne la valeur du contenu du pixel d'indice k
|
---|
| 301 | //--
|
---|
| 302 | {
|
---|
| 303 | if ( (k<0) || (k >= NmaxPts_) ) {
|
---|
| 304 | printf("\n ValueIndex::indice du pixel errone k= %d",k);
|
---|
| 305 | return(dummy_pixel);
|
---|
| 306 | }
|
---|
| 307 | return(sPix_[k]);
|
---|
| 308 | }
|
---|
| 309 |
|
---|
| 310 | void Scan::Clear() {
|
---|
| 311 | if (sPix_) delete[] sPix_;
|
---|
| 312 | }
|
---|
| 313 | void Scan::InitNull() {
|
---|
| 314 | sPix_=NULL;
|
---|
| 315 | mInfo_=NULL;
|
---|
| 316 | }
|
---|
| 317 |
|
---|
| 318 |
|
---|
| 319 | //++
|
---|
| 320 | // Titre Opérateurs
|
---|
| 321 | //--
|
---|
| 322 | //++
|
---|
| 323 | // Links double& operator()(int_4 k)
|
---|
| 324 | //--
|
---|
| 325 | //++
|
---|
| 326 | // Surcharge de la parenthese a un indice entier : remplit ou/et renvoie
|
---|
| 327 | // la valeur du contenu du pixel d'indice k
|
---|
| 328 | //--
|
---|
| 329 |
|
---|
| 330 |
|
---|
| 331 |
|
---|
| 332 |
|
---|
| 333 |
|
---|