位移公式
1、速度和时间关系:
2、位移和时间关系:
3、力和加速度关系:
4、空气阻力:
受理分析
以向下运动为正方向
1、向下运动整体受力,重力加空气阻力:
2、向上运动整理受力,重力减空气阻力:
代码实现
#include <stdio.h>
#define GRAVITY_RATIO 9.8f
#define HALF_CPS_K 0.1f
#define TIME_STEP 0.1f
typedef enum {UP = 0, DOWN} DERICT_ENUM;
typedef struct {
float h;
float v;
float m;
DERICT_ENUM direct;
} Ball;
void gravity_next_status(Ball *ball)
{
if (ball == NULL || ball->m == 0) {
return;
}
float mg = ball->m * GRAVITY_RATIO;
float kv2 = HALF_CPS_K * ball->v * ball->v;
float f;
if (ball->direct == UP) {
f = mg + kv2;
} else {
f = mg - kv2;
}
float a = f / ball->m;
float v = ball->v + a * TIME_STEP;
float x = ball->v * TIME_STEP + 0.5 * a * TIME_STEP * TIME_STEP;
if (x > ball->h) {
ball->h = x - ball->h;
ball->v = 0-ball->v;
ball->direct = UP;
return;
}
ball->h = ball->h - x;
ball->v = v;
ball->direct = (v > 0) ? DOWN : UP;
return;
}
int main(int argc, char const *argv[])
{
Ball ball = {.h = 10, .v = 20, .m = 10, .direct = DOWN};
for (int i = 0; i < 800; i++) {
gravity_next_status(&ball);
printf("%.2f\t%.2f\n", ball.h, ball.v);
}
return 0;
}
运行结果
给定一个初始状态,小球后续的运动状态如下。
参数:重力加速度:9.8、阻力系数:0.1、时间步长:0.1
参数:重力加速度:9.8、阻力系数:0.1、时间步长:0.01
总结
这里假设了小球落到地面垂直反弹,动能没有损失,利用速度和位移公式模拟重力加速度下小球的垂直运动,时间步长越精细模拟的效果越好,原因是积分过程越精细了。空气阻力设为0时,小球是来回垂直弹跳的。下一步考虑将运动路线动画演示出来,现在是拿excel表格画的。