gpt4 book ai didi

python - 对于某些角度的线,我对 Bresenham 算法的实现失败

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:35 28 4
gpt4 key购买 nike

我已经用 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) 在显示屏的左上角。

我的测试框架非常简单。它是一个独立的函数,所以我只传递两点给它:

origin = (416, 384)
dest = (440, 347)
bresenham(origin, dest)
(416, 384)
(440, 347)
x0 = 384
x1 = 347
y0 = 416
y1 = 440
[]

最佳答案

我不知道您为什么要使用 xstep 变量。您真的不需要使用您正在使用的算法。

@Gabe: xstep is needed because without it, if x0 > x1, then the for loop will terminate immediately, as the default step for a Python for loop is 1.

你不需要 xstep 变量的原因是,如果它向后移动,坐标已经被切换(在开头的 if backward: 条件中)所以终点现在是起点,反之亦然,这样我们现在仍然从左到右。

你只需要这个:

result = []

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

return result

如果你想要坐标列表从开始到结束的顺序,那么你可以在最后做检查:

if backward: return result.reverse()
else: return result

编辑:问题是 backward bool 值它需要被求值之前被求值。如果 steep 条件执行,那么值会改变,但到那时你的 backward 条件是不同的。要解决这个问题,不要使用 backward bool 值,而是将其设为显式表达式:

if x0 > x1:
# swapping here

再一次,因为你稍后会使用 bool 值,你可以在条件之前定义它:

backward = x0 > x1

if backward:

关于python - 对于某些角度的线,我对 Bresenham 算法的实现失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713821/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com