一个Koch雪花由3条Koch曲线组成,先来看看Koch曲线是如何绘制的。如下图所示:
一条由左向右延伸的线段,长度为 3F ,如果把它的中间一段替换为一个没有底的等边三角形,就成了图中下部所示的折线。变换前后,两种图形起点到终点之间的距离不变。接下去,如果再把图形中每一条线段都替换为相应的折线,并不断重复下去,最终就形成了Koch曲线。
三条相同的Koch曲线首尾顺次相连,就构成了Koch雪花。Koch雪花的LS算法如下:
Omega = F++F++F
(Omage的意义是3条线首尾顺次相连,每一条画完之后转120度继续画)
Delta = 60(度)
P : F -> F-F++F-F
(P所表明的迭代方式是:画一段直线,右转60度(这里绘制的方向与上图例中的绘制方向是对称的),再画一段,再左转120度,再画一段,再右转60度,再画最后一段,这就是一条折线即Koch曲线的绘制过程,是用来替代原来此位置的一条直线段的)
绘制Koch雪花的python程序代码及其运行结果如下所示:
#!/apps/bin/python
from Tkinter import *
import math
class Koch(Frame):
def __init__(self, master= None):
self.statement = "F++F++F"
self.replacement = "F-F++F-F"
self.level = 5
self.direction = 0
self.winkle = math.pi/3
self.endX = 100
self.endY = 150
self.step = 2
self.calcuStatement()
Frame. __init__ (self, master)
self.grid()
self.createWidgets()
def calcuStatement(self):
for currentLevel in range(0, self.level):
newStatement = ""
for index in range(0,len(self.statement)):
if (self.statement[index] == "F" ):
newStatement = newStatement + self.replacement
else :
newStatement = newStatement + self.statement[index]
self.statement = newStatement
print self.statement
def createWidgets(self):
#self.quitButton = Button(self, text="QUIT", command=self.quit)
#self.quitButton.pack(side=BOTTOM, fill=BOTH)
self.draw = Canvas(self, width=800, height=600 )
self.draw.pack(side= LEFT)
self.drawCanvas()
def drawCanvas(self):
for index in range(0,len(self.statement)):
if (self.statement[index] == "F" ):
startX = self.endX
startY = self.endY
self.endX = startX + self.step* (math.cos(self.direction))
self.endY = startY + self.step* (math.sin(self.direction))
self.draw.create_line(startX,startY,self.endX,self.endY)
elif (self.statement[index] == "-" ):
self.direction = self.direction - self.winkle
elif (self.statement[index] == "+" ):
self.direction = self.direction + self.winkle
app = Koch()
app.master.title("Koch (LS)" )
app.mainloop()
from Tkinter import *
import math
class Koch(Frame):
def __init__(self, master= None):
self.statement = "F++F++F"
self.replacement = "F-F++F-F"
self.level = 5
self.direction = 0
self.winkle = math.pi/3
self.endX = 100
self.endY = 150
self.step = 2
self.calcuStatement()
Frame. __init__ (self, master)
self.grid()
self.createWidgets()
def calcuStatement(self):
for currentLevel in range(0, self.level):
newStatement = ""
for index in range(0,len(self.statement)):
if (self.statement[index] == "F" ):
newStatement = newStatement + self.replacement
else :
newStatement = newStatement + self.statement[index]
self.statement = newStatement
print self.statement
def createWidgets(self):
#self.quitButton = Button(self, text="QUIT", command=self.quit)
#self.quitButton.pack(side=BOTTOM, fill=BOTH)
self.draw = Canvas(self, width=800, height=600 )
self.draw.pack(side= LEFT)
self.drawCanvas()
def drawCanvas(self):
for index in range(0,len(self.statement)):
if (self.statement[index] == "F" ):
startX = self.endX
startY = self.endY
self.endX = startX + self.step* (math.cos(self.direction))
self.endY = startY + self.step* (math.sin(self.direction))
self.draw.create_line(startX,startY,self.endX,self.endY)
elif (self.statement[index] == "-" ):
self.direction = self.direction - self.winkle
elif (self.statement[index] == "+" ):
self.direction = self.direction + self.winkle
app = Koch()
app.master.title("Koch (LS)" )
app.mainloop()