Як я можу знайти перпендикуляр до 2D вектора?


20

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

Як я можу обчислити перпендикулярний вектор даного 2D вектора?

Відповіді:


41

Щоб отримати 2D-вектор перпендикулярно іншому 2D-вектору, просто поміняйте Xта Yкомпоненти, нехтуючи новим Yкомпонентом. Так { x, y }стає { y, -x }.


10
Зауважте, що є дві можливості, і ця отримає вам лівий перпендикулярний вектор. (-y | x) - правий векторний вектор.
TravisG

1
Ви повинні заперечити вісь y, щоб мати обертання CCW за традиційною умовою.
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

Вони навпаки. PerpendicularCounterClowwise має повернутися (10,5), а PerpendicularCounter повернутись назад (-10, -5).
opetroch

2
Ой .. це було неправильно 3 роки. Мої вибачення у кожного, хто цим скористався. Зараз я зафіксував відповідь і намалював схему, щоб довести, що цього разу має сенс. Дякуємо @opetroch та PeteUK за те, що вказали на це. Вибачте, на її виправлення пішло так багато часу.
craftworkgames

4

Якщо (сокира, ай), тоді a-perp, отриманий обертанням проти годинникової стрілки на 90 градусів, тобто(-я, сокира)

Дивіться це посилання :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.