OpenGL实例:三角形
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
1. 三角形的旋转
- 1 #include <GL/glut.h>
- 2 typedef GLfloat point2d[2]; // a point data type
- 3 void triangle(point2d a, point2d b, point2d c) // display a triangle
- 4 {
- 5 glBegin(GL_TRIANGLES);
- 6 glVertex2fv(a);
- 7 glVertex2fv(b);
- 8 glVertex2fv(c);
- 9 glEnd();
- 10 }
- 11 void display(void)
- 12 {
- 13 point2d v[3] = { {-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15} }; //initial triangle vertices
- 14 glClear(GL_COLOR_BUFFER_BIT); // Clear display window
- 15 glColor3f(0.0, 0.0, 1.0); // Set fill color to blue
- 16 glLoadIdentity();//应该放在此处,保证每次显示正确
- 17 glViewport(0, 0, 300, 400); // Set left viewport
- 18 triangle(v[0], v[1], v[2]);
- 19 glColor3f(1.0, 0.0, 0.0); // Set fill color to red
- 20 glViewport(300, 0, 300, 400); // Set right viewport
- 21 glRotatef(90.0, 0.0, 0.0, 1.0); // Rotate about z axis
- 22 triangle(v[0], v[1], v[2]); // Display blue triangle
- 23 glFlush();
- 24 }
- 25 void init()
- 26 {
- 27 glMatrixMode(GL_PROJECTION);
- 28 //glLoadIdentity();//如果放在此处,会导致第一次显示正确,再次刷新时图形旋转
- 29 gluOrtho2D(-2.0, 2.0, -2.0, 2.0);
- 30 glMatrixMode(GL_MODELVIEW);
- 31 glClearColor(1.0, 1.0, 1.0, 1.0);
- 32 }
- 33 void main(int argc, char **argv)
- 34 {
- 35 glutInit(&argc, argv);
- 36 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- 37 glutInitWindowSize(600, 400);
- 38 glutCreateWindow("Triangle");
- 39 glutDisplayFunc(display);
- 40 init();
- 41 glutMainLoop();
- 42 }

参考网址:Opengl编程实例-红蓝三角形 - 图形学与可视化 - CSDN博客
2. Sierpinski gasket
方法1:非递归
- 1 #include <cstdlib>
- 2 #include <gl\glut.h>
- 3 class GLintPoint
- 4 {
- 5 public:
- 6 GLint x;
- 7 GLint y;
- 8 GLintPoint(GLint a, GLint b) {
- 9 x = a;
- 10 y = b;
- 11 }
- 12 };
- 13 void myInit(void)
- 14 {
- 15 glClearColor(0.0, 0.0, 0.0, 0.0);
- 16 glColor3f(1.0, 0.0, 0.0);
- 17 glPointSize(2.0);
- 18 glMatrixMode(GL_PROJECTION);
- 19 glLoadIdentity();
- 20 gluOrtho2D(0.0, 600.0, 0.0, 600.0);
- 21 }
- 22 void drawDot(GLint x, GLint y) {
- 23 glBegin(GL_POINTS);
- 24 glVertex2i(x, y);
- 25 glEnd();
- 26 }
- 27 void myDisplay() {
- 28 glClear(GL_COLOR_BUFFER_BIT);
- 29 GLintPoint T[3] = { GLintPoint(10, 10), GLintPoint(600, 10), GLintPoint(300, 600) };
- 30 int index = rand() % 3;
- 31 GLintPoint point = T[index];
- 32 drawDot(point.x, point.y);
- 33 for (int i = 0; i < 5000; i++) {
- 34 index = rand() % 3;
- 35 point.x = (point.x + T[index].x) / 2;
- 36 point.y = (point.y + T[index].y) / 2;
- 37 drawDot(point.x, point.y);
- 38 }
- 39 glFlush();
- 40 }
- 41 int main(int argc, char *argv[])
- 42 {
- 43 glutInit(&argc, argv);
- 44 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
- 45 glutInitWindowPosition(100, 100);
- 46 glutInitWindowSize(500, 400);
- 47 glutCreateWindow("Sierphiski gasket");
- 48 glutDisplayFunc(&myDisplay);
- 49 myInit();
- 50 glutMainLoop();
- 51 return 0;
- 52 }

方法2:递归
- 1 #include <GL/glut.h>
- 2 #include<stdlib.h>
- 3 /* initial triangle */
- 4 GLfloat v[3][2] = { {10.0, 10.0}, {600.0, 10.0}, {300.0, 600.0} };
- 5 int n;
- 6 void triangle(GLfloat *a, GLfloat *b, GLfloat *c)
- 7 /* display one triangle */
- 8 {
- 9 glVertex2fv(a);
- 10 glVertex2fv(b);
- 11 glVertex2fv(c);
- 12 }
- 13 void divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int m)
- 14 {
- 15 /* triangle subdivision using vertex numbers */
- 16 GLfloat v0[2], v1[2], v2[2];
- 17 int j;
- 18 if (m > 0)
- 19 {
- 20 for (j = 0; j < 2; j++) v0[j] = (a[j] + b[j]) / 2;
- 21 for (j = 0; j < 2; j++) v1[j] = (a[j] + c[j]) / 2;
- 22 for (j = 0; j < 2; j++) v2[j] = (b[j] + c[j]) / 2;
- 23 divide_triangle(a, v0, v1, m - 1);
- 24 divide_triangle(c, v1, v2, m - 1);
- 25 divide_triangle(b, v2, v0, m - 1);
- 26 }
- 27 else triangle(a, b, c); /* draw triangle at end of recursion */
- 28 }
- 29 void display(void)
- 30 {
- 31 glClear(GL_COLOR_BUFFER_BIT);
- 32 glBegin(GL_TRIANGLES);
- 33 divide_triangle(v[0], v[1], v[2], n);
- 34 glEnd();
- 35 glFlush();
- 36 }
- 37 void myinit()
- 38 {
- 39 glMatrixMode(GL_PROJECTION);
- 40 glLoadIdentity();
- 41 gluOrtho2D(0.0, 600.0, 0.0, 600.0);
- 42 glMatrixMode(GL_MODELVIEW);
- 43 glClearColor(0.0, 0.0, 0.0, 0.0);
- 44 glColor3f(1.0, 0.0, 0.0);
- 45 }
- 46 void main(int argc, char **argv)
- 47 {
- 48 n = 15;
- 49 glutInit(&argc, argv);
- 50 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- 51 glutInitWindowSize(500, 400);
- 52 glutCreateWindow("Sierpinski Gasket");
- 53 glutDisplayFunc(display);
- 54 myinit();
- 55 glutMainLoop();
- 56
- 57 }
