voisinage.cpp 6.31 KB
Newer Older
Boris Cazic's avatar
Boris Cazic committed
1
2
3
4
#include"voisinage.h"
#include"reseau_cellule_etats.h"
#include<cmath>
#include<iostream>
Luning Yang's avatar
Luning Yang committed
5

Luning Yang's avatar
Luning Yang committed
6
void Voisinage::setr(unsigned int rayon){
Boris Cazic's avatar
Boris Cazic committed
7
8
   if(rayon >= 0)
        r = rayon;
Luning Yang's avatar
Luning Yang committed
9
	else throw ("Rayon incorrect !\n");
Luning Yang's avatar
Luning Yang committed
10
11
12
	 
}

Luning Yang's avatar
Luning Yang committed
13
14
void RegleVoisinage::setNbVoisins(unsigned int r) {
	if (r == 0) { //voisinage arbitraire
Boris Cazic's avatar
Boris Cazic committed
15
16
        cout << "Entrez le nombre de voisins.\n";
        cin >> nbVoisin;
Luning Yang's avatar
Luning Yang committed
17
18
19
	}
}

Maxime Goret's avatar
Maxime Goret committed
20
21
22
23
24
25
26
//void RegleVoisinageNeumann::setNbVoisins(unsigned int r) {
//	if (r == 1) { // voisinage de von Neumann
//		nbVoisin = 4;
//	}
//	else { // voisiange de von Neumann avec un rayon
		//nbVoisin = 2 * r * (1 + r);
	//}
Luning Yang's avatar
Luning Yang committed
27
//}
Luning Yang's avatar
Luning Yang committed
28

Maxime Goret's avatar
Maxime Goret committed
29
30
31
32
33
34
35
36
//void RegleVoisinageMoore::setNbVoisins(unsigned int r) {
//	if (r == 1) { // voisinage de Moore
	//	nbVoisin = 8;
	//}
	//else { // voisiange de Moore avec un rayon
	//	nbVoisin = pow((2 * r + 1), 2) - 1;
	//}
//}
Luning Yang's avatar
Luning Yang committed
37
38

void RegleVoisinage::calculVoisinage(Voisinage& v, const Reseau& r) {
Maxime Goret's avatar
Maxime Goret committed
39
	v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
40
41
	for (int k = 0; k < nbVoisin; k++) {
		unsigned int i, j;
42
		while (i >= r.getHauteur() || j >= r.getLargeur()) {
43
            cout << "Entrez l'abscisse de la" << k << "ieme cellule.\n";
Boris Cazic's avatar
Boris Cazic committed
44
            cin >> i;
45
            cout << "Entrez l'ordonnee de la "<< k << "ieme cellule.\n";
Boris Cazic's avatar
Boris Cazic committed
46
            cin >> j;
47
			if (i >= r.getHauteur() || j >= r.getLargeur())
48
                cout << "Coordonnees incorrectes !\n";
Luning Yang's avatar
Luning Yang committed
49
		}
50
51
		if (i < r.getHauteur() && j < r.getLargeur())
			v.voisinage[k] = &r.getReseau()[i][j];
Luning Yang's avatar
Luning Yang committed
52
	}
Luning Yang's avatar
Luning Yang committed
53
}
Luning Yang's avatar
Luning Yang committed
54

Maxime Goret's avatar
Maxime Goret committed
55
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon) {
Maxime Goret's avatar
Maxime Goret committed
56
    v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
57
58
59
	int nb = 0;
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
60
61
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();
Maxime Goret's avatar
Maxime Goret committed
62
63
64
65
66
67
68
69
	
	if (rayon == 1) { // voisinage de von Neumann
		nbVoisin = 4;
	}
	else { // voisiange de von Neumann avec un rayon
		nbVoisin = 2 * r * (1 + r);
	}

Luning Yang's avatar
Luning Yang committed
70
71
72
73
74

	for (int i = 0; i < v.r; i++) {
		for (int j = 0; j < v.r; j++) {
			if ((i + j) <= v.r || (i + j) != 0) {
				
75
				v.voisinage[nb] = &r.getReseau()[(abs + i)%hauteur][(ord + j)%largeur];
Luning Yang's avatar
Luning Yang committed
76
77
78
				nb++;

				if ((ord - j) < 0) {
79
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
80
81
					nb++;
					if ((abs - i >= 0)) {
82
						v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
83
84
						nb++;

85
						v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
86
87
88
						nb++;
					}
					else {
89
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
90
91
						nb++;

92
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
93
94
95
96
						nb++;
					}
				}					
				else {
97
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
Luning Yang's avatar
Luning Yang committed
98
99
100
					nb++;

					if ((abs - i >= 0)) {
101
						v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
102
103
						nb++;

104
						v.voisinage[nb] = &r.getReseau()[abs - i][abs - j];
Luning Yang's avatar
Luning Yang committed
105
106
107
						nb++;
					}
					else {
108
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
109
110
						nb++;

111
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
						nb++;
					}
				}
				if (nb >= nbVoisin) {
					break;
					break;
				}
			}

		}

	}
}

Maxime Goret's avatar
Maxime Goret committed
126
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon){
Maxime Goret's avatar
Maxime Goret committed
127
    v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
128
129
130
	int nb = 0;
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
131
132
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();
Maxime Goret's avatar
Maxime Goret committed
133
134
135
136
137
138
139
140

	if (rayon == 1) { // voisinage de Moore
		nbVoisin = 8;
	}
	else { // voisiange de Moore avec un rayon
		nbVoisin = pow((2 * r + 1), 2) - 1;
	}

Luning Yang's avatar
Luning Yang committed
141
142
143

	for (int i = 1; i <= v.r; i++) {
		for (int j = 1; j <= i; j++) {
144
			v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
145
146
147
148
			nb++;

			if ((abs - i) < 0) {
				if ((ord - j) < 0) {
149
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
150
151
					nb++;

152
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
153
154
					nb++;

155
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
156
157
158
					nb++;
				}
				else {
159
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
160
161
					nb++;

162
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
Luning Yang's avatar
Luning Yang committed
163
164
					nb++;

165
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
166
167
168
169
170
					nb++;
				}
			}
			else {
				if ((ord - j) < 0) {
171
					v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
172
173
					nb++;

174
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
175
176
					nb++;

177
					v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
178
179
180
					nb++;
				}
				else {
181
					v.voisinage[nb] = &r.getReseau()[abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
182
183
					nb++;

184
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
Luning Yang's avatar
Luning Yang committed
185
186
					nb++;

187
					v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
188
189
190
191
192
193
194
					nb++;

				}
			}
		}

	}
Luning Yang's avatar
Luning Yang committed
195
196
197
}

Voisinage::~Voisinage() {
Maxime Goret's avatar
Maxime Goret committed
198
    voisinage.clear();
Maxime Goret's avatar
Maxime Goret committed
199
}
200
201


202
<<<<<<< HEAD
203
204
void calculVoisinage(Voisinage& v, const Reseau r, Coordonnees co){  
	
205
=======
Boris Cazic's avatar
Boris Cazic committed
206
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) { //définir get?
207
>>>>>>> d78cce4e7d49623a3ddb5aa18db685438295923d
Maxime Goret's avatar
Maxime Goret committed
208
	v.voisinage = std::vector<Cellule*>();
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
	
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();

	while (nb = 0, nb < coordonnees.size(), nb++){
		v.voisinage[nb] = &r.getReseau()[abs - co[nb].getx()] [ord - co[nb].gety()];
	}
}

coordonnes RegleVoisinageArbitraire::getVoisinage(const Reseau& r) {
	
	vector<Coordonnees> coordonnees;

	Cellule* cellulecentre = getCelluleCentre();
	
Maxime Goret's avatar
Maxime Goret committed
226
227
228
229
230
231
232
233
234
235
236

	for (int k = 0; k < nbVoisin; k++) {
		unsigned int i, j;
		while (i >= r.getHauteur() || j >= r.getLargeur()) {
			cout << "Entrez l'abscisse de la" << k << "ieme cellule.\n";
			cin >> i;
			cout << "Entrez l'ordonnee de la " << k << "ieme cellule.\n";
			cin >> j;
			if (i >= r.getHauteur() || j >= r.getLargeur())
				cout << "Coordonnees incorrectes !\n";
		}
237
238
239
240
		if (i < r.getHauteur() && j < r.getLargeur()) {
			coordonnees[k].x = cellulecentre.abs - i;
			coordonnees[k].y = cellulecentre.ord - j;
		}
Maxime Goret's avatar
Maxime Goret committed
241
	}
242
243
244

	return coordonnees;
	// While (!utilisateur clique sur bouton valider){
Luning Yang's avatar
Luning Yang committed
245
246
		//recuprer abs et ord de Cellule slectionne;
		//rentrer la diffrence des coordonnes dans le vecteur co
247
248
	//}

Maxime Goret's avatar
Maxime Goret committed
249
}