使用pygam在pygam中实现Koch snowflake

2024-04-19 00:10:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用pygame实现KochKoch snow flake。在

我正在处理http://en.wikipedia.org/wiki/File:KochFlake.svg中的以下一系列图像

Figures of snowflakes

我的算法是这样的

  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()

Tags: defdisplayorderfloatscreenpygameptsx1
2条回答

为了计算这些点,我用向量法。如果三角形的角是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,但是你应该能够很容易地交换掉这个部分。在

相关问题 更多 >