Troupeaux de pirlufs et sociale mécanique |
Ce programme est un germe de création. Il est réalisé sur la base d’un programme original de Robin Fercoq : "Volpurna". Son principe fondamental est extrait et restitué sous une forme minimaliste, ce qui en fait une source d’inspiration et de réflexion possible, en accord avec son auteur qui met son propre code source à disposition du public. Nous
proposons l'interprétation suivante : "Troupeaux de Pirlufs
et sociale mécanique" fait état d’une population
en mouvement soumise à "l’onde mega" du docteur
Septimus. Le docteur Septimus est un personnage d’une aventure de
Blake et Mortimer "La marque jaune", bande dessinée de
Edgar Jacobs (édition Blake et Mortimer, Bruxelles 1987 - première
édition 1953). |
![]() |
TELECHARGER aaaTexte des explications, aaaExecutable (Windows), aaaSource (utilise la librairie Allegro)
|
![]() |
EXPLICATIONS 1. Principe La présentation faite par l’auteur est la suivante : « Volpurna simule l'agitation de particules en interaction. Chaque particule peut choisir soit de suivre son propre déplacement rectiligne soit d'adopter le mouvement de la particule la plus proche au-delà d'une certaine distance. La probabilité de suivre plutôt son « instinct » ou plutôt le mouvement des autres est réglée par l'utilisateur, de même que la distance minimum d'interaction. En manipulant ces paramètres globaux et leur variabilité inter-individuelle il est possible d'explorer continuellement différents régimes collectifs, moléculaires, chaotiques, individualistes ou totalitaires » L’auteur s’interroge
sur l’articulation entre mouvements individuels et mouvements collectifs.
De ce fait la nature exacte du logiciel est hybride. C’est un travail
qui n’est réservé ni au visuel, ni à la vie
artificielle, ni à la physique ou aux mathématiques, il
prend des accents éventuellement politiques, philosophiques et
critiques… Le modèle du fonctionnement est le suivant : 2. Mise en forme et initialisation Structure
de données (1) aaaaaa#define NB_OBJ 300 (2) aaaaaastruct{ (3) aaaaaaint x, y; (8) aaaaaa}obj[NB_OBJ]; (1) La macro NB_OBJ
donne un nombre d’objets qui sont des structures. (4) « mdx » et « mdy » sont les variables pour le vecteur dit « maître » à savoir la direction par défaut que prend l’entité lorsqu’elle n’est soumise à aucune influence. (5) « adx » et « ady » correspondent à la direction courante d’une entité soumise ou non à influence. (6) « resdx » et « resdy » sont des variables qui stockent des valeurs intermédiaires de directions pendant le calcul des influences mutuelles entre entités. (7) Schéma identique à celui du déplacement pour la couleur avec « mcol » pour la couleur maîtresse, « acol » pour la couleur courante et « rescol » pour les calculs intermédiaires. En dehors du tableau de structures quelques macros habituelles, pour la taille de l’écran et l’obtention d’un nombre pseudo-aléatoire avec un modulo. aaaaaa#define
ECRAN_X 800 La fonction
d’initialisation aaaaaavoid
initialisation(void) 3. Processus générateur
aaaaaa(…)
(1) aaaaaavoid
calcul(void) (2) aaaaaaaaaaaafor
( n=0 ; n < NB_OBJ; n++ ){ aaaaaaaaaaaaaaaaaaaaaaaaaaady
= abs ( obj[ n ].y - obj[ i ].y ); (6) aaaaaaaaaaaaaaaaaaaaaaaadist
= dx*dx+dy*dy; (1) La fonction « calcul » ne renvoie pas de valeur et n’a pas de paramètre. Elle utilise quelques variables locales, des entiers. (2) La première
boucle for donne accès à chaque entité. (3) Dans le cas où
le bloc précédent n’est pas exécuté,
il s’agit de trouver l’entité la plus proche de l’entité
n parmi les autres. La variable locale « mindist » est initialisée
sur le carré de la distance horizontale la plus grande, la taille
de l’écran. Chaque distance plus petite trouvée sera
stockée à la place de la précédente de façon
à ce que reste la plus petite à la fin. (5) Il s’agit de calculer la distance de l’entité n à chaque entité i. La distance horizontale est donnée par la soustraction des coordonnées horizontales de chaque entité, de même pour la distance verticale avec les coordonnées verticales. Puisqu’il s’agit de comparer les distances indépendamment des orientations, ce sont les valeurs absolues de l’objet n à l’objet i pour l’horizontale et la verticale qui sont retenues. Précisons que l’espace de l’écran est considéré comme circulaire. Les bords se rejoignent et se touchent. Sortir à gauche fait rentrer à droite et réciproquement, et de même entre haut et bas. Si donc la distance trouvée est supérieurs à la moitié de l’écran c’est que les deux entités sont plus proches en passant « par derrière ». Cette nouvelle distance est obtenue en soustrayant l’ancienne à la distance maximum qui est la taille de l’écran. Ces aspects sont identiques pour les distances horizontale et verticale. (6) La variable «
dist » stocke le carré de l’hypoténuse et elle
est suivie d’un test à deux conditions. Tout d’abord
si la valeur de dist est inférieure à la valeur stockée
dans mindist c’est que l’on a trouvé plus près.
Mais également il y a une autre contrainte qui varie avec la position
verticale de la souris. (7) Une fois la distance
de l’entité n à toutes les entités i comparées,
le résultat, l’entité i la plus proche de n se trouve
dans la variable resobj à moins qu’aucune entité n’est
été trouvée, ce qui est possible si « mouse_y
» est très élevé avec la souris en permanence
vers le bas de l’écran. Dans ce cas resobj est toujours égale
à -1. Dans le cas contraire, c’est la confrontation entre
les deux entités.
(1) aaaaaavoid
affiche (BITMAP*bmp) (1) La fonction « affiche » ne renvoie pas de valeur. Elle a un pointeur BITMAP* comme paramètre. C’est l’image bitmap de référence en mémoire avant copie dans la mémoire vidéo pour l’écran. Le premier appel de fonction consiste à effacer le contenu de cette bitmap. (2) Boucle for qui passe en revue toutes les entités. Pour chacune d’entre elles le résultat du calcul est copié dans la valeur courante pour les variables de déplacement et de couleur. (3) La nouvelle position (x, y) est calculée en respectant la circularité de l’écran. (4) Affichage de l’entité sous la forme d’un petit carré de cinq pixels de côté de la couleur courante. (5) Après la boucle et l’affichage des entités, affichage de la position souris à travers une ligne horizontale pour la position horizontale et une ligne verticale pour la position verticale. Enfin placage à l’écran du résultat avec appel à la fonction « blit ». |
![]() |