Por último, un Bresenham de 6D. Es el mismo que uso en mi Brazo Robot con unos pequeños cambios de adaptación. Este algoritmo puede servirte para 2D, 3D, 4D, 5D y 6D. Las dimensiones que no uses has de dejarlas a cero, o bien, sin introducir cambios, eso es todo.
Para bajarte directamente el programa Bresenham 6D, pincha aquí. Si quieres el Bresenham 4D y nada más, pincha aquí.
En el interior de cada ZIP viene el código fuente y el programa ejecutable.
Este es el código en FreeBasic (100% compatible con Qbasic en este caso) del Bresenham 6D:
'-------------------------------
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