2011-09-21 171 views
0

假設你有一個矩形,左下角的點0,0和右上角的點是100,100。 現在兩條線相交矩形。我必須找出交點的座標。我已經做到了。現在的問題是我不知道它是否在矩形內。我用雙重比較。但我認爲這是給我錯誤的答案。假設交點是(x,y)。我用這種檢查進行比較:如果(X> = 0.0 & & X < = 100.0 & & Y> = 0.0 & &Ŷ< = 100.0)。我該怎麼辦?C++浮點比較

//this function generates line 
line genline(int x1 , int y1 , int x2 , int y2){ 
    line l ; 
    l.A = y2 - y1 ; 
    l.B = x1 - x2 ; 
    l.C = l.A * x1 + l.B * y1 ; 
    return l ; 
} 
//this function checks intersection 
bool intersect(line m ,line n) { 
    int det = m.A * n.B - m.B * n.A ; 
    if(det == 0){ 
     return false ; 
    } 
    else { 
     double x = (n.B * m.C - m.B * n.C)/(det * 1.0) ; 
     double y = (m.A * n.C - n.A * m.C)/(det * 1.0) ;   
     if(x >= 0.0 && x <= L && y >= 0.0 && y <= W) { return true ; } 
     else{ return false ; } 
    } 
} 

編輯: 這兩個線被拉伸到無限。

+0

你確定你的交點計算是正確的嗎?我們可以看到更多的代碼嗎? – quasiverse

+0

你的矩形測試很好。請描述你爲什麼認爲失敗。請給出一個x,y值的例子,你的測試失敗了,你覺得它不應該。 –

+0

「但我認爲這是給我錯誤的答案」不夠好。你需要描述它在你眼中的失敗。讓我們猜測是不好的。 –

回答

1

你的數學看起來是對的。順便說一下,如果一條線與某個東西相交,它總是在某個東西的內部。

+1

這應該是一個評論,而不是一個答案。 – quasiverse

+0

如果交點的y是99.999999,會發生什麼情況......編譯器會將其舍入嗎? – PEIN

+0

它沒有指出OP說他有什麼問題。 – quasiverse

0

檢查點是否在矩形內相對容易。然而,挑戰在於找到兩條線段之間的交點。這個問題有很多角落案例,浮點數的精確度有限在這裏發揮了巨大的作用。

你的算法似乎過於簡單。有關此主題的更深入討論,您可以查看thisthis。這兩部分文章研究了使用浮點數尋找兩條線的交點的問題。請注意,它們是關於MATLAB而不是C++的,儘管這不會改變問題,並且算法很容易翻譯成任何語言。

根據應用程序的不同,即使使用巧妙的技巧,浮點表示也可能不會簡單地將其切割爲幾何幾何問題。 CGAL是一個致力於計算幾何處理這些類問題的C++庫。必要時使用任意的精確算術來處理退化情況。

+0

僅僅因爲它看起來過於簡單並不意味着它不正確:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry2 – quasiverse

+0

@quasiverse我在博客中包含了兩個鏈接,詳細討論了這個問題。快速查看錶明OP的算法不考慮很多情況。它基本上是將數學轉化爲代碼而不考慮浮點表示的數值問題。所以是的,我確實看到了一個問題。不幸的是,您提供的鏈接不處理問題並且不完整。 – AlefSin

+0

查看鏈接,其中一半似乎是圖片,而相當多的代碼似乎是「情節(plot)」,但除此之外,重點是代碼*是*正確的,更一般的說,事情不必複雜纔是正確的。 – quasiverse

0

當你處理浮點(或雙精度)時,測試相等性是天真的,在邊緣情況下會失敗。你所做的每一個比較都應該參考「epsilon」,這個數量非常小,無關緊要。如果兩個數字在彼此的ε內,那麼它們被認爲是相等的。

,而不是例如, 「如果(A == B)」,您需要:

bool isEqual(double a, double b, double epsilon = 1.E-10) 
{ return fabs(a - b) <= epsilon; 
} 

選擇取決於你的問題域小量一個合適的值。