我想用pygame实现KochKoch 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()
为了计算这些点,我用向量法。如果三角形的角是a1,a2和a3,那么你可以得到a1到a2线上所有点的方程。用这个方程,你可以找到a1和a2之间1/3和2/3处的点。这些点之间的距离就是要创建的新三角形的边。利用这些信息,以及a1和a2之间1/2处的点,可以计算出第三个新点的坐标。在
不完全是一个答案,而是与你更大的问题相关的东西。在
L-system分形(就像你要画的一样)最好使用一个初级的L系统解析器来完成。对于Koch雪花来说,“公理”(它是对初始形状的描述,类似于这样)
D++D++D++
。D
代表“向前移动一个单位”,而+
代表“顺时针旋转30度”。指令将由类似turtle的游标“解释”。做这个并不难。在一旦画出公理,就有一个段来代替
D
。对于koch薄片,它是D-D++D-D
意思是“向前移动一个单位,逆时针旋转30度,向前,顺时针60度,向前,逆时针30度,向前”。这将为您提供_/\_
形状,该形状将替换初始三角形的边。在每次迭代中,一个“单元”减少到原始长度的三分之一。在现在,你想重复多少次,你就会发现。这是我最早的Python程序之一,我在github上有一个粗略的解析器/解释器。它不使用pygame,但是你应该能够很容易地交换掉这个部分。在
相关问题 更多 >
编程相关推荐