Sierpinski&镂垫
生成Sierpinski 镂垫算法描述:
& (1)在三角形内部随机选取一个点作为初始点
& (2)在三角形的3个顶点中随机选取一个,求出该顶点与初始点连线的中点,画出该中点
&&(3)将(2)中的中点作为初始点,转到(2)
下面是OpenGL的具体实现:
#include &GL/glut.h&
#include &cstdlib&
#define N 5000
typedef GLfloat point[2];
point vertex[3] = {{5.0,5.0},{50.0,90.0},{95.0,5.0}};
void display()
glClear(GL_COLOR_BUFFER_BIT);
& &int i,j;
&& point p = {50.0,50.0};
& &glBegin(GL_POINTS);
&& for(i = 0 ; i &
&j = rand()%3;
&p[0] = (p[0] + vertex[j][0]) / 2;
&p[1] = (p[1] + vertex[j][1]) / 2;
&glVertex2fv(p);
& &glEnd();
& &glFlush();
void myinit()
&glClearColor(1.0,1.0,1.0,1.0);
&glColor3f(0,1.0,0);
&glMatrixMode(GL_PROJECTION);
&glLoadIdentity();
&gluOrtho2D(0,100.0,0,100.0);
&glMatrixMode(GL_MODELVIEW);
int main(int argc,char** argv)
&glutInit(&argc,argv);
&glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
&glutInitWindowPosition(100,100);
&glutInitWindowSize(500,500);
&glutCreateWindow("Sierpinsk 镂垫");
&glutDisplayFunc(display);
&myinit();
&glutMainLoop();
&&& return
运行程序,可得Sierpinski 镂垫,如下:
<img STYLE="width: 386 height: 347" src="/blog7style/images/common/sg_trans.gif" real_src ="/middle/cc469c2c1a&690"
ALT="Sierpinski&镂垫"
TITLE="Sierpinski&镂垫" />
可见,在次数N较大时,它并没表现出随机性;分析最原始的三角形,连结三边的中点,将原三角形分成4个小三角形,无论你如何选择初始点,要画出的点都不会出现在中间那个倒立的三角区域中。基于此,可以通过递归的方式生成Sierpinski
镂垫,对于每个三角形,去掉其中间的那个三角形部分。
实现如下:
#include &GL/glut.h&
#include &cstdlib&
#define N 5
typedef GLfloat point[2];
point vertex[3] = {{5.0,5.0},{50.0,90.0},{95.0,5.0}};
void draw_triangle(point v1,point v2,point v3)
&glBegin(GL_TRIANGLES);
&glVertex2fv(v1);
&glVertex2fv(v2);
&glVertex2fv(v3);
void divide_triangle(point v1,point v2,point v3,int n)
&point p[3];
&&for(int i = 0 ; i
& 2 ; ++i)
&&&p[0][i] =
(v1[i] + v2[i]) / 2;
&&&p[1][i] =
(v2[i] + v3[i]) / 2;
&&&p[2][i] =
(v3[i] + v1[i]) / 2;
&÷_triangle(p[0],v2,p[1],n-1);
&÷_triangle(p[0],v1,p[2],n-1);
&÷_triangle(p[1],v3,p[2],n-1);
&&draw_triangle(v1,v2,v3);
void display()
&glClear(GL_COLOR_BUFFER_BIT);
÷_triangle(vertex[0],vertex[1],vertex[2],N);
&glFlush();
void myinit()
&glClearColor(1.0,1.0,1.0,1.0);
&glColor3f(0,1.0,0);
&glMatrixMode(GL_PROJECTION);
&glLoadIdentity();
&gluOrtho2D(0,100.0,0,100.0);
&glMatrixMode(GL_MODELVIEW);
int main(int argc,char** argv)
&glutInit(&argc,argv);
&glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
&glutInitWindowPosition(100,100);
&glutInitWindowSize(500,500);
&glutCreateWindow("Sierpinsk 镂垫");
&glutDisplayFunc(display);
&myinit();
&glutMainLoop();
&&& return
&下面将这个2维的Sierpinski 镂垫转换为3维的Sierpinski
镂垫,上面的两种方式均可以完成转换,这里采用递归的方式,实现如下:
#include &GL/glut.h&
#define N 4
typedef float point[3];
point v[]={{0.0, 0.0, 1.0}, {0.0, 0.942809, -0.33333},
{-0.816497, -0.471405, -0.333333}, {0.816497, -0.471405,
-0.333333}};
void triangle( point a, point b, point c)
&glBegin(GL_TRIANGLES);
glVertex3fv(a);
glVertex3fv(b);
glVertex3fv(c);
void divide_triangle(point a, point b, point c, int m)
for(int j=0; j&3; j++)
&&&v[0][j]=(a[j]+b[j])/2;
&&&v[1][j]=(a[j]+c[j])/2;
&&&v[2][j]=(b[j]+c[j])/2;
divide_triangle(a, v[0], v[1], m-1);
divide_triangle(c, v[1], v[2], m-1);
divide_triangle(b, v[2], v[0], m-1);
&&triangle(a,b,c);
void tetrahedron(int m)
&glColor3f(1.0,0.0,0.0);
divide_triangle(v[0], v[1], v[2], m);
&glColor3f(0.0,1.0,0.0);
divide_triangle(v[3], v[2], v[1], m);
&glColor3f(0.0,0.0,1.0);
divide_triangle(v[0], v[3], v[1], m);
&glColor3f(0.0,0.0,0.0);
divide_triangle(v[0], v[2], v[3], m);
void display()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
tetrahedron(N);
glFlush();
void myReshape(int w, int h)
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
&&&&&&&&&&&
2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
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();
void myinit()
&glEnable(GL_DEPTH_TEST);
&&& glClearColor
(1.0, 1.0, 1.0, 1.0);
void main(int argc, char **argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
&glutInitWindowPosition(100,100);
glutInitWindowSize(500, 500);
glutCreateWindow("3D Sierpinski 镂垫");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
&myinit();
glutMainLoop();
运行结果如下:
<img src="/blog7style/images/common/sg_trans.gif" real_src ="/middle/cc"
ALT="Sierpinski&镂垫"
TITLE="Sierpinski&镂垫" />
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。交互式计算机图形学_实 例 程 序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
交互式计算机图形学_实 例 程 序
以​四​自​由​度​关​节​型​工​程​机​械​手​三​维​实​时​动​态​仿​真​系​统​为​背​景​,​介​绍​了​O​p​e​n​G​L​ ​图​形​库​的​功​能​和​特​点​以​及​O​p​e​n​G​L​与​W​i​n​d​o​w​s​图​形​接​口​的​设​置​方​法​。​在​进​行​运​动​学​分​析​的​基​础​上​,​建​立​了​机​械​手​数​学​模​型​,​阐​述​了​利​用​O​p​e​n​G​L​和​V​C​+​+​ . ​联​合​编​程​以​实​现​机​械​手​动​态​仿​真​的​方​法​。​最​后​讨​论​了​O​p​e​n​G​L​在​机​器​人​仿​真​中​的​应​用​前​景​,​用​O​p​e​n​G​L​图​形​库​对​机​器​人​的​动​态​仿​真​有​一​定​通​用​性​,​对​降​低​机​器​人​的​设​计​成​本​以​及​运​动​学​实​验​具​有​重​要​的​现​实​意​义​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢【论文】外场中Sierpinski镂垫上磁模型的临界性质_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
中国最大最早的专业内容网站
评价文档:
&购买后可评价
&&¥2.00
&&¥2.00
&&¥2.00
&&¥2.00
&&¥2.00
&&¥2.00
&&¥3.00
&&¥2.00
&&¥1.00
&&¥2.00
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。
外场中Sierpinski镂垫上磁模型的临界性质
采​用​空​间​部​分​中​点​消​约​重​整​化​群​变​换​的​方​法​,​研​究​了​有​外​磁​场​S​i​e​r​p​i​n​s​k​i​镂​垫​上​I​s​i​n​g​模​型​和​G​a​u​s​s​模​型​的​相​变​和​临​界​性​质​,​求​出​了​其​临​界​点​的​临​界​指​数​。​结​果​表​明​:​在​这​种​分​形​晶​格​上​,​两​种​模​型​的​临​界​性​质​存​在​很​大​的​差​异​,​即​在​临​界​点​处​,​对​于​I​s​i​n​g​模​型​,​最​近​邻​相​互​作​用​参​量​K​ ​*​=​∞​,​磁​场​h​ ​*​=;​而​对​于​G​a​u​s​s​模​型​,​K​ ​*​=​b​/b​是​G​a​u​s​s​分​布​常​数​)​,​h​ ​*​=。
试读已结束,如果需要继续阅读或下载,敬请购买
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢
同期刊文献附加实验1 Sierpinski三角形 - 慢步前行 - 博客园
1.实验目的:
理解掌握一个OpenGL绘制图形的完整程序结构。
2.实验内容:
(1) 运行示范实验代码,掌握程序结构与每一个语句含义;
(2) 了解分形图形的生成特点,并能将其扩展、举一反三。
3.实验原理:
&&& Sierpinski三角形是一种分形图形,它是递归地构造的。最常见的构造方法如下图所示:把一个三角形分成四等份,挖掉中间那一份,然后继续对另外三个三角形进行这样的操作,并且无限地递归下去。每一次迭代后整个图形的面积都会减小到原来的3/4,因此最终得到的图形面积显然为0。这也就是说,Sierpinski三角形其实是一条曲线。
大概在下图上标注了一下一个三角形迭代过程:
生成Sierpinski 三角形算法描述,如图1所示:
(1)从一个三角形开始;
(2)连接三边的中点并去掉中间的三角形;
(3)重复上述过程;
4.示范代码:
#include &GL/glut.h&// a point data type typedef GLfloat point2d[2];//initial triangle point2d v[3] = {{-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15}}; // number of recursive steps
// display one triangle void triangle( point2d a, point2d b, point2d c){&&& glBegin(GL_TRIANGLES);&&& glVertex2fv(a);&&& glVertex2fv(b);&&& &&& glVertex2fv(c);&&& glEnd();}
// triangle subdivision using vertex numbers void divide_triangle(point2d a, point2d b, point2d c, int m) {&&& point2d v0, v1, v2;&&&&&& 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);&&& }&&& else(triangle(a,b,c));// draw triangle at end of recursion}
void mydisplay(void) {&&& glClear(GL_COLOR_BUFFER_BIT);&&& divide_triangle(v[0], v[1], v[2], n);&&& glFlush();}
void init() {&&& glClearColor(1.0, 1.0, 1.0,1.0); &&& glColor3f(0.0,0.0,0.0);&&& &&& glMatrixMode(GL_PROJECTION);&&& glLoadIdentity();&&& glOrtho(-2.0, 2.0, -2.0, 2.0, -1.0, 1.0);}
void main(int argc, char **argv){&&& n=1;&&& glutInit(&argc, argv);&&& glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);&&& glutInitWindowSize(500, 500);&&& glutInitWindowPosition(50,50); &&& glutCreateWindow("2D Sierpinski");&&& glutDisplayFunc(mydisplay);&&& init();&&& glutMainLoop();}
4. 实验作业:
请参考上述代码实现Koch曲线或Koch雪花的生成。
Koch曲线:
Koch雪花:
可参考如下资料:计算机图形学实验指导_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
计算机图形学实验指导
计​算​机​图​形​学​上​指​导
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢