Jak znaleźć prostopadłą do wektora 2D?


20

Robię grę z góry na dół, w której gracz przesuwa się do przodu w kierunku pozycji kursora myszy. W ramach kodu ruchu gracza muszę określić wektor, który jest prostopadły do ​​obecnego wektora skierowanego do gracza (aby wprowadzić zachowanie polegające na zadawaniu ciosów).

Jak obliczyć wektor prostopadły danego wektora 2D?

Odpowiedzi:


41

Aby uzyskać wektor 2D prostopadły do ​​innego wektora 2D, wystarczy zamienić komponenty Xi Y, negując nowy Ykomponent. Tak się { x, y }staje { y, -x }.


10
Zauważ, że istnieją dwie możliwości, a ta da ci wektor prostopadły po lewej stronie. (-y | x) jest wektorem po prawej stronie.
TravisG

1
Powinieneś zanegować oś y, aby uzyskać obrót w lewo zgodnie z tradycyjną konwencją.
RandyGaul

@TravisG Myślę, że pomieszałeś lewą i prawą stronę? (-y, x) jest prostopadłym wektorem lewej ręki, a (y, -x) jest RHS z moich obliczeń.
PeteUK

12

Zawsze zapominam, jak to zrobić, kiedy jest to potrzebne, więc napisałem kilka metod rozszerzenia.

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

I test jednostkowy

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

prostopadłe linie


Jeśli masz wektor (5, -10), to będzie on w ćwiartce 4, prawda? Jeśli następnie obrócisz go zgodnie z ruchem wskazówek zegara, to czy nie będzie w ćwiartce 3, tzn. Że oba składniki będą ujemne? Czy masz pomieszane funkcje?
PeteUK

Są na odwrót. PerpendicularCounterClockwise powinien zwrócić (10,5), a PerpendicularCounterClockwise powinien zwrócić (-10, -5).
opetroch

2
O mój .. to było złe przez 3 lata. Przepraszam każdego, kto go wykorzystał. Poprawiłem odpowiedź i narysowałem schemat, aby udowodnić, że tym razem ma to sens. Dzięki @opetroch i PeteUK za zwrócenie na to uwagi. Przepraszam, że tak długo to trwało.
craftworkgames

4

Jeśli (ax, ay), to a-perp uzyskany przez obrót przeciwny do ruchu wskazówek zegara o 90 stopni, tj.(-ay, ax)

Zobacz link :)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.