sierpinsky.py

text/x-python sierpinsky.py — 5.6 KB

Contenu du fichier

''' **********************************************************************
    Fichier sierpinsky.py

    Programme qui dessine un triangle de Sierpinsky

    auteur gabriel girard
    date 2017

    Entree : (clavier) la profondeur du fractal
    Sortie : (ecran) le triangle fractal
********************************************************************** '''
import sfml as sf


TAILLE_PAR_DEFAUT = 800
COULEUR_PAR_DEFAUT = 1

# --------------------
# Type "Point"
#
# Chaque fonction reçoit un paramètre implicite de type Point (self)
#
class Point:
    # -----------------------------------------------------------
    # Constructeur qui initialise le contenue du point avec des
    # valeurs passées en paramètres
    # Entree : (parametre) les valeurs en x et y
    def __init__(self, x=0, y=0):
        self.coordonneeX = int(x)
        self.coordonneeY = int(y)
    # -----------------------------------------------------------
    # Fontion qui permet de ré-initialiser un point
    # Entree : (parametre) les valeurs en x et y
    def init(self, x, y):
        self.coordonneeX = int(x)
        self.coordonneeY = int(y)
    # -----------------------------------------------------------
    # Fonction qui retourne le point "milieu" entre 2 points
    # Entree : (parametre) un point
    # Sortie : le point milieu entre les 2 points
    def milieu(self, y):
        pt = Point()
        pt.coordonneeX = (self.coordonneeX + y.coordonneeX)/2
        pt.coordonneeY = (self.coordonneeY + y.coordonneeY)/2
        return pt
    # ------------------------------------------------------------
    # Fontion qui initialise les coordonnées d'un point avec une
    # lecture au clavier
    # Entree (clavier) les valeurs en x et y
    def lecture(self):
        self.coordonneeX = int(input("Valeur : "))
        self.coordonneeY = int(input("Valeur : "))
    # ------------------------------------------------------------
    # Fontion qui retourne la coordonnée en x du point
    # Sortie : la valeur en x du point
    def valX(self):
        return self.coordonneeX
    # ------------------------------------------------------------
    # Fontion qui retourne la coordonnée en y du point
    # Sortie : la valeur en y du point
    def valY(self):
        return self.coordonneeY

# ----------------------------------------------------------------
# Classe Canevas pour afficher graphiquement
# (définie une fenêtre d'affichage).

class Canevas:
    # ------------------------------------------------------------
    # Initialisation  et affichage de la fenêtre
    # La fenêtre est de 800x800 avec un fond noir
    def __init__(self):
        self.canevas = sf.graphics.RenderWindow(sf.window.VideoMode(TAILLE_PAR_DEFAUT, TAILLE_PAR_DEFAUT), "Canevas de travail")
        self.tailleX = TAILLE_PAR_DEFAUT
        self.tailleY = TAILLE_PAR_DEFAUT
        self.canevas.display()
    # ------------------------------------------------------------
    # Destruction de la fenêtre d'affichage
    def __del__(self):
        print("fin......................:")
        self.canevas.close()
    # ------------------------------------------------------------
    # On efface entièrement le contenu affiché sur la fenêtre
    def effacer(self):
        self.canevas.clear(sf.graphics.Color.BLACK)
    # -----------------------------------------------------------------
    # On dessine une forme (triangle) dans la fenêtre et on l'affiche
    # Entree : la forme à dessiner
    def dessiner(self, forme):
        self.canevas.draw(forme)
        self.canevas.display()

''' ---------------------------------------------------
    Fonction dessinerTriangle

    Calcule les différents points nécessaire pour afficher
    le triangle et dessine un triangle plein sur le canevas

    Entree :
     Entree :
        (parametre) le canevas
        (parametre) les 3 points du triangle courant
    Sortie : un triangle
------------------------------------------------------'''
def dessinerTriangle(ecran, p1, p2, p3):
    triangle = sf.graphics.ConvexShape()
    # définit le nombre de points (3)
    triangle.point_count = 3
    triangle.fill_color = sf.graphics.Color.GREEN
    # définit les points
    triangle.set_point(0, sf.system.Vector2(p1.valX(), p1.valY()))
    triangle.set_point(1, sf.system.Vector2(p2.valX(), p2.valY()))
    triangle.set_point(2, sf.system.Vector2(p3.valX(), p3.valY()))
    ecran.dessiner(triangle)

''' ---------------------------------------------------
    Fonction sier

    Cette fonction dessine récursivement un "sierpinski gasket"
    Entree :
        (parametre) le canevas
        (parametre) les 3 points du triangle courant
        (parametre) le niveau de récursivité
    Sortie : Le triangle de Sierpinsky
------------------------------------------------------'''

def sier(ecran, p1, p2, p3, niveau):
    if niveau == 0:
        # dessiner un triangle plein
        dessinerTriangle(ecran, p1, p2, p3)
    else:
        # faire les trois sous-paniers de Sierpinski
        niveau -= 1
        sier(ecran, p1, p1.milieu(p2), p1.milieu(p3), niveau)
        sier(ecran, p2.milieu(p1), p2, p2.milieu(p3), niveau)
        sier(ecran, p3.milieu(p1), p3.milieu(p2), p3, niveau)

''' ---------------------------------------------------
    Porgramme principal

    Initialise et appele la fonction sier pour dessine le gasket

    Entree : (clavier) le niveau du fractal
------------------------------------------------------'''

ecran = Canevas()
#  Lecture du niveau
niv = int(input("Entrez le niveau "))
# Calculer les points de départ du triangle
p1 = Point(100, 700)
p2 = Point(700, 700)
p3 = Point(400, 100)

sier(ecran, p1, p2, p3, niv)
pause = input("Entrez un caractere pour terminer la pause : ")