我想使用pygame实现Koch Koch snow flake。
我正在处理来自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()
答案 0 :(得分:1)
不完全是答案,但与您的大问题相关。
L-system分形(就像你在这里想要绘制的那样)最好使用基本的L系统解析器完成。对于Koch雪花,'axiom'(初始形状的描述就像这样)D++D++D++
。 D
代表“向前移动一个单位”,+
代表“顺时针旋转30度”。指令将由turtle类光标“解释”。这样做并不是很难。
绘制公理后,您有一个替换D
的段。对于koch片,它是D-D++D-D
意思是“前进一个单位,逆时针旋转30度,向前,顺时针60,向前,逆时针30和向前”。这为您提供了替换初始三角形边的_/\_
形状。每次迭代时,一个“单位”减少原始长度的三分之一。
现在,您可以根据需要多次重复此操作,并且您正在寻找。这是我最早的Python程序之一,我在github上有一个粗略的解析器/解释器。它不使用pygame,但你应该能够很容易地交换该部分。
答案 1 :(得分:0)
要计算点数,我会使用矢量方法。如果三角形的角是a1,a2和a3,那么你可以得到a1到a2线上所有点的等式。使用该等式,您可以在a1和a2之间找到1/3和2/3处的点。这些点之间的距离为您提供了您要创建的新三角形的一面。使用该信息,以及a1和a2之间1/2的点,你可以计算出第三个新点的坐标。