要前往论坛,请点击这里

题目:植物的枝的分形算法

作者:佚名 | 发表日期:2007-10-02 | 浏览:156次 | 加入收藏

字符串替换算法 并不局限于绘制比较"规则 "的分形,而且可以用来绘制"分形树"一类很复杂的分形.这种图形与自然界中的植物的枝干极为相似换句话说可以用这处算法对自然界的实物进行模拟,并达到很好的效果,它也像IFS方法一样是一种信息压缩的收手段.
    引进下列记号:
    A:沿逆时针方向角度 ;
    B:沿顺时针方向转角度;
    C:当前状态栈记录当前点的坐标,及角度)
    D:出(取最近的一次 压入骱的信息 , 同时修改指针);
    从当前点开始沿当前方向 画一线段E,G,H,I,J这些字符 在下次迭代中将分别被E $.G $.H $,I$,及J$所替代.其中
    E$="EI"
    G$="BHCAGDI"
    H$="AGCBHDI"
    I$="CAFFFDCBFFFDF"
    J$="CBBBGDCAAAGDEJ"
    迭代规则如下:
    第一步图形为P(1)$="JIFFF",若第k步图形为P(K)$,则第k+1步的图形P(k+1)$是将PP(K)$中的所有E.G.H.I.J这些字符分别用E$.G$,.H$,I$,及J$来替换,其它字符不变而得到的 ,角度 =/10.需要指出的是:在每次线段长度L(K+K)不像von Koch曲线那样,存在一简单关系:L(k+1)=L(k)/3.因此在这个问题上,应上机调试以选择合适的比列因子---使得图形不超出屏幕之外,也不太小.

源程序如下:
 
10  ''''''''Fractal Tree  

 
 
20  KEY OFF:SCREEN 2:WINDOW(0,0)-(4/3,1): 
    N=11:PI=3.141593 
30   P="JIFFFK":J$="CBBBGDCAAAGDEJ": 
    G$="BHCAGDI":H$"AGCBHDI" 
35   E$="EI":I$="CAFFFDCBFFFDF": 
    ANGLE=PI/10:L=3 
40  DEF SEG=&H7000:ADR1=0: 
    DIM X(40),Y(40),L(11),A(40) 
50  FOR I=1 TO LEN(P$) 
60  POKE ADR1,ASC(MID$(P$,I,1)): 
    ADR1=ADR1+1:NEXT I 
65  L(1)=1/3:L(2)=.25:L(3)=.9:L(4)=.9: 
    L(5)=.8:L(6)=.65:L(7)=.68:L(8)=.73: 
    L(9)=.77:L(10)=.77:L(11)=.8 
70  FOR I=1 TO N:CLS:A=0:L=L*L(I): 
    PSET(2/3,0):ADR1=0:X=2/3:Y=0 
90  ON PEEK(ADR1)-64 GOTO 100,110,126,127,130,120,130,130,130,130,140 
100 A=A+1:GOTO 130 
110 A=A-1:GOTO 130 
120 LINE -STEP(L*COS(A*ANGLE+PI/2),L*SIN(A*ANGLE+PI/2)) 
125 X=X+L*COS(A*ANGLE+PI/2):   
    Y=Y+L*SIN(A*ANGLE+PI/2):GOTO 130   
126 ST=ST+1:X(ST)=X:Y(ST)=Y:   
    A(ST)=A:GOTO 130   
127 X=X(ST):Y=Y(ST):A=A(ST):ST=ST-1:PSET(X,Y)   
130 ADR1=ADR1+1:GOTO 90   
140 ADR2=&HFFF:IF I=11 THEN 145 ELSE 150   
145 IFINKEY $=""THEN 145 ELSE END   
150 WHILE ADR1+1   
160 ON PEEK(ARR1)-64 GOTO 170,170,170,170,180,170,181,182,183,184,170   
170 PIKE ADR2,PEEK(ADR1):GOTO 190   
180 Q$=E$:GOSUB 250:GOTO 190   
181 Q$=G$:GOSUB 250:GOTO 190   
182 Q$=H$GOSUB 250 :GOKO 190   
183 Q$=I$:GOSUB 250 :GOTO 190   
184 Q$=J$:GOSUB 250 :GOTO 190   
190 ADR1=ADR1-1:ADR2=ADR2-1   
200 WEND   
210 WHILE ADR2:ADR1=ADR1+1:ADR2=ADR2+1`   
220 POKE ADER1,PEEK(ADR2):WEND   
225 IF I<N AND INKEY $=""THEN 225   
230 NEXT I:END   
250 FOR J=1 TO LEN(Q$)   
260 POKE ADR2,ASC   
    (MID$(Q$,LEN(Q$)-J+1,1))   
270 ADR2=ADR2-1:NEXT J:ADR2=ADR2+1:RETUTN 

文章搜索

你可能对相关文章也感兴趣...

赞助商链接

九州算术版权申明:非特殊申明,本站文章均系转载自互联网,如果侵犯了你的合法权益,请告知我们,我们会第一时间处理. 【我要评论当前这篇文章】 【我要回去文章列表看看】

以下是本站会员对这篇文章的评论


  • 评论载入中...请稍后...

您的评论

用户名: 验证码: 说明:评论并不需要注册.如果您不是本站会员,你可以注册为本站会员. 注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。

请您注意: ·不良评论请用报告管理员,以利管理员及时删除。 ·尊重网上道德,遵守中华人民共和国的各项有关法律法规 ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任 ·本站评论管理人员有权保留或删除其管辖评论中的任意内容 ·您在本站发表的作品,本站有权在网站内转载或引用 ·参与本评论即表明您已经阅读并接受上述条款