no way to compare when less than two revisions
Différences
Ci-dessous, les différences entre deux révisions de la page.
— | teaching:progappchim:pavage_penrose_2013 [2013/11/28 14:08] (Version actuelle) – créée villersd | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Pavage de Penrose ====== | ||
+ | <sxh python; title : pavage_penrose.py> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | # réference : http:// | ||
+ | # 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' | ||
+ | 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 + ' | ||
+ | image = f(entree) | ||
+ | return image | ||
+ | |||
+ | # Convertit la taille | ||
+ | def convert_to_size(s): | ||
+ | """ | ||
+ | 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): | ||
+ | """ | ||
+ | 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): | ||
+ | """ | ||
+ | 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(" | ||
+ | IMAGE_SIZE = prompt(" | ||
+ | # | ||
+ | |||
+ | |||
+ | # Creer une roue de petits triangles autour de l origine | ||
+ | triangles = [] | ||
+ | for i in xrange(10): | ||
+ | B = cmath.rect(1, | ||
+ | C = cmath.rect(1, | ||
+ | if i % 2 == 0: | ||
+ | B, C = C, B # second triangle en miroir face a l autre | ||
+ | triangles.append((0, | ||
+ | |||
+ | # Ameliore les subdivisions | ||
+ | for i in xrange(NUM_SUBDIVISIONS): | ||
+ | triangles = subdivide(triangles) | ||
+ | |||
+ | # Prepare la surface cairo | ||
+ | |||
+ | surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, | ||
+ | |||
+ | | ||
+ | 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, | ||
+ | |||
+ | # Dessine le petit triangle | ||
+ | LittleTriangle = prompt(" | ||
+ | for color, A, B, C in triangles: | ||
+ | if color == 0: | ||
+ | cr.move_to(A.real, | ||
+ | cr.line_to(B.real, | ||
+ | cr.line_to(C.real, | ||
+ | cr.close_path() | ||
+ | cr.set_source_rgb(LittleTriangle[0], | ||
+ | cr.fill() | ||
+ | |||
+ | # Dessine le grand triangle | ||
+ | GreatTriangle = prompt(" | ||
+ | for color, A, B, C in triangles: | ||
+ | if color == 1: | ||
+ | cr.move_to(A.real, | ||
+ | cr.line_to(B.real, | ||
+ | cr.line_to(C.real, | ||
+ | cr.close_path() | ||
+ | cr.set_source_rgb(GreatTriangle[0], | ||
+ | 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(" | ||
+ | for color, A, B, C in triangles: | ||
+ | cr.move_to(C.real, | ||
+ | cr.line_to(A.real, | ||
+ | cr.line_to(B.real, | ||
+ | cr.set_source_rgb(0.2, | ||
+ | cr.stroke() | ||
+ | |||
+ | surface.write_to_png(' | ||
+ | |||
+ | </ | ||
+ | |||