如何检查三个点是否形成直线?

时间:2015-02-20 00:41:55

标签: matlab

问题:创建需要六个输入的函数mylinecheck(a,b,c,d,e,f)a,b,c,d,e,f是实数,a,c,e不相等。该函数必须检查三个点(a,b)(c,d)(e,f)是否都位于同一行。如果是,则返回1.如果不是,则返回0。

我认为我想要做的是告诉MATLAB检查坐标(c,d)(e,f)(a,b)的倍数,然后如果不是,我将返回0.如果是,我将返回1.如果这是正确的思考过程,我不确定如何命令MATLAB这样做。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

(x1,y1)(x2,y2)(x3,y3)位于同一行,当且仅当它们满足时

a x + b y + c = 0

对于abc的固定值(我无法克服你的记法;抱歉“混淆”),a或{{ 1}}非零。因此,当且仅当

时,它们才会位于同一行
b

即具有矩阵的均匀线性系统

a x1 + b y1 + c = 0         [x1 y1 1][a]   [0]
a x2 + b y2 + c = 0   <=>   [x2 y2 1][b] = [0]
a x3 + b y3 + c = 0         [x3 y3 1][c]   [0],

有一个非零解决方案。仅当 [x1 y1 1] X = [x2 y2 1] [x3 y3 1] 是单数时才可以这样做。通过删除X的最后一列,您可以发现当{且仅当矩阵

X是单数的
X

是单数。

为了在Matlab中可靠地检查矩阵的奇异性,您可以使用SVD或等效函数Y = [x2-x1 y2-y1] [x3-x1 y3-y1] 。因此,您的功能可以实现如下:

rank

答案 1 :(得分:2)

如果你想检查所有点是否都在同一行(或collinear),那么经典方法之一就是假设每个点在三角形中形成一个顶点。如果三个点使得三角形使得该面积等于0,则这些点将共线或形成线。这可以通过检查以下矩阵的行列式来完成:

[a b 1]
[c d 1]
[e f 1]

你可以在这里阅读关于Wolfram Mathworld的共线性的文章:http://mathworld.wolfram.com/Collinear.html(我也在上面链接了它)。

因此,您的功能只需要:

function [out] = mylinecheck(a,b,c,d,e,f)

    D = [a b 1; c d 1; e f 1];
    out = det(D) == 0;

然而,由于数值不精确,您可以提供浮点数,其中点确实是共线的,但是您可能得到一个不等于0的行列式(实际上,可能是一个小数字)。因此,我可以建议的一件事是检查行列式是否小于一个小数。类似的东西:

function [out] = mylinecheck(a,b,c,d,e,f)

    D = [a b 1; c d 1; e f 1];
    out = abs(det(D)) < 1e-10;

1e-10是一个小数字10^{-10}。我们将abs考虑到正面和负面的决定因素,因此您将检查共线性,如果符合以下情况则为真:

 -10^{-10} < det(D) < 10^{-10}

然而,根据Pavel的评论,如果点落在同一条线上,如果我们决定缩放坐标,则行列式值也会增加。我的一个建议是,可能会更加自由的门槛。把它做大......也许像0.1