Page 1 sur 1

RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 10:05
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

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 10:17
par Octavius
Chez moi ça ne marche pas, les coins sont décalés par rapport à la boite.

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 10:36
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) ?

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 10:47
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

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 11:27
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


Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : mer. 25/nov./2009 14:12
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

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : jeu. 26/nov./2009 18:04
par Le Soldat Inconnu
regarde ce code, je pense qu'il va t'intéresser

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

:D

Re: RoundBox Dessiner des boites avec des coins arrondi

Publié : jeu. 26/nov./2009 19:07
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