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 }

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/kailugaji/p/10569784.html
Copyright © 2011-2022 走看看