#include #include <gl/glut.h> #include //引入cmath库,用于数学计算

#define PI 3.14 //定义常量PI

using namespace std; //使用命名空间std

typedef struct point { //定义结构体point,包含x和y两个成员变量 float x; float y; } POINT;

void changeSize(GLsizei w, GLsizei h) { //定义函数changeSize,用于改变窗口大小 if (h == 0) { //如果高度为0,则将高度设为1,避免除0错误 h == 1; } //设置窗口可见区域 glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //选择投影矩阵 glLoadIdentity(); //重置当前矩阵为单位矩阵

int dis = w > h ? w : h; //求出宽度和高度中的较大值

glViewport(0, 0, dis, dis); //设置视口大小为较大值

if (w <= h) { //如果宽度小于等于高度
    glOrtho(-1.0, 1.0, 1.0, 1.0 * h / w, 1.0, -1.0); //正交投影,将坐标系映射到(-1,1)x(-h/w,h/w)x(-1,1)的立方体中
}
else { //如果宽度大于高度
    glOrtho(-1.0, 1.0 * h / w, 1.0, 1.0, 1.0, -1.0); //正交投影,将坐标系映射到(-w/h,w/h)x(-1,1)x(-1,1)的立方体中
}
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity(); //重置当前矩阵为单位矩阵

}

void init() { //定义函数init,用于初始化OpenGL glClearColor(1.0, 0.0, 0.0, 0.0); //设置背景色为红色 glMatrixMode(GL_PROJECTION); //选择投影矩阵 glLoadIdentity(); //重置当前矩阵为单位矩阵 gluOrtho2D(0, 240, 0, 160); //二维正交投影,将坐标系映射到(0,240)x(0,160)的矩形中 }

void DrawStar() { //定义函数DrawStar,用于绘制五角星 POINT p = {-1.5/3,0.25}; //定义点p,表示五角星的中心点 POINT v = {-1.53,0.4}; //定义向量v,表示五角星的一个顶点 POINT vt[12]; //定义数组vt,用于存储五角星的12个顶点 vt[0] = p; //将点p赋值给vt[0] vt[1] = v; //将向量v赋值给vt[1] / for (int i = 0; i < 5; i++) { v[i].x = p.x-0.05*cos(atan((p.y-))) }
*/ //以上代码是对五角星的五个顶点进行计算,但是未完成,因此被注释掉了

glBegin(GL_TRIANGLE_FAN); //开始绘制三角形,采用三角形扇形绘制方式
float length1 = sqrt(pow((vt[0].x - vt[1].x), 2) + pow((vt[0].y - vt[1].y), 2)); //计算五角星的边长
float length2 = length1 * sin(0.1 * PI) / sin(126.0 / 180 * PI); //计算五角星的对角线长度

double initx = atan((vt[1].y - vt[0].y) / (vt[1].x - vt[0].x)); //计算五角星的初始角度

for (int i = 2; i < 12; i++) { //循环计算五角星的12个顶点的坐标
    initx = initx - 0.2 * PI; //每次减去0.2PI
    if (i % 2 == 0) { //如果是偶数个顶点
        vt[i].x = length2 * cos(initx) + vt[0].x; //计算x坐标
        vt[i].y = length2 * sin(initx) + vt[0].y; //计算y坐标
    }
    else { //如果是奇数个顶点
        vt[i].x = length1 * cos(initx) + vt[0].x; //计算x坐标
        vt[i].y = length1 * sin(initx) + vt[0].y; //计算y坐标
    }
}
for (int i = 0; i < 12; i++) { //循环绘制五角星的12个顶点
    glVertex3f(vt[i].x, vt[i].y, 0.5); //指定顶点坐标
}

glEnd(); //结束绘制
glFlush(); //强制刷新缓冲区

}

void display() { //定义函数display,用于显示五角星 glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲区 glColor3f(1.0, 1.0, 0.0); //设置绘制颜色为黄色 DrawStar(); //绘制五角星 glutSwapBuffers(); //交换前后缓冲区 }

int main(int argc, char** argv) //主函数 { glutInit(&argc, argv); //初始化glut库 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式,单缓冲,RGB色 glutInitWindowPosition(100, 100); //设置窗口初始位置 glutInitWindowSize(480, 320); //设置窗口大小 glutCreateWindow("Flag"); //创建窗口,并设置窗口名称为Flag init(); //初始化OpenGL glutReshapeFunc(changeSize); //设置重置窗口大小的回调函数 glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓冲区 glClearColor(1.0, 0.0, 0.0, 0.0); //设置背景色为红色 glutDisplayFunc(display); //设置绘图函数 glutMainLoop(); //进入消息循环 return 0;

为以下代码添加详细注释#include iostream#include glgluth#includecmath#define PI 314using namespace std;typedef struct point float x; float y; POINT;修改整个界面void changeSizeGLsizei w GLsizei h if h == 0

原文地址: https://www.cveoy.top/t/topic/fbdX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录