Bresenham

Partagez votre expérience de PureBasic avec les autres utilisateurs.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Bresenham

Message 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
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message 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
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message 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 ?
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message 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
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Oué merci pour le cour fweil (J'entreposerez ici quelque effet mathematique que je pense a crée :) )
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

S'il pouvait aussi te faire un cours de français... :roll:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

:mrgreen:

:jesors:
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message 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)
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

fait gaffe sinon tes posts seront déplacés dans "Poubelle" :P
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Message par Heis Spiter »

Si tu préfère parler Anglais, parle Anglais ;) POur tes touches, un petit conseil, le marteau...

:jesors:
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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:
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

please fweil, can you speak french because it's a french forum here! :D
Répondre