voisinage.cpp 2.82 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

6
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) const {
Maxime Goret's avatar
Maxime Goret committed
7
	v.voisinage = std::vector<Cellule*>();
8
9
10
11
	int cellX = static_cast<int>(v.celluleCentre->abs);
	int cellY = static_cast<int>(v.celluleCentre->ord);
	int hauteur = static_cast<int>(r.getHauteur());
	int largeur = static_cast<int>(r.getLargeur());
Luning Yang's avatar
Luning Yang committed
12

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
13
14
	for (int i = -static_cast<int>(rayon); i <= static_cast<int>(rayon); i++)
		for (int j = -static_cast<int>(rayon); j <= static_cast<int>(rayon); j++)
15
			if (abs(i) + abs(j) <= static_cast<int>(rayon) && (i != 0 || j != 0))
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
16
			{
17
				int x = (cellY+i)%largeur;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
18
19
				if (x < 0)
					x = largeur + x;
20
				int y = (cellX+j)%hauteur;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
21
22
				if (y < 0)
					y = hauteur + y;
23
24
25
26
				if(this->getMatriceTorique())
					v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
				else if (x == cellY+i && y == cellX+j)
					v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
27
			}
Luning Yang's avatar
Luning Yang committed
28
29
}

30
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const {
31
	v.voisinage = std::vector<Cellule*>();
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
32
33
	int cellX = static_cast<int>(v.celluleCentre->abs);
	int cellY = static_cast<int>(v.celluleCentre->ord);
34
35
	int hauteur = static_cast<int>(r.getHauteur());
	int largeur = static_cast<int>(r.getLargeur());
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
36

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
37
38
	for (int i = -static_cast<int>(rayon); i <= static_cast<int>(rayon); i++)
		for (int j = -static_cast<int>(rayon); j <= static_cast<int>(rayon); j++)
39
			if (i != 0 || j != 0)
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
40
			{
41
				int x = (cellY+i)%largeur;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
42
43
				if (x < 0)
					x = largeur + x;
44
				int y = (cellX+j)%hauteur;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
45
46
				if (y < 0)
					y = hauteur + y;
47
48
49
50
				if(this->getMatriceTorique())
					v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
				else if (x == cellY+i && y == cellX+j)
					v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
51
			}
Luning Yang's avatar
Luning Yang committed
52
53
54
}

Voisinage::~Voisinage() {
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
55
56
	for(auto& cel: voisinage)
		delete cel;
57
	voisinage.clear();
Maxime Goret's avatar
Maxime Goret committed
58
}
59

60
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) const { //définir get?
61
62
63
64
65
	v.voisinage = std::vector<Cellule*>();
	int cellX = static_cast<int>(v.celluleCentre->abs);
	int cellY = static_cast<int>(v.celluleCentre->ord);
	int hauteur = static_cast<int>(r.getHauteur());
	int largeur = static_cast<int>(r.getLargeur());
66

67
68
69
70
71
72
73
74
75
	for (size_t nb = 0; nb < coordonnees.size(); nb++){
		int x = (cellY+coordonnees[nb].y)%largeur;
		if (x < 0)
			x = largeur + x;
		int y = (cellX+coordonnees[nb].x)%hauteur;
		if (y < 0)
			y = hauteur + y;
		v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
	}
76
77
}

78
79
80
81
82
83
84
85
86
87
88
void RegleVoisinageArbitraire::getVoisinage(const QTableWidget* grid) {
	Coordonnees coordonnee;
	for (unsigned int i = 0; i < 5; i++) {
		for (unsigned int j = 0; j < 5; j++){
			if (grid->item(i,j)->background() == Qt::red){
				coordonnee.x = (i - 2);
				coordonnee.y = (j - 2);
				coordonnees.push_back(coordonnee);
			}
		}
	}
Maxime Goret's avatar
Maxime Goret committed
89
}