使用Opengl绘制一个奥运五环,要求形状及颜色保持和下图一致,且要求颜色重叠部分完全和下图相同(即需要虑颜色的遮挡)。 并让五环在拖动窗口大小时不变形?
时间: 2024-06-12 20:05:51 浏览: 234
以下是使用OpenGL绘制奥运五环的代码示例:
```c++
#include <GL/glut.h>
void drawCircle(float x, float y, float radius, float r, float g, float b)
{
glColor3f(r, g, b);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x, y);
for (int i = 0; i <= 360; i++)
{
float angle = i * 3.1415926 / 180;
float px = x + radius * cos(angle);
float py = y + radius * sin(angle);
glVertex2f(px, py);
}
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
// draw blue circle
drawCircle(-0.5, 0, 0.15, 0, 0, 1);
// draw yellow circle
drawCircle(0.5, 0, 0.15, 1, 1, 0);
// draw black circle
drawCircle(0, 0, 0.15, 0, 0, 0);
// draw green circle
drawCircle(-0.25, -0.25, 0.15, 0, 1, 0);
// draw red circle
drawCircle(0.25, -0.25, 0.15, 1, 0, 0);
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w >= h)
{
float aspect = (float)w / h;
glOrtho(-1.5 * aspect, 1.5 * aspect, -1.5, 1.5, -1, 1);
}
else
{
float aspect = (float)h / w;
glOrtho(-1.5, 1.5, -1.5 * aspect, 1.5 * aspect, -1, 1);
}
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("Olympic Rings");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glClearColor(1, 1, 1, 1);
glutMainLoop();
return 0;
}
```
该代码使用了OpenGL的基本绘图函数和窗口管理函数,其中`glOrtho()`函数用于让五环在拖动窗口大小时不变形。`drawCircle()`函数用于绘制圆形,其中`glBegin()`和`glEnd()`函数用于指定绘制的图元类型,`glVertex2f()`函数用于指定顶点坐标,`glColor3f()`函数用于指定顶点颜色。在`display()`函数中,分别绘制了五个圆形,并指定了其颜色和位置。在`reshape()`函数中,根据窗口的宽高比例调整了视口大小和投影矩阵,确保五环在拖动窗口大小时不变形。
阅读全文