Sierpinski Gasket分形图的绘制
分类:
文章
•
2024-09-27 21:13:46



/**//*two-dimensionalSierpinskigasket*/

/**//*generatedusingrandomlyselectedvertices*/

/**//*andbisection*/

#include<GL/glut.h>

voidmyinit()


{


/**//*attributes*/

glClearColor(1.0,1.0,1.0,1.0);/**//*whitebackground*/

glColor3f(1.0,0.0,0.0);/**//*drawinred*/
}

voidreshape(intw,inth)


{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluOrtho2D(0.0,50.0,0.0,50.0);/**//*setupviewing50.0x50.0cameracoordinatewindowwithoriginlowerleft*/

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

voiddisplay()


{

/**//*Atriangle*/

GLfloatvertices[3][2]=
{
{0.0,0.0},
{25.0,50.0},
{50.0,0.0}};
intj,k;

intrand();/**//*standardrandomnumbergenerator*/

GLfloatp[2]=
{7.5,5.0};/**//*arbitraryinitialpointinsidetriangle*/

glClear(GL_COLOR_BUFFER_BIT);/**//*clearthewindow*/
glBegin(GL_POINTS);


/**//*computeandplot5000newpoints*/

for(k=0;k<5000;k++)


{

j=rand()%3;/**//*pickavertexatrandom*/


/**//*computepointhalfwaybetweenselectedvertexandoldpoint*/

p[0]=(p[0]+vertices[j][0])/2.0;
p[1]=(p[1]+vertices[j][1])/2.0;


/**//*plotnewpoint*/

glVertex2fv(p);

}
glEnd();

glFlush();/**//*clearbuffers*/
}

intmain(intargc,char**argv)


{


/**//*standardGLUTinitialization*/
glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/**//*default,notneeded*/

glutInitWindowSize(500,500);/**//*500x500pixelwindow*/

glutInitWindowPosition(0,0);/**//*placewindowtopleftondisplay*/

glutCreateWindow("SierpinskiGasket");/**//*windowtitle*/

glutDisplayFunc(display);/**//*displaycallbackinvokedwhenwindowopened*/
glutReshapeFunc(reshape);

myinit();/**//*setattributes*/

glutMainLoop();/**//*entereventloop*/
}



/**//*recursivesubdivisionoftriangletoformSierpinskigasket*/

/**//*numberofrecursivestepsgivenoncommandline*/

#include<GL/glut.h>


/**//*initialtriangle*/


GLfloatv[3][2]=
{
{-1.0,-0.58},
{1.0,-0.58},
{0.0,1.15}};

intn;

voidtriangle(GLfloat*a,GLfloat*b,GLfloat*c)


/**//*specifyonetriangle*/


{
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
}

voiddivide_triangle(GLfloat*a,GLfloat*b,GLfloat*c,intm)


{


/**//*trianglesubdivisionusingvertexnumbers*/

GLfloatv0[2],v1[2],v2[2];
intj;
if(m>0)


{
for(j=0;j<2;j++)v0[j]=(a[j]+b[j])/2;
for(j=0;j<2;j++)v1[j]=(a[j]+c[j])/2;
for(j=0;j<2;j++)v2[j]=(b[j]+c[j])/2;
divide_triangle(a,v0,v1,m-1);
divide_triangle(c,v1,v2,m-1);
divide_triangle(b,v2,v0,m-1);
}

elsetriangle(a,b,c);/**//*drawtriangleatendofrecursion*/
}


voiddisplay()


{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
divide_triangle(v[0],v[1],v[2],n);
glEnd();
glFlush();
}

voidmyinit()


{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-2.0,2.0,-2.0,2.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(0.0,0.0,1.0);
}

intmain(intargc,char**argv)


{

n=3;/**//*orsetnumberofsubdivisionstepshere*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("SierpinskiGasket");
glutDisplayFunc(display);
myinit();
glutMainLoop();
}


/**//*recursivesubdivisionofatetrahedrontoform3DSierpinskigasket*/

/**//*numberofrecursivestepsgivenoncommandline*/

#include<stdlib.h>
#include<GL/glut.h>


/**//*initialtetrahedron*/


GLfloatv[4][3]=
{
{0.0,0.0,1.0},
{0.0,0.942809,-0.33333},


{-0.816497,-0.471405,-0.333333},
{0.816497,-0.471405,-0.333333}};


GLfloatcolors[4][3]=
{
{1.0,0.0,0.0},
{0.0,1.0,0.0},


{0.0,0.0,1.0},
{0.0,0.0,0.0}};

intn;

voidtriangle(GLfloat*va,GLfloat*vb,GLfloat*vc)


{
glVertex3fv(va);
glVertex3fv(vb);
glVertex3fv(vc);
}

voidtetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d)


{
glColor3fv(colors[0]);
triangle(a,b,c);
glColor3fv(colors[1]);
triangle(a,c,d);
glColor3fv(colors[2]);
triangle(a,d,b);
glColor3fv(colors[3]);
triangle(b,d,c);
}

voiddivide_tetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d,intm)


{

GLfloatmid[6][3];
intj;
if(m>0)


{

/**//*computesixmidpoints*/

for(j=0;j<3;j++)mid[0][j]=(a[j]+b[j])/2;
for(j=0;j<3;j++)mid[1][j]=(a[j]+c[j])/2;
for(j=0;j<3;j++)mid[2][j]=(a[j]+d[j])/2;
for(j=0;j<3;j++)mid[3][j]=(b[j]+c[j])/2;
for(j=0;j<3;j++)mid[4][j]=(c[j]+d[j])/2;
for(j=0;j<3;j++)mid[5][j]=(b[j]+d[j])/2;


/**//*create4tetrahedronsbysubdivision*/

divide_tetra(a,mid[0],mid[1],mid[2],m-1);
divide_tetra(mid[0],b,mid[3],mid[5],m-1);
divide_tetra(mid[1],mid[3],c,mid[4],m-1);
divide_tetra(mid[2],mid[4],d,mid[5],m-1);

}

else(tetra(a,b,c,d));/**//*drawtetrahedronatendofrecursion*/
}


voiddisplay()


{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
divide_tetra(v[0],v[1],v[2],v[3],n);
glEnd();
glFlush();
}


voidmyReshape(intw,inth)


{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,
2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}


intmain(intargc,char**argv)


{

n=3;/**//*orenternumberofsubdivisionstepshere*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("3DGasket");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glEnable(GL_DEPTH_TEST);
glClearColor(1.0,1.0,1.0,1.0);
glutMainLoop();
}