C语言.表白神器.爱你之心之闪耀

news2025/1/16 15:56:18

前言

爱你之心之闪耀,这个名字比较沙雕哈哈哈。。。

爱你之心之闪耀

  • 前言
  • 爱心函数的选取
    • 爱心函数1
    • 爱心函数2
      • 简单爱心
  • 粒子发射原理
  • 爱心结构
  • 一些宏
  • 初始化
    • init
  • 创建若干爱心并初始化
    • setHeart
  • 展示爱心
    • showHeart
  • 爱心变大
    • modifyHeart
  • 设置音乐
  • 主函数
  • Love.h
  • Love.cpp
  • 祝有情人,终成眷属

C语言.爱你之心之闪耀

爱心函数的选取

Webdings和Webdings字符码对应表
在这里插入图片描述

字符Y就对应爱心,有兴趣的可以打印其它特殊字符。

爱心函数1

r = a*(1+sin(θ));

a控制爱心的大小

效果:
在这里插入图片描述

爱心函数2

在这里插入图片描述
效果:
在这里插入图片描述

需要说明的是上面都是极坐标公式,vs中是直角坐标系需要转换。

在这里插入图片描述

第二个爱心公式转后成直角坐标系时,y需要变成-y整个图形才能向上面一样。

未变成-y的图形:
在这里插入图片描述

还需要说明的是,第二个爱心极坐标公式转换后还需要乘上一个基础值才能使爱心放大。因为r(p)的取值范围使[0,1]

简单爱心

需要用到Easyx,不会的函数自己得查文档
EasyX

#define PI 3.1415926
int main()
{
	initgraph(600, 480);
	double r = 0;//0...1
	double angle = 0;
	int x = 0;
	int y = 0;
	int R = 80;//放大80倍
	settextcolor(RED);
	for (angle = 0; angle < PI * 2; angle += 0.1)
	{
		r = sin(angle) * sqrt(fabs(cos(angle))) / (sin(angle) + sqrt(2)) - 2 * sin(angle) + 2;
		y = -R * r * sin(angle) + 300;
		x = R * r * cos(angle) + 300;
		settextstyle(10, 0, L"webdings");
		setbkmode(TRANSPARENT);//图案背景设置成透明的
		outtextxy(x + 20, y + 20, 'Y');//打印爱心
	}
	system("pause");
	closegraph();
	return 0;
}

粒子发射原理

在这里插入图片描述

这里的height是下图函数中的参数,文字的高度,你可以理解为大小。

在这里插入图片描述

若干(我一开始设置的是20)个爱心一开始基础框架结构从R = 60, height = 10图(我设置的)开始,每次循环,R++,height++,结果小爱心变大,整体爱心向外延申(放大过程),当到R增加到一定程度爱心会消失。
还要明确爱心总共的个数设置多一点效果会好一些,我是这样设置:一开始初始化的爱心是20个,放大20次(R会增加20次),总共爱心为20*20。
整个结果是:所有被初始化过的爱心都在变大消失,变大消失…
在加上死循环,效果就会像视频那样。

整体思路就是上述的粒子发射原理。你可以像我一样设置音乐,下面也会讲。

爱心结构

typedef struct Love
{
	int x;//x,y即极坐标转换后的坐标
	int y;//x,y为什么是int,因为outtextxy()函数是int
	int height;//爱心的高度
	double r;//极坐标中的r
	double angle;//极坐标的角度
	int R;//爱心图形的基础大小。
}Love;
extern Love loves[HEARTNUMS * BIGGERTIMES];//总共的爱心,是一个全局变量

一些宏

涉及到数字的大部分我都设置成了宏

#define PI 3.1415926  
#define HEARTNUMS  20  //刚开始初始化爱心的个数
#define BIGGERTIMES 20 //放大的次数
#define TRUE_R 60   //基础值,即扩大的倍数

初始化

init

void init()
{
	initgraph(640, 480);//窗口大小
	srand((unsigned int)time(NULL));//随机种子
	memset(loves, 0, sizeof(loves));//所有爱心中的所有变量初始化为0
}

创建若干爱心并初始化

setHeart

//设置随机的角度
void getRandAg(Love loves[])
{
	for (int i = 0; i < HEARTNUMS; i++)
	{
		//随机值只能取整 angle [0,2*PI] 因为sin、cos周期性变化所以取模1000没事
		int angle = rand() % 314 * 2 * 2;
		loves[i].angle = angle * 0.01;

		//避免爱心角度一样
		for (int j = 0; j <= i; j++)
		{
			while (loves[j].angle == loves[i].angle)
			{
				int angle = rand() % 1000;
				loves[i].angle = angle * 0.01;
			}
		}
	}
}
//函数功能,随机设置 HEARTSNUM 个爱心
void setHeart()
{
	int k = 0;
	//找到没有设置的爱心
	for (k = 0; k < HEARTNUMS * BIGGERTIMES && loves[k].R > 0; k++);

	getRandAg(&loves[k]);//得到随机的角度

	for (int i = k; i < k + HEARTNUMS; i++)
	{
		loves[i].height = 0;//刚开始爱心的高度为0
		loves[i].R = TRUE_R;
		loves[i].r = sin(loves[i].angle) * sqrt(fabs(cos(loves[i].angle))) / (sin(loves[i].angle) + sqrt(2)) -
			2 * sin(loves[i].angle) + 2;//极坐标公式
		loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;// 80 ,300是偏移量,使爱心放到适当的位置
		loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;
	}
}

展示爱心

展示的是所有被初始化过的爱心(R > 0)

showHeart

void showHeart()
{
    //BeginBatchDraw()、EndBatchDraw()批量绘制图片需要使用的函数
	BeginBatchDraw();
	cleardevice();//清空屏幕
	settextcolor(RED);//设置颜色
	//for (int i = k; i < k + HEARTNUMS; i++)
	for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++)
	{
		if (loves[i].R == 0)
			continue;
		//设置字体样式
		settextstyle(loves[i].height + 10, 0, L"webdings");
		setbkmode(TRANSPARENT);//图案设置成透明的
		outtextxy(loves[i].x + 20, loves[i].y + 20, 'Y');//打印爱心
	}
	EndBatchDraw();
}

爱心变大

所有被初始化过的爱心变大

modifyHeart

void modifyHeart()
{
	for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++)
	{
		if (loves[i].R == 0)
			continue;
		loves[i].R++;
		if (loves[i].R > TRUE_R + BIGGERTIMES)
		{
			memset(&loves[i], 0, sizeof(Love));
		}
		loves[i].height++;
		loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;
		loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;
	}
}

设置音乐

要用的头文件、预处理指令

#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

两个函数 open打开音乐play播放,./music.mp3./这个意思是当前路径下,music.mp3是音乐的名字和后缀。""前要加上L,是字符集的原因

在这里插入图片描述

		mciSendString(L"open  ./music.mp3", 0, 0, 0);
		mciSendString(L"play  ./music.mp3  repeat", 0, 0, 0);

音乐的格式一定要是mp3格式的,可以去QQ音乐下载。放在哪看下面图片

在这里插入图片描述

你只要看你的Love.cpp即源文件在哪,你的音乐就放在哪。

主函数

int main()
{
	init();//初识化设置
	while (1)
	{
		setHeart();//初始设置爱心
		showHeart();//绘制爱心
		modifyHeart();//爱心闪耀(修改)
		mciSendString(L"open  ./music.mp3", 0, 0, 0);
		mciSendString(L"play  ./music.mp3  repeat", 0, 0, 0);
		Sleep(30);//等待30毫秒
	}
	closegraph();
	return 0;
}

Love.h

#pragma once
#include <graphics.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define PI 3.1415926  
#define HEARTNUMS  20  //刚开始初始化爱心的个数
#define BIGGERTIMES 20 //放大的次数
#define TRUE_R 60   //基础值,即扩大的倍数

typedef struct Love
{
	int x;
	int y;
	int height;//爱心的高度
	double r;//极坐标中的r
	double angle;//极坐标的角度
	int R;//爱心图形的基础大小。
}Love;
extern Love loves[HEARTNUMS * BIGGERTIMES];

Love.cpp

#include"Love.h"

Love loves[HEARTNUMS * BIGGERTIMES];


void init()
{
	initgraph(640, 480);
	srand((unsigned int)time(NULL));
	memset(loves, 0, sizeof(loves));
}

void getRandAg(Love loves[])
{
	for (int i = 0; i < HEARTNUMS; i++)
	{
		//设置随机的爱心
		//随机值只能取整 angle 0~PI 因为sin、cos周期性变化所以取模1000没事
		int angle = rand() % 314 * 2 * 2;
		loves[i].angle = angle * 0.01;

		//避免爱心角度一样
		for (int j = 0; j < i; j++)
		{
			while (loves[j].angle == loves[i].angle)
			{
				int angle = rand() % 1000;
				loves[i].angle = angle * 0.01;
			}
		}
	}
}
//函数功能,随机设置 HEARTSNUM 个爱心
void setHeart()
{
	int k = 0;
	//找到没有设置的爱心
	for (k = 0; k < HEARTNUMS * BIGGERTIMES && loves[k].R > 0; k++);

	getRandAg(&loves[k]);//得到随机的角度

	for (int i = k; i < k + HEARTNUMS; i++)
	{
		loves[i].height = 0;//刚开始爱心的高度为0
		loves[i].R = TRUE_R;
		loves[i].r = sin(loves[i].angle) * sqrt(fabs(cos(loves[i].angle))) / (sin(loves[i].angle) + sqrt(2)) -
			2 * sin(loves[i].angle) + 2;
		loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;
		loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;
	}
}

void showHeart()
{
	BeginBatchDraw();
	cleardevice();//清空屏幕
	settextcolor(RED);
	//for (int i = k; i < k + HEARTNUMS; i++)
	for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++)
	{
		if (loves[i].R == 0)
			continue;
		//设置字体样式
		settextstyle(loves[i].height + 10, 0, L"webdings");
		setbkmode(TRANSPARENT);//图形设置成透明的
		outtextxy(loves[i].x + 20, loves[i].y + 20, 'Y');//打印爱心
	}
	EndBatchDraw();
}

void modifyHeart()
{
	for (int i = 0; i < BIGGERTIMES * HEARTNUMS; i++)
	{
		if (loves[i].R == 0)
			continue;
		loves[i].R++;
		if (loves[i].R > TRUE_R + BIGGERTIMES)
		{
			memset(&loves[i], 0, sizeof(Love));
		}
		loves[i].height++;
		loves[i].y = -loves[i].R * loves[i].r * sin(loves[i].angle) + 80;
		loves[i].x = loves[i].R * loves[i].r * cos(loves[i].angle) + 300;
	}
}

int main()
{
	init();//初识化设置
	while (1)
	{
		setHeart();//初始设置爱心
		showHeart();//绘制爱心
		modifyHeart();//爱心变大
		mciSendString(L"open  ./music.mp3", 0, 0, 0);
		mciSendString(L"play  ./music.mp3  repeat", 0, 0, 0);
		Sleep(30);//等待30毫秒
	}
	closegraph();
	return 0;
}


祝有情人,终成眷属

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

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

相关文章

【有营养的算法笔记】一文轻松学会高精度算法(加减乘除)

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 文章目录一、前言二、高精度加法1、思想及模板2、代码实现三、高精度减法1、思路及模板2…

电脑一键重装系统卡在正在准备就绪怎么办

最近有些用户想要给电脑换新的系统使用&#xff0c;选择一键重装工具重装&#xff0c;但结果卡住了&#xff0c;小白一键重装系统卡在正在准备就绪怎么办?下面小编就教下大家小白一键重装系统卡在正在准备就绪怎么办的解决办法。 工具/原料&#xff1a; 系统版本&#xff1a;…

七 近代史案例欣赏

首先打开我们的编译器&#xff0c;EgretWing,新建一个Egret项目。 新建好后如下图&#xff1a; 主要文件夹介绍 libs:包类文件夹 resource&#xff1a;资源文件夹 src&#xff1a;编写代码文件夹 template&#xff1a;前端文件夹 代码编写 1 打开src中Main.ts文件找到crea…

Scala中的协变点、逆变点、不变点如何确定?

阅读《scala编程》时&#xff0c;我们知道了类的类型参数是可以型变&#xff08;variance&#xff09;的。型变包含以下三种&#xff1a; 协变&#xff08;convariant&#xff09;&#xff1a;如果S是T的子类型&#xff0c;则C1[S]也是C1[T]的子类型&#xff0c;则称C1在类型参…

leetcode 208. 实现 Trie (前缀树)【字典树(前缀树)的介绍与思路整理】

题目 Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补完和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象。…

HCL Notes/Domino 12.0.2版本正式发布

大家好&#xff0c;才是真的好。 之前代号为多瑙河版本的Notes/Domino产品&#xff0c;昨天晚上正式露出了神秘的面纱&#xff0c;版本号也正式定为12.0.2。从版本上来看&#xff0c;是12.0版本的小版本&#xff0c;但从功能和特性上来说&#xff0c;这完全就是一个大版本。 …

Duboo优雅关闭(附源码分析)

Dubbo优雅关闭 1. 关闭有什么问题 当服务提供方要上线的时候&#xff0c;一般是通过部署系统完成实例重启。在这个过程中&#xff0c;服务提供方的团队并不会事先告诉调用方他们需要操作哪些机器&#xff0c;从而让调用方去事先切走流量。而对调用方来说&#xff0c;它也无法…

LeetCode刷题复盘笔记—一文搞懂动态规划之72. 编辑距离问题(动态规划系列第四十一篇)

今日主要总结一下动态规划的一道题目&#xff0c;72. 编辑距离 题目&#xff1a;72. 编辑距离 Leetcode题目地址 题目描述&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&…

FME对调查云平台完成变更调查照片的批量迁移

目录 前言 二、实际步骤 1.准备基础数据 2.模拟登录 3.获取图斑标识码 4.获取图形信息 5.通过空间位置关系过滤不合格照片 5.通过深度学习模型过滤照片特征错误图斑 6.照片迁移 总结 前言 又到了一年一度国土变更调查的苦日子&#xff0c;因为项目规则原因&#xff0c;…

【架构设计】你的应用该如何分层呢?

前言 最近review公司的代码&#xff0c;发现现在整个代码层级十分混乱&#xff0c;一个service类的长度甚至达到了5000多行。而且各种分层模型DTO、VO乱用&#xff0c; 最终出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。 我们在吸取了阿里…

spring之aop底层实现

1.aop之ajc增强 什么是ajc增强&#xff1f; ajc是aop的另外一种实现&#xff0c; 通过aspectj编码器来改动class源文件实现aop 2.aop之agent增强 什么是agent增强&#xff1f; agent是aop的另外一种实现&#xff0c;是通过类加载时改动class类 3.aop之proxy增强-jdk代理 …

Mac系统入门之电脑卡死怎么办

当你兴冲冲的从菜鸡驿站提回来一台新的电脑,你欣喜若狂,迫不及待的拆开快递箱,里面是一台苹果电脑,这时,你不禁抓耳挠腮:Mac系统怎么用啊? 下面,这篇专栏教你如何入门Mac系统 https://blog.csdn.net/cyyyyds857/category_12163999.html –––––前言 你正兴致勃勃的写着…

mysql中字符串拼接、填充和切片

一、本文主要结构 在编程过程往往会遇到&#xff0c;多个字符串需要进行拼接或者填充固定值或者截取部分数据&#xff0c;本文主要实战下面四个函数 concat(str1, str2,…)&#xff1a;字符串进行拼接 lpap&#xff08;&#xff09;&#xff1a;左边填充 rpad&#xff08;&…

【C语言】指针经典题分析

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、指针与数组经典题解析二、经…

创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介

Jevero功能简介 重新定义鞋类发展 Jevero是图案工程师、鞋类开发人员和设计师的优秀支持。从设计到生产都在一个工具中完成。 产品功能及优势 01、更快的开发&#xff0c;缩短上市时间 Jevero使您的图案工程师、鞋类开发人员、工业设计师之间能够进行协作。利用Rhino平台产…

两数相加 java语言

leetcode地址&#xff1a;两数相加描述&#xff1a;给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除…

DevData Talks | 张乐、茹炳晟、应阔浩、任晶磊:研发效能实践的2022年复盘和展望

跌宕起伏的 2022 年已经成为过去时。在这一年&#xff0c;我们既看到外部环境变幻莫测&#xff0c;也看到研发效能行业沉下心来稳步发展&#xff0c;从宏大的概念和价值&#xff0c;转向具体的问题&#xff0c;和务实、可行动的解决方案。 在新一年的开端上回望&#xff0c;20…

靶机测试CyNix笔记

靶机测试CyNix笔记 靶机描述 Level: Intermediate-HardUser flag: user.txtRoot flag: root.txtDescription: It’s a Boot2Root machine. The machine is VirtualBox compatible but can be used in VMWare as well (not tested but it should work). The DHCP will assign …

webpack中模块加载器Loader、插件plugins、optimization属性

目录 模块加载器&#xff08;Loader&#xff09; 导入css文件 加载图片 方法一 方法二 转换es6&#xff08;向下兼容es5&#xff09; html代码组件导入导出 导入less文件 自定义loader&#xff08;Markdown文件加载器&#xff09; markdown-loader.js文件 webpack.c…

【Linux】程序的翻译过程(图示详解)

因为淋过雨&#xff0c;所以懂的为别人撑伞&#xff1b;因为迷茫过&#xff0c;所以懂得为别人指路。 我们都知道写好代码后&#xff0c;编译器会帮助我们把代码生成可执行程序&#xff0c;细加了解又会知道程序的生成又分为四步&#xff1a;预处理、编译、汇编、链接。那么这四…