2.4 Kaléidoscope

On se propose dans ce TP de travailler sur un générateur d'images svg. On souhaite générer des images kaléidoscopiques comme celle ci-dessous.

PIC

On vous fournit le fichier principal du programme et on vous demande d'écrire trois modules  : dessin.py, point.py, triangle.py.

 
#!/usr/bin/env python3 
""" 
kaleidoscope. 
exo graphique, quelques boucles, plusieurs classes a ecrire. 
""" 
import sys 
from math import pi 
 
import dessin 
from point import Point 
from triangle import triangle_aleatoire 
 
 
def generer_image(nombre_triangles): 
    """ 
    genere le nombre de triangles demande aleatoirement, les tourne. 
    affiche le svg sur la sortie standard. 
    """ 
    largeur, hauteur = 800.0, 600.0 
    dessin.entete(largeur, hauteur) 
    centre = Point([largeur/2, hauteur/2]) 
 
    for _ in range(nombre_triangles): 
        # on genere un triangle a linterieur du quart en bas 
        # a droite de limage. 
        triangle = triangle_aleatoire( 
            (largeur/2, largeur), 
            (hauteur/2, hauteur) 
        ) 
        couleur = dessin.couleur_aleatoire() 
        # on tourne 8 fois 
        for tour in range(8): 
            angle = pi/4 * tour 
            triangle_tourne = triangle.rotation_autour(centre, angle) 
            dessin.affiche_triangle(triangle_tourne, couleur) 
 
    dessin.pied() 
 
 
def main(): 
    """ 
    on genere un svg kaleidoscopique a partir dun nombre de triangles. 
    """ 
    if len(sys.argv) != 2 or sys.argv[1] == "-h" or sys.argv[1] == "--help": 
        print("utilisation:", sys.argv[0], "nombre_triangles>image.svg") 
        sys.exit(1) 
 
    nombre_triangles = int(sys.argv[1]) 
 
    generer_image(nombre_triangles) 
 
 
if __name__ == "__main__": 
    main()

kaleidoscope.py

Prenez un peu de temps pour bien comprendre le programme fourni. En particulier, on vous demande de bien identifier les fonctions, les classes et les méthodes qui devront être implémentées dans les différents modules. Pour chacunes des fonctions et des méthodes, veillez aussi à bien identifier ce qu'elles retournent.

Pour dessiner un triangle au format svg, on se référera à la documentation en ligne : http://www.w3schools.com/graphics/svg_polygon.asp.

Pour effectuer la rotation d'angle α d’un point de coordonnées (x, y) autour d'un centre de rotation de coordonnées (xc, yc), plusieurs approches sont possibles. Si cette partie ne vous inspire pas, vous pouvez toujours utiliser la formule suivante :

x= (x - xc) × cos(α) - (y - yc) × sin(α) + xc

y= (x - xc) × sin(α) + (y - yc) × cos(α) + yc

Le code qui permet de récupérer les arguments sur la ligne de commande est donné à titre d'exemple et ne sera pas étudié dans cet exercice.