Como posso encontrar a perpendicular a um vetor 2D?

20

Estou fazendo um jogo de cima para baixo em que o jogador se move para a frente em direção à posição do cursor do mouse. Como parte do código de movimento do jogador, preciso determinar um vetor que é perpendicular ao vetor atual do jogador (para implementar o comportamento de flutuação).

Como posso calcular o vetor perpendicular de um determinado vetor 2D?

Jon Dunn
fonte

Respostas:

41

Para obter o vetor 2D perpendicular a outro vetor 2D, basta trocar os componentes Xe Y, negando o novo Ycomponente. Então { x, y }se torna { y, -x }.

racheb
fonte
10
Note que existem duas possibilidades, e esta irá obter o vetor perpendicular esquerdo. (-y | x) é o vetor do lado direito.
TravisG
11
Você deve negar o eixo y para ter uma rotação no sentido anti-horário por convenção tradicional.
RandyGaul
@TravisG Eu acho que você tem a esquerda e a direita misturadas? (-y, x) é o vetor perpendicular esquerdo e (y, -x) é o RHS dos meus cálculos.
PeteUK
12

Eu sempre esqueço como fazer isso quando preciso, então escrevi alguns métodos de extensão.

    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 um teste de unidade

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

linhas perpendiculares

craftworkgames
fonte
Se você tem um vetor (5, -10), ele estará no quadrante 4, certo? Se você girá-lo no sentido horário, ele não ficará no quadrante 3, ou seja, os dois componentes serão negativos? Você confundiu suas funções?
PeteUK
Eles são o contrário. PerpendicularCounterClockwise deve retornar (10,5) e PerpendicularClockwise deve retornar (-10, -5).
Opetroch
2
Oh meu ... isso estava errado por 3 anos. Peço desculpas a quem o usou. Corrigi a resposta e desenhei um diagrama para provar que faz sentido dessa vez. Agradecemos a @opetroch e PeteUK por apontar isso. Desculpe, demorou tanto tempo para corrigi-lo.
Craftworkgames
4

Se (machado, ay), então a-perp obtido por uma rotação no sentido anti-horário de 90 graus, ou seja,(-ay, ax)

Veja este link :)

Yas
fonte