Outils pour utilisateurs

Outils du site


teaching:progappchim:pavage_penrose_2013

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

teaching:progappchim:pavage_penrose_2013 [2013/11/28 14:08] (Version actuelle)
villersd créée
Ligne 1: Ligne 1:
 +====== Pavage de Penrose ======
 +<sxh python; title : pavage_penrose.py>​
 +#​!/​usr/​bin/​env python
 +# -*- coding: utf-8 -*-
 +# réference :  http://​preshing.com/​20110831/​penrose-tiling-explained
 +# version un peu aménagée du travail de EC et LP, ba2 chimie 2012-2013
 +
 +import math
 +import cmath
 +import cairo
 +
 + 
 + # definir le nombre d'​or ​
 +goldenRatio = (1 + math.sqrt(5)) / 2
 + 
 +def subdivide(triangles):​
 +    result = []
 +    for color, A, B, C in triangles:
 +        if color == 0:
 +            # Subdiviser des petits triangles
 +            P = A + (B - A) / goldenRatio
 +            result += [(0, C, P, B), (1, P, C, A)]
 +        else:
 +            # Subdiviser des grands triangles
 +            Q = B + (A - B) / goldenRatio
 +            R = B + (C - B) / goldenRatio
 +            result += [(1, R, C, A), (1, Q, R, B), (0, R, Q, A)]
 +    return result
 + 
 + # Fonction definissant la lecture dans IDLE
 +def prompt(s, f):
 +    image = None
 +    while not image:
 +        entree = raw_input(s + '​\n'​)
 +        image = f(entree)
 +    return image
 +
 + # Convertit la taille
 +def convert_to_size(s):​
 +    """​Si la chaine s est un couple d'​entiers,​ retourne cet entier"""​
 +    split = s.split("​ ")
 +    if len(split) == 2:
 +        a = convert_to_positive_int(split[0])
 +        b = convert_to_positive_int(split[1])
 +        if a != None and b != None:
 +            return (a, b)
 +    return None
 +    ​
 + # Convertit e
 +def convert_to_positive_int(s):​
 +    """​Si la chaine s est un entier, retourne cet entier"""​
 +    if s.isdigit() and long(s) > 0:
 +            return long(s)
 + # Convertir en un retour en arrière
 +def convert_to_long(s):​
 +    if s.isdigit():​
 +        return long(s)
 +    # Convertit en couleur ​
 +def convert_to_color(s):​
 +    """​Si la chaine s est un triplet RGB, retourne ce triplet"""​
 +    split = s.split("​ ")
 +    print split
 +    if len(split) == 3:
 +        a = convert_to_long(split[0])
 +        b = convert_to_long(split[1])
 +        c = convert_to_long(split[2])
 +        if a != None and b != None and c != None:
 +            return (a / 255.0, b / 255.0, c / 255.0)
 +    return None
 +
 +
 +#------ Configuration --------
 +NUM_SUBDIVISIONS = prompt("​Entrez le nombre de subdivisions desiree",​ convert_to_positive_int) ​   ​
 +IMAGE_SIZE = prompt("​Entrez la taille d'​image desiree, chaque composante separee d'un espace",​ convert_to_size) ​   ​
 +#​-----------------------------
 +
 +
 +    # Creer une roue de petits triangles autour de l origine
 +triangles = []
 +for i in xrange(10):
 +    B = cmath.rect(1,​ (2*i - 1) * math.pi / 10)
 +    C = cmath.rect(1,​ (2*i + 1) * math.pi / 10)
 +    if i % 2 == 0:
 +        B, C = C, B  # second triangle en miroir face a  l autre
 +    triangles.append((0,​ 0j, B, C))
 +     
 +    # Ameliore les subdivisions
 +for i in xrange(NUM_SUBDIVISIONS):​
 +    triangles = subdivide(triangles)
 +     
 +    # Prepare la surface cairo
 +
 +surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,​ IMAGE_SIZE[0],​ IMAGE_SIZE[1])
 +
 +        ​
 +cr = cairo.Context(surface)
 +cr.translate(IMAGE_SIZE[0] / 2.0, IMAGE_SIZE[1] / 2.0)
 +wheelRadius = 0.6 * math.sqrt((IMAGE_SIZE[0] / 2.0) ** 2 + (IMAGE_SIZE[1] / 2.0) ** 2)
 +cr.scale(wheelRadius,​ wheelRadius)
 +     
 +# Dessine le petit triangle
 +LittleTriangle = prompt("​Entrez les composantes RGB du petit triangle (strictement comprises entre 0 et 255), chaque composante separee d'un espace",​ convert_to_color)
 +for color, A, B, C in triangles:
 +    if color == 0:
 +        cr.move_to(A.real,​ A.imag)
 +        cr.line_to(B.real,​ B.imag)
 +        cr.line_to(C.real,​ C.imag)
 +        cr.close_path()
 +cr.set_source_rgb(LittleTriangle[0],​ LittleTriangle[1],​ LittleTriangle[2])
 +cr.fill() ​   ​
 +     
 +    # Dessine le grand triangle
 +GreatTriangle = prompt("​Entrez les composantes RGB du grand triangle (strictement comprises entre 0 et 255), chaque composante separee d'un espace",​ convert_to_color)
 +for color, A, B, C in triangles:
 +    if color == 1:
 +        cr.move_to(A.real,​ A.imag)
 +        cr.line_to(B.real,​ B.imag)
 +        cr.line_to(C.real,​ C.imag)
 +        cr.close_path()
 +cr.set_source_rgb(GreatTriangle[0],​ GreatTriangle[1],​ GreatTriangle[2])
 +cr.fill()
 +     
 +    # Determine l epaisseur de la ligne du premier triangle
 +color, A, B, C = triangles[0]
 +cr.set_line_width(abs(B - A) / 10.0)
 +cr.set_line_join(cairo.LINE_JOIN_ROUND)
 +     
 +# Dessine la ligne
 +lineColor = prompt("​Entrez les composantes RGB des segments de separation (strictement comprises entre 0 et 255), chaque composante separee d'un espace",​ convert_to_color)
 +for color, A, B, C in triangles:
 +    cr.move_to(C.real,​ C.imag)
 +    cr.line_to(A.real,​ A.imag)
 +    cr.line_to(B.real,​ B.imag)
 +cr.set_source_rgb(0.2,​ 0.2, 0.2)
 +cr.stroke()
 +
 +surface.write_to_png('​penrose.png'​)
 +
 +</​sxh>​
 +
  
teaching/progappchim/pavage_penrose_2013.txt · Dernière modification: 2013/11/28 14:08 par villersd