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

StackOverflow https://stackoverflow.com/questions/243945

Вопрос

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

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

Учитывая, что определение определено только в трех (или семь, один и ноль) размеров, как рассчитать векторное произведение двух 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 возвращает величину вектора, которая возникнет в результате регулярного трехмерного перекрестного произведения входных векторов, неявно принимая их значения Z за 0 (т.е. обрабатывая 2D-пространство как плоскость в 3D-пространстве). Трехмерное перекрестное произведение будет перпендикулярно этой плоскости и, следовательно, будет 0 X & amp; Компоненты Y (таким образом, возвращаемое значение скаляра является значением Z вектора трехмерного перекрестного произведения).

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

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

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

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

Другие советы

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

Подробное объяснение.

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

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

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

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

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

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

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

или

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

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

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

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

Здесь есть пост, и < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> здесь - статья о Wolfram Math World.

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

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

Из 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top