Page 1 sur 4

Des cercles a dessiner sans "circle"

Publié : dim. 21/avr./2019 18:02
par SPH
Salut,

voici un code banal pour faire des cercles concentriques :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 600, 600, "Cercle",#PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0), 10, 10, 580, 580, 0, 0, 0)
    
    
  TempsDepart.q = ElapsedMilliseconds()  ; Récupère la valeur actuelle
  
    StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Outlined)

    For r= 10 To 260 Step 10
      
      Circle(290,290,r)
     
    Next
    
    StopDrawing()
    
    
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    
  TempsEcoule.q = ElapsedMilliseconds()-TempsDepart
 MessageRequester("timer",Str(TempsEcoule))   
    
    Repeat
      ExamineKeyboard()
    Until KeyboardPushed(#PB_Key_Escape)
    
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf

Timer entre 10 et 15 ms :idea:


Mais, sauriez vous faire la meme chose sans l'innstruction "circle" ?

Mon code :

Code : Tout sélectionner

;
;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 600, 600, "Cercle",#PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0), 10, 10, 580, 580, 0, 0, 0)
    
    
  TempsDepart.q = ElapsedMilliseconds()  ; Récupère la valeur actuelle
    
    StartDrawing(ScreenOutput())
    
    For r= 10 To 260 Step 10
      ;r=260
      rr.f=2*r*3.14159535
      
      ;z.f=360*8/rr
      z.f=360/rr
      u.f=0
      
      ok=0
      
      Repeat
        
        u+z
        If u>=360
          ok=1
        EndIf
        
        x.f=Cos(Radian(u))*r
        y.f=Sin(Radian(u))*r
        
        ;LineXY(290+x,290+y,290+x2,290+y2,RGB(88,88,88))
        Plot(290+x,290+y,RGB(255,0,0))
        
        
      Until ok=1
      
    Next
    
    StopDrawing()
    
    
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    
  TempsEcoule.q = ElapsedMilliseconds()-TempsDepart
 MessageRequester("timer",Str(TempsEcoule))   
    
    Repeat
      ExamineKeyboard()
    Until KeyboardPushed(#PB_Key_Escape)
    
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf

Timer entre 24 et 26 ms :wink:

Re: Des cercles a dessiner sans "circle"

Publié : dim. 21/avr./2019 21:25
par SPH
Une petite variante qui grapille quelques ms :

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Windowed Screen example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(0, 0, 0, 600, 600, "Cercle",#PB_Window_ScreenCentered)
  
  If OpenWindowedScreen(WindowID(0), 10, 10, 580, 580, 0, 0, 0)
    
    
    TempsDepart.q = ElapsedMilliseconds()  ; Récupère la valeur actuelle
    
    StartDrawing(ScreenOutput())
    
    For r= 10 To 260 Step 10
      ;r=260
      rr.f=2*r*3.14159535
      
      ;z.f=360*8/rr
      z.f=360/rr
      u.f=0
      
      ok=0
      
      Repeat
        
        
        x.f=Cos(Radian(u))*r
        y.f=Sin(Radian(u))*r
        
        Plot(290+x,290+y,RGB(255,0,0))
        Plot(290-x,290+y,RGB(255,0,0))
        Plot(290+x,290-y,RGB(255,0,0))
        Plot(290-x,290-y,RGB(255,0,0))
        
        u+z
        If u>90
          ok=1
        EndIf
        
      Until ok=1
      
    Next
    
    StopDrawing()
    
    
    FlipBuffers()       ; Inverse the buffers (the back become the front (visible)... and we can do the rendering on the back
    
    TempsEcoule.q = ElapsedMilliseconds()-TempsDepart
    MessageRequester("timer",Str(TempsEcoule))   
    
    Repeat
      ExamineKeyboard()
    Until KeyboardPushed(#PB_Key_Escape)
    
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
  EndIf
EndIf


Re: Des cercles a dessiner sans "circle"

Publié : dim. 21/avr./2019 22:43
par Ollivier
Moi j'ai une milliseconde (27 millions de cycles).

Re: Des cercles a dessiner sans "circle"

Publié : dim. 21/avr./2019 22:59
par SPH
Ollivier a écrit :Moi j'ai une milliseconde (27 millions de cycles).
De qui, de où, de quand ??

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 7:40
par falsam
Ollivier a écrit :Moi j'ai une milliseconde (27 millions de cycles).
Tu attends l'affichage de la prochaine milliseconde ? :mrgreen:

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 11:23
par Ollivier
Ton screen, avec option Smart Synchro (cf Doc)
Ton sprite, avec option Alphablending (cf Doc)
Ton drawing, avec option All Channels (cf Doc)

Et tu utilises la couche alpha pour faire un gruyère dans ton disque.

Code : Tout sélectionner

Procedure DisplayCircle(cx, cy, Radius.D, SpriteN)
    x1 = Radius
    Angle.D = 0.0
    Repeat
        Angle + 0.12564
        x0 = x1
        y0 = y1
        x1 = Cos(Angle) * Radius
        y1 = Sin(Angle) * Radius
        TransformSprite(SpriteN, 0, 0, x0, y0, x1, y1, 0, 0)
        DisplayTransparentSprite(SpriteN, cx, cy)
    Until Angle => 6.283 - 0.12564
EndProcedure

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 11:46
par SPH
Je suis désolé Ollivier mais je ne vois pas ce qu'un sprite viens faire dans ta routine. De plus, ta routine est bien belle, mais peut tu donner l'integralité de ton code qui trace des cercles ?

:arrow: :|

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 12:04
par Ollivier
Quand tu as créé ton screen, tu mets ça :

Code : Tout sélectionner

Sprite = CreateSprite(#PB_Any, 2, 1, #PB_Sprite_Alphablending)
If StartDrawing(SpriteOutput(Sprite) )
    DrawingMode(#PB_2DDrawing_AllChannels)
    W = OutputWidth()
    H = OutputHeight()
    Box(0, 0, W, H, RGBA(0, 0, 0, 0) )
    Plot(1, 0, RGBA(255, 255, 255, 255) )
    StopDrawing()
EndIf
C'est un sprite de 2 pixels.

Ensuite, tu copie la procédure donnée plus haut. Et dans ta boucle d'affichage, tu dessines ton cercle :

Code : Tout sélectionner

DisplayCircle(200, 200, 50, Sprite)
Tu peux en faire plein : ça utilise peu le CPU donc c'est nettement plus rapide.

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 14:36
par SPH
Marche pas ton truc... :roll:

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 14:57
par crisot
Le problème de ta routine c'est que les cercles sont beaucoup moins beaux que ceux créés par la fonction circle.

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 15:22
par venom
crisot a écrit :Le problème de ta routine c'est que les cercles sont beaucoup moins beaux que ceux créés par la fonction circle.
En même temps, sph a demander des cercles sans la fonction cercle. Il n'a pas parler de perfect circle :lol:







@++

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 16:20
par Ollivier
SPH a écrit :Marche pas ton truc... :roll:
Remplace Plot(1, etc... par Plot(0, etc... et ça va marcher.

Faut vraiment te tirer les vers du nez...

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 16:25
par SPH
Beaucoup moins beaux ?

Il n'y a pas plus rond qu'un cercle tracé point par point avec un cos et un sin.

Peut etre as tu vu ma vieille routine ou j'interpolais les points séparé par des line. La, c'etait moche :idea:

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 16:27
par Ollivier

Re: Des cercles a dessiner sans "circle"

Publié : lun. 22/avr./2019 16:31
par SPH
Ollivier a écrit :Nyé mynerve le SPicHe !
J'ai essayé tes routines. Elles ne marchent pas.
Au lieu de dire "remplace ca par ca" et surtout "met ca la" et tout et tout, pourquoi tu ne ponds pas un code complet ? :|