LS文法构图算法(2) Koch雪花

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值