02->交互式圖形學--用glut庫實現Sierpinski鏤墊
阿新 • • 發佈:2018-08-27
一個 tro buffer nts gin 分享圖片 blog UNC win
Sierpinski圖形是一類有趣的圖形,本文結合交互式圖形學教材,講解Sierpinski鏤墊圖形生成,作為入門圖形學編程的第一課。為了簡便,本文就2D來進行討論。實驗環境見01
算法
主要是根據隨機性生成一系列的點,這些點在屏幕上顯示,發現無序中盡顯有序!算法流程如下:
1 在三角形內隨機選擇一個初始點p(x, y)
2 隨機選擇三角形頂點之一
3 計算p和隨機選擇頂點之間的中點q
4 將q對應位置用相應標記在圖形中顯示出來
5 用這個中點q代替原來的p
6 轉到步驟2,直到取得一定數量的點
代碼
實驗中,初始點p選擇三角形的一條中位線的中點,總共生成5000個頂點
1 #include <glut.h>
2 #include <stdlib.h>
3 #include <vector>
4 using namespace std;
5
6 class Point2d {
7 public:
8 GLfloat x = 0.0f;
9 GLfloat y = 0.0f;
10 Point2d(const GLfloat &a, const GLfloat &b) : x(a), y(b) {}
11 Point2d() {}
12 };
13
14 Point2d triVer[3]; // 初始三角形頂點
15
16 // 計算兩點連線的中點
17 Point2d halfScale(const Point2d &a, const Point2d &b) {
18 Point2d res;
19 res.x = (a.x + b.x) / 2.0;
20 res.y = (a.y + b.y) / 2.0;
21 return res;
22 }
23
24 void SierpinskiDisp() {
25
26 // 設置初始三角形頂點
27 triVer[0] = Point2d(-0.8f, -0.8f);
28 triVer[1] = Point2d(0.0f, 0.8f);
29 triVer[2] = Point2d(0.8f, -0.8f);
30
31 vector<Point2d> points(5000);
32
33 // 取三角形一條中位線的中點做為初始三角形內的點
34 Point2d u, v, p;
35 u = halfScale(triVer[0], triVer[1]);
36 v = halfScale(triVer[0], triVer[2]);
37 p = halfScale(u, v);
38 points[0].x = p.x;
39 points[0].y = p.y;
40
41 for (int i = 1; i < 5000; i++) {
42 int j = rand() % 3;
43 p = halfScale(points[i - 1], triVer[j]);
44 points[i] = p;
45 }
46 glClearColor(0.5, 0.5, 0.5, 1.0);
47 glClear(GL_COLOR_BUFFER_BIT);
48
49 // 畫三角形頂點
50 glColor3f(1.0f, 0.0f, 0.0f);
51 glPointSize(6.0f);
52 glBegin(GL_POINTS);
53 for (int i = 0; i < 3; i++) {
54 glVertex2f(triVer[i].x, triVer[i].y);
55 }
56 glEnd();
57
58 // 畫隨機生成的5000個點
59 glColor3f(1.0f, 1.0f, 0.0f);
60 glPointSize(3.0f);
61 glBegin(GL_POINTS);
62 for (int i = 0; i < 5000; i++) {
63 glVertex2f(points[i].x, points[i].y);
64 }
65 glEnd();
66 glFlush();
67 }
68
69 int main(int argc, char *argv[]) {
70 glutInit(&argc, argv);
71 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
72 glutInitWindowPosition(100, 100);
73 glutInitWindowSize(600, 600);
74 glutCreateWindow("Sierpinski鏤墊");
75 glutDisplayFunc(&SierpinskiDisp);
76 glutMainLoop();
77 }
結果
02->交互式圖形學--用glut庫實現Sierpinski鏤墊