Des cercles a dessiner sans "circle"

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Des cercles a dessiner sans "circle"

Message 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:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message 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

http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Des cercles a dessiner sans "circle"

Message par Ollivier »

Moi j'ai une milliseconde (27 millions de cycles).
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message par SPH »

Ollivier a écrit :Moi j'ai une milliseconde (27 millions de cycles).
De qui, de où, de quand ??
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Des cercles a dessiner sans "circle"

Message par falsam »

Ollivier a écrit :Moi j'ai une milliseconde (27 millions de cycles).
Tu attends l'affichage de la prochaine milliseconde ? :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Des cercles a dessiner sans "circle"

Message 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
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message 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: :|
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Des cercles a dessiner sans "circle"

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message par SPH »

Marche pas ton truc... :roll:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Des cercles a dessiner sans "circle"

Message 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.
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Des cercles a dessiner sans "circle"

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







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Des cercles a dessiner sans "circle"

Message 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...
Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message 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:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Des cercles a dessiner sans "circle"

Message par Ollivier »

Avatar de l’utilisateur
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

Re: Des cercles a dessiner sans "circle"

Message 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 ? :|
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre