14

我正在做一些游戏编程。FWIW 我正在使用 XNA,但我怀疑这是否相关。

我想将度数转换为幅度为 1 的方向向量(即 X 和 Y)。

我的原点 (0,0) 在左上角。

所以我想将 0 度转换为 [0, -1]

我认为最好的方法是使用我对 North/Up 的定义并使用矩阵旋转它,但这似乎不起作用。

这是代码...

public class Conversion
{
    public static Vector2 GetDirectionVectorFromDegrees(float Degrees)
    {
        Vector2 North= new Vector2(0, -1);
        float Radians = MathHelper.ToRadians(Degrees);

        var RotationMatrix = Matrix.CreateRotationZ(Radians);
        return Vector2.Transform(North, RotationMatrix);
    }
}

...这是我的单元测试...

[TestFixture]
public class Turning_Tests
{
    [Test]
    public void Degrees0_Tests()
    {
        Vector2 result = Conversion.GetDirectionVectorFromDegrees(0);
        Assert.AreEqual(0, result.X);
        Assert.AreEqual(-1, result.Y);
    }
    [Test]
    public void Degrees90_Tests()
    {
        Vector2 result = Conversion.GetDirectionVectorFromDegrees(90);
        Assert.AreEqual(1, result.X);
        Assert.AreEqual(0, result.Y);
    }
    [Test]
    public void Degrees180_Tests()
    {
        Vector2 result = Conversion.GetDirectionVectorFromDegrees(180);
        Assert.AreEqual(0, result.X);
        Assert.AreEqual(1, result.Y);
    }
    [Test]
    public void Degrees270_Tests()
    {
        Vector2 result = Conversion.GetDirectionVectorFromDegrees(270);
        Assert.AreEqual(-1, result.X);
        Assert.AreEqual(0, result.Y);
    }

}

我接近这一切都错了吗?我应该使用矩阵吗?我是否搞砸了并在错误的地方将度数转换为弧度?

我已经看到建议可以使用以下代码完成此操作:

new Vector2((float)Math.Cos(Angle), (float)Math.Sin(Angle));

……或者有时……

new Vector2((float)Math.Sin(Angle), (float)Math.Cos(Angle));

然而,这些似乎也不起作用

有人可以让我走上正确的道路......或者更好的是给我一些代码,导致提供的 4 个单元测试路径?

提前谢谢了。

4

1 回答 1

21

只需使用:

new Vector2((float)Math.Cos(radians), (float)Math.Sin(radians))

确保也使用这种方法将度数转换为弧度。

这使用了数学家的惯例,即从开始[1, 0]和朝方向开始[0, 1](即逆时针方向与数学家用于两个轴的方向)。

要使用您的约定(从 开始[0, -1]并朝 方向[1, 0]),您需要:

new Vector2((float)Math.Sin(radians), -(float)Math.Cos(radians))

请注意,您从度数到弧度的转换永远不会是精确的(它涉及带有 的东西π)。您应该在测试中允许一些容差。此外,如果您使用double而不是floatfor radians,您将在中间计算中获得一些额外的精度。

于 2013-09-17T14:03:35.443 回答