?? 用確定性算法繪制sierpinski三角形 .txt
字號:
用確定性算法繪制Sierpinski三角形
源程序如下:
SCREEN 12:CLS
DIM s(100,100),t(100,100),x(12),y(12)
a(1)=.5:a(2)=.5:a(3)=.5
b(1)=0:b(2)=0:b(3)=0
c(1)=0:c(2)=0:c(3)=0
d(1)=.5:d(2)=.5:d(3)=.5
e(1)=1:e(2)=1:e(3)=50
f(1)=1:f(2)=50:f(3)=1
FOR I=1 to 6
x(i)=(i-1)*105:x(i+6)=x(i):y(i)=0:
y(i+6)=110:NEXT i
FOR i=1 TO 100
t(1,i)=1:t(i,1):t(100,i)=1:t(i,100)=1
NEXT i
LINE(1,1)-(!00,100),4,B
FOR n=2 TO 12
FOR i=1 TO 100:FOR j=1 TO 100
IF t(i,j)=1 THEN
FOR k=1 TO 3
s(a(k)*i+B(k)*j+e(k),c(k)*i+d(k)*j+f(k))=1
NEXT k
END IF
NEXT j:NEXT i
FOR i=1 TO 100 :FOR j=1 TO 100
T(i,j)=S(i,j):S(i,j)=0
IF t(i,j)=1 THEN
PSET(i+x(n),j+y(n)),5
END IF
NEXT j:NEXT i
NEXT n
ww:IF INKEY$="" THEN GOTO ww
END
上面的程序是用二個維數組s,t來貯存每次迭代過程中的象Bn,在分辨率不變的條件下,如果要得到較大的圖象,提高數組的維數,但QUICK BASIC 規定數組的最大容量為64KB,而且當數組容量太大時,常常無法編譯,然而,如果不考慮象素的顏色,那么每個象素只有兩 種狀態--點亮(用1表示),不亮(用0表示)。即用一位就可以表示一個象素的狀態 。但程序中用數組的一個元素來表示一個象素的狀態,這里的數組婁型是浮點類型,故每個元素占二個字節,共16位,空間的浪費是明顯的,下面的程序是以此為也發點而設計的,其關鍵點是搞清楚象素與其存貯窨之間的對應關系.
SCREEN 12; CLS :M=10
a(1)=.5:a(2)=.5:a(3)=.5
b(1)=0:b(2)=.0:b(3)=0
c(1)=0:c(2)=0:c(3)=.5
d(1)=.5:d(2)=.5:d(3)=.5
e(1)=0:e(2)=60:e(3)=0
f(1)=0:f(1)=0:f(3)=60
DEF SEG=&H8000
pl:FOR TO 1799
POKE i,0:POKE i+&H8000,0:NEXT i
p2:FOR i,0 TO 14
POKE i,&HFF:POKE 1785+i,&HFF:NEXT i
p3:FOR i=15 TO 1784 STEP 15
POKE i, &H80:POKE i+14,1:NEXT i
p4:FOR i=0 TO 4
x(i)=i*125:x(i+5)=x(i):y(i)=0:y(i+5)=130:NEXT i LINE(0,0)-(120,120),4,B
p5:FOR n=1 TO 9
p6:FOR adr=0 TO 1799
IF PEEK(adr)<>0 THEN
p7:i=INT(adr/15)
j0=(adr MOD 15)*8
FOR k=0 TO 7
IF(PEEK(adr) AND 2^(7-k))<>0 THEN
p8:j=j0+k
FOR i=1 TO 7
p9:i(1)=INT(a(1)*i+b(1)*j+e(1))
pa:j(1)=INT(c(1)*i+d(1)*j+f(1))
PSET(i(1)+x(n),j(1)+y(n)),4
pb:adr1=i(1)*15+INT(j(1)/8)+&H8000
pc:POKE adrl ,(PEEK(adrl) OR 2^(7-(j(1) MOD 8)))
NEXT 1
NED IF
NEXT k
END IF
NEXT adr
FOR k=0 TO 1799
POKE k,PEEK(k+&H8000):POKE k+&H8000,0
NEXT k
NEXT n
ww:IF INKEY $="THEN GOTO ww
END
對程序的詳細注解:
1.標號pl-pc審不必要的,只是為了下列序述方便
2.pl標號下的循環是把內存中程序中所用的空間清零,以免下次執得本程序時引起混亂.
程序 中每次所畫的圖形尺寸均為1230*120故需120*120/8=1800個字節.
3.p2、p3標號下是置初始集A0為正方形的邊界。其中,p2標號下是代表正方形的上、下兩邊。p3標號下是處理正方形的左右兩邊。
4.p4標號下的語句是確定每次圖形的位置。
5.p5標號下對n循環。n代表迭代次數。
6.p6標號下對adr循環,adr代表數據存放的地址(段內地址).這一循環相當于對120*120每一象素循環.注意數據的安排是這樣:數據區的第一字節表示圖形第一行的前8個點(象素).字節的高位D7位表示第一行的第一個點.字節的最后一位D0位表示第一行的第八個點.余此類推..
7.p7標號下的i是圖象的行數.這里圖象是從第0行開始.到第119竿結束 ,同樣列數也是從第0列到第119列.
8.p8標號下的j是圖象的列數.(i,j)確定圖象的位置.
9.p9、pa中(i(l),j(l))的是迭代后點的位置.
10.pb標號下的adr1中存放的是本次迭代后的結果應存放的地址。
11.pc標號下,是存入本次迭代后的結果。注意這次存入數據不能破壞該字節的其它位,這是用了"或"運算。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -