voisinage.h 5.48 KB
Newer Older
Maxime Goret's avatar
Maxime Goret committed
1
//
Boris Cazic's avatar
Boris Cazic committed
2
//  voisinage.h
Maxime Goret's avatar
Maxime Goret committed
3
4
5
6
7
//  LO21-Projet
//
//  Created by Maxime Goret on 20/04/2021.
//

Boris Cazic's avatar
Boris Cazic committed
8
9
#ifndef voisinage_h
#define voisinage_h
Maxime Goret's avatar
Maxime Goret committed
10

Boris Cazic's avatar
Boris Cazic committed
11
12
#include"reseau_cellule_etats.h"
#include"coordonnees.h"
13
#include<cstdio>
Boris Cazic's avatar
Boris Cazic committed
14
15
16
#include<iostream>
#include<string>
#include<vector>
Maxime Goret's avatar
Maxime Goret committed
17
#include"parametragemodele.h"
18

19

Maxime Goret's avatar
Maxime Goret committed
20
21
using namespace std;

22
23
24
/// Classe conteneur d'un voisinage
///
/// Elle contient l'ensemble des voisins d'une cellule après application d'une règle de voisinage et définit la cellule au centre du voisinage
Maxime Goret's avatar
Maxime Goret committed
25
class Voisinage {
26
27
28
	private :
		const Cellule* celluleCentre;
		vector<Cellule*> voisinage;
Maxime Goret's avatar
Maxime Goret committed
29

30
31
32
33
34
		friend class RegleVoisinage;
		friend class RegleVoisinageMoore;
		friend class RegleVoisinageNeumann;
		friend class RegleVoisinageArbitraire;
		friend class VoisinageIterator;
Maxime Goret's avatar
Maxime Goret committed
35

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
	public:
		/// Classe d'itérateur sur les cellules contenus dans le voisinage
		class VoisinageIterator {
			const Voisinage *vsn;
			size_t i;

			public :
				///Construire un itérateur sur le voisinage
				VoisinageIterator(const Voisinage *v) { vsn = v; }
				/// place l'itérateur sur le premier élément
				void first() { i = 0; }
				/// placer l'itérateur sur l'élément suivant
				void next() { i++; }
				/// vérifier si les itérations sont terminées
				bool isDone() { return !(i < vsn->voisinage.size()); }
				/// Récupérer l'élément courant de l'itérateur
				Cellule* currentItem() { return vsn->voisinage[i]; }
		};

		Voisinage(const Cellule* centre): celluleCentre(centre) {}
		~Voisinage();
		/// Obtenir la cellule au centre du voisinage
		Cellule getCelluleCentre() const { return *celluleCentre; }
		/// Créer un itérateur sur les cellules du voisinage
		VoisinageIterator *creerIterator() const { return new VoisinageIterator(this); }
Maxime Goret's avatar
Maxime Goret committed
61
62
};

63
/// Classe mère abtraite de toutes les règles de voisinage
Maxime Goret's avatar
Maxime Goret committed
64
class RegleVoisinage{
65
66
67
	private:
		bool matriceTorique;

68
	public :
69
70
71
		/// Calculer un voisinage sur un réseau à partir de la règle
		/// @param[in] v Objet Voisinage dans lequel on souhaite stocker les voisins
		/// @param[in] r Réseau à partir duquel on souhaite calculer le voisinage
72
		virtual void calculVoisinage(Voisinage& v, const Reseau& r) const = 0;
73
74
75
		/// Obtenir le type de la règle de voisinage
		///
		/// Principalement utilisé pour la sauvegarde
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
76
		virtual int getType() const = 0;
77
		/// Renvoie le rayon d'une règle de voisinage, 0 si ce n'est pas pertinant pour ce voisinage (arbitraire, ...)
78
79
		///
		/// Principalement utilisé pour la sauvegarde
80
		virtual unsigned int getr() const { return 0; }
81
		virtual ~RegleVoisinage() = default;
82
83
84
85
		/// Définir le comportement aux frontières du voisinage
		///
		/// Si true, on se comporte comme une matrice torique, quand on arrive en haut on continu en utilisant les lignes du bas, de même pour quand on est à gauche ou à droite de la matrice
		/// Si false, on ne prend pas en compte les voisins au delà de la matrice affichée.
86
		/// @param[in] val valeur de la propriété
87
		void setMatriceTorique(const bool val) { matriceTorique = val; }
88
		/// Obtenir l'état du comportement aux frontières
89
		bool getMatriceTorique() const { return matriceTorique; }
Maxime Goret's avatar
Maxime Goret committed
90
91
};

92
/// Règle générale pour un voisinage de Von Neumann
Luning Yang's avatar
Luning Yang committed
93
class RegleVoisinageNeumann : public RegleVoisinage {
94
95
	private:
		unsigned int rayon;
96
	public:
97
98
99
		/// Calculer un voisinage sur un réseau à partir de la règle
		/// @param[in] v Objet Voisinage dans lequel on souhaite stocker les voisins
		/// @param[in] r Réseau à partir duquel on souhaite calculer le voisinage
100
		void calculVoisinage(Voisinage& v, const Reseau& r) const override;
101
		/// Définir le rayon du voisinage
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
102
		void setr(unsigned int r) { rayon = r; }
103
104
105
106
107
108
		/// Obtenir le rayon du voisinage
		unsigned int getr() const override { return rayon; }
		/// Obtenir le type de la règle de voisinage
		///
		/// Principalement utilisé pour la sauvegarde
		int getType() const override { return 1; }
Maxime Goret's avatar
Maxime Goret committed
109
110
};

111
/// Règle générale pour un voisinage de Moore
Maxime Goret's avatar
Maxime Goret committed
112
class RegleVoisinageMoore : public RegleVoisinage {
113
114
	private:
		unsigned int rayon;
115
	public:
116
117
118
		/// Calculer un voisinage sur un réseau à partir de la règle
		/// @param[in] v Objet Voisinage dans lequel on souhaite stocker les voisins
		/// @param[in] r Réseau à partir duquel on souhaite calculer le voisinage
119
		void calculVoisinage(Voisinage& v, const Reseau& r) const override;
120
		/// Définir le rayon du voisinage
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
121
		void setr(unsigned int r) { rayon = r; }
122
123
124
125
126
127
		/// Obtenir le rayon du voisinage
		unsigned int getr() const override { return rayon; }
		/// Obtenir le type de la règle de voisinage
		///
		/// Principalement utilisé pour la sauvegarde
		int getType() const override { return 2; }
Maxime Goret's avatar
Maxime Goret committed
128
};
Maxime Goret's avatar
Maxime Goret committed
129

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
///définit la règle pour le voisinage arbitraire
class RegleVoisinageArbitraire : public RegleVoisinage {
	public:
		/// Obtenir le type de la règle de voisinage
		///
		/// Principalement utilisé pour la sauvegarde
		int getType() const override{ return 3; }
		/// Obtenir le nombre de voisins de cette règle de voisinage
		unsigned int getNbVoisin() { return coordonnees.size(); }
		/// coordonnées relatives des voisins d'une cellule
		vector<Coordonnees> coordonnees;
		/// Calculer un voisinage sur un réseau à partir de la règle
		/// @param[in] v Objet Voisinage dans lequel on souhaite stocker les voisins
		/// @param[in] r Réseau à partir duquel on souhaite calculer le voisinage
		void calculVoisinage(Voisinage& v, const Reseau& r) const override;
		/// Obtenir les coordonnées relative d'un voisinage arbitraire en fonction d'un outil QTableWidget
146
		void getVoisinage(const QTableWidget* grid );
Boris Cazic's avatar
Boris Cazic committed
147
148
};

Boris Cazic's avatar
Boris Cazic committed
149
#endif /* voisinage_h */