Paint Plot

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Old_Shark
Messages : 20
Inscription : sam. 13/déc./2008 1:40
Localisation : Belgique

Paint Plot

Message par Old_Shark »

Bonjour !

Voilà ce que je cherche à faire avec l'instruction Plot ().

Dessiner un pixel à partir du centre d'une fenêtre qui en s'éloignent du centre, fini par colorier toute la surface de la fenêtre.

Pas facile à formuler, j'espère qu'on me comprend :oops:
Si deux ou trois experts du Plotage peuvent m'aider, ce serait sympa :wink:
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Est-ce que c'est cela que tu cherche ?

Code : Tout sélectionner

Procedure dessine()
  StartDrawing(WindowOutput(0))
    Plot(200,200,0)
    For x=1 To 200
      For y=-x To x
        Plot(200+x,200+y,RGB(x,x,x))
        Plot(200-x,200-y,RGB(x,x,x))
        Plot(200+y,200+x,RGB(x,x,x))
        Plot(200-y,200-x,RGB(x,x,x))
        
      Next
     Delay(5)
    Next
    
  StopDrawing()
EndProcedure




OpenWindow(0,0,0,400,400,"test")

CreateThread(@dessine(),1)
Repeat
Until WaitWindowEvent()=#WM_CLOSE
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Message par GeBonet »

Stefou a écrit :Est-ce que c'est cela que tu cherche ?

Code : Tout sélectionner

Procedure dessine()
  StartDrawing(WindowOutput(0))
    Plot(200,200,0)
    For x=1 To 200
      For y=-x To x
        Plot(200+x,200+y,RGB(x,x,x))
        Plot(200-x,200-y,RGB(x,x,x))
        Plot(200+y,200+x,RGB(x,x,x))
        Plot(200-y,200-x,RGB(x,x,x))
      Next
     Delay(5)
    Next
  StopDrawing()
EndProcedure
;
OpenWindow(0,0,0,400,400,"test")
CreateThread(@dessine(),1)
Repeat
Until WaitWindowEvent()=#WM_CLOSE
C'est bien, mais on a oublié un détail... :? Nous oublions souvent des détails :lol:

Code : Tout sélectionner

Procedure dessine(*Valeur)
La procédure appelée comme Thread demande quelque chose à recevoir... ICI "*valeur" qui va recevoir 1 de l'appel... et ne rien faire avec !
Mais c'est comme ça... Sans ça, ça marche pas !
Tout comme dans l'exemple qui aurait pu simplement être :

Code : Tout sélectionner

Procedure dessine()
  StartDrawing(WindowOutput(0))
    Plot(200,200,0)
    For x=1 To 200
      For y=-x To x
        Plot(200+x,200+y,RGB(x,x,x))
        Plot(200-x,200-y,RGB(x,x,x))
        Plot(200+y,200+x,RGB(x,x,x))
        Plot(200-y,200-x,RGB(x,x,x))
      Next
     Delay(5)
    Next
  StopDrawing()
EndProcedure
;
OpenWindow(0,0,0,400,400,"test")
dessine() ; Appel de la procédure, dessine, puis revient et attend ! 
Repeat
Until WaitWindowEvent()=#WM_CLOSE
En fait la différence, c'est que le premier code avec CreateThread(@dessine(),1) fait que le programme principal peut continuer à faire des choses pendant que la procédure dans cet exemple trace le graphique...

Tandis que dans le deuxième, le programme commence, va dessiner puis revient continuer à faire autre chose... (Ici attendre...).
Old_Shark
Messages : 20
Inscription : sam. 13/déc./2008 1:40
Localisation : Belgique

Message par Old_Shark »

C'est tout à fait ça, merci.

Est-il possible, de faire la même chose avec une seule instruction Plot ?

J'abuse :oops:

Et merci pour les précisions sur les Procedure.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

on peut aussi faire comme ça :)

Code : Tout sélectionner

Declare.f RotationX(x.f, angle.f, dist.f)
Declare.f RotationY(y.f, angle.f, dist.f) 
Declare dessine()

Global xa=200
Global ya=200

;
OpenWindow(0,0,0,400,400,"test")
dessine() ; Appel de la procédure, dessine, puis revient et attend !
Repeat
Until WaitWindowEvent()=#WM_CLOSE


Procedure.f RotationX(x.f, angle.f, dist.f) 
    ProcedureReturn x + Cos(angle*#PI/180)*dist 
EndProcedure


Procedure.f RotationY(y.f, angle.f, dist.f) 
    ProcedureReturn y + Sin(angle*#PI/180)*dist 
EndProcedure

Procedure dessine()
    StartDrawing(WindowOutput(0)) 
        For d=1 To 720*2  
            degres.f=d/4 
            distance=1
            x= RotationX(xa, degres, distance)
            y= RotationY(ya, degres, distance)    
                For nbr_point=1 To 200
                    x= RotationX(xa, degres, distance)
                    y= RotationY(ya, degres, distance)   
                    Plot(x,y,RGB(1,nbr_point ,nbr_point/3))
                    distance=distance+1
                Next nbr_point     
    Next d
StopDrawing()
EndProcedure

ou comme ça :

Code : Tout sélectionner

Declare.f RotationX(x.f, angle.f, dist.f)
Declare.f RotationY(y.f, angle.f, dist.f) 
Declare dessine()

Global xa=200
Global ya=200

;
OpenWindow(0,0,0,400,400,"test")
dessine() ; Appel de la procédure, dessine, puis revient et attend !
Repeat
Until WaitWindowEvent()=#WM_CLOSE


Procedure.f RotationX(x.f, angle.f, dist.f) 
    ProcedureReturn x + Cos(angle*#PI/180)*dist 
EndProcedure


Procedure.f RotationY(y.f, angle.f, dist.f) 
    ProcedureReturn y + Sin(angle*#PI/180)*dist 
EndProcedure

Procedure dessine()
    StartDrawing(WindowOutput(0)) 
        For d=1 To 720*2  
            degres.f=d/4 
            distance.f=1
            x= RotationX(xa, degres, distance)
            y= RotationY(ya, degres, distance)    
                For nbr_point=1 To 280
                    x= RotationX(xa, degres, distance)
                    y= RotationY(ya, degres, distance)  
                    coul=nbr_point
                    If coul>255 : coul=255:EndIf
                    If x<0:x=1:EndIf
                    If y<0:y=1:EndIf
                    If x>WindowWidth(0):x=WindowWidth(0)-1:EndIf
                    If x>WindowHeight(0):x=WindowHeight(0)-1:EndIf
                    Plot(x,y,RGB(1,coul ,coul))
                    distance=distance+1
                Next nbr_point     
            Next d
            
StopDrawing()
EndProcedure



Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bien sur dans ce cas on clip pour eviter la sortie des plots !! :)
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

on clip pour eviter la sortie des plots !!
:D :D :D (pris hors contexte)
Old_Shark
Messages : 20
Inscription : sam. 13/déc./2008 1:40
Localisation : Belgique

Message par Old_Shark »

Non non non ! Ce n'est pas encore ça :twisted: :P

C’est bien pour ça que j'avais du mal d'approcher le problème.

Le premier exemple me serait plus utile, car il remplit totalement la surface, progressivement en s'éloignant du centre (nous pourrions appeler ça une spirale carrée). L'inconvénient, il utilise 4*Plots.

Les deux codes si dessus me seront utiles pour d'autres délires psychédéliques :D

Une idée ?
Anonyme

Message par Anonyme »

Circle() au lieu de plot ?
Old_Shark
Messages : 20
Inscription : sam. 13/déc./2008 1:40
Localisation : Belgique

Message par Old_Shark »

Trop facile :roll:
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Message par Stefou »

Les 4 plot() sont facilement réduisable en 1, mais la question est : l'effet est-il trop carré ? Veux tu que cela soit circulaire ? Qu'est ce qui ne te va pas ?
Anonyme

Message par Anonyme »

Trop facile ?

en 2 ligne alors :

Code : Tout sélectionner

#RAD = #PI/180
Procedure Dessine() : For Rayon = 1 To 200:For Deg = 1 To 360 :Rad.f =Deg*#RAD :x.f = 200 + Rayon * Cos(Rad) : y.f = 200 + Rayon * Sin(Rad) :Plot(x,y,RGB( Rayon, Rayon, Rayon)): Next  :Next  : EndProcedure

:D
Old_Shark
Messages : 20
Inscription : sam. 13/déc./2008 1:40
Localisation : Belgique

Message par Old_Shark »

Carré, rond ou hexagonal, l'effet n'a que peu d'importance, ce sont les coordonnées X et Y qui me seront utiles au final.
#RAD = #PI/180
Procedure Dessine() : For Rayon = 1 To 200:For Deg = 1 To 360 :Rad.f =Deg*#RAD :x.f = 200 + Rayon * Cos(Rad) : y.f = 200 + Rayon * Sin(Rad) :Plot(x,y,RGB( Rayon, Rayon, Rayon)): Next :Next : EndProcedure
Le premier problème de cette méthode : C’est qu’elle trace une ligne directement jusqu’au bord de la surface.

Le deuxième problème de cette méthode : C'est qu'elle laisse des coordonnées X et Y inexploitées.
Anonyme

Message par Anonyme »

Code : Tout sélectionner

Procedure dessine(void)
  StartDrawing(WindowOutput(0))
  
  CenterX.f = WindowWidth(0) / 2
  CenterY.f = WindowHeight(0) / 2
  Distance.f =    Sqr((CenterX*CenterX)  + (CenterY*CenterY))                  
  
  
 
  DrawingMode(#PB_2DDrawing_Outlined)
For Rayon = 0 To Distance
			Color = (Rayon*255)/Distance
			Circle(CenterX,CenterY,Rayon,RGB(Color,Color,Color))
			SmartWindowRefresh(0,1)
		Delay(5)
Next 
   
  StopDrawing()
EndProcedure




OpenWindow(0,0,0,400,400,"test")

CreateThread(@dessine(),1)
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Old_Shark a écrit :Carré, rond ou hexagonal, l'effet n'a que peu d'importance, ce sont les coordonnées X et Y qui me seront utiles au final.
#RAD = #PI/180
Procedure Dessine() : For Rayon = 1 To 200:For Deg = 1 To 360 :Rad.f =Deg*#RAD :x.f = 200 + Rayon * Cos(Rad) : y.f = 200 + Rayon * Sin(Rad) :Plot(x,y,RGB( Rayon, Rayon, Rayon)): Next :Next : EndProcedure
Le premier problème de cette méthode : C’est qu’elle trace une ligne directement jusqu’au bord de la surface.

Le deuxième problème de cette méthode : C'est qu'elle laisse des coordonnées X et Y inexploitées.
:?:
Tu peux être plus explicite? Personnellement je ne comprends rien à ce que tu veux!
Répondre