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

У меня есть следующая часть pseudo-C/Java/C# кода:

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

Как я вычисляю векторное произведение ABxAC?

6
задан SyntaxT3rr0r 28 March 2010 в 14:59
поделиться

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

6
ответ дан 8 December 2019 в 16:00
поделиться

Если вы спрашиваете, является ли угол между 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
4
ответ дан 8 December 2019 в 16:00
поделиться

Перекрестное произведение является вектором, у него нет «знака».

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

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

2
ответ дан 8 December 2019 в 16:00
поделиться

Поскольку все три точки имеют только две компоненты, я предполагаю, что 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.

2
ответ дан 8 December 2019 в 16:00
поделиться

Из прочтения связанного вами вопроса кажется, что вам нужен знак z-компонента перекрестного произведения (при условии, что z-значение 0 для 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
1
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: