Вычисление двумерного векторного кросс-продукта

Из Википедии:

кросс-произведение является бинарной операцией на двух векторах в трехмерном евклидовом пространстве, что приводит к другому вектору, который перпендикулярен плоскости, содержащей два входных вектора.

Учитывая, что определение определено только в трех измерениях (или семи, одном и нулевом), как рассчитать кросс-произведение двух 2d векторы?

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

Реализация 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 и не знаю, какой метод использовать.

53
задан Zack The Human 28 окт. '08 в 19:22
источник поделиться
5 ответов

Реализация 1 возвращает величину вектора, которая будет получена из регулярного трехмерного поперечного произведения входных векторов, неявно определяя их значения Z как (рассматривая двумерное пространство как плоскость в трехмерном пространстве). Трехмерное поперечное произведение будет перпендикулярно этой плоскости и, следовательно, имеет компоненты 0 X и Y (таким образом, скаляр возвращается - значение Z вектора 3D-поперечного произведения).

Обратите внимание, что величина вектора, полученная из трехмерного поперечного произведения, также равна площади параллелограмма между двумя векторами, что дает реализацию 1 другой цели. Кроме того, эта область подписана и может использоваться для определения того, перемещается ли от V1 до V2 против часовой стрелки или по часовой стрелке. Следует также отметить, что реализация 1 является определителем матрицы 2x2, построенной из этих двух векторов.

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

Обратите внимание, что трехмерное евклидово пространство замкнуто относительно операции поперечного произведения, т.е. перекрестное произведение двух трехмерных векторов возвращает другой трехмерный вектор. Обе вышеупомянутые 2D-реализации не согласуются с тем, что так или иначе.

Надеюсь, что это поможет...

81
ответ дан Drew Hall 28 окт. '08 в 19:39
источник поделиться

Короче: Это сокращенная нотация для математического взлома.

Длительное объяснение:

Вы не можете сделать кросс-продукт с векторами в 2D-пространстве. Операция там не определена.

Однако часто бывает интересно оценить поперечное произведение двух векторов, предполагая, что 2D-векторы расширены до 3D, установив их z-координату в нуль. Это то же самое, что и работа с 3D-векторами на плоскости xy.

Если вы расширите векторы таким образом и вычислите поперечное произведение такой расширенной пары векторов, вы заметите, что только z-компонент имеет значимое значение: x и y всегда будут равны нулю.

Это причина, по которой z-компонент результата часто просто возвращается как скаляр. Этот скаляр можно, например, использовать для нахождения обмотки трех точек в 2D-пространстве.

С чистой математической точки зрения перекрестное произведение в двумерном пространстве не существует, скалярная версия - это хак и двумерное произведение, которое возвращает 2D-вектор, не имеет никакого смысла.

40
ответ дан Nils Pipenbrinck 28 окт. '08 в 19:40
источник поделиться

Другим полезным свойством кросс-произведения является то, что его величина связана с синусом угла между двумя векторами:

| a x b | = | a |, | Б |, синус (тета)

или

sine (theta) = | a x b |/(| a |. | b |)

Итак, в реализации 1 выше, если a и b заранее известны как единичные векторы, то результатом этой функции является именно это значение sine().

9
ответ дан Alnitak 28 окт. '08 в 19:58
источник поделиться

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

3
ответ дан Olai 09 февр. '09 в 14:09
источник поделиться

Реализация 1 - это точка-точка продукта двух векторов. Лучшей ссылкой, которую я знаю для 2D-графики, является отличная Графические самоцветы. Если вы работаете с 2D-работой, важно действительно иметь эти книги. В томе IV есть статья под названием "Удовольствия Perp Dot Products", которая использует много возможностей для нее.

Одним из основных способов использования продукта с точкой в ​​точке перпендикулярности является получение масштабированного sin угла между двумя векторами, так же как dot product возвращает масштабированный cos угла. Конечно, вы можете использовать dot product и perp dot product вместе, чтобы определить угол между двумя векторами.

Здесь - это сообщение, а здесь статья Вольфрам Матт Мир.

3
ответ дан Bill Burdick 15 марта '15 в 15:13
источник поделиться

Другие вопросы по меткам