Come posso trovare la perpendicolare a un vettore 2D?


20

Sto realizzando un gioco dall'alto verso il basso in cui il giocatore si sposta in avanti verso la posizione del cursore del mouse. Come parte del codice di movimento del giocatore, devo determinare un vettore che è perpendicolare al vettore di fronte corrente del giocatore (per implementare il comportamento di strappo).

Come posso calcolare il vettore perpendicolare di un dato vettore 2D?

Risposte:


41

Per ottenere il vettore 2D perpendicolare a un altro vettore 2D, è sufficiente scambiare i componenti Xe Y, annullando il nuovo Ycomponente. Così { x, y }diventa { y, -x }.


10
Nota che ci sono due possibilità, e questa ti darà il vettore perpendicolare della mano sinistra. (-y | x) è il vettore sul lato destro.
TravisG,

1
Dovresti negare l'asse y per avere una rotazione in senso antiorario secondo la convenzione tradizionale.
RandyGaul

@TravisG Penso che tu abbia mescolato destra e sinistra? (-y, x) è il vettore perpendicolare della mano sinistra e (y, -x) è l'RHS dai miei calcoli.
PeteUK,

12

Dimentico sempre come farlo quando ne ho bisogno, quindi ho scritto un paio di metodi di estensione.

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

E un test unitario

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

Linee perpendicolari


Se hai un vettore (5, -10), sarà nel quadrante 4, giusto? Se lo ruotate in senso orario, non sarà nel quadrante 3, cioè entrambi i componenti negativi? Hai confuso le tue funzioni?
PeteUK,

Sono il contrario. PerpendicularCounterClockwise dovrebbe tornare (10,5) e PerpendicularClockwise dovrebbe tornare (-10, -5).
opetroch

2
Oh mio .. questo è stato sbagliato per 3 anni. Mi scuso con chiunque l'abbia usato. Ora ho risolto la risposta e disegnato un diagramma per dimostrare che questa volta ha senso. Grazie a @opetroch e PeteUK per averlo segnalato. Mi dispiace che ci sia voluto tanto tempo per correggerlo.
craftworkgames

4

Se (ascia, ay), quindi a-perp ottenuto da una rotazione in senso antiorario di 90 gradi, ovvero(-ay, ascia)

Vedi questo link :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.