📄 用确定性算法绘制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 + -