C1.3 : TP Immeubles
Présentation du TP
But
On souhaite écrire un programme qui crée une image contenant le dessin d’une rue avec des immeubles dont certaines caractéristiques sont générés aléatoirement.
Contraintes
L'image générée doit avoir la taille de 800×600 pixels.
Les contraintes urbanistiques concernant les immeubles sont les suivantes :
- - les immeubles ont au minimum un rez-de-chaussée et au maximum 4 étages (5 niveaux) ;
- - les immeubles ont une largeur de 140 pixels ;
- - les immeubles ont la même couleur pour tous les niveaux (rez-de-chaussée et étages) ;
- - chaque niveau (rez-de-chaussée ou étage) a une hauteur de 60 pixels ;
- - les rez-de-chaussée n'ont qu'une seule porte ;
- - toutes les fenêtres sont identiques, de taille 30 pixels sur 30 pixels ;
- - toutes les portes ont une largeur de 30 pixels ;
Tout le reste est libre et peut donc être personnalisé.
Travail à faire
Approche globale
Proposer un module et un programme qui utilise les fonctions du module pour répondre au problème posé.
On utilisera le module PIL de Python.
On utilisera le plus de petites fonctions possible. On veillera à bien documenter le module et les fonctions du module.
Quelques pistes
Programme principal
Le programme principale pourrait ne contenir que :
- - la création de toutes les constantes nécessaires au projet
- - la création de l'objet-image
- - l'appel à des fonctions pour ajouter des éléments à l'objet-image
- - la sauvegarde de cette image dans un fichier png
- - l'affichage de l'objet-image
On aurait donc la structure suivante.
from PIL import Image
# ==== Constantes ====
LARGEUR = 800
HAUTEUR = 600
L_IMMEUBLE = 140
H_NIVEAU = 60
C_BLANC = (255,255,255)
C_NOIR = (0,0,0)
# ==== Définition des fonctions ====
# ==== Programme principal =====
objet_image = Image.new('RGB', (largeur, hauteur), c_blanc)
# Appel des fonctions pour ajouter des éléments à l'objet-image
objet_image.save('immeubles.png','png')
objet_image.show()
Fonction pour tracer un rectangle
On peut observer que tous les éléments de l'image à créer sont des rectangles de couleur, entourés d'un trait noir.
On va donc écrire une fonction pour cela.
def rectangle(obj_img, x0, y0, l, h, c)
"""
Fonction qui permet d'ajouter un rectangle à un objet-image PIL
Paramètres:
obj_img (objet-image)
x0, y0 (int) : coordonnées du pixel en haut à gauche du rectangle à ajouter
l, h (int) : largeur et hauteur du rectangle à ajouter
c (tuple) : couleur de fond du rectangle à ajouter
"""
pass
Autres fonctions
- •
coul_alet()qui renvoie un tuple correspondant à une couleur aléatoire - •
immeuble(obj_img, num_x) - •
rdc(obj_img, num_x, couleur) - •
etage(obj_img, num_x, num_etage, couleur) - •
fenetre(...) - •
porte(...) - • ...
Exemple
La série d'exemples ci-dessous est basée sur :
- - une couleur aléatoire unique pour tous les niveaux (rez-de-chaussée et étages) d'un même immeuble ;
- - deux modèles de toits ;
- - deux modèles de portes avec une couleur aléatoire ;
- - deux modèles d'ouvertures pour les étages : fenêtre ou porte-fenêtre avec balcon ;
- - trois éléments horizontalement pour chaque niveau.
Quelques liens
Documentation officielle de la librairie PIL : pillow.readthedocs.io/en/stable/