Bresenham 3D

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'.


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