OpenGL实例:三角形

时间:2023-03-09 19:40:21
OpenGL实例:三角形

OpenGL实例:三角形

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

更多请查看:计算机图形学

1. 三角形的旋转

 #include <GL/glut.h>
typedef GLfloat point2d[]; // a point data type
void triangle(point2d a, point2d b, point2d c) // display a triangle
{
glBegin(GL_TRIANGLES);
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
glEnd();
}
void display(void)
{
point2d v[] = { {-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15} }; //initial triangle vertices
glClear(GL_COLOR_BUFFER_BIT); // Clear display window
glColor3f(0.0, 0.0, 1.0); // Set fill color to blue
glLoadIdentity();//应该放在此处,保证每次显示正确
glViewport(, , , ); // Set left viewport
triangle(v[], v[], v[]);
glColor3f(1.0, 0.0, 0.0); // Set fill color to red
glViewport(, , , ); // Set right viewport
glRotatef(90.0, 0.0, 0.0, 1.0); // Rotate about z axis
triangle(v[], v[], v[]); // Display blue triangle
glFlush();
}
void init()
{
glMatrixMode(GL_PROJECTION);
//glLoadIdentity();//如果放在此处,会导致第一次显示正确,再次刷新时图形旋转
gluOrtho2D(-2.0, 2.0, -2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0, 1.0, 1.0, 1.0);
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(, );
glutCreateWindow("Triangle");
glutDisplayFunc(display);
init();
glutMainLoop();
}

OpenGL实例:三角形

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

2. Sierpinski gasket

方法1:非递归

 #include <cstdlib>
#include <gl\glut.h>
class GLintPoint
{
public:
GLint x;
GLint y;
GLintPoint(GLint a, GLint b) {
x = a;
y = b;
}
};
void myInit(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glPointSize(2.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 600.0, 0.0, 600.0);
}
void drawDot(GLint x, GLint y) {
glBegin(GL_POINTS);
glVertex2i(x, y);
glEnd();
}
void myDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
GLintPoint T[] = { GLintPoint(, ), GLintPoint(, ), GLintPoint(, ) };
int index = rand() % ;
GLintPoint point = T[index];
drawDot(point.x, point.y);
for (int i = ; i < ; i++) {
index = rand() % ;
point.x = (point.x + T[index].x) / ;
point.y = (point.y + T[index].y) / ;
drawDot(point.x, point.y);
}
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(, );
glutInitWindowSize(, );
glutCreateWindow("Sierphiski gasket");
glutDisplayFunc(&myDisplay);
myInit();
glutMainLoop();
return ;
}

OpenGL实例:三角形

方法2:递归

 #include <GL/glut.h>
#include<stdlib.h>
/* initial triangle */
GLfloat v[][] = { {10.0, 10.0}, {600.0, 10.0}, {300.0, 600.0} };
int n;
void triangle(GLfloat *a, GLfloat *b, GLfloat *c)
/* display one triangle */
{
glVertex2fv(a);
glVertex2fv(b);
glVertex2fv(c);
}
void divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int m)
{
/* triangle subdivision using vertex numbers */
GLfloat v0[], v1[], v2[];
int j;
if (m > )
{
for (j = ; j < ; j++) v0[j] = (a[j] + b[j]) / ;
for (j = ; j < ; j++) v1[j] = (a[j] + c[j]) / ;
for (j = ; j < ; j++) v2[j] = (b[j] + c[j]) / ;
divide_triangle(a, v0, v1, m - );
divide_triangle(c, v1, v2, m - );
divide_triangle(b, v2, v0, m - );
}
else triangle(a, b, c); /* draw triangle at end of recursion */
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
divide_triangle(v[], v[], v[], n);
glEnd();
glFlush();
}
void myinit()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 600.0, 0.0, 600.0);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
}
void main(int argc, char **argv)
{
n = ;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(, );
glutCreateWindow("Sierpinski Gasket");
glutDisplayFunc(display);
myinit();
glutMainLoop(); }

OpenGL实例:三角形