【发布时间】:2010-09-15 00:12:42
【问题描述】:
我在 Python 中编写了 Bresenham 算法的实现(遵循 Wikipedia article),除了某些角度的线条外,它可以正常工作。所有应该在 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
[]
【问题讨论】:
-
@aaa 鲤鱼:不。不过,感谢您的回答。
-
除了
if x0 > x1: xstep = -1是不必要的之外,我认为您的代码没有任何问题,因此您的问题可能出在其他地方。您需要发布实际结果,以便我们了解发生了什么。 -
@Gabe:
xstep是必需的,因为如果没有它,如果x0 > x1,那么 for 循环将立即终止,因为 Python for 循环的默认步骤是 1。除此之外,还有什么你想要什么样的结果?当它出错时,它会返回一个点列表,其中每个点都高于或低于它之前的点 (1,1)。 -
Max:请发布一些示例输入以及它们产生的错误输出。您无需检查
if x0 > x1,因为您在该行运行之前交换了x0和x1。 -
傻问:你能展示你的测试框架(我的 Python-fu 完全扭曲了)以及它工作和不工作的示例调用(这只是两行代码)。我认为数据并不重要。