Page 1 sur 2

Bresenham

Publié : lun. 20/sept./2004 0:07
par garzul
:D Bonjour a tous voila j'ai decouvert cette formule qui permet de tracer un cercle sans trou et vite fait sans que les calcul bouffe du temps cpu mais voila j'ai un probleme j'ai fait ce code (Bresenham n'utilise pas les cosinus et sinus ) et donc au lieu que sa m'affiche un cerlce sa m'afiche un triangle :? Qui pourrait résoudre cela et me dire si bresenham et bien ?

Code : Tout sélectionner

Global y2.f
;Pouf circle
Procedure DrawCircle(Parameter)
    
    angle = 0
    
  Repeat 

    If StartDrawing(WindowOutput())
    
    ;  FrontColor(Random(255), Random(255), Random(255))
      For k=0 To 300
   
   x = 0 
y = k
d = 1 - k  

        Plot(300+x, 300+y,1)

;x = 150 + 300 * Cos(Angle) + k 
;y = 150 + 300 * Sin(Angle) + k 

While y > x 

  If d < 0 
    d = d + 2 * x + 2 
    Else  
    d = d + 2 * (x - y) + 5  
    y = y - 1 

  EndIf 
  
    x = x + 1
    
        Plot(300+x, 300+y,1)


Wend
        
      ;  Delay(10)
      Next 
      
      StopDrawing()
    EndIf
    
    
    Angle + 1
   

  ForEver
  

EndProcedure


If OpenWindow(0, 0, 0, 1020, 700, #PB_Window_SystemMenu, "Bijour ^^")

 CreateThread(@DrawCircle(), 0)
  
  Repeat
  Until WaitWindowEvent() = #PB_EventCloseWindow
  
EndIf

Publié : lun. 20/sept./2004 5:36
par garzul
:D Voila j'ai fait un peu de code ce matin et j'ai réussi a faire cela (Ce qui se rapproche drolement d'un cercle) mais ce n'est pas encore un cercle :? :mad:

Code : Tout sélectionner

Global y2.f
;Pouf circle
Procedure DrawCircle(Parameter)
    
    angle = 0
    k = 500
  Repeat 

    If StartDrawing(WindowOutput())
    
    ;  FrontColor(Random(255), Random(255), Random(255))
 ;     For k=0 To 1
   
   x = 0 
y = k
d = 1 - k  

        Plot(300+x, 300+y,1)

While y > x 

  If d < 0 
    d = d + 3 * x + 3
    Else  
    d = d + 3 * (x - y) + 5
    y = y - 1 

  EndIf 
  
    x = x + 1
    
        Plot(300+x, y,1)


Wend
        
      ;  Delay(10)
   ;   Next 
      
      StopDrawing()
    EndIf
    
    
    Angle + 1
   

  ForEver
  

EndProcedure


If OpenWindow(0, 0, 0, 1020, 700, #PB_Window_SystemMenu, "Bijour ^^")

 CreateThread(@DrawCircle(), 0)
  
  Repeat
  Until WaitWindowEvent() = #PB_EventCloseWindow
  
EndIf

Publié : lun. 20/sept./2004 11:30
par fweil
Voici une implémentation de la formulation de Bresenham pour le cercle.

Dans ce cas précis, on voit bien que l'utilisation de plots successifs n'apporte rien en performances par rapport au Circle de Purebasic.

Toutefois, en mode Screen et non pas Window le résultat peut être assez différent.

A noter également que l'approximation du dessin du cercle utilisant Bresenham et Circle ne rend pas tout à fait les mêmes pixels ... !

La quadrature du cercle quoi !

Code : Tout sélectionner

#Window_Main = 0

Procedure BresenhamCircle(CX.l, CY.l, Radius.l, Color.l)
  x = 0
  y = Radius
  s = 1 - Radius
  While x < y
    If s < 0
        s = s + 2 * x + 3
      Else
        s = s + 2 * (x - y) + 5
        y = y - 1
    EndIf
    x = x + 1
    Plot(CX + x, CY + y, Color)
    Plot(CX - x, CY + y, Color)
    Plot(CX + x, CY - y, Color)
    Plot(CX - x, CY - y, Color)
    Plot(CX + y, CY + x, Color)
    Plot(CX - y, CY + x, Color)
    Plot(CX + y, CY - x, Color)
    Plot(CX - y, CY - x, Color)
  Wend
EndProcedure 

  Window_Width = 1024
  Window_Height = 768
  If OpenWindow(#Window_Main, 0, 0, Window_Width, Window_Height, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Bijour ^^") 
      AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
      StartDrawing(WindowOutput())
        For i = 200 To 1 Step -1
          BresenhamCircle(200, 200, i, #Blue)
        Next
        DrawingMode(4)
        For i = 200 To 1 Step -1
          Circle(600, 200, i, #Blue)
        Next
      StopDrawing()
      Repeat 
      Until WaitWindowEvent() = #PB_EventCloseWindow Or EventMenuID() = #PB_Shortcut_Escape
  EndIf
End

Publié : lun. 20/sept./2004 16:33
par garzul
8O Whaou c'est loin de ce que j'avais fait non ? Mais bon c'est vrai que comme ceci je trouve que bresenham et plus rapide et plus detailler que le circle d'origine de pure basic n'ai - je pas raison ?

Publié : lun. 20/sept./2004 16:41
par garzul
Donc oui ce que j'ai fait etais bon sauf que j'avais oublier de reconstituer le puzzle :) voici mon code modifier le meme que ce matin sauf avec toute les piece manquante :)

Code : Tout sélectionner

Global y2.f
;Pouf circle
Procedure DrawCircle(Parameter)
   
    angle = 0
   
  Repeat

    If StartDrawing(WindowOutput())
   
    ;  FrontColor(Random(255), Random(255), Random(255))
      For k=0 To 300
   
   x = 0
y = k
d = 1 - k 

While y > x

  If d < 0
    d = d + 2 * x + 2
    Else 
    d = d + 2 * (x - y) + 5 
    y = y - 1

  EndIf
 
    x = x + 1
   
        Plot(300+x, 300+y,1)
        Plot(300-x, 300+y,1)
        Plot(300-x, 300-y,1)
        Plot(300+x, 300-y,1)
        Plot(300+y, 300-x,1)
        Plot(300-y, 300-x,1)
        Plot(300+y, 300+x,1)
        Plot(300-y, 300+x,1)


Wend
       
      ;  Delay(10)
      Next
     
      StopDrawing()
    EndIf
   
   
    Angle + 1
   

  ForEver
 

EndProcedure


If OpenWindow(0, 0, 0, 1020, 700, #PB_Window_SystemMenu, "Bijour ^^")

 CreateThread(@DrawCircle(), 0)
 
  Repeat
  Until WaitWindowEvent() = #PB_EventCloseWindow
 
EndIf

Publié : lun. 20/sept./2004 17:06
par fweil
Ce que tu avais fait était correct sauf que dans le principe du cercle selon Bresenham on traite des huitièmes de cercle.

De plus j'ai fait le code de telle sorte que l'on puisse paramétrer le centre et le rayon, come dans la fonction Circle.

Mais il faut bien comprendre que le tracé d'un cercle de cette façon n'apporte pas grand chose en termes de performances, sauf éventuellement en mode Screen si on descend en assembleur. Dans ce cas seulement on peut éventuellement gagner quelques nanosecondes !

Une chose au sujet de Bresenham : il s'agit d'un gars qui a réfléchi à la manière de calculer 'au plus près' les points de différents types de fonctions représentées graphiquement en utilisant des méthodes calcul en nombres entiers.

S'agissant des PC de nos jours et des compilateurs etc, le calcul en nombre flottants ne coute pas plus cher que le calcul en nombre entiers. Ce qui fait que pratiquement il n'est plus possible de démontrer l'avantage de Bresenham par rapport à des méthodes de calcul flottantes.

Le seul avantage qui reste à prendre sur les compilateurs et les machines est l'adressage direct des points à afficher.

C'est la raison pour laquelle, vu que l'on ne peut pas faire d'adressage direct en mode Window, il n'est pas utile de se triturer trop les méninges.

Le seul mode, présentement sous PureBasic, qui permet de faire de l'adressage direct est le mode Screen (OpenScreen ou OpenWindowedScreen), en utilisant DrawingBuffer() et DrawingBufferPitch().

Si PureBasic permet ultérieurement de disposer d'une base d'adressage direct pour les objets de type Window ou Image, il sera intéressant de revenir sur la question.

Enfin voilà, sinon pour Bresenham d'une manière générale, une requête Google permet de trouver des centaines et des milliers de gens qui se sont fait les dents dessus. Le pauvre, les gens se font les dents sur un mordu d'arithmétique !

Publié : lun. 20/sept./2004 17:33
par garzul
:D Oué merci pour le cour fweil (J'entreposerez ici quelque effet mathematique que je pense a crée :) )

Publié : lun. 20/sept./2004 18:20
par Heis Spiter
S'il pouvait aussi te faire un cours de français... :roll:

Publié : lun. 20/sept./2004 18:27
par Anonyme2
:mrgreen:

:jesors:

Publié : lun. 20/sept./2004 18:52
par garzul
:o Bah ouais mais bon je suis comme sa je suis comme sa j'aime pas le français j'aime mieux l'anglais :lol: Mais bon j'essaye de faire un effort a chaque fois que je poste mais c'est plus fort que moi je suis faible et j'ai du mal a enfoncer les touche du clavier qui sont plus dur :lol: 8)

Publié : lun. 20/sept./2004 19:20
par Aranoth
fait gaffe sinon tes posts seront déplacés dans "Poubelle" :P

Publié : lun. 20/sept./2004 19:40
par Heis Spiter
Si tu préfère parler Anglais, parle Anglais ;) POur tes touches, un petit conseil, le marteau...

:jesors:

Publié : lun. 20/sept./2004 19:45
par Chris
Les messages de Garzul son compréhensibles.
Il faut juste prendre une grande respiration avant de commencer à les lire, parce que la ponctuation, personnellement, je la cherche encore :lol:

Publié : lun. 20/sept./2004 20:52
par fweil
Garzul posts inspire myself to post good as fluently french as possible ... I am not sure to be readable there but who knows ?!

Maybe the esperanto would be better but I am not sure too if this would be ... so I will try to continue in fluent french.

If some people here are not satistifed I can continue this post in some other languages ... but the best I know is PureBasic itself !

Publié : lun. 20/sept./2004 21:21
par garzul
please fweil, can you speak french because it's a french forum here! :D