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

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

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

Учитывая, что определение определено только в трех измерениях (или семи, одном и нулевом), как рассчитать кросс-произведение двух 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 и не знаю, какой метод использовать.

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

или

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Полезная двухмерная векторная операция - это перекрестное произведение, которое возвращает скаляр. Я использую его, чтобы увидеть, изгибаются ли два последовательных ребра в многоугольнике влево или вправо.

Из источника 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;
}