C/C++李峋同款跳动的爱心代码

一、写在前面

在编程的世界里,代码不仅仅是冷冰冰的命令,它也可以成为表达情感、传递浪漫的工具。今天,就让小编带着大家用C++语言打造出李峋同款跳动的爱心吧!

首先,我们需要知道C++作为一种高级编程语言,拥有强大的功能和灵活的语法,非常适合用来制作各种有趣的动画效果。而跳动的爱心,正是一种既简单又富有创意的动画效果,非常适合用来作为编程初学者的练习项目。要实现这个效果,我们需要用到C++的图形库和定时器功能。图形库可以帮助我们在控制台或窗口中绘制出爱心的形状,而定时器则可以让爱心以一定的频率跳动起来。

环境需求

环境:C/C++

软件:Visual Studio 2022

安装教程:https://want595.blog.csdn.net/article/details/134608094

EasyX是什么

EasyX是一个专为C++初学者和爱好者设计的图形库。该库以简洁易用、功能实用为宗旨,通过封装Windows GDI接口,极大降低了C++编程中图形界面设计的复杂度,使得用户能够快速上手并实现各类图形图像处理任务。

EasyX提供了一系列丰富的API函数,涵盖了绘制基本图形(如线段、圆形、矩形等)、填充图形、显示文本、加载与保存图片、颜色设置以及鼠标键盘事件处理等功能。通过简单的函数调用,开发者可以高效地进行2D图形绘制和交互式程序设计。

总的来说,EasyX以其友好的学习曲线和高效的图形处理能力,极大地激发了C++初学者对计算机图形学的兴趣,是广大编程入门者和教育领域广泛采用的一款图形库工具。

下载安装EasyX

1.进入EasyX官网,点击下载按钮开始下载

2.下载完成后进入下载目录,双击.exe文件无脑安装即可

二、跳动的爱心

接下来,让我们一步步来实现这个跳动的爱心。首先,我们需要通过一系列的数学公式来定义爱心的形状,比如使用参数方程来描述爱心的轮廓。然后,我们可以使用C++的图形库来绘制出这个形状。当绘制好爱心后,就要想办法让它跳动起来了,这里我们可以使用C++的定时器功能,设置一个合适的时间间隔,让爱心在每个时间间隔内改变位置或大小,从而产生跳动的效果。

完整代码

#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 pointsfor (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;}}// Generate pointsindex = 0;for (double size = 0.1, lightness = 1.5; size <= 20; size += 0.1) {double success_p = 1 / (1 + pow(E, 8 - size / 2));if (lightness > 1) lightness -= 0.0025;for (int i = 0; i < NUM_ORIGIN_POINTS; ++i) {if (success_p > create_random(0, 100) / 100.0) {COLORREF color = colors[create_random(0, COLOR_RANGE)];points[index].color = RGB(GetRValue(color) / lightness, GetGValue(color) / lightness, GetBValue(color) / lightness);points[index].x = size * origin_points[i].x + create_random(-4, 4);points[index++].y = size * origin_points[i].y + create_random(-4, 4);}}}int points_size = index;// Generate imagesfor (int frame = 0; frame < NUM_FRAMES; ++frame) {images[frame] = IMAGE(xScreen, yScreen);SetWorkingImage(&images[frame]);setorigin(xScreen / 2, yScreen / 2);setaspectratio(1, -1);for (index = 0; index < points_size; ++index) {double x = points[index].x, y = points[index].y;double distance = sqrt(pow(x, 2) + pow(y, 2));double distance_increase = -0.0009 * distance * distance + 0.35714 * distance + 5;double x_increase = distance_increase * x / distance / NUM_FRAMES;double y_increase = distance_increase * y / distance / NUM_FRAMES;points[index].x += x_increase;points[index].y += y_increase;setfillcolor(points[index].color);solidcircle(points[index].x, points[index].y, 1);}for (double size = 17; size < 23; size += 0.3) {for (index = 0; index < NUM_ORIGIN_POINTS; ++index) {if ((create_random(0, 100) / 100.0 > 0.6 && size >= 20) || (size < 20 && create_random(0, 100) / 100.0 > 0.95)) {double x, y;if (size >= 20) {x = origin_points[index].x * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);y = origin_points[index].y * size + create_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);}else {x = origin_points[index].x * size + create_random(-5, 5);y = origin_points[index].y * size + create_random(-5, 5);}setfillcolor(colors[create_random(0, COLOR_RANGE)]);solidcircle(x, y, 1);}}}setaspectratio(1, 1);settextstyle(100, 0, _T("宋体"));settextcolor(RGB(255, 182, 193));outtextxy(-150, -50, _T("我爱你"));saveimage(_T("爱心.png"), &images[frame]);setorigin(0, 0);setaspectratio(1, 1);loadimage(&images[frame], _T("爱心.png"));}SetWorkingImage();
}void init_graphics() {HWND hwnd = initgraph(xScreen, yScreen);RECT rect;SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);ShowWindow(hwnd, SW_MAXIMIZE);SetWindowPos(hwnd, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);BeginBatchDraw();setorigin(xScreen / 2, yScreen / 2);setaspectratio(1, -1);srand(static_cast<unsigned>(time(0)));
}int main() {init_graphics();create_data();graphdefaults();bool extend = true, shrink = false;for (int frame = 0; !_kbhit();) {putimage(0, 0, &images[frame]);FlushBatchDraw();Sleep(20);cleardevice();if (extend)frame == 19 ? (shrink = true, extend = false) : ++frame;elseframe == 0 ? (shrink = false, extend = true) : --frame;}EndBatchDraw();closegraph();return 0;
}

完成这些步骤后,我们就成功打造出了一个李峋同款跳动的爱心(在代码的第112行可以修改文字哦)。每当你运行这段代码时,这个爱心就会在屏幕上跳动起来,为你的编程之旅增添一份浪漫和乐趣。

代码分析

这段代码使用C语言和Turbo C++图形库来创建一个动态的心形图案动画。

1. 定义结构体和常量

  • Point 结构体包含点的坐标(x 和 y)以及颜色值(COLORREF)。
  • 预定义的颜色数组 colors[],包括多种粉红色调。
  • 屏幕尺寸 xScreen 和 yScreen 通过系统函数获取。
  • 数学常数 PI 和 E。
  • 其他常量如 MAX_POINTS,AVG_DISTANCE 等,用于控制生成点的数量和分布。

2. 随机数生成函数 create_random()

  • 返回指定范围内的随机整数。

3. 数据生成函数 create_data()

  • 生成 origin_points[]:这些点用于描绘心形的基本轮廓,通过参数方程计算得到。
  • 生成 points[]:这些点基于 origin_points[] 生成,通过缩放和随机偏移来形成心形的纹理。
  • 生成 images[]:这是一系列帧,每一帧都是在前一帧的基础上对点的位置进行微调,并添加新的点,最终保存为图像文件。

4. 图形初始化函数 init_graphics()

  • 初始化图形窗口,设置屏幕尺寸,并准备绘图环境。

5. 主函数 main()

  • 调用 init_graphics() 准备图形环境。
  • 调用 create_data() 生成动画数据。
  • 在循环中按顺序显示每一帧,实现动画效果,直到检测到键盘输入为止。

6. 动画的具体实现

  • 心形图案通过调整点的位置和大小随时间变化来产生脉动效果。
  • 随机添加新点以增强视觉效果。
  • 每一帧被保存为图像文件 ("爱心.png"),然后加载并显示,形成连续动画

由于代码中涉及到大量图形库特定的函数和概念,理解它们需要一定的图形编程基础,尤其是Turbo C++图形库。如果您对此不熟悉,我建议可以先从基本的图形编程概念入手,逐步学习和理解。

通过这个项目,我们不仅学会了如何使用C++语言制作动画效果,还学会了如何将情感融入到代码中。这让我们更加深刻地认识到,编程不仅仅是一种技能,更是一种表达自我、传递情感的方式。所以,无论你是编程初学者还是资深开发者,都不妨尝试一下用C++打造一款跳动的爱心吧!相信在这个过程中,你会收获到很多的乐趣。

运行效果

三、系列文章

序号目录直达链接
1爱心代码https://want595.blog.csdn.net/article/details/136360684
2李峋同款跳动的爱心https://want595.blog.csdn.net/article/details/139722249
3满屏飘字代码https://want595.blog.csdn.net/article/details/136342476
4大雪纷飞代码
5新春烟花代码
6《黑客帝国》代码雨

四、写在后面

感谢小伙伴们的支持,更多精彩内容等你发现喔~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宠物健康顾问系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;顾问管理&#xff0c;用户管理&#xff0c;健康知识管理&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;公告管理 顾问账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;顾…

头歌资源库(7)汉诺塔(循环)

一、 问题描述 二、算法思想 初始化三个柱子A、B、C&#xff0c;初始时所有的盘子都在柱子A上。对于从1到N&#xff08;N表示盘子的数量&#xff09;的每一个数字i&#xff0c;执行以下循环&#xff1a; a. 如果i是偶数&#xff0c;则将柱子B视为目标柱子&#xff0c;柱子C视为…

Python时间序列分析库

Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…

【原创】springboot+mysql小区用水监控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

AI 定位!GeoSpyAI上传一张图片分析具体位置 不可思议! ! !

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;常见AI大模型部署&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月16日12点23分 &#x1f004;️文章质量&#xff1a;94分…

动态规划日常刷题

力扣70.爬楼梯 class Solution {public int climbStairs(int n) {return dfs(n);}//递归 //注意每次你可以爬 1 或 2 个台阶//如果最后一步是1 就先爬到n-1 把它缩小成0-n-1的范围//如果最后一步是2 就先爬到n-2 把它缩小成0-n-2的范围 private int dfs(int i){if(i < 1){r…

代码随想录算法训练营第五十九天|115.不同的子序列、 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

代码随想录算法训练营第五十九天 115.不同的子序列 题目链接&#xff1a;115.不同的子序列 确定dp数组以及下标的含义&#xff1a;dp[i][j] &#xff1a;以下标i - 1为结尾的s&#xff0c;和以下标j - 1为结尾的t&#xff0c;s中t的个数dp[i][j]确定递推公式&#xff1a; s[…

Intel HDSLB 高性能四层负载均衡器 — 代码剖析和高级特性

目录 文章目录 目录前言代码剖析软件架构目录结构配置解析启动流程分析数据面 jobs 注册数据面 jobs 执行 转发流程分析收包阶段L2 处理阶段L3 处理阶段L4 处理阶段 高级特性大象流转发优化快慢路径分离转发优化报文基础转发优化 最后参考文档 前言 在前 2 篇文章中&#xff0…

Qt第三方库QHotKey设置小键盘数字快捷键

一、看了一圈没有找到可以设置小键盘的情况。 这两天在研究快捷键的使用。发现qt的里的快捷键不是全局的。找了两个第三方快捷键QHotKey&#xff0c;还有一个QxtGlobalShortcut。但是这两个都不能设置小键盘的数字。 比如QKeySequenceEdit &#xff08;Ctrl1&#xff09; 这个…

【SpringBoot】SpringBoot:构建实时聊天应用

文章目录 引言项目初始化添加依赖 配置WebSocket创建WebSocket配置类创建WebSocket处理器 创建前端页面创建聊天页面 测试与部署示例&#xff1a;编写单元测试 部署扩展功能用户身份验证消息持久化群组聊天 结论 引言 随着实时通信技术的快速发展&#xff0c;聊天应用在现代We…

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册&#xff1a;文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册&#xff1a;文生视频领域的新星 近年来&#xff0c;Luma AI 凭借其在文生视频领域的创新技术&#xff0c;逐渐成为行业的新星。…

MySQL基础——多表查询和事务

目录 1多表关系 2多表查询概述 3连接查询 3.1内连接 3.2左外连接 3.3右外连接 3.4自连接 4联合查询 5子查询 5.1标量子查询(子查询结果为单个值) 5.2列子查询(子查询结果为一列) 5.3行子查询(子查询结果为一行) 5.4表子查询(子查询结果为多行多列) 6事务简介和操…

vulnhub靶场-xxe打靶教程

目录 靶机导入 信息收集 发现IP 端口扫描 目录扫描 漏洞利用 靶机下载地址&#xff1a;XXE Lab: 1 ~ VulnHub 靶机导入 导入虚拟机 开启虚拟机 信息收集 发现IP arp-scan -l 发现靶机IP是192.168.202.150 端口扫描 使用nmap进行扫描 nmap -sS -A 192.168.202.150 …

EasyRecovery2024数据恢复神器#电脑必备良品

EasyRecovery数据恢复软件&#xff0c;让你的数据重见天日&#xff01; 大家好&#xff01;今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件&#xff01;你是不是也曾经遇到过不小心删除了重要的文件&#xff0c;或者电脑突然崩溃导致数据丢失的尴尬情况呢&…

初识PHP

一、格式 每行以分号结尾 <?phpecho hello; ?>二、echo函数和print函数 作用&#xff1a;两个函数都是输出内容到页面中&#xff0c;多用于代码调试。 <?php echo "<h1 styletext-align: center;>test</h1>"; print "<h1 stylet…

【vue3中使用$refs】

在使用uniapp官网里的uni-popup弹出层组件时&#xff0c;要将vue2转换成vue3,&#xff0c;这里遇到了一个问题&#xff1a;vue2可以通过this访问到绑定的ref&#xff0c;但是vue3没有了this,应该怎么办呢&#xff1f; 解决方法&#xff1a; !

Footer组件在home 、search 显示,在登录、注册隐藏

footer组件显示与隐藏 我们可以根据组件身上的$route获取当前路由的信息&#xff0c;通过路由路径判断Footer显示与隐藏。配置的路由的时候&#xff0c;可以给路由添加路由元信息【meta】&#xff0c;路由需要配置对象&#xff0c;它的key不能瞎写、胡写、乱写 <template&…

基于 Nginx Ingress + 云效 AppStack 实现灰度发布

作者&#xff1a;子丑 场景简介 灰度发布是降低生产部署风险&#xff0c;提升线上服务稳定性的重要手段&#xff0c;这在当前快速迭代的软件研发中尤为重要。相对于 K8s 默认的滚动部署或者简单的 Pod 分批&#xff0c;基于流量特征的灰度发布验证更精准&#xff0c;风险更低…

从 Acme.Sh V3.0 说说 ZeroSSL

熟悉明月的都知道&#xff0c;明月一直都在使用 acme.sh 作为服务器端申请、部署、续期免费 SSL 证书的主要工具&#xff0c;今天在帮一个站长申请 SSL 证书的时候发现 acme.sh v3.0 开始默认的免费 SSL 证书变更为&#xff1a;ZeroSSL 了&#xff0c;这个 ZeroSSL 其实跟明月一…

在 C++ 中使用不同平台的时间函数及比较

在 C 编程中&#xff0c;时间函数的选择对于性能测量、任务调度和时间戳记录至关重要。不同的操作系统提供了不同的时间函数&#xff0c;同时在同一个平台上&#xff0c;也可能有多种不同的时间函数可供选择。本文将介绍在 C 中常用的时间函数&#xff0c;并比较它们在不同平台…