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++闪烁的爱心 |
| 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++简易爱心 |
| 23 | C/C++流星雨 |
| 24 | C/C++2048小游戏 |
| 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++新春烟花 |
| 敬请期待…… | |
写在前面
C/C++语言实现李峋同款跳动的爱心完整代码。
首先,我们需要知道C++作为一种高级编程语言,拥有强大的功能和灵活的语法,非常适合用来制作各种有趣的动画效果。而跳动的爱心,正是一种既简单又富有创意的动画效果,非常适合用来作为编程初学者的练习项目。要实现这个效果,我们需要用到C++的图形库和定时器功能。图形库可以帮助我们在控制台或窗口中绘制出爱心的形状,而定时器则可以让爱心以一定的频率跳动起来。
技术需求
-
图形库(Graphics Library):使用
graphics.h提供的图形功能来绘制点、圆形、文字等图形元素。通过setfillcolor、solidcircle、outtextxy等函数来控制图形的颜色、形状和位置。 -
数学运算与公式:代码使用了数学公式生成心形曲线的点坐标。特别是通过
sin和cos函数,结合参数方程绘制心形曲线。同时使用了距离计算公式sqrt(pow(x, 2) + pow(y, 2))来处理点之间的关系。 -
随机数生成:通过
rand()函数生成随机数,用于随机化图形的颜色、大小、位置等,使得动画效果更具动感和变化性。随机数还被用来控制每个点是否生成。 -
动画生成:通过逐帧生成图像,利用
saveimage和loadimage函数保存并加载每一帧图像,实现动画效果。每帧的点位置随着时间变化,形成动态效果。 -
图像处理:利用
setorigin、setaspectratio等函数调整图形坐标系,使得图形能适应不同的屏幕分辨率和显示效果。 -
文本绘制:使用
outtextxy函数将文本绘制到图形上,这里用来显示"我爱你"等信息,增强图形的表现力。 -
内存与性能管理:通过存储每一帧的图像,使用
images[frame]数组来管理图像数据,确保每一帧能够被独立处理和保存。
环境搭建
环境:C/C++
软件:Visual Studio 2022
安装教程:C语言环境搭建教程(Visual Studio)
1. EasyX是什么
EasyX是一个专为C++初学者和爱好者设计的图形库。该库以简洁易用、功能实用为宗旨,通过封装Windows GDI接口,极大降低了C++编程中图形界面设计的复杂度,使得用户能够快速上手并实现各类图形图像处理任务。
EasyX提供了一系列丰富的API函数,涵盖了绘制基本图形(如线段、圆形、矩形等)、填充图形、显示文本、加载与保存图片、颜色设置以及鼠标键盘事件处理等功能。通过简单的函数调用,开发者可以高效地进行2D图形绘制和交互式程序设计。
总的来说,EasyX以其友好的学习曲线和高效的图形处理能力,极大地激发了C++初学者对计算机图形学的兴趣,是广大编程入门者和教育领域广泛采用的一款图形库工具。
2. 下载安装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);}……
代码分析
这段代码使用了 C++ 中的图形库来生成一系列动画图像,并展示一个基于爱心形状的图案。下面将详细分析该代码的各个部分,包括结构体定义、常量声明、函数实现和程序的执行流程。
1. 引用的头文件
#include <graphics.h>
#include <conio.h>
#include <ctime>
#include <cmath>
#include <cstdlib>
- graphics.h:是 C++ 中的图形处理库,提供了用于绘制图形和图像的函数。
- conio.h:用于控制台输入输出,包括
_kbhit()(检测是否有按键输入)等功能。 - ctime:用于获取系统时间,主要用于生成随机数。
- cmath:提供数学运算函数,如
pow、sqrt等。 - cstdlib:用于生成随机数等操作。
2. 数据结构
struct Point {double x, y;COLORREF color;
};
定义了一个 Point 结构体,用来存储二维坐标点的 x 和 y 值,以及一个 color 属性,代表该点的颜色。COLORREF 是一个颜色的结构,通常包含 RGB 颜色值。
3. 常量声明
const int MAX_POINTS = 256;
const COLORREF colors[MAX_POINTS] = {RGB(255, 192, 203), RGB(255, 182, 193), RGB(255, 105, 180),RGB(255, 20, 147), RGB(219, 112, 147), RGB(255, 174, 185), RGB(255, 0, 144)
};
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;
- MAX_POINTS:最大点数,表示图像中最多可以包含 256 个点。
- colors:存储了 7 种颜色的 RGB 值,表示动画中使用的颜色范围。
- xScreen, yScreen:获取屏幕的宽度和高度,并为绘制图像留出一些空间。
- PI 和 E:圆周率和自然常数。
- AVG_DISTANCE:用于计算点之间的平均距离。
- NUM_ORIGIN_POINTS:原始数据点的数量。
- NUM_CIRCLES:生成的圆形点的数量。
- NUM_FRAMES:动画帧的数量。
- COLOR_RANGE:颜色范围,用于选择颜色的随机数范围。
4. 全局变量
Point origin_points[NUM_ORIGIN_POINTS];
Point points[NUM_CIRCLES * NUM_ORIGIN_POINTS];
IMAGE images[NUM_FRAMES];
- origin_points:存储原始的点数据,用于计算图案。
- points:存储图形中每个点的数据,包括坐标和颜色。
- images:存储每一帧生成的图像。
5. 创建随机数的辅助函数
int create_random(int min, int max) {return rand() % (max - min + 1) + min;
}
这个函数用来生成一个指定范围内的随机整数。通过 rand() 函数生成一个随机数,然后通过模运算限制其在给定的区间内。
6. create_data() 函数
该函数是整个程序的核心,负责生成原始点数据、计算点的位置,并生成动画的帧。
6.1 生成原始数据点
for (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;}
}
这段代码生成了一个心形曲线的原始数据点,使用了 parametric equations 来绘制心形。通过遍历角度 radian,计算 x2 和 y2 的坐标,并根据距离过滤掉过于接近的点。
6.2 生成圆形点数据
这一部分通过变化 size 和 lightness,生成了不同大小、不同亮度的点。通过 success_p 来决定点是否应当被生成,最终生成的点被随机设置颜色,并加入到 points 数组中。
6.3 生成动画帧
这一段代码是核心部分,负责绘制和动画生成。
通过计算每个点的位置,绘制心形的各个点,并生成动态的效果。
7. 总结
这段代码实现了一个基于心形图案的动态生成动画,涉及到数学公式、图形绘制、随机数生成等多个方面的知识。它通过逐帧绘制来创建动画效果,并通过修改颜色、位置、大小等参数来实现动态展示。
写在后面
我是一只有趣的兔子,感谢你的喜欢!
相关文章:
C/C++跳动的爱心
系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…...
Element UI中messageBox怎么区分点击取消按钮关闭弹窗,和点击右上角x号以及点击遮罩层关闭按钮
在某些场景下,我们可能需要区分点击取消按钮关闭 messageBox 和点击X号、遮罩层关闭 messageBox 。 实现: 将 distinguishCancelAndClose 设置为 true,这个属性的意思是:是否将取消(点击取消按钮)与关闭&…...
Websocket——心跳检测
1. 前言:为什么需要心跳机制? 在现代的实时网络应用中,保持客户端和服务端的连接稳定性是非常重要的。尤其是在长时间的网络连接中,存在一些异常情况,导致服务端无法及时感知到客户端的断开,可能造成不必要…...
Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互
Node.js环境安装 sodium-native (其他库可能会出现加密解密失败,如果要使用不一样的库,请自行验证) npm install sodium-native 示例代码,使用的是 sodium-native v4.3.2 (其他版本可能会有变化,如果要使用,请自行验…...
视频mp4垂直拼接 水平拼接
视频mp4垂直拼接 水平拼接 pinjie_v.py import imageio import numpy as np import os import cv2def pinjie_v(dir1,dir2,out_dir):os.makedirs(out_dir, exist_okTrue)# 获取目录下的所有视频文件video_files_1 [f for f in os.listdir(dir1) if f.endswith(.mp4)]video_fi…...
跟着李沐老师学习深度学习(十二)
循环神经网络 序列模型 序列数据 实际中很多数据是有时序结构的 比如:电影的评价随时间变化而变化 拿奖后评分上升,直到奖项被忘记看了很多好电影后,人们的期望变高季节性:贺岁片、暑期档导演、演员的负面报道导致评分变低 核心思想&#…...
MFC中CString的Format、与XML中的XML_SETTEXT格式化注意
1、在MFC中导入 "msxml6.dll",并使用其中的XML_SETTEXT函数,此调用在进行格式化的时候,调用的还是CString.Format()函数! 2、用double类型的数据,格式化整形数%d之前,必须将double强转为int&…...
如何设计合理的树状结构表:平衡查询效率与维护效率
树状结构广泛应用于数据建模中,例如 商品分类、组织架构、权限管理 等场景。合理设计树形结构的数据库表,能够有效提升 查询效率 和 维护效率。本文将探讨如何在设计时平衡这两者,详细介绍常用的几种树状结构存储方式及其适用场景。 一、树状…...
Springboot的简单推荐实现
以springboot 推荐社团招新为例子 使用 Spring Boot 构建社团招新推荐系统,用户注册后选择兴趣,系统根据兴趣推荐社团。 实现包括用户注册、兴趣选择和基于标签匹配的推荐算法。 系统使用 JPA 管理数据库,Spring Security 确保安全࿰…...
SpringBoot速成概括
视频:黑马程序员SpringBoot3Vue3全套视频教程,springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 图示:...
springboot多实例部署时,@Scheduled注释的方法重复执行
问题:springboot多实例部署时,Scheduled注释的方法重复执行 在 Spring Boot 中要实现 Redis 的SET NX EX命令,可以借助 Spring Data Redis 来完成。SET NX EX命令用于在键不存在时设置键值对,并同时设置过期时间。 <dependen…...
蓝桥杯15 填空题
1.握手问题: 思路:首先当所有人都握过手,由于一次握手相当于两个人都握手过,所以容易发现这是一个组合问题,为(50*49)/2,而其中有7个人没有相互握过手,那么减去ÿ…...
快速入门——第三方组件element-ui
学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:10.第三方组件element-ui_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据,也可由父组件通过prop方式传…...
力扣-贪心-455 分发饼干
思路 用小饼干去喂胃口小的孩子,不满足条件的时候,去喂胃口稍微大点的孩子,尽可能多满足孩子 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.b…...
【多模态处理篇二】【深度揭秘:DeepSeek视频理解之时空注意力机制解析】
一、为啥要搞视频理解这事儿 咱先唠唠为啥视频理解这么重要哈。现在这互联网时代,视频那可是铺天盖地的。你刷短视频平台,看在线电影,玩游戏直播,到处都是视频。但是计算机它一开始可不懂视频里到底是啥意思,它看到的就是一堆像素点和声音信号。 视频理解呢,就是要让计…...
网络运维学习笔记 017 HCIA-Datacom综合实验01
文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置(IP二层VLAN链路聚合)ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…...
数据结构:实验题目:单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表。
输出样例如图: 代码如下: #include<stdio.h>#include<stdlib.h>//链表节点结构 typedefstructListNode{intval;structListNode*next; } ListNode;// 创建新节点 ListNode* createNode(int val){ListNode* newNode (ListNode*)malloc(sizeo…...
请求go构建缓存,go clean -cache
go clean -cache go 构建时会产生很多缓存, 一般是目录:/Users/xxx/Library/Caches/go-build 此目录README: This directory holds cached build artifacts from the Go build system. Run "go clean -cache" if the directory …...
Windows和Linux下,通过C++实现获取蓝牙版本号
在 C 中获取蓝牙版本号,不同的操作系统有不同的实现方式,下面分别介绍在 Windows 和 Linux 系统下的实现方法。 Windows 系统 在 Windows 系统中,可以使用 Windows API 来与蓝牙设备交互,获取蓝牙版本号。以下是一个示例代码&…...
【网络】如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围?
当然!让我们一步一步详细介绍如何划分子网、计算子网掩码、确定网络地址、广播地址和可用主机地址范围。假设我们从一个 10.0.0.0/24 的网络开始,并且需要为每个子网提供 50 个主机地址。 问题概述: 我们有一个网络 10.0.0.0/24。我们希望为…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

