7

我有以下伪 C/Java/C# 代码:

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

如何计算叉积 ABxAC?

4

5 回答 5

6

在上一个问题中提供给您的解决方案基本上为您的所有点添加了 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

于 2010-03-28T14:09:25.000 回答
4

假设您要询问ABAC之间的角度是锐角还是钝角,您需要这样:

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
于 2010-03-28T14:23:33.977 回答
2

是一个向量,它没有“符号”。

你的意思是标量(点)产品吗?如果你这样做了,那么对于一对向量 [a,b,c]•[d,e,f] 计算为 ad + be + cf,因此该表达式的符号是点积的符号。

在不做乘法和加法的情况下找出符号可能并不比只做它们快。

于 2010-03-28T13:19:25.380 回答
2

由于所有三个点都只有两个分量,因此我假设所有三个点的 z 分量都为零。这意味着向量 AB 和 BC 在 xy 平面内,因此叉积是指向 z 方向的向量,其 x 和 y 分量均为零。

如果用“符号”表示它是指向正 z 方向还是负 z 方向,计算会告诉你这一点。

在您的情况下,这两个向量是 AB = (10, 30, 0) 和 AC = (-18, -8, 0)。如果我取这两者的叉积,我得到向量 AB X AC = (0, 0, 460)。你的意思是说这有一个正号,因为 z 分量是正的?如果是,这就是你的答案。

更新:如果它是你想要的标量产品,在这种情况下它是负数:

AB 点 AC = -180 -240 + 0 = -420。

于 2010-03-28T13:31:27.500 回答
1

通过阅读您链接的问题,您似乎想要叉积的 z 分量的符号(假设 AB 和 AC 的 z 值为 0);来表示 C 点在 AB 线的哪一侧。
假设是这种情况,您所需要的只是矩阵行列式的符号,其中 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
于 2010-03-28T13:33:15.953 回答