【问题标题】:C# Projectile Simulator - Applying Speed to X Position of Projectile PhysicsC# 弹丸模拟器 - 将速度应用于弹丸物理的 X 位置
【发布时间】:2016-01-19 09:49:11
【问题描述】:

首先,代码如下:

decimal gravity = decimal.Parse(gforce.Text) / 1000;
        decimal speed = decimal.Parse(initialSpeed.Text) / 1000;

        decimal newAngle = DegreesToRadians(decimal.Parse(angle.Text));
        double doubleNewAngle = (double)newAngle;
        decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);
        decimal Py = Math.Round(((decimal)Math.Sin(doubleNewAngle) * 0.001M), 13);

        string PxTemp = "";

        for(decimal t = 0.001M; Py > 0; t = t + 0.001M)
        {
            gravity = gravity + gravity * 0.001M;
            Py = Py + speed - gravity;

            Px = (Px + speed * Px);

            graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);

            try
            {
                graphics.DrawArc(new Pen(Color.Magenta, 10f), 45 + (float)Px, 475 - (float)Py, 1, 1, 0, 360);
            }
            catch
            {
                MessageBox.Show("Error Px: " + Px.ToString() + " Py: " + Py.ToString(), "Error");
                this.Close();
            }

我正在尝试创建一个弹丸模拟器,我已成功创建了 y 轴上的重力和加速度效果。但是,当将速度应用于 x 轴(使速度取决于角度)时,我遇到了麻烦。我可以做到这一点,弹丸每秒移动 1 米,但要正确,弹丸在 x 轴上的速度应该取决于速度和角度。

为了实现这一点,我已经做到了:

Px = Px + (speed * Px)

其中 Px 是轴上距离的值 角度的余弦:

decimal Px = Math.Round(((decimal)Math.Cos(doubleNewAngle) * 0.001M), 13);

当我这样做时

Px = Px + (speed * Px)

该值返回一些巨大的数字,例如 4412651515851.41214244121,我起初认为这是因为 Px 超出了它的精度点,但我所做的任何舍入尝试都失败了,我应该如何获得正确的 Px 数字?

这是一个可视化的图像:

任何帮助将不胜感激,我整天都在挣扎,我在网上找不到任何东西。提前致谢。

【问题讨论】:

    标签: c# winforms math physics projectile


    【解决方案1】:

    运动定律与您使用的非常不同:

    y'' = -g --> y(t) = y0 + vy0*t - g/2*t*t
    x'' =  0 --> x(t) = x0 + vx0*t
    

    这些是无空气摩擦运动的解决方案。运动方程的大多数复杂情况都需要对 ODE 进行数值积分。

    初始速度vx0,vy0 是您最初在Px,Py 中计算的速度。但也许你应该使用

    vx0 = speed*cos(angle)
    vy0 = speed*sin(angle)
    

    获得与输入兼容的初始速度。可能需要一些额外的单位转换。

    【讨论】:

    • 对不起,我可能没有提到我创建了一个将度数转换为弧度的函数。感谢您提供更好的公式,我们在学校还没有学过微积分或任何物理,所以我只使用了那个更简单的版本。
    • 不,对不起,我阅读了 DegreeToRadians 调用。删除了那部分。
    • 您应该注意到您在原始代码中得到了 Px 和重力的指数函数,看起来像 Px = Px0*(1+speed*dt)^(t/dt) =^= Px0*exp(speed*t)。除了exp 的参数应该是无量纲之外,这是极不物理的,因为水平速度也呈指数增长。
    • 在答案的方程式中,水平速度是恒定的。当然,整个运动都结束了。一旦 y 坐标到达地面,就会发生根本性的变化。
    • x,y 显然是位置。它们的时间导数(vx,vy)=(x',y') 是速度。零时刻的速度(vx0,vy0) 由输入speedangle 定义。水平加速度x'' 为零,因为没有水平力。垂直方向有重力向下,因此y''=-g。积分两次给出公式。
    【解决方案2】:

    寻找一个有用的工具来帮助锻炼正确的计算。http://www.mrmont.com/teachers/physicsteachershelper-proj.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2015-09-14
      相关资源
      最近更新 更多