Перекрестное произведение двух 2D векторов

Может ли кто-нибудь привести пример функции, которая возвращает векторное произведение ДВУХ 2-мерных векторов? Я пытаюсь реализовать этот алгоритм.

Код на C был бы отличным. Спасибо.


РЕДАКТИРОВАТЬ: нашел другой способ сделать это, который работает для 2D и очень прост.

bool tri2d::inTriangle(vec2d pt) {
    float AB = (pt.y-p1.y)*(p2.x-p1.x) - (pt.x-p1.x)*(p2.y-p1.y);
    float CA = (pt.y-p3.y)*(p1.x-p3.x) - (pt.x-p3.x)*(p1.y-p3.y);
    float BC = (pt.y-p2.y)*(p3.x-p2.x) - (pt.x-p2.x)*(p3.y-p2.y);

    if (AB*BC>0.f && BC*CA>0.f)
        return true;
    return false;    
}

person Community    schedule 25.02.2010    source источник
comment
Это для работы или дома?   -  person legends2k    schedule 25.02.2010
comment
Это для личного удовольствия. Почему?   -  person    schedule 25.02.2010
comment
@ tm1rbt - Потому что SOers хотят знать, когда мы делаем домашнее задание или помогаем с ним, чтобы мы могли потребовать перевод кредитов на наши собственные академические справки.   -  person High Performance Mark    schedule 25.02.2010
comment
не будьте такими грубыми и попробуйте прочитать его еще раз. Учитывая, что определение требует как минимум трех измерений, как вычислить перекрестное произведение двух 2-мерных векторов?   -  person jk.    schedule 25.02.2010
comment
@ tm1rbrt: Просто чтобы знать; потому что я знаю людей, которые не делают то же самое, уклоняются от своей работы и добиваются ее через ТАК. Обычно ТАК вызывает сомнения; помощь - это что-то, но выполнение чужой работы - совсем другое. Кстати, не употребляйте сильных слов вроде придурок.   -  person legends2k    schedule 25.02.2010
comment
Как, черт возьми, вы можете попросить функцию для вычисления перекрестного произведения, принять неправильный ответ и затем опубликовать функцию, возвращающую логическое значение? Я голосую "против" и голосую за закрытие.   -  person duffymo    schedule 27.02.2010
comment
Согласитесь с @duffymo. Я думаю, что создатель темы хотел вычислить перекрестное произведение для своего алгоритма, но в итоге использовал другой метод, который вообще не требует векторной алгебры. Но я не голосую против этого вопроса.   -  person Yukio Fukuzawa    schedule 02.04.2013


Ответы (2)


(Примечание: перекрестное произведение двух векторов определяется только в 3D и 7D пространства.)

Код вычисляет z -компонент двух векторов, лежащих на плоскости xy:

vec2D a, b;
...
double z = a.x * b.y - b.x * a.y;
return z;
person kennytm    schedule 25.02.2010
comment
Ух ты. Хотел бы дать вам дополнительный +1 за эту ссылку! - person AakashM; 25.02.2010
comment
@ tm1rbrt: Этот CrossProduct должен быть полностью трехмерным кросс-продуктом. Вы всегда можете добавить обратно два нулевых компонента. - person kennytm; 25.02.2010
comment
Перекрестное произведение двух векторов в трехмерном пространстве является трехмерным вектором, но ваш код возвращает только двойное значение. Что хорошего в одном компоненте? - person duffymo; 26.02.2010
comment
Трехмерное перекрестное произведение двух векторов в плоскости x / y всегда идет вдоль оси z, поэтому нет смысла указывать два дополнительных числа, заведомо равных нулю. Другой способ взглянуть на это: ближайшим двумерным эквивалентом трехмерного перекрестного произведения является операция (указанная выше), которая возвращает скаляр. - person comingstorm; 26.02.2010
comment
Кроме того, я хочу заверить вас, что вышеуказанная операция действительно будет правильно работать с алгоритмом, на который вы ссылаетесь. Если вы проработаете это, скалярное произведение результирующих векторов перекрестного произведения упростится до простого произведения полученных скаляров. Вашу обновленную версию, приведенную выше, можно считать упрощенной (и красиво симметричной!) Версией этого: уменьшив проблему до сравнения знаков результирующих скаляров, вы можете определить, что ориентация исходного треугольника избыточна. - person comingstorm; 26.02.2010
comment
@comingstorm - 2D не обязательно означает в плоскости xy. Я достаточно хорошо разбираюсь в векторах, чтобы понимать, о каком конкретном случае вы говорите, но в исходном вопросе нет ничего, что объясняет это ограничение. Приведенный обновленный ответ является правильным общим ответом. Несмотря на то, что ваш ответ был принят, в общем случае он неверен. - person duffymo; 27.02.2010
comment
Эй, во-первых, это не мой ответ; во-вторых, это действительно так. OQ был специально посвящен 2D-векторам: ответ, сформулированный в терминах 3D-векторов, не содержал бы смысла и, следовательно, был бы неверным. Кроме того, если вы взглянете на ссылку в OQ, вы заметите, что его обновление, которое вы отметили для возврата логического значения, является (правильной) реализацией его заявленной цели - алгоритма точки в треугольнике, реализованного для 2D векторы. - person comingstorm; 02.03.2010

Совместный продукт Mathworld

person High Performance Mark    schedule 25.02.2010