Sierpinski Gasket分形图的绘制

本文介绍如何使用OpenGL和GLUT库通过两种方法绘制二维和三维的谢尔宾斯基垫片:一种是通过随机选择顶点并进行二分迭代;另一种是采用递归三角形细分的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

200792501.jpg

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*two-dimensionalSierpinskigasket*/
ExpandedBlockStart.gifContractedBlock.gif
/**//*generatedusingrandomlyselectedvertices*/
ExpandedBlockStart.gifContractedBlock.gif
/**//*andbisection*/
None.gif
None.gif#include
<GL/glut.h>
None.gif
None.gif
voidmyinit()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*attributes*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglClearColor(
1.0,1.0,1.0,1.0);/**//*whitebackground*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglColor3f(
1.0,0.0,0.0);/**//*drawinred*/
ExpandedBlockEnd.gif}

None.gif
None.gif
voidreshape(intw,inth)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglViewport(
0,0,(GLsizei)w,(GLsizei)h);
InBlock.gifglMatrixMode(GL_PROJECTION);
InBlock.gifglLoadIdentity();
ExpandedSubBlockStart.gifContractedSubBlock.gifgluOrtho2D(
0.0,50.0,0.0,50.0);/**//*setupviewing50.0x50.0cameracoordinatewindowwithoriginlowerleft*/
InBlock.gif
InBlock.gifglMatrixMode(GL_MODELVIEW);
InBlock.gifglLoadIdentity();
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
voiddisplay()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*Atriangle*/
ExpandedSubBlockStart.gifContractedSubBlock.gifGLfloatvertices[
3][2]=dot.gif{dot.gif{0.0,0.0},dot.gif{25.0,50.0},dot.gif{50.0,0.0}};
InBlock.gif
intj,k;
ExpandedSubBlockStart.gifContractedSubBlock.gif
intrand();/**//*standardrandomnumbergenerator*/
ExpandedSubBlockStart.gifContractedSubBlock.gifGLfloatp[
2]=dot.gif{7.5,5.0};/**//*arbitraryinitialpointinsidetriangle*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglClear(GL_COLOR_BUFFER_BIT);
/**//*clearthewindow*/
InBlock.gifglBegin(GL_POINTS);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*computeandplot5000newpoints*/
InBlock.gif
InBlock.gif
for(k=0;k<5000;k++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gifj
=rand()%3;/**//*pickavertexatrandom*/
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*computepointhalfwaybetweenselectedvertexandoldpoint*/
InBlock.gif
InBlock.gifp[
0]=(p[0]+vertices[j][0])/2.0;
InBlock.gifp[
1]=(p[1]+vertices[j][1])/2.0;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*plotnewpoint*/
InBlock.gif
InBlock.gifglVertex2fv(p);
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gifglEnd();
ExpandedSubBlockStart.gifContractedSubBlock.gifglFlush();
/**//*clearbuffers*/
ExpandedBlockEnd.gif}

None.gif
None.gif
intmain(intargc,char**argv)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*standardGLUTinitialization*/
InBlock.gifglutInit(
&argc,argv);
ExpandedSubBlockStart.gifContractedSubBlock.gifglutInitDisplayMode(GLUT_SINGLE
|GLUT_RGB);/**//*default,notneeded*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglutInitWindowSize(
500,500);/**//*500x500pixelwindow*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglutInitWindowPosition(
0,0);/**//*placewindowtopleftondisplay*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglutCreateWindow(
"SierpinskiGasket");/**//*windowtitle*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglutDisplayFunc(display);
/**//*displaycallbackinvokedwhenwindowopened*/
InBlock.gifglutReshapeFunc(reshape);
ExpandedSubBlockStart.gifContractedSubBlock.gifmyinit();
/**//*setattributes*/
ExpandedSubBlockStart.gifContractedSubBlock.gifglutMainLoop();
/**//*entereventloop*/
ExpandedBlockEnd.gif}

None.gif

200792502.jpg

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*recursivesubdivisionoftriangletoformSierpinskigasket*/
ExpandedBlockStart.gifContractedBlock.gif
/**//*numberofrecursivestepsgivenoncommandline*/
None.gif
None.gif#include
<GL/glut.h>
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*initialtriangle*/
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloatv[
3][2]=dot.gif{dot.gif{-1.0,-0.58},dot.gif{1.0,-0.58},dot.gif{0.0,1.15}};
None.gif
None.gif
intn;
None.gif
None.gif
voidtriangle(GLfloat*a,GLfloat*b,GLfloat*c)
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*specifyonetriangle*/
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglVertex2fv(a);
InBlock.gifglVertex2fv(b);
InBlock.gifglVertex2fv(c);
ExpandedBlockEnd.gif}

None.gif
None.gif
voiddivide_triangle(GLfloat*a,GLfloat*b,GLfloat*c,intm)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*trianglesubdivisionusingvertexnumbers*/
InBlock.gif
InBlock.gifGLfloatv0[
2],v1[2],v2[2];
InBlock.gif
intj;
InBlock.gif
if(m>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
for(j=0;j<2;j++)v0[j]=(a[j]+b[j])/2;
InBlock.gif
for(j=0;j<2;j++)v1[j]=(a[j]+c[j])/2;
InBlock.gif
for(j=0;j<2;j++)v2[j]=(b[j]+c[j])/2;
InBlock.gifdivide_triangle(a,v0,v1,m
-1);
InBlock.gifdivide_triangle(c,v1,v2,m
-1);
InBlock.gifdivide_triangle(b,v2,v0,m
-1);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockStart.gifContractedSubBlock.gif
elsetriangle(a,b,c);/**//*drawtriangleatendofrecursion*/
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
voiddisplay()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglClear(GL_COLOR_BUFFER_BIT);
InBlock.gifglBegin(GL_TRIANGLES);
InBlock.gifdivide_triangle(v[
0],v[1],v[2],n);
InBlock.gifglEnd();
InBlock.gifglFlush();
ExpandedBlockEnd.gif}

None.gif
None.gif
voidmyinit()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglMatrixMode(GL_PROJECTION);
InBlock.gifglLoadIdentity();
InBlock.gifgluOrtho2D(
-2.0,2.0,-2.0,2.0);
InBlock.gifglMatrixMode(GL_MODELVIEW);
InBlock.gifglClearColor(
1.0,1.0,1.0,1.0);
InBlock.gifglColor3f(
0.0,0.0,1.0);
ExpandedBlockEnd.gif}

None.gif
None.gif
intmain(intargc,char**argv)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gifn
=3;/**//*orsetnumberofsubdivisionstepshere*/
InBlock.gifglutInit(
&argc,argv);
InBlock.gifglutInitDisplayMode(GLUT_SINGLE
|GLUT_RGB);
InBlock.gifglutInitWindowSize(
500,500);
InBlock.gifglutCreateWindow(
"SierpinskiGasket");
InBlock.gifglutDisplayFunc(display);
InBlock.gifmyinit();
InBlock.gifglutMainLoop();
ExpandedBlockEnd.gif}

None.gif

200792503.jpg

ExpandedBlockStart.gifContractedBlock.gif/**//*recursivesubdivisionofatetrahedrontoform3DSierpinskigasket*/
ExpandedBlockStart.gifContractedBlock.gif
/**//*numberofrecursivestepsgivenoncommandline*/
None.gif
None.gif#include
<stdlib.h>
None.gif#include
<GL/glut.h>
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**//*initialtetrahedron*/
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloatv[
4][3]=dot.gif{dot.gif{0.0,0.0,1.0},dot.gif{0.0,0.942809,-0.33333},
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{-0.816497,-0.471405,-0.333333},dot.gif{0.816497,-0.471405,-0.333333}}
;
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloatcolors[
4][3]=dot.gif{dot.gif{1.0,0.0,0.0},dot.gif{0.0,1.0,0.0},
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{0.0,0.0,1.0},dot.gif{0.0,0.0,0.0}}
;
None.gif
None.gif
intn;
None.gif
None.gif
voidtriangle(GLfloat*va,GLfloat*vb,GLfloat*vc)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglVertex3fv(va);
InBlock.gifglVertex3fv(vb);
InBlock.gifglVertex3fv(vc);
ExpandedBlockEnd.gif}

None.gif
None.gif
voidtetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglColor3fv(colors[
0]);
InBlock.giftriangle(a,b,c);
InBlock.gifglColor3fv(colors[
1]);
InBlock.giftriangle(a,c,d);
InBlock.gifglColor3fv(colors[
2]);
InBlock.giftriangle(a,d,b);
InBlock.gifglColor3fv(colors[
3]);
InBlock.giftriangle(b,d,c);
ExpandedBlockEnd.gif}

None.gif
None.gif
voiddivide_tetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d,intm)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
InBlock.gifGLfloatmid[
6][3];
InBlock.gif
intj;
InBlock.gif
if(m>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*computesixmidpoints*/
InBlock.gif
InBlock.gif
for(j=0;j<3;j++)mid[0][j]=(a[j]+b[j])/2;
InBlock.gif
for(j=0;j<3;j++)mid[1][j]=(a[j]+c[j])/2;
InBlock.gif
for(j=0;j<3;j++)mid[2][j]=(a[j]+d[j])/2;
InBlock.gif
for(j=0;j<3;j++)mid[3][j]=(b[j]+c[j])/2;
InBlock.gif
for(j=0;j<3;j++)mid[4][j]=(c[j]+d[j])/2;
InBlock.gif
for(j=0;j<3;j++)mid[5][j]=(b[j]+d[j])/2;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*create4tetrahedronsbysubdivision*/
InBlock.gif
InBlock.gifdivide_tetra(a,mid[
0],mid[1],mid[2],m-1);
InBlock.gifdivide_tetra(mid[
0],b,mid[3],mid[5],m-1);
InBlock.gifdivide_tetra(mid[
1],mid[3],c,mid[4],m-1);
InBlock.gifdivide_tetra(mid[
2],mid[4],d,mid[5],m-1);
InBlock.gif
ExpandedSubBlockEnd.gif}

ExpandedSubBlockStart.gifContractedSubBlock.gif
else(tetra(a,b,c,d));/**//*drawtetrahedronatendofrecursion*/
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
voiddisplay()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglClear(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT);
InBlock.gifglBegin(GL_TRIANGLES);
InBlock.gifdivide_tetra(v[
0],v[1],v[2],v[3],n);
InBlock.gifglEnd();
InBlock.gifglFlush();
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
voidmyReshape(intw,inth)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifglViewport(
0,0,w,h);
InBlock.gifglMatrixMode(GL_PROJECTION);
InBlock.gifglLoadIdentity();
InBlock.gif
if(w<=h)
InBlock.gifglOrtho(
-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,
InBlock.gif
2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
InBlock.gif
else
InBlock.gifglOrtho(
-2.0*(GLfloat)w/(GLfloat)h,
InBlock.gif
2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-10.0,10.0);
InBlock.gifglMatrixMode(GL_MODELVIEW);
InBlock.gifglutPostRedisplay();
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
intmain(intargc,char**argv)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gifn
=3;/**//*orenternumberofsubdivisionstepshere*/
InBlock.gifglutInit(
&argc,argv);
InBlock.gifglutInitDisplayMode(GLUT_SINGLE
|GLUT_RGB|GLUT_DEPTH);
InBlock.gifglutInitWindowSize(
500,500);
InBlock.gifglutCreateWindow(
"3DGasket");
InBlock.gifglutReshapeFunc(myReshape);
InBlock.gifglutDisplayFunc(display);
InBlock.gifglEnable(GL_DEPTH_TEST);
InBlock.gifglClearColor(
1.0,1.0,1.0,1.0);
InBlock.gifglutMainLoop();
ExpandedBlockEnd.gif}

None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值