Dessiner un nombre aléatoire de cercles

Résolu
DeanCorso666 Messages postés 2 Date d'inscription lundi 14 mars 2005 Statut Membre Dernière intervention 28 novembre 2005 - 28 nov. 2005 à 20:09
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 30 nov. 2005 à 07:53
Salut,
Je débute en delphi. Je voulais creer aleatoirement un nombre de cercle à l'aide de canvas.ellipse. Mon problème c'est qu'il ne me prend pas en compte ma variable nbcercles, il m'indique "la variable nbcercles n'est peut être pas initialisée" et donc me fait un seul cercle.

Voici mon code, si vous trouvez l'erreur merci de me l'indiquer

"procedure TForm1.Button1Click(Sender: TObject);
var X,Y,i : integer;


nbcercles : 10..1000;


//Tirage aléatoire du nombre de cercles


begin
For i:=1 to nbcercles do


//Taille des cercles
Image1.Canvas.Brush.Color :=clblue;
X:=random(Image1.Height);
Y:=random(Image1.Width);
Image1.Canvas.Ellipse(X-5,Y-5,X+5,Y+5);
end;"

Merci de votre aide

6 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
28 nov. 2005 à 20:55
Essaye comme ca
procedure TForm1.Button1Click(Sender: TObject);
var X,Y,i , nbcercles : integer;
//Tirage aléatoire du nombre de cercles
begin
nbcercles := 100; // 100 Cercles
For i: =1 to nbcercles do
Begin
//Taille des cercles
Image1.Canvas.Brush.Color :=clblue;
X:=random(Image1.Height);
Y:=random(Image1.Width);
Image1.Canvas.Ellipse(X-5,Y-5,X+5,Y+5);
end;
end;
3
DeanCorso666 Messages postés 2 Date d'inscription lundi 14 mars 2005 Statut Membre Dernière intervention 28 novembre 2005
28 nov. 2005 à 21:06
Ok, ça fonctionne en mettant "nbcercles := random(100)"
J'avais oublié un begin apparemment.

Merci beaucoup de ton aide
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 nov. 2005 à 14:01
tu pourrais egalement l'ecrire comme ça :









procedure TForm1.Button1Click(Sender: TObject);

var c : tpoint;

i : integer;

begin

Randomize;

for i := 1 to (random(65000)+15000) do begin

with image1 do begin

c := point(random(Width-5), random(height-5));

with Canvas do begin

Pen.Color := random(16777217);

Brush.Color := Pen.Color;

Ellipse(c.X, c.Y, c.X+5, c.Y+5);

end;

end;

end;

end;
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
29 nov. 2005 à 16:05
f0xi,
tu as raison mais dans ce cas je metterai plutôt:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize; // un seul appel suffit
end;


Procedure TForm1.Button1Click(Sender: TObject);
Var c : tpoint;
i : integer;
Begin
With Image1 Do
Begin
Canvas.Brush.Color := Form1.Color;
Canvas.FillRect(rect(0, 0, Width, Height)); // éfface le fond
For i : = 1 To (random(65000) + 15000) Do
Begin
c := point(random(Width - 5), random(height - 5));
With Canvas Do
Begin
Pen.Color : = random(16777217);
Brush.Color := Pen.Color;
Ellipse(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
End;
application.ProcessMessages; // pour voir en temps réel l'affichage
End;
End;
End;

@+
Cirec
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 nov. 2005 à 02:21
alors oui, tout a fait pour Randomize.



vus que randomize initalise RandSeed grace au compteur de performance.



par contre une petite remarque dans ta procedure, c'est l'apel a
Application.ProcessMessages qui pourrait ralentir considerablement la
boucle.



et je preconiserais plutot quelque chose dans ce gout la :



var n : integer;

begin

n := 0;

for .... do begin

.... code ....

if inc(n) = 500 then begin

application.processmessages;

n := 0;

end;

end;

end;



en fait on apel processmessages que toute les 500 boucles par exemple. cela evite de trop la ralentir.

bon en plus dans une boucle aussi "bete" un CPU a plus d' 1 Ghz ne devrait pas "freezer" le programme pour si peu.

d'ailleur sur mon athlon 1800+ qui commence a se faire vieux, l'apel a
processmessage est completement inutile dans cette boucle (mais
uniquement dans ce cas) vair meme handicapant.

mais il est toujours important de rapeller l'utilisation de
processmessages dans les grosse boucle de traitement, mais je tiens a
rapeller qu'elle degrade la rapiditée d'execution de la boucle dans
laquelle elle se trouve.

je preferé l'utilisation des threads a la rigeur ... cela serait plus approprié bien que moins evident a coder.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
30 nov. 2005 à 07:53
f0xi
Ok je suis du même avis que toi, mais chez moi en tous cas, si je ne met pas Application.ProcessMessage; le résultat ne s'affiche que à la fin de la boucle( alors dans ce cas il vaut mieux afficher une image c'est plus rapide et c'est pareil),par contre avec, il est vrai que ca met un peut plus longtemps, je vois chaque figure s'afficher à lécran.Donc il faudrait peut être trouver un compromis entre le tout ou rien et essayer avec un Invalidate ou autre.


Et si j'ai bien compris chez toi tu as la progression qui s'affiche à l'écran sans mettre Application.ProcessMessage; si c'est le cas garde ta machine parce que la mienne un P4 3Ghz avec HT elle ne le fait pas


Voilà et pour rester dans le random jusqu'au bout:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;

Procedure TForm1.Button1Click(Sender: TObject);
Var c : tpoint;
i : integer;
Begin
With Image1 Do
Begin
Canvas.Brush.Color := Form1.Color;
Canvas.FillRect(rect(0, 0, Width, Height)); // éfface le fond
For i : = 1 To (random(65000) + 15000) Do
Begin
c := point(random(Width - 5), random(height - 5));
With Canvas Do
Begin
Pen.Color : = random(16777217);
Brush.Color := Pen.Color;
Case Random(3) of // Pour un peut plus de fun
0:Ellipse(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
1:Rectangle(c.X, c.Y, c.X + Random(50), c.Y + Random(50));
2:RoundRect(c.X, c.Y, c.X + Random(50), c.Y + Random(50),10,10);
End;
End;
application.ProcessMessages; // pour voir en temps réel l'affichage
End;
End;
End;



@+
Cirec
0
Rejoignez-nous