其实我找到了这个公式,但我不知道它是如何工作的.
设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
Run Code Online (Sandbox Code Playgroud)
如果有人解释它是如何工作的,我会很高兴的.
我们分三点来说:
考虑一下我们将按顺序遍历它们P -> Q -> R。我们必须确定我们的遍历是顺时针、逆时针还是所有三个点都在同一条线上。
众所周知,向量的叉积可用于计算它们在 3D 空间中的方向(https://math.stackexchange.com/questions/285346/why-does-cross-product-tell-us-about-clocking -或逆时针旋转)。我们可以使用这个属性通过将我们的点和相应的向量扩展到 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,
所以这些点在同一条线上。
希望这可以帮助!