C/C++跳动的爱心③ - 详解

写在前面
用C语言绘制一颗跳动的心——这不仅是一段代码,更是一场浪漫的表达。经过图形库与数学公式的结合,我在屏幕上复现了心脏跳动的韵律,让冰冷的算法流淌出温暖的情感。每一次脉动,都是对“爱”该字最真挚的诠释。
系列文章
技术需求
- 图形环境初始化
- 使用
initgraph创建全屏绘图窗口,适配系统分辨率,确保视觉呈现最大化。 - 调用
setorigin将坐标原点移至屏幕中心,便于对称图形的绘制与控制。 - 利用
ShowWindow实现窗口最大化,增强沉浸式体验。
- 颜色与文本渲染
- 采用
RGB函数定义柔和的粉紫色像素点,营造浪漫氛围。 - 设置
settextcolor和settextstyle,使用楷体中文“我爱你”,字体大小适中,位置居中,情感直白而温柔。 - 文本输出使用
outtextxy精确定位,与心形图案协调统一。
- 数学建模与曲线绘制
- 基于参数方程构建心形曲线:$ x = 16\sin^3(t), ,,y = - (13\cos t - 5\cos 2t - 2\cos 3t - \cos 4t) $,精确还原经典心形轮廓。
- 通过循环遍历参数
i,以极小步长(0.001)连续绘制像素点,保证曲线平滑流畅。
- 动态效果设计
- 引入正弦函数控制缩放比例
ratio,模拟心跳的膨胀与收缩过程,赋予静态图形生命感。 - 在主循环中不断更新
ratio值,并调用cleardevice()清除前一帧画面,实现动画连续播放。
- 粒子散射特效
- 定义
scatter_inside函数,在心形轨迹上随机生成内部散点,模拟光斑或情感迸发的视觉效果。 - 利用负指数分布随机数控制散点偏移量,使粒子自然分布在心形内部区域。
- 不同概率触发不同强度的散射(如每107次增强一次),增加动态层次。
- 随机性与时间控制
- 使用
srand(time(0))初始化随机种子,确保每次运行效果略有不同。 - 所有动画无延迟控制,依赖CPU速度快速刷新,形成流畅跳动节奏。
主要代码
创作不易,订阅后可查看完整代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <graphics.h>
#pragma comment(lib,"WINMM.LIB")
#define SIZE 9
void scatter_inside(int xo, int yo, double beta = 0.1)
{
double ratio_x = -beta * log(rand());
double ratio_y = beta * log(rand());
double x, y;
x = ratio_x * xo;
y = ratio_y * yo;
putpixel(x, y, RGB(245, 145, 247));
}
void heart(int particle, double ratio, COLORREF color)
{
double x, y;
double i;
for (i = 0; i <= 2 * particle; i += 0.001)
{
x = 16 * (sin(i) * sin(i) * sin(i));
y = -(13 * cos(i) - 5 * cos(2 * i) - 2 * cos(3 * i) - cos(4 * i));
x = x * ratio;
y = y * ratio;
putpixel(x, y, color);
if ((int)(i * 10000) % 7 == 0)
scatter_inside(x, y);
if ((int)(i * 10000) % 107 == 0)
scatter_inside(x, y, 0.07);
settextcolor(RGB(255, 192, 203));
settextstyle(40, 0, L"楷体");
outtextxy(-100, -20, L"I Love You");
}
}
……
创作流程
我创作这段代码时,心里只有一个念头:用最理性的应用,表达最感性的情感。我想画一颗心,但不是静止的、死板的图形,而是一颗会呼吸、会跳动、带着温度的心。于是,我选择了C语言——这个常被视为“古老”“底层”的语言,来完成一场温柔的反叛。
一开始,我脑海中浮现的是数学课本上的那种心形函数。我记得它的形状优美而深情,像是宇宙写给人类的情书。我决定以它为骨架,构建整个动画的核心。但仅仅描边是不够的,我要让它活起来。就像人的心脏不会匀速跳动,真正的情感也有起伏、有节奏。于是,我引入了一个随时间变化的缩放因子,用正弦波模拟心跳的张弛:先是缓缓收缩,然后猛然扩张,仿佛每一次跳动都在用力诉说“我在乎”。
为了让画面不只是单调的红线,我想要一些点缀,像是情感溢出时的星光。于是,我在心形轨迹上设置了随机触发机制,每当参数推进到特定位置,就从当前点向内发射几个微小的光点。这些光点不是随意洒落的,而是遵循一种“越靠近中心越密集”的规律,我用负对数变换来控制它们的分布,让视觉效果更自然、更有层次。它们像是爱意迸发的瞬间火花,一闪即逝,却令人难忘。
我还想加入文字,但不想让它喧宾夺主。于是我把“I Love You”放在心的正中央,用柔和的粉色和温暖的楷体书写。它不闪不跳,安静地待在那里,像是藏在心底最深处的告白。整个画面因此有了灵魂:心在跳,光在闪,而那句话,始终如一。
为了让人感受到这份情感的持续存在,我让动画无限循环。每一次心跳结束后,立刻开始下一次,没有停顿,没有间歇——就像真正的爱,从不会真正停止。我关闭了所有多余的交互,不设退出条件,仿佛在说:只要你愿意看,它就会一直跳下去。
通过当我第一次运行程序,看到那颗粉紫色的心在黑暗中缓缓搏动,周围闪烁着细碎的光芒,中央那句“我爱你”静静浮现时,我竟有些动容。原来代码也能够如此温柔。它没有声音,没有触感,却让我感受到了温度。这不仅仅是一次编程实践,更像是一次情感的具象化。我把抽象的思念,编译成了可见的光与形,在数字世界里,留下了一颗永不熄灭的心。
写在后面
一只有趣的兔子,感谢你的喜欢!就是我

浙公网安备 33010602011771号