2013-02-24 72 views
1

我很困惑,我想檢查一個點是否位於線段上。 我谷歌它,但我收到基本上兩個不同的答案。檢查點是否位於線段上

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

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

什麼是正確的答案?我希望這個算法(用C語言比較好)適用於幾何應用,比如postgis。

+3

對同一問題有兩個不同的答案並不意味着這是一個錯誤。 – Mat 2013-02-24 17:08:50

+0

從我看到的他們使用兩個不同的線段表示。一次**開始**和**結束**座標(C算法)。有一次**開始**和**方向/長度**矢量(維基百科)。 – Aufziehvogel 2013-02-24 17:11:11

+0

但是有什麼區別?當我使用維基百科解決方案和另一個? – 2013-02-24 17:12:04

回答

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 

那麼你就必須檢查邊框爲它(找到最大的x,y,最小的x,y)

中當然,這些方法並不完美(http://xkcd.com/217/),但對於大多數實際應用而言,它們將保持足夠的真實性。如果你真的需要確切的數字,我會建議使用Wolfram Alpha(我聽說有一些API或其他)或者只是寫自己的確切數字庫。

+1

謝謝,我現在明白了。 =) – 2013-02-24 17:53:53

+0

+1對於xkcd。 :) – Alec 2013-12-12 05:36:31

1

兩者都對。

只要記住,Turbo C是非常古老的,現在超出標準。 void main()例如不應該使用(它是int main()來代替)

也不要在C中使用浮點比較(==),因爲浮點數是不精確的,這就是爲什麼Turbo C代碼有< 0.001 %%> 0.001樣式。

2

在繼續之前,知道您是否只是以某種方式顯示該線的圖形表示,或者實際上是否具有創建該線的公式,會有所幫助。既然你說「線」而不是「飛機」,我認爲我們正在談論一條2D線。

如果你有這條線的公式,那麼答案很簡單,將點x,y值代入公式中,如果公式有效,那麼點就在線上。

例如,如果線路爲y = 2X + 1.5和您的點是(1,1)

1 = 1(1)+ 1.5 1 = 3.5是假的,所以點不躺在線上

無論變量的數量或行的形式如何,2D或3D中的任何直線公式都是相同的。

X + 2Y = 0 1.5倍+ 12Y - 4Z = 84

在您所使用,並且如果等式兩邊相等則該點是在該行上點只要彈出(或平面)。

如果你正在尋找一個圖形解決方案,比如有一個路線圖的位圖或類似的東西,並想知道某人點擊的地方是否「在路上」,那麼這是一個完全不同的地方問題。