Page 1 sur 3

Paint Plot

Publié : sam. 27/déc./2008 3:25
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:

Publié : sam. 27/déc./2008 8:37
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

Publié : sam. 27/déc./2008 12:04
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...).

Publié : sam. 27/déc./2008 13:34
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.

Publié : sam. 27/déc./2008 16:08
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




Publié : sam. 27/déc./2008 16:35
par Backup
bien sur dans ce cas on clip pour eviter la sortie des plots !! :)

Publié : sam. 27/déc./2008 19:20
par Stefou
on clip pour eviter la sortie des plots !!
:D :D :D (pris hors contexte)

Publié : dim. 28/déc./2008 11:42
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 ?

Publié : dim. 28/déc./2008 12:57
par Anonyme
Circle() au lieu de plot ?

Publié : dim. 28/déc./2008 14:23
par Old_Shark
Trop facile :roll:

Publié : dim. 28/déc./2008 14:49
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 ?

Publié : dim. 28/déc./2008 16:12
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

Publié : dim. 28/déc./2008 17:38
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.

Publié : dim. 28/déc./2008 18:42
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

?

Publié : dim. 28/déc./2008 18:50
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!