====== Hitomezashi ======
===== Qu'est ce que c'est ? =====
On choisit une taille de grille. Par exemple la grille suivante :
{{ :nsi:tds:hitomezashi.png?direct&200 |}}
Ce sont surtout les lignes de la grille qui nous intéressent. On veut noircir certains segments de la grille pour former un motif.
À tire d'exemple, supposons que l'on place soit 1, soit 0 en tête d'une ligne verticale.
{{ :nsi:tds:hitomezashi_1.png?direct&200 |}}
Quand c'est un ''1'', on noircit le premier segment de la ligne, puis alternativement un sur deux. Quand c'est ''0'', le premier segment n'est pas noirci.
Voici un exemple complet pour lequel on a indiquer ''1'' ou ''0'' pour toutes les lignes verticales ou horizontales.
{{ :nsi:tds:hitomezashi_2.png?direct&200 |}}
Gardez en tête qu'on ne veut pas de la grille orange. Le tracé final ne doit comporter que la partie en noir. On voudrait donc tracer ce motif automatiquement.
===== Quoi faire ? =====
Vous devez réaliser une fonction ''hitomezashi'' qui reçoit deux mots ''vertical'' et ''horizontal'' et qui produit l'image correspondante. On donnera aussi le nom du fichier image.
L'exemple précédent est ce que l'on aurait obtenu si on avait appelé ''%%hitomezashi("test.png", "1001", "1011")%%'' et serait ici placé dans le fichier image ''test.png''.
Vous êtes libre d'imposer que les deux mots aient la même taille (donc grille carrée) ou pas (possiblement rectangulaire).
On pourra utiliser la constante ''TAILLE = 10'' indiquant que le carré de base de la grille fait 10 pixels.
Avec ces réglages, notre dessin précédent qui faut 5x5 cases aurait une taille de 50x50 pixels.
==== D'autres options ====
Libre à vous d'aller plus loin en proposant la création de motifs aléatoires.
Vous pourriez aussi envisager un motif avec des carrés remplis. On pourra toujours remplir le motif en n'utilisant que 2 couleurs de façon que deux zones de même couleur ne se touchent jamais. Voici le résultat en rouge et blanc pour la grille précédente :
{{ :nsi:tds:hitomezashi_3.png?direct&200 |}}
===== Manipulation de l'image =====
Pour produire l'image, il vous faut quelques informations sur la manipulation des images.
Je vous propose d'utiliser ''matplotlib'' et ''numpy''.
import matplotlib.image as mpimg
import numpy as np
Pour créer une image 50x50toute blanche :
img = np.full((50, 50), 255, np.uint8)
Changer un pixel est rapide :
# mettre en noir le pixel en ligne 35 et colonne 12 :
img[35,12] = 0
Changer de couleur toute une zone :
# mettre en noir une zone allant de la ligne 3 à 5 (non comrpis) et de la colonne 10 à 20 (non comprise)
img[3:5,10:20] = 0
# mettre en noir la toute la ligne 4
img[4,:] = 0
Enfin, pour sauvegarder cette image :
mpimg.imsave('le_nom_que_l_on_veut.png', img, cmap="gray")
Notez l'option ''cmap'' permettant d'obtenir une image en niveaux de gris.
==== Un peu de couleur ====
Les commandes précédents étaient en noir et blanc. Si on veut ajouter de la couleur, il faut 3 canaux de couleur.
img = np.full((62, 62, 3), 255, np.uint8)
Une couleur est un triplet d'octets pour RGB. Par exemple ''(252, 148, 3)'' est un orange.
# pixel en ligne 12, colonne 52 en orange :
img[12, 52] = (252, 148, 3)
Dans ce cas, on ne précise pas ''cmap'' pour l'enregistrement :
mpimg.imsave('test.png', img)