Из википедии:
перекрестное произведение - это бинарная операция над двумя векторами в трехмерном евклидовом пространстве, результатом которой является другой вектор, перпендикулярный плоскости, содержащей два входных вектора.
Учитывая, что определение определено только в трех ( или семи, одном и нулевом ) измерениях, как вычислить перекрестное произведение двух двумерных векторов?
Я видел две реализации. Один возвращает новый вектор (но принимает только один вектор), другой возвращает скаляр (но является вычислением между двумя векторами).
Реализация 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 и не знаю, какой метод использовать.
источник
x' = x cos θ - y sin θ
иy' = x sin θ + y cos θ
. Другой вариант этой реализацииreturn Vector2D(-v.Y, v.X);
- повернуть v на +90 градусов.N-1
операнды дляN
измерений.Ответы:
Реализация 1 возвращает величину вектора, которая была бы результатом обычного трехмерного перекрестного произведения входных векторов, принимая их значения Z неявно как 0 (т.е. рассматривая двумерное пространство как плоскость в трехмерном пространстве). Трехмерное векторное произведение будет перпендикулярно этой плоскости и, следовательно, будет иметь 0 компонентов X и Y (таким образом, возвращаемый скаляр является значением Z вектора трехмерного перекрестного произведения).
Обратите внимание, что величина вектора, полученного в результате трехмерного перекрестного произведения, также равна площади параллелограмма между двумя векторами, что дает Реализации 1 еще одну цель. Кроме того, эта область подписана и может использоваться для определения того, движется ли вращение от V1 к V2 против часовой стрелки или по часовой стрелке. Также следует отметить, что реализация 1 является определителем матрицы 2x2, построенной из этих двух векторов.
Реализация 2 возвращает вектор, перпендикулярный входному вектору, все еще в той же 2D-плоскости. Не перекрестное произведение в классическом смысле, но непротиворечивое в смысле «дайте мне перпендикулярный вектор».
Обратите внимание, что трехмерное евклидово пространство закрывается операцией перекрестного произведения - то есть перекрестное произведение двух трехмерных векторов возвращает другой трехмерный вектор. Обе вышеупомянутые 2D-реализации так или иначе несовместимы с этим.
Надеюсь это поможет...
источник
DotProduct(a, CrossProduct(b))
что (очень элегантно!) Согласуется с понятием «перпендикулярного скалярного произведения» (это то, что реализация 1 также [и, возможно, более точно] известна как!).Вкратце: это сокращенное обозначение математического хака.
Длинное объяснение:
Вы не можете сделать кросс-произведение с векторами в 2D-пространстве. Операция там не определена.
Однако часто бывает интересно оценить перекрестное произведение двух векторов, предполагая, что двумерные векторы расширены до трехмерных, установив их координату z равной нулю. Это то же самое, что и работа с трехмерными векторами на плоскости xy.
Если вы расширите векторы таким образом и вычислите перекрестное произведение такой расширенной пары векторов, вы заметите, что только z-компонент имеет значимое значение: x и y всегда будут равны нулю.
По этой причине z-компонент результата часто просто возвращается как скаляр. Этот скаляр можно использовать, например, для нахождения намотки трех точек в 2D-пространстве.
С чисто математической точки зрения перекрестного произведения в 2D-пространстве не существует, скалярная версия - это взлом, а двумерное перекрестное произведение, возвращающее двумерный вектор, вообще не имеет смысла.
источник
Еще одно полезное свойство перекрестного произведения состоит в том, что его величина связана с синусом угла между двумя векторами:
или же
Итак, в реализации 1 выше, если заранее известно , что
a
иb
являются единичными векторами, то результатом этой функции будет именно то значение sine ().источник
Реализация 1 - это скалярное произведение двух векторов. Лучшее из известных мне справочников по 2D-графике - это превосходная серия Graphics Gems . Если вы делаете скретч-2D-работу, очень важно иметь эти книги. В томе IV есть статья под названием «Удовольствие от продуктов Perp Dot», в которой рассказывается о множестве ее применений.
Одно из основных применений скалярного произведения - получить масштабированный
sin
угол между двумя векторами, точно так же, как скалярное произведение возвращает масштабированныйcos
угол. Конечно, вы можете использовать скалярное произведение и расчётное скалярное произведение вместе, чтобы определить угол между двумя векторами.Вот пост об этом, а вот статья Wolfram Math World.
источник
Я использую двумерное перекрестное произведение в своих расчетах, чтобы найти новое правильное вращение для объекта, на который действует вектор силы в произвольной точке относительно его центра масс. (Скаляр Z один.)
источник
Полезной 2D векторной операцией является перекрестное произведение, возвращающее скаляр. Я использую его, чтобы увидеть, изгибаются ли два последовательных ребра в многоугольнике влево или вправо.
Из источника Chipmunk2D :
источник