RoundBox Dessiner des boites avec des coins arrondi

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

RoundBox Dessiner des boites avec des coins arrondi

Message par Thyphoon »

Coucou
Voici une petit procédure que j'ai faite pour dessiner des boites avec des coins arrondi !
IL y a surement moyen d'améliorer le code, de l'optimisé etc...
Donc toute idée est la bienvenu !

Code : Tout sélectionner

Procedure RoundBox(x.l,y.l,width.l,height.l,ray.l,color.l)
  Box(x+ray,y,width-ray*2,height,color)
  Box(x,y+ray,ray,height-ray*2,color)
  Box(x+width-ray,y+ray,ray,height-ray*2,color)
  For z=0 To 90
  dx=Sin(z*#PI/180)*ray
  dy=Cos(z*#PI/180)*ray
    Line(x+ray,y+ray-dy,-dx,1,color)
    Line(x+width-ray,y+ray-dy,dx,1,color)
    Line(x+ray,y+height-ray+dy,-dx,1,color)
    Line(x+width-ray,y+height-ray+dy,dx,1,color)
  Next
  
EndProcedure



If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))

      
        RoundBox(10, 10, 100, 100,20, RGB(Random(255), Random(255), Random(255)))
        

      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Octavius »

Chez moi ça ne marche pas, les coins sont décalés par rapport à la boite.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Thyphoon »

Octavius a écrit :Chez moi ça ne marche pas, les coins sont décalés par rapport à la boite.
c'est currieux ! chez moi ça marche bien ! tu es sur quel version de PB (j'ai testé sur 4.40B7x86 Windows) ?
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Octavius »

PB 4.31 x86 Windows

EDIT:

Je vois deux solutions possibles.

1. Si ton but c'est seulement de créer une boite arrondie pleine, tu peux tout simplement utiliser la fonction Circle() pour les coins.

2. Si tu veux que ta boite puisse aussi être transparente tu peux utiliser la fonction API RoundRect(), mais tu perds la portabilité.

Code : Tout sélectionner

OpenWindow(0,0,0,200,200,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateImage(0,200,200) 

hDC=StartDrawing(ImageOutput(0))
Box(0,0,200,200,RGB(255,255,255))
;DrawingMode(#PB_2DDrawing_Outlined)
RoundRect_(hDC,10,10,110,110,20,20)
StopDrawing()

ImageGadget(0,0,0,200,200,ImageID(0))

Repeat
Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Thyphoon »

Merci c'est currieux que ça ne marche pas chez toi !
C'est certain que mon but est d'avoir quelques choses de portable !
Ce qui est incroyable c'est la vitesse de l'API !
et je pensais que ça prendrait moins de temps de dessiner un 1/4 de cercle plutôt qu'un cercle entier ...
Currieux quand même ...

Code : Tout sélectionner

Procedure RoundBox(x.l,y.l,width.l,height.l,ray.l,color.l)
  Box(x+ray,y,width-ray*2,height,color)
  Box(x,y+ray,ray,height-ray*2,color)
  Box(x+width-ray,y+ray,ray,height-ray*2,color)
  last_dy=-1
  For z=0 To 90
  dx=Sin(z*#PI/180)*ray
  dy=Cos(z*#PI/180)*ray
  If last_dy<>dy
    last_dy=dy
    Line(x+ray,y+ray-dy,-dx,1,color)
    Line(x+width-ray,y+ray-dy,dx,1,color)
    Line(x+ray,y+height-ray+dy,-dx,1,color)
    Line(x+width-ray,y+height-ray+dy,dx,1,color)
  EndIf
  Next
  
EndProcedure

Procedure RoundBox2(x.l,y.l,width.l,height.l,ray.l,color.l)
Protected x1.l,y1.l,x2.l,y2.l,dr.l,dx.l,dy.l
  x1=x+ray
  x2=x+width-ray
  y1=y+ray
  y2=y+height-ray-1
  dr.l=ray<<1
  Box(x1,y,width-dr,height,color)
  Box(x,y1,ray,height-dr,color)
  Box(x2,y1,ray,height-dr,color)
  last_dy=-1
  For z=0 To 90
  dx=Sin(z*#PI/180)*ray
  dy=Cos(z*#PI/180)*ray
    If last_dy<>dy
      last_dy=dy
      Line(x1,y1-dy,-dx,1,color);Pour les vielles version de PB remplacer le ,1, part 0
      Line(x2,y1-dy,dx,1,color);Pour les vielles version de PB remplacer le ,1, part 0
      Line(x1,y2+dy,-dx,1,color);Pour les vielles version de PB remplacer le ,1, part 0
      Line(x2,y2+dy,dx,1,color);Pour les vielles version de PB remplacer le ,1, part 0
   EndIf
  Next
  
EndProcedure

Procedure RoundBox3(x.l,y.l,width.l,height.l,ray.l,color.l)
Protected x1.l,y1.l,x2.l,y2.l,dr.l,dx.l,dy.l
  x1=x+ray
  x2=x+width-ray
  y1=y+ray
  y2=y+height-ray-1
  dr.l=ray<<1
  Box(x1,y,width-dr,height,color)
  Box(x,y1,ray,height-dr,color)
  Box(x2,y1,ray,height-dr,color)
  Circle(x1,y1,ray,color)
  Circle(x1,y2,ray,color)
  Circle(x2-1,y1,ray,color)
  Circle(x2-1,y2,ray,color)
  
EndProcedure

#Max=10000
  If OpenWindow(0, 0, 0, 150, 150, "Rectangles", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    hdc=StartDrawing(WindowOutput(0))
        t=ElapsedMilliseconds()
        For z=1 To #Max
          Box(10, 10, 100, 100,#Red)
        Next
        Fa=ElapsedMilliseconds()-t
        Debug Fa
    
        t=ElapsedMilliseconds()
        For z=1 To #Max
          RoundRect_(hDC,10,10,100,100,20,20)
        Next
        Fa=ElapsedMilliseconds()-t
        Debug Fa
        
        t=ElapsedMilliseconds()
        For z=1 To #Max
          RoundBox2(10, 10, 100, 100,10 ,#Green)
        Next
        Fb=ElapsedMilliseconds()-t
        Debug Fb
        
        t=ElapsedMilliseconds()
        For z=1 To #Max
          RoundBox3(10, 10, 100, 100,10 ,#Blue)
        Next
        Fc=ElapsedMilliseconds()-t
        Debug Fc
      StopDrawing()   ; C'est absolument indispensable quand les opérations de dessins sont terminées !!! Ne jamais l'oublier !
  EndIf
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par kernadec »

bonjour Thyphoon
ca aussi pour le fun

Code : Tout sélectionner

Procedure RoundBox(x.l,y.l,width.l,height.l,ray.l,color.l)
	Circle(x+ray,y+ray,ray,color)
	Circle(x-ray+height,y+ray,ray,color)
	Circle(x+ray,y-ray+width,ray,color)
	Circle(x-ray+height,y-ray+width,ray,color)
	For u=0 To width
	LineXY(x+ray,y+u,x+height-ray,y+u,color)
	Next
	For u=0 To height
	LineXY(x+u,y+ray,x+u,y+width-ray,color)
	Next
EndProcedure

If OpenWindow(0, 0, 0, 400, 400, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		If CreateImage(0, 400, 400) And StartDrawing(ImageOutput(0))
			Box(0,0,400,400,RGB(255,255,255))
			RoundBox(10, 10, 380, 280,50,RGB(Random(255), Random(255), Random(255)))
			RoundBox(11, 11, 378, 278,50,RGB(255, 255, 255))

			StopDrawing() 
			ImageGadget(0, 0, 0, 400, 400, ImageID(0))
		EndIf
	Repeat
		Event = WaitWindowEvent()
	Until Event = #PB_Event_CloseWindow
EndIf

cordialement
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Le Soldat Inconnu »

regarde ce code, je pense qu'il va t'intéresser

http://www.purebasic.fr/french/viewtopi ... it=Frame3D

:D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: RoundBox Dessiner des boites avec des coins arrondi

Message par Thyphoon »

Le Soldat Inconnu a écrit :regarde ce code, je pense qu'il va t'intéresser

http://www.purebasic.fr/french/viewtopi ... it=Frame3D

:D
génial :D des fois je me dis que je suis neuneu....comment j''ai pu passé a côté de ça ! :D
Répondre