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

Si deux ou trois experts du
Plotage peuvent m'aider, ce serait sympa

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
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
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 !!

(pris hors contexte)
Publié : dim. 28/déc./2008 11:42
par Old_Shark
Non non non ! Ce n'est pas encore ça
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
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

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

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

.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

.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!