Aller au contenu

Programmation

Ce thème a pour objectif de vous faire acquérir les bases de la programmation, à travers du dessin paramétrique avec Turtle.

A la fin des quelques chapitres que comporte ce thème, vous serez capable de réaliser des dessins simples avec une grande efficacité, et surtout une grande souplesse !

Mais qu'est-ce qu'il raconte ?

Le but du dessin paramétrique est de pouvoir modifier facilement des aspects (les paramètres) d'un dessin.

Par exemple : le nombre de maisons, la couleur des sapins, la taille des montagnes, ...

Et ensuite, à laisser le programme re-générer le dessin à chaque modification.

Par exemple, pour passer de ça :

alt text

A çà :

alt text

Il faut quelques secondes !

Code de démo

Le code avec sa configurataion de base :

from turtle import *
from random import randint

speed(0)

# Ces variables servent a être modifiées
# Et la valeur des modifs pour la démo
taille_maisons = 1.0 #0.7
positions_maisons = [-350, -50, 120, 300]
couleur_maisons = "wheat" #plum

taille_sapins_bg = 1.5 #1.3
positions_sapins_bg = [-300,  100, 350]

taille_sapins_fg = 1.7 #1.0
positions_sapins_fg = [-400, -150, 190] #+ [0]


def dessiner_rectangle(base_x, base_y, taille_x, taille_y, couleur):

    penup()![alt text](image.png)
    goto(base_x - taille_x/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille_x)
    left(90) 
    forward(taille_y)
    left(90)
    forward(taille_x)
    left(90)
    forward(taille_y)

    end_fill()


def dessiner_triangle_equi(base_x, base_y, taille, couleur):

    penup()
    goto(base_x - taille/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille)
    left(120) 
    forward(taille)
    left(120)
    forward(taille)

    end_fill()

#on ajoute les parametres x y    
def dessiner_maison(x, y): 

    dessiner_rectangle(x, y, 100 * taille_maisons, 100 * taille_maisons, couleur_maisons) #on les utilise

    dessiner_rectangle(20 * taille_maisons + x, y, 30 * taille_maisons, 60 * taille_maisons, "steelblue")

    dessiner_triangle_equi(x, 100 * taille_maisons + y, 150 * taille_maisons, "firebrick")


def dessiner_sapin(x, y, taille):

    dessiner_rectangle(x, y, 30 * taille, 30 * taille, "brown") #on les utilise
    dessiner_triangle_equi(x, 30 * taille + y, 90 * taille, "green")
    dessiner_triangle_equi(x, 70 * taille + y, 70 * taille, "green")
    dessiner_triangle_equi(x, 100 * taille + y, 70 * taille, "green")

def maisons():

    for i in positions_maisons:

        dessiner_maison(i, -150)

def sapins_bg():
    for i in positions_sapins_bg:
        dessiner_sapin(i, -150, taille_sapins_bg)


def sapins_fg():
    for i in positions_sapins_fg:
        dessiner_sapin(i, -150, taille_sapins_fg)
#on dessine plusieurs maisons


dessiner_rectangle(-400, -150, 2000, 400, "lightblue")

goto(-50, 175)
fillcolor("yellow")

begin_fill()
circle(100)
end_fill()

dessiner_triangle_equi(-100, -150, 500, "gray")
dessiner_triangle_equi(-300, -150, 400, "gray")
dessiner_triangle_equi(300, -150, 350, "gray")



sapins_bg()

maisons()

sapins_fg()

dessiner_rectangle(-400, -550, 2000, 400, "lightgreen")

done()

A la fin de ce thème, vous aurez donc réalisé un dessin du même genre, avec peut-être moins de paramètres...

Ou peut être plus, par exemple :

De la perspective

alt text

Code de démo
from turtle import *
from random import randint

speed(0)

# Ces variables servent a être modifiées
# Et la valeur des modifs pour la démo
taille_maisons = 0.7 #0.7
positions_maisons = [-350, -50, 120, 300]
couleur_maisons = "plum" #plum

taille_sapins_bg = 1 #1.3
positions_sapins_bg = [-300,  100, 350]

taille_sapins_fg = 1.7 #1.0
positions_sapins_fg = [-400, -150, 0, 190]


def dessiner_rectangle(base_x, base_y, taille_x, taille_y, couleur):

    penup()
    goto(base_x - taille_x/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille_x)
    left(90) 
    forward(taille_y)
    left(90)
    forward(taille_x)
    left(90)
    forward(taille_y)

    end_fill()


def dessiner_triangle_equi(base_x, base_y, taille, couleur):

    penup()
    goto(base_x - taille/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille)
    left(120) 
    forward(taille)
    left(120)
    forward(taille)

    end_fill()

#on ajoute les parametres x y    
def dessiner_maison(x, y): 

    dessiner_rectangle(x, y, 100 * taille_maisons, 100 * taille_maisons, couleur_maisons) #on les utilise

    dessiner_rectangle(20 * taille_maisons + x, y, 30 * taille_maisons, 60 * taille_maisons, "steelblue")

    dessiner_triangle_equi(x, 100 * taille_maisons + y, 150 * taille_maisons, "firebrick")


def dessiner_sapin(x, y, taille):

    dessiner_rectangle(x, y, 30 * taille, 30 * taille, "brown") #on les utilise
    dessiner_triangle_equi(x, 30 * taille + y, 90 * taille, "green")
    dessiner_triangle_equi(x, 70 * taille + y, 70 * taille, "green")
    dessiner_triangle_equi(x, 100 * taille + y, 70 * taille, "green")

def maisons(y):

    for i in positions_maisons:

        dessiner_maison(i, y)

def sapins_bg(y):
    for i in positions_sapins_bg:
        dessiner_sapin(i, y, taille_sapins_bg)


def sapins_fg(y):
    for i in positions_sapins_fg:
        dessiner_sapin(i, y, taille_sapins_fg)
#on dessine plusieurs maisons


dessiner_rectangle(-400, -150, 2000, 400, "lightblue")

goto(-50, 175)
fillcolor("yellow")

begin_fill()
circle(100)
end_fill()

dessiner_triangle_equi(-100, -150, 500, "gray")
dessiner_triangle_equi(-300, -150, 400, "gray")
dessiner_triangle_equi(300, -150, 350, "gray")


dessiner_rectangle(-400, -550, 2000, 400, "lightgreen")

sapins_bg(-155)

maisons(-170)

sapins_fg(-190)

done()

Plus flagrant dans une forêt :

alt

De la génération aléatoire

(entre ces 3 images, je n'ai fait que relancer le programme :)

alt text

alt text

alt text

Code de démo
from turtle import *
from random import randint

speed(0)

# Ces variables servent a être modifiées
# Et la valeur des modifs pour la démo
taille_maisons = 0.7 #0.7
positions_maisons = [-350, -50, 120, 300]
couleur_maisons = "plum" #plum

taille_sapins_bg = 1 #1.3
positions_sapins_bg = [-300,  100, 350]

taille_sapins_fg = 1.7 #1.0
positions_sapins_fg = [-400, -150, 0, 190]


def dessiner_rectangle(base_x, base_y, taille_x, taille_y, couleur):

    penup()
    goto(base_x - taille_x/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille_x)
    left(90) 
    forward(taille_y)
    left(90)
    forward(taille_x)
    left(90)
    forward(taille_y)

    end_fill()


def dessiner_triangle_equi(base_x, base_y, taille, couleur):

    penup()
    goto(base_x - taille/2, base_y)
    pendown()
    setheading(0)

    pencolor(couleur)
    fillcolor(couleur)

    begin_fill()

    forward(taille)
    left(120) 
    forward(taille)
    left(120)
    forward(taille)

    end_fill()

#on ajoute les parametres x y    
def dessiner_maison(x, y): 

    dessiner_rectangle(x, y, 100 * taille_maisons, 100 * taille_maisons, couleur_maisons) #on les utilise

    dessiner_rectangle(20 * taille_maisons + x, y, 30 * taille_maisons, 60 * taille_maisons, "steelblue")

    dessiner_triangle_equi(x, 100 * taille_maisons + y, 150 * taille_maisons, "firebrick")


def dessiner_sapin(x, y, taille):

    dessiner_rectangle(x, y, 30 * taille, 30 * taille, "brown") #on les utilise
    dessiner_triangle_equi(x, 30 * taille + y, randint(70, 100) * taille, "green")
    dessiner_triangle_equi(x, 70 * taille + y, randint(50, 80) * taille, "green")
    dessiner_triangle_equi(x, 100 * taille + y, randint(30, 60) * taille, "green")

def maisons(y):

    for i in positions_maisons:

        dessiner_maison(i, y)

def sapins_bg(y):
    for i in positions_sapins_bg:
        dessiner_sapin(i, y, taille_sapins_bg)


def sapins_fg(y):
    for i in positions_sapins_fg:
        dessiner_sapin(i, y, taille_sapins_fg)
#on dessine plusieurs maisons


dessiner_rectangle(-400, -150, 2000, 400, "lightblue")

goto(-50, 175)
fillcolor("yellow")

begin_fill()
circle(100)
end_fill()

dessiner_triangle_equi(-100, -150, 500, "gray")
dessiner_triangle_equi(-300, -150, 400, "gray")
dessiner_triangle_equi(300, -150, 350, "gray")


dessiner_rectangle(-400, -550, 2000, 400, "lightgreen")

sapins_bg(-155)

maisons(-170)

sapins_fg(-190)


done()

Ce thème est le premier à aborder pour aborder ce cours : il sera réutilisé dans tous les autres thèmes de manière optionnelle ou non.

notes prof

Progression :

  • Quelques enjeux, basthon
  • Séquence et Turtle
  • Les boucles for
  • Les variables -> paramétrisation. Faire des exos de paramétrisation pour faire transition avec la suite (fonctions)
  • Fonctions -> une fonction = 1 "objet". P-E en extension (de la DAO ? illustrer l'abstraction en fournissant un outils qui rends "dessin triangle/dessin carré" en SVG ?)
  • IF et calcul
  • While
  • Mini projet : dessin