Feb.05

Un escargot dans une matrice !!!

Titre un peu surprenant je vous l’accorde 🙂

Dans le cadre de mon projet SimImmuno II, j’ai besoin de connaître quelles sont les cellules qui avoisine une cellule donnée. Pour cela, chaque cellule est placée dans une matrice (tableau à deux dimensions !).

Le but de l’algorithme est de parcourir cette matrice à partir d’un point donnée (la position de la cellule) en tournant autour comme un escargot.

Petit exemple illustré :

Pour ne penser qu’à l’algorithme oublions les histoires de cellule. Prenons un tableau de 100×100 avec un point de référence aux coordonnées 50;50.

Nous voulons juste récupérer les coordonnées des positions autour de notre point de référence qu’empruntera notre escargot (Il suffira après de tester si aux coordonnées visitées il y a ou pas la présence d’une cellule).

Dans notre cas, les coordonnées à visiter sont : 50;49, 51;49, 51;50, 51;51, 50;51, 49;51, 49;50, 49;49, etc…

Si l’on illustre ça par le schéma :

On peut observer que l’on avance de x cases suivant notre avancement par multiple de 2 : 2 fois 1case, 2fois 2cases, 2fois 3cases, 2fois 4 cases, etc… L’on appellera cela le nombre de pas qui s’incrémentera tous les 2 avancement. Puis l’on « tourne » : Haut->Droit->Bas->Gauche->Haut->etc…

Pour coder ca en c#, définissions tout d’abord une énumération pour la direction :

Nous allons maintenant créer une fonction Tourner qui prend en argument la direction précédente et retourne la nouvelle direction de cette maniere : Haut->Droit->Bas->Gauche->Haut->etc.. Ce qui nous ammene à écrire :

Maintenant, il nous faut une fonction nous permettant de nous renvoyer les coordonnées de la prochaine position en fonction de la position précédente, du nombre de pas et de la direction (a noter que les positions sont matérialisés par l’objet Point possédant les propriétés X et Y) :

Une fois tout cela créé, il nous reste plus qu’a créer la fonction principale du programme composée de 3 boucles :

  • La 1er, boucle de 0 au nombre de pas (nommé jump) et calcule les prochaines positions.
  • La 2eme, boucle de 0 a 2 et appelle la 1er boucle, incrémente jump puis appelle la fonction Tourner
  • Enfin la dernière, de 0 a X où X le point d’arrêt.

Le code donne :

Et voila le tour est joué ! Si l’on s’amuse a mettre le code :

à l’endroit de Insérer le code voulu ! nous obtenons :

Facile non ? 🙂

Dev,Algo,.NET