经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
OpenGL实例:三角形
来源:cnblogs  作者:凯鲁嘎吉  时间:2019/3/22 8:47:42  对本文有异议

OpenGL实例:三角形

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

1. 三角形的旋转

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

参考网址:Opengl编程实例-红蓝三角形 - 图形学与可视化 - CSDN博客

2. Sierpinski gasket

方法1:非递归

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

方法2:递归

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

原文链接:http://www.cnblogs.com/kailugaji/p/10569784.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号