Science 版 (精华区)

发信人: ardye (Protoss), 信区: Science
标  题: 植物的枝的分形算法
发信站: 哈工大紫丁香 (2001年11月05日13:03:23 星期一), 站内信件

字符串替换算法 并不局限于绘制比较"规则 "的分形,而且可以用来绘制"分形树"一类很
复杂的分形.这种图形与自然界中的植物的枝干极为相似换句话说可以用这处算法对自然
界的实物进行模拟,并达到很好的效果,它也像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)$是将P
P(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   
--
酒酣或化庄生蝶,饭饱甘为孺子牛

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 61.167.245.19]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:15.348毫秒