Bresenham有一个著名的画线算法,Wikipedia有一篇很好的文章:http://en.wikipedia.org/wiki/Bresenham's_line_algorithm。
主循环根据需要通过加1或减1来迭代计算x或y坐标。
给定起始点x1
,y1
,结束点x2
,y2
和一些y
(y1
yy2),是否可以直接计算行x
处活动像素的所有y
坐标?
例如,假设我使用标准的Bresenham方法画一条线:
oooo - y1
ooo
oooo
ooo - y
oooo - y2
| |
x1 x2
为此,我想得到一个序列。
我不确定是否有可能像上面那样修改bresenham,所以如果结果证明它是不可能的,有没有其他方法可以得到看起来完全一样的序列,如果它是由bresenham计算的?我不在乎它是快是慢,如果它使用浮动与否,只要它可以直接评估。
提前谢谢!
编辑:为了能够比较我写的一个简单的参考测试的想法:
def line(x0, y0, x1, y1):
canvas = [[u'\u25a1'] * (max(x0, x1) + 1) for y in range(max(y0, y1) + 1)]
dx = abs(x1-x0)
dy = abs(y1-y0)
if x0 < x1:
sx = 1
else:
sx = -1
if y0 < y1:
sy = 1
else:
sy = -1
err = dx-dy
while True:
canvas[y0][x0] = u'\u25a0'
if x0 == x1 and y0 == y1:
break
e2 = 2*err
if e2 > -dy:
err = err - dy
x0 = x0 + sx
if e2 < dx:
err = err + dx
y0 = y0 + sy
return '\n'.join(' '.join(r) for r in canvas)
打字:
print line(2, 1, 10, 8)
印刷品:
□ □ □ □ □ □ □ □ □ □ □
□ □ ■ □ □ □ □ □ □ □ □
□ □ □ ■ □ □ □ □ □ □ □
□ □ □ □ ■ □ □ □ □ □ □
□ □ □ □ □ ■ ■ □ □ □ □
□ □ □ □ □ □ □ ■ □ □ □
□ □ □ □ □ □ □ □ ■ □ □
□ □ □ □ □ □ □ □ □ ■ □
□ □ □ □ □ □ □ □ □ □ ■
最佳答案
好吧,Bresenham的算法很吸引人,因为它使用整数数学(它使简化假设像素位于整数x,y坐标)。
求解整数y处某行像素数的算法将执行以下操作:
count = 1
y_query = your query row
x_intercept = intercept of your line at y_query.
round x_intercept to the nearest integer.
(x_intercept, y_query) now define a pixel in the row
我们的想法是从这个坐标向左和向右移动,看看您是否还在y_query行中:
//going left
x_new = x_intercept - 1
y_new = the y intercept for the line given x_new
round y_new to the nearest integer
if (y_new == y_query), add 1 to our count of pixels in this row, else break;
对xu new=xu intercept+1执行同样的操作