其实我找到了这个公式,但我不知道它是如何工作的。
让p,q
和r
成为三点,
k=(q.y - p.y)*(r.x - q.x)-(q.x - p.x) * (r.y - q.y);
if(k==0): They are all colinear
if(k>0) : They are all clockwise
if(k<0) : They are counter clockwise
如果有人解释它是如何运作的,我会很高兴。
答案 0 :(得分:8)
此公式用于计算 q-p 和 q-r 的cross product个向量。您可以在几何含义部分中看到跨产品值的部分 C = A x B = | A | * | B | * Sin(Theta),其中Theta是这些矢量之间的角度(点对点方向)。对于平行向量,Sin(Theta)= 0,当Theta <1时,为正。 180,否则否定。
示例:
顺时针三联体ABC:AB和AC载体的杂交产物> 0 逆转三联体ACD:AC和AD的交叉产物为阴性。
答案 1 :(得分:2)
让我们有三点:
考虑我们将按P -> Q -> R
顺序遍历它们。我们必须找到我们的遍历是顺时针,逆时针还是所有三个点都在同一条线上。
众所周知,矢量的交叉积可以用来计算它们在3D空间中的方向(https://math.stackexchange.com/questions/285346/why-does-cross-product-tell-us-about-clockwise-or-anti-clockwise-rotation)。我们可以使用此属性通过将我们的点和相应的向量扩展到3D情况来计算2D空间中的遍历。因此,让我们定义与上面选择的方向相对应的向量,并将它们扩展为3D情况:
然后我们计算这些载体的叉积:
根据Z坐标的值,原始点逆时针(如果是负),顺时针(如果是正)或它们在同一条线上(如果值为0)。
您还可以回想起在物理课程中通常在小学教授的右手规则(https://en.wikipedia.org/wiki/Right-hand_rule#Cross_products),以确定向量方向。
让我们检查一下!
测试用例#1:请考虑我们有点P = (0, 0), Q = (1, 0), R = (1, 1)
。在纸上绘制它们绘制箭头P->Q
和Q->R
。你会看到我们逆时针穿过这些点。
从上面代入方程式,我们有:
((0 - 0) * (1 - 1) - (1 - 0) * (1 - 0)) = -2 < 0
,
所以这些点是逆时针方向的。
测试案例#2:让我们使用P = (0, 0), Q = (1, 0), R = (1, -1)
进行测试。显然,我们顺时针遍历这些点。
从上面代入方程式,我们有:
((0 - 0) * (1 - 1) - (1 - 0) * (-1 - 0)) = 2 > 0
,
所以这些点是顺时针方向的。
测试案例#3:最后,让我们使用P = (0, 0), Q = (1, 0), R = (2, 0)
进行测试。积分位于同一行y = 0
。
从上面代入方程式,我们有:
((0 - 0) * (2 - 1) - (1 - 0) * (0 - 0)) = 0 == 0
,
所以积分在同一条线上。
希望这有帮助!