其实我找到了这个公式,但我不知道它是如何工作的。
让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
如果有人解释它是如何工作的,我会很高兴。
该公式用于计算向量qp和qr的叉积。您可以在几何意义部分看到叉积值 C = A x B = |A|*|B|*Sin(Theta),其中 Theta 是这些向量之间的角度(点对点方向)。Sin(Theta) = 0 对于平行向量,当 Theta < 180 时为正,否则为负。
例子:
顺时针三元组 ABC:AB 和 AC 向量的叉积 > 0
逆时针三元组 ACD:AC 和 AD 的叉积为负。
让我们分三点:
考虑我们将按顺序遍历它们P -> Q -> R
。我们必须找出我们的遍历是顺时针、逆时针还是所有三个点都在同一条线上。
众所周知,向量的叉积可用于计算它们在 3D 空间中的方向(https://math.stackexchange.com/questions/285346/why-does-cross-product-tell-us-about-顺时针- 或 - 逆时针旋转)。我们可以使用这个属性通过将我们的点和对应的向量扩展到 3D 情况来计算 2D 空间中的遍历。因此,让我们定义对应于上述方向的向量并将它们扩展到 3D 情况:
然后我们计算这些向量的叉积:
根据 Z 坐标的值,原点逆时针(如果为负)、顺时针(如果为正)或它们在同一条线上(如果值为 0)遍历。
您还可以回忆一下通常在小学物理课程中教授的右手定则 ( https://en.wikipedia.org/wiki/Right-hand_rule#Cross_products ) 以确定矢量方向。
让我们检查!
测试用例 #1:考虑我们有 points 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
,
所以这些点在同一条线上。
希望这可以帮助!
这是从两条直线之间的角度找到的。(m1-m2)/1+m1*m2。设 a,b,c,d 四个点,我们想知道 c 和 d 在 ab 线的同一侧或相反侧。如果 ab,ac 和 ab,ad 之间的夹角符号相反,则它们在相反侧,否则它们在同一侧。使用上面的方程式,我们可以得出您找到的公式。