Как вычислить перекрестный продукт? - PullRequest
6 голосов
/ 28 марта 2010

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

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

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

Ответы [ 5 ]

6 голосов
/ 28 марта 2010

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

4 голосов
/ 28 марта 2010

Если вы спрашиваете, является ли угол между 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
2 голосов
/ 28 марта 2010

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

Скрещенное произведение является вектором, у него нет знака "."

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

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

1 голос
/ 28 марта 2010

Из прочитанного вопроса, который вы связали, кажется, что вам нужен знак 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...