Как найти перпендикуляр к двухмерному вектору?


20

Я делаю игру сверху вниз, в которой игрок движется вперед к позиции курсора мыши. Как часть кода движения игрока, мне нужно определить вектор, перпендикулярный текущему вектору игрока (для реализации поведения стрельбы).

Как я могу вычислить перпендикулярный вектор данного 2D вектора?

Ответы:


41

Для того, чтобы получить вектор , перпендикулярный 2D другому 2D вектор просто поменять местами Xи Yкомпоненты, отрицая новый Yкомпонент. Так { x, y }становится { y, -x }.


10
Обратите внимание, что есть две возможности, и эта даст вам перпендикулярный вектор слева. (-y | x) - правый вектор.
TravisG

1
Вы должны отрицать ось Y, чтобы иметь вращение против часовой стрелки в соответствии с традиционным соглашением.
RandyGaul

@ TravisG Я думаю, ты перепутал левое и правое? (-y, x) - левый перпендикулярный вектор, а (y, -x) - RHS из моих расчетов.
PeteUK

12

Я всегда забываю, как это сделать, когда мне это нужно, поэтому я написал пару методов расширения.

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

И юнит тест

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

перпендикулярные линии


Если у вас есть вектор (5, -10), то он будет в квадранте 4, верно? Если затем повернуть его по часовой стрелке, разве он не будет в квадранте 3, т.е. оба компонента отрицательны? Вы перепутали свои функции?
PeteUK

Они наоборот. PerpendicularCounterClockwise должен вернуть (10,5), а PerpendicularClockwise должен вернуть (-10, -5).
opetroch

2
Боже мой ... это было неправильно в течение 3 лет. Приношу свои извинения всем, кто его использовал. Теперь я исправил ответ и нарисовал диаграмму, чтобы доказать, что это имеет смысл на этот раз. Спасибо @opetroch и PeteUK за указание на это. Извините, что потребовалось так много времени, чтобы исправить это.
craftworkgames

4

Если (топор, ау), то a-perp получается поворотом против часовой стрелки на 90 градусов, т.е.(-Да, топор)

Смотрите эту ссылку :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.