Écriture de données en coordonnées XYZ ordonnées

Chessiest Messages postés 1 Date d'inscription mardi 6 juillet 2010 Statut Membre Dernière intervention 6 juillet 2010 - 6 juil. 2010 à 21:43
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 - 7 juil. 2010 à 08:57
Bonjour, voici mon problème:

J'ai une énorme quantité de données (il s'agit de doses) écrites dans un
fichier texte sous la forme suivante:

coordX coordY dose
... ... ...

Les valeures des coordonnées sont très précise (7 chiffres significatifs),
mais je désire les ordonner dans des pixels sur une grille.

Cette grille aurait 150 valeurs en Y de 1mm de dimension par 300 valeurs en X de 1m de diumension. Donc 150mm x 300mm.

J'ai mes données dans le fichier XYZ.txt et j'écris dans le fichier Final.XYZ.txt les doses moyennes qui se retrouvent dans les pixels.
En fait j'espère avoir le tout écrit comme suis:

-150 0 dose
-150 1 dose
-150 2 dose
... ... ...
-149 0 dose
-149 1 dose
... ... ...
149 149 dose

Or mon code prends un temps démoniaque à rouler, plusieurs jours... Pouvez-vous voir ce qui ne fonctionne pas, je suis vraiment débutant en programmation, un gros merci à chacun qui le regarde.

#include
#include <fstream>
#include <string>

using namespace std;

int main()
{
int i=0;
int j=0;
double x=0.0;
double y=0.0;
double dose=0.0;
double M[300][150]; // Matrice qui va contenir les données
double C[300][150]; // Matrice compteur pour effectuer une moyenne

for (j=0;j<150;j++)
{
for (i=0;i<150;i++)
{
M[i][j]=0.0;
C[i][j]=0.0;
}
}

ifstream data;
data.open("XYZ.txt",ios::in);

if(!data.is_open())
{
cout << "Le fichier d'entree est introuvable" << endl;
}
else
{
for(j=0;j<150;j++)
{
for(i=0;i<300;i++)
{
while(!data.eof())
{
data >> x >> y >> dose
if(((i-151) <= x) && (x <= (i-149)) && ((j-1) <= y) && (y <= (j+1)))

{
M[i][j] = M[i][j] + dose;
C[i][j] = C[i][j] + 1.0
}
}
}
}
data.close();

for(j=0;j<150;j++)
{
for(i=0;i<300;i++)
{
M[i][j] = M[i][j]/C[i][j];
}
}

ofstream finalXYZ;
finalXYZ.open("FinalXYZ", ios::out);

for(j=0;j<150;j++)
{
for(i=0;i<300;i++)
{
finalXYZ << (i-150) << " " << j << " " << M[i][j] << "\n";
}
}
finalXYZ.cose();
}
return 0;
}

-30- Merci beaucoup de votre temps !!!

1 réponse

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
7 juil. 2010 à 08:57
Bonjour,

tes 2 boucles ne servent à rien :

		for(j=0;j<150;j++) 
{ 
for(i=0;i<300;i++) 
{ 
while(!data.eof()) 
{ 
data >> x >> y >> dose 
if(((i-151) <= x) && (x <= (i-149)) && ((j-1) <= y) && (y <= (j+1))) 

{ 
M[i][j] = M[i][j] + dose; 
C[i][j] = C[i][j] + 1.0 
} 
} 
} 
} 


contente-toi de :
		while(!data.eof()) 
{ 
data >> x >> y >> dose 
if((i) int(x)) &&  (int(y) j)) 
{
M[i][j] = M[i][j] + dose; 
C[i][j] = C[i][j] + 1.0 
} 
} 


ensuite, il serait de bon ton de vérifier la valeur de c[][] avant de s'en servir de diviseur.
0
Rejoignez-nous