Wie finde ich die Senkrechte zu einem 2D-Vektor?

20

Ich mache ein Top-Down-Spiel, bei dem der Spieler vorwärts zur Position des Mauszeigers geht. Als Teil des Bewegungscodes des Spielers muss ich einen Vektor bestimmen, der senkrecht zum aktuellen Gesichtsvektor des Spielers ist (um das Strafing-Verhalten zu implementieren).

Wie kann ich den senkrechten Vektor eines bestimmten 2D-Vektors berechnen?

Jon Dunn
quelle

Antworten:

41

Um den 2D-Vektor senkrecht zu einem anderen 2D-Vektor zu setzen, tauschen Sie einfach die Xund Y-Komponenten aus und negieren Sie die neue YKomponente. So { x, y }wird es { y, -x }.

Racheb
quelle
10
Beachten Sie, dass es zwei Möglichkeiten gibt. Mit dieser erhalten Sie den senkrechten Vektor auf der linken Seite. (-y | x) ist der Vektor auf der rechten Seite.
TravisG
1
Sie sollten die y-Achse negieren, um eine Linksdrehung nach traditioneller Konvention zu erhalten.
RandyGaul
@ TravisG Ich denke du hast das links und rechts vertauscht? (-y, x) ist der linke senkrechte Vektor und (y, -x) ist die RHS aus meinen Berechnungen.
PeteUK
12

Ich vergesse immer, wie ich das mache, wenn ich es brauche, also habe ich ein paar Erweiterungsmethoden geschrieben.

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

Und ein Unit-Test

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

senkrechte Linien

Bastelspiele
quelle
Wenn Sie einen Vektor (5, -10) haben, dann ist er in Quadrant 4, richtig? Wenn Sie es dann im Uhrzeigersinn drehen, ist es dann nicht in Quadrant 3, dh beide Komponenten sind negativ? Haben Sie Ihre Funktionen durcheinander gebracht?
PeteUK
Sie sind umgekehrt. PerarilyCounterClockwise sollte zurückgeben (10,5) und PerarilyClockwise sollte zurückgeben (-10, -5).
opetroch
2
Oh mein ... das war 3 Jahre lang falsch. Ich entschuldige mich bei jedem, der es benutzt hat. Ich habe jetzt die Antwort korrigiert und ein Diagramm gezeichnet, um zu beweisen, dass es dieses Mal Sinn macht. Vielen Dank an @opetroch und PeteUK für den Hinweis. Es tut mir leid, dass es so lange gedauert hat, es zu korrigieren.
Bastelspiele
4

Wenn (Axt, ay), dann a-perp durch eine Drehung um 90 Grad gegen den Uhrzeigersinn erhalten, dh(-ay, axe)

Siehe diesen Link :)

Ja
quelle