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