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++闪烁的爱心 |
15 | C/C++哆啦A梦 |
16 | C/C++简单圣诞树 |
17 | C/C++小宇宙 |
18 | C/C++冰墩墩 |
19 | C/C++七彩花朵 |
20 | C/C++玫瑰花 |
21 | C/C++小猪佩奇 |
22 | C/C++简易爱心 |
技术需求
- 图形环境初始化:使用
initgraph
创建固定尺寸的绘图窗口,奠定视觉展示基础;通过BeginBatchDraw
与FlushBatchDraw
实现双缓冲绘制,避免画面闪烁,提升动画流畅度。 - 动态数据管理:设计
MyLove
结构体封装每个心形元素的属性,包括位置、大小、状态和编号,实现数据与行为的统一管理,便于批量更新与渲染。 - 数学建模驱动运动:基于极坐标与经典心形函数(如 $ r = \sin(\theta)\sqrt{|\cos(\theta)|}/(\sin(\theta)+1.4142) - 2\sin(\theta) + 2 $)计算心形轨迹上的点分布,使整体图形符合数学美感。
- 随机化与去重机制:通过
GetRand
函数结合系统毫秒级时间戳生成种子,确保每次运行都有独特起点,并在生成过程中避免重复值,保证运动轨迹的多样性。 - 视觉表现优化:采用淡粉色(RGB(255,192,203))作为心形颜色,字体使用Arial并动态调整字号,配合透明背景模式(
setbkmode(TRANSPARENT)
),增强视觉柔和感与层次感。 - 精确延时控制:自定义
HpSleep
函数,利用clock()
与Sleep(1)
结合实现接近毫秒级的延时精度,平衡CPU占用与动画节奏,确保动画稳定运行。 - 动画循环机制:主循环中持续调用更新、显示、刷新与清屏操作,形成闭环动画流程,模拟心跳般持续跳动的效果。
主要代码
创作不易,订阅后可查看完整代码
- 《Python趣味编程》
- 《C/C++趣味编程》
- 《HTML趣味编程》
- 《Java趣味编程》
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<sys/timeb.h>struct MyLove
{int NUMS; // 编号double m;double n;double size;bool Is_show;int x;int y;
};MyLove mylove[400];
int CenterX = 1000 / 2 - 30;
int CenterY = 600 / 2 - 100;
double Size = 60;
void initdata(); // 初始化数据
void updata(); // 更新
void movedata(); // 平移
void showdata(); // 显示
int* GetRand(int* buf, int count, int range); // 随机数的生成
void heart(int x0, int y0, int size, COLORREF C);
void HpSleep(int ms);……
创作流程
我开始写这段代码的时候,心里想的不是技术,而是“如何让一颗心真正活起来”。我不想做一个静态的图案,我想要的是呼吸、是脉动、是那种仿佛能听见心跳的声音。于是,我决定用数学来模拟爱的律动。
首先,我选择了心形函数作为核心公式。这个函数并不简单,它融合了正弦、余弦、绝对值与分式运算,能描绘出一个极具美感的立体心形轮廓。我知道,如果直接把所有点画出来,会显得死板。所以我引入了“时间”的概念——让这些点随着每一帧逐渐出现,像是从虚空中被召唤而来。
接着,我设计了一个包含400个元素的数组,每一个都代表一个跳动的“❤”。前20个是先锋,它们根据随机生成的角度参数实时计算位置,构成心形的前沿边界。而后面的380个则像是追随者,通过位移传递的方式,逐帧继承前面的位置信息,形成一种“波浪式推进”的视觉效果,就像心跳时血液的涌动。
为了让这个心不那么机械,我加入了随机性。每一次运行程序,都会从系统时间中提取毫秒级种子,生成一组不重复的初始角度。这样,每一次启动,都是独一无二的心跳节奏。同时,我还让每个字符的大小在一定范围内缓慢放大,模拟“膨胀”的感觉,仿佛这颗心正因激动而加速跳动。
在视觉呈现上,我选择了柔和的粉红色,字体用的是Arial,简洁而优雅。我把背景设为透明,不让任何多余的东西干扰这份纯粹的情感表达。每一个“❤”都微微偏移坐标,让它更自然地落在心形曲线上,而不是生硬地堆叠。
最让我纠结的是节奏。太快像抽搐,太慢又显得冷漠。于是我写了一个高精度延时函数,精确控制每一帧间隔为30毫秒,既不会卡顿,也不会过于急促。当整个画面开始循环刷新时,那种缓缓跳动的感觉终于出现了——像是深夜里,你静静听着另一个人的心跳。
这不仅仅是一个图形程序,它是我在用代码写诗。每一行都是思念的注解,每一次刷新都是情感的重燃。当那颗由400个“❤”组成的巨大心脏在屏幕上缓缓搏动时,我知道,我已经把最柔软的情绪,编译进了最坚硬的逻辑之中。
写在后面
我是一只有趣的兔子,感谢你的喜欢!