Comment trouver la perpendiculaire à un vecteur 2D?

20

Je fais un jeu de haut en bas où le joueur avance vers la position du curseur de la souris. Dans le cadre du code de mouvement du joueur, je dois déterminer un vecteur perpendiculaire au vecteur actuel du joueur (pour implémenter le comportement de mitraillage).

Comment puis-je calculer le vecteur perpendiculaire d'un vecteur 2D donné?

Jon Dunn
la source

Réponses:

41

Pour obtenir le vecteur 2D perpendiculaire à un autre vecteur 2D, échangez simplement les composants Xet Y, annulant le nouveau Ycomposant. Devient { x, y }ainsi { y, -x }.

racheb
la source
10
Notez qu'il y a deux possibilités, et celle-ci vous donnera le vecteur perpendiculaire gauche. (-y | x) est le vecteur de droite.
TravisG
1
Vous devez annuler l'axe y pour avoir une rotation CCW par convention traditionnelle.
RandyGaul
@TravisG Je pense que vous avez confondu la gauche et la droite? (-y, x) est le vecteur perpendiculaire gauche et (y, -x) est le RHS de mes calculs.
PeteUK
12

J'oublie toujours comment faire cela quand j'en ai besoin, j'ai donc écrit quelques méthodes d'extension.

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

Et un test unitaire

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

les lignes perpendiculaire

jeux d'artisanat
la source
Si vous avez un vecteur (5, -10), ce sera dans le quadrant 4, non? Si vous le tournez ensuite dans le sens horaire, ne sera-t-il pas dans le quadrant 3, c'est-à-dire que les deux composantes sont négatives? Avez-vous mélangé vos fonctions?
PeteUK
Ils sont l'inverse. PerpendicularCounterClockwise doit retourner (10,5) et PerpendicularClockwise doit retourner (-10, -5).
opetroch
2
Oh mon .. c'était mal pendant 3 ans. Mes excuses à tous ceux qui l'ont utilisé. J'ai maintenant fixé la réponse et dessiné un diagramme pour prouver que cela a du sens cette fois. Merci à @opetroch et PeteUK de l'avoir signalé. Désolé, il a fallu si longtemps pour le corriger.
craftworkgames
4

Si (hache, ay), alors a-perp obtenu par une rotation dans le sens antihoraire de 90 degrés, c'est-à-dire,(-ay, hache)

Voir ce lien :)

Oui
la source