C/C++——动态爱心
前言
这不520快到了吗,相信各位观众老爷都有对象的吧,那这不得表示一下你对她的情意。本篇博客介绍一下爱心,会跳的爱心。表达您们对她的爱意不断。哈哈,废话不多说,下面进入正题。
下面先来看看最后代码实现的样子:
20250514_211233
一、前提准备
运用语言:C/C++。编译器:VS2022。需要用到的知识及外部库:函数、数据类型、指针、变量等内容;需要用到easyx图形库(Windows系统)或者OpenGL(跨平台图形库)。这里我用到的是easyx图形库。
二、代码解析
(一)头文件
代码开头引入了几个关键的头文件:
#include<graphics.h>:这是用于图形绘制相关操作的头文件,像是创建图形窗口、设置颜色、绘制图形(如圆形等)等功能都依赖于这个头文件里定义的函数和类型,是实现我们爱心图形可视化的重要基础。
#include <conio.h>:通常用于实现一些控制台输入输出相关的操作,在这里可能主要是配合后续获取键盘输入等功能来控制程序的运行状态等。
#include<time.h>:引入时间相关的函数和类型定义,代码中利用它结合 srand 函数来初始化随机数生成器,使得程序中的随机效果(比如随机颜色、随机位置等)每次运行都有不同的表现。
#include<math.h>:数学库头文件,里面包含了像 pow(幂运算)、sqrt(开方运算)等诸多数学函数,在计算爱心的坐标、距离以及各种动态变化所涉及的数学计算时发挥了关键作用。
#include<stdlib.h>:提供了像 rand(生成随机数)等一些通用的标准库函数,用于辅助程序实现一些需要随机性质的操作,比如随机生成颜色索引、随机调整点的位置等。
(二)结构体定义
定义一个名为Point的结构体:
这个结构体非常重要,它代表了图形中的一个点,其中 x 和 y 用于记录点的坐标位置,而 color 则用于指定该点的颜色(通过 COLORREF 类型来表示,这是一种用于表示颜色的数据类型)。后续的代码中,无论是爱心的轮廓点还是填充点等,都是通过这个结构体类型的变量来存储和操作的,方便统一管理点的位置与颜色信息。
(三)全局变量与常量的定义
代码中定义了一系列的全局变量和常量:
COLORREF colors[256] = { RGB(255, 32, 83), RGB(252, 222, 250), RGB(255, 0, 0), RGB(255, 0, 0), RGB(255, 2, 2), RGB(255, 0, 8), RGB(255, 5, 5) };:定义了一个颜色数组,里面存储了多种红色系的颜色值,这些颜色后续会被随机选取用来给爱心的各个部分上色,让爱心呈现出丰富绚丽的色彩效果。
const int xScreen = 1200; 和 const int yScreen = 800;:分别定义了图形窗口的宽度和高度,确定了整个爱心动态展示的舞台大小。
const double PI = 3.1426535159;:定义了圆周率的值,在涉及到三角函数等数学计算(比如计算爱心轮廓的坐标等)时会频繁用到。
还有像 const double e = 2.71828;(自然常数)、const double averag_distance = 0.162;(用于判断点间距的一个阈值)、const int quantity = 506;(可能和初始爱心数据点数量相关)、const int circles = 210;(用途和爱心图形构建相关)、const int frames = 20;(表示动画的帧数,决定了爱心动态变化的细腻程度)等常量,它们各自在不同的计算和逻辑控制环节中起着关键的界定作用。
另外,还有两个重要的全局数组 origin_points[quantity] 和 points[circles * quantity],分别用于存储爱心的原始数据点以及经过处理后要用于绘制的点,还有 IMAGE images[frames] 用于存储每一帧的图像数据,方便后续实现动态展示的效果。
(四)重要函数解析
1.creat_random函数
这个函数的功能是生成一个在指定范围内(x1
到 x2
)的随机整数,通过调用 rand
函数并结合取余等运算来实现。不过这里代码有一点小瑕疵,如果 x2
不大于 x1
的话,函数并没有返回值,实际应用中可以考虑添加合适的返回逻辑,比如返回一个默认值等。但在当前代码逻辑中,调用它的地方都是满足 x2 > x1
的情况,所以暂时不影响整体功能。
2.creat_data函数
这个函数是整个代码的核心部分之一,主要负责生成爱心图形的数据以及构建每一帧的图像内容。
1.生成爱心原始数据点:
通过一个循环,利用数学公式来计算爱心轮廓的坐标点,将满足一定距离条件(距离大于 averag_distance)的点存储到 origin_points 数组中,这里的数学公式运用了三角函数来精准描绘爱心的形状,例如:
这就是根据特定的数学模型来确定爱心轮廓上点的坐标的关键代码部分,随着 radian 的不断变化,逐步勾勒出爱心的大致形状。
2. 处理并生成绘制用点:
接着,通过嵌套循环,根据一定的概率(由 success_p 控制)以及尺寸、亮度等因素,对 origin_points 里的点进行处理,给它们赋予颜色(通过对预定义的 colors 数组随机取值并调整亮度得到),同时调整坐标位置(加入一定的随机偏移量),并将这些点存储到 points 数组中,这些点就是后续实际用于绘制爱心图形的基础数据点了。
3. 构建每一帧图像:
对于每一帧(通过 for 循环遍历 frames 次),先初始化一个对应大小(xScreen 和 yScreen)的图像对象,然后设置好坐标原点、纵横比等绘图相关的属性,接着遍历 points 数组中的点,根据每个点的坐标和颜色进行绘制(通过 solidcircle 函数绘制实心圆来模拟爱心的填充效果等),并且还会根据距离等因素动态调整点的坐标,实现爱心的一种动态变化效果。此外,还会根据不同的尺寸条件,在爱心周围绘制一些额外的装饰性的小圆形,进一步丰富画面效果,最后将每一帧图像保存下来,又重新加载进来,为后续在窗口中展示做准备。
3.init函数
这个函数主要用于初始化图形绘制相关的环境,首先创建一个指定大小(xScreen 和 yScreen)的图形窗口,然后通过设置窗口的样式去掉标题栏,调整窗口的位置和显示状态,接着开启批量绘制模式(BeginBatchDraw),这样可以提高图形绘制的效率,同时设置好坐标原点和纵横比,让绘制的图形在窗口中的布局更加合理,最后利用srand结合当前时间初始化随机数生成器,保证每次运行程序的随机效果不同。
三、代码实现
以下皆为个人代码,如有遗漏、错误,欢迎指出。
以上就是对代码的详细解读啦,希望对大家有所帮助哦。另外,祝天下有情人终成眷属!