2Dベクトルに対する垂線を見つけるにはどうすればよいですか?


20

プレイヤーがマウスカーソルの位置に向かって前方に移動するトップダウンゲームを作成しています。プレイヤーの移動コードの一部として、プレイヤーの現在の対面ベクトルに垂直なベクトルを決定する必要があります(ストラフの動作を実装するため)。

特定の2Dベクトルの垂直ベクトルを計算するにはどうすればよいですか?

回答:


41

2Dベクトルを別の2Dベクトルに垂直にするにはXYコンポーネントとコンポーネントを入れ替えて、新しいYコンポーネントを無効にします。そう{ x, y }なる{ y, -x }


10
2つの可能性があることに注意してください。これにより、左側の垂直ベクトルが取得されます。(-y | x)は右側のベクトルです。
TravisG 14

1
従来の慣例によりy軸を無効にしてCCW回転させる必要があります。
ランディガウル14

@TravisG左右が混同していると思う?(-y、x)は左側の垂直ベクトルであり、(y、-x)は私の計算からのRHSです。
PeteUK

12

必要なときにこれを行う方法を常に忘れているので、いくつかの拡張メソッドを作成しました。

    public static Vector2 PerpendicularClockwise(this Vector2 vector2)
    {
        return new Vector2(vector2.Y, -vector2.X);
    }

    public static Vector2 PerpendicularCounterClockwise(this Vector2 vector2)
    {
        return new Vector2(-vector2.Y, vector2.X);
    }

そしてユニットテスト

    [Test]
    public void Vector2_Perpendicular_Test()
    {
        var a = new Vector2(5, -10);
        var b = a.PerpendicularClockwise();
        var c = a.PerpendicularCounterClockwise();

        Assert.AreEqual(new Vector2(-10, -5), b);
        Assert.AreEqual(new Vector2(10, 5), c);
    }

垂線


ベクトル(5、-10)がある場合、象限4になりますか?その後、時計回りに回転させると、象限3になりますか、つまり両方のコンポーネントが負になりませんか?機能が混同していませんか?
PeteUK

それらは逆です。PerpendicularCounterClockwiseは(10,5)を返し、PerpendicularClockwiseは(-10、-5)を返す必要があります。
オペトロク

2
ああ、これは3年間間違っていた。それを使用した人には謝罪します。答えを修正し、今回は理にかなっていることを証明する図を描きました。これを指摘してくれた@opetrochとPeteUKに感謝します。申し訳ありませんが、修正に時間がかかりました。
craftworkgames

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.