¿Cómo puedo encontrar la perpendicular a un vector 2D?

20

Estoy haciendo un juego de arriba hacia abajo donde el jugador avanza hacia la posición del cursor del mouse. Como parte del código de movimiento del jugador, necesito determinar un vector que sea perpendicular al vector de orientación actual del jugador (para implementar el comportamiento de estrangulamiento).

¿Cómo puedo calcular el vector perpendicular de un vector 2D dado?

Jon Dunn
fuente

Respuestas:

41

Para obtener el vector 2D perpendicular a otro vector 2D simplemente cambie los componentes Xy Y, negando el nuevo Ycomponente. Así se { x, y }convierte { y, -x }.

racheb
fuente
10
Tenga en cuenta que hay dos posibilidades, y esta le dará el vector perpendicular de la izquierda. (-y | x) es el vector del lado derecho.
TravisG
1
Debe negar el eje y para tener una rotación CCW por convención tradicional.
RandyGaul
@TravisG ¿Creo que tienes la izquierda y la derecha mezcladas? (-y, x) es el vector perpendicular de la izquierda y (y, -x) es el RHS de mis cálculos.
PeteUK
12

Siempre olvido cómo hacer esto cuando lo necesito, así que escribí un par de métodos de extensión.

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

Y una prueba unitaria

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

lineas perpendiculares

juegos de manualidades
fuente
Si tienes un vector (5, -10), entonces estará en el cuadrante 4, ¿verdad? Si luego lo gira en sentido horario, ¿no estará en el cuadrante 3, es decir, ambos componentes son negativos? ¿Tienes tus funciones mezcladas?
PeteUK
Son al revés. PerpendicularCounterClockwise debería regresar (10,5) y PerpendicularClockwise debería regresar (-10, -5).
opetroch
2
Oh mi ... esto estuvo mal durante 3 años. Mis disculpas a cualquiera que lo haya usado. Ahora arreglé la respuesta y dibujé un diagrama para demostrar que esta vez tiene sentido. Gracias a @opetroch y PeteUK por señalar esto. Lo siento, tomó tanto tiempo corregirlo.
Craftworkgames
4

Si (hacha, ay), entonces a-perp obtenido por una rotación en sentido antihorario de 90 grados, es decir,(-ay, hacha)

Ver este enlace :)

Yas
fuente