使用pygame在python中实现Koch雪花

时间:2013-01-07 10:57:32

标签: python math pygame coordinate-systems snowflake-schema

我想使用pygame实现Koch Koch snow flake

我正在处理来自http://en.wikipedia.org/wiki/File:KochFlake.svg

的以下一系列图片

Figures of snowflakes

我的算法就是这个

  1. 画一个三角形
  2. 计算三角形大小的三分之一并删除中心线
  3. 找出外部点(如上图所示)
  4. 列出所有终点
  5. 使用多边形连接所有点
  6. 我已经完成了第二步。但我正在努力迈出第三步 - 因为我无法弄清楚如何找到外部要点 - 任何提示?

    这是我的第二步代码

    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 个答案:

答案 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的点,你可以计算出第三个新点的坐标。