Розрахунок поперечного добутку 2D вектора


85

З Вікіпедії:

перехресний добуток - це двійкова операція над двома векторами в тривимірному евклідовому просторі, в результаті якої виникає інший вектор, перпендикулярний площині, що містить два вхідні вектори.

Враховуючи, що визначення визначається лише у трьох ( або семи, одиничному та нульовому ) вимірах, як розрахувати перехресний добуток двох двовимірних векторів?

Я бачив дві реалізації. Один повертає новий вектор (але приймає лише один вектор), інший - скаляр (але є розрахунком між двома векторами).

Реалізація 1 (повертає скаляр):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

Реалізація 2 (повертає вектор):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

Чому різні реалізації? Для чого б я використав скалярну реалізацію? Для чого б я використав векторну реалізацію?

Причина, по якій я запитую, полягає в тому, що я сам пишу клас Vector2D і не знаю, який метод використовувати.


10
Реалізація 2 помилкова. Для утворення перехресного добутку потрібні два вектори.
bobobobo

7
Реалізація 2 обертає заданий вектор v на -90 градусів. Замінник -90 в x' = x cos θ - y sin θі y' = x sin θ + y cos θ. Іншим варіантом цієї реалізації буде return Vector2D(-v.Y, v.X);поворот v на +90 градусів.
legends2k

3
@ legends2k: Варто зазначити, що реалізація 2 є розширенням використання детермінанта для оцінки перехресного продукту : просто видаліть останній рядок і стовпець. Таке розширення завжди має N-1операнди для Nрозмірів.
Tim Čas

4
Реалізація 1 обчислює величину перехресного продукту.
Mateen Ulhaq,

@MateenUlhaq начебто це " підписана величина"
Моріц Марінгер,

Відповіді:


100

Реалізація 1 повертає величину вектора, яка буде результатом звичайного поперечного добутку вхідних векторів, приймаючи їх значення Z неявно як 0 (тобто обробляючи 2D-простір як площину в 3D-просторі). 3D-поперечний добуток буде перпендикулярним до цієї площини і, отже, матиме 0 X & Y-компонентів (таким чином, скаляр повертається як значення Z вектора поперечного добутку 3D).

Зауважимо, що величина вектора, отриманого в результаті поперечного добутку 3D, також дорівнює площі паралелограма між двома векторами, що надає реалізації 1 ще одне призначення. Крім того, ця область підписана і може бути використана для визначення, чи рухається обертання від V1 до V2 в напрямку проти годинникової стрілки або за годинниковою стрілкою. Слід також зазначити, що реалізація 1 є визначальним фактором матриці 2x2, побудованої з цих двох векторів.

Реалізація 2 повертає вектор, перпендикулярний до вхідного вектора, що все ще знаходиться в тій же 2D-площині. Не перехресний продукт у класичному розумінні, а послідовний у сенсі "дай мені перпендикулярний вектор".

Зверніть увагу, що 3D-евклідовий простір закритий під час дії поперечного добутку - тобто перехресний добуток двох 3D-векторів повертає інший 3D-вектор. Обидві вищезазначені реалізації 2D тим чи іншим чином несумісні з цим.

Сподіваюся, це допомагає ...


6
Власне, реалізація 2 є перехресним добутком v і одиничного вектора, спрямованого вгору в напрямку z.
mattiast

@mattiast: Правда. Саме так описана операція 2D "perp" у 3D.
Дрю Холл

@mattiast: Впровадження 2 можна розглядати як розширення використання детермінанта для обчислення перехресного добутку - просто видаліть останній рядок і стовпець. Слід зазначити, що реалізація 1 еквівалентна:, DotProduct(a, CrossProduct(b))що (дуже вишукано!) Узгоджується з поняттям "перпендикулярно-крапковий виріб" (саме це реалізація 1 також [і, можливо, точніше] відома як!).
Tim Čas

У вашому першому абзаці величина - це абсолютна величина того, що повертається. Це не зовсім те саме, що Z-компонент. Як ви вказуєте у 2-му абзаці, ви можете використовувати знак хреста для відбиття вампірів ... помиляйтесь, я маю на увазі виявити, коли вектор йде, проти введення контуру багатокутника, наприклад.
Пітер Кордес,

68

Коротше кажучи: це скорочене позначення для математичного злому.

Довге пояснення:

Ви не можете зробити крос-добуток з векторами у двовимірному просторі. Операція там не визначена.

Однак часто цікаво оцінити перехресний добуток двох векторів, припускаючи, що двовимірні вектори розширені до 3D, встановивши їх координату z на нуль. Це те саме, що працювати з тривимірними векторами на площині xy.

Якщо ви розширите вектори таким чином і обчислите перехресний добуток такої розширеної векторної пари, ви помітите, що лише z-компонент має значуще значення: x і y завжди будуть дорівнювати нулю.

Ось причина, чому z-компонент результату часто просто повертається як скаляр. Наприклад, за допомогою цього скаляра можна знайти обмотку трьох точок у двовимірному просторі.

З чисто математичної точки зору перехресний добуток у двовимірному просторі не існує, скалярна версія - це хак, а 2D перехресний добуток, який повертає 2D вектор, взагалі не має сенсу.


"наприклад, використовувати для пошуку обмотки трьох точок у двовимірному просторі" @ Nils Pipenbrinck, що ви маєте на увазі під намотуванням у цьому контексті?
Nader Belal

1
@NaderBelal Я припускаю, що звивистість тут означатиме - якщо ми перейдемо від точки a до b до c, будемо рухатись за годинниковою стрілкою або проти годинникової стрілки, з точки зору кута, який ми щойно перевищили.
Amit Tomar

12

Ще однією корисною властивістю поперечного добутку є те, що його величина пов’язана з синусом кута між двома векторами:

| axb | = | а | . | б | . синус (тета)

або

синус (тета) = | axb | / (| a |. | b |)

Отже, у реалізації 1 вище, якщо aі bзаздалегідь відомо, що вони є одиничними векторами, то результат цієї функції - це саме те значення sine ().


1
... що також є подвоєною площею трикутника між вектором a і вектором b.
Тім Ловелл-Сміт

5

Реалізація 1 - це довідковий продукт двох векторів. Найкраще, що я знаю для двовимірної графіки, - це відмінна серія Graphics Gems . Якщо ви робите подряпину 2D-роботу, дуже важливо мати ці книги. Том IV має статтю під назвою "Задоволення виробів із крапками", в якій описано багато її використання.

Одним із основних застосувань перпендикулярного продукту є отримання масштабу sinкута між двома векторами, подібно до того, як крапковий продукт повертає масштаб cosкута. Звичайно, ви можете використовувати крапковий добуток і перпендикулярний добуток разом, щоб визначити кут між двома векторами.

Ось допис про це, і ось стаття Wolfram Math World.


3

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


3

Корисна 2D-векторна операція - це перехресний добуток, який повертає скаляр. Я використовую його, щоб побачити, чи згинаються два послідовні ребра багатокутника вліво чи вправо.

З джерела Chipmunk2D :

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.