如何在Dev C/C++中使用OpenGL绘制加拿大国旗红枫叶
如何用Dev C/C++结合OpenGL绘制加拿大国旗枫叶?
目标图像:
我尝试了一段代码,但生成的结果(
)和目标图像不符,请问该怎么修改?
我的代码如下:
#include <windows.h> #include <gl/glut.h> void display() { glClearColor(0.3, 0.1, 0.1, 0.2); glClear(GL_COLOR_BUFFER_BIT); //glTranslatef(0.5, 0, 0); //glScalef(0.5, 0.5, 0); //glRotatef(0, 0, 0, 0); //Unifolié also known as Maple Leaf glBegin(GL_POLYGON); glColor3f(0.8, 0.0, 0.0); glVertex2f(0.0, 0.0); glVertex2f(-0.25, -0.5); glVertex2f(-0.1, -0.2); glVertex2f(-0.35, -0.2); glVertex2f(-0.2, 0.0); glVertex2f(-0.5, 0.5); glVertex2f(-0.25, 0.2); glVertex2f(-0.35, 0.5); glVertex2f(0.0, 0.2); glVertex2f(0.35, 0.5); glVertex2f(0.25, 0.2); glVertex2f(0.5, 0.5); glVertex2f(0.2, 0.0); glVertex2f(0.35, -0.2); glVertex2f(0.1, -0.2); glVertex2f(0.25, -0.5); glColor3f(1, 0, 0); glVertex2f(0.00, 0.00); glVertex2f(0.00, 0.90); glVertex2f(-0.08, 0.70); glVertex2f(-0.12, 0.66); glVertex2f(-0.16, 0.66); glVertex2f(-0.20, 0.68); glVertex2f(-0.24, 0.74); glVertex2f(-0.22, 0.64); glVertex2f(-0.22, 0.62); glVertex2f(-0.24, 0.56); glVertex2f(-0.26, 0.54); glVertex2f(-0.30, 0.54); glVertex2f(-0.34, 0.56); glVertex2f(-0.36, 0.60); glVertex2f(-0.36, 0.56); glVertex2f(-0.38, 0.54); glVertex2f(-0.40, 0.54); glVertex2f(-0.42, 0.54); glVertex2f(-0.56, 0.60); glVertex2f(-0.52, 0.54); glVertex2f(-0.50, 0.50); glVertex2f(-0.48, 0.44); glVertex2f(-0.48, 0.42); glVertex2f(-0.50, 0.38); glVertex2f(-0.54, 0.34); glVertex2f(-0.48, 0.32); glVertex2f(-0.44, 0.28); glVertex2f(-0.42, 0.22); glVertex2f(-0.42, 0.20); glVertex2f(-0.44, 0.16); glVertex2f(-0.46, 0.16); //this 1st glVertex2f(-0.52, 0.18); glVertex2f(-0.54, 0.24); glVertex2f(-0.54, 0.20); glVertex2f(-0.56, 0.16); glVertex2f(-0.60, 0.14); glVertex2f(-0.62, 0.14); glVertex2f(-0.70, 0.16); glVertex2f(-0.76, 0.20); glVertex2f(-0.78, 0.24); glVertex2f(-0.76, 0.18); glVertex2f(-0.74, 0.14); glVertex2f(-0.70, 0.08); glVertex2f(-0.68, 0.06); glVertex2f(-0.66, 0.02); glVertex2f(-0.66, 0.00); glVertex2f(-0.68, -0.04); glVertex2f(-0.64, -0.02); glVertex2f(-0.62, -0.02); glVertex2f(-0.56, -0.04); glVertex2f(-0.52, -0.08); glVertex2f(-0.48, -0.16); glVertex2f(-0.48, -0.20); glVertex2f(-0.50, -0.26); glVertex2f(-0.52, -0.30); glVertex2f(-0.58, -0.34); glVertex2f(-0.42, -0.32); glVertex2f(-0.30, -0.28); glVertex2f(-0.18, -0.22); glVertex2f(-0.10, -0.20); glVertex2f(0.00, -0.22); glVertex2f(0.10, -0.20); glVertex2f(0.18, -0.22); glVertex2f(0.30, -0.28); glVertex2f(0.42, -0.32); glVertex2f(0.58, -0.34); glVertex2f(0.52, -0.30); glVertex2f(0.50, -0.26); glVertex2f(0.48, -0.20); glVertex2f(0.48, -0.16); glVertex2f(0.52, -0.08); glVertex2f(0.56, -0.04); glVertex2f(0.62, -0.02); glVertex2f(0.64, -0.02); glVertex2f(0.68, -0.04); glVertex2f(0.66, 0.00); glVertex2f(0.66, 0.02); glVertex2f(0.68, 0.06); glVertex2f(0.70, 0.08); glVertex2f(0.74, 0.14); glVertex2f(0.76, 0.18); glVertex2f(0.78, 0.24); glVertex2f(0.76, 0.20); glVertex2f(0.70, 0.16); glVertex2f(0.62, 0.14); glVertex2f(0.60, 0.14); glVertex2f(0.56, 0.16); glVertex2f(0.54, 0.20); glVertex2f(0.54, 0.24); glVertex2f(0.52, 0.18); glVertex2f(0.46, 0.16); glVertex2f(0.44, 0.16); glVertex2f(0.42, 0.20); glVertex2f(0.42, 0.22); glVertex2f(0.44, 0.28); glVertex2f(0.48, 0.32); glVertex2f(0.54, 0.34); glVertex2f(0.50, 0.38); glVertex2f(0.48, 0.42); glVertex2f(0.48, 0.44); glVertex2f(0.50, 0.50); glVertex2f(0.52, 0.54); glVertex2f(0.56, 0.60); glVertex2f(0.42, 0.54); glVertex2f(0.40, 0.54); glVertex2f(0.38, 0.54); glVertex2f(0.36, 0.56); glVertex2f(0.36, 0.60); glVertex2f(0.34, 0.56); glVertex2f(0.30, 0.54); glVertex2f(0.26, 0.54); glVertex2f(0.24, 0.56); glVertex2f(0.22, 0.62); glVertex2f(0.22, 0.64); glVertex2f(0.24, 0.74); glVertex2f(0.20, 0.68); glVertex2f(0.16, 0.66); glVertex2f(0.12, 0.66); glVertex2f(0.08, 0.70); glVertex2f(0.00, 0.90); glEnd(); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitWindowSize(1000, 1000); glutInitWindowPosition(10, 10); glutCreateWindow("Maple Leaf"); glutDisplayFunc(display); glutMainLoop(); return 0; }
问题分析
- 原代码将两组无关顶点放在同一个
GL_POLYGON中,OpenGL会按顺序连接所有顶点,导致图形错乱。 - 缺少投影矩阵设置,窗口缩放时图形会变形,部分顶点可能超出可视区域。
- 顶点顺序不符合多边形绘制要求(需按顺时针/逆时针连续环绕)。
修正后的代码
#include <windows.h> #include <gl/glut.h> void init() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 设置正交投影,固定坐标范围,保持图形比例 gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display() { glClearColor(1.0, 1.0, 1.0, 1.0); // 背景设为白色,匹配加拿大国旗 glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); // 枫叶纯红色 // 按逆时针顺序绘制枫叶完整轮廓 glBegin(GL_POLYGON); // 顶部顶点开始 glVertex2f(0.0, 0.9); glVertex2f(-0.08, 0.7); glVertex2f(-0.12, 0.66); glVertex2f(-0.16, 0.66); glVertex2f(-0.20, 0.68); glVertex2f(-0.24, 0.74); glVertex2f(-0.22, 0.64); glVertex2f(-0.22, 0.62); glVertex2f(-0.24, 0.56); glVertex2f(-0.26, 0.54); glVertex2f(-0.30, 0.54); glVertex2f(-0.34, 0.56); glVertex2f(-0.36, 0.60); glVertex2f(-0.36, 0.56); glVertex2f(-0.38, 0.54); glVertex2f(-0.40, 0.54); glVertex2f(-0.42, 0.54); glVertex2f(-0.56, 0.60); glVertex2f(-0.52, 0.54); glVertex2f(-0.50, 0.50); glVertex2f(-0.48, 0.44); glVertex2f(-0.48, 0.42); glVertex2f(-0.50, 0.38); glVertex2f(-0.54, 0.34); glVertex2f(-0.48, 0.32); glVertex2f(-0.44, 0.28); glVertex2f(-0.42, 0.22); glVertex2f(-0.42, 0.20); glVertex2f(-0.44, 0.16); glVertex2f(-0.46, 0.16); glVertex2f(-0.52, 0.18); glVertex2f(-0.54, 0.24); glVertex2f(-0.54, 0.20); glVertex2f(-0.56, 0.16); glVertex2f(-0.60, 0.14); glVertex2f(-0.62, 0.14); glVertex2f(-0.70, 0.16); glVertex2f(-0.76, 0.20); glVertex2f(-0.78, 0.24); glVertex2f(-0.76, 0.18); glVertex2f(-0.74, 0.14); glVertex2f(-0.70, 0.08); glVertex2f(-0.68, 0.06); glVertex2f(-0.66, 0.02); glVertex2f(-0.66, 0.0); glVertex2f(-0.68, -0.04); glVertex2f(-0.64, -0.02); glVertex2f(-0.62, -0.02); glVertex2f(-0.56, -0.04); glVertex2f(-0.52, -0.08); glVertex2f(-0.48, -0.16); glVertex2f(-0.48, -0.20); glVertex2f(-0.50, -0.26); glVertex2f(-0.52, -0.30); glVertex2f(-0.58, -0.34); glVertex2f(-0.42, -0.32); glVertex2f(-0.30, -0.28); glVertex2f(-
相关产品推荐
相关产品推荐

