Un "Fake" pour une tracé de Bresenham

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
threedslider
Messages : 393
Inscription : dim. 01/juil./2018 22:38

Un "Fake" pour une tracé de Bresenham

Message par threedslider »

Voici un "Fake" pour tracer une ligne de Bresenham :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Line in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      For n=0 To 100
        For a=0 To 100
          If(a = n)
            Plot(a,n,RGB(255,0,0))
          EndIf
      Next
    Next
    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Un "Fake" pour une tracé de Bresenham

Message par case »

aucun rapport avec l'algo de Bresenham 8O la même peut être dessinée avec une seule boucle puisque c'est une diagonale... ou x=y :mrgreen:

Code : Tout sélectionner


If OpenWindow(0, 0, 0, 200, 200, "Line in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      For n=0 To 100
            Plot(n,n,RGB(255,0,0))
    Next    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf  
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
ou avec une simple instruction linexy()

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Line in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      LineXY(0,0,100,100,$0000ff)    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
  
il existe des implémentations de l’algorithme de Bresenham en pure basic.
ci dessous trouvé sur le forum, par comtois.

Code : Tout sélectionner


; code par comtois.

Declare DoLine(XStart,YStart,xend,YEnd,CoulR,CoulG,CoulB)
InitSprite()
InitKeyboard()
OpenScreen(640, 480, 32, "DoLine")

;- Boucle
rayon=200
Repeat
  
  ClearScreen(0)
  For i.w = 0 To 359 Step 6
    DoLine(320,240, 320 + rayon * Cos(i * 0.0174533), 240 + rayon * Sin(i* 0.0174533),Random(255),Random(255),Random(255))
  Next i
  FlipBuffers()
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End

Procedure PlotN(x,y)
  Plot(x,y) 
  Plot(x-1,y-1)
  Plot(x+1,y+1)
  Plot(x-1,y+1)
  Plot(x+1,y-1) 
EndProcedure  
          
Procedure DoLine(xi,yi,xf,yf,CoulR,CoulG,CoulB) 
  StartDrawing(ScreenOutput())
  FrontColor(rgb(CoulR,CoulG,CoulB))
  x = xi 
  y = yi 
  dx = xf - xi 
  dy = yf - yi 
  If dx > 0
    xinc = 1
  Else
    xinc = -1
  EndIf
  If dy > 0
    yinc = 1
  Else
    yinc = -1
  EndIf  
  
  dx = Abs(dx) 
  dy = Abs(dy) 
  PlotN(x,y) 
  If  dx > dy 
    cumul = dx / 2 
    For i = 1 To dx  
      x + xinc 
      cumul + dy 
      If (cumul >= dx) 
        cumul - dx 
        y + yinc 
      EndIf  
      PlotN(x,y)  
    Next  
  Else 
    cumul = dy / 2 
    For i = 1 To  dy 
      y + yinc 
      cumul + dx 
      If cumul >= dy 
        cumul - dy 
        x + xinc 
      EndIf  
      PlotN(x,y) 
    Next   
  EndIf  
  StopDrawing()
EndProcedure   

ImageImage
Avatar de l’utilisateur
threedslider
Messages : 393
Inscription : dim. 01/juil./2018 22:38

Re: Un "Fake" pour une tracé de Bresenham

Message par threedslider »

Whouaou! Y'a pas mal de techniques différentes :P

Celui de Comtois est plus technique, pas mal aussi ^^

Merci Case de partager ça ;)
Avatar de l’utilisateur
threedslider
Messages : 393
Inscription : dim. 01/juil./2018 22:38

Re: Un "Fake" pour une tracé de Bresenham

Message par threedslider »

J'ai fait aussi en cercle de manière simple :)

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Circle in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      
      R = 30
      For n=0 To 360
        X = R * Cos(n)
        Y = R * Sin(n)
            Plot(X+100,Y+100,RGB(255,0,0))
      Next
    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Avatar de l’utilisateur
threedslider
Messages : 393
Inscription : dim. 01/juil./2018 22:38

Re: Un "Fake" pour une tracé de Bresenham

Message par threedslider »

Aujourd'hui j'ai fais un peu plus complexe pour la forme :mrgreen:

Voici les codes que j'ai expérimenté :

Le poisson

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Fish in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      
      R = 50
      R2 = 10
      For n=0 To 360
        X = R * Cos(n)
        Y = R * Sin(n)
        Plot(X*Cos(n)+X-130,Y*Cos(n)+100,RGB(255,0,0))
        
        X = R2 * Cos(n)
        Y = R2 * Sin(n)
        
        Plot(X+150,Y+80,RGB(255,0,0))
      Next
    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Cercle complexe

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 200, "Complex circle in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
      
      R = 30
      For n=0 To 8600
        X = R * 2*Cos(4*n)
        Y = R * 2*Sin(4*n)
        Plot(X*Cos(n)+100,Y*Cos(n)+100,RGB(255,0,0)) 
      Next
    
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Et enfin la spiral ^^

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 800, 800, "Spiral in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 800, 800) And StartDrawing(ImageOutput(0))
      
      R = 3
      For n=0 To 800
        X = R * Exp(n/200)*Cos(n)
        Y = R * Exp(n/200)*Sin(n)
        Plot(X+400,Y+400,RGB(255,0,0)) 
      Next
    
      StopDrawing() 
      ImageGadget(0, 0, 0, 800, 800, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Qu'en pensez vous ça ?
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Un "Fake" pour une tracé de Bresenham

Message par blendman »

Coucou

A propos de bresenham, il y a ça trouvé sur rosetta code, pour purebasic :

Code : Tout sélectionner

Procedure BresenhamLine(x0 ,y0 ,x1 ,y1)
     If Abs(y1 - y0) > Abs(x1 - x0);
        steep =#True 
        Swap x0, y0
        Swap x1, y1
     EndIf    
     If x0 > x1 
         Swap x0, x1
         Swap y0, y1
     EndIf 
     deltax = x1 - x0
     deltay = Abs(y1 - y0)
     error = deltax / 2
     y = y0
     If y0 < y1  
        ystep = 1
     Else
        ystep = -1 
     EndIf 
     For x = x0 To x1
         If steep 
           Plot(y,x)
         Else 
           Plot(x,y)
         EndIf
         error - deltay
         If error < 0 
             y + ystep
             error + deltax
         EndIf
     Next        
EndProcedure
 
#Window1   = 0
#Image1    = 0
#ImgGadget = 0
#width     = 300
#height    = 300
 
Define.i Event
Define.f Angle
 
If OpenWindow(#Window1, 0, 0, #width, #height, "Bresenham's Line PureBasic Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   If CreateImage(#Image1, #width, #height)
      ImageGadget(#ImgGadget, 0, 0, #width, #height, ImageID(#Image1))
      StartDrawing(ImageOutput(#Image1))
      FillArea(0,0,-1,$FFFFFF) :FrontColor(0)
      While Angle < 2*#PI
        BresenhamLine(150,150,150+Cos(Angle)*120,150+Sin(Angle)*120)
        Angle + #PI/60     
      Wend 
 
      StopDrawing()
      SetGadgetState(#ImgGadget, ImageID(#Image1))
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow
   EndIf
EndIf
J"aime bien ton effet spirale, mais c'est mieux avec la vectorlib ;)

Code : Tout sélectionner

w= 800
h=800
If OpenWindow(0, 0, 0, 800, 800, "Spiral in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0,w0,0,w,h)
  
  If StartVectorDrawing(CanvasVectorOutput(0))
      
      R = 3
      For n=0 To 800
        X = R * Exp(n/200)*Cos(n)
        Y = R * Exp(n/200)*Sin(n)
        AddPathCircle(X+400,Y+400,10)
      Next
      VectorSourceColor(RGBA(255,0,0,255)) 
      ; FillPath(#PB_Path_Winding)
      FillPath()
      StopVectorDrawing()
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
A+
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Un "Fake" pour une tracé de Bresenham

Message par blendman »

TOn cercle complexe en vector drawing :

Code : Tout sélectionner

w= 800
h=800
If OpenWindow(0, 0, 0, 800, 800, "Spiral in pixels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0,w0,0,w,h)
  
  If StartVectorDrawing(CanvasVectorOutput(0))
    
    R = 60
    For n=0 To 8600
      X = R * 2*Cos(4*n)
      Y = R * 2*Sin(4*n)
      AddPathCircle(200+X*Cos(n),200+Y*Cos(n),4)
    Next
    
    ;     R = 3
    ;       For n=0 To 800
    ;         X = R * Exp(n/200)*Cos(n)
    ;         Y = R * Exp(n/200)*Sin(n)
    ;         AddPathCircle(X+400,Y+400,10)
    ;       Next
    VectorSourceColor(RGBA(255,0,0,255)) 
    FillPath(#PB_Path_Winding)
    ; FillPath()
    StopVectorDrawing()
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Avatar de l’utilisateur
threedslider
Messages : 393
Inscription : dim. 01/juil./2018 22:38

Re: Un "Fake" pour une tracé de Bresenham

Message par threedslider »

blendman a écrit : ven. 24/sept./2021 11:55 Coucou

A propos de bresenham, il y a ça trouvé sur rosetta code, pour purebasic :

...code...
Hello Blendman ! Merci pour cette technique, c'est très utile ^^
blendman a écrit : ven. 24/sept./2021 11:55 J"aime bien ton effet spirale, mais c'est mieux avec la vectorlib ;)

...code...
Pas mal du tout aussi ! Sauf que j'ai pas réussi d'avoir plus de "pixels" dans mon code pour avoir les effets des lignes en courbes :/
blendman a écrit : ven. 24/sept./2021 11:55 TOn cercle complexe en vector drawing :

...code...
Pas mal aussi, je ne savais qu'on pouvait faire sa avec vector drawing :mrgreen:
Répondre