easyX抛物线运动会反弹的小球

如图        easyX是EasyX是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022。现在笔者分享一下应用,让大家对easyX有更多了解。

        easyX绘制一个小球比较简单,在创建窗口后只需要:

fillcircle(x, y, r);//(x,y)为绘制的圆心坐标,r为半径

        这次展示的目标是抛物线运动会反弹的小球,我们来思考这是怎样实现的。

        首先是抛物线运动,需要小球初始坐标和水平运动的初速度以及环境的加速度。先绘制600x600的窗口,画出小球,while(1)循环,绘制出新的位置的小球。需要注意两点,首先cleardevice()的作用是清屏,不然窗口原来的小球会一直存在(也可以用来观察平抛运动的轨迹);第二点是需要Sleep(10)来暂停一段时间,相当于平抛运动中的t(时间),不然以计算机的执行速度,小球会立刻消失。

#include <easyx.h> 
#include <stdio.h>
int main()
{
	float x, y, vx, vy, g; 
	x = 100; // 小球的x坐标
	y = 200; // 小球的y坐标
	vx = 8; // 小球x方向速度
	vy = 0; // 小球y方向速度
	g = 0.3; // 小球加速度,y方向
	initgraph(600, 600); // 初始游戏窗口画面,宽600,高600
	while (1) // 一直循环运行
	{
		cleardevice(); // 清除掉之前绘制的内容
		vy = vy + g; // 利用加速度g更新vy速度
		x = x + vx; // 利用x方向速度vx更新x坐标
		y = y + vy; // 利用y方向速度vy更新y坐标
		fillcircle(x, y, 20); // 在坐标(x,y)处画一个半径为20的圆
		Sleep(10); // 暂停10毫秒
	}
	getchar(); // 等待按键
	closegraph(); // 关闭窗口
	return 0;
}
没有cleardevice()清屏的效果

         那么如何实现反弹呢?只需要修改方向即可

if (y >= 580) // 当碰到地面时
	{
		vx =  vx; // x方向速度受阻尼影响变小
		vy = -1*vy; // y方向速度改变方向,并受阻尼影响变小
	}
if (y > 580) // 防止小球越过地面
	y = 580;
if (x >= 580) // 碰到右边墙,小球x方向速度反向
	vx = -vx;
if (x <= 20) // 碰到左边墙,小球x方向速度反向
	vx = -vx;

合并有下面代码:

#include <easyx.h>
#include <stdio.h>
int main()
{
	float x, y, vx, vy, g; // 定义一些变量
	x = 100; // 小球的x坐标
	y = 200; // 小球的y坐标
	vx = 8; // 小球x方向速度
	vy = 0; // 小球y方向速度
	g = 0.3; // 小球加速度,y方向
	initgraph(600, 600); // 初始游戏窗口画面,宽600,高600
	while (1) // 一直循环运行
	{
		cleardevice(); // 清除掉之前绘制的内容
		vy = vy + g; // 利用加速度g更新vy速度
		x = x + vx; // 利用x方向速度vx更新x坐标
		y = y + vy; // 利用y方向速度vy更新y坐标
		if (y >= 580) // 当碰到地面时
		{
			vx =  vx; 
			vy = -1*vy; // y方向速度改变方向
		}
		if (y > 580) // 防止小球越过地面
			y = 580;
		if (x >= 580) // 碰到右边墙,小球x方向速度反向
			vx = -vx;
		if (x <= 20) // 碰到左边墙,小球x方向速度反向
			vx = -vx;
		fillcircle(x, y, 20); // 在坐标(x,y)处画一个半径为20的圆
		Sleep(10); // 暂停10毫秒
	}
	_getch(); // 等待按键
	closegraph(); // 关闭窗口
	return 0;
}

缺点与不足:fillcircle()这个绘制小球的函数参数需要是整数,因此在应用时会截去小数部分,使得小球即使没有阻尼也会在y轴上逐渐停下来。

效果视频如下:

easyX抛物线运动会反弹的小球

### 绘制抛物线的方法 在 EasyX 图形库中,可以通过 `setpixel` 函数逐点绘制图形。为了绘制一条标准的抛物线 \( y = ax^2 + bx + c \),可以按照给定范围计算每一点的位置并调用 `setpixel` 进行绘图[^1]。 以下是完整的代码示例: ```cpp #include <graphics.h> #include <conio.h> int main() { initgraph(800, 600); // 初始化窗口大小为 800x600 像素 double a = 0.005; // 抛物线参数 a 控制开口宽度 double b = 0; // 参数 b 控制水平偏移 double c = 300; // 参数 c 控制垂直位置 int centerX = 400; // 定义坐标系中心 X 轴位置 int centerY = 300; // 定义坐标系中心 Y 轴位置 for (double x = -400; x <= 400; x += 0.5) { // 遍历定义域 [-400, 400] double y = a * x * x + b * x + c; setpixel(centerX + x, centerY - y, RED); // 使用 setpixel 设置像素颜色 } _getch(); // 等待按键输入 closegraph(); // 关闭图形界面 return 0; } ``` 上述代码实现了基于函数 \( y = ax^2 + bx + c \) 的抛物线绘制逻辑。其中: - 变量 `a`, `b`, 和 `c` 是控制抛物线形状的关键系数。 - 中心点 `(centerX, centerY)` 将屏幕上的某个区域设置为原点,从而调整整个图像显示效果[^1]。 通过修改这些变量值,能够轻松改变抛物线的具体形态及其在画布中的相对位置。 --- ### 注意事项 当运行此程序时,请确保已安装最新版本的 EasyX 库,并配置好开发环境以便支持其头文件和链接器选项[^2]。 #### 提高性能的小技巧 如果希望提高性能或者减少锯齿感,可以用更细密的步长替代当前循环增量(如将 `x += 0.5` 改成 `x += 0.1`),但这会增加计算负担[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值