Bresenham 3D

En este enlace encontrarás un algoritmo de Bresenham 3D más optimizado: http://members.chello.at/~easyfilter/bresenham.html los que presento aquí son antiguos.

El código fuente que está al final de esta página es el algoritmo de Bresenham para 3 dimensiones. Verás que tiene un código fuente un poco largo porque contiene tres "If..Then" y dentro de cada "If..Then" un "For..Next". Depende de los valores de entrada para que se determine por uno de los tres "If..Then"; esto significa que sólo se ejecuta una parte del programa. Teniendo en cuenta esto y que Bresenham sólo usa sumas y restas, el tiempo de ejecución es mínimo.

Cuando lo ejecutes verás en el monitor los resultados de los números que se van sucediendo uno a uno. Los números que arroja forman parte de las coordenadas XYZ para trazar la trayectoria de una línea recta en las tres dimensiones del espacio. El programa es de propósito general; sólo tendrás que hacer unas pequeñas modificaciones para adaptarlo a tus necesidades. Podrás tomar los resultados que te vaya dando el algoritmo para hacer traslaciones gráficas o posicionar un dispositivo mecánico en el mundo real.

Cuando hagas las primeras pruebas trata de usar valores pequeños para que puedas ver los resultados cómodamente, como en la imagen de arriba. Podrás comprobar que puedes usar número enteros positivos y negativos. Has de introducir las tres coordenadas (X,Y,Z) separadas por comas y después pulsar 'Enter'.

(Si usas antivirus Avast has de añadir una exclusión para poder ejecutarlo. Para analizar este o cualquier otro archivo puedes hacer clic aquí)

Este es el programa:

Código fuente escrito en FreeBasic, compatible con Qbasic.The translation could modify the code. Use the code without translating or download the program clicking image above.

Dim As Integer Cont, dx, dy, dz, Adx, Ady, Adz, x_inc, y_inc, z_inc,_

err_1, err_2, dx2, dy2, dz2, xxx, yyy, zzz, Xold, Yold, Zold,_

Xnew, Ynew, Znew

While (1)

Input "X: ", Xnew

Input "Y: ", Ynew

Input "Z: ", Znew

xxx=Xold

yyy=Yold

zzz=Zold

dx = xnew - Xold

dy = ynew - Yold

dz = znew - Zold

If (dx < 0) Then

x_inc = -1

Else

x_inc = 1

EndIf

If (dy < 0) Then

y_inc = -1

Else

y_inc = 1

EndIf

If (dz < 0) Then

z_inc = -1

Else

z_inc = 1

EndIf

Adx = Abs(dx)

Ady = Abs(dy)

Adz = Abs(dz)

dx2 = Adx*2

dy2 = Ady*2

dz2 = Adz*2

If ((Adx>= Ady) And (Adx>= Adz)) Then

err_1 = dy2 - Adx

err_2 = dz2 - Adx

For Cont = 0 To Adx-1

If (err_1 > 0) Then

yyy += y_inc

err_1 -= dx2

EndIf

If (err_2 > 0) Then

zzz += z_inc

err_2 -= dx2

EndIf

err_1 += dy2

err_2 += dz2

xxx += x_inc

print xxx, yyy, zzz

Next

EndIf

If ((Ady> Adx) And (Ady>= Adz)) Then

err_1 = dx2 - Ady

err_2 = dz2 - Ady

For Cont = 0 To Ady-1

If (err_1 > 0) Then

xxx += x_inc

err_1 -= dy2

EndIf

If (err_2 > 0) Then

zzz += z_inc

err_2 -= dy2

EndIf

err_1 += dx2

err_2 += dz2

yyy += y_inc

print xxx, yyy, zzz

Next

EndIf

If ((Adz> Adx) And (Adz> Ady)) Then

err_1 = dy2 - Adz

err_2 = dx2 - Adz

For Cont = 0 To Adz-1

If (err_1 > 0) Then

yyy += y_inc

err_1 -= dz2

EndIf

If (err_2 > 0) Then

xxx += x_inc

err_2 -= dz2

EndIf

err_1 += dy2

err_2 += dx2

zzz += z_inc

print xxx, yyy, zzz

Next

EndIf

Xold=xnew

Yold=ynew

Zold=znew

Wend

End