项目实现
话不多说,上干货!
在本文中,我们将探讨如何使用OpenGL库在DEV C++平台上绘制一个包含星状图形和圆的设计。
功能简单介绍
该代码通过定义多个函数,实现了圆和星状图形的精确绘制。首先,DrawingCircle函数负责绘制圆,通过指定圆心坐标和半径,利用三角形扇形逼近圆形。接着,DrawElement函数用于绘制星状图形的基本元素,即两个三角形组成的叶片。DrawStar函数则通过几何变换,将基本元素旋转并放置在适当位置,形成一个完整的星状图形。
图形如下
图形代码
#include <windows.h>
#include <GL/glut.h>
#include <cmath>
#define GLUT_DISABLE_ATEXIT_HACK
// 绘制圆的函数,添加了圆心坐标参数和半径
void DrawingCircle(GLfloat centerX, GLfloat centerY, GLfloat radius) {
GLint triangleAmount = 100; // 使用的三角形数量
GLfloat twicePi = 2.0 * 3.14159265358979323846;
glBegin(GL_TRIANGLE_FAN);
// 使用新的圆心坐标
glVertex2f(centerX, centerY); // 圆心
for(int i = 0; i <= triangleAmount; i++) {
glVertex2f(
centerX + radius * cos(i * twicePi / triangleAmount),
centerY + radius * sin(i * twicePi / triangleAmount)
);
}
glEnd();
}
// 绘制内部星状结构基本元素的函数
// k —叶片宽度占整个半径的比例
void DrawElement(GLfloat Xo, GLfloat Yo, GLfloat R, GLfloat k=0.25) {
//由两个三角形组成
glBegin(GL_TRIANGLES);
// 第一个三角形(下侧)
glColor3f(1.0, 1.0, 1.0);
glVertex2f(Xo, Yo); // 叶片中心点
glVertex2f(Xo + R, Yo); // 右角
glVertex2f(Xo +k*R , Yo - k*R); // 左下角
glEnd() ;
glBegin(GL_TRIANGLES);
// 第二个三角形(上侧)
glColor3f(0.0, 0.0, 0.0);
glVertex2f(Xo, Yo); // 叶片中心点
glVertex2f(Xo + R, Yo); // 右角
glVertex2f(Xo +k*R , Yo + k*R); // 左上角
glEnd();
}
// 绘制基本元素几何变换及数量的函数
void DrawStar(GLfloat Xo, GLfloat Yo, GLfloat R, GLfloat k, int elementNum = 4) {
float angleStep = 360.0 / elementNum;
for (int i = 0; i < elementNum; ++i) {
glPushMatrix();// 保存当前矩阵状态
glTranslatef(Xo, Yo, 0.0); // 移动至当前叶片的位置
glRotatef(i * angleStep, 0.0, 0.0, 1.0); //旋转相应角度
glTranslatef(-Xo, -Yo, 0.0); //移动到原点
DrawElement(Xo, Yo, R, k); // 绘制元素
glPopMatrix();// 恢复矩阵状态
}
}
// 显示函数
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和缓存区
glMatrixMode(GL_MODELVIEW); //几何变换开启函数
// 调用DrawingCircle(xo,yo,R)函数绘制有圆心的圆
//外圆
glColor3f(0.0, 0.0, 0.0); // 设置绘图颜色
DrawingCircle(750.0, 700.0, 600.0);
//内圆
glColor3f(1.0, 1.0, 1.0); // 设置绘图颜色
DrawingCircle(750.0, 700.0, 500.0);
// 绘制图形内部的星状部分
//原图
glColor3f(0.0, 0.0, 0.0); // 设置绘图颜色
DrawStar(750.0, 700.0, 500.0, 0.25, 4); //星状结构函数参数依次几何中心坐标,半径,叶片宽度占比,叶片数量
//几何变换后图形
glLoadIdentity();
glTranslatef(750,700,0); //移到原位置
glRotatef(45,0.0,0.0,1.0); //旋转相应角度
glTranslatef(-750,-700,0); //移到原点
glColor3f(0.0, 0.0, 0.0); // 设置绘图颜色为黑色
DrawStar(750.0, 700.0, 500.0, 0.25, 4); //绘图
glLoadIdentity();
glFlush(); // 刷新OpenGL命令缓冲区
}
// 初始化OpenGL环境
void init() {
glClearColor(1.0, 1.0, 1.0, 1.0); // 设置背景颜色
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 1500.0, 0.0, 1500.0); // 设置正交投影
}
int main(int argc, char** argv) {
glutInit(&argc, argv); // 初始化GLUT库
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式
glutInitWindowPosition(800, 200); // 窗口位置
glutInitWindowSize(1500, 1500); // 设置窗口大小
glutCreateWindow("OpenGL_Draw_DesignCircle"); // 创建窗口
init(); // 调用初始化函数
glutDisplayFunc(display); // 注册显示回调函数
glutMainLoop(); // 进入GLUT事件处理循环
return 0;
}
上手实践
各位学有余力的先生和女生,如有兴趣的话,不妨参照上面内容,动手绘制下面图片项目,祝你马到成功!
标签:圆心,openGL,星状,图形学,GLfloat,几何变换,图形,include,绘制 From: https://blog.csdn.net/2303_77716250/article/details/142266908