Page 1 sur 2
Bresenham
Publié : lun. 20/sept./2004 0:07
par garzul

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

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
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

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

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...

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

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...

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

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!
