我很困惑,我想檢查一個點是否位於線段上。 我谷歌它,但我收到基本上兩個不同的答案。檢查點是否位於線段上
http://en.wikipedia.org/wiki/Line_segment
和
http://www.softwareandfinance.com/Turbo_C/Check_Point_Lies_line_Segment.html
什麼是正確的答案?我希望這個算法(用C語言比較好)適用於幾何應用,比如postgis。
我很困惑,我想檢查一個點是否位於線段上。 我谷歌它,但我收到基本上兩個不同的答案。檢查點是否位於線段上
http://en.wikipedia.org/wiki/Line_segment
和
http://www.softwareandfinance.com/Turbo_C/Check_Point_Lies_line_Segment.html
什麼是正確的答案?我希望這個算法(用C語言比較好)適用於幾何應用,比如postgis。
浮點運算無法存儲您想要的每個數字。在某一點上,它必須近似。現在,我猜,你從維基百科獲得了算法告訴你:
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或其他)或者只是寫自己的確切數字庫。
謝謝,我現在明白了。 =) – 2013-02-24 17:53:53
+1對於xkcd。 :) – Alec 2013-12-12 05:36:31
兩者都對。
只要記住,Turbo C是非常古老的,現在超出標準。 void main()例如不應該使用(它是int main()來代替)
也不要在C中使用浮點比較(==),因爲浮點數是不精確的,這就是爲什麼Turbo C代碼有< 0.001 %%> 0.001樣式。
在繼續之前,知道您是否只是以某種方式顯示該線的圖形表示,或者實際上是否具有創建該線的公式,會有所幫助。既然你說「線」而不是「飛機」,我認爲我們正在談論一條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
在您所使用,並且如果等式兩邊相等則該點是在該行上點只要彈出(或平面)。
如果你正在尋找一個圖形解決方案,比如有一個路線圖的位圖或類似的東西,並想知道某人點擊的地方是否「在路上」,那麼這是一個完全不同的地方問題。
對同一問題有兩個不同的答案並不意味着這是一個錯誤。 – Mat 2013-02-24 17:08:50
從我看到的他們使用兩個不同的線段表示。一次**開始**和**結束**座標(C算法)。有一次**開始**和**方向/長度**矢量(維基百科)。 – Aufziehvogel 2013-02-24 17:11:11
但是有什麼區別?當我使用維基百科解決方案和另一個? – 2013-02-24 17:12:04