## page was renamed from 1B2/solution Cette page contient des exemples de solutions pour le TP [[1B2]]. == Exercice 1: rotation de 180° == Si L est la largeur de l'image et H est sa hauteur, en nombre de pixels, alors l'image tournée de 180° a les mêmes dimensions mais le pixel de coordonnées (x,y) dans l'image de départ se rtetrouve en (L-x-1,H-y-1) dans l'image résultat. Attention à la soustraction de 1: les coordonnées vont de (0,0) à (L-1,H-1). On peut donc écrire la solution suivante en utilisant les fonctions du module '''pnm''' fourni: {{{#!highlight python def retourner(image): L = image['largeur'] H = image['hauteur'] resultat = pnm.creer_image_couleur(L, H, image['maximum']) for x in range(L): for y in range(H): r, v, b = pnm.lire_pixel_couleur(image, x, y) pnm.ecrire_pixel_couleur(resultat, L-x-1, H-y-1, r, v, b) return resultat }}} Mais bien sûr, cette fonction ne manipule presque pas la structure de données, elle utilise les fonctions fournies. En fait, elle procède selon le principe des types abstraits. Si on veut réécrire cette fonction en manipulant directement la structure de données, on pourre procéder de la façon suivante: {{{#!highlight python def retourner2(image): L = image['largeur'] H = image['hauteur'] entree = image['donnees'] # création de la liste des valeurs sortie = [0] * (L * H * 3) # définition des valeurs des pixels for x in range(L): for y in range(H): pos_entree = (y * L + x) * 3 pos_sortie = ((H-y-1) * L + (L-x-1)) * 3 for i in range(3): sortie[pos_sortie + i] = entree[pos_entree + i] # construction de la structure de l'image produite return { 'largeur': L, 'hauteur': H, 'maximum': image['maximum'], 'donnees': sortie } }}} == Exercice 2: écriture au format PPM ASCII == Les données sont stockées dans la liste ''donnees'' dans le même ordre que ce que spécifie le format PPM, il suffit donc d'écrire l'en-tête suivie des données dans l'ordre où elles se trouvent. Il faut juste prendre soin d'écrire les valeurs en base 10 séparées par des caractères d'espacement, en l'occurence des retours à la ligne dans cette solution: {{{#!highlight python def ecrire_ascii(image, nom_fichier): fichier = open(nom_fichier, "w") # écriture de l'en-tête fichier.write("P3 %d %d %d\n" % (image['largeur'], image['hauteur'], image['maximum'])) # écriture de la liste des valeurs (écrites en base 10) for x in image['donnees']: fichier.write("%d\n" % x) }}}