C语言实现直线运动-Easyx

98 阅读1分钟
#include<stdio.h>
#include<easyx.h>
#include<math.h>

void LinearMotion(int x1, int y1, int x2, int y2, int v)
{
	//速度分量
	double vy;
	double vx;

	//根据运动类型,计算速度分量大小
	if (y2 == y1)
	{
		vx = v;
		vy = 0;
	}
	else if (x2 == x1)
	{
		vx = 0;
		vy = v;
	}
	else
	{
		//其他运动
		double tanTheta = (double)abs(y2 - y1) / (double)abs(x2 - x1);
		double theta = atan(tanTheta);
		vy = sin(theta) * v;
		vx = cos(theta) * v;
	}

	//根据速度方向的正负,求速度分量的符号
	int vxFlag = 0;
	int vyFlag = 0;

	if (x2 - x1 > 0)
		vxFlag = 1;
	else if (x2 - x1 < 0)
		vyFlag = -1;

	if (y2 - y1 > 0)
		vyFlag = 1;
	else if (y2 - y1 < 0)
		vyFlag = -1;

	if (vxFlag == 0 && vyFlag == 0)
		return;
	
	vx = vx * vxFlag;
	vy = vy * vyFlag;

	double x, y;
	x = x1;
	y = y1;
	while (1)
	{
		cleardevice();
		solidcircle(x, y, 25);
		FlushBatchDraw();
		Sleep(40);
		x += vx;
		y += vy;
		if (vxFlag == 1)
		{
			// 符号为正,直到大于等于终止点x2坐标为止
			if (x >= x2)
				break;
		}
		else if (vxFlag == -1)
		{
			// 符号为负,直到小于等于终止点x2坐标为止
			if (x <= x2)
				break;
		}
		if (vyFlag == 1)
		{
			// 符号为正,直到大于等于终止点y2坐标为止
			if (y >= y2)
				break;
		}
		else if (vyFlag == -1)
		{
			// 符号为负,直到小于等于终止点y2坐标为止
			if (y <= y2)
				break;
		}
	}
}
int main()
{
	initgraph(800, 600);
	// 坐标系原点在窗体中心,X轴正方向向右,Y轴正方向向上
	setorigin(400, 300);
	setaspectratio(1, -1);
	// 设置背景色
	setbkcolor(RGB(164, 225, 202));
	// 使用背景色清空窗体
	cleardevice();

	LinearMotion(-200, 200, 200, 200, 5);
	LinearMotion(200, 200, 200, -200, 5);
	LinearMotion(200, -200, -200, -200, 5);
	LinearMotion(-200, -200, -200, 200, 5);

	getchar();
	closegraph();
	return 0;
}