C/C++跳动的爱心①

写在前面

这是一段用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++流星雨②
敬请期待......

技术需求

  1. 图形库支持与窗口初始化

    • EasyX图形库 :本项目依赖于EasyX图形库进行图形绘制与动画控制。通过initgraph初始化图形窗口,并利用SetWindowPosShowWindow实现窗口最大化,确保动画在全屏状态下展示,增强视觉冲击力。
    • 坐标系统调整 :通过setorigin将坐标原点设置在屏幕中心,并使用setaspectratio(1, -1)反转Y轴方向,便于后续数学图形的绘制与对称处理。
  2. 颜色管理与视觉层次

    • 颜色数组定义 :通过预设的颜色数组colors,定义了一系列粉色调颜色,用于渲染爱心的不同部分,增强视觉美感与情感表达。
    • 颜色渐变处理 :在生成点的过程中,通过lightness变量控制颜色亮度,使爱心从内到外呈现出由亮到暗的自然过渡,增强立体感与层次感。
  3. 数学建模与图形生成

    • 爱心曲线绘制 :采用参数方程绘制爱心曲线,通过数学函数16 * pow(sin(radian), 3)13 * cos(radian) - 5 * cos(2 * radian) - 2 * cos(3 * radian) - cos(4 * radian)生成基础点集,再通过缩放与随机偏移生成多层爱心点阵。
    • 动态扩散效果:通过计算每个点到原点的距离,结合二次函数模拟扩散速度,使爱心在动画中呈现出由内向外扩散的动态效果。
  4. 动画帧管理与图像缓存

    • 帧图像生成 :程序预先生成20帧动画图像并存储在images数组中,每帧图像通过不同的扩散参数和随机扰动生成,形成连续的动画效果。
    • 帧播放控制:通过循环控制帧索引,实现动画的正向播放与反向播放,形成"扩张-收缩"的循环动画效果,增强视觉节奏感。
  5. 文本渲染与图像保存

    • 文本绘制:在每帧图像中绘制"我爱你"文本,通过设置字体、大小和颜色,增强情感表达与视觉焦点。
    • 图像保存与加载:每帧图像生成后保存为PNG文件,并重新加载以确保图像数据的完整性,为后续动画播放提供稳定的数据源。
  6. 随机性与动态扰动

    • 随机数生成 :通过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文件,并在程序结束时重新加载这些图像,确保动画播放的稳定性。整个创作过程充满了挑战与乐趣,通过不断地调试和优化,我最终实现了心中所想的那个浪漫而美丽的爱心动画。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

相关推荐
lingggggaaaa2 小时前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
phdsky2 小时前
【设计模式】建造者模式
c++·设计模式·建造者模式
H_-H2 小时前
关于const应用与const中的c++陷阱
c++
coderxiaohan2 小时前
【C++】多态
开发语言·c++
gfdhy2 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
Eiceblue3 小时前
通过 C# 将 HTML 转换为 RTF 富文本格式
开发语言·c#·html
故渊ZY3 小时前
Java 代理模式:从原理到实战的全方位解析
java·开发语言·架构
我不会插花弄玉3 小时前
vs2022调试基础篇【由浅入深-C语言】
c语言
leon_zeng03 小时前
Qt Modern OpenGL 入门:从零开始绘制彩色图形
开发语言·qt·opengl