Вычисление перекрестного произведения 2D вектора - PullRequest
68 голосов
/ 28 октября 2008

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

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

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

95 голосов
/ 28 октября 2008

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

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

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

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

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

52 голосов
/ 28 октября 2008

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

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

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

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

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

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

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

12 голосов
/ 28 октября 2008

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

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

или

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

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

4 голосов
/ 15 марта 2015

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

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

Здесь - это пост, а здесь - статья о Wolfram Math World.

3 голосов
/ 09 февраля 2009

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

1 голос
/ 05 июня 2018

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

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