直接Bresenham

时间:2013-01-28 00:09:52

标签: algorithm loops graphics bresenham

这是众所周知的Bresenham绘制线条的算法,维基百科有很好的文章:http://en.wikipedia.org/wiki/Bresenham's_line_algorithm

主循环通过根据需要加1或减1来迭代计算x或y坐标。

给定起点x1y1,终点x2y2和一些yy1< = { {1}}< = y),是否可以直接计算行y2处有效像素的所有x坐标?

例如,假设我使用标准的Bresenham方法绘制一条线:

y

因此对于 oooo - y1 ooo oooo ooo - y oooo - y2 | | x1 x2 我希望获得一系列y

我不确定是否有可能如上所述修改Bresenham所以如果事实证明这是不可能的,是否还有其他方法可以获得看起来与Bresenham计算完全相同的序列?我不关心它是快还是慢,只要它可以使用浮动,只要它可以直接评估。

提前致谢!

编辑:为了能够比较我写的一个简单的参考测试的想法:

[x1+11, x1+12, x1+13]

打字:

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)

1 个答案:

答案 0 :(得分:1)

好的,所以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;

对x_new = x_intercept + 1

执行相同操作