C#2D矢量运动-速度和方向

C#2D矢量运动-速度和方向,c#,game-physics,angle,vector-graphics,C#,Game Physics,Angle,Vector Graphics,我正在做一个(可能很简单)任务,在这个任务中,我想让一个已绘制的对象移动到一个用户控制的(也已绘制)对象。我所拥有的只是玩家X和Y坐标,分别定义为Xp和Yp。必须移动到“玩家对象”的对象(触发器后,不包括在下面的代码中)的坐标在这个.X和这个.Y中定义 int xDirection = Xp - this.X; int yDirection = Yp - this.Y; int angleInDegrees = (int)Math.Atan2(xD

我正在做一个(可能很简单)任务,在这个任务中,我想让一个已绘制的对象移动到一个用户控制的(也已绘制)对象。我所拥有的只是玩家X和Y坐标,分别定义为Xp和Yp。必须移动到“玩家对象”的对象(触发器后,不包括在下面的代码中)的坐标在这个.X和这个.Y中定义

        int xDirection = Xp - this.X;
        int yDirection = Yp - this.Y;
        int angleInDegrees = (int)Math.Atan2(xDirection, yDirection);
        double radians = (Math.PI / 180) * angleInDegrees;
        double xTmp = 3 * Math.Cos(radians);
        int xSpeed = (int)xTmp;
        double yTmp = 3 * Math.Sin(radians);
        int ySpeed = (int)yTmp;
        Console.WriteLine(xDirection);
        Console.WriteLine(yDirection);
        Console.WriteLine(xSpeed);
        Console.WriteLine(ySpeed);
        Console.ReadLine();
这并没有给我正确的数字,所以我想知道可能是什么错了

最困难的一点可能是,必须移动到playerobject的对象可以从所有侧面(360度)接近,但没有可用的接近角度

我希望能把我的问题补充完整,
Tim

Math.Atan2以弧度为单位返回值,其他c#三角函数也是如此

double angle = Math.Atan2(yDirection, xDirection);
还要确保强制类型转换为小数:

3.0 * Math.Cos(radians);

我打赌你看到的主要问题是这句话:

int angleInDegrees = (int)Math.Atan2(xDirection, yDirection);

正如@catflier提到的,
Math.Atan2
返回以弧度为单位的角度(因此是一个从0到2pi的数字)。但是,您将执行转换为
int
,这将截断小数点。所以如果你的角度是45度,那实际上是返回0.785398弧度。对
int
的强制转换将使其变成
0
。类似地,在90度,即~1.570796弧度时,对
int
的投射将导致
1
。这是一个重大的舍入误差。正如我在我的评论中提到的,考虑把所有的类型变成双倍的,并且只在最后一个点执行整数转换(我假设你的对象是基于整数来定位的).< /p> @ TimLagerburg mm,我已经指出了你的代码中的2个错误,所以这可能是一个很好的启动器:但是,Pt并没有解决我的问题;代码>数学.Atan2取(y,x),而不是(x,y)。:)只是一些可能会引起问题的事情。XY坐标、速度和角度应视为双倍。通过使用整数,您将引入相当多的蠕变和舍入误差(特别是在处理弧度)时,您也可以考虑引入显式度/弧度类,以避免可能混合这两种情况。此外,考虑利用极坐标来表示速度(角度+速度)。以下是这两个方面的示例: