BAC À SABLE

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 14 mars 2008 à 21:49
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 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.

https://codes-sources.commentcamarche.net/source/46059-bac-a-sable

cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 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és 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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és 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 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és 49 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 24 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és 400 Date d'inscription samedi 6 août 2005 Statut Membre Dernière intervention 11 février 2016 1
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és 6 Date d'inscription vendredi 30 mai 2003 Statut Membre Dernière intervention 22 avril 2010
15 mars 2008 à 15:41
C'est vraiment super d'avoir un assistant canin à la hauteur.. Bravo.
Utilisateur anonyme
14 mars 2008 à 23:18
"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és 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 mars 2008 à 22:53
bravo barbichette et
un nonos pour le chien..
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
14 mars 2008 à 21:54
... Un bémol quand même:
2 biscuits pour ça, c'est de l'exploitation!
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
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? ;)
Rejoignez-nous