GOL
Game Of Life
|
Moteur de simulation d'un automate cellulaire à 2 dimensions. More...
#include <GOL.h>
Classes | |
struct | Author |
Le type représentant les informations permettant d'identifier les auteurs de l'implémentation. More... | |
struct | Color |
Le type représentant une couleur. More... | |
struct | ImplementationInformation |
Le type représentant les informations documentant l'implémentation. More... | |
struct | Statistics |
Le type représentant des données statistiques de la simulation. More... | |
Public Types | |
enum class | State : uint8_t { dead = 0 , alive = 1 } |
Le type représentant l'état d'une cellule. More... | |
enum class | BorderManagement : uint8_t { immutableAsIs = 0 , foreverDead , foreverAlive , warping , mirror } |
Le type représentant la stratégie de gestion de bord. More... | |
using | IterationType = uint32_t |
Le type représentant le nombre d'itération de la simulation. | |
using | ColorChannelType = uint8_t |
Le type représentant un canal de couleur. | |
Public Member Functions | |
GOL ()=default | |
Constructeur par défaut. | |
GOL (size_t width, size_t height, State defaultState=State::dead) | |
Constructeur d'initialisation personnalisé. | |
virtual | ~GOL ()=default |
Destructeur. | |
virtual size_t | width () const =0 |
Accesseur retournant la largeur de la grille de simualtion. | |
virtual size_t | height () const =0 |
Accesseur retournant la hauteur de la grille de simualtion. | |
virtual size_t | size () const =0 |
Accesseur retournant le nombre total de cellules de la grille de simualtion. | |
virtual State | state (int x, int y) const =0 |
Accesseur retournant l'état d'une cellule. | |
virtual std::string | rule () const =0 |
Accesseur retournant la chaîne de caractères correspondant à la règle courante. | |
virtual BorderManagement | borderManagement () const =0 |
Accesseur retournant la stratégie courante de gestion des bords. | |
virtual Color | color (State state) const =0 |
Accesseur retournant la couleur d'un état. | |
virtual Statistics | statistics () const =0 |
Accesseurs retournant des informations générales sur la simulation en cours. | |
virtual ImplementationInformation | information () const =0 |
Accesseurs retournant les informations sur la réalisation de l'implémentation. | |
virtual void | resize (size_t width, size_t height, State defaultState=State::dead)=0 |
Mutateur modifiant la taille de la grille de simulation. | |
virtual bool | setRule (std::string const &rule)=0 |
Mutateur modifiant la règle de la simulation. | |
virtual void | setBorderManagement (BorderManagement borderManagement)=0 |
Mutateur modifiant la stratégie de gestion de bord. | |
virtual void | setState (int x, int y, State state)=0 |
Mutateur modifiant l'état d'une cellule de la grille. | |
virtual void | fill (State state=State::dead)=0 |
Mutateur remplissant de façon uniforme toutes les cellules de la grille. | |
virtual void | fillAlternately (State firstCell=State::dead)=0 |
Mutateur remplissant de façon alternée toutes les cellules de la grille. | |
virtual void | randomize (double percentAlive=0.5)=0 |
Mutateur remplissant de façon aléatoire toutes les cellules de la grille. | |
virtual bool | setFromPattern (std::string const &pattern, int centerX, int centerY)=0 |
Mutateur remplissant la grille par le patron passé en argument. | |
virtual bool | setFromPattern (std::string const &pattern)=0 |
Mutateur remplissant la grille par le patron passé en argument. | |
virtual void | setSolidColor (State state, Color const &color)=0 |
Mutateur modifiant la couleur d'un état. | |
virtual void | processOneStep ()=0 |
Fonction effectuant une itération de la simulation. | |
virtual void | updateImage (uint32_t *buffer, size_t buffer_size) const =0 |
Fonction dessinant l'état de la simulation sur une image passée en paramètre. | |
Moteur de simulation d'un automate cellulaire à 2 dimensions.
La classe GOL représente une interface standardisée visant l'implémentation complète et suffisante d'un engin de simulation d'un automate cellulaire à 2 dimensions.
Cette classe abstraite ne fait rien et ne possède aucun attribut. Elle ne constitue qu'un modèle standardisé pouvant être facilement utilisé pour réaliser une simulation.
La classe possède :
L'approche utilisée est donc un parfait exemple d'un développement modulaire s'appuyant sur le polymorphisme. Néanmoins, pour rester critique, cette classe présente un défaut de conception du fait qu'elle réalise beaucoup trop de tâches à elle seule. Un découpage mieux structuré serait préférable considérant un projet d'envergure. La forme actuelle de cette conception vise à mettre l'emphase du développement sur les objetifs du projet sans être dérangé par d'autres aspects : conception et implémentation de structures de données et d'algorithmes.
Puisque cette classe est abstraite, elle est destiné à être héritée afin que vous implémentiez entièrement un engin de type automate cellulaire répondant strictement à l'interface présentée.
Éléments importants :
B3/S23
B###.../S###...
using GOL::ColorChannelType = uint8_t |
Le type représentant un canal de couleur.
Le type choisi est un entier non signé de 8 bits.
using GOL::IterationType = uint32_t |
Le type représentant le nombre d'itération de la simulation.
Le type choisi est un entier non signé de 32 bits.
|
strong |
Le type représentant la stratégie de gestion de bord.
L'algorithme de simulation doit gérer les effets de bord. C'est-à-dire que les calculs de voisinage doivent être adaptés pour les cellules situées sur les bords de la grille.
5 modes de gestion sont possibles.
|
strong |
|
pure virtual |
Accesseur retournant la stratégie courante de gestion des bords.
Accesseur retournant la couleur d'un état.
Cette fonction retourne la couleur associée à l'état passé en argument.
state | L'état dont on veut connaître la couleur. |
|
pure virtual |
Mutateur remplissant de façon uniforme toutes les cellules de la grille.
Cette fonction remplit toutes les cellules de la grille avec l'état passé en argument.
L'itération courante est remise à 0.
state | L'état d'initialisation des cellules. |
|
pure virtual |
Mutateur remplissant de façon alternée toutes les cellules de la grille.
Cette fonction remplit toutes les cellules de la grille avec un motif en damier. La première cellule, en haut à gauche, est de l'état passée en argument.
L'itération courante est remise à 0.
firstCell | L'état de la première cellule. |
|
pure virtual |
Accesseur retournant la hauteur de la grille de simualtion.
|
pure virtual |
Accesseurs retournant les informations sur la réalisation de l'implémentation.
Retourne plusieurs informations sur la réalisation de l'implémentation. Chaque valeur est optionnelle et peut être indéterminée.
En quelque sorte, c'est l'approche utilisée pour produire un mini rapport utilitaire.
Voir la documentation liée à la structure ImplementationInformation pour plus de détails.
Pour les réponses 'answers', l'objectif est d'utiliser clairement le vocabulaire technique approprié tout en étant très concis et très précis.
|
pure virtual |
Fonction effectuant une itération de la simulation.
Cette fonction constitue la partie centrale de la simulation. Elle est responsable de faire évoluer la grille d'une itération.
Cette fonction doit appliquer la logique de l'automate cellulaire en tenant compte pour chaque cellule :
Après l'appel de cette fonction, la grille est mise à jour avec le nouvel état de chaque cellule suivant l'état précédent. Les statistiques doivent tenir compte de cette évolution.
|
pure virtual |
Mutateur remplissant de façon aléatoire toutes les cellules de la grille.
Cette fonction remplit toutes les cellules de la grille avec un motif aléatoire. Le pourcentage de probabilité d'une cellule d'être vivante est passé en argument.
L'itération courante est remise à 0.
percentAlive | Le pourcentage de probabilité d'une cellule d'être vivante. La valeur doit être comprise entre 0.0 et 1.0 inclusivement. |
|
pure virtual |
Mutateur modifiant la taille de la grille de simulation.
Cette fonction réinitialise la taille et le contenu de la grille. La taille est spécifié peut être 0 x 0. Le contenu de la grille est entièrement mis à l'état passé en argument.
Cette fonction s'assure que si l'une des dimensions est 0, alors les deux sont mises à 0.
L'ancient motif de la grille est perdu. L'itération courante est remise à 0.
width | La nouvelle largeur de la grille. |
height | La nouvelle hauteur de la grille. |
defaultState | L'état d'initialisation des cellules. |
|
pure virtual |
Accesseur retournant la chaîne de caractères correspondant à la règle courante.
La chaîne de caractères est de la forme "B###/S###".
B###.../S###...
.
|
pure virtual |
Mutateur modifiant la stratégie de gestion de bord.
Cette fonction assigne la nouvelle stratégie pour que les prochaines évolutions l'utilisent.
L'ancienne stratégie est perdue. L'itération courante est remise à 0.
Vous devez être en mesure de gérer les effets de bord selon 5 stratégies différentes :
Pour les 2 exemples suivants, la cellule analysée -*-
possède 3 voisins situés à l'extérieur de la grille 'x', 'y' et 'z'. Ces cellules sont substituées par les voisins opposés 'X', 'Y' et 'Z'.
BorderManagement::warping utilise les voisins opposés par rapport à la grille.
+---+---+---+---+---+ x | | | | | X | +---+---+---+---+---+ y |-*-| | | | Y | +---+---+---+---+---+ z | | | | | Z |
BorderManagement::mirror utilise les voisins opposés par rapport à la cellule.
+---+---+---+---+---+ x | | X | | | | +---+---+---+---+---+ y |-*-| Y | | | | +---+---+---+---+---+ z | | Z | | | |
borderManagement | La nouvelle stratégie de gestion de bord. |
|
pure virtual |
Mutateur remplissant la grille par le patron passé en argument.
Cette fonction est une surcharge utilitaire de la fonction setFromPattern(std::string const & pattern, int centerX, int centerY). Cette version utilise le centre de la grille comme centre du patron.
L'itération courante est remise à 0.
pattern | Le patron à appliquer. |
|
pure virtual |
Mutateur remplissant la grille par le patron passé en argument.
Cette fonction remplit la grille avec le patron donné. Le patron est centré sur la coordonnées (centerX, centerY).
Le patron respecte un format précis. Se référer à l'énoncé pour voir tous les détails.
Si le patron n'est pas valide, la grille n'est pas modifiée et on retourne false. Sinon, on retourne vrai.
L'itération courante est remise à 0.
pattern | Le patron à appliquer. |
centerX | La coordonnée en x de la grille où se trouve centré le patron. |
centerY | La coordonnée en y de la grille où se trouve centré le patron. |
|
pure virtual |
Mutateur modifiant la règle de la simulation.
Cette fonction s'assure que la chaîne de caractères est valide et assigne la nouvelle règle pour que les prochaines évolutions l'utilisent.
Si la règle est valide, on assigne la novuelle règle, l'ancienne règle est perdue et l'itération courante est remise à 0. Si la règle est invalide, on ne fait rien.
La simulation doit être en mesure de supporté les règles valides.
Les règles sont définies par une chaîne de caractère suivant ce format: B###.../S###...
, par exemple : B3/S23
.
B
(minuscule ou majuscule) débute la section 'B'orn concernant les états morts qui naissent/
(slash) qui indique la transition vers la section suivante.S
(minuscule ou majuscule) débute la section 'S'urvive concernant les états vivants qui survivent (qui restent vivantes).Par exemple : B02/S1357
indique que :
La règle de Conway B3/S23
est celle par défaut.
Mutateur modifiant la couleur d'un état.
Cette fonction modifie la couleur d'un état.
Formellement, cette fonction ne modifie rien en soit mais plutôt permet de stocker quelle couleur utiliser pour représenter un état lors de l'affichage de la grille sur une image.
state | L'état dont on veut modifier la couleur. |
color | La nouvelle couleur de l'état. |
|
pure virtual |
Mutateur modifiant l'état d'une cellule de la grille.
Cette fonction ne valide pas les entrées pour une raison de performance. L'origine est le coin supérieur gauche de la grille.
x | La coordonnée en x de la cellule. |
y | La coordonnée en y de la cellule. |
state | Le nouvel état de la cellule. |
|
pure virtual |
Accesseur retournant le nombre total de cellules de la grille de simualtion.
|
pure virtual |
Accesseur retournant l'état d'une cellule.
Cette fonction ne valide pas les entrées pour une raison de performance. L'origine est le coin supérieur gauche de la grille.
x | La coordonnée en x de la cellule. |
y | La coordonnée en y de la cellule. |
|
pure virtual |
Accesseurs retournant des informations générales sur la simulation en cours.
Retourne plusieurs informations sur la simulation. Chaque valeur est optionnelle et peut être indéterminée.
Voir la documentation liée à la structure Statistics pour plus de détails.
Toutefois, les tendances sont définies ainsi :
|
pure virtual |
Fonction dessinant l'état de la simulation sur une image passée en paramètre.
Cette fonction dessine l'état courant de chaque cellule sur l'image donnée. Chaque pixel de l'image correspond à une cellule de la grille de simulation.
La couleur de chaque pixel est déterminée par la couleur associée à l'état de la cellule.
L'organisation en mémoire est ce qu'on appel 'Packed Pixel' suivant l'ordre ARGB. Ainsi, toutes les données d'un pixel est contiguë en mémoire. Les 4 canaux de couleurs sont stockés dans un entier non signé de 32 bits. Chaque canal est codé sur 8 bits. Le canal alpha est le plus significatif et le canal bleu est le moins significatif.
La variable buffer pointe vers un tableau de pixels de taille buffer_size. La taille de l'image est donc buffer_size / sizeof(uint32_t).
[ 32 bits ] [8 bits][8 bits][8 bits][8 bits] [alpha ][red ][green ][blue ] [alpha ][rouge ][vert ][bleu ]
Vous pouvez considérer que l'image a été créée avec le format de Qt QImage::Format_ARGB32.
Il est attendu que vous fassiez une validation minimum des intrants.
buffer | Le tableau de pixels de l'image. |
buffer_size | La taille du tableau de pixels. |
|
pure virtual |
Accesseur retournant la largeur de la grille de simualtion.