Bresenham 6D

Por último un Bresenham de 6 dimensiones. Verás que tiene un código un poco largo porque contiene seis "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 seis "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.

Este algoritmo puede servirte para 2D, 3D, 4D, 5D y 6D. Las dimensiones que no uses has de dejarlas a cero o sin introducir cambios.

La imagen de arriba es el programa en ejecución, donde puedes observar la sucesión de posiciones, uno por uno, hasta completar la trayectoria.

Para bajarte directamente el algoritmo de Bresenham 6D, cliquea aquí. Si quieres un Bresenham 4D y nada más, cliquea aquí. En el interior del ZIP viene el código fuente y el programa ejecutable.


(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í) Código fuente escrito en FreeBasic, 99% compatible con QBasic.The translation could modify the code. Use the code without translating or download the program clicking image above.
Dim As Integer   d1,   d2,   d3,   d4,   d5,   d6,_
                Ad1,  Ad2,  Ad3,  Ad4,  Ad5,  Ad6,_
               inc1, inc2, inc3, inc4, inc5, inc6,_
               d1x2, d2x2, d3x2, d4x2, d5x2, d6x2,_
               dim1, dim2, dim3, dim4, dim5, dim6,_
               old1, old2, old3, old4, old5, old6,_
               new1, new2, new3, new4, new5, new6,_
               err1, err2, err3, err4, err5, Cont3               
While (1)
     
     Input "Dim1: ", New1
     Input "Dim2: ", New2
     Input "Dim3: ", New3
     Input "Dim4: ", New4
     Input "Dim5: ", New5
     Input "Dim6: ", New6
 d1 = New1 - Old1
 d2 = New2 - Old2
 d3 = New3 - Old3
 d4 = New4 - Old4
 d5 = New5 - Old5
 d6 = New6 - Old6
  
 If (d1 < 0) Then
   inc1 = -1
 Else
   inc1 =  1
 EndIf
  
 If (d2 < 0) Then
   inc2 = -1
 Else
   inc2 =  1
 EndIf
   
 If (d3 < 0) Then
   inc3 = -1
 Else
   inc3 =  1
 EndIf
  
 If (d4 < 0) Then
   inc4 = -1
 Else
   inc4 =  1
 EndIf
 If (d5 < 0) Then
   inc5 = -1
 Else
   inc5 =  1
 EndIf
  
 If (d6 < 0) Then
   inc6 = -1
 Else
   inc6 =  1
 EndIf
  
 Ad1 = Abs(d1)
 Ad2 = Abs(d2)
 Ad3 = Abs(d3)
 Ad4 = Abs(d4)
 Ad5 = Abs(d5)
 Ad6 = Abs(d6)
  
 d1x2 = Ad1*2
 d2x2 = Ad2*2
 d3x2 = Ad3*2
 d4x2 = Ad4*2
 d5x2 = Ad5*2
 d6x2 = Ad6*2
  
 If(Ad1>=Ad2)And(Ad1>=Ad3)And(Ad1>=Ad4)And(Ad1>=Ad5)And(Ad1>=Ad6) Then
   
  err1 = d2x2 - Ad1
  err2 = d3x2 - Ad1
  err3 = d4x2 - Ad1
  err4 = d5x2 - Ad1
  err5 = d6x2 - Ad1
   
  For Cont3 = 1 To Ad1
    
     If (err1 > 0) Then
         dim2+= inc2
         err1 -= d1x2
     EndIf
      
     If (err2 > 0) Then
         dim3+= inc3
         err2 -= d1x2
     EndIf
      
     If (err3 > 0) Then
         dim4+= inc4
         err3 -= d1x2
     EndIf
     If (err4 > 0) Then
         dim5+= inc5
         err4 -= d1x2
     EndIf
      
     If (err5 > 0) Then
         dim6+= inc6
         err5 -= d1x2
     EndIf
      
     err1 += d2x2
     err2 += d3x2
     err3 += d4x2
     err4 += d5x2
     err5 += d6x2
      
     dim1+= inc1
    
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
      
  Next
   
 EndIf
  
 If(Ad2>Ad1)And(Ad2>=Ad3)And(Ad2>=Ad4)And(Ad2>=Ad5)And(Ad2>=Ad6) Then
   
  err1 = d1x2 - Ad2
  err2 = d3x2 - Ad2
  err3 = d4x2 - Ad2
  err4 = d5x2 - Ad2
  err5 = d6x2 - Ad2
   
  For Cont3 = 1 To  Ad2
    
     If (err1 > 0) Then
         dim1+= inc1
         err1 -= d2x2
     EndIf
      
     If (err2 > 0) Then
         dim3+= inc3
         err2 -= d2x2
     EndIf
      
     If (err3 > 0) Then
         dim4+= inc4
         err3 -= d2x2
     EndIf
    
     If (err4 > 0) Then
         dim5+= inc5
         err4 -= d2x2
     EndIf
      
     If (err5 > 0) Then
         dim6+= inc6
         err5 -= d2x2
     EndIf
       
     err1 += d1x2
     err2 += d3x2
     err3 += d4x2
     err4 += d5x2
     err5 += d6x2
      
     dim2+= inc2
      
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
    
  Next
   
 EndIf
  
 If(Ad3>Ad1)And(Ad3>Ad2)And(Ad3>=Ad4)And(Ad3>=Ad5)And(Ad3>=Ad6) Then
   
  err1 = d2x2 - Ad3
  err2 = d1x2 - Ad3
  err3 = d4x2 - Ad3
  err4 = d5x2 - Ad3
  err5 = d6x2 - Ad3
   
  For Cont3 = 1 To Ad3
      
     If (err1 > 0) Then
         dim2+= inc2
         err1 -= d3x2
     EndIf
      
     If (err2 > 0) Then
         dim1+= inc1
         err2 -= d3x2
     EndIf
      
     If (err3 > 0) Then
         dim4+= inc4
         err3 -= d3x2
     EndIf
      
     If (err4 > 0) Then
         dim5+= inc5
         err4 -= d3x2
     EndIf
      
     If (err5 > 0) Then
         dim6+= inc6
         err5 -= d3x2
     EndIf
      
     err1 += d2x2
     err2 += d1x2
     err3 += d4x2
     err4 += d5x2
     err5 += d6x2
      
     dim3+= inc3
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
    
  Next
   
 EndIf
  
 If(Ad4>Ad1)And(Ad4>Ad2)And(Ad4>Ad3)And(Ad4>=Ad5)And(Ad4>=Ad6) Then
   
  err1 = d1x2 - Ad4
  err2 = d2x2 - Ad4
  err3 = d3x2 - Ad4
  err4 = d5x2 - Ad4
  err5 = d6x2 - Ad4
   
  For Cont3 = 1 To Ad4
      
     If (err1 > 0) Then
         dim1+= inc1
         err1 -= d4x2
     EndIf
      
     If (err2 > 0) Then
         dim2+= inc2
         err2 -= d4x2
     EndIf
      
     If (err3 > 0) Then
         dim3+= inc3
         err3 -= d4x2
     EndIf
      
     If (err4 > 0) Then
         dim5+= inc5
         err4 -= d4x2
     EndIf
      
     If (err5 > 0) Then
         dim6+= inc6
         err5 -= d4x2
     EndIf
      
     err1 += d1x2
     err2 += d2x2
     err3 += d3x2
     err4 += d5x2
     err5 += d6x2
      
     dim4+= inc4
        
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
  
  Next
   
 EndIf
  
If(Ad5>Ad1)And(Ad5>Ad2)And(Ad5>Ad3)And(Ad5>Ad4)And(Ad5>=Ad6) Then
  
  err1 = d1x2 - Ad5
  err2 = d2x2 - Ad5
  err3 = d3x2 - Ad5
  err4 = d4x2 - Ad5
  err5 = d6x2 - Ad5
   
  For Cont3 = 1 To Ad5
      
     If (err1 > 0) Then
         dim1+= inc1
         err1 -= d5x2
     EndIf
      
     If (err2 > 0) Then
         dim2+= inc2
         err2 -= d5x2
     EndIf
      
     If (err3 > 0) Then
         dim3+= inc3
         err3 -= d5x2
     EndIf
      
     If (err4 > 0) Then
         dim4+= inc4
         err4 -= d5x2
     EndIf
      
     If (err5 > 0) Then
         dim6+= inc6
         err5 -= d5x2
     EndIf
      
     err1 += d1x2
     err2 += d2x2
     err3 += d3x2
     err4 += d4x2
     err5 += d6x2
      
     dim5+= inc5
      
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
 
  Next
  
 EndIf
  
 If(Ad6>Ad1)And(Ad6>Ad2)And(Ad6>Ad3)And(Ad6>Ad4)And(Ad6>Ad5) Then
   
  err1 = d1x2 - Ad6
  err2 = d2x2 - Ad6
  err3 = d3x2 - Ad6
  err4 = d4x2 - Ad6
  err5 = d5x2 - Ad6
   
  For Cont3 = 1 To Ad6
      
     If (err1 > 0) Then
         dim1+= inc1
         err1 -= d6x2
     EndIf
      
     If (err2 > 0) Then
         dim2+= inc2
         err2 -= d6x2
     EndIf
      
     If (err3 > 0) Then
         dim3+= inc3
         err3 -= d6x2
     EndIf
      
     If (err4 > 0) Then
         dim4+= inc4
         err4 -= d6x2
     EndIf
      
     If (err5 > 0) Then
         dim5+= inc5
         err5 -= d6x2
     EndIf
      
     err1 += d1x2
     err2 += d2x2
     err3 += d3x2
     err4 += d4x2
     err5 += d5x2
      
     dim6+= inc6
      
     Print dim1;" ";dim2;" ";dim3;" ";dim4;" ";dim5;" ";dim6
 
  Next
   
 EndIf
  
 Old1=New1
 Old2=New2
 Old3=New3
 Old4=New4
 Old5=New5
 Old6=New6
  
Wend
 
End