2011-05-12 33 views
3

非常簡單的問題。 如何用Java中繪製的線實現碰撞檢測?只是線條。沒有矩形,圓圈或圖像,位圖..只是線條。java中2行碰撞檢測(Android)

順便說一句,這些線不直。它們是由代表玩家運動的數百條非常小的線條(他們在移動時的gps座標)構成的,所以隨着玩家的移動,它們在整個地方流連。所有線都連接在一起。一行的結束點是下一行的開始點等等。在這方面這是一條不間斷的路線。沒有差距。

我試着在數組中存儲行的開始點的x,y值,然後遍歷這個數組來確定點是否曾經被訪問過。如果玩家再次訪問確切的座標,這很好,但是如果他在這些記錄點之間的中間位置呢?

這是問題的背景,如果有幫助。但主要問題是我的焦點在這裏。 如何實現Java中線條的碰撞檢測?

+0

[本維基百科文章](http://en.wikipedia.org/wiki/Line_segment_intersection)可能會有用。 – 2011-05-12 12:17:24

回答

0

從我所知道的你正在以正確的方式做到這一點。我會建議可能通過座標位置散列線,所以有更少的線檢查。如果估計較大的直線(由平均較小的線組成)並用於檢查,您也可以減少檢查次數。

0

如果我理解正確,你的問題不是嚴格的線交集(它可以很容易地在網上找到),但如何處理它們的數百個?

也許你應該考慮數據的空間結構來限制計算。例如,請看「quadtree」。

您只會在所有座標的子集上測試交點。

0

你稱之爲一條線,你可以稱之爲List<Line2D>--直線段的列表。如果你有List<Line2D> aList<Line2D> b,那麼你想比較a中的每一行和b中的每一行。我假設你可以看到如何找到兩條直線段的交叉點 - 或者Line2D甚至可以是do this for you。例如:

for(Line2D line1 : a) { 
    for(Line2D line2 : b) { 
     if(a.intersectsLine(b)) { 
     return true; 
     } 
    } 
} 
return false; 

現在這段代碼不會很快,但速度可能會很快。如果速度太慢,那麼你將不得不尋找優化 - 這可以通過多種方式完成,四叉樹或一維排序是兩個明顯的簡單步驟。

+0

不需要很快。想想我會看看四樹的方法,就像Rockeye一樣,儘管如此,你自己也有建議。 – Finn 2011-05-12 14:27:04

+0

我只是看着Line2D類..似乎不是Android兼容。抱歉。我有點小菜。我只有java.awt.font。*; java.awt中沒有其他內容。我通過在eclipse中編寫import語句發現了這一點,並讓自動完成功能向我顯示可以導入哪些類。我在eclipse中運行android,以防萬一。 – Finn 2011-05-12 17:09:31

+0

對不起,我不應該發佈它作爲一個Java問題。這是android。 – Finn 2011-05-12 17:22:46