Dessiner un nombre aléatoire de cercles [Résolu]

Messages postés
2
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
28 novembre 2005
- - Dernière réponse : Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- 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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
3
Merci
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;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
2
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
28 novembre 2005
0
Merci
Ok, ça fonctionne en mettant "nbcercles := random(100)"
J'avais oublié un begin apparemment.

Merci beaucoup de ton aide
Commenter la réponse de DeanCorso666
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
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;
Commenter la réponse de f0xi
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
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
Commenter la réponse de Cirec
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
0
Merci
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.
Commenter la réponse de f0xi
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
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
Commenter la réponse de Cirec