首先来看效果

C/C++动态爱心

源代码(代码思路主要参考了b站up主码农天高)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<windows.h>
#include<graphics.h>
#include<mmsystem.h>//要调用mciSendString必须包含这个头文件
#pragma comment(lib,"WINMM.LIB");//及这个预处理
#define SIZE 9
#define CANVAS_WIDTH 640
#define CANVAS_HEIGHT 480
#define CANVAS_CEBTER_X CANVAS_WIDTH / 2
#define CANVAS_CEBTER_Y CANVAS_HEIGHT / 2
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 * size; i += 0.1)
	//{
	//	m = i;
	//	n = -size * (((sin(i) * sqrt(fabs(cos(i)))) / (sin(i) + 1.4142)) - 2 * sin(i) + 2);
	//	x = n * cos(m) + xo;
	//	y = n * sin(m) + yo;
	//	putpixel(x, y, color);
	//}
	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(91, 176, 179));//设置爱心字体颜色
		settextstyle(40, 0, L"楷体");
		outtextxy(0, 0, L"喵");
	}

}

int main()
{
	srand(time(0));
	initgraph(CANVAS_WIDTH, CANVAS_HEIGHT);
	//添加音乐
	mciSendString(L"open youhebuke.mp3 alias music", 0, 0, 0);
	mciSendString(L"play music repeat",0,0,0);//+repeat循环播放
-----------------------------------------------------------------------------------------
             //开头界面,可删除
		settextcolor(RGB(245,152,173));//颜色参数调配,画图板查看颜色参数
		settextstyle(15, 0, L"宋体");
		outtextxy(300, 300, L"----被虐的喵");
		settextcolor(RGB(91, 176, 179));//颜色参数调配,画图板查看颜色参数
		settextstyle(40, 0, L"楷体");
		outtextxy(175, 180, L"C/C++版跳动爱心");
		fflush(stdout);
		Sleep(10000);

		cleardevice();//清画布,重新画
-----------------------------------------------------------------------------------------
	setorigin(CANVAS_CEBTER_X, CANVAS_CEBTER_Y);
	//循环播放
	while (1)
	{

		double ratio;//控制粒子频率和图像大小
		for (int i = 140; i <= 250; i++)
		{
			ratio = 16 * sin(i / 360.0 * 3.1415926535);
		}
		
		if (ratio < 0)
		{
			ratio *= -1;
     	}
		//Sleep(10);
		heart(80, ratio, RED);
		cleardevice();
		
	}
	mciSendString(L"close music", 0, 0, 0);
	getchar();
	closegraph();
	return 0;
}

 这次写的代码有点臭,耦合度太高了,以至于修改一个参数会导致整体改变。于是就没实现爱心跳动了。

一,下载一个可视化库,推荐easyx

直接去官网下载https://easyx.cn/

下载好后会有这个exe文件

打开文件,点下一步到这个界面

 选择你要配置的编译器,它就会自动帮你将库配置好。

第二步 将所要的头文件,画布大小设置好

第三步 初始化画布,并画一个普通的爱心

最初我用的笛卡尔公式。画出来的爱心并不是很好看。我在网上不断找也找不到满意的公式,最终还是借用了b站up码农天高找的这个公式

 

 为什么要手动控制呢?因为最初创建窗口位置默认坐标为

四 爱心渲染

接下来要对这个爱心渲染,就要不断在它每个点的周围随机渲染一些点, 这里就需要获取每个点的坐标,但是由于函数只能返回一个值,我也没用类。所以直接在heart函数内部写了个渲染函数

又因为随机所以用到rand(),产生随机数,至于这个scatter_inside函数实现思路我依旧是参考up主码农天高的。

参数我没控制好,就变成这样了。反正自己根据画布和画的爱心大小,慢慢调去

对了,这里颜色是可以控制的 

使用RGB(xxx,xxx,xxx)红绿蓝的参数,而如果像按照自己喜欢的颜色调,打开画图板

点击编辑颜色,里面就有颜色参数、

 

 第五步 让爱心按一定频率波动起来

也就是画n张大小不同的连续图,循环播放,这里频率控制我用的是正选函数sin,这里就是我自己找到公式实现了,

我选的是这个频率段,这样既可以让爱心收缩也放大,但是由于我写的耦合性太高,导致不能轻易改频率,会导致改变爱心大小。以及如果每次爱心动起来,缩放,周围粒子坐标也要有一定改变,但由于我能力有限,再加上耦合度高,全用函数实现,难以获得坐标,所以我就没实现了。

将sin函数公式转为代码 

 

这时我也不用size控制大小了,直接用ratio,反正这个爱心大小自己慢慢调。

基本上这就是我的爱心实现流程了。

补:添加音乐和汉字

添加音乐用到的函数有     mciSendString();

要包含

这两个,不然会出现链接错误

我来解释一下怎么使用

 首先将你要加入的xxx.mp3音乐放入所在路径

右键这里,打开所在文件夹,将音乐放入其中

然后使用mciSendString(L"open xxx.mp3 alias music",0,0,0)

这些字符串意思是open打开音乐文件(open是系统调用接口),给它命名music. 传3个000参数过去。

然后再调用mciSendString(L"play music repeat",0,0,0);

播放music 后面repeat可以不加,不加只播放一次,加了就是重复播放。

 添加汉字

这个数easyx提供的函数接口,具体使用参考EasyX 文档 - 文字输出相关函数

这里仅提供在爱心里插入文字

将他们放入heart函数里,在爱心和随机散射粒子画出来后,在执行这三行代码

outtextxy(坐标,坐标,L"文本内容");

这里坐标参考第一步画的爱心位置来估计大概范围

outtextxy可多次调用,多次输入。 

这是鄙人第一次学习使用eaxyx,若有错误,请以斧正

谢谢阅读!!!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐