La Citrouille et la Tortue
Pour notre premier projet en classe de 1ère NSI, nous nous sommes basées sur le thème d’halloween.
Ici vous trouverez nos démarches pour créer cette image de style pop. Notre image est composée de quatre parties comportant chacune un fond et une citrouille de couleur différente.
Vidéo de présentation du projet :
Le projet :
Ce projet consiste à créer de l’art génératif grâce à un script python qui doit principalement utiliser des fonctions. Pour le réaliser, nous avons utilisé le module turtle
pour tracer l’image et la fonction randint
du module random
pour pouvoir transformer notre image (.py) en png. Le thème de l’image générée était libre, elle pouvait même être abstraite !
Le processus de création :
Durant ce projet, nous sommes passées par plusieurs étapes pour concevoir l’image et répondre aux attendus.
Nous avons tout d’abord dû trouver une idée de l’image que l’on voulait créer. Pour cela, nous nous sommes inspirées de l’artiste américain Andy Warhol et de ses oeuvres comme « Shot Marilyns » et nous avons transposé son style dans le thème d’Halloween.
Après avoir dessiné un croquis à la main, nous avons créé le script d’une citrouille puis nous l’avons transformé en plusieurs fonctions pour pouvoir la reproduire en quatre exemplaires. Nous avons fait de même pour les rectangles.
Contrairement aux citrouilles et aux rectangles, nous avons tout de suite codé les lettres en tant que fonctions ce qui nous a permis d’aller plus vite dans la conception de l’image.
Enfin, nous avons dû organiser notre script rigoureusement pour que la tortue trace les éléments dans le bon ordre pour un rendu propre et travaillé.
Le code expliqué étape par étape :
Pour concevoir cette image, nous avons agi étape par étape. Nous avons donc relevé les différentes parties du code qui ont permis de tracer l’image. (Nous ne montrerons pas la mise en place des modules et comment nous avons généré des images automatiquement. Pour cela, vous pouvez vous rendre sur cet article.)
Le fond :
Tout d’abord, nous avons divisé l’écran en quatre parties égales et rectangulaires. Nous avons défini une fonction rectangle(x,y,color)
. Pour obtenir nos quatre parties distinctes, il suffit de mettre les coordonnées ainsi qu’une couleur en argument pour tracer les rectangles au bon endroit.
# trace les rectangles def rectangle(x, y, color): up() goto(x, y) down() pencolor(color) fillcolor(color) begin_fill() for i in range(2): forward(640) right(90) forward(360) right(90) end_fill()
Nous appelons donc la fonction avec des coordonnées et des couleurs différentes pour tracer nos quatre rectangles.
rectangle(-640, 360, "#A8608E") rectangle(-640, 0, "#25AE80") rectangle(0, 360, "#C9BB32") rectangle(0, 0, "#E1770C")
Résultat :
L’écriture « HAPPY HALLOWEEN » :
Ensuite, nous avons créé des fonctions pour chaque lettre différente composant l’expression « HAPPY HALLOWEEN » soit une fonction pour les lettres h, a, p, y, l, o, w, e et n. La lettre « o » est spéciale car nous avons voulu la représenter par une citrouille pour rester dans le thème d’Halloween. Ici, nous vous montrerons les fonctions lettre_h(x,y)
, lettre_o(x,y)
et lettre_e(x,y)
.
# trace la lettre h en majuscule def lettre_h(x,y): pensize(3) color("black") up() goto(x,y) setheading(90) down() forward(50) backward(25) right(90) forward(25) right(90) forward(25) backward(50) # la lettre o est représentée par une citrouille def lettre_o(x,y,f): pensize(3) color("black") fillcolor(f) up() goto(x,y+25) a = x b = y for i in range(2): up() goto(x, y) down() begin_fill() circle(25) end_fill() x += 25 / (35 / 15) y -= 25 / 14 a = x + 25 / 1.4 for i in range(2): up() goto(a, b) down() begin_fill() circle(25) end_fill() a -= 25 / (35 / 15) b -= 25 / 14 goto(a + 25 / 14, b) begin_fill() circle(25) end_fill() setheading(0) up() goto(a, b + 25 * 2 + 2) down() pencolor("black") left(350) for i in range(4): left(40) forward(25 / (35 / 15)) goto(a, b + 25 * 2 + 2) # trace la lettre e en majuscule def lettre_e(x,y): pensize(3) color("black") up() goto(x,y) setheading(90) down() forward(50) right(90) forward(25) backward(25) left(90) backward(25) right(90) forward(15) backward(15) left(90) backward(25) right(90) forward(25)
Après avoir créé toutes ces fonctions, nous les appelons dans un ordre précis pour écrire « HAPPY HALLOWEEN » et nous utilisons des boucles for
pour que l’expression soit répétée et forme un motif. Nous rajoutons également la fonction stamp()
qui permet de laisser l’empreinte de la tortue à la fin de la lettre « N ».
h = 20 for i in range(4): lettre_h(50,h) lettre_a(80,h) lettre_p(110,h) lettre_p(140,h) lettre_y(170,h) lettre_h(230,h) lettre_a(260,h) lettre_l(290,h) lettre_l(320,h) lettre_o(370,h,"#C9BB32") lettre_w(460,h) lettre_e(510,h) lettre_e(540,h) lettre_n(570,h) stamp() h += 90 h = -340 for i in range(4): lettre_h(50,h) lettre_a(80,h) lettre_p(110,h) lettre_p(140,h) lettre_y(170,h) lettre_h(230,h) lettre_a(260,h) lettre_l(290,h) lettre_l(320,h) lettre_o(370,h,"#E1770C") lettre_w(460,h) lettre_e(510,h) lettre_e(540,h) lettre_n(570,h) stamp() h += 90 h = 20 for i in range(4): lettre_h(-600,h) lettre_a(-570,h) lettre_p(-540,h) lettre_p(-510,h) lettre_y(-480,h) lettre_h(-420,h) lettre_a(-390,h) lettre_l(-360,h) lettre_l(-330,h) lettre_o(-280,h,"#A8608E") lettre_w(-190,h) lettre_e(-140,h) lettre_e(-110,h) lettre_n(-80,h) stamp() h += 90 h = -340 for i in range(4): lettre_h(-600,h) lettre_a(-570,h) lettre_p(-540,h) lettre_p(-510,h) lettre_y(-480,h) lettre_h(-420,h) lettre_a(-390,h) lettre_l(-360,h) lettre_l(-330,h) lettre_o(-280,h,"#25AE80") lettre_w(-190,h) lettre_e(-140,h) lettre_e(-110,h) lettre_n(-80,h) stamp() h += 90 shape("turtle") stamp()
Résultat :
Le corps de la citrouille :
Puis, nous avons défini la fonction corps_citrouille(x,y,pen,fi)
pour dessiner le corps de la citrouille. Celle-ci prend en paramètre la couleur et les coordonnées du corps. Le corps est constitué de plusieurs cercles assemblés dans un ordre précis pour que le remplissage s’effectue correctement.
# trace le corps de la citrouille def corps_citrouille(x,y,pen,fi): pencolor(pen) pensize(5) fillcolor(fi) a = x b = y for i in range(2): up() goto(x,y) down() begin_fill() circle(70) end_fill() x += 30 y -= 5 a = x + 50 for i in range(2): up() goto(a,b) down() begin_fill() circle(70) end_fill() a -= 30 b -= 5 goto(a + 5,b) begin_fill() circle(70) end_fill()
Nous appelons cette fonction avec des coordonnées et des couleurs différentes pour créer nos quatre corps de citrouille.
corps_citrouille(-380,110,"#E1C40C","#E3E013") corps_citrouille(280,110,"#FF4017","#FF5733") corps_citrouille(280,-260,"#502D9B","#6445A6") corps_citrouille(-380,-260,"#26b510","#7EEb1E")
Résultat:
La tige de la citrouille :
De plus, nous avons conçu la tige à l’aide d’une autre fonction qui prend en compte les coordonnées et les couleurs de la tige. Pour la concevoir, nous avons d’abord tracé deux traits partant d’un même point puis nous les avons reliés pour effectuer le remplissage.
# trace la tige de la citrouille def tige_citrouille(x,y,pn,fl): setheading(0) up() goto(x,y) down() pencolor(pn) fillcolor(fl) begin_fill() right(160) for i in range(2): left(110) forward(30) goto(x,y) end_fill() begin_fill() right(20) for i in range(35): forward(1) right(2) end_fill()
Nous appelons ensuite cette fonction tige_citrouille(x,y,pn,fl)
avec différentes coordonnées et couleurs pour bien positionner nos quatre tiges de citrouille.
tige_citrouille(-350,260,"#515146","#7A7A65") tige_citrouille(310,260,"#0E6F12","#1B801F") tige_citrouille(310,-110,"#8C0F37","#AD2953") tige_citrouille(-350,-110,"#909207","#C2BD34")
Résultat :
Le visage :
Enfin, nous avons paramétré une fonction afin de lui créer un visage qui a pour arguments ses coordonnées. Le visage est composé de deux yeux qui sont des triangles, d’un nez qui est un triangle plus petit et d’une bouche également composée de formes géométriques.
# trace le visage de la citrouille def visage(x,y): setheading(0) pensize(1) up() goto(x,y) down() pencolor("#000000") fillcolor("#000000") begin_fill() # trace les deux yeux for i in range(2): up() goto(x,y) down() for i in range(3): forward(30) left(120) x += 70 end_fill() # trace le nez up() goto(x - 100,y - 22) down() begin_fill() for i in range(3): forward(22) left(120) end_fill() # trace la bouche up() goto(x - 120,y - 35) down() begin_fill() l = 10 for i in range(2): forward(l) right(45) forward(12) left(90) forward(12) right(45) l = 12 forward(15) for i in range(90): forward(0.5) right(2) for i in range(2): right(45) forward(12) left(90) forward(12) right(45) forward(12) right(45) forward(12) left(90) forward(12) right(45) for i in range(90): forward(0.5) right(2) end_fill()
Nous devons donc appeler cette fonction visage(x,y)
avec des coordonnées différentes pour aligner le visage sur le corps de chaque citrouille.
visage(-378,193) visage(282,193) visage(282,-177) visage(-378,-177)
Résultat :
Les difficultés rencontrées :
La première difficulté a été de trouver la distance entre les lettres pour former l’expression « HAPPY HALLOWEEN ». Au début, nous les avions espacées de 30 pixels puis nous nous sommes aperçues que certaines lettres se chevauchaient. Après de nombreuses tentatives, nous sommes arrivées au rendu recherché.
Une autre difficulté a été de tracer les cercles qui composent le corps de la citrouille dans le bon ordre pour que le remplissage s’effectue correctement. En ayant compris la logique du remplissage nous sommes finalement parvenues à trouver cet enchaînement.
Enfin, nous avons dû trouver les emplacements de tous les éléments qui composent la citrouille (le corps, la tige et le visage). Ce processus a été très long et a nécessité de nombreux essais mais nous y sommes arrivées !
Sources :
Pour écrire ce script, nous avons utilisé nos connaissances ainsi que le site python.org pour trouver de nouvelles commandes en python. Nous avons également regardé des projets de l’année dernière comme ceux qui sont dans la catégorie art.
Image finale :
Voici le rendu final de notre projet après avoir fait des tests, corrigé nos erreurs et pris du plaisir à coder !
Télécharger le script en .py :
Ne vous inquiétez pas, nous avons pensé à vous ! Vous pouvez télécharger le script ci-dessous pour vous amuser à le modifier ou tout simplement le montrer à vos amis !