基于EasyX的鼠标交互式壁纸

 壁纸运行效果

 

原理分析:

1.由于模拟运动,则需要结构体属性中有坐标以及运动分量,此处都声明为double类型的变量

2.使用数组存放画布中的粒子,并定义初始化函数randpos为粒子赋予随机坐标以及运动微分量

3.后定义printlinein函数,规定互相位于一定范围内的粒子之间绘制直线

4.通过访问粒子坐标重置运动到画布之外的粒子

5.此处使用的粒子颜色为白色,并将粒子间的距离带入HSVtoRGB模型中的鲜艳度参数中,使白色渐变为黑色背景色

6.通过EasyX的message类型变量以及peekmessage函数获取鼠标坐标

7.遍历粒子数组,用鼠标坐标减去粒子坐标得到每个粒子与鼠标的方向向量

8.通过设置参数修改方向向量大小并于粒子的运动微分量运算,以此改变粒子的速度

#include <iostream>
#include <easyx.h>
#define MAX 80
using namespace std;

//element_type
typedef struct
{
	double x;
	double y;
	double motion_x;
	double motion_y;
}ptc;

//particle_array
ptc* list = (ptc*)new(ptc[MAX]);

//initialize_the_map
void initmap()
{
	initgraph(800, 600);
	setbkcolor(BLACK);
	cleardevice();
	return;
}

//initialize_particle_position
void randpos(ptc* list)
{
	for (int i = 0,flag; i < MAX; i++)
	{
		srand(time(NULL) + rand());
		list[i].x = 50+rand() % 700;
		list[i].y = 50 + rand() % 700;
		flag = rand() % 2;
		if (flag == 1)
		{
			list[i].motion_x = (40 + rand()%100) / 80;
			list[i].motion_y = (40 + rand()%100) / 80;
		}
		else
		{
			list[i].motion_x = (-1)*(40 + rand()%100) / 80;
			list[i].motion_y = (-1)*(40 + rand()%100) / 80;
		}
	}
	return;
}

void printlinein(ptc* list)
{
	ExMessage m;
		
	//position
	for (int i = 0; i < MAX; i++)
	{
		//detect
		list[i].x += list[i].motion_x;
		list[i].y += list[i].motion_y;
		if (list[i].x < 0 || list[i].x>800 || list[i].y < 0 || list[i].y>600)
		{
			list[i].x = 50 + rand() % 700;
			list[i].y = 50 + rand() % 700;
			list[i].motion_x = (40 + rand() % 100) / 80;
			list[i].motion_y = (40 + rand() % 100) / 80;
		}

		//line
		for (int k = 0; k < MAX; k++)
		{
			auto d = (list[i].x - list[k].x) * (list[i].x - list[k].x) + (list[i].y - list[k].y) * (list[i].y - list[k].y);
			if (d < 10000)
			{
				setlinecolor(HSVtoRGB(0, 0, 10000 / d));
				line(list[i].x, list[i].y, list[k].x, list[k].y);
			}
		}

		//interactive
		{
			peekmessage(&m, EM_MOUSE);
			for (int p = 0; p < MAX; p++)
			{
				auto d = (list[p].x - m.x) * (list[p].x - m.x) + (list[p].y - m.y) * (list[p].y - m.y);
				if (d < 10000)
				{
					list[p].motion_x += 10 * ((list[p].x - m.x) / (20 * d));
					list[p].motion_y += 10 * ((list[p].y - m.y) / (20 * d));
				}
			}
		}
	}
	FlushBatchDraw();
	return;
}

int main(void)
{
	initmap();
	randpos(list);
	while (true)
	{
		BeginBatchDraw();
		cleardevice();
		printlinein(list);
		Sleep(30);
	}
	return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值