neighborhoodrule.hpp 2.09 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
\file neighborhoodrule.hpp
\date 15/04/2021
\author Yann Boucher
\version 1
\brief NeighborhoodRule

Cette classe représente le concept d'une règle de voisinage comme Von Neumann ou Margolus. Pour une grille et une position données, elle renvoie l'ensemble de ses voisins sous la forme d'une structure 'Neighbor'.
Cette classe peut aussi fournir l'ensemble des positions de voisins qu'elle peut potentiellement retourner.

**/

#ifndef NEIGHBORHOODRULE_HPP
#define NEIGHBORHOODRULE_HPP

#include <vector>

#include "coord.hpp"
19
20
#include "grid.h"
#include "neighborhood.hpp"
21
#include "factory.hpp"
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

/**
\struct NeighborhoodFormat
\brief Représente un format de voisinage

Cette structure représente un format possible de voisinage pouvant être renvoyé par NeigbhorhoodRule.
Son unique membre 'positions' contient la liste des coordonées des voisins d'une cellule donnée, selon cette règle.
**/
struct NeighborhoodFormat
{
    std::vector<Coord> positions;
};

class NeighborhoodRule
{
public:
    //! \brief Retourne l'ensemble des voisins d'une cellule de position 'pos' sur la grille 'grid' sous la forme d'une structure 'Neighborhood'
    //! \return L'ensemble des voisins de la cellule à 'pos'
    virtual Neighborhood getNeighborhood(const Grid& grid, Coord pos) const = 0;

    //! \brief Retourne l'ensemble des formats pouvant être renvoyés par cette règle. Dans la majorité des cas, une règle ne retourne qu'un seul voisinage; cette méthode existe pour pouvoir gérer les cas comme le voisinage de Margolus, qui varie selon la parité de la génération.
    //! \return Retourne les formats de voisinage possible dans un std::vector.
    virtual std::vector<NeighborhoodFormat> getFormats() const = 0;
Yann Boucher's avatar
Yann Boucher committed
45
46
47
48
49

    //! \brief Fait avancer l'état de la règle de voisinage d'une génération
    // Fait avancer l'état de la règle de voisinage d'une génération. Cette fonction est utilisée pour les voisinages tels que celui de Margolus, qui dépendent de la parité de la génération actuelle.
    // \remark L'implémentation par défaut ne fait rien.
    virtual void step() {}
50
51
52
};

#endif // NEIGHBORHOODRULE_HPP