我有以下伪 C/Java/C# 代码:
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
如何计算叉积 ABxAC?
我有以下伪 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 的左侧或右侧
假设您要询问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 方向还是负 z 方向,计算会告诉你这一点。
在您的情况下,这两个向量是 AB = (10, 30, 0) 和 AC = (-18, -8, 0)。如果我取这两者的叉积,我得到向量 AB X AC = (0, 0, 460)。你的意思是说这有一个正号,因为 z 分量是正的?如果是,这就是你的答案。
更新:如果它是你想要的标量产品,在这种情况下它是负数:
AB 点 AC = -180 -240 + 0 = -420。
通过阅读您链接的问题,您似乎想要叉积的 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