The Sierpinski triangle in Python, inspired by HTDP, and using Pygame
import sys
import pygame
from pygame.locals import *
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def distance_sq(self, other):
return (self.x-other.x)**2 + (self.y-other.y)**2
def distance(self, other):
return sqrt(self.distance_sq(other))
def tupl(self):
return (self.x, self.y)
def midpt(p1, p2):
return Point( (p1.x+p2.x)/2, (p1.y+p2.y)/2 )
def too_small(p1, p2, p3):
return max([ p1.distance_sq(p2), p2.distance_sq(p3), p3.distance_sq(p1) ]) < 5
def draw_line(p1, p2, surf, col):
pygame.draw.line(surf, col, p1.tupl(), p2.tupl())
def draw_triangle(a, b, c, screen, col):
if too_small(a, b, c):
return
else:
a_b = midpt(a, b)
a_c = midpt(a, c)
b_c = midpt(b, c)
draw_line(a, b, screen, col)
draw_line(b, c, screen, col)
draw_line(a, c, screen, col)
draw_triangle(a, a_b, a_c, screen, col)
draw_triangle(b, a_b, b_c, screen, col)
draw_triangle(c, b_c, a_c, screen, col)
pygame.init()
pygame.display.set_caption('Sierpinski')
screen = pygame.display.set_mode((640,480))
screen.fill((0, 0, 0))
draw_triangle(Point(10, 10), Point(630, 10), Point(310, 450), screen, (255, 0, 0))
draw_triangle(Point(50, 10), Point(630, 240), Point(310, 0), screen, (0, 255, 0))
while True:
for event in pygame.event.get():
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
pygame.quit()
sys.exit()
pygame.display.update()
pygame.quit()
No comments:
Post a Comment