
写在前面
这是一段用C++编写的图形动画程序,它通过EasyX图形库绘制了一个动态的爱心表白动画。程序不仅展现了精美的视觉效果,还巧妙地融合了数学函数、颜色渐变和动画帧控制等技术,最终呈现出一个浪漫而富有诗意的"我爱你"图形动画。整个项目从数据生成到图形渲染,再到动画播放,逻辑清晰、结构完整,充分体现了程序设计的艺术性与技术性。
系列文章
| 序号 | 直达链接 |
|---|---|
| 1 | C/C++李峋同款跳动的爱心 |
| 2 | C/C++跳动的爱心 |
| 3 | C/C++经典爱心 |
| 4 | C/C++满屏飘字 |
| 5 | C/C++大雪纷飞 |
| 6 | C/C++黑客帝国字母雨 |
| 7 | C/C++樱花树 |
| 8 | C/C++奥特曼 |
| 9 | C/C++精美圣诞树 |
| 10 | C/C++俄罗斯方块小游戏 |
| 11 | C/C++贪吃蛇小游戏 |
| 12 | C/C++孤单又灿烂的神 |
| 13 | C/C++闪烁的爱心 |
| 14 | C/C++哆啦A梦 |
| 15 | C/C++简单圣诞树 |
| 16 | C/C++小宇宙 |
| 17 | C/C++冰墩墩 |
| 18 | C/C++七彩花朵 |
| 19 | C/C++玫瑰花 |
| 20 | C/C++小猪佩奇 |
| 21 | C/C++简易爱心 |
| 22 | C/C++流星雨① |
| 23 | C/C++2048小游戏 |
| 24 | C/C++爱心圣诞树 |
| 25 | C/C++文字跑马灯 |
| 26 | C/C++教师工作量管理系统 |
| 27 | C/C++满天繁星 |
| 28 | C/C++漂浮爱心 |
| 29 | C/C++五子棋小游戏 |
| 30 | C/C++球球大作战小游戏 |
| 31 | C/C++走迷宫小游戏 |
| 32 | C/C++粉色爱心 |
| 33 | C/C++棕色小熊 |
| 34 | C/C++粉色动态爱心 |
| 35 | C/C++炫酷烟花① |
| 36 | C/C++炫酷烟花② |
| 37 | C/C++炫酷烟花③ |
| 38 | C/C++炫酷烟花④ |
| 39 | C/C++星空漩涡 |
| 40 | C/C++流星雨② |
| 敬请期待...... |
技术需求
-
图形库支持与窗口初始化
- EasyX图形库 :本项目依赖于EasyX图形库进行图形绘制与动画控制。通过
initgraph初始化图形窗口,并利用SetWindowPos和ShowWindow实现窗口最大化,确保动画在全屏状态下展示,增强视觉冲击力。 - 坐标系统调整 :通过
setorigin将坐标原点设置在屏幕中心,并使用setaspectratio(1, -1)反转Y轴方向,便于后续数学图形的绘制与对称处理。
- EasyX图形库 :本项目依赖于EasyX图形库进行图形绘制与动画控制。通过
-
颜色管理与视觉层次
- 颜色数组定义 :通过预设的颜色数组
colors,定义了一系列粉色调颜色,用于渲染爱心的不同部分,增强视觉美感与情感表达。 - 颜色渐变处理 :在生成点的过程中,通过
lightness变量控制颜色亮度,使爱心从内到外呈现出由亮到暗的自然过渡,增强立体感与层次感。
- 颜色数组定义 :通过预设的颜色数组
-
数学建模与图形生成
- 爱心曲线绘制 :采用参数方程绘制爱心曲线,通过数学函数
16 * pow(sin(radian), 3)和13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian)生成基础点集,再通过缩放与随机偏移生成多层爱心点阵。 - 动态扩散效果:通过计算每个点到原点的距离,结合二次函数模拟扩散速度,使爱心在动画中呈现出由内向外扩散的动态效果。
- 爱心曲线绘制 :采用参数方程绘制爱心曲线,通过数学函数
-
动画帧管理与图像缓存
- 帧图像生成 :程序预先生成20帧动画图像并存储在
images数组中,每帧图像通过不同的扩散参数和随机扰动生成,形成连续的动画效果。 - 帧播放控制:通过循环控制帧索引,实现动画的正向播放与反向播放,形成"扩张-收缩"的循环动画效果,增强视觉节奏感。
- 帧图像生成 :程序预先生成20帧动画图像并存储在
-
文本渲染与图像保存
- 文本绘制:在每帧图像中绘制"我爱你"文本,通过设置字体、大小和颜色,增强情感表达与视觉焦点。
- 图像保存与加载:每帧图像生成后保存为PNG文件,并重新加载以确保图像数据的完整性,为后续动画播放提供稳定的数据源。
-
随机性与动态扰动
- 随机数生成 :通过
rand()函数生成随机数,用于控制点的生成概率、位置偏移和颜色选择,使每帧动画都具有一定的随机性,避免画面单调。 - 动态扰动处理:在生成扩散点时,通过帧索引控制随机扰动范围,使动画在不同阶段呈现出不同的动态效果,增强视觉变化。
- 随机数生成 :通过
主要代码
创作不易,订阅后可查看完整代码
cpp
#include <graphics.h>
#include <conio.h>
#include <ctime>
#include <cmath>
#include <cstdlib>
struct Point {
double x, y;
COLORREF color;
};
const int MAX_POINTS = 256;
const COLORREF colors[MAX_POINTS] = {
RGB(255, 192, 203), // 浅粉色 (Light Pink)
RGB(255, 182, 193), // 淡粉红 (LightPink)
RGB(255, 105, 180), // 热粉红 (HotPink)
RGB(255, 20, 147), // 深粉色 (DeepPink)
RGB(219, 112, 147), // 浓粉红 (PaleVioletRed)
RGB(255, 174, 185), // 浅玫瑰红 (LightPink)
RGB(255, 0, 144) // 紫红色 (Crimson)
};
const int xScreen = GetSystemMetrics(SM_CXSCREEN);
const int yScreen = GetSystemMetrics(SM_CYSCREEN) - 100;
const double PI = 3.14159265359;
const double E = 2.71828;
const double AVG_DISTANCE = 0.162;
const int NUM_ORIGIN_POINTS = 506;
const int NUM_CIRCLES = 210;
const int NUM_FRAMES = 20;
const int COLOR_RANGE = 6;
Point origin_points[NUM_ORIGIN_POINTS];
Point points[NUM_CIRCLES * NUM_ORIGIN_POINTS];
IMAGE images[NUM_FRAMES];
int create_random(int min, int max) {
return rand() % (max - min + 1) + min;
}
void create_data() {
int index = 0;
double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
// Generate origin points
for (double radian = 0.1; radian <= 2 * PI; radian += 0.005) {
x2 = 16 * pow(sin(radian), 3);
y2 = 13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian);
double distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
if (distance > AVG_DISTANCE) {
x1 = x2, y1 = y2;
origin_points[index].x = x2;
origin_points[index++].y = y2;
}
}
......
创作流程
在创作这段代码时,我的初衷是用程序语言表达一种浪漫的情感。我希望通过数学与艺术的结合,创造出一个既理性又感性的作品。于是,我决定以"爱心"为主题,用程序绘制一个动态的爱心动画,并在其中融入"我爱你"的字样,使其成为一个独特的表白工具。
首先,我需要确定爱心的数学模型。经过一番查阅,我选择了参数方程来绘制爱心曲线。这个方程能够精确地描述爱心的形状,通过调整参数,我可以控制爱心的大小和细节。在生成基础点集时,我特别注意了点之间的距离,确保点的分布均匀且不过于密集,这样在后续的动画处理中能够保持良好的视觉效果。
接下来,我开始考虑如何让这个静态的爱心变得"活"起来。我想到可以通过缩放和扩散的方式,让爱心从中心向外逐渐展开,形成一种动态的视觉效果。为了实现这一点,我为每个点计算了到原点的距离,并根据距离设计了一个二次函数来控制扩散速度。这样,靠近中心的点扩散得较慢,而远离中心的点扩散得较快,形成一种自然的扩散效果。
在颜色处理上,我希望爱心能够呈现出由内到外的渐变效果。因此,我预设了一系列粉色调的颜色,并在生成点的过程中,通过一个亮度变量来控制颜色的明暗。随着爱心的扩散,亮度逐渐降低,使得爱心的外层颜色更加柔和,增强了立体感和层次感。
为了让动画更加生动,我决定生成多帧图像,并通过循环播放这些图像来实现动画效果。每帧图像都基于不同的扩散参数生成,同时加入了一定的随机扰动,使得每帧画面都略有不同,避免了动画的单调性。在生成每帧图像时,我还加入了"我爱你"字样,通过设置字体和颜色,使其成为整个动画的视觉焦点。
在动画播放的控制上,我采用了正向播放与反向播放相结合的方式,使得动画在扩张到最大后能够收缩回来,形成一个循环的动态效果。这种"呼吸"般的节奏感,让整个动画更加生动和富有情感。
最后,为了让这个作品更加完整,我将每帧图像保存为PNG文件,并在程序结束时重新加载这些图像,确保动画播放的稳定性。整个创作过程充满了挑战与乐趣,通过不断地调试和优化,我最终实现了心中所想的那个浪漫而美丽的爱心动画。
写在后面
我是一只有趣的兔子,感谢你的喜欢!