检查点是否位于线段上

时间:2013-02-24 17:06:08

标签: c geometry computational-geometry postgis

我很困惑,我想检查一个点是否在一个线段上。 我谷歌它,但我基本上收到两个不同的答案。

http://en.wikipedia.org/wiki/Line_segment

http://www.softwareandfinance.com/Turbo_C/Check_Point_Lies_line_Segment.html

答案是正确的?我希望这个算法(用C语言更好)用于几何应用程序,比如postgis。

3 个答案:

答案 0 :(得分:8)

浮点运算不能存储您想要的每个数字。在某些时候,它必须近似。现在,我猜,你从维基百科得到的算法告诉你:

y=mx+b

您知道m,您知道b,现在插入并确保方程式成立。非常适合数学。 (平方根2)的平方等于4的平方根。

但现在想象你在电脑上做到了。 4的平方根将完全为2,因为计算机非常适合保存小整数。但是,你的右手边,2的平方根,将会有点偏离。你不得不切断它的一些数字,所以当你平方时,它可能是1.999998或类似的东西。为了适应这种情况,您需要检查y is approx. mx+b,所以:

tolerance = .01
x,y
rhs = m*x + b //right hand side
dif = abs(rhs - y)
if dif < tolerance //the point is approximately on the segment

然后你必须检查它的边界框(找到max x,y,min x,y)

当然,这些方法并不完美(http://xkcd.com/217/),但对于大多数实际应用来说,它们都足够真实。如果您真的需要确切的数字,我建议使用Wolfram Alpha(我听说有一些API或其他东西)或只是编写自己的确切数字库。

答案 1 :(得分:2)

在继续操作之前,了解一下你是否只是以某种方式拥有该行的图形表示或者如果你实际拥有创建该行的公式将会很有帮助。既然你说的是“线”而不是“平面”,我认为我们正在谈论的是2D线。

如果您有该行的公式,那么答案很简单,将点x,y值替换为公式,如果公式有效,则该点就在该行上。

例如,如果行是y = 2x + 1.5而你的点是(1,1)

1 = 1(1)+ 1.5 1 = 3.5为假,因此该点不在线

同样适用于2D或3D中的任何线公式,无论变量的数量或线的形式如何。

x + 2y = 0 1.5x + 12y - 4z = 84

只需弹出您正在使用的点,如果等式的两边相等,则该点位于线(或平面)上。

如果您正在寻找图形解决方案,例如拥有路线图的位图或类似的东西,并想知道某人点击的位置是“在路上”,那么这是一个完全不同的问题

答案 2 :(得分:1)

两者都是对的。

请记住,Turbo C非常老旧,现在已超出标准。例如,不应使用void main()(而是使用int main())

也不要在C中的浮点中使用比较(==),因为浮点不精确,这就是Turbo C代码具有&lt; 0.001 %%> 0.001风格。