Как вычислить кросс-продукт?

У меня есть следующий фрагмент кода псевдо-C/Java/С#:

int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};

Как вычислить кросс-продукт ABxAC?

Ответ 1

Решение, которое было дано вам в вашем последнем вопросе, в основном добавляет Z = 0 для всех ваших очков. По таким расширенным векторам вы вычисляете свой кросс-продукт. Геометрически поперечное произведение создает вектор, который ортогонален двум векторам, используемым для вычисления, поскольку оба ваших вектора лежат в плоскости XY, результат будет иметь только компонент Z. Знак этой компоненты z обозначает, что вектор смотрит вверх или вниз по плоскости XY. Этот знак зависит от AB, находящегося по часовой стрелке или против часовой стрелки друг от друга. Это, в свою очередь, означает, что знак компонента z показывает вам, если точка, на которую вы смотрите, лежит слева или справа от линии, расположенной на AB.

Итак, при поперечном произведении двух векторов A и B, являющихся вектором

AxB = (AyBz − AzBy, AzBx − AxBz, AxBy − AyBx)

когда Az и Bz равны нулю, вы остаетесь с третьим компонентом этого вектора

AxBy - AyBx

Поскольку A - вектор от точки a до b, а B - вектор от точки a до c означает

Ax = (b[x]-a[x])
Ay = (b[y]-a[y])
Bx = (c[x]-a[x])
By = (c[y]-a[y])

дает

AxBy - AyBx = (b[x]-a[x])*(c[y]-a[y])-(b[y]-a[y])*(c[x]-a[x])

который является скаляром, знак этого скаляра скажет вам, что точка c лежит слева или справа от вектора ab

Альтернативно вы можете посмотреть переполнение стека или gamedev

Ответ 2

Предполагая, вы спрашиваете, является ли угол между AB и AC острым или тупым, вы хотите это:

int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};

int ab_x = b[0] - a[0];
int ab_y = b[1] - a[1];
int ac_x = c[0] - a[0];
int ac_x = c[1] - a[1];

int dot = ab_x*ac_x + ab_y*ac_y;
boolean signABxAC = dot > 0; // pick your preferred comparison here

Ответ 3

cross product - это вектор, у него нет "знака".

Вы имеете в виду скалярный (точка) продукт? Если да, то это вычисляется так же, как для пары векторов [a, b, c] • [d, e, f] как ad + be + cf, поэтому знак этого выражения является знаком точечного произведения.

Вычисление знака без выполнения умножений и добавлений, вероятно, не быстрее, чем просто их выполнение.

Ответ 4

Поскольку все три точки имеют только два компонента, я буду считать, что z-компонента для всех трех равна нулю. Это означает, что векторы AB и BC находятся в плоскости xy, поэтому перекрестное произведение представляет собой вектор, который указывает в z-направлении, причем его компоненты x и y равны нулю.

Если по знаку вы имеете в виду, указывает ли он в положительном или отрицательном направлении z, вычисление скажет вам об этом.

В вашем случае два вектора AB = (10, 30, 0) и AC = (-18, -8, 0). Если взять перекрестное произведение этих двух, я получаю вектор AB X AC = (0, 0, 460). Вы хотите сказать, что это положительный знак, потому что z-компонента положительна? Если да, то ваш ответ.

UPDATE: если это скалярное произведение, которое вы хотите, в этом случае оно отрицательно:

AB dot AC = -180 -240 + 0 = -420.

Ответ 5

Из чтения вопроса, который вы связали, кажется, вам нужен знак z-компонента кросс-продукта (предполагая 0 z-значение для AB и AC); чтобы указать, на какой стороне линии AB лежит точка C.
Предполагая, что в этом случае все, что вам нужно, является признаком определителя матрицы с AB и AC в качестве его строк.

xAB = b[0] - a[0]
yAB = b[1] - a[1]
xAC = c[0] - a[0]
yAC = c[1] - a[1]
detABxAC = (xAB * yAC) - (yAB * xAC)
if (detABxAC < 0) 
  // sign is negative
elif (detABxAC > 0) 
  // sign is positive
else 
  // sign is 0, i.e. C is collinear with A, B