2010-07-21 51 views
18

我正試圖在二維網格上實現視線算法。我知道它是如何在概念上工作的,但我想不出如何將它作爲一種算法來實現。如何找到一條線上的所有網格?

基本想法很簡單。在僞代碼:

function LineOfSight(point1, point2): boolean 
    squares = GetListOfSquaresOnLine(point1, point2) 
    for each square in squares 
    if square.IsOpaque then return false 
    return true 

GetListOfSquaresOnLine會(概念)畫從方格的在點1的中心以點2的方格的中心的直線,並返回該線穿過所有的方塊的列表。但這是我不知道如何實現的部分。有人知道怎麼做嗎? Delphi或C示例是首選,但不是必需的。

回答

27

的答案都這麼遠點就Bresenhams的算法維基百科文章。以下是該文章給出的圖片,全尺寸。注意這條線穿過沒有突出顯示的網格,所以Bresenham的算法只給出你想要的一個子集。

alt text

既然你提到的「視線」,這聽起來像你想的是枚舉所有的線穿過方格的算法。這個集合有時被稱爲超級封面(行),並且one algorithm is described here

還有一些其他的方法,在this question的答案給出。

更新:Here's another reference

+1

謝謝!超級套路線比基本的Bresenham套路更合適。切換到接受的響應。 – 2010-07-22 00:26:08

+0

此圖像有正方形,但不突出顯示。爲什麼是這樣? ---編輯:我現在明白了。這裏有一個鏈接,修改算法以獲得http://eugen.dedu.free.fr/projects/bresenham/的超級覆蓋。 – byxor 2017-05-29 11:21:29

7

是不是Bresenham's Algorithm你在找什麼?

+0

謝謝。我以前沒聽說過,但看起來就像我在找什麼。 – 2010-07-21 21:32:21

5
+7

不知道我應該upvote還是downvote – 2013-05-07 20:32:34

+0

你。是一個邪惡的人。你會收到upvote只是因爲它很有趣:-) – rhbvkleef 2017-07-19 18:39:39

相關問題