首页 > 其他 > 详细

OpenGL绘制Sierpinski triangle

时间:2014-02-23 16:19:02      阅读:593      评论:0      收藏:0      [点我收藏+]

Sierpinski镂垫是一个有趣的图形,在分形几何中是重要的研究对象。可以参看wiki. 本文通过两种方式,递归和非递归来展示如何绘制Sierpinski镂垫。 Sierphiski镂垫的构造函数如下:

  1. 在三角形内随机选择一初始点(x,y,z).
  2. 随机选择三个顶点之一。
  3. 找出(x,y,z)和随机顶点这二者连线的中点。
  4. 在显示器上把这个点表示出来。
  5. 用这个点替换(x,y,z).
  6. 返回步骤2。

非递归随机生成点

++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <GL\glut.h>
#include <stdlib.h>
void reshape(int w,int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat nrange = 10;
    if(w>h)
    {
        glOrtho(-nrange*w/h,nrange*w/h,-nrange,nrange,-nrange,nrange);
    }
    else
    {
        glOrtho(-nrange,nrange,-nrange*h/w,nrange*h/w,-nrange,nrange);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,5,0,0,0,0,1,0);
}

void renderScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0,0.3,0.3);
    GLfloat vertices[3][3] = \{\{0.0,5.0,0.0},{-5.0,-5.0,0.0},{5.0,-5.0,0.0\}\}; //平面z里任意一个三角形
    GLfloat p[3] = {0.0,0.0,0.0}; //三角形内任意一点
    int j,k;
    int rand();
    glBegin(GL_POINTS);
        for(k=0; k<5000; k++)
        {
            j = rand()%3; //从0,1,2中随机选择一个点
            p[0] = (p[0]+vertices[j][0])/2;
            p[1] = (p[1]+vertices[j][1])/2;

            glVertex3fv(p); //显示新的点
        }
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,100);

    glutCreateWindow("Sierphiski triangle");
    glutReshapeFunc(reshape);
    glutDisplayFunc(renderScene);

    glutMainLoop();
}

bubuko.com,布布扣sierpinski

递归绘制三角形

另一种方法是采用递归的形式来绘制三角形,更改的代码部分如下:

++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void triangle(GLfloat *a,GLfloat *b,GLfloat *c)
{
    glVertex3fv(a);
    glVertex3fv(b);
    glVertex3fv(c);
}

void divide_triangle(GLfloat *a,GLfloat *b, GLfloat *c,int k)
{
    GLfloat ab[2],ac[2],bc[2];
    int j=0;
    if(k>0)
    {
        for(j=0;j<2;j++) 
        {
            ab[j] = (a[j]+b[j])/2;
            ac[j] = (a[j]+c[j])/2;
            bc[j] = (b[j]+c[j])/2;
        }
        divide_triangle(a,ab,ac,k-1);
        divide_triangle(c,ac,bc,k-1);
        divide_triangle(b,ab,bc,k-1);
    }
    else
        triangle(a,b,c);
}
void renderScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    GLfloat vertices[3][3] = { {0.0,5.0,0.0},{-5.0,-5.0,0.0},{5.0,-5.0,0.0} }; //平面z里任意一个三角形
    int n = 5;
    glColor3f(1.0,0.3,0.3);
    glBegin(GL_TRIANGLES);
        divide_triangle(vertices[0],vertices[1],vertices[2],n);
    glEnd();

    glutSwapBuffers();
}

bubuko.com,布布扣

OpenGL绘制Sierpinski triangle

原文:http://www.cnblogs.com/cupcoffee/p/3561590.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!