> TechDémo
PrograZine issue #8 - http://www.citeweb.net/discase/8/PLASMA.htm Edito Sommaire Contribution Contacts


L'effet de plasma
par darokin - darokin@infonie.fr
Initié Dos Casic
> fichiers attachés
seplasma.bas
splasma.bas



     Tout le monde a déjà vu au moins une fois cet effet qui est en fait très simple, eh bien je vous propose de vous l'expliquer et avec les sources. Nous réaliserons ce programme en qbasic, ainsi, tout le monde pourra s'y mettre...
>Notre programme.

     La théorie du plasma: le plasma doit être "actif", c'est à dire que l'on va recalculer à chaque fois chacun de ses points, le problème pour notre exemple, c'est qu'en Basic, calculer 64000 points prends un certain temps et on va avoir un vieux refresh sreen visible et laid [c-a-dire que l'écran va sauter et que l'effet sera super lent]. Pour remédier à cela, on peut faire un plus petit plasma sur une surface restreinte afin de gagner du temps de calcul. Dans le fichier seplasma.bas inclus avec ce numéro de Prograzine et cet article, j'ai calclculer le plasma à chaque fois sur une petite surface mais au hazard dans un grand carré, l'effet ne sera pas méga rapide mais on aura un rendu plutôt sympa et notre plasma évoluera joliement et de façon original.
>La théorie du plasma.

     L'effet de plasma est simple, on prends chaque pixel un par un et on calcule une nouvelle couleur pour ce point, et cette couleur sera égal à la moyenne des couleurs des pixels adjacent à ce point, vous me suivez. Bien sûr, si on commence sur un écran noir, on va pas allez très loin. Donc au début, on remplira la surface où l'on veut du plasma par des pixels de couleur aléatoire puis calculez pour chaque point sa nouvelle couleur. Pour voir comment on calcule la nouvelle couleur d'un point, regardez plutôt ce petit schéma explicatif:
  X   X   X         pour calculer la couleur du point "0":
  			  sa couleur sera égal à la moyenne
  X   0   X		  des couleurs de tous les points à côté de lui,
			  représenté içi par les X, puis on réaffichera chaque
  X   X   X 	  point avec sa nouvelle couleur.
l

    Donc pour calculer la couleur d'un point x,y, on fera comme ceci [la fonction point(x,y) retourne la couleur d'un pixel en basic]:
Nlle_couleur_pour_x,y =
   (POINT(x - 1, y - 1) + POINT(x - 1, y)
  + POINT(x - 1, y + 1) + POINT(x, y + 1)
  + POINT(x, y - 1) + POINT(x + 1, y)
  + POINT(x + 1, y - 1) + POINT(x + 1, y + 1)) / 8
l

    Voila, maintenant, on fait ça pour chaque pixel et on les affiche avec leur nouvelle couleur.
> Code en pseudo-language
'Affichage de points de couleurs aléatoires sur la surface
'où l'on veut le plasma

    Afficher point de couleur aléatoire

'voila, on a une surface avec des pixels de toutes les couleurs

'Maintenant, commencons à calculer le plasma

calcul de chaque point:

    Calcul de la nouvelle couleur de chaque point
    Affichage de tous les pixels avec leur nouvelles couleurs

Si appuie sur escap : fin du programme
sinon Retour au calcul de chaque point
l

    Voilà en gros ce que fait notre programme mais voyons plutôt les sources d'un petit plasma
>Source d'un petit plasma
'pour que les couleurs soit prise au hazard à chaque fois
RANDOMIZE TIMER

'initialisation du mode 13h [320*200*256]
SCREEN 13

'affichage des pixels de couleurs aléatoire sur la surface [0-51,0-51]
FOR x = 0 TO 51
  FOR y = 0 TO 51
    PSET (x, y), RND * 65
  NEXT y
NEXT x

'début de la boucle principale
DO

'calcul et affichage des points avec leur nouvelle couleur
FOR x = 1 TO 50
  FOR y = 1 TO 50
    'calcul de la couleur du point grâce a la somme des
    'couleurs des points adjacents
    PSET (x, y), (POINT(x - 1, y - 1) + POINT(x - 1, y)
     + POINT(x - 1, y + 1) + POINT(x, y + 1) + POINT(x, y - 1)
     + POINT(x + 1, y) + POINT(x + 1, y - 1)
     + POINT(x + 1, y + 1)) / 8 + RND * .8
    'si l'on rajoute une valeur au hazard entre 0 et 0.8, c'est
    'pour que le plasma soit toujours en mouvement sinon il
    's'arrêterais à un moment
  NEXT y
NEXT x

'on sort de la boucle si on appuie sur la touche de valeur 27,
'c'est à dire la touche escape
LOOP UNTIL INKEY$ = CHR$(27)
l

    Voici les sources sur un .bas : LIEN.

    Voila, un plasma tout simple sur 49 pixels de large et 49 pixels de haut.
>Optimisation

    Non, on va pas mettre de l'assembleur pour allez plus vite mais on va voir ce que l'on peut faire et si on peut éventuellement améliorer notre effet:

    On peut changer la surface sur laquelle on va faire le plasma, plus celle-ci sera petite, plus le calcul sera rapide et l' affichage aussi par la même occasion.

    Un facteur important pour la réussite [beauté] de notre plasma, c'est la valeur du nombre que l'on prend pour l'affichage des pixels de couleurs au début, nous avons fait:
FOR x = 0 TO 51
  FOR y = 0 TO 51
    PSET (x, y), RND * 65
  NEXT y
NEXT x
l

    Mais si vous remplacez RND * 65 par RND * 2, le plasma sera totalement différent.

    Regardez ce programme où pour faire un plus "grand" plasma sans trop de ralentissement, j'ai calculer à chaque fois une petite surface au hazrd sur la surface totale du plasma, en plus l'effet est assez spécial car l'évolution des couleurs est "séquentielle"

    Vous avez aussi remarqué que j'ai ajouté au hazard une valeur entre 0 et 0.8 à la moyenne des couleurs des pixels adjacents. Trifouillez un peu toutes ces valeurs pour obtenir l'effet désiré.
darokin
Cet article est la propriété de darokin. L'auteur et la rédaction du magazine déclinent toutes responsabilités vis-à-vis des conséquences que pourrait entraîner ce document.