个人作品

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下

力学:模拟弹力的小程序(by frxyz1) 铜牌收录

一个模拟弹力的小程序,执行效果如下:

感兴趣的可以再加上几个小球,类似的还可以模拟出绳子的效果。

以下是全部源代码:

///////////////////////////////////////////////////
// 程序名称:模拟弹力的小程序
// 编译环境:Visual C++ 6.0 / 2010,EasyX 20120404(beta)
// 作  者:frxyz1 <http://hi.baidu.com/frxyz1>
// 最后修改:2012-4-14
//
#include <graphics.h>
#include <conio.h>

#define BALL_RADIUS 30 // 小球的半径

void main()
{
	initgraph(640, 480);
	setfillstyle(RGB(255, 0, 0));

	// 小球的初始位置
	float ballx = 320.f, bally = 240.f;
	// 小球的初始速度
	float vx = 0.f, vy = 0.f;

	MOUSEMSG m = GetMouseMsg();

	BeginBatchDraw();
	while (!kbhit() || getch() != 27) // 按ESC退出
	{
		while (MouseHit()) m = GetMouseMsg();

		// 弹力公式 F = k * x
		float fx = m.x - ballx;
		float fy = m.y - bally + 100; // 加上重力

		// 速度时间公式 Vt = V0 + a * t
		// a = F / M
		vx += (fx / 100);
		vy += (fy / 100);

		// 模拟阻力的效果
		vx *= 0.99f;
		vy *= 0.99f;

		// ds = dv * dt
		ballx += vx;
		bally += vy;

		cleardevice();
		fillcircle((int)ballx, (int)bally, BALL_RADIUS); // 画球
		line((int)ballx, (int)bally, m.x, m.y); // 画线
		FlushBatchDraw();
		Sleep(16);
	}

	EndBatchDraw();
	closegraph();
}

作者:frxyz1
百度个人主页:https://www.baidu.com/p/frxyz1

添加评论