我有以下伪C / Java / C#代码:
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
如何计算跨产品ABxAC?
答案 0 :(得分: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])
这是一个标量,该标量的符号会告诉你,向量ab左侧或右侧的点位于
或者,您可以查看stack overflow或gamedev
答案 1 :(得分:4)
假设您是否询问 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 :(得分:2)
cross product是一个向量,它没有“符号”。
你的意思是scalar (dot) product吗?如果你这样做,则计算一对矢量[a,b,c]•[d,e,f]为ad + be + cf,因此该表达式的符号是点积的符号。
在不进行乘法和加法的情况下找出符号可能并不比仅仅执行它们更快。
答案 3 :(得分: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 dot AC = -180 -240 + 0 = -420。
答案 4 :(得分:1)
通过阅读您链接的问题,您似乎想要交叉积的z分量的符号(假设AB和AC为0 z值);指示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