Bagaimana saya bisa menemukan tegak lurus ke vektor 2D?

20

Saya sedang membuat permainan top down di mana pemain bergerak maju menuju posisi kursor mouse. Sebagai bagian dari kode pergerakan pemain, saya perlu menentukan vektor yang tegak lurus terhadap vektor menghadap pemain saat ini (untuk menerapkan perilaku memberondong).

Bagaimana saya bisa menghitung vektor tegak lurus dari vektor 2D yang diberikan?

Jon Dunn
sumber

Jawaban:

41

Untuk mendapatkan vektor 2D tegak lurus dengan vektor 2D lain cukup tukar Xdan Ykomponen, meniadakan Ykomponen baru . Jadi { x, y }menjadi { y, -x }.

racheb
sumber
10
Perhatikan bahwa ada dua kemungkinan, dan ini akan memberi Anda vektor tegak lurus kiri. (-y | x) adalah vektor sisi kanan.
TravisG
1
Anda harus meniadakan sumbu y untuk memiliki rotasi CCW oleh konvensi tradisional.
RandyGaul
@ TravisG Saya pikir Anda memiliki campuran kiri dan kanan? (-y, x) adalah vektor tegak lurus tangan kiri dan (y, -x) adalah RHS dari perhitungan saya.
PeteUK
12

Saya selalu lupa bagaimana melakukan ini ketika saya membutuhkannya, jadi saya menulis beberapa metode ekstensi.

    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);
    }

Dan tes unit

    [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);
    }

garis tegak lurus

craftworkgames
sumber
Jika Anda memiliki vektor (5, -10) maka itu akan berada di kuadran 4, bukan? Jika Anda memutarnya searah jarum jam, bukankah itu berada di kuadran 3 yaitu kedua komponen negatif? Apakah fungsi Anda tercampur?
PeteUK
Mereka adalah sebaliknya. PerpendicularCounterClockwise harus kembali (10,5) dan PerpendicularClockwise harus kembali (-10, -5).
opetroch
2
Ya ampun .. ini salah selama 3 tahun. Saya minta maaf kepada siapa pun yang menggunakannya. Sekarang saya telah memperbaiki jawabannya dan menggambar diagram untuk membuktikan bahwa kali ini masuk akal. Terima kasih kepada @opetroch dan PeteUK karena menunjukkan ini. Maaf butuh waktu lama untuk memperbaikinya.
craftworkgames
4

Jika (kapak, ay), maka nilai yang diperoleh dengan rotasi berlawanan arah jarum jam sebesar 90 derajat, yaitu,(-ay, kapak)

Lihat tautan ini :)

Yas
sumber