


/**//*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();
}
本文介绍如何使用OpenGL和GLUT库通过两种方法绘制二维和三维的谢尔宾斯基垫片:一种是通过随机选择顶点并进行二分迭代;另一种是采用递归三角形细分的方法。
4127

被折叠的 条评论
为什么被折叠?



