sihaiwuya 发表于 2005-11-19 13:30

求Sierpinski三角形源程序

经典分形图形之一,另外如果有Lorenz吸引子和Julia集和Mandelbrot集的源程序的话,更是不胜感激。这些是都是关于非线性科学的。

frogfish 发表于 2005-11-19 14:54

回复:(sihaiwuya)求Sierpinski三角形源程序

用确定性算法绘制Sierpinski三角形<BR><BR>源程序如下:<BR><BR>SCREEN 12:CLS<BR><BR>DIM s(100,100),t(100,100),x(12),y(12)<BR><BR>a(1)=.5:a(2)=.5:a(3)=.5<BR><BR>b(1)=0:b(2)=0:b(3)=0<BR><BR>c(1)=0:c(2)=0:c(3)=0<BR><BR>d(1)=.5:d(2)=.5:d(3)=.5<BR><BR>e(1)=1:e(2)=1:e(3)=50<BR><BR>f(1)=1:f(2)=50:f(3)=1<BR><BR>FOR I=1 to 6<BR><BR>x(i)=(i-1)*105:x(i+6)=x(i):y(i)=0:<BR><BR>y(i+6)=110:NEXT i<BR><BR>FOR i=1 TO 100<BR><BR>t(1,i)=1:t(i,1):t(100,i)=1:t(i,100)=1<BR><BR>NEXT i<BR><BR>LINE(1,1)-(!00,100),4,B<BR><BR>FOR n=2 TO 12<BR><BR>FOR i=1 TO 100:FOR j=1 TO 100<BR><BR>IF t(i,j)=1 THEN<BR><BR>FOR k=1 TO 3<BR><BR>s(a(k)*i+B(k)*j+e(k),c(k)*i+d(k)*j+f(k))=1<BR><BR>NEXT k<BR><BR>END IF<BR><BR>NEXT j:NEXT i<BR><BR>FOR i=1 TO 100 :FOR j=1 TO 100<BR><BR>T(i,j)=S(i,j):S(i,j)=0<BR><BR>IF t(i,j)=1 THEN<BR><BR>PSET(i+x(n),j+y(n)),5<BR><BR>END IF<BR><BR>NEXT j:NEXT i<BR><BR>NEXT n<BR><BR>ww:IF INKEY$="" THEN GOTO ww<BR><BR>END<BR><BR>上面的程序是用二个维数组s,t来贮存每次迭代过程中的象Bn,在分辨率不变的条件下,如果要得到较大的图象,提高数组的维数,但QUICK BASIC 规定数组的最大容量为64KB,而且当数组容量太大时,常常无法编译,然而,如果不考虑象素的颜色,那么每个象素只有两 种状态--点亮(用1表示),不亮(用0表示)。即用一位就可以表示一个象素的状态 。但程序中用数组的一个元素来表示一个象素的状态,这里的数组娄型是浮点类型,故每个元素占二个字节,共16位,空间的浪费是明显的,下面的程序是以此为也发点而设计的,其关键点是搞清楚象素与其存贮窨之间的对应关系.<BR><BR>SCREEN 12; CLS :M=10<BR><BR>a(1)=.5:a(2)=.5:a(3)=.5<BR><BR>b(1)=0:b(2)=.0:b(3)=0<BR><BR>c(1)=0:c(2)=0:c(3)=.5<BR><BR>d(1)=.5:d(2)=.5:d(3)=.5<BR><BR>e(1)=0:e(2)=60:e(3)=0<BR><BR>f(1)=0:f(1)=0:f(3)=60<BR><BR>DEF SEG=&amp;H8000<BR><BR>pl:FOR TO 1799<BR><BR>POKE i,0:POKE i+&amp;H8000,0:NEXT i<BR><BR>p2:FOR i,0 TO 14<BR><BR>POKE i,&amp;HFF:POKE 1785+i,&amp;HFF:NEXT i<BR><BR>p3:FOR i=15 TO 1784 STEP 15<BR><BR>POKE i, &amp;H80:POKE i+14,1:NEXT i<BR><BR>p4:FOR i=0 TO 4<BR><BR>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<BR><BR>p5:FOR n=1 TO 9<BR><BR>p6:FOR adr=0 TO 1799<BR><BR>IF PEEK(adr)&lt;&gt;0 THEN<BR><BR>p7:i=INT(adr/15)<BR><BR>j0=(adr MOD 15)*8<BR><BR>FOR k=0 TO 7<BR><BR>IF(PEEK(adr) AND 2^(7-k))&lt;&gt;0 THEN<BR><BR>p8:j=j0+k<BR><BR>FOR i=1 TO 7<BR><BR>p9:i(1)=INT(a(1)*i+b(1)*j+e(1))<BR><BR>pa:j(1)=INT(c(1)*i+d(1)*j+f(1))<BR><BR>PSET(i(1)+x(n),j(1)+y(n)),4<BR><BR>pb:adr1=i(1)*15+INT(j(1)/8)+&amp;H8000<BR><BR>pc:POKE adrl ,(PEEK(adrl) OR 2^(7-(j(1) MOD 8)))<BR><BR>NEXT 1<BR><BR>NED IF<BR><BR>NEXT k<BR><BR>END IF<BR><BR>NEXT adr<BR><BR>FOR k=0 TO 1799<BR><BR>POKE k,PEEK(k+&amp;H8000):POKE k+&amp;H8000,0<BR><BR>NEXT k<BR><BR>NEXT n<BR><BR>ww:IF INKEY $="THEN GOTO ww<BR><BR>END<BR><BR>对程序的详细注解:<BR><BR>1.标号pl-pc审不必要的,只是为了下列序述方便<BR><BR>2.pl标号下的循环是把内存中程序中所用的空间清零,以免下次执得本程序时引起混乱.<BR><BR>程序 中每次所画的图形尺寸均为1230*120故需120*120/8=1800个字节.<BR><BR>3.p2、p3标号下是置初始集A0为正方形的边界。其中,p2标号下是代表正方形的上、下两边。p3标号下是处理正方形的左右两边。<BR><BR>4.p4标号下的语句是确定每次图形的位置。<BR><BR>5.p5标号下对n循环。n代表迭代次数。<BR><BR>6.p6标号下对adr循环,adr代表数据存放的地址(段内地址).这一循环相当于对120*120每一象素循环.注意数据的安排是这样:数据区的第一字节表示图形第一行的前8个点(象素).字节的高位D7位表示第一行的第一个点.字节的最后一位D0位表示第一行的第八个点.余此类推..<BR><BR>7.p7标号下的i是图象的行数.这里图象是从第0行开始.到第119竿结束 ,同样列数也是从第0列到第119列.<BR><BR>8.p8标号下的j是图象的列数.(i,j)确定图象的位置.<BR><BR>9.p9、pa中(i(l),j(l))的是迭代后点的位置.<BR><BR>10.pb标号下的adr1中存放的是本次迭代后的结果应存放的地址。<BR><BR>11.pc标号下,是存入本次迭代后的结果。注意这次存入数据不能破坏该字节的其它位,这是用了"或"运算。 <BR>

frogfish 发表于 2005-11-19 14:55

回复:(sihaiwuya)求Sierpinski三角形源程序

自己改写一下吧,下面还有一个,不过也不是matlab 的
[此贴子已经被作者于2005-11-19 14:57:42编辑过]

frogfish 发表于 2005-11-19 14:58

回复:(sihaiwuya)求Sierpinski三角形源程序

Sierpinski三角形和树的画法<BR><BR>
<P>//本程序利用分形技术画图<BR>//先画一个Sierpinski三角形,再画一棵树<BR>//BC 3.1 编译,也可用TC或BCW<BR>//其中函数initgraph的第三个参数可能需要修改<BR>#include "graphics.h"<BR>#include "math.h"<BR>#include "stdlib.h"<BR>#include "conio.h"<BR>#include "time.h"<BR>#define N 65535 //迭代次数<BR>//=============================================================<BR>main()<BR>{ int GraphDriver=DETECT;<BR>int GraphMode;<BR>unsigned int k,mod;<BR>double TempX,TempY,StartX,StartY;<BR>initgraph(&amp;GraphDriver,&amp;GraphMode,"c:\\bc31\\bgi");<BR>randomize();<BR>//===============================================================<BR>//Draw triangle 用迭代函数系(IFS)画三角形<BR>//===============================================================<BR>setbkcolor(BLUE);<BR>cleardevice();<BR>TempX=(double)getmaxx();<BR>TempY=(double)getmaxy();<BR>StartX=TempX;<BR>StartY=TempY;<BR>for(k=1;k&lt;N;k++)<BR>{ TempX=TempX*0.5;<BR>TempY=TempY*0.5;<BR>mod=random(32766) % 3;<BR>switch(mod)<BR>{ case 0: break;<BR>case 1: TempX+=(double)StartX*0.5;<BR>break;<BR>case 2: TempY+=(double)StartY*0.5;<BR>}<BR>putpixel((int)TempX,(int)TempY,YELLOW);<BR>}<BR>settextstyle(SANS_SERIF_FONT,HORIZ_DIR,0);<BR>setusercharsize(3,1,3,1);<BR>outtextxy(450,340,"OK");<BR>getch();<BR>//==============================================================<BR>//Draw tree 用迭代函数系(IFS)画树<BR>//==============================================================<BR>setbkcolor(BLUE);<BR>cleardevice();<BR>break;<BR>case 2: TempX=0.2*StartX-0.16*StartY;<BR>TempY=0.23*StartX+0.22*StartY+1.2;<BR>break;<BR>case 3: TempX=0.2*StartY-0.16*StartX;<BR>TempY=0.26*StartX+0.28*StartY+0.44;<BR>}<BR>putpixel(<BR>100+ (unsigned int)(TempX * (double)(120)),<BR>480- (unsigned int)(TempY * (double)(100)),<BR>GREEN<BR>); //Draw first tree 第一棵树<BR>StartX=TempX;<BR>StartY=TempY;<BR>}<BR>settextstyle(TRIPLEX_FONT,HORIZ_DIR,0);<BR>setusercharsize(2,1,3,1);<BR>outtextxy(450,340,"OK");</P>
<P>getch();<BR>closegraph();<BR>return 0;<BR>} <BR></P>

sihaiwuya 发表于 2005-11-19 16:32

thankyou

<P>谢谢.</P>
页: [1]
查看完整版本: 求Sierpinski三角形源程序