Bonjour,
je dois coloriser un nuage de point en 3D en fonction de son altitude. Je m'explique : j'ai un fichier .txt contenant plusieurs milliers (voir million) de points, une ligne par point, et chaque ligne contient le X, le Y et le Z espacé par des espaces.
ex :
1418361.400 4187958.200 -3.372
1418361.600 4187958.200 -3.472
1418354.000 4187958.400 -1.667
1418354.200 4187958.400 -1.686
1418355.000 4187958.400 -2.047
1418355.200 4187958.400 -2.146
Je possède également une liste de n valeurs qui me servent d'intervalle de sélection pour le tri, et une matrice (n,3) contenant le code RGB correspondant aux valeurs.
ex de liste d'intervalles:
[-20. -19. -18. -17. -16. -15. -14. -13. -12. -11. -10. -9. -8. -7. -6. -5. -4. -3. -2. -1. 0.]
exemple de matrice de code RGB:
[[ 0. 0. 255.]
[ 0. 43. 255.]
[ 0. 85. 255.]
[ 0. 128. 255.]
[ 0. 170. 255.]
[ 0. 213. 255.]
[ 0. 255. 255.]
[ 0. 226. 204.]
[ 0. 204. 153.]
[ 0. 172. 102.]
[ 0. 153. 51.]
[ 0. 128. 0.]
[ 51. 154. 0.]
[ 102. 179. 0.]
[ 153. 205. 0.]
[ 204. 230. 0.]
[ 255. 255. 0.]
[ 255. 191. 0.]
[ 255. 127. 0.]
[ 255. 63. 0.]
[ 255. 0. 0.]]
Ainsi, si l'altitude du point (le Z) est compris entre -20 et -19, le code RGB [0 0 255] lui sera attribué.
Le but du jeu est donc de lire le fichier txt, de regarder la valeur de l'altitude de chaque point et de lui attribuer le code RGB correspondant, puis d'enregistrer la nouvelle donnée dans un second fichier texte sous la forme (X Y X R G B). Ainsi, les points précédent donneront le fichier suivant:
1418361.400 4187958.200 -3.372 255 255 0
1418361.600 4187958.200 -3.472 255 255 0
1418354.000 4187958.400 -1.667 255 127 0
1418354.200 4187958.400 -1.686 255 127 0
1418355.000 4187958.400 -2.047 255 191 0
1418355.200 4187958.400 -2.146 255 191 0
Mon code marche mais je souhaiterais l'optimiser car il est actuellement très long d’exécution (plusieurs minutes voir dizaine de minutes en fonction du nombre de points et du nombre d'intervalles).
Le fichier texte initial étant potentiellement très grand, je ne peux pas le mettre directement dans un matrice à l'aide d'un genfromtxt par exemple pour ensuite faire un tri des points en fonction de l'altitude puis leur appliquer la couleur par intervalle. Je n'ai pas également pas trouvé comment trier directement le fichier sans l'ouvrir.
J'ai essayer des fonctions récursives mais elles ne sont pas beaucoup plus rapide ...
Je n'ai pas trouvé de solution plus rapide que de lire le fichier ligne par ligne, de regarder l'altitude du point, et d'écrire le point (X, Y, et Z) et son code RGB dans un autre fichier, avant de passer à la seconde ligne.
Voici mon code, savez-vous comment je pourrais l'optimiser ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 fichier_source = file('points_init.txt', "r") fichier_destination = file('points_couleur.txt', 'w') for ligne in fichier_source: M = np.matrix(ligne) if M[0,2] < intervalle[1]: fichier_destination.write("%.3f %.3f %.3f %i %i %i\n" %(M[0,0], M[0,1], M[0,2], couleur[0,0], couleur[0,1], couleur[0,2]) ) if M[0,2] >= intervalle[-1]: fichier_destination.write("%.3f %.3f %.3f %i %i %i\n" %(M[0,0], M[0,1], M[0,2], couleur[-1,0], couleur[-1,1], couleur[-1,2]) ) for i in range(1, len(couleur)-2): if M[0,2] >= intervalle[i] and M[0,2] < intervalle[i+1]: fichier_destination.write("%.3f %.3f %.3f %i %i %i\n" %(M[0,0], M[0,1], M[0,2], couleur[i,0], couleur[i,1], couleur[i,2]) ) fichier_source.close() fichier_destination.close()