2011-05-04 31 views
0

我需要找到所有點在一條線上。我試圖布氏算法,但它不會在以下情況下工作:劃線所有點

(0, 0) 
.-----------+-----------+-----------. 
|...........|   |   | 
|...........|   |   | 
|.....XXXX..|   |   | 
|........XXXX   |   | 
|...........XXXXX  |   | 
+-----------+---XXXX----+-----------+ 
|   |......XXXXX|...........| 
|   |..........XXXX.........| 
|   |...........|.XXXXX.....| 
|   |...........|...........| 
|   |...........|...........| 
`-----------+-----------+-----------´ 
           (2, 1) 

X是實際線路,.是什麼布氏算法的回報,注意線橫穿(1, 0)但不顯着。
我怎樣才能找到一條線經過有效的所有像素?我不需要這個反鋸齒,所以我認爲吳的算法是一個矯枉過正。線端點位於像素的中間。

要引用的算法我是:

int dx = System.Math.Abs(x0 - x1); 
int dy = System.Math.Abs(y0 - y1); 

int sx = x0 < x1 ? 1 : -1; 
int sy = y0 < y1 ? 1 : -1; 

int err = dx - dy; 

int lx = x0; 
int ly = y0; 

for(int i = 0; true; i++) 
{ 
    Mark(x0, y0); 

    if(x0 == x1 && y0 == y1) 
     break; 

    int e2 = err * 2; 
    if(e2 > -dy) 
    { 
     err -= dy; 
     x0 += sx; 
    } 
    if(e2 < dx) 
    { 
     err += dx; 
     y0 += sy; 
    } 
} 

回答

1

那麼,就實現明顯的簡單算法:從線的一端開始,找到開始方塊它穿過的哪一側,跳轉到相應的相鄰的廣場......等等。走到你到達終點廣場。

以整數實現它的最簡單的方法是切換到超像素精度:只需乘以一個常數因子即可。困難的部分從你發現你沒有足夠的整數範圍來充分擴展時開始......我不知道你的情況是否屬於這種情況。

+0

我怎麼知道我是否需要下去或者對嗎? – Dani 2011-05-04 15:43:55

+0

使用起點,線的斜率和每個「單元格」的大小,可以找到該線將首先跨越哪一側。 – Tipx 2011-05-04 16:37:10