Реализация снежинки Коха в python с использованием pygame
Я хотел бы реализовать снежные хлопья Кох Кох, используя Pygame.
Я работаю со следующими сериями изображений с http://en.wikipedia.org/wiki/File:KochFlake.svg
Мой алгоритм такой
- Нарисуйте треугольник
- Рассчитайте точки треугольника на треть его размера и удалите центральную линию
- Узнайте внешние точки (как показано на втором рисунке выше)
- Составьте список всех конечных точек
- Используя многоугольник, объедините все точки
Я сделал до второго шага. Но я борюсь за третий шаг - поскольку я не могу понять, как найти внешние точки - какие-нибудь советы?
Вот мой код до второго шага
import pygame
from pygame.locals import *
pygame.init()
fpsClock = pygame.time.Clock()
screen = pygame.display.set_mode((600,600))
pygame.display.set_caption('Koch snowflake')
white = (255, 255, 255)
black = (0, 0 ,0)
def midpoints(pt1 , pt2):
(x1, y1) = pt1
(x2, y2) = pt2
return ((x1+x2)/2, (y1 + y2)/2)
def midline(pt1, pt2):
(x1, y1) = pt1
(x2, y2) = pt2
return [(x1 + float(x2-x1)/3.0,y1 + float(y2-y1)/3.0), (x1 + float(x2-x1)*2.0/3,y1+ float(y2-y1)*2.0/3)]
def drawline(pt1, pt2):
pygame.draw.line(screen, white, pt1, pt2)
def clearline(pt1,pt2):
pygame.draw.line(screen, black, pt1, pt2, 4)
a = [(150,150), (450,150), (300,410), (150,150)]
pygame.draw.polygon(screen, white ,(a[0], a[1], a[2]), 1)
i = 0
order = 0
length = len(a)
while order < length - 1:
pts = midline(a[i], a[i+1])
clearline(pts[0], pts[1])
a = a[:i+1] + pts + a[i+1:]
print a
if order < 3:
i = i+3
order = order + 1
#pygame.draw.polygon(screen, white ,Tup, 1)
pygame.display.update()
2 ответа
Чтобы рассчитать баллы, я бы использовал векторный подход. Если углы треугольника a1, a2 и a3, то вы можете получить уравнение для всех точек на линии a1 - a2. Используя это уравнение, вы можете найти точки в 1/3 и 2/3 между a1 и a2. Расстояние между этими точками дает вам сторону нового треугольника, который вы собираетесь создать. Используя эту информацию и точку в 1/2 между a1 и a2, вы можете определить координаты третьей новой точки.
Не совсем ответ, но что-то, имеющее отношение к вашему большему вопросу.
Фракталы L-системы (например, то, что вы пытаетесь нарисовать здесь) лучше всего делать с помощью элементарного парсера L-системы. Для снежинки Коха "аксиома" (которая является описанием начальной формы, выглядит примерно так) D++D++D++
, D
означает "двигаться вперед на одну единицу" и +
для "поворота по часовой стрелке на 30 градусов". Инструкции будут "интерпретированы" курсором, похожим на черепаху. Это не очень сложно сделать.
Как только аксиома нарисована, у вас есть сегмент, который заменяет D
, Для Коха, это D-D++D-D
что означает "двигаться вперед на одну единицу, повернуть против часовой стрелки на 30 градусов, вперед, по часовой стрелке на 60, вперед, против часовой стрелки на 30 и вперед". Это дает вам _/\_
форма, которая заменяет стороны исходного треугольника. Одна "единица" уменьшает на одну треть исходную длину на каждой итерации.
Теперь повторите это столько раз, сколько вы хотите, и вы ищете. Это была одна из моих первых программ на Python, и у меня на github есть грубый парсер / интерпретатор. Он не использует Pygame, но вы должны быть в состоянии поменять эту часть довольно легко.