voisinage.cpp 2.49 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
	unsigned int cellX = v.celluleCentre->abs;
	unsigned int cellY = v.celluleCentre->ord;
10
11
	unsigned int hauteur = r.getHauteur();
	unsigned int largeur = 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
18
19
20
21
22
			{
				int x = (cellY+i)%hauteur;
				if (x < 0)
					x = largeur + x;
				int y = (cellX+j)%largeur;
				if (y < 0)
					y = hauteur + y;
23
				v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
24
			}
Luning Yang's avatar
Luning Yang committed
25
26
}

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

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
34
35
	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++)
36
			if (i != 0 || j != 0)
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
37
38
39
40
41
42
43
			{
				int x = (cellY+i)%hauteur;
				if (x < 0)
					x = largeur + x;
				int y = (cellX+j)%largeur;
				if (y < 0)
					y = hauteur + y;
44
				v.voisinage.push_back(new Cellule(r.getReseau()[y][x]));
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
45
			}
Luning Yang's avatar
Luning Yang committed
46
47
48
}

Voisinage::~Voisinage() {
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
49
50
	for(auto& cel: voisinage)
		delete cel;
51
	voisinage.clear();
Maxime Goret's avatar
Maxime Goret committed
52
}
53

54
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) const { //définir get?
Maxime Goret's avatar
Maxime Goret committed
55
56
57
58
59
60
    v.voisinage = std::vector<Cellule*>();

    unsigned int abs = v.celluleCentre->abs;
    unsigned int ord = v.celluleCentre->ord;
    unsigned int hauteur = r.getHauteur();
    unsigned int largeur = r.getLargeur();
61

Maxime Goret's avatar
Maxime Goret committed
62
    for (size_t nb = 0; nb < coordonnees.size(); nb++){
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
63
        v.voisinage[nb] = new Cellule(r.getReseau()[(abs - coordonnees[nb].x)%hauteur] [(ord - coordonnees[nb].y)%largeur]);
Maxime Goret's avatar
Maxime Goret committed
64
    }
65
66
}

Maxime Goret's avatar
Maxime Goret committed
67
vector<Coordonnees> RegleVoisinageArbitraire::getVoisinage(const QTableWidget* grid)
Maxime Goret's avatar
Maxime Goret committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{
    vector<Coordonnees> coordonnees;
    int k = 0;

    for (unsigned int i = 0; i < 5; i++) {
        for (unsigned int j = 0; j < 5; j++){
            if (grid->item(i,j)->background() == Qt::red){
               coordonnees[k].x = (2-i);
               coordonnees[k].y = (2-j);
               k += 1;
            }
        }

      }

    return coordonnees;
}