Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
14 mars 2008 à 21:49
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 juillet 2013
-
17 mars 2008 à 18:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 juillet 2013 17 mars 2008 à 18:26
Pour l'explication : il me semblais que les commentaires suffisaient...
Enfin... je vais essayer de décrire le processus. Comme il est pas de moi à la base, c'est pas évident...
En gros, on prend une petite partie de 2x2 pixels.
En fonction de la présence ou non de grains de sables (un pixel), on les déplace en conséquence.
Comme ceci :
X.
.. X tombe (le pixel en dessous)
XY
.. les 2 X tombent (les deux pixels en dessous)
X. 2 possibilités : X tombe à droite de Y
Y. ou alors Y est poussé vers la droite et X tombe à la place de Y
Donc ça donne
.. ..
XY YX
XY deux choix : Y tombe simplement
Z. ou Z est poussé sous Y et X tombe à la place de Z
Donc ça donne
X. .Y
ZY XZ
Il y a d'autres configurations possibles et il y a les cas où un des deux pixels du bas est noir donc fixe.
Dans les commentaires, les cas sont expliqués avant chaque "Case .. of"
J'espère que c'est devenu limpide...
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 17 mars 2008 à 16:01
Salut,
ça manque cruellement de commentaires afin d' expliquer la méthode utilisée?!
Sinon bem, 2 biscuits pour le toutou c' est pas beaucoup, surtout que c' est un Labrador (ils sont plutôt gourments, j' en ai un aussi).
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 juillet 2013 16 mars 2008 à 23:20
Salut jihelb,
Tu as bien vu pour le souci de symétrie.
J'ai d'abord copier ton code, qui marche très bien, puis je me suis aperçu qu'en évitent une sous procédure et surtout, en ne changeant le sens de traitement qu'une fois par image, l'effet était le même mais bien plus rapide (sur mon ordi en tous cas).
J'ai donc une variable globale (dx) qui donne le sens de traitement, et dans la procédure DoSand, suivant dx, on part de la gauche, ou de la droite et on avance ou on recule.
Pas de test, que des additions ;-)...
Sinon, j'ai ajouter quelques lignes pour charger une autre image BMP.
Avec dans le zip une image en forme de sablier pour faire plaisir à Caribensila. Je n'ai par contre pas mesuré sa durée. il me semble presque parfait pour faire cuire un œuf à la coque....
jihelb
Messages postés49Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention24 mars 2017 16 mars 2008 à 20:29
Bravo Barbichette, j'aime beaucoup la façon de résoudre ce problème, et je pense que celà vaut bien un 9 (étonné que personne n'ai noté !?)
Je me suis par contre demandé pourquoi il y avait une dissymétrie entre l'écoulemnt vers la droite(trés réaliste) et celui vers la gauche(qui fait apparaitre des murs verticaux) alors que l'algo de gestion d'une ligne est parfaitement symétrique.
Celà provient du fait qu'une ligne est balayée de la gauche vers la droite.
J'ai donc légèrement modifié ceci pour que les lignes paires soit balayées dans un sens et les impaires dans l'autre (peut-être y-a-t'il une autre solution, mais je ne l'ai pas trouvée).
Donne-nous encore des animations.
////////////////////
PROCEDURE INITIALE
procedure TForm1.DoSand;
var
x,y:integer;
a,b,c,d,e:integer;
bg:integer;
p:PQuadArray;
begin
bg:=$FFFFFF; //couleur du fond
p:=bitmap.scanline[h-1];
// on balaye de bas en haut l'image,
// sinon, des grains de sable pourraient tomber d'un coup du haut en bas...
for y:=0 to h-2 do
begin
//-+-+-+ début partie à déplacer -+-+-+-
.
.
.
//-+-+-+ fin partie à déplacer -+-+-+-
end;
end;
REMPLACEE PAR
procedure TForm1.DoSand;
var
x,y:integer;
a,b,c,d,e:integer;
bg:integer;
p:PQuadArray;
//---------
procedure UneLigne(x: integer);
begin
//-+-+-+ début partie déplacée -+-+-+-
.
.
.
//-+-+-+ fin partie déplacée -+-+-+-
end;
//---------
begin
bg:=$FFFFFF; //couleur du fond
p:=bitmap.scanline[h-1];
// on balaye de bas en haut l'image,
// sinon, des grains de sable pourraient tomber d'un coup du haut en bas...
for y:=0 to h-2 do
begin
//-+-+-+ début partie modifiée -+-+-
if odd(y)
then for x:= 1 to w-2 do UneLigne(x)
else for x:= w-2 downto 1 do UneLigne(x);
//-+-+-+ fin partie modifiée -+-+-
end;
end;
Francky23012301
Messages postés400Date d'inscriptionsamedi 6 août 2005StatutMembreDernière intervention11 février 20161 15 mars 2008 à 17:23
Pauvre chien, tu l'as décapité : C'est Delphiprog qui va pas etre content lui non plus lol.
J'applaudis l'idée qui est original et qui juxtapose différents effets.
Juste une remarque : Dans le OnCreate rajoute DoubleBuffered:=True; ca évitera le scintillement ;).
cs_OlivierH
Messages postés6Date d'inscriptionvendredi 30 mai 2003StatutMembreDernière intervention22 avril 2010 15 mars 2008 à 15:41
C'est vraiment super d'avoir un assistant canin à la hauteur.. Bravo.
"là ça m'étonnerait que Cirec trouve ton tas de sable pas assez consistant. lol "
il me semble qu'un tas de sable n'est pas consistant ... non ? lol
Sinon bien vu ... voici un code qui reflète bien ce à quoi tu nous avais habitué.
Félicitations au chien (belle bête) ^^
et Bravo au maitre ;-)
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 14 mars 2008 à 22:53
bravo barbichette et
un nonos pour le chien..
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 14 mars 2008 à 21:54
... Un bémol quand même:
2 biscuits pour ça, c'est de l'exploitation!
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 14 mars 2008 à 21:49
Bien que ça me rappelle les travaux de Pierre-Gilles de Gennes sur la "matière molle", là ça m'étonnerait que Cirec trouve ton tas de sable pas assez consistant. lol
Il est génial cet effet! Et en si peu de code, beau travail de traduction!
J'vais me plonger la-dedans dès que j'ai le temps (ça me fera des vacances à la plage).
PS : Pour quand le joli vrai sablier pour nous faire patienter pendant les processus bloquants? ;)
17 mars 2008 à 18:26
Enfin... je vais essayer de décrire le processus. Comme il est pas de moi à la base, c'est pas évident...
En gros, on prend une petite partie de 2x2 pixels.
En fonction de la présence ou non de grains de sables (un pixel), on les déplace en conséquence.
Comme ceci :
X.
.. X tombe (le pixel en dessous)
XY
.. les 2 X tombent (les deux pixels en dessous)
X. 2 possibilités : X tombe à droite de Y
Y. ou alors Y est poussé vers la droite et X tombe à la place de Y
Donc ça donne
.. ..
XY YX
XY deux choix : Y tombe simplement
Z. ou Z est poussé sous Y et X tombe à la place de Z
Donc ça donne
X. .Y
ZY XZ
Il y a d'autres configurations possibles et il y a les cas où un des deux pixels du bas est noir donc fixe.
Dans les commentaires, les cas sont expliqués avant chaque "Case .. of"
J'espère que c'est devenu limpide...
17 mars 2008 à 16:01
ça manque cruellement de commentaires afin d' expliquer la méthode utilisée?!
Sinon bem, 2 biscuits pour le toutou c' est pas beaucoup, surtout que c' est un Labrador (ils sont plutôt gourments, j' en ai un aussi).
16 mars 2008 à 23:20
Tu as bien vu pour le souci de symétrie.
J'ai d'abord copier ton code, qui marche très bien, puis je me suis aperçu qu'en évitent une sous procédure et surtout, en ne changeant le sens de traitement qu'une fois par image, l'effet était le même mais bien plus rapide (sur mon ordi en tous cas).
J'ai donc une variable globale (dx) qui donne le sens de traitement, et dans la procédure DoSand, suivant dx, on part de la gauche, ou de la droite et on avance ou on recule.
Pas de test, que des additions ;-)...
Sinon, j'ai ajouter quelques lignes pour charger une autre image BMP.
Avec dans le zip une image en forme de sablier pour faire plaisir à Caribensila. Je n'ai par contre pas mesuré sa durée. il me semble presque parfait pour faire cuire un œuf à la coque....
16 mars 2008 à 20:29
Je me suis par contre demandé pourquoi il y avait une dissymétrie entre l'écoulemnt vers la droite(trés réaliste) et celui vers la gauche(qui fait apparaitre des murs verticaux) alors que l'algo de gestion d'une ligne est parfaitement symétrique.
Celà provient du fait qu'une ligne est balayée de la gauche vers la droite.
J'ai donc légèrement modifié ceci pour que les lignes paires soit balayées dans un sens et les impaires dans l'autre (peut-être y-a-t'il une autre solution, mais je ne l'ai pas trouvée).
Donne-nous encore des animations.
////////////////////
PROCEDURE INITIALE
procedure TForm1.DoSand;
var
x,y:integer;
a,b,c,d,e:integer;
bg:integer;
p:PQuadArray;
begin
bg:=$FFFFFF; //couleur du fond
p:=bitmap.scanline[h-1];
// on balaye de bas en haut l'image,
// sinon, des grains de sable pourraient tomber d'un coup du haut en bas...
for y:=0 to h-2 do
begin
//-+-+-+ début partie à déplacer -+-+-+-
.
.
.
//-+-+-+ fin partie à déplacer -+-+-+-
end;
end;
REMPLACEE PAR
procedure TForm1.DoSand;
var
x,y:integer;
a,b,c,d,e:integer;
bg:integer;
p:PQuadArray;
//---------
procedure UneLigne(x: integer);
begin
//-+-+-+ début partie déplacée -+-+-+-
.
.
.
//-+-+-+ fin partie déplacée -+-+-+-
end;
//---------
begin
bg:=$FFFFFF; //couleur du fond
p:=bitmap.scanline[h-1];
// on balaye de bas en haut l'image,
// sinon, des grains de sable pourraient tomber d'un coup du haut en bas...
for y:=0 to h-2 do
begin
//-+-+-+ début partie modifiée -+-+-
if odd(y)
then for x:= 1 to w-2 do UneLigne(x)
else for x:= w-2 downto 1 do UneLigne(x);
//-+-+-+ fin partie modifiée -+-+-
end;
end;
15 mars 2008 à 17:23
J'applaudis l'idée qui est original et qui juxtapose différents effets.
Juste une remarque : Dans le OnCreate rajoute DoubleBuffered:=True; ca évitera le scintillement ;).
15 mars 2008 à 15:41
14 mars 2008 à 23:18
il me semble qu'un tas de sable n'est pas consistant ... non ? lol
Sinon bien vu ... voici un code qui reflète bien ce à quoi tu nous avais habitué.
Félicitations au chien (belle bête) ^^
et Bravo au maitre ;-)
14 mars 2008 à 22:53
un nonos pour le chien..
14 mars 2008 à 21:54
2 biscuits pour ça, c'est de l'exploitation!
14 mars 2008 à 21:49
Il est génial cet effet! Et en si peu de code, beau travail de traduction!
J'vais me plonger la-dedans dès que j'ai le temps (ça me fera des vacances à la plage).
PS : Pour quand le joli vrai sablier pour nous faire patienter pendant les processus bloquants? ;)