2010-04-29 2 views
0

Я пытаюсь использовать алгоритм линии Брешенема для вычисления поля зрения на сетке. Код, который я использую, вычисляет строки без проблем, но у меня возникают проблемы с тем, чтобы он всегда возвращал строку, начиная от начальной точки до конечной точки. Что мне нужно сделать так, чтобы все линии вернулись бежать из (x0, y0) в (x1, y1)Изменение алгоритма линии Bresenham

def bresenham_line(self, x0, y0, x1, y1): 
steep = abs(y1 - y0) > abs(x1 - x0) 
if steep: 
    x0, y0 = y0, x0 
    x1, y1 = y1, x1 

if x0 > x1: 
    x0, x1 = x1, x0 
    y0, y1 = y1, y0 

if y0 < y1: 
    ystep = 1 
else: 
    ystep = -1 

deltax = x1 - x0 
deltay = abs(y1 - y0) 
error = -deltax/2 
y = y0 

line = []  
for x in range(x0, x1 + 1): 
    if steep: 
     line.append((y,x)) 
    else: 
     line.append((x,y)) 

    error = error + deltay 
    if error > 0: 
     y = y + ystep 
     error = error - deltax 
return line 
+0

Я хотел бы использовать xrange здесь, в качестве x0 и x1 может быть довольно далеко друг от друга. – clahey

ответ

2

Помните переключился ли x0 и x1, а затем обратный список, если вы сделали.

if x0 > x1: 
    x0, x1 = x1, x0 
    y0, y1 = y1, y0 

становится

switched = False 
if x0 > x1: 
    switched = True 
    x0, x1 = x1, x0 
    y0, y1 = y1, y0 

и в конце концов, просто добавьте:

if switched: 
    line.reverse() 
Смежные вопросы