7

其实我找到了这个公式,但我不知道它是如何工作的。

p,qr成为三点,

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

如果有人解释它是如何工作的,我会很高兴。

4

3 回答 3

15

该公式用于计算向量qpqr的叉积。您可以在几何意义部分看到叉积值 C = A x B = |A|*|B|*Sin(Theta),其中 Theta 是这些向量之间的角度(点对点方向)。Sin(Theta) = 0 对于平行向量,当 Theta < 180 时为正,否则为负。

例子:

顺时针三元组 ABC:AB 和 AC 向量的叉积 > 0

逆时针三元组 ACD:AC 和 AD 的叉积为负。

在此处输入图像描述

于 2013-07-11T12:58:47.267 回答
6

让我们分三点:

声明1

考虑我们将按顺序遍历它们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->QQ->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,

所以这些点在同一条线上。

希望这可以帮助!

于 2018-04-10T23:09:16.430 回答
0

这是从两条直线之间的角度找到的。(m1-m2)/1+m1*m2。设 a,b,c,d 四个点,我们想知道 c 和 d 在 ab 线的同一侧或相反侧。如果 ab,ac 和 ab,ad 之间的夹角符号相反,则它们在相反侧,否则它们在同一侧。使用上面的方程式,我们可以得出您找到的公式。

于 2015-11-23T09:58:39.440 回答