У меня есть следующая часть pseudo-C/Java/C# кода:
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
Как я вычисляю векторное произведение ABxAC?
Решение, которое было дано вам в вашем последнем вопросе, в основном добавляет 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
Перекрестное произведение является вектором, у него нет «знака».
Вы имеете в виду скалярное (точечное) произведение ? Если вы это сделаете, то это вычисляется как для пары векторов [a, b, c] • [d, e, f] как ad + be + cf, поэтому знак этого выражения является знаком скалярного произведения.
Выяснить знак без умножения и сложения, вероятно, не быстрее, чем просто выполнить их.
Поскольку все три точки имеют только две компоненты, я предполагаю, что 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.
Из прочтения связанного вами вопроса кажется, что вам нужен знак 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