首先看一下用程序生成的KNOCH曲线,在迭代次数不同情况下的变化:
显然,你可以清楚的感觉到KNOCH曲线在面积上为0,在长度上不断扩大特性(在给定的尺度下有一个上限值)和这个Knoch曲线相类似的图形还有Sierpinski三角形
那么,具体到程序上,这样的图形是如何绘制的呢,这类图形的绘制在分形几何上有个相关的领域,叫做L系统,这是一种基于字符串技术的绘制图形技术,就像LOGO语言那像,通过解释命令字符串,来控制画笔的移动:
比如:
F代表在当前的位置方向向前移动
+从当前的方向向左转一个给定的角度.
-从当前的方向向右转一个给定的角度.
…
像Knoch的生成命令为:(在一个叫做Fractint19.5的L系统的软件上)
Axiom F ;初始状态,一根直线
F=F+F—F+F ;迭代法则,每次在前一次的命令字符串中的F用这个规则去替换.
在达到规定的迭代次数后,便可以从字符串头部向后解释命令绘制出相应的图形.
那么,具体到程序上,这样的迭代如何去实现呢.(这里我还没能力实现一个通用的解释程序,只谈最关键的迭代的实现)
我认为一个比较好的相法是这样:
设置两个队列(字符队列,每个队列结点上存放一个元字符)qA,qB,开始时:qA存放初始情况下的字符,qB为空.
I=1
Sign=’A’
While(i<迭代次数上限)
{
if(Sign==’A’)
{
将qA中的字符逐个出队
{
如果遇到的是替换法则相对应的字符,则将替换法则中的字符逐个入队qB.
如果不是,则将当前qA中的出队字符直接入qB。
}
}
if(Sign==’B’)
{
将qB中的字符逐个出队
{
如果遇到的是替换法则相对应的字符,则将替换法则中的字符逐个入队qA.
如果不是,则将当前qB中的出队字符直接入q。
}
}
ißi+1
}下面给出在AS2语言中这种算法的实现:
for(i=0;i<_root.gInitString.length;i++)
queueA.enQueue(String(_root.gInitString.charAt(i)));
i=0;
sign=_root.SIGN_A;
//Produce The Drawing String.
while(i<_root.gIteratorLimit)
{
if(sign==_root.SIGN_A)
{ //queueA to queueB
while(!queueA.isEmpty())
{
tmpData=String(queueA.deQueue());
if(tmpData=="F"||tmpData=="f"||tmpData=="G"||tmpData=="g")
for(j=0;j<_root.gInitString.length;j++)
{
queueB.enQueue(_root.gInitString.charAt(j));
}
else if(tmpData=="+"||tmpData=="-"||tmpData=="|")
&nbs