1. 程式人生 > >02->交互式圖形學--用glut庫實現Sierpinski鏤墊

02->交互式圖形學--用glut庫實現Sierpinski鏤墊

一個 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鏤墊