voisinage.cpp 2.51 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){
7
8
9
10
	if(rayon >= 0)
		r = rayon;
	else
		throw ("Rayon incorrect !\n");
Luning Yang's avatar
Luning Yang committed
11
12
}

13
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) {
Maxime Goret's avatar
Maxime Goret committed
14
	v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
15
16
17
	int nb = 0;
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
18
19
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();
Luning Yang's avatar
Luning Yang committed
20

21
22
23
24
	for (int i = -v.r; i <= v.r; i++)
		for (int j = -v.r; j <= v.r; j++)
			if (abs(i) + abs(j) <= v.r && i != 0 && j != 0)
				v.voisinage.push_back(&r.getReseau()[(abs+i)%hauteur][(ord+j)%largeur]);
Luning Yang's avatar
Luning Yang committed
25
26
}

27
28
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) {
	v.voisinage = std::vector<Cellule*>();
Luning Yang's avatar
Luning Yang committed
29
30
31
	int nb = 0;
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
32
33
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();
Maxime Goret's avatar
Maxime Goret committed
34

35
36
37
38
	for (int i = -v.r; i <= v.r; i++)
		for (int j = -v.r; j <= v.r; j++)
			if (abs(i) <= v.r && abs(j) <= v.r && i != 0 && j != 0)
				v.voisinage.push_back(&r.getReseau()[(abs+i)%hauteur][(ord+j)%largeur]);
Luning Yang's avatar
Luning Yang committed
39
40
41
}

Voisinage::~Voisinage() {
42
	voisinage.clear();
Maxime Goret's avatar
Maxime Goret committed
43
}
44

Boris Cazic's avatar
Boris Cazic committed
45
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) { //définir get?
Maxime Goret's avatar
Maxime Goret committed
46
	v.voisinage = std::vector<Cellule*>();
47
48
49
50
51
52
	
	unsigned int abs = v.celluleCentre->abs;
	unsigned int ord = v.celluleCentre->ord;
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = r.getLargeur();

Luning Yang's avatar
Luning Yang committed
53
	for (int nb = 0; nb < coordonnees.size(); nb++){
54
		v.voisinage[nb] = &r.getReseau()[abs - coordonnees[nb].getx()] [ord - coordonnees[nb].gety()];
55
56
57
	}
}

Luning Yang's avatar
Luning Yang committed
58
Coordonnees RegleVoisinageArbitraire::getVoisinage(const Reseau& r) {
59
60
61
62
63
	
	vector<Coordonnees> coordonnees;

	Cellule* cellulecentre = getCelluleCentre();
	
Maxime Goret's avatar
Maxime Goret committed
64
65
66
67
68
69
70
71
72
73
74

	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";
		}
75
		if (i < r.getHauteur() && j < r.getLargeur()) {
Luning Yang's avatar
Luning Yang committed
76
77
			coordonnees[k].x = cellulecentre->abs - i;
			coordonnees[k].y = cellulecentre->ord - j;
78
		}
Maxime Goret's avatar
Maxime Goret committed
79
	}
80
81
82

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

Maxime Goret's avatar
Maxime Goret committed
87
}