0

我想使用 pygame实现 Koch Koch 雪花。

我正在使用来自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()
4

2 回答 2

1

不完全是答案,但与您的更大问题相关。

L-system分形(就像您在此处尝试绘制的那样)最好使用基本的 L-system 解析器来完成。对于科赫雪花,“公理”(对初始形状的描述是这样的)D++D++D++。代表“D向前移动一个单位”和+“顺时针转动 30 度”。指令将由一个像光标一样的海龟“解释”。做到这一点并不难。

一旦公理被绘制出来,你就会有一个段来替换D. 对于科赫薄片,D-D++D-D意思是“向前移动一个单位,逆时针转动30度,向前,顺时针转动60度,向前,逆时针转动30度,向前”。这为您提供了_/\_替换初始三角形边的形状。一个“单位”在每次迭代中减少到原始长度的三分之一。

现在,根据您的需要重复此操作多次并且您正在寻找。这是我最早的 Python 程序之一,我在github上有一个粗略的解析器/解释器。它不使用 pygame,但您应该能够很容易地交换该部分。

于 2013-01-07T11:24:48.387 回答
0

要计算点,我会使用矢量方法。如果三角形的角是 a1、a2 和 a3,那么你可以得到一条直线 a1 到 a2 上所有点的方程。使用该等式,您可以找到 a1 和 a2 之间 1/3 和 2/3 处的点。这些点之间的距离为您提供了要创建的新三角形的边。使用该信息以及 a1 和 a2 之间 1/2 的点,您可以计算出第三个新点的坐标。

于 2013-01-07T11:41:12.737 回答