0

我正在做一个(可能很简单)任务,我想让绘制的对象移动到用户控制的(也绘制)。我所拥有的只是玩家 X 和 Y 坐标,分别定义为 Xp 和 Yp。必须移动到“玩家对象”的对象(在触发器之后,不包含在此处的代码中)在 this.X 和 this.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 度)接近,但没有可用的接近角度。

我希望完成我的问题,蒂姆

4

2 回答 2

1

Math.Atan2 以弧度返回一个值,其他 c# 三角函数也是如此。

double angle = Math.Atan2(yDirection, xDirection);

还要确保强制类型转换为小数:

3.0 * Math.Cos(radians);
于 2012-10-01T11:51:22.460 回答
1

我打赌你看到的主要问题是这一行:

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

正如@catflier 所提到Math.Atan2的,以弧度返回角度(所以一个范围从 0 到 2pi 的数字)。但是,您执行强制转换int截断小数位。所以如果你的角度是 45 度,那实际上返回了 ~0.785398 弧度。演员 toint将把它变成0. 同样,在 90 度,即 ~1.570796 弧度,转换int1. 这是重大的舍入误差。正如我在评论中提到的,考虑将所有类型更改为双精度类型,并且只在可能的最后一点执行整数转换(我想你的对象是基于整数定位的)。

于 2012-10-01T13:00:08.423 回答