Вычисление векторного произведения двумерного вектора
-
04-07-2019 - |
Вопрос
Из Википедии:
векторное произведение — это бинарная операция над двумя векторами в трехмерный Евклидово пространство, в результате которого получается другой вектор, перпендикулярный плоскости, содержащей два входных вектора.
Учитывая, что определение определено только в трех (или семь, один и ноль) размеров, как рассчитать векторное произведение двух 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;
}