news 2026/4/19 14:31:38

基于 C++ OpenGL框架实现五角星绘制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 C++ OpenGL框架实现五角星绘制

实验目的和要求

学会配置GLUT开发库并使用Visual Studio C++开发OpenGL程序。

实验内容和原理

在Windows系统中,配置GLUT库:解压并打开文件夹glut.zip,取出glut.h,glut32.lib,glut32.dll。之后有两种配置方式,一是将以上3个文件分别放在系统盘的相应目录下;二是针对具体项目(本次实验给定项目Ex1)进行配置。

开发OpenGL程序:编译运行项目Ex1,确认无误后修改代码生成以下图形:

主要仪器设备

Visual Studio 2017

Glut压缩包

Ex1 工程

操作方法和实验步骤

配置环境

首先在包含工程文件的文件夹中创建了OpenGL的目录,按照如下分层存放GLUT文件:

为保证工程文件以及该实验内容可以在不同的机器上运行,在VS2017的解决方案里做了如下处理:

注意!!!!该实验是在Release x64版本下实现的,请务必注意运行环境!!!!

五角星的绘制

众所周知OpenGL是只能绘制凸多边形的,对于五角星这样的非凸多边形,只能采取分割成若干凸多边形的方式来绘制。我采取的是分割成五个单位四边形来绘制的。

如下图所示,每一个正五角星都可以贝尔分割成由五个类似于四边形ABCD构成的图形。重点的角度已在图中标出。其中∠ABC=pi/10,∠BAC=pi/5。在绘制五角星之前,我们先确定了两个点——五角星的中心点A以及其中一个顶点B。下面我们通过几何关系求出C、D两个点。

那么通过解三角形,我们可以得出两个关系式:

CH/AH=tan36° CH/BH=tan18°

变形得到:

AH=tan18°/(tan36°+tan18°)* AB

CH=tan36°* AH

这样,我们就可以解出C的坐标,D坐标同理即可。单位四边形的绘制代码实现如下:

下一步是根据一个单位四边形绕点A旋转若干个72°后得到剩余四个四边形,拼成一个五角星。在代码实现中,我定义了一个二维旋转函数rotate2d(),其参数表中包含中心点的坐标以及顶点坐标的指针形式和旋转角度。通过三角变换,可以更新顶点坐标值,从而写入指针中。旋转函数和五角星绘制的具体代码如下:

五角星位置的确定

我参考了我们五星红旗的设计图。然而非常鬼畜的一点是,示例文件中给出的数据显示画出的红色矩形竟然是长宽比1:1?事实上,国旗的长宽比是3:2。于是乎死马当作活马医,暂且就用相同的方法这么画它。

首先将矩形分成四份,其中中心点即为坐标原点(这是一个二维图形,理论上二维坐标就够了,至于第三个坐标参数可以理解为在z=0.5这个平面上)。从图中可以清楚地确定出五个五角星中心点的具体坐标以及大五角星的上方的顶点坐标。其余四个五角星的顶点坐标的确定需要通过解几何关系的方法。其画法为:以四点为圆心,各以一等分为半径,分别作四个圆。在每个圆上各定出五个等距离的点,其中均须各有一点位于大五角星中心点与以上四个圆心的各联结线上。然后用构成大五角星的同样方法,构成小五角星。此四颗小五角星均各有一个角尖正对大五角星的中心点。

具体计算时,先通过反三角函数关系解出夹角,然后用正弦或余弦函数求出连线,减去一个单位圆对应的长度后得到顶点的横纵坐标。国旗绘制五角星部分的代码如下:

实验数据记录和处理

在数据处理方面有一点:因为原矩形给出的比例过于诡异,在后面画五角星确定位置时,对于单位圆的半径大小,采用了十等分的结果而不是十五等份的结果。

实验结果与分析

有一点非常奇特的现象:随着图形窗口的调整,这个图形的比例会发生不同程度的变形:

还不是很清楚这一点怎么解决……因为很多GLUT库的函数还没有很深入地了解和接触,目前查到了这几个函数或许可以解决:

glutReshapFun():用以指定窗口大小调整时的重绘制函数,但是需要先自己注册一个窗口改变的函数,还没有摸索出来这个函数应该怎么写。有时间的话会完善这里。

讨论、心得

在绘制五角星的过程中,还考虑到了其他的方法,也有尝试实现过:

1.绘制一系列单位三角形;

将五角星分解为10个形如△ABD的三角形,共用五角星中心点作为顶点,这样就可以使用GL_TRIANGLE_FAN(连接成扇形的三角形系列)几何图元类型进行填充。

2.外周五个三角形+中心的正五边形;

这种方法比较繁琐,最后没有采用。但显然也是可行的。

另外,关于图形缩放变形的问题,也是值得后续继续讨论的问题。还会继续研究与学习。

♻️ 资源

大小:1.06MB

➡️资源下载:https://download.csdn.net/download/s1t16/87404303

注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 14:33:25

智能控制雨刷设计

智能控制雨刷设计与实现 第一章 设计背景与核心目标 传统汽车雨刷多采用固定档位手动调节,存在刮刷频率与实际雨量不匹配、雨天视线改善不及时、频繁手动操作分散驾驶注意力等问题,影响驾驶安全性与舒适性。智能控制雨刷依托传感检测、自动控制与汽车电…

作者头像 李华
网站建设 2026/4/18 16:53:48

智能交流稳态电源控制器

智能交流稳态电源控制器设计 第一章 设计背景与核心目标 在工业自动化、精密测试设备、通信电源及实验室供电系统中,交流供电质量直接影响设备运行稳定性与测量精度。传统交流稳压装置多采用机械调压或简单晶闸管调压方式,存在响应速度慢、稳压精度低、波…

作者头像 李华
网站建设 2026/4/8 7:51:03

西门子200smart运动控制四轴搬运取料机(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

西门子200smart运动控制四轴搬运取料机(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码该程序为两台smart plc通过通讯控制四轴伺服电机的搬运取料机案例工程案例程序。 商品包含200smar_PLC程序项目电气接线图程序流程说明触…

作者头像 李华
网站建设 2026/4/17 21:33:16

2026大模型平台漏洞全景报告:攻防新格局下的风险纵深与防御体系

2026年,大语言模型(LLM)技术正从单一文本交互向自主智能体协同、全模态融合、长期记忆落地的新阶段高速演进,攻击面随技术能力同步拓宽,漏洞类型从传统的提示注入、数据泄露,升级为智能体劫持、多模态隐形注…

作者头像 李华