如何实现多重重力源,特别是所需的trig。(C#)VS 2010

如何实现多重重力源,特别是所需的trig。(C#)VS 2010,c#,physics,trigonometry,gravity,C#,Physics,Trigonometry,Gravity,我正在设计一个小游戏,其中的物体被多个物体同时吸引。我所做的是绘制这些物体的拍摄路线 为了计算行星的引力,我使用以下公式:gravityStr/distToTarg^2(伪代码)。我的问题在于计算我需要镜头移动的方向(以及随后的cos和sine)。下面是我的“Shot”类的代码 这里没有包括的其他类是“Planet”类,它有一个xy值(表格左上角为0,0)。还有重力(拉力的强度) 似乎发生的是,行星拒绝了我的射击。我试过反转planetModY和planetModX的符号,但我得到了更奇怪的效果

我正在设计一个小游戏,其中的物体被多个物体同时吸引。我所做的是绘制这些物体的拍摄路线

为了计算行星的引力,我使用以下公式:gravityStr/distToTarg^2(伪代码)。我的问题在于计算我需要镜头移动的方向(以及随后的cos和sine)。下面是我的“Shot”类的代码

这里没有包括的其他类是“Planet”类,它有一个xy值(表格左上角为0,0)。还有重力(拉力的强度)

似乎发生的是,行星拒绝了我的射击。我试过反转planetModY和planetModX的符号,但我得到了更奇怪的效果

值得注意的是,当它从行星的右上角开始拍摄时,以及当它向下和向右移动时,镜头似乎起作用

我真的希望得到一些答案,以及代码更正

C#:

公共类快照
{
静态公共快照[]快照=新快照[0];
静态公共int shotSteps=3000;
公共常数双rad=Math.PI/180;
PointF[]PointFs=新的PointF[0];
公共快照(整数x,整数y,整数dir,整数pow)
{
addShot(这个);
双cos=数学cos((dir*rad));
double sin=数学sin((dir*rad));
添加点(新点f(x,y));
添加点(新点F((浮点)(cos*pow+x),(浮点)(sin*pow+y));
对于(int step=2;step
提示!每个物体不仅有一个位置,还有一个速度。在每一步中,速度随物体加速度而变化,位置随速度而变化(二阶系统)。如果计算出每个重力对对对物体的总贡献并将其矢量相加,则需要做什么

若我对你们说希腊语(另外因为我是希腊语),那个么你们需要一本介绍向量力学的物理学入门书

也要考虑两个物体太近的情况下,导致大的重力和大的距离步长。这不是一个微不足道的问题,使它足够稳定而令人愉快,但这是可能的。如果你成功了,它将是非常令人欣慰的。

以下是其他人以类似方式所做的事情(

public class Shot
{
    static public Shot[] Shots = new Shot[0];
    static public int shotSteps = 3000;

    public const double rad = Math.PI / 180;

    PointF[] PointFs = new PointF[0];

    public Shot(int x, int y, int dir, int pow)
    {
        addShot(this);
        double cos = Math.Cos((dir * rad));
        double sin = Math.Sin((dir * rad));

        addPoint(new PointF(x, y));
        addPoint(new PointF((float)(cos * pow + x), (float)(sin * pow + y)));

        for (int step = 2; step < shotSteps; step++)
        {
            PointF prevPrevPoint = PointFs[step - 2];
            PointF prevPoint = PointFs[step - 1];

            Double radians = Math.Atan2(prevPoint.Y - prevPrevPoint.Y, prevPoint.X - prevPrevPoint.X);
            Double curCos = Math.Cos(radians);
            Double curSin = Math.Sin(radians);

            PointF curPoint = new PointF(prevPoint.X + (float)curCos * pow, prevPoint.Y + (float)curSin * pow);


            int planetModX = 0;
            int planetModY = 0;

            for (short index = 0; index < Planet.Planets.Length; index++)
            {
                Planet curPlanet = Planet.Planets[index];
                double planetRadians = Math.Atan2(curPoint.Y - curPlanet.Y, curPoint.X - curPlanet.X);
                double planetCos = Math.Cos(planetRadians);
                double planetSin = Math.Sin(planetRadians);

                double planetShotDist = distTo(curPlanet.X, curPlanet.Y, curPoint.X, curPoint.Y);

                double pullPower = curPlanet.Gravity / (planetShotDist * planetShotDist);
                planetModY += (int)(planetSin * pullPower);
                planetModY += (int)(planetCos * pullPower);
            }

            curPoint.X += planetModX;
            curPoint.Y += planetModY;

            addPoint(curPoint);
        }
    }