voisinage.cpp 5.2 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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
	}
}

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);
	}
}

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;
	}
}

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
53
54
55
	}
}

void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) {
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();
Luning Yang's avatar
Luning Yang committed
62
63
64
65
66

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

				if ((ord - j) < 0) {
71
					v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
72
73
					nb++;
					if ((abs - i >= 0)) {
74
						v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
75
76
						nb++;

77
						v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
78
79
80
						nb++;
					}
					else {
81
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
82
83
						nb++;

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

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

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

103
						v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
						nb++;
					}
				}
				if (nb >= nbVoisin) {
					break;
					break;
				}
			}

		}

	}
}

void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r){
Maxime Goret's avatar
Maxime Goret committed
119
    v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
120
121
122
	int nb = 0;
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
123
124
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();
Luning Yang's avatar
Luning Yang committed
125
126
127

	for (int i = 1; i <= v.r; i++) {
		for (int j = 1; j <= i; j++) {
128
			v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
129
130
131
132
			nb++;

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

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

139
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
140
141
142
					nb++;
				}
				else {
143
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
144
145
					nb++;

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

149
					v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
150
151
152
153
154
					nb++;
				}
			}
			else {
				if ((ord - j) < 0) {
155
					v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
Luning Yang's avatar
Luning Yang committed
156
157
					nb++;

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

161
					v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
Luning Yang's avatar
Luning Yang committed
162
163
164
					nb++;
				}
				else {
165
					v.voisinage[nb] = &r.getReseau()[abs - i][ord - j];
Luning Yang's avatar
Luning Yang committed
166
167
					nb++;

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

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

				}
			}
		}

	}
Luning Yang's avatar
Luning Yang committed
179
180
181
}

Voisinage::~Voisinage() {
Maxime Goret's avatar
Maxime Goret committed
182
    voisinage.clear();
Maxime Goret's avatar
Maxime Goret committed
183
}
184

Boris Cazic's avatar
Boris Cazic committed
185
Voisinage RegleVoisinageArbitraire::getVoisinage(const Reseau& reseau, Coordonnees position) const {}
186

Maxime Goret's avatar
Maxime Goret committed
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) {
	v.voisinage = std::vector<Cellule*>();

	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";
		}
		if (i < r.getHauteur() && j < r.getLargeur())
			v.voisinage[k] = &r.getReseau()[i][j];
	}
}