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. 图形环境初始化 :使用initgraph创建固定尺寸的绘图窗口,奠定视觉展示基础;通过BeginBatchDrawFlushBatchDraw实现双缓冲绘制,避免画面闪烁,提升动画流畅度。
  2. 动态数据管理 :设计MyLove结构体封装每个心形元素的属性,包括位置、大小、状态和编号,实现数据与行为的统一管理,便于批量更新与渲染。
  3. 数学建模驱动运动:基于极坐标与经典心形函数(如 r = \\sin(\\theta)\\sqrt{\|\\cos(\\theta)\|}/(\\sin(\\theta)+1.4142) - 2\\sin(\\theta) + 2 )计算心形轨迹上的点分布,使整体图形符合数学美感。
  4. 随机化与去重机制 :通过GetRand函数结合系统毫秒级时间戳生成种子,确保每次运行都有独特起点,并在生成过程中避免重复值,保证运动轨迹的多样性。
  5. 视觉表现优化 :采用淡粉色(RGB(255,192,203))作为心形颜色,字体使用Arial并动态调整字号,配合透明背景模式(setbkmode(TRANSPARENT)),增强视觉柔和感与层次感。
  6. 精确延时控制 :自定义HpSleep函数,利用clock()Sleep(1)结合实现接近毫秒级的延时精度,平衡CPU占用与动画节奏,确保动画稳定运行。
  7. 动画循环机制:主循环中持续调用更新、显示、刷新与清屏操作,形成闭环动画流程,模拟心跳般持续跳动的效果。

主要代码

创作不易,订阅后可查看完整代码

cpp 复制代码
#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个"❤"组成的巨大心脏在屏幕上缓缓搏动时,我知道,我已经把最柔软的情绪,编译进了最坚硬的逻辑之中。

写在后面

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

相关推荐
ysa0510304 小时前
利用数的变形简化大规模问题#数论
c++·笔记·算法
DARLING Zero two♡4 小时前
【优选算法】D&C-Mergesort-Harmonies:分治-归并的算法之谐
java·数据结构·c++·算法·leetcode
胡萝卜3.05 小时前
C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
开发语言·c++·人工智能·stl·继承·菱形继承·组合vs继承
蜗牛沐雨5 小时前
解决 OpenSSL 3.6.0 在 macOS 上 Conan 构建失败的链接错误
c++·macos
louisdlee.5 小时前
树状数组维护DP——前缀最大值
数据结构·c++·算法·dp
Q741_1476 小时前
C++ 分治 归并排序 归并排序VS快速排序 力扣 912. 排序数组 题解 每日一题
c++·算法·leetcode·归并排序·分治
三体世界6 小时前
Qt从入门到放弃学习之路(1)
开发语言·c++·git·qt·学习·前端框架·编辑器
minji...7 小时前
算法题 逆波兰表达式/计算器
数据结构·c++·算法·1024程序员节
ZhiqianXia7 小时前
C++ 常见代码异味(Code Smells)
c++