zoukankan      html  css  js  c++  java
  • OpenGL实例:三角形

    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 <glglut.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 }

  • 相关阅读:
    Android 常见工具类封装
    Android Logcat 封装类
    Android 四大组件之 " Activity "
    "浅谈Android"第一篇:Android系统简介
    罗列的书单
    关于多层架构一些思考
    LeetCode 330. Patching Array
    LeetCode 315. Count of Smaller Numbers After Self(线段树,树状数组)
    LeetCode 316. Remove Duplicate Letters(贪心)
    LeetCode 327. Count of Range Sum(线段树)
  • 原文地址:https://www.cnblogs.com/kailugaji/p/10569784.html
Copyright © 2011-2022 走看看