附加實驗1 Sierpinski三角形


 
 
 
1.實驗目的:
理解掌握一個OpenGL繪制圖形的完整程序結構。

2.實驗內容:

(1) 運行示范實驗代碼,掌握程序結構與每一個語句含義;

(2) 了解分形圖形的生成特點,並能將其擴展、舉一反三。

3.實驗原理:

    Sierpinski三角形是一種分形圖形,它是遞歸地構造的。最常見的構造方法如下圖所示:把一個三角形分成四等份,挖掉中間那一份,然后繼續對另外三個三角形進行這樣的操作,並且無限地遞歸下去。每一次迭代后整個圖形的面積都會減小到原來的3/4,因此最終得到的圖形面積顯然為0。這也就是說,Sierpinski三角形其實是一條曲線。

圖1

大概在下圖上標注了一下一個三角形迭代過程:

圖2

生成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}};
int n; // 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;
    int j;
    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雪花:

可參考如下資料:

(1).http://hi.baidu.com/zotin/item/f67aaadb9411934edcf9be6e;

(2).http://blog.csdn.net/fyzhao/article/details/1487639;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM