1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#include <iostream>
#include <string>
#include <fstream>
#include <new>
#include <iomanip>
#include <cstdlib>
#include <cmath>
using namespace std;
/* parameters used in the routines as given in Ref. [1] */
const double PI = 3.14159265359;
const double SAT_HEIGHT = 42164.0; /* distance from Earth centre to satellite */
const double R_EQ = 6378.169; /* radius from Earth centre to equator */
const double R_POL = 6356.5838; /* radius from Earth centre to pol */
const double SUB_LON = 0.0; /* longitude of sub-satellite point in radiant */
const long CFAC = 781648343; /* scaling coefficients (see note above) */
const long LFAC = 781648343; /* scaling coefficients (see note above) */
const long COFF = 1856; /* scaling coefficients (see note above) */
const long LOFF = 1856; /* scaling coefficients (see note above) */
/* function prototypes */
int convert(int column, int row, long COFF, long LOFF, double *latitude, double *longitude);//Cette fonction va servir à convertir les coordonnées géographiques en coordonnées pixels avec l'implémentation de fonctions mathématiques prédéfinies
void deborde();
int main(){
set_new_handler(deborde);
int col=0, row=0;// (col == c == colonne de la coordonnée pixel); (row == r == l == ligne de la coordonnée pixel)
double lon_min=-81.3, lon_max=81.3, resol=0.09, lat_min, lat_max;//bornes de la grille de coordonnées géographique et résolution de cette grille
short int nb_lon, nb_lat, i, j;//nombre de longitude, nombre de latitude, incrément i et incrément j
double return_lon=0.0, return_lat=0.0;//valeurs de vérification
struct pix_coord
{
short int c;
short int r;
};// Structure correspondant à une coordonnée (colonne, ligne) d'un pixel.
string nom_fichier("coord_translation.txt");//fichier facultatif de stockage des résultats
nb_lon=(short int)(floor(((lon_max-lon_min) / resol) + double(1.5)));// calcul du nombre de longitudes de la grille de coordonnées géographique
lat_min=lon_min;
lat_max=lon_max;
nb_lat=nb_lon;//nombre de latitudes de la grille de coordonnées géographique
double *lon= new double [nb_lon]; //Déclaration dynamique du tableau 1D des longitudes de type double
double *lat = new double [nb_lat]; //Déclaration dynamique du tableau 1D des latitudes de type double
cout << "Etape 1 : (nb_lon=" << nb_lon << ", nb_lat=" << nb_lat << ")" << endl;
pix_coord **pix_coord_tab = new pix_coord* [nb_lon]; //Déclaration dynamique d'un tableau 2D de structure contenant une coordonnée (colonne, ligne) pour chaque élément du tableau de coordonnées géographiques (longitude, latitude)
for (int i = 0; i < nb_lon; i++) // Initialisation des pointeurs du premier niveau (chaque pix_coord_tab[i]) à 0 pour éviter un bug si mauvais delete c-a-d delete sur un pointeur quelconque non nul. i = incrément des éléments "longitudes"
pix_coord_tab[i] = 0;
for (int i = 0; i < nb_lon; i++)
pix_coord_tab[i] = new pix_coord[nb_lat];
cout << "Etape 2" << endl;
short int cpt_colonne_fichier=1;
//Les deux boucles avec incréments i et j servent à construire la grille de coordonnées géographique à partir des bornes lat_min, lat_max, lon_min, lon_max prédéfinies et de la résolution voulue (variable resol). Pour chaque coordonnées géographique (longitude, latitude) de la grille, une coordonnée pixel est calculée avec la fonction convert et stockée dans le tableau 2D de structure pix_coord_tab (où pix_coord_tab[i][j].c == colonne de la coordonnée pixel et pix_coord_tab[i][j].r == ligne de la coordonnée pixel)
for(i = 0; i < nb_lon; i++)
{
lon[i]=lon_min + (resol*i);
for(j = 0; j < nb_lat; j++)
{
lat[j]=lat_min + (resol*j);
// convert(lat[j],lon[i],COFF,LOFF,&col,&row);Fonction inutile pour l'instant c-a-d pendant la phase de test de déclaration dynamique des tableaux.
col=0.0;//test!
row=0.0;//test!
pix_coord_tab[i][j].c=col;
pix_coord_tab[i][j].r=row;
}
}
/*
ofstream fichier(nom_fichier.c_str(), ios::out | ios::trunc);
if(fichier) // si l'ouverture a réussi
{
for(i = 0; i < nb_lon; i++)
{
for(j = 0; j < nb_lat; j++)
{
fichier << "(" << lon[i] << "," << lat[j] << ")-->(" << pix_coord_tab[i][j].c << "," << pix_coord_tab[i][j].r << ")";
if(cpt_colonne_fichier == 6)
{
fichier << endl;
cpt_colonne_fichier=1;
}
else
{
fichier << "\t";
cpt_colonne_fichier++;
}
}
}
fichier.close(); // on referme le fichier
}
else
{
cerr << "Erreur à l'ouverture du fichier " << nom_fichier << endl;
}
*/
delete [] lon;
delete [] lat;
for (int i = 0; i < nb_lon; i++)
delete [] pix_coord_tab[i];
delete [] pix_coord_tab;
return (0);
}
void deborde()
{
cerr << "Memoire insuffisante" << endl << "Abandon de l'execution\n" << endl;
exit (-1);
} |
Partager