Я написал реализацию алгоритма Брезенхэма на Python (следуя статье в Википедии), и работает корректно кроме линий под определенными углами. Все линии, которые должны простираться между 45 и 90 градусами или между 135 и 270 градусами, вместо этого будут проходить вдоль линии y = x.
Вот мой код:
def bresenham(origin, dest):
# debug code
print origin
print dest
# end debug code
x0 = origin[0]; y0 = origin[1]
x1 = dest[0]; y1 = dest[1]
steep = abs(y1 - y0) > abs(x1 - x0)
backward = x0 > x1
if steep:
x0, y0 = y0, x0
x1, y1 = y1, x1
if backward:
x0, x1 = x1, x0
y0, y1 = y1, y0
dx = x1 - x0
dy = abs(y1 - y0)
error = dx / 2
y = y0
if y0 < y1: ystep = 1
else: ystep = -1
result = []
#if x0 > x1: xstep = -1
#else: xstep = 1
# debug code
print "x0 = %d" % (x0)
print "x1 = %d" % (x1)
print "y0 = %d" % (y0)
print "y1 = %d" % (y1)
for x in range(x0, x1):
if steep: result.append((y,x))
else: result.append((x,y))
error -= dy
if error < 0:
y += ystep
error += dx
# ensure the line extends from the starting point to the destination
# and not vice-versa
if backward: result.reverse()
print result
return result
Кто-нибудь видит, что я лажаю?
РЕДАКТИРОВАТЬ:
Я добавил в функцию некоторый код печати.
(0,0) находится в верхнем левом углу дисплея.
Моя тестовая среда довольно проста. Это отдельная функция, поэтому я просто передаю ей две точки:
происхождение = (416, 384)
местонахождение = (440, 347)
брезенхэм(начало, место назначения)
(416, 384)
(440, 347)
x0 = 384
x1 = 347
y0 = 416
y1 = 440
[]
if x0 > x1: xstep = -1
не нужен, я не вижу ничего плохого в вашем коде, поэтому ваша проблема, вероятно, в другом месте. Вам нужно опубликовать свои фактические результаты, чтобы мы могли видеть, что происходит. - person Gabe   schedule 15.09.2010xstep
необходим, потому что без него, еслиx0 > x1
, цикл for немедленно завершится, так как шаг по умолчанию для цикла for в Python равен 1. Помимо этого, какие результаты вы хотите? Когда что-то идет не так, он возвращает список точек, где каждая точка на (1,1) выше или ниже того, что было до нее. - person Max   schedule 15.09.2010if x0 > x1
, потому что вы меняете местамиx0
иx1
до запуска этой строки. - person Gabe   schedule 15.09.2010