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