news 2026/4/16 23:40:04

基于 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/16 9:21:40

P0926GX FBM233冗余以太网通信

P0926GX FBM233 冗余以太网通信模块简介: P0926GX FBM233 冗余以太网通信模块是工业自动化系统中的核心网络单元,专门用于实现高速、可靠的以太网数据传输,并通过冗余设计保障通信链路在异常情况下仍能持续运行。 P0926GX FBM233 提供工业以太…

作者头像 李华
网站建设 2026/4/16 9:24:05

基于python的企业物流管理系统[python]-计算机毕业设计源码+LW文档

摘要:随着企业业务的不断拓展和市场竞争的加剧,高效的物流管理成为企业提升竞争力的关键因素。本文介绍了一种基于Python的企业物流管理系统,该系统利用Python的多种强大库和框架,实现了对物流业务流程的全面管理。通过系统用户管…

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

2026年期货量化策略参数优化_避免过拟合的科学方法

免责声明:本文基于个人使用体验,与任何厂商无商业关系。内容仅供技术交流参考,不构成投资建议。 一、前言 策略参数优化是量化交易的重要环节,但过度优化会导致过拟合。2026年了,如何科学地优化参数?如何避…

作者头像 李华
网站建设 2026/4/16 4:04:55

2026年期货量化交易代码重构_提升代码质量的实践方法

免责声明:本文基于个人使用体验,与任何厂商无商业关系。内容仅供技术交流参考,不构成投资建议。 一、前言 量化交易代码会不断迭代,时间长了代码会变得混乱、难以维护。如何重构代码?如何提升代码质量?202…

作者头像 李华
网站建设 2026/4/16 11:13:58

2026年期货量化交易最佳实践_从开发到部署的完整流程

免责声明:本文基于个人使用体验,与任何厂商无商业关系。内容仅供技术交流参考,不构成投资建议。 一、前言 量化交易从想法到实盘,需要经过策略开发、回测验证、模拟测试、实盘部署等多个环节。2026年了,如何建立一套完…

作者头像 李华