谢尔宾斯基Sierpinski地毯
分形之谢尔宾斯基(Sierpinski)地毯
前面讲了谢尔宾斯基三角形,和这一节的将把三角形变为正方形,即谢尔宾斯基地毯,它是由瓦茨瓦夫·谢尔宾斯基于1916年提出的一种分形,是自相似集的一种。
谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅在于谢尔宾斯基地毯是以正方形而非等边三角形为基础的。将一个实心正方形划分为的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯。
结果演示:
代码:
#include iostream
#include cstdlib
#include ctime
#include ctype.h
#include vector
#include math.h
#include iomanip
#include graphics.h
#include conio.h
#include windows.h
#include fstream
#include string
using namespace std;
MOUSEMSG m;
HWND hOut;
struct Node
{
double posx,posy;
int num,lifenum;
double R;
};
struct Node1
{
double posx,posy;
int num,lifenum;
double R;
};
Node box[100000];
Node1 eat[100000];
int flag;
int exit1,exit2,exit3;
double R;
double pi;
void draw()
{
int i,j,k;
double x,y;
//cleardevice();
setlinestyle(PS_SOLID,1);
setlinecolor(BLACK);
for(i=0;iflag;i++){
fillrectangle(box[i].posx-box[i].R,box[i].posy-box[i].R,box[i].posx+box[i].R,box[i].posy+box[i].R);
}
FlushBatchDraw();
}
void ff()
{
int i,j,n;
double k;
R=R/3.0;
n=0;
for(i=0;iflag;i++){
eat[n].posx=box[i].posx-2*box[i].R;
eat[n].posy=box[i].posy-2*box[i].R;
eat[n].R=R;
eat[n+1].posx=box[i].posx;
eat[n+1].posy=box[i].posy-2*box[i].R;
eat[n+1].R=R;
eat[n+2].posx=box[i].posx+2*box[i].R;
eat[n+2].posy=box[i].posy-2*box[i].R;
eat[n+2].R=R;
eat[n+3].posx=box[i].posx-2*box[i].R;
eat[n+3].posy=box[i].posy;
eat[n+3].R=R;
eat[n+4].posx=box[i].posx+2*box[i].R;
eat[n+4].posy=box[i].posy;
eat[n+4].R=R;
eat[n+5].posx=box[i].posx-2*box[i].R;
eat[n+5].posy=box[i].posy+2*box[i].R;
eat[n+5].R=R;
eat[n+6].posx=box[i].posx;
eat[n+6].posy=box[i].posy+2*box[i].R;
eat[n+6].R=R;
eat[n+7].posx=box[i].posx+2*box[i].R;
eat[n+7].posy=box[i].posy+2*box[i].R;
eat[n+7].R=R;
n+=8;
}
for(i=0;in;i++){
box[i].posx=eat[i].posx;
box[i].posy=eat[i].posy;
box[i].R=eat[i].R;
}
flag=n;
coutflagendl;
}
void move()
{
int i,j,k;
draw();
Sleep(100);
_getch();
ff();
}
void initialization()
{
int i,j,k;
hOut=initgraph(500, 500,SHOWCONSOLE);
exit1=0;
flag=1;
R=75;
pi=3.141592653;
setbkcolor(WHITE);
setlinecolor(BLACK);
settextcolor(BLACK);
//setfillcolor(BLACK);
box[0].posx=250;box[0].posy=250;
box[0].R=75;
}
void carry()
{
initialization();
BeginBatchDraw();
while(exit1==0){
move();
}
closegraph();
EndBatchDraw();
}
int main()
{
carry();
}
演示视频:
这个是数学文化的作业,我短时间完成度有限,有一个谢尔宾斯基四边形我没想好怎么做,有机会可以考虑。
|谢尔宾斯基Sierpinski地毯
谢尔 谢尔宾斯基Sierpinski地毯