我已經在Python中編寫了一個Bresenham算法的實現(跟在Wikipedia article之後),並且除了某些角度的線條以外,它正常工作。所有應該在45度和90度之間或者135度和270度之間延伸的線將沿着y = x線延伸。Bresenham算法的執行失敗,對於某些角度的線條
這裏是我的代碼:
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)
DEST =(440,347)
布氏(原產地,DEST)
(416,384)
(440,347)
X0 = 384
X1 = 347
Y0 = 416個
Y1 = 440
[]
@aaa鯉魚:不。不過謝謝你的回答。 – Max 2010-09-15 00:20:00
除了'如果x0> x1:xstep = -1'是不必要的,我沒有看到你的代碼有什麼問題,所以你的問題可能在其他地方。你需要發佈你的實際結果,以便我們看到發生了什麼。 – Gabe 2010-09-15 00:26:59
@Gabe:'xstep'是必需的,因爲如果沒有它,如果'x0> x1',那麼for循環將立即終止,因爲Python for循環的默認步驟是1.除此之外,你會得到什麼樣的結果想?當它出錯時,它會返回一個點數列表,其中每個點在(1,1)之上或之下。 – Max 2010-09-15 00:45:14