Étiquette : image

Art

L’engrenage du temps

Dans notre projet de NSI de Novembre 2023, nos enseignants nous ont demandé de créer un programme informatique qui génère une image , en se concentrant sur le concept d’art génératif.

Présentation du sujet:

Partant du tableau des 42 thèmes abordés en classe, notre attention s’est focalisée sur la pendule, symbole puissant du temps. À partir de là, l’idée centrale du projet a émergé : “L’engrenage du temps” visant à représenter à l’aide de turtle notre image du temps .

Sur la représentation que nous avons, on peut observer plusieurs composants tels qu’une pendule, un engrenage, un dégradé et un disque. Nous allons les examiner en détail au fil de la présentation.

Analyse du script:

Le fond : 

def degradé():
    turtle.colormode(255)
    turtle.speed(0)
    global compt
    global fr
    global fg
    global fb
    while compt != 350 :
        turtle.pendown()
        turtle.pencolor(fr, fg, fb)
        turtle.pensize(3)
        turtle.forward(510)
        turtle.penup()
        turtle.right(180)
        turtle.forward(510)
        turtle.right(90)
        turtle.forward(1)
        turtle.right(90)
        fr += 1
        fg += 1
        fb += 1
        compt += 1
        if compt > 200:
            fr -= 1
            fg -= 1
            fb -= 1           

Pour commencer, nous avons programmer le fond avec un dégradé allant du noir au gris.

Dans la fonction dégradé il y a une boucle qui se répète 350 fois dans laquelle la tortue dessine ligne après ligne le dégradé en indentant les variables r,g,b de 1 a chaque ligne sans jamais dépasser la valeur 200.

Engrenages:

def n_engrenage(trait):
    turtle.left(90)
    turtle.forward(trait * 2)
    turtle.right(45)
    turtle.pencolor(couleur)
    turtle.pensize(8)
    turtle.fillcolor(couleur)
    turtle.begin_fill() 
    for i in range(12):
        turtle.forward(trait)
        turtle.right(120)
        turtle.forward(trait)
        turtle.left(90)
    turtle.end_fill()

La fonction “n_engrenage” dessine l’ engrenage à l’aide du module turtle.

La boucle “for” fait répéter 12 fois une suite d’instructions qui dessinent l’engrenage puis la fonction “turtle.fillcolor” viens définir la couleur de remplissage de l’engrenage qui débute et se finit grâce aux fonctions  “turtle.begin_fill” et “turtle.end_fill”.

Pendule: 

def disque(rayon, x, y, couleur=(1, 1, 1)):
    penup()
    goto(x, y - rayon)
    pendown()
    pencolor(couleur)
    fillcolor(couleur)
    begin_fill()
    circle(rayon)
    end_fill()

x = 25  
y = 175
radius = 30
color = (255, 255, 0)  

disque(radius, x, y, color)

import turtle

pen = turtle
pen.penup()
pen.goto(65, 190)
pen.pendown()
pen.pencolor("black")
pen.goto(175, 350)

import turtle #fonction courbe

t = turtle

t.penup()
t.goto(90,173)
t.pendown()
t.right(50)
for i in range(55):
    t.forward(1)
    t.right(1)


import turtle #fonction courbe 2

t2 = turtle

t2.penup()
t2.goto(100,180)
t2.pendown()

t2.right(290)
for i in range(75):
    t2.forward(1)
    t2.right(1)


turtle.hideturtle()

Pour fabriquer la pendule, nous avons commencé avec un plan donné par nos professeurs de NSI. Il comportait plusieurs disques placés de façon aléatoire. Ensuite, nous l’avons simplifié en utilisant les instructions « begin_fill() » et « end_fill() » pour remplir les disques. Ensuite, nous avons ajouté une simple ligne en spécifiant un point de départ et un point d’arrivée. Enfin, nous avons inclus deux courbes pour donner l’impression que la pendule bougeait.

Les problèmes rencontrés:

Parmis les nombreux problèmes rencontrés il y avait que l’exécution de la fonction dégradé prenait très longtemps a finir de s’exécuter (env 1min), pour ne pas perdre temps à relancer tout le code a chaque modification on a trouvé la solution de mettre un “#” devant la ligne qui exécutait la fonction dégradé ce qui permettait de faire passer cette ligne pour un commentaire et de simplement enlever le  # quand on voulait exécuter le script complet.

L’image final:

Art

Le système solaire

Pour le projet que nous avons dû réalisé sur l’art génératif nous avons choisi le thème du système solaire de façon plus revisité.

La création du fond :

Le fond ici est un ensemble de cercle qui forme plusieurs dégrader de violés comme ci-dessous :

from turtle import *
import secrets

def disque(rayon, x, y, couleur=(1, 1, 1)):
  penup()
  goto(x, y-rayon)
  pendown()
  pencolor(color)
  circle(rayon)


#fond

list_color2=["#AC00D7", "#9B00C1", "#9A00C2", "#9800BF", "#8D00B0", "#8300A4", "#770095", "#690083", "#500064", "#400050", "#23002C", "#400050", "#500064",  "#690083", "#770095", "#8300A4", "#8D00B0", "#9800BF", "#9A00C2",  "#9B00C1", "#AC00D7",]

x = 0
y = -45
radius = 1100

color_index = 0

while radius >= 0:
    speed(400)
    color = list_color2[color_index] 
    fillcolor(color)
    begin_fill()
    disque(radius, x, y, color)
    end_fill()
    radius-=5
    color_index = (color_index + 1) % len(list_color2)</code>

Les axes de rotations des planètes :

Les axes ici en blanc représentantes le positionnement des astres dans le système solaire on les a codé en plusieurs étapes.

from turtle import *
import secrets

def disque(rayon, x, y, couleur=(1, 1, 1)):
  penup()
  goto(x, y-rayon)
  pendown()
  pencolor(color)
  circle(rayon)


#fond

list_color2=["#AC00D7", "#9B00C1", "#9A00C2", "#9800BF", "#8D00B0", "#8300A4", "#770095", "#690083", "#500064", "#400050", "#23002C", "#400050", "#500064",  "#690083", "#770095", "#8300A4", "#8D00B0", "#9800BF", "#9A00C2",  "#9B00C1", "#AC00D7",]

x = 0
y = -45
radius = 1100

color_index = 0

while radius >= 0:
    speed(400)
    color = list_color2[color_index] 
    fillcolor(color)
    begin_fill()
    disque(radius, x, y, color)
    end_fill()
    radius-=5
    color_index = (color_index + 1) % len(list_color2)


#cercle blanc

x, y = (0,-45)
radius = (410)
color = ("white")
disque(radius, x, y, color)   

x, y = (0,-45)
radius = (370)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (330)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (290)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (230)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (200)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (170)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (140)
color = ("white")
disque(radius, x, y, color) 

La créations du soleil :

le soleil est l’astre qui nous permet de nous réchauffer donc les couleurs chaudes et vive est ce qui allait le mieux avec le soleil.

from turtle import *
import secrets

def disque(rayon, x, y, couleur=(1, 1, 1)):
  penup()
  goto(x, y-rayon)
  pendown()
  pencolor(color)
  circle(rayon)


#fond

list_color2=["#AC00D7", "#9B00C1", "#9A00C2", "#9800BF", "#8D00B0", "#8300A4", "#770095", "#690083", "#500064", "#400050", "#23002C", "#400050", "#500064",  "#690083", "#770095", "#8300A4", "#8D00B0", "#9800BF", "#9A00C2",  "#9B00C1", "#AC00D7",]

x = 0
y = -45
radius = 1100

color_index = 0

while radius >= 0:
    speed(400)
    color = list_color2[color_index] 
    fillcolor(color)
    begin_fill()
    disque(radius, x, y, color)
    end_fill()
    radius-=5
    color_index = (color_index + 1) % len(list_color2)


#cercle blanc

x, y = (0,-45)
radius = (410)
color = ("white")
disque(radius, x, y, color)   

x, y = (0,-45)
radius = (370)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (330)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (290)
color = ("white")
disque(radius, x, y, color) 

x, y = (0,-45)
radius = (230)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (200)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (170)
color = ("white")
disque(radius, x, y, color)

x, y = (0,-45)
radius = (140)
color = ("white")
disque(radius, x, y, color) 

#soleil

list_color=["yellow", "orange", "red", "orange", "yellow", "orange", "red"]

x = 0
y = -45
radius = 100

color_index = 0

while radius > 0:

    color = list_color[color_index]
    fillcolor(color)
    begin_fill()
    disque(radius, x, y, color)
    end_fill()
    radius-=1
    color_index = (color_index + 1) % len(list_color)


def arrondi_gauche():
  for i in range(180):
      left(1)
      forward(7/45)

def arrondi_droit():
  for i in range(180):
      right(1)
      forward(7/100)

Les planètes :

Un système solaire sans nos planètes n’est pas un vrai système solaire nous avons reproduit différent astres sur nos axes.

Art

Musique : The neighbourood wiped out !

En tant qu’admiratrices de l’album « wiped out ! » du groupe The Neighbourood, notre premier projet en NSI prend une dimension passionnante puisqu’on a choisi de représenter la pochette de cet album qui nous tient particulièrement à coeur.

Le commencement

Pour commencer, nous avons réalisé le fond noir et le cercle blanc qui se situe au centre. Nous avons ensuite placé le texte avec la bonne police d’écriture et la bonne taille au-dessus du cercle blanc. Nous devions aussi reproduire une petite maison à l’envers tout en bas de l’image en commençant par la base puis la cheminée et enfin le toit.

Les vagues et le sol

Pour créer les vagues, nous avons utilisé deux boucles for. Une première boucle sert à dessiner les arcs de cercle qui forment une ligne de vagues, puis une deuxième boucle permet de déplacer la tortue vers le bas pour dessiner la ligne de vagues suivantes. Cette approche répétitive nous permet de créer un motif de vagues continus en descendant d’une ligne à l’autre.

pensize(10)
goto(-300,0)
color("black")
pendown()
setheading(-35)

for i in range(9):
    for j in range(11):
         circle(35, 70)
         circle(-35, 70)
    penup()
    goto(-300, -20 * (i+1))
    pendown()

Il nous fallait aussi un sol qu’on a obtenu grâce à de nombreux cercles pour pouvoir ensuite déplacer la maison.

Le palmier avec les roches

Pour le palmier, on a d’abord dessiné des arcs de cercle pour créer le tronc incliné du palmier puis on a dessiné chaque feuille en utilisant la commande circle() avec des angles spécifiques pour créer la forme des feuilles. Les pierres ont été créées en combinant des formes géométriques superposées les unes aux autres.

L’oiseau

Pour dessiner un l’oiseau, on a dû crée les ailes, le corps, la queue, le bec et la tête de l’oiseau en utilisant des boucles, des lignes et des cercles.

Notre petite touche personnelle

Pour finir, on a rajouté notre petite touche personnelle, un ciel étoilé. Nous avons défini une fonction étoile pour générer 30 étoiles à des emplacements aléatoires.

def etoile():
    
    for i in range(5):
        forward(0.5)



pensize(2)
pencolor("white")

for i in range(30):
    x = randint(-400, 400)
    y = randint(100, 300)
    penup()
    goto(x, y)
    pendown()
    etoile()

CONCLUSION

Ce projet nous a permis de réaliser qu’on peut faire de très belle chose juste en ayant les bases de la programmation. On a pris beaucoup de plaisir à voir notre image se construire au fur et à mesure du temps. Cela nous a ouverts de nouvelles perspectives pour des projets futurs et nous avons hâte d’en apprendre davantage pour réaliser des créations encore plus techniques et impressionnantes.

RENDU FINAL

télécharger le .py

Art

Paysage japonais

Un paysage où un monument de la culture japonaise se mélange avec un fond naturel est magnifique. Et bien que le Japon soit le pays du soleil, levant nous allons le mettre en valeur avec, cette fois-ci, la lune, à travers des montagnes et des torii. Ces derniers symbolisent un portail entre l’enceinte sacrée et l’environnement profane. C’est pour cette raison qu’il y en a à l’entrée de certains sanctuaires.

Organisation du script

Notre script sera expliqué par étape, de l’arrière plan au premier. La fonction goto sera beaucoup utilisée afin de faire des tracés contrôlés ainsi que pensize() pour la largeur du tracé du stylo, color() pour choisir la couleur du crayon, circle() pour faire un cercle et for i in range pour faire des boucles.

L’arrière-plan

from turtle import*    
pensize (42)    
color("#FFFFFF")

a = -40   
col = ["#FFFFFF","#9BF7F7","#41F9FF","#00CDFF","#008FFF","#0059FF","#003AFF", "#4D00FF","#33079A", "#000000"]    
nb_col = len(col)    
color("#FFFFFF")   
goto(0, 50)    
circle(40)

a = 0  

for i in range (0,10,1):
    goto(0, 40-a)
    color(col[i%nb_col])
    circle(40+a)
    a = a +30
    goto(0, 40-a)
    circle(40+a)
    a = a +30
    goto(0, 40-a)
    circle(40+a)
    a = a +40

Ici, nous montrons que notre script est importé de Turtle, ce module nous permettant de contrôler un crayon pour tracer diverses formes géométriques.

Le fond de notre code n’est pas centré mais c’est fait exprès. Nous avons donc mis la taille du crayon à 42 avec la fonction : pensize (42), ensuite a = -40 nous a servis à déplacer le centre du cercle de base, soit, dans notre cas de le décaler vers la haut. Puis nous avons listé les différentes couleurs utilisées dans tous ces cercles avec col = [ ]. Le goto(0, 50) nous emmènera ensuite aux coordonnées données (donc (0, 50)) puis tracera des cercles de différentes tailles et de différentes couleurs grâce à la fonction cercle circle(40) et à la boucle for i in range (0,10,1):.

Les premières montagnes

color("#42392C")
goto(0, -80)
goto(100, 90)
goto(150,80)
goto(230,150)
goto(270,250)
goto(300,150)
goto(500,20)
goto(580,30)
goto(630,10)
goto(640,-40)
goto(0,-80) 

goto(0, -40)
goto(100,50)
goto(120,40)
goto(200,100)
goto(320,250)
goto(500,30)
goto(580,-10)
goto(630,20)
goto(640,-80)
goto(0,-70) 

goto(0, -40)
goto(120,40)
goto(200,80)
goto(320,230)
goto(500,00)
goto(580,00)
goto(630,000)
goto(640,-60)
goto(0,-50) 

goto(0, -40)
goto(120,33)
goto(200,60)
goto(320,210)
goto(500,00)
goto(580,00)
goto(630,000)
goto(640,-40)
goto(0,-20) 

goto(0, -40)
goto(120,20)
goto(200,50)
goto(320,190)
goto(500,00)
goto(580,00)
goto(630,000)
goto(640,-30)
goto(0,-10) 

goto(0, -40)
goto(120,00)
goto(200,20)
goto(320,170)
goto(500,00)
goto(580,00)
goto(630,000)
goto(640,-10)
goto(0,-00) 

goto(0, -40)
goto(120,00)
goto(200,10)
goto(320,160)
goto(580,00)
goto(630,000)
goto(640,-10)
goto(0,-00)  

goto(320,70)
goto(500,50)
goto(320,60)
goto(320,40)
goto(320,50)
goto(320,30) 

goto(0,-10)
goto(-200,50)
goto(-300,10)
goto(-430,160)
goto(-500,15)
goto(-600,250)
goto(-600,-10)

Nous comprenons ici que les goto sont et seront à l’honneur de ce script ! Ils sont simples à utiliser et donc à comprendre. La couleur des premières montagnes, elle, est encore une fois définie par color(« #42392C »).

Voici le résultat de tous ces goto ! Nous avons un début de montagne avec quelques imperfections mais pas d’inquiétudes ! Ce script fonctionne par plan donc comme un pochoir. Ici, les goto ont donc servis à diriger le stylo d’un point à un autre jusqu’à ce que nous ayons ce résultat

Encore des montagnes

color("#6F6556")
goto(0, 0)
goto(80,40)
goto(120,00)
goto(200,10)
goto(430,200)
goto(630,0)
goto(0,-00)

goto(0, 0)
goto(200,0)
goto(430,180)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(430,160)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(430,150)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,150)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,140)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,130)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,120)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,110)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,100)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,90)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,80)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,70)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,60)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,60)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,50)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,40)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,40)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,30)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,20)
goto(630,0)

goto(0, 0)
goto(200,0)
goto(400,10)
goto(630,0)

goto(0,0)
goto(0,-10)
goto(-200,30)
goto(-300,00)
goto(-400,150)
goto(-500,5)
goto(-600,200)
goto(-600,-10)
goto(0,0)

Ces montagnes sont faites de la même manière que les premières : le changement de couleur avec color(« #6F6556 ») et les goto ! Voyons maintenant le résultat en image…

Et voilà nos montagnes finies ! Mais il reste encore quelques étapes pour donner un sens à notre titre.

Le sol bleu

up()
goto(0,-400)
down()
col = ["#000000","#33079A","#4D00FF", "#003AFF", "#0059FF","#008FFF", "#00CDFF", "#41F9FF","#9BF7F7", "#FFFFFF","#9BF7F7","#41F9FF","#00CDFF","#008FFF","#0059FF","#003AFF","#4D00FF","#33079A","#000000"]
nb_col = len(col) 
recup = 0
k = -50
for i in range (0,50):
    color(col[i%nb_col])
    for i in range (0,3):
        k += 40
        goto(1000-k,-35)
        goto(1300-k,-500)

Comme pour l’arrière-plan, les couleurs sont définies grâce à col = [ ].

Avec l’image, nous pouvons plus facilement comprendre la présence de la boucle for i in range (0,50) qui nous a aidé à répéter tous les traits positionnés en diagonale pour nous éviter de les faire un à un avec des goto par exemple !

Les torii

pensize(42)
up()
goto(160,-220)
down()

color("#FF7000")
goto(160,100)
goto(-160,100)
goto(-160,-220)
goto(-160,100)
goto(-220,100)
goto(220,100)
goto(160,100)
goto(160,160)
goto(160,100)
goto(-160,100)
goto(-160,160)
goto(-220,160)
goto(220,160)

pensize(25)
up()
goto(80,-150)
down()

color("#E76E00")
goto(80,20)
goto(-80,20)
goto(-80,-150)
goto(-80,20)
goto(-120,20)
goto(120,20)
goto(80,20)
goto(80,60)
goto(80,20)
goto(-80,20)
goto(-80,60)
goto(-120,60)
goto(120,60)

pensize(12)
up()
goto(40,-120)
down()

color("#CB6100")
goto(40,-30)
goto(-40,-30)
goto(-40,-120)
goto(-40,-30)
goto(-60,-30)
goto(60,-30)
goto(40,-30)
goto(40,-10)
goto(40,-30)
goto(-40,-30)
goto(-40,-10)
goto(-60,-10)
goto(60,-10)

pensize(6)
up()
goto(20,-100)
down()

color("#A95100")
goto(20,-60)
goto(-20,-60)
goto(-20,-100)
goto(-20,-60)
goto(-30,-60)
goto(30,-60)
goto(20,-60)
goto(20,-50)
goto(20,-60)
goto(-20,-60)
goto(-20,-50)
goto(-30,-50)
goto(30,-50)

Voici le code de nos torii. A chaque nouveau pensize( ), il y en a un nouveau ! Nous avons d’abord le placement du crayon avec up( ), goto( ) et down( ) dans cet ordre là. Cela permet de se déplacer en décidant quand nous voulons écrire.

Cette fois-ci, l’image est sans le fond pour mieux observer le choix de couleur ainsi que les tailles décroissantes.

Le résultat final

Et enfin, notre résultat ! Nous avons également rajouté deux ligne, une verte et une marron pour montrer le début des montagnes mais ces lignes servent aussi à cacher la délimitation qu’il y avait pour les traits droits en diagonale.

Télécharger le .py

Art

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()

Télécharger le projet

Projets

Cinéma: Matrix et le binaire

« Are you telling me I can dodge bullets ? » Neo, The matrix. Cette citation représente la base de notre projet dans lequel est présenté le personnage Neo au visage hélicoïdal stoppant les balles sur un fond de chiffres binaires aléatoirement positionnés.

I – Le fond

Premièrement, le fond nous semblait être la partie la plus importante du projet. Nous avons donc commencé par poser un fond noir avec les lignes de code suivantes

color('black')
pensize(2000) #peu conventionnel 😅
goto(-635, 350)
forward(700)

Après cela, nous y avons superposé les caractères 1 et 0 que nous avons définis avec le code suivant.

def un():
    pensize(2)
    color('green')
    setheading(60)
    forward(12)
    setheading(270)
    forward(20)

def zero():
    setheading(90)
    circle(8)

Nous avons ensuite créé une suite de boucle pour placer aléatoirement des 1 et des 0 en colonnes. Pour cela, nous avons utilisé le module « random » avec la fonction « random.choice » pour sélectionner aléatoirement un nombre dans une liste prédéfinie, ensuite, une condition nous a permis de placer les chiffres. Pour ordonner ces derniers, une incrémentation aux coordonnées déjà inscrites (définissant la position du premier caractère posé) à la fin de chaque boucle a été nécessaire. Voici le code

y = 330
x = -620
    
for i in range(50):
    penup()
    goto(x, y)
    pendown()
    
    for i in range(20):
        list1 = [1,2]

        if random.choice(list1) == 1: 
            un()
        else:
            zero()
            
        penup()
        goto(x, y - 40 * (i + 1))
        pendown()
        
    x += 25 #incrémentation de la distance entre chaque colonnes (horizontalement)
    

Voici le résultat du fond finalisé :

II – Le personnage, Neo

1 – La main

La main était aussi une partie importante de l’image : elle constitue le point de fuite centrale de l’image, où se dirige toutes les balles. Voici la main, constituée de lignes plus ou moins courtes (doigts) et d’un cercle (paume).

2 – Le corps

Nous avons donc créé le corps d’un homme bâton, avec de simples lignes et un cercle pour la tête. Voici le code :

def corps():
    pensize(5)
    color('white')
    penup()
    goto(0,-70)
    pendown()
    setheading(90)
    left(110)
    forward(180)
    left(25)
    forward(80)
    left(180)
    forward(80)


    setheading(90)
    forward(40)
    right(180)
    forward(150)
    setheading(90)
    right(150)
    forward(90)
    left(180)
    forward(90)
    setheading(90)
    left(150)
    forward(90)
    right(180)
    forward(90)
    setheading(90)
    forward(150)

    right(90)
    circle(50)
    penup()
    setheading(90)
    forward(50)
    pendown()
corp()

Voici le rendu :

3 – La spirale

Pour créer cette spirale, il n’a suffit que de 2 lignes, avec une boucle for :

for i in range(48):
    circle(i,20) # i est donc augmenté a chaque répétition 

Le rendu fut le suivant :

III – Les balles

Pour créer les balles, nous avons créé une fonction, en utilisant les méthodes « begin_fill » et « end_fill » permettant de remplir tout ce que l’on dessine en trait. Voici le code :

def balle():
    pensize(3)
    color('#A9A9A9')
    begin_fill()
    forward(30)
    left(143)
    forward(27)
    left(110)
    forward(15)
    end_fill()
    left(180)
    forward(7)
    color("grey")
    begin_fill()
    circle(10)
    end_fill()

Voici le résultat

Pour créer plus de dynamisme, nous avons opté pour des tirets, encore avec une fonction, appelées (comme les balles) plusieurs fois. Nous avons donc créé une boucle for, se répétant 18 fois :

def tiret():
    for i in range(18):
        pensize(7)
        color("white")
        forward(5)
        penup()
        forward(15)
        pendown()

Pour une balle, nous avons combiné les deux fonctions en les appelant de la sorte :

penup()
left(50)
goto(300,-150) 
pendown()
balle()
penup()
left(90)
forward(30)
pendown()
tiret() 
right(90)

Nous avons répété ce pattern sept fois, en changeant leurs positions (goto).

IV – L’image finale

V – Les problèmes rencontrés

Le seul ‘problème’ qu’on a rencontré fut pour le fond, pour utiliser le module random dans une liste, mais nous avons relu nos exercices sur ce thème et avons facilement trouvé la solution.

VII – Télécharger le .py

Nous vous mettons au défi d’optimiser ce code au maximum, sans changer le rendu.

Projets

Un accord céleste

La musique occupe une place centrale dans la vie contemporaine, transcendant les frontières culturelles et générant des émotions universelles. De nos jours, elle est omniprésente, accompagnant nos moments forts et ponctuant notre quotidien grâce à la facilité d’accès aux plateformes numériques. Au-delà d’un simple divertissement, la musique forge des identités, crée des communautés et offre un refuge émotionnel, devenant ainsi une véritable toile sonore de nos vies modernes.

Pourquoi cet accord ?

Il s’agit d’un do majeur 7 add 11 (Cmaj7add11). C’est un accord rarement utilisé en musique, il est le plus souvent utilisé dans le Jazz. Cet accord est beau à entendre car il est très coloré. Il s’agit d’un accord à 5 notes./

Pourquoi un accord ?

Nous avons choisi de représenter un accord sur une portée car nous sommes tous les trois reliés par la musique. Lowan et Loris faisant principalement du piano et Maceo de la guitare. Nous faisons tous les trois partie de l’option musique qui est l’option la plus intéressante du lycée proposée par l’un des meilleurs professeurs Monsieur CLÉMENTE. Pour cela Nous avons d’abord dessiné La portée à l’aide de ce code ci : 

def draw_staff():
    for i in range(5):
        penup()
        goto(-200, 50 - i * 20)
        pendown()
        forward(400)


def draw_note(x, y):
    penup()
    goto(x, y)
    pendown()
    circle(10)

draw_staff()

On a défini une fonction draw_staff où l’on a intégré une boucle de sorte à ce que la tortue fasse la première ligne, puis reviennent au point de départ pour ensuite descendre et répéter cette opération se répétera 4 autres fois car sur une portée il y a 5 lignes.

pensize(5)
seth(115)
circle(-30, 220)
circle(-50, 220)
forward(70)
circle(50,100)
seth(-145)
circle(50, 58)
forward(200)
circle(-30, 180)
begin_fill()
circle(-10)
end_fill()
hideturtle()

ensuite nous avons dessiné la clef de sol à l’aide de ce code ci-dessus. On a d’abord commencé par définir la taille de la clef et mis les valeurs correspondantes pour faire les bonnes boucles.

Pourquoi ce fond ?

Pour le fond nous avons représenté des étoiles aléatoirement disposées sur un fond dégradé bleu et noir qui représente le ciel. Nous nous sommes inspirés de l’album Geography de Tom Misch puis nous avons changé les couleurs pour arriver à un dégradé de couleur bleu. Nous nous sommes inspirés du travail d’un première de la spécialité NSI.

Album de Tom Misch : https://www.youtube.com/watch?v=dA9mzvPtp5I

goto(-400, -300)
pendown()

for i in range(600):
    pencolor(0,0, 255-round((i/(600/255))))
    forward(800)
    goto(-400,-300+i)

Analyse du script :

Le script se divise en 3 parties : Il y a la première partie, les étoiles sur le fond dégradé, ensuite par dessus nous avons rajouté la portée blanche avec les notes et pour terminer une clef de sol.

Le rendu final du script : 

voici l’entièreté de notre script python qui va générer notre image ; « l’accord céleste »

from turtle import *
from random import *
Screen()
setup(800, 600)
penup()
colormode(255)
speed(0)
goto(-400, -300)
pendown()

for i in range(600):
    pencolor(0,0, 255-round((i/(600/255))))
    forward(800)
    goto(-400,-300+i)
color("white")
def etoile(taille):
  for i in range(5):
    pensize(uniform(0.1, 2.5))
    forward(taille)
    right(144)
for i in range(200):
  x = randint(-400, 400)
  y = randint(-250, 250)
  couleur = randint(0, 2)
  if couleur == 0:
    color("#D68B0F")
  elif couleur == 1:
    color("#EBEBAB")
  else :
    color("#A7C706")
  penup()
  goto(x, y)
  pendown()
  taille = uniform(0.1, 2)
  etoile(taille)


shape("arrow")
color("white")
speed(0)

def draw_staff():
    for i in range(5):
        penup()
        goto(-200, 50 - i * 20)
        pendown()
        forward(400)


def draw_note(x, y):
    penup()
    goto(x, y)
    pendown()
    circle(10)

draw_staff()


draw_note(-150, -30)
penup()
goto(-159, -30)
pendown()
setheading(270)
backward(100)


draw_note(-100, 10)
penup()
goto(-100, 10)
pendown()
setheading(270)
backward(100)

draw_note(-50, -10)
penup()
goto(-50, -10)
pendown()
setheading(270)
backward(100)

draw_note(0, -30)
penup()
goto(0, -30)
pendown()
setheading(270)
backward(100)

draw_note(50, -50)
penup()
goto(50, -50)
pendown()
setheading(270)
backward(100)
penup()
goto(-159, 70)
pendown()
left(124)
forward(71)
penup()
goto(-300, 0)
pendown()

pensize(5)
seth(115)
circle(-30, 220)
circle(-50, 220)
forward(70)
circle(50,100)
seth(-145)
circle(50, 58)
forward(200)
circle(-30, 180)
begin_fill()
circle(-10)
end_fill()
hideturtle()
Art

Un arbre fractale

La fractale est couramment sélectionnée comme thème pour la création d’images en raison de sa capacité à produire des motifs d’une complexité infinie et captivante. Cette fusion entre l’art et les mathématiques permet de représenter de manière créative la beauté des structures complexes, qu’elles soient naturelles ou urbaines.

Projet

Donc pour le projet nous avons décider de faire une fractale (l’arbre de Pythagore) sur un dégradé et faire un petit soleil sur le coté haut droit de l’image. Pour cela nous avons mis les script grâce à la bibliothèque turtle.

Le script

Donc pour faire le script nous nous aidons de la bibliothèque turtel. Mais tous les structure construise sont faite grâce à « def ». Nous avons donc du tous les appels a la fin un part un de manier logique et ordonné.

Le script en detailer

from turtle import *
import turtle
from random import randint
from PIL import Image
try:
    from PIL import Image
    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. https://learn.microsoft.com/fr-fr/windows/win32/fileio/naming-a-file
titre = "Fractale - Un arbre fractaleà"

# 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, abscisse départ, ordonnée du départ)
setup(1280, 720) 
colormode(255) 
speed(0)

Tout d’abord « setup(1280, 720) » aident à configurer la fenêtre graphique Turtle pour votre dessin fractal, en lui donnant une taille spécifique (1280×720 pixels)

Puis colormode(255) serre à modifié le mode de couleur pour le rendre plus lisible (de 0 à 255 pour RGB)

Et enfin speed(0) serre à régler la vitesse de dessin pour qu’elle soit la plus rapide possible (vitesse 0).

Le fond:

def fond():
    penup()
    rciel = 0
    gciel = 0 
    bciel = 0
    hauteur = -360
    goto(-642,-358)
    pendown()
    while hauteur != 360:
        pencolor(round(239 + rciel), round(200 + gciel), round(209 + bciel))
        forward(1280)
        hauteur += 1
        goto(-640, hauteur)
        rciel += (-29/180)
        gciel += (2/45)
        bciel += (7/720)

Cette fonction « fond() » dessine un ciel en dégradé en utilisant une boucle « while » pour créer des bandes horizontales de couleur qui simulent un dégrade sur un ciel . Les composantes de couleur « rciel » « gciel » « bciel » changent progressivement à mesure que la hauteur augmente, créant un effet de transition de couleur réaliste.

La fractale arbre

def arbre(n,longueur):
    down()
    if n==0:
        color('green')
        forward(longueur) # avance
        backward(longueur) # recule
        color('#3f1905')
    else:
        width(n)
        forward(longueur/3) #avance
        left(angle) # tourne vers la gauche de angle degrés
        arbre(n-1,longueur*2/3)
        right(2*angle) # tourne vers la droite de angle degrés
        arbre(n-1,longueur*2/3)
        left(angle) # tourne vers la gauche de angle degrés
        backward(longueur/3) # recule

La fonction arbre à deux paramètres « n" et « longueur » pour contrôler le niveau de récursion et la longueur de la branche.

La condition « if n == 0 » permet de voir le cas de base dais que la profondeur de récursion atteint zéro.

En résumé, ce code utilise la récursion pour faire une fractale d’arbre, créant des branches qui se divise en sous-branches. Le niveau de récursion contrôle le détail de l’arbre, et la longueur de la branche diminue à chaque niveau, formant ainsi une structure d’arbre sur la base d’une fractale.

Le soleil

def soleil():
    speed(0)
    i = 0
    goto(-590, 305)
    while i < 200:
        down()
        color('#FF8C00')
        right(90)
        forward(55)
        right(180)
        forward(55)
        right(90)
        circle(5, 2)
        i = i + 1

Ce processus est répété jusqu’à ce que i atteigne 200 créant une série de formes qui se superposent pour former une figure qui ressemble à un soleil.

fond()

hideturtle() # cache la tortue
up() # lève le stylo
right(90) # tourne de 90 degrés vers la droite 
forward(300) # avance de 300 pixels
left(180) # fait un demi-tour
goto(0,-350)
angle = 50
color('#3f1905')
arbre(11,700) # exécute la macro

hideturtle() # cache la tortue
up() # lève le stylo
soleil()

On appelle tout les fonction maintenant

Vers le PNG

image = getcanvas()
Fractale=titre+"_"+hex(randint(2**30+2**25,2**30+2**25+2**24-1))[2:]

# Génère un fichier .ps
image.postscript(file=Fractale+".ps", colormode='color')

# Ouvre le fichier .ps et génère le fichier .png
psimage = Image.open(Fractale+".ps")
psimage.save(Fractale+".png")

Téléchargement du programme

Art

Astronomie : Voyage dans les étoiles

Observer les étoiles, c’est contempler l’immensité et percer les mystères de l’Univers : « À travers ses télescopes, l’astronomie sonde l’immensité de l’espace, révélant des mondes lointains et des mystères insoupçonnés. Elle nous invite à explorer l’infini, à contempler les astres, les étoiles et à comprendre l’origine de l’univers, suscitant l’émerveillement et la soif de connaissance « (Extrait du livre « Le grand guide de l’astronomie « )

Qu’est ce que l’Astronomie ?

L’astronomie… c’est comme une énorme chasse au trésor dans le ciel, mais avec des étoiles, des planètes et des galaxies ! On apprend à étudier les astres, les étoiles, à comprendre comment elles naissent et évoluent, on étudie aussi leurs propriétés physiques et chimiques.

Pourquoi avons-nous choisi le thème de l’astronomie ?

Tout simplement parce que l’Astronomie est un sujet fascinant, qui captive. Cette science permet d’explorer l’immensité de l’univers, les mystères des étoiles, des planètes et des galaxies. Choisir l’astronomie pour un projet offre une opportunité de découverte, d’apprentissage et d’inspiration.

Les différents problèmes...

Bien évidemment, il y a toujours des problèmes rencontrés lors d’un DM.

Le premier problème a été la communication. En effet, travailler en groupe est toujours compliqué…

Le deuxième problème a été d’assembler les scripts, un message d’erreur apparaissait à chaque fois. La plupart de ces erreurs étaient l’orthographe. En effet, chaque professionnel fait des erreurs…

Ensuite nous avons eu pour les montagnes un bug graphique sur le remplissage qui n’apparaissait que sur le dossier PNG ce qui rendait assez lourd le script sur les montagnes avec « begin_fill() » et « end_fill() »

Analyse du script

Afin d’analyser ce script, nous allons le découper en plusieurs parties, correspondantes aux différentes étapes.

1-Avant de détailler chaque fonction, il faut s’assurer que le script comporte tous les modules nécessaire à la création de l’image.

from turtle import *
from PIL import Image, ImageDraw
from random import randint

titre = "Astronomie - construite avec turtle"


title(titre + " | Au lycée, la meilleure spécialité, c'est la spé NSI")

setup(1280, 720, 0, 0)
speed(0)
goto(0,-200)

On importe les modules PIL (installés auparavant) afin de travailler avec des images, turtle afin de dessiner des formes géométriques sur l’image, et enfin randint afin de générer des nombres aléatoires. Après avoir importé tous ces modules, on définie un titre, ici Astronomie. Ensuite, on définit les titres de la fenêtre graphique. On définit alors la résolution de l’image, ici 1280×720 pixels. On définit aussi la vitesse. Enfin, on place la tortue à la position de départ.

2- Le fond

for i in range(hauteur_degrade):
    bleu_fonce = 0.1 + (i / hauteur_degrade) * 0.8 
    ciel.color(0, 0, bleu_fonce)
    ciel.penup()
    ciel.goto(x, y)
    ciel.pendown()
    ciel.forward(largeur_degrade)
    y -= 1

Afin de réaliser le fond de l’image, nous avons décidé de commencer la réalisation de l’image par une fenêtre noire similaire au lever d’un rideau, nous avons ensuite réalisé un dégradé de bleu similaire à un coucher de soleil à l’aide de chatgpt.

3-Les étoiles

def etoiles():
    for _ in range(42):
        speed(0)
        penup()
        x = randint(-600, 600)
        y = randint(-300, 300)
        penup()
        goto(x, y)
        pendown()
        dot(8, "orange")
        
etoiles()

Ne pas faire d’étoile sur une image qui porte sur l’Astronomie, ce n’est pas de l’Astronomie ! Afin de réaliser des étoiles aléatoirement, nous avons utilisé randint. Nous avons bien évidemment pensé a Halloween et pour cela, nous avons réalisé des étoiles en orange.

4-Les astres

Nous avons réalisé deux astres : le soleil et la lune.

def planète():
    speed(0)
    penup()
    goto(300, 250)  
    pendown()
    color("red")
    begin_fill()
    circle(50)  
    end_fill()
hideturtle()
planète()
penup()
goto(0,-200)
pendown()
fillcolor("white")
begin_fill()
circle(180)
end_fill()

Toujours dans le thème d’Halloween, nous avons décidé de faire le soleil rouge.

5-Le sol

Les montagnes, ça ne volent pas, et pour cela, nous avons mis un sol qui est en fait un rectangle en turtle.

def sol():
         for i in range(2):
             color("black")
             forward(1280) 
             left(90)
             forward(250)
             left(90)
sol()

6- Les montagnes :

Elles sont seulement constituées de triangle les uns à la suite des autres par une boucle. Nous avons mis à certains moments une légère inclinaison du triangle dans la boucle afin de créer un effet de montée

def triangle():
    forward (150) 
    left (120)
    forward (150)
    left (120)
    forward (150)


goto(-640,-200)

def montagne_plane():
         for i in range(50):
             begin_fill()
             triangle()
             left(300)
             backward(1)
             left(180)
             end_fill()
begin_fill()             
montagne_plane()
end_fill()
def montagne_ascendante1():
        for i in range(50):
             begin_fill()
             triangle()
             left(300)
             backward(4)
             left(180)
             left(0.2)
             end_fill()
montagne_ascendante1()

def montagne_ascendante2():
    for i in range(10):
        begin_fill()
        triangle()
        left(300)
        backward(10)
        left(180)
        left(2)
        end_fill()
montagne_ascendante2()

begin_fill() 
#triangle venant juste apres la montée
right(25)
goto(-310,-130)
triangle()
# recalibrage afin de pouvoir continuer l'algorithme
left(300)
backward(10)
left(180)
left(2)
end_fill()
# je fait redescendre legerement la montagne
goto(-290,-200)
for i in range(10):
     begin_fill()
     triangle()
     left(300)
     backward(4)
     left(180)
     end_fill()
for i in range(6):
     begin_fill()
     triangle()
     left(300)
     backward(4)
     right(5)
     end_fill()


left(8)
def montagne_ascendante3():
  for i in range(40):
       begin_fill()
       triangle()
       left(300)
       backward(7)
       left(180)
       left(1)
       end_fill()
montagne_ascendante3()
        
begin_fill()
right(25)
goto(150,-130)
triangle()

goto(150,-220)
left(300)
backward(10)
left(180)
left(1)
end_fill()


for i in range(2):
      montagne_ascendante1()

L’image finale

Le fichier.py

Art

Paysage : un coucher de soleil

Les couchers de soleils vous fascinent ? Vous êtes ici au bon endroit pour apprendre à créer des levers et couchers de soleil de votre choix sans devoir attendre le crépuscule. Je vous explique en détail mon script qui permet de générer une image avec le module turtle en python.

Les prémices du projet

Dans un premier temps, j’ai longtemps réfléchi à ce que je pouvais faire pour le projet libre de cette fin d’année. Je me suis décidée à refaire une image générée par le module turtle en python. Effectivement, notre tout premier projet de l’année était le même, néanmoins j’avais tout de suite commencé très fort en faisant des fractales. Certains vous diront que cela est facile, mais mon niveau de début d’année ne me permettait pas de tout comprendre. Ce qui m’a frustré. Je me suis donc décidée à refaire une image avec mon niveau actuel (qui est encore débutant !) pour pouvoir gérer la conception de A à Z.

Par conséquent, le script et l’image peuvent vous paraître assez simple. Cependant, j’ai souhaité m’inspirer du projet https://nsi.xyz/art/urbanisme-la-skyline-de-new-york/ qui se rapproche du flat design (ils l’expliquent très bien dans leur article). Le rendu final est donc très épuré et très simple.

Le code

Pour concevoir cette image, j’ai procédé par étapes pour créer le code. En découpant mon image, en plusieurs parties.

Le fond

Tout d’abord, j’ai codé le fond c’est-à-dire le coucher de soleil. L’espace utilisé est découpé en morceau rectangulaire. Puis pour chaque rectangle est associé une couleur. Je définis donc en premier mes neuf couleurs. Ensuite, j’utilise une boucle for, qui prend à chaque itération de la boucle la couleur suivante contenu dans la liste couleur.

def coucherdesoleil():
    couleur = ["#FFBA08",
               "#FAA307",
               "#F48C06",
               "#E85D04",
               "#DC2F02",
               "#D00000",
               "#9D0208",
               "#6A040F",
               "#370617"]
    penup()
    goto(640,-300)
    setheading(180)
    pendown()
    
    for fond in couleur: # ChatGPT m'a aidé sur cette ligne et la ligne suivante
        color(fond)
        begin_fill()
        forward(1280)
        right(90)
        forward(74)
        right(90)
        forward(1280)
        end_fill()
        
        left(180)

Le résultat :

Les étoiles

Puis, je crée une fonction qui permet de dessiner des étoiles. Elle prend en paramètre la longueur des branches, et l’emplacement de l’étoile, tout en définissant sa couleur.

def etoile(longueur, x, y):
    goto(x,y)
    pencolor("#DF7B0A")
    pendown()
       
    left(50)
    for i in range(5):
        forward(longueur)
        right(144)
    
    penup()

Je souhaitais que les étoiles se situent seulement en haut du ciel, tout en se positionnant de façon aléatoire, et de taille aléatoire. Ainsi par la boucle for , dix étoiles sont créées avec des paramètres précis (taille et position) mais de façon aléatoires.

for i in range(10):
    etoile(randint(5,15), randint(-630,630), randint(293, 350))

Le résultat :

Le soleil

Ensuite, le script exécute la fonction créant le soleil. Il se positionne à des coordonnées précises, je positionne le curseur en direction du haut de l’image : setheading(90), puis j’utilise la fonction prédéfinie du cercle, en indiquant la taille du rayon et si je souhaite un demi-cercle ou un cercle.

def soleil():
    goto(-115, -285)
    fillcolor("#FFC93E")
    begin_fill()
    setheading(90)
    circle(70, 180)
    end_fill()

Le résultat :

Les montagnes

Pour cette fonction, je me suis inspirée voir même j’ai repris la boucle créant l’ondulation des montagnes de mon ancien projet https://nsi.xyz/art/jardins-foret-enneigee/. Afin de créer une montagne, il faut lui donner comme paramètres d’entrée sa position initiale et finale (pour qu’ensuite elle puisse être remplie), la couleur, la direction, l’angle et la longueur des vagues.

De plus, pour varier la taille des montagnes, j’ai utilisé un test conditionnel afin de modifier l’inclinaison en fonction de sa position initiale.

Enfin, la boucle for permet de créer une vague, qui se répètent trois fois, formant une ondulation.

def rocher(x1, y1, x2, y2, couleur, direction, angle, vague1, vague2):
    fillcolor(couleur)
    pencolor(couleur)
    goto(x1,y1)
    if direction == 0:
        setheading(0)
        right(angle)
    else:
        setheading(direction)
        left(angle)   
    
    begin_fill()

    pendown()
    for i in range (3): # boucle repris de mon ancien projet https://nsi.xyz/art/jardins-foret-enneigee/
        for i in range (5):
            forward(vague1)
            right(2)
        for i in range (5):
            forward(vague2)
            left(2)
    
    goto(x2,y2)
    
    penup()
    end_fill()

Le résultat final

Les problèmes rencontrés et leurs solutions

Le premier problème était que les montagnes ne s’arrêtaient pas toutes à la même ligne, il y avait donc des débordements en dehors du cadre. Ma solution a été de créer une ligne blanche repassant sur ces débordements. Je pense qu’il y avait sûrement une solution ou un bout de code permettant de stopper les boucles quand elles arrivaient à un certain endroit, mais j’ai préféré utiliser cette méthode.

Le deuxième problème a été l’emplacement des étoiles. Effectivement, au début vingt étoiles étaient créées avec des emplacements aléatoires, par conséquent il y avait des superpositions. J’ai donc décidé de réduire le nombre, afin que les étoiles aient moins de chance d’obtenir la même position.

Le troisième problème n’en est pas vraiment un, mais cela était plutôt un souhait que je n’ai pas réussi à effectuer. En effet, je souhaitais faire un beau dégradé pour le coucher de soleil. J’en avais vu un sur cet article https://nsi.xyz/art/perspective-un-paysage-synthwave/ j’ai longtemps essayé de comprendre la fonction et j’ai même demandé à ChatGPT, mais sans succès. J’ai donc décidé de ne pas copier coller un code que je ne comprenais pas et j’ai laissé le coucher de soleil actuel.

Mes sources

J’ai principalement codé avec mes connaissances, les cours de NSI et les anciens projets disponibles sur le site https://nsi.xyz/. Toutefois, j’ai eu besoin de faire des recherches et j’ai utilisé ChatGPT à plusieurs reprises pour qu’il me montre mon erreur lorsque je ne comprenais pas le message d’erreur ou quand je ne comprenais pas tout à fait les explications que je trouvais sur internet.

Conclusion

En conclusion, je suis très fière de mon image. Même si son codage est effectué avec les base de la programmation et peut paraître facile. J’ai pris plaisir à programmer, comprendre, corriger toute seule mes erreurs, afin de concevoir une image propre à mes connaissances et à mes envies.

Télécharger le .py

Si vous souhaitez générer l’image et l’utiliser comme fond d’écran n’hésitez pas à télécharger le fichier ci-dessous.