首页 文章

C#弹丸模拟器 - 将速度应用于弹丸物理学的X位置

提问于
浏览
2

首先,这是代码:

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数?

这是一个可视化的图像:

enter image description here

任何帮助将不胜感激,我一直在苦苦挣扎,我找不到任何在线的东西 . 提前致谢 .

2 回答

  • 2

    有助于锻炼正确计算的有用工具 . http://www.mrmont.com/teachers/physicsteachershelper-proj.html

  • 0

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

    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)
    

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

相关问题