Aller au contenu

Comprendre les coordonnées

Une image numérique est constituée de pixels, chaque pixel ayant des coordonnées : une abscisse et une ordonnée, notées respectivement x et y dans la suite.

Attention

  • On commence la numérotation à partir de 0, ainsi le pixel en haut à gauche de l’image a pour coordonnées \((0 ; 0)\).

  • L’axe des ordonnées est dirigé vers le bas !

Exemple

On suppose ici que l’on dispose d’une fonction colorier(x, y) qui permet de colorier le pixel de coordonnées (x, y) (en gris).

Voici un exemple d'utilisation pour comprendre le rôle de la fonction colorier :

Script Python
creer_image(9, 9)  # ligne obligatoire en début de chaque programme pour créer l'image

colorier(3, 7)  # on colorie un pixel
On obtient une image de dimension 9*9 pixels, avec le pixel aux coordonnées (3, 7) colorié :

Votre figure

Votre tracé sera ici

Question 1
Script Python
creer_image(9,9)

colorier(4, 2)
colorier(4, 3)
colorier(4, 5)
colorier(4, 6)

colorier(2, 4)
colorier(3, 4)
colorier(4, 4)
colorier(5, 4)
colorier(6, 4)

Votre figure

Votre tracé sera ici

Question 2

Vous devez écrire le code nécessaire pour obtenir l'image souhaitée.

Votre figure

Votre tracé sera ici

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici

Couleurs

Il est possible de passer un troisième argument à la fonction colorier afin de spécifier la couleur du pixel.

On dispose des couleurs suivantes : BLANC, NOIR, VERT, ROUGE, BLEU, ROSE, BLEU, JAUNE.

Dans la suite de l'exercice, on souhaite créer le dessin suivant :

Votre figure

Votre tracé sera ici

Nous allons pour ceci procéder par étape en répondant aux questions suivantes.

Question 3
Script Python
# image de 3 lignes de 11 colonnes
creer_image(11, 3)

# ligne 0 :
colorier(2, 0, VERT)
colorier(8, 0, VERT)

# ligne 1 :
colorier(0, 1, VERT)
colorier(3, 1, VERT)
colorier(7, 1, VERT)
colorier(10, 1, VERT)

# ligne 2 :
colorier(0, 2, VERT)
colorier(2, 2, VERT)
colorier(3, 2, VERT)
colorier(4, 2, VERT)
colorier(5, 2, VERT)
colorier(6, 2, VERT)
colorier(7, 2, VERT)
colorier(8, 2, VERT)
colorier(10, 2, VERT)

Votre figure

Votre tracé sera ici

Répétitions

On peut constater que le coloriage de la troisième ligne (d'odonnée \(2\)) est très répétitif, alors que seule la cordonnées en x change d'une ligne à l'autre. Ainsi, on aurait pu écrire cette même ligne avec le code suivant :

for x in [0, 2, 3, 4, 5, 6, 7, 8, 10]:
    colorier(x, 2, VERT)

Question 4

Vous devez écrire le code nécessaire pour obtenir les lignes aux ordonnées \(3\) et \(4\) de l'image souhaitée.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici

Répétitions

Le code précédent se concentre sur les pixels à colorier.

En pratique, une ligne de l'image est stockée par une liste de couleurs.

ligne_2 = [VERT, BLANC, VERT, VERT, VERT, VERT, VERT, VERT, VERT, BLANC, VERT]
Ainsi l'expression ligne_2[0] donne la couleur du pixel situé à l'abscisse \(0\). De manière plus générale, l'expression ligne_2[x] donne la couleur du pixel situé à l'abscisse x.

On peut parcourir l'ensemble des valeurs du tableau pour colorier la ligne entière :

for x in range(NB_COLONNES):
    colorier(x, 2, ligne_2[x])

Question 5

cliquer sur les pixels à colorier en vert :

Script Python
NB_COLONNES = 11
ligne_5 = [BLANC, BLANC, VERT, VERT, VERT, VERT, VERT, VERT, VERT, BLANC, BLANC]
for x in range(NB_COLONNES):
    colorier(x, 0, ligne_5[x])

Votre figure

Votre tracé sera ici

Question 6

Vous devez écrire le code nécessaire pour obtenir les lignes aux ordonnées \(6\) et \(7\) de l'image souhaitée.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici

Répétitions de boucle

On constate qu'il y a toujours des répétitions, puisque la construction de chaque ligne de l'image nécessite une boucle, alors que seuls l'ordonnée et le tableau de couleurs changent.

On peut alors regrouper l'ensemble des lignes dans un tableau :

image = [ligne_0, ligne_1, ligne_2, ligne_3, ligne_4, ligne_5, ligne_6, ligne_7]
Ainsi l'expression image[3] donne la ligne située à l'ordonnée \(3\). De manière plus générale, l'expression image[y] donne la ligne située à l'ordonnée y.

On peut alors parcourir l'ensemble des lignes de l'images :

for y in range(NB_LIGNES):
    ligne = image[y]
    for x in range(NB_COLONNES):
        colorier(x, y, ligne[x])

Question 7

Cliquer sur les pixels à colorier en bleu :

Script Python
NB_LIGNES = 6
NB_COLONNES = 9
image = [[BLANC, BLANC, BLANC, BLEU, BLANC, BLEU, BLANC, BLANC, BLANC],
        [BLEU, BLANC, BLEU, BLEU, BLEU, BLEU, BLEU, BLANC, BLEU],
        [BLEU, BLEU, BLEU, BLANC, BLEU, BLANC, BLEU, BLEU, BLEU],
        [BLANC, BLEU, BLEU, BLEU, BLEU, BLEU, BLEU, BLEU, BLANC],
        [BLANC, BLEU, BLANC, BLEU, BLANC, BLEU, BLANC, BLEU, BLANC],
        [BLEU, BLEU, BLANC, BLANC, BLANC, BLANC, BLANC, BLEU, BLEU]
        ]
for y in range(NB_LIGNES):
    ligne = image[y]
    for x in range(NB_COLONNES):
        colorier(x, y, ligne[x])

Votre figure

Votre tracé sera ici

Question 8

Vous devez écrire le code nécessaire pour obtenir l'image souhaitée.

Votre figure

Votre tracé sera ici

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici