壁纸运行效果
原理分析:
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;
}