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

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

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

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

5 ответов

Решение

Решение, которое было дано вам в вашем последнем вопросе, в основном добавляет 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

Предполагая, что вы спрашиваете, острый или тупой угол между 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

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

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

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

ОБНОВЛЕНИЕ: Если вы хотите получить скалярный продукт, в данном случае он отрицательный:

AB точка AC = -180 -240 + 0 = -420.

Кросс-произведение - это вектор, у него нет "знака".

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

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

Из прочитанного вопроса, который вы связали, кажется, что вы хотите получить знак z-компонента кросс-произведения (предполагая, что значение z для AB и AC равно 0); указать, с какой стороны линии 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
Другие вопросы по тегам