# ############################################################### # Paysage dessiné en utilisant le module Turtle de Python # Juin 2026 # nsi.gecif.net # ############################################################### import turtle # Configuration de la fenêtre en mode RGB (0-255) screen = turtle.Screen() screen.setup(1000, 700) screen.title("Immeuble en Perspective Réaliste - nsi.gecif.net") screen.colormode(255) t = turtle.Turtle() t.hideturtle() turtle.tracer(0) # Tracé instantané # Point de fuite central (Horizon Y = 0, Centre X = 0) PF_X, PF_Y = 0, 0 def aller_a(x, y): t.penup() t.goto(x, y) t.pendown() # Fonction magique pour projeter un point en perspective vers le point de fuite # f (entre 0 et 1) représente la profondeur : 0 = face avant, 1 = point de fuite def point_fuite(x_depart, y_depart, f): x_proj = x_depart + (PF_X - x_depart) * f y_proj = y_depart + (PF_Y - y_depart) * f return x_proj, y_proj # ========================================== # DÉCOR DE FOND (Ciel et Sol rapide) # ========================================== # Ciel for y in range(0, 350): facteur = y / 350.0 t.color(int(255*(1-facteur)+74*facteur), int(140*(1-facteur)+144*facteur), int(226*facteur)) aller_a(-500, y) t.forward(1000) # Sol aller_a(-500, -350) t.color(34, 139, 34) t.begin_fill() t.goto(500, -350) t.goto(500, 0) t.goto(-500, 0) t.end_fill() # ========================================== # IMMEUBLE AMÉLIORÉ EN VRAIE 3D # ========================================== # Paramètres de la face avant x_bg, y_bg = -450, -250 # Coin bas gauche larg, haut = 150, 300 # Dimensions face avant x_bd, y_bd = x_bg + larg, y_bg # Coin bas droit x_hd, y_hd = x_bg + larg, y_bg + haut # Coin haut droit x_hg, y_hg = x_bg, y_bg + haut # Coin haut gauche # 1. Dessin de la Face Avant (Gris clair) t.color(210, 215, 223) aller_a(x_bg, y_bg) t.begin_fill() t.goto(x_bd, y_bd) t.goto(x_hd, y_hd) t.goto(x_hg, y_hg) t.goto(x_bg, y_bg) t.end_fill() # Fenêtres de la Face Avant (droites) for etage in range(6): for col in range(3): xf = x_bg + 20 + (col * 45) yf = y_bg + 25 + (etage * 45) t.color(255, 235, 150) # Jaune lumière aller_a(xf, yf) t.begin_fill() for _ in range(2): t.forward(25); t.left(90); t.forward(25); t.left(90) t.end_fill() # 2. Dessin de la Face Latérale (En fuite vers le centre) # Profondeur du bâtiment (f_fond = 0.25 signifie qu'il s'enfonce de 25% vers l'horizon) f_fond = 0.22 # Calcul mathématique exact des coins arrières grâce à notre fonction x_f_bas, y_f_bas = point_fuite(x_bd, y_bd, f_fond) x_f_haut, y_f_haut = point_fuite(x_hd, y_hd, f_fond) t.color(140, 150, 165) # Plus sombre (ombre) aller_a(x_bd, y_bd) t.begin_fill() t.goto(x_f_bas, y_f_bas) t.goto(x_f_haut, y_f_haut) t.goto(x_hd, y_hd) t.goto(x_bd, y_bd) t.end_fill() # 3. Fenêtres de la Face Latérale (PROJECTION EN PERSPECTIVE) # Elles doivent suivre les lignes de fuite du haut et du bas du bâtiment num_etages = 6 num_cols_lat = 3 for etage in range(num_etages): # Ratio de hauteur pour l'étage actuel (du bas 0.0 au haut 1.0) r_bas = (25.0 + etage * 45.0) / haut r_haut = (25.0 + etage * 45.0 + 25.0) / haut # Points de départ de cet étage sur l'arête centrale de l'immeuble y_arete_bas = y_bd + r_bas * haut y_arete_haut = y_bd + r_haut * haut for col in range(num_cols_lat): # f1 et f2 définissent le début et la fin de la fenêtre en profondeur # On resserre légèrement l'espace (effet d'optique de compression) f1 = (0.04 + col * 0.06) f2 = f1 + 0.04 # Calcul des 4 coins de la fenêtre inclinée dans l'espace 3D w1_x, w1_y = point_fuite(x_bd, y_arete_bas, f1) # Bas Gauche w2_x, w2_y = point_fuite(x_bd, y_arete_bas, f2) # Bas Droit w3_x, w3_y = point_fuite(x_bd, y_arete_haut, f2) # Haut Droit w4_x, w4_y = point_fuite(x_bd, y_arete_haut, f1) # Haut Gauche # Dessin de la fenêtre déformée t.color(240, 210, 100) # Un peu plus terne à cause de l'angle aller_a(w1_x, w1_y) t.begin_fill() t.goto(w2_x, w2_y) t.goto(w3_x, w3_y) t.goto(w4_x, w4_y) t.goto(w1_x, w1_y) t.end_fill() # ========================================== # FIN DU RENDU # ========================================== turtle.update() screen.mainloop()