Bir 2D vektöre dik olanı nasıl bulabilirim?


20

Oyuncunun fare imlecinin konumuna doğru ilerlediği bir yukarıdan aşağıya oyun yapıyorum. Oyuncunun hareket kodunun bir parçası olarak, oyuncunun mevcut karşı karşıya vektörüne dik olan bir vektörü belirlemem gerekiyor (kazıma davranışını uygulamak için).

Belirli bir 2B vektörünün dikey vektörünü nasıl hesaplayabilirim?

Yanıtlar:


41

2D vektörünün başka bir 2D vektörüne dik olmasını sağlamak için Xve Ybileşenlerini değiştirerek yeni Ybileşeni reddedin . Böylece { x, y }olur { y, -x }.


10
İki olasılık olduğunu unutmayın ve bu size sol dikey vektörü verecektir. (-y | x) sağ taraf vektörüdür.
TravisG

1
Geleneksel kurallara göre bir CCW dönüşü için y eksenini reddetmelisiniz.
RandyGaul

@TravisG Sanırım sol ve sağ karışık mı? (-y, x) sol el dikey vektör ve (y, -x) hesaplamalarımdan RHS.
PeteUK

12

İhtiyacım olduğunda bunu nasıl yapacağımı her zaman unutuyorum, bu yüzden birkaç uzatma yöntemi yazdım.

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

Ve bir birim testi

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

Dikey çizgiler


Bir vektörünüz varsa (5, -10) 4. çeyrekte olur, değil mi? Daha sonra saat yönünde döndürürseniz, kadran 3'te olmaz, yani her iki bileşen de negatif olmaz mı? İşlevlerinizi karıştırdınız mı?
PeteUK

Onlar tam tersi. PerpendicularCounterClockwise dönmeli (10,5) ve PerpendicularClockwise dönmeli (-10, -5).
opetroch

2
Oh my .. bu 3 yıl boyunca yanlıştı. Bunu kullanan herkese özür dilerim. Şimdi cevabı düzelttim ve bu sefer mantıklı olduğunu kanıtlamak için bir diyagram çizdim. @Opetroch ve PeteUK'a bunu işaret ettikleri için teşekkürler. Üzgünüm, düzeltmek çok uzun sürdü.
craftworkgames

4

Eğer (balta, ay), a-perp saat yönünün tersine 90 derece döndürülerek elde edilirse , yani,(-ay, balta)

Bu bağlantıya bakın :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.