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表格画的。