C/C++跳动的爱心③

写在前面

用C语言绘制一颗跳动的心------这不仅是一段代码,更是一场浪漫的表达。通过图形库与数学公式的结合,我在屏幕上复现了心脏跳动的韵律,让冰冷的算法流淌出温暖的情感。每一次脉动,都是对"爱"这个字最真挚的诠释。

系列文章

序号 直达链接
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创建全屏绘图窗口,适配系统分辨率,确保视觉呈现最大化。
  • 调用setorigin将坐标原点移至屏幕中心,便于对称图形的绘制与控制。
  • 利用ShowWindow实现窗口最大化,增强沉浸式体验。
  1. 颜色与文本渲染
  • 采用RGB函数定义柔和的粉紫色像素点,营造浪漫氛围。
  • 设置settextcolorsettextstyle,使用楷体中文"我爱你",字体大小适中,位置居中,情感直白而温柔。
  • 文本输出使用outtextxy精确定位,与心形图案协调统一。
  1. 数学建模与曲线绘制
  • 基于参数方程构建心形曲线: x = 16\\sin\^3(t) , , , y = - (13\\cos t - 5\\cos 2t - 2\\cos 3t - \\cos 4t) ,精确还原经典心形轮廓。
  • 通过循环遍历参数i,以极小步长(0.001)连续绘制像素点,保证曲线平滑流畅。
  1. 动态效果设计
  • 引入正弦函数控制缩放比例ratio,模拟心跳的膨胀与收缩过程,赋予静态图形生命感。
  • 在主循环中不断更新ratio值,并调用cleardevice()清除前一帧画面,实现动画连续播放。
  1. 粒子散射特效
  • 定义scatter_inside函数,在心形轨迹上随机生成内部散点,模拟光斑或情感迸发的视觉效果。
  • 利用负指数分布随机数控制散点偏移量,使粒子自然分布在心形内部区域。
  • 不同概率触发不同强度的散射(如每107次增强一次),增加动态层次。
  1. 随机性与时间控制
  • 使用srand(time(0))初始化随机种子,确保每次运行效果略有不同。
  • 所有动画无延迟控制,依赖CPU速度快速刷新,形成流畅跳动节奏。

主要代码

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

c 复制代码
#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"放在心的正中央,用柔和的粉色和温暖的楷体书写。它不闪不跳,安静地待在那里,像是藏在心底最深处的告白。整个画面因此有了灵魂:心在跳,光在闪,而那句话,始终如一。

为了让人感受到这份情感的持续存在,我让动画无限循环。每一次心跳结束后,立刻开始下一次,没有停顿,没有间歇------就像真正的爱,从不会真正停止。我关闭了所有多余的交互,不设退出条件,仿佛在说:只要你愿意看,它就会一直跳下去。

当我第一次运行程序,看到那颗粉紫色的心在黑暗中缓缓搏动,周围闪烁着细碎的光芒,中央那句"我爱你"静静浮现时,我竟有些动容。原来代码也可以如此温柔。它没有声音,没有触感,却让我感受到了温度。这不仅仅是一次编程实践,更像是一次情感的具象化。我把抽象的思念,编译成了可见的光与形,在数字世界里,留下了一颗永不熄灭的心。

写在后面

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

相关推荐
量子炒饭大师43 分钟前
Cyber骇客的数据链路重构 ——【初阶数据结构与算法】线性表之单链表
c语言·数据结构·c++·windows·git·链表·github
弱冠少年43 分钟前
xiaozhi任务管理分析(基于ESP32)
c语言
h***936644 分钟前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea
Le1Yu44 分钟前
核销优惠券(OpenFeign远程调用、微信小程序滑动分页查询后端实现、ThreadLocal存储用户信息、seata解决分布式事务问题)
java
点点@1 小时前
Java idea运行项目包名过长
java·ide·intellij-idea
Highcharts.js1 小时前
Highcharts 金融图表之“点线图 ”讲解
java·开发语言·highcharts·金融点线图·点线图·模块安装
星轨初途1 小时前
C++的条件判断与循环及数组(算法竞赛类)
开发语言·c++·经验分享·笔记·算法
她说..1 小时前
Spring AOP 操作日志框架(CV可用)
java·jvm·spring·springboot·springcloud
stay night481 小时前
F4 状态机模型
c语言