0


小球垂直跳动,C语言模拟重力加速度

位移公式

1、速度和时间关系:v = v{}'+at

2、位移和时间关系:x = v{}'t+\frac{1}{2}at^{2}

3、力和加速度关系:F=ma

4、空气阻力:F=kv^{2}

受理分析

以向下运动为正方向

1、向下运动整体受力,重力加空气阻力: F_{all} = F_{g}-F_{air}

2、向上运动整理受力,重力减空气阻力:F_{all}=F_{g}+F_{air}

代码实现

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

标签: c语言 算法 linux

本文转载自: https://blog.csdn.net/qq_34359028/article/details/136757666
版权归原作者 我让你懂懂 所有, 如有侵权,请联系我们删除。

“小球垂直跳动,C语言模拟重力加速度”的评论:

还没有评论