Вычисление перекрестного произведения 2D вектора

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

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

| аксб | = | a |, | Б |, синус (тета)

или же

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

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

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

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

Вот пост об этом и вот статья о Wolfram Math World.

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

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

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

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