Miata: une route de nuit
Il s’agit d’un projet d’art génératif réalisé en utilisant principalement le module turtle de python . Nous avons décider de générer une Mazda mx-5 aussi appelée Miata sur une route de nuit avec des étoiles générées aléatoirement.
Le script
On commence par importer les modules dont on a besoin pour la suite tout en définissant la taille de l’image grâce au module pillow
from turtle import * from random import randint try: from PIL import * pillow_installed = True except: print("Oops! - ModuleNotFoundError: No module named 'PIL' - RTFM :") print("https://nsi.xyz/py2png") pillow_installed = False # Uniquement des lettres, des chiffres, un tiret. Rien d'autre. titre = "MIATA" # Définir le titre de la fenêtre de turtle + propagande ^^ title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI") # definir la taille de la fenêtre en 720p (Largeur, Hauteur) # La tortue part du centre, au point de coordonnées (0,0) setup(800, 700) # La tortue va à la vitesse du lièvre et active sa cape d'invisibilité speed(0) hideturtle()
Image de fond
On génère ensuite l’image en commençant par le fond
On commence par le ciel de nuit et les étoiles
def star(): pensize(3) seth(randint(0,360)) e = randint(2,6) color("#F2F3CF") penup() goto(randint(-400,400),randint(85,350)) pendown() for i in range(5): forward(e) right(142) speed(0) pensize(10000) hideturtle() color("#07073C") forward(10) for i in range(18): star() penup() goto(-250,300) pendown() pensize(2) begin_fill() seth(210) color("#BFC298") for i in range(
On commence par définir la fonction star() qui nous sert a générer une étoile d’une taille aléatoire a une position elle aussi aléatoire dans la zone qui sera le ciel pour éviter qu’elle finisse cachée par les autres éléments qui seront générés par la suite. Ensuite on fait un fond bleu nuit qui prend l’entièreté de l’écran en mettant une taille de crayon très grande et on génère 18 étoiles en utilisant une boucle qui répète la fonction star() puis on fait un croissant de lune en faisant des boucles donnant des arrondis . Ainsi on obtient cela:
on continue en ajoutant une forêt qui sera derrière la voiture
goto(-400,75) pendown() pensize(2) color("#2C4D20") begin_fill() for i in range(3): seth(45) forward(77) right(90) forward(70) seth(45) forward(60) right(90) forward(80) seth(45) forward(50) right(90) forward(43) right(45) forward(460) right(90) forward(810) right(90) forward(455) end_fill()
Ce code nous permet de générer des triangles de 3 tailles différentes que l’on va remplir fin de donner l’illusion d’une forêt dense en utilisant un vert foncé
On continue en réalisant la route
seth(0) goto(-450,-125) pensize(30) color("#373639") forward(900) penup() goto(-400,-175) pendown() pensize(2) begin_fill() color("#262527") forward(800) right(90) forward(200) right(90) forward(800) right(90) forward(200) end_fill() goto(-400,-180) pensize(7) seth(0) for i in range(4): color("white") forward(100) penup() forward(100) pendown()
Ce code nous permet de faire un grand trait de couleur grise pour représenter la barrière puis il génère un grand rectangle qui représente la route en y ajoutant des bandes blanches, créant ainsi une route.
La voiture
On passe ensuite à la partie la plus importante du script: la voiture
def phares(): left(30) fillcolor('gray') begin_fill() left(80) color('yellow') pensize(4) forward(25) pensize(1) color('gray') right(120) forward(30) right(130) forward(30) end_fill() forward(-31) color('red') pensize(4) right(50) forward(32) forward(-32) color('red') right(125) pensize(1) pendown() def jantes(): color('gray') begin_fill() fillcolor('black') circle(30) end_fill() forward(5) left(90) forward(10) pendown() begin_fill() fillcolor('silver') jantes()
Cette partie nous permet de faire l’avant de la voiture en définissant la fonction pour faire une roue composée d’un pneu et d’une jante, inspiré des jantes BBS et ainsi que la fonction qui servira à faire le phare avant
pensize(1) color('black') fillcolor('red') for i in range (35): forward(1) right(0.75) right(75) forward(50) right(90) for i in range(169): forward(0.5) left(1) right(94) forward(20) end_fill() right(85) forward(52) right(163) penup() forward(63) pendown() jantes()
Résultat final
Il s’agit de la fin du code pour l’image, terminant la Miata en faisant l’habitacle composé du toit de la voiture et d’une fenêtre puis l’arrière de la voiture en rappelant la fonction définie plus tôt afin de faire la seconde roue
Pour conclure on met la dernière partie de code pour exporter l’image en fichier.png
# ============== GENERER DES IMAGES AUTOMATIQUEMENT ============== if flash: wn.update() image = getcanvas() nom_du_fichier_sans_extension=titre+"_"+hex(randint(2**30+2**25,2**30+2**25+2**24-1))[2:] # Génère un fichier .ps image.postscript(file=nom_du_fichier_sans_extension+".ps", colormode='color') # Ouvre le fichier .ps et génère le fichier .png try: psimage = Image.open(nom_du_fichier_sans_extension+".ps") psimage.load(scale=2) psimage_resized = psimage.resize((1280, 720)) psimage.save(nom_du_fichier_sans_extension+".png") print(nom_du_fichier_sans_extension+".png", psimage.size, "sauvegardé dans le dossier") except: if not pillow_installed: print("Oops! - ModuleNotFoundError: No module named 'PIL' - RTFM :") print("https://nsi.xyz/py2png") else: print("Oops! - 'ghostscript' not installed- RTFM :") print("https://nsi.xyz/py2png") exitonclick()