Voila l'utilisation que j'en fais:
Pour un jeu (rts par exmple) nécessitant une recherche autour d'un personnage ou d'un bâtiment. (et si l'élément recherché ne peut pas l'être en itérant une liste contenant cet élément ou si cette liste est plus longue que le nombre de case à explorer par exemple)
Ou encore pour révéler la carte autour d'un personnage, d'un nombre de x cases (en fonction de la limite de vue du personnage)
Le problème du tracé de cercle de Bresenham est qu'il n'est pas couvrant (il "rate" des cases). L'algo d'Andres au contraire n'en rate aucune et ne repasse pas deux fois au même endroit. C'est lui qu'il faut utiliser

En ce qui concerne l'algo de traçage de ligne de Bresenham, il est très utile pour ce qui est de la réduction de nombre de noeud d'un pathfinding.
Code : Tout sélectionner
Structure XY
X.i
Y.i
coul.i
EndStructure
Global NewList Cercle_Bresenham.XY()
Global NewList Cercle_Andres.XY()
;algorithme de tracé de cercle de Bresenham
Procedure TracerCercleBresenham(rayon,x_centre,y_centre,coul)
y=rayon ; // on se place en haut du cercle
m=5-4*rayon ; // initialisation
While x <= y; // tant qu'on est dans le second octant
AddElement(cercle_bresenham())
cercle_bresenham()\x=x+x_centre:cercle_bresenham()\y=y+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=y+x_centre:cercle_bresenham()\y=x+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=-x+x_centre:cercle_bresenham()\y=y+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=-y+x_centre:cercle_bresenham()\y=x+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=x+x_centre:cercle_bresenham()\y=-y+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=y+x_centre:cercle_bresenham()\y=-x+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=-x+x_centre:cercle_bresenham()\y=-y+y_centre:Cercle_Bresenham()\coul=coul
AddElement(cercle_bresenham())
cercle_bresenham()\x=-y+x_centre:cercle_bresenham()\y=-x+y_centre:Cercle_Bresenham()\coul=coul
If m > 0 ;choix du point F
y - 1
m=m-8*y
EndIf
x+1 ;
m=m + 8*x+4 ;
Wend
EndProcedure
;algorithme de tracé de cercle d'Andres
Procedure TracerCercleAndres(rayon,x_centre,y_centre,coul)
y=rayon
d=rayon - 1
While y>=x
AddElement(cercle_Andres())
Cercle_Andres()\x=x+x_centre:Cercle_Andres()\y=y+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=y+x_centre:Cercle_Andres()\y=x+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=-x+x_centre:Cercle_Andres()\y=y+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=-y+x_centre:Cercle_Andres()\y=x+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=x+x_centre:Cercle_Andres()\y=-y+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=y+x_centre:Cercle_Andres()\y=-x+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=-x+x_centre:Cercle_Andres()\y=-y+y_centre:Cercle_Andres()\coul=coul
AddElement(Cercle_Andres())
Cercle_Andres()\x=-y+x_centre:Cercle_Andres()\y=-x+y_centre:Cercle_Andres()\coul=coul
If d >= 2*x
d=d-2*x-1
x+1
ElseIf d <= 2*(rayon-y)
d=d+2*y-1
y-1
Else
d=d+2*(y-x-1)
y-1
x+1
EndIf
Wend
EndProcedure
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "Sprite system can't be initialized", 0)
End
EndIf
OpenScreen(640,480,32,"test")
ClearScreen(RGB(0,0,0))
;calcul 50 cercles concentriques avec les 2 méthodes, en incrémentant le rayon
For i=1 To 100
coul=RGB(Random(255,40),Random(255,40),Random(255,40))
TracerCercleAndres(i,100,160,coul)
TracerCercleBresenham(i,360,160,coul)
Next i
Repeat
FlipBuffers()
StartDrawing(ScreenOutput())
;trace les cercles calculés avec Bresenham (en vert)
ForEach cercle_bresenham()
Plot(cercle_bresenham()\x,cercle_bresenham()\y,Cercle_Bresenham()\coul)
Next
;trace les cercles calculés avec Andres (en jaune)
ForEach cercle_Andres()
Plot(cercle_Andres()\x,cercle_Andres()\y,Cercle_Andres()\coul)
Next
StopDrawing()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)