Advertisement

opengl绘制奥运五环

阅读量:

记录一下最近的课程学习。

因为个人愚钝的原因导致学习速率较慢。近期整体状态较为低迷。尽管大部分同学已经完成作业, 我才完成自己的作业

最初尝试采用GL_POLYGON方式,在填充外圆后,在内部添加白色线条以形成环状结构。但最终效果并不令人满意,这可能源于我的设计思路存在不足。随后参考指导教师的意见,改用GL_LINE_STRIP绘制,相比之前的方法,所需的代码量减少了很多,并且预期效果会更加理想。然而在实际编码过程中仍感较为复杂繁琐

复制代码
 #include <GL/glut.h>

    
 #include<math.h>
    
 using namespace std;
    
 #define PI	3.14159265354
    
 GLfloat CIRCLE = 1.2f;
    
 GLfloat CIRCLE2 = 1.0f;
    
 int point = 720;
    
 GLfloat z = -5.0f;  //用于记录平移距离
    
  
    
 void init(void)
    
 {
    
     glClearColor(0.0, 0.0, 0.0, 0.0);
    
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    
 }
    
  
    
 void Reshape(GLsizei w, GLsizei h)
    
 {  //重置窗口大小
    
     glViewport(0, 0, w, h);
    
     glMatrixMode(GL_PROJECTION);
    
     glLoadIdentity();
    
     gluPerspective(60.0, 1.0 * (GLfloat)w / (GLfloat)h, 1.0, 30.0);
    
     glMatrixMode(GL_MODELVIEW);
    
     glLoadIdentity();
    
     glTranslatef(0.0, 0.0, -3.6);
    
 }
    
  
    
 // 显示函数,采用堆栈的方式
    
 void display()
    
  {
    
     glClearColor(1, 1, 1, 0);
    
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
  
    
     glLoadIdentity();   // 设置单位矩阵
    
     glTranslatef(0.0f, 0.0f, z);
    
  
    
     glLoadIdentity();
    
     glRotatef(1, 1.0f, 0.0f, 0.0f);
    
     double angle1 = 2 * PI / point;
    
  
    
     glPushMatrix();     // 绘制蓝色圆环
    
     glColor4f(0, 0, 1, 0.7);
    
     glTranslatef(-2.4f, 1.0f, z);
    
     double angle2 = 0.0;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= point; i++)
    
     {
    
     angle2 += angle1;//每次循环加一度
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));//利用三角函数定位每次绘画的点的位置
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); // 补充黄色圆环
    
     glColor4f(1, 0.7, 0, 0.9);
    
     glTranslatef(-1.2f, 0.0f, z);
    
     angle2 = 0.0;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= point; i++)
    
     {
    
     angle2 += angle1;//每次循环加一度,共进行60次循环,实现绘画一个60度的扇形的效果
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); //绘制黑色圆环
    
     glTranslatef(0.1f, 1.0f, z);
    
     glColor4f(0, 0, 0, 0.7);
    
     angle2 = 0.0;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= point; i++)
    
     {
    
     angle2 += angle1;//每次循环加一度
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); //绘制绿色圆环
    
     glColor4f(0.1, 0.9, 0.1, 0.8);
    
     glTranslatef(1.4f, 0.0f, z);
    
     angle2 = 0.0;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= point; i++)
    
     {
    
     angle2 += angle1;//每次循环加一度
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); //绘制红色圆环
    
     glColor4f(1, 0, 0, 0.7);
    
     glTranslatef(2.6f, 1.0f, z);
    
     angle2 = 0.0;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= point; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix();     
    
     glColor4f(0, 0, 1, 0.7);
    
     glTranslatef(-2.4f, 1.0f, z);
    
     angle2 = angle1 * 600;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= 300; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
     
    
  
    
     glPushMatrix(); // 补充黄色圆环
    
     glColor4f(1, 0.7, 0, 0.9);
    
     glTranslatef(-1.2f, 0.0f, z);
    
     angle2 = angle1 * 600;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= 300; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); //补充黑色圆环
    
     glTranslatef(0.1f, 1.0f, z);
    
     glColor4f(0, 0, 0, 0.7);
    
     angle2 = angle1 * 500;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= 300; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
     glPushMatrix(); //补充绿色圆环
    
     glColor4f(0.1, 0.9, 0.1, 0.8);
    
     glTranslatef(1.4f, 0.0f, z);
    
     angle2 = angle1 * 300;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= 100; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     angle2 = angle1 * 100;
    
     glBegin(GL_LINE_STRIP);
    
     for (int i = 0; i <= 80; i++)
    
     {
    
     angle2 += angle1;
    
     glVertex2d(CIRCLE * cos(angle2), CIRCLE * sin(angle2));
    
     glVertex2d(CIRCLE2 * cos(angle2), CIRCLE2 * sin(angle2));
    
     }
    
     glEnd();
    
     glPopMatrix();
    
  
    
  
    
     glFlush();
    
     glutSwapBuffers();  // 交换前后缓冲,实现双缓冲
    
 }
    
  
    
 int main(int argc, char** argv)
    
 {
    
     glutInit(&argc, argv);// double 用双缓冲
    
     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    
     glutInitWindowSize(500, 300);
    
     glutInitWindowPosition(200, 200);
    
     glutCreateWindow("奥运五环");
    
     init();
    
     glutReshapeFunc(Reshape);
    
     glutDisplayFunc(display);
    
     glutMainLoop();
    
     return 0;
    
 }

下面看看效果图吧!这个属于二维图形范畴内的东西,并不属于立体圆环。看到网上很多关于如何实现立体效果的教程后发现这些知识对我来说还是有点难度的。我的代码就这么只是个简单的代码片段而已。

全部评论 (0)

还没有任何评论哟~