Реализация снежинки Коха в python с использованием pygame

Я хотел бы реализовать снежные хлопья Кох Кох, используя Pygame.

Я работаю со следующими сериями изображений с http://en.wikipedia.org/wiki/File:KochFlake.svg

Фигурки из снежинок

Мой алгоритм такой

  1. Нарисуйте треугольник
  2. Рассчитайте точки треугольника на треть его размера и удалите центральную линию
  3. Узнайте внешние точки (как показано на втором рисунке выше)
  4. Составьте список всех конечных точек
  5. Используя многоугольник, объедините все точки

Я сделал до второго шага. Но я борюсь за третий шаг - поскольку я не могу понять, как найти внешние точки - какие-нибудь советы?

Вот мой код до второго шага

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, но вы должны быть в состоянии поменять эту часть довольно легко.

Другие вопросы по тегам