如何用VS实现动态爱心

时间:2024-10-21 12:33:35

        首先下载一个easyx库

其次输入以下代码:

 

 代码1
//#define _CRT_SECURE_NO_WARNINGS 1
 
#include<easyx.h>//图形库 
#include<stdio.h>
#include<time.h>
#include<math.h>
 
//定义一个结构体
struct point
{
	double x, y;
	COLORREF color;
};
 
 
COLORREF colors[7] =//颜色
{ RGB(255,32,83),RGB(118,28,75),RGB(138,52,73),
  RGB(255,0,0),RGB(255,2,2),RGB(138,52,73),
	RGB(255,32,83) };
//一会要用的公式中的一些数据
const int xScreen = 1200;
const int yScreen = 800;
const double PI = 3.1415926;
const double e = 2.71828;
const double averag_distance = 0.162;
const int  quantity = 506;
const int circles = 210;
//人眼判断的是20帧率画面,感觉跳动的流畅度。
const int frames = 20;
point origin_points[quantity];//外圈
point points[circles * quantity];//内圈
IMAGE images[frames];
 
double srceen_x(double x)
{
	x + xScreen / 2;
	return x;
}
 
double srceen_y(double y)
{
	y + -yScreen / 2;
	return y;
}
 
 
int createRandom(int x1, int x2)
{
	if (x2 > x1)
	{
		return rand() % (x2 - x1) + x1;
	}
 
}
 
void create_date()
{
	int index = 0;
	double x1 = 0, x2 = 0, y1 = 0, y2 = 0;
	for (double radin = 0.1; radin <= 2 * PI; radin += 0.005)
	{
		x2 = 16 * pow(sin(radin), 3);
		y2 = 13 * cos(radin) - 5 * cos(2 * radin) - 2 * cos(3 * radin) - cos(4 * radin);
		//轮廓坐标公式
		double distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
		if (distance > averag_distance)
		{
			x1 = x2;
			y1 = y2;
			origin_points[index].x = x2;
			origin_points[index++].y = y2;
		}
	}
	index = 0;
	for (double size = 0.1, lighy = 1.5; size <= 20; size += 0.1)
	{
		double p = 1 / (1 + pow(e, 8 - size / 2));
 
		for (int i = 0; i < quantity; ++i)
		{
			if (p > createRandom(0, 100) / 100.0)
			{
				points[index].color = colors[createRandom(0, 6)];
				points[index].x = size * origin_points[i].x + createRandom(-4, 4);
				points[index].y = size * origin_points[i].y + createRandom(-4, 4);
 
			}
		}
	}
	//渲染帧率
	int points_size = index;
 
 
	for (int f = 0; f < frames; ++f)
	{
		images[f] = IMAGE(xScreen, yScreen);
		SetWorkingImage(&images[f]);
		//实现跳跳动效果
		for (index = 0; index < points_size; ++index)
		{
			double x = points[index].x, y = points[index].y;
			double dis = sqrt(pow(x, 2) + pow(y, 2));
			double dis_in = -0.00009 * dis * dis + 0.35714 * dis + 5;
			double x_dis = dis_in * x / dis / frames;
			double y_dis = dis_in * y / dis / frames;
 
			points[index].x += x_dis;
			points[index].y += y_dis;
 
			setfillcolor(points[index].color);
			solidcircle(srceen_x(points[index].x), srceen_y(points[index].y), 1);
 
		}
	}
 
 
 
}
 
 
int main()
{
	srand(time(NULL));
	//创建窗口
	initgraph(xScreen, yScreen);
	//开启双缓冲绘图,防止闪烁
	BeginBatchDraw();
 
	//爱心粒子的创做
	create_date();
 
	SetWorkingImage();
	int f = 0;
	bool extend = true, shrink = false;
 
	//主循环
	while (true)
	{
		//渲染爱心粒子
		putimage(0, 0, &images[f]);
		//刷新窗口
		FlushBatchDraw();
		//清屏
		cleardevice();
 
		if (extend)
			f == 19 ? (shrink = true, extend = false) : ++f;
		else
			f == 0 ? (shrink = true, extend = false) : ++f;
		Sleep(20);
	}
	//关闭双缓冲绘图
 
	//关闭窗口
	return 0;
}
代码2
#include<graphics.h>
#include <conio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
 
struct Point {
	double x, y;
	COLORREF color;
};
 
COLORREF colors[256] = { RGB(255,32,83),RGB(252,222,250) ,RGB(255,0,0) ,
RGB(255,0,0) ,RGB(255,2,2) ,RGB(255,0,8) ,RGB(255,5,5) };
const int xScreen = 1200;
const int yScreen = 800;
const double PI = 3.1426535159;
const double e = 2.71828;
const double averag_distance = 0.162;
const int quantity = 506;
const int circles = 210;
const int frames = 20;
Point  origin_points[quantity];
Point  points[circles * quantity];
IMAGE images[frames];
 
double screen_x(double x)
{
	x += xScreen / 2;
	return x;
}
 
double screen_y(double y)
{
	y = -y + yScreen / 2;
	return y;
}
 
int creat_random(int x1, int x2)
{
	if (x2 > x1)
		return  rand() % (x2 - x1 + 1) + x1;
}
 
void creat_data()
{
	int index = 0;
	double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
	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 > averag_distance)
		{
			x1 = x2, y1 = y2;
			origin_points[index].x = x2;
			origin_points[index++].y = y2;
		}
	}
 
	index = 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 < quantity; ++i)
		{
			if (success_p > creat_random(0, 100) / 100.0)
			{
				COLORREF color = colors[creat_random(0, 6)];
				points[index].color = RGB(GetRValue(color) / lightness, GetGValue(color) / lightness, GetBValue(color) / lightness);
				points[index].x = size * origin_points[i].x + creat_random(-4, 4);
				points[index++].y = size * origin_points[i].y + creat_random(-4, 4);
			}
		}
	}
 
	int points_size = index;
 
	for (int frame = 0; frame < frames; ++frame)
	{
		images[frame] = IMAGE(xScreen, yScreen);
		SetWorkingImage(&images[frame]);
 
		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 diatance_increase = -0.0009 * distance * distance
				+ 0.35714 * distance + 5;
			double x_increase = diatance_increase * x / distance / frames;
			double y_increase = diatance_increase * y / distance / frames;
 
			points[index].x += x_increase;
			points[index].y += y_increase;
 
			setfillcolor(points[index].color);
			solidcircle(screen_x(points[index].x), screen_y(points[index].y), 1);
		}
 
		for (double size = 17; size < 23; size += 0.3)
		{
			for (index = 0; index < quantity; ++index)
			{
				if ((creat_random(0, 100) / 100.0 > 0.6 && size >= 20)
					|| (size < 20 && creat_random(0, 100) / 100.0 > 0.95))
				{
					double x, y;
					if (size >= 20)
					{
						x = origin_points[index].x * size +
							creat_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
						y = origin_points[index].y * size +
							creat_random(-frame * frame / 5 - 15, frame * frame / 5 + 15);
					}
					else
					{
						x = origin_points[index].x * size + creat_random(-5, 5);
						y = origin_points[index].y * size + creat_random(-5, 5);
					}
 
					setfillcolor(colors[creat_random(0, 6)]);
					solidcircle(screen_x(x), screen_y(y), 1);
				}
			}
		}
	}
	SetWorkingImage();
}
 
int main()
{
	initgraph(xScreen, yScreen);
	BeginBatchDraw();
	srand(time(0));
	creat_data();
 
	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;
		else
			frame == 0 ? (shrink = false, extend = true) : --frame;
	}
	EndBatchDraw();
	closegraph();
	return 0;
} 

 最后可以实现以下效果:

相关文章