C#引力模拟代码表现异常

4
我一直在使用C#和Winforms开发一种重力模拟程序,但是我遇到了一些非常奇怪的问题。该程序基本上会在你单击时创建一个物体,并被其他物体所吸引。问题在于,除非它们在某些奇怪的距离范围内,否则它们不会朝着正方向(右、下)被吸引,而是朝着上方和左侧被吸引。
以下是更新代码:
    public Vector GetGravEffect(GravObject other)
    {
        if ((Math.Abs(X - other.X) <= Mass * Form.DrawScale + other.Mass * Form.DrawScale) && 
            (Math.Abs(Y - other.Y) <= Mass * Form.DrawScale + other.Mass * Form.DrawScale))
        {
            return new Vector(0, 0);
        }

        double tAngle = Math.Atan2((other.Y - Y), (other.X - X));

        double tMagnitude = (GravModifier * Mass * other.Mass / ((Math.Pow((other.X - X), 2)) + (Math.Pow((other.Y - Y), 2))) * 1000);

        Complex c = Complex.FromPolarCoordinates(tMagnitude, tAngle);

        Vector r = new Vector(c.Real, c.Imaginary);

        return r;
    }

完整的代码在这里: https://docs.google.com/open?id=0B79vmyWxBr-kTnUtQURPUlVidzQ

感谢任何帮助!


可能是因为Winforms中的坐标系统是倒置的。例如,它从左上角开始增加到右下角。(这只是一个猜测,我还没有审查代码) - Valera Kolupaev
1个回答

5

问题不在于 GetGravEffect 方法(它给出了正确的结果),而是在于 Update 方法中。该方法完全忽略了物理定律。你不能将 GetGravEffect 返回的值相加,并认为它是速度。GetGravEffect 返回的是一个物体吸引另一个物体的力。你必须将这些力相加,然后进行额外的计算,包括惯性、加速度和时间,以计算出最终的速度。此外,将 X 和 Y 转换为 int 类型并不是一个好主意,因为你会失去许多精度,特别是对于缓慢的速度。以下是经过修正后的方法,可以很好地解决这个问题:

    public void Update() {
        Vector Force = new Vector(0, 0);
        foreach (GravObject g in Form.Objects) {
            if (this != g)
                Force += GetGravEffect(g);
        }

        double TimeElapsedSinceLastUpdate = Form.Timer.Interval * 0.001;
        Vector acceleration = Force / Mass;
        Velocity += acceleration*TimeElapsedSinceLastUpdate;

        X = (X + Velocity.X * Form.VelocityScale);
        Y = (Y + Velocity.Y * Form.VelocityScale);

        if (X + Mass * Form.DrawScale >= Form.Panels.Panel2.Width || X - Mass * Form.DrawScale <= 0)
            Velocity.X *= -1;
        if (Y + Mass * Form.DrawScale >= Form.Panels.Panel2.Height || Y - Mass * Form.DrawScale <= 0)
            Velocity.Y *= -1;
    }

其实,既然我在这里,你有什么关于停止闪烁效果的建议吗? - Aeodyn
@Aeodyn:我在我的电脑上运行它时没有注意到任何闪烁。 - Ňuf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接