Well the Bresenham's algorithm is not more eficient than the usual
diferencial method in today's computers (I wrote both in python for a test
of pyopengl and consume much more time in drawing 5000 lines bresenham than
diferential, yes, I know, it shouldn't ocurr, and I think that it should be
faster than beziers looking at its amount of multiplication an divisions).
I reach to this conclusion: (I asumme that I can be wrong, and if I am I
would like to know the truth)
Difference between diferential and bresenham methods came from that
diferential use floats and bresenham ints but bresenham does more
comparations so, on today's computers (with procesors of, at least, 32 bits)
the float calculation is much more efficient than when bresenham wrotes it's
line algorithm
Diferential algorithm its, also, much more understable. I will paste both I
did
def lineDDA(xo, yo, xf, yf):
dx = xf - xo
dy = yf - yo
Ax = 0.0 # Increments of x and y
Ay = 0.0
x = xo
y = yo
steps = max(abs(dx), abs(dy))
steps = max(steps,1) # for te case of initial = final
Ax = float(dx) / steps
Ay = float(dy) / steps
glBegin(GL_POINTS) # Start using openGL
glColor3f(0.0,1.0,0.0) # set default color to green
glVertex2f(x, y) # draw a point at xo, yo
for k in range (0, steps):
x += Ax # calculate next point (it a float)
y += Ay
glVertex2f(x, y)# draw the point (rounded to pixels)
glEnd()
def lineBresenham(x0, y0, x1, y1):
if abs(y1 - y0) > abs(x1 - x0):
steep = True
else:
steep = False
if steep:
x0, y0 = y0, x0
x1, y1 = y1, x1
# Must go from left to rigth
if x0 > x1:
x0, x1 = x1, x0
y0, y1 = y1, y0
deltax = x1 - x0
deltay = abs(y1 - y0) * 2
error = deltax
DobleDeltax = deltax * 2
y = y0
if y0 < y1:
ystep = 1
else:
ystep = -1
glBegin(GL_POINTS)
glColor3f(1.0,0.0,0.0)
for x in range(x0,x1+1):
# Si hemos cambiado x por y debemos deshacer el cambio a la hora de
pintar
if steep:
glVertex2f(y, x) # I know, it draws a point from 2 floats, but
using glVertex2i there weren't diferences in time.
else:
glVertex2f(x, y)
error = error - deltay
if error < 0:
y = y + ystep
error = error + DobleDeltax
glEnd()