如何在给定这些点的坐标的情况下找到二维空间中三个点的方向?

时间:2013-07-11 11:58:55

标签: math geometry

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

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

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

2 个答案:

答案 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的交叉产物为阴性。

enter image description here

答案 1 :(得分:2)

让我们有三点:

statement1

考虑我们将按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->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

所以积分在同一条线上。

希望这有帮助!