Verified Commit 0739b0fe authored by Romain De Laage De Bellefaye's avatar Romain De Laage De Bellefaye 🌳
Browse files

Simplify Neighbourhood

parent a0864f60
......@@ -69,43 +69,29 @@ public:
};
class RegleVoisinage{
private :
public :
unsigned int nbVoisin;
void setNbVoisins(unsigned int r);
unsigned int getNbVoisin() {return nbVoisin;}
virtual void calculVoisinage(Voisinage& v, const Reseau& r);
public :
virtual void calculVoisinage(Voisinage& v, const Reseau& r) = 0;
};
class RegleVoisinageNeumann : public RegleVoisinage {
public:
//void setNbVoisins(unsigned int r);
void calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon);
public:
void calculVoisinage(Voisinage& v, const Reseau& r) override;
};
class RegleVoisinageMoore : public RegleVoisinage {
public:
//void setNbVoisins(unsigned int r);
void calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon);
public:
void calculVoisinage(Voisinage& v, const Reseau& r) override;
};
class RegleVoisinageArbitraire : public RegleVoisinage { //définit la règle pour le voisinage arbitraire
public:
private:
unsigned int nbVoisin;
public:
void setNbVoisins(unsigned int r) { nbVoisin = r; }
unsigned int getNbVoisin() { return nbVoisin; }
vector<Coordonnees> coordonnees;
void calculVoisinage(Voisinage& v, const Reseau& r, const Coordonnees co) const; // Calcul du voisinage en fonction de la cellule centre
Coordonnees getVoisinage(const Reseau& r); // Dééfinition des coordonnées relatives pour le calcul du voisinage
};
#endif /* voisinage_h */
......@@ -6,53 +6,11 @@
void Voisinage::setr(unsigned int rayon){
if(rayon >= 0)
r = rayon;
else throw ("Rayon incorrect !\n");
else
throw ("Rayon incorrect !\n");
}
void RegleVoisinage::setNbVoisins(unsigned int r) {
if (r == 0) { //voisinage arbitraire
cout << "Entrez le nombre de voisins.\n";
cin >> nbVoisin;
}
}
//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) {
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];
}
}
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon) {
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) {
v.voisinage = std::vector<Cellule*>();
int nb = 0;
unsigned int abs = v.celluleCentre->abs;
......@@ -60,70 +18,13 @@ void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r, const
unsigned int hauteur = r.getHauteur();
unsigned int largeur = r.getLargeur();
if (rayon == 1) { // voisinage de von Neumann
nbVoisin = 4;
}
else { // voisiange de von Neumann avec un rayon
nbVoisin = 2 * r * (1 + r);
}
for (int i = 0; i < v.r; i++) {
for (int j = 0; j < v.r; j++) {
if ((i + j) <= v.r || (i + j) != 0) {
v.voisinage[nb] = &r.getReseau()[(abs + i)%hauteur][(ord + j)%largeur];
nb++;
if ((ord - j) < 0) {
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
nb++;
if ((abs - i >= 0)) {
v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
nb++;
v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
nb++;
}
else {
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
nb++;
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][largeur + ord - j];
nb++;
}
}
else {
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
nb++;
if ((abs - i >= 0)) {
v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
nb++;
v.voisinage[nb] = &r.getReseau()[abs - i][abs - j];
nb++;
}
else {
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
nb++;
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
nb++;
}
}
if (nb >= nbVoisin) {
break;
break;
}
}
}
}
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]);
}
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r, const unsigned int rayon){
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) {
v.voisinage = std::vector<Cellule*>();
int nb = 0;
unsigned int abs = v.celluleCentre->abs;
......@@ -131,80 +32,17 @@ void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r, const u
unsigned int hauteur = r.getHauteur();
unsigned int largeur = r.getLargeur();
if (rayon == 1) { // voisinage de Moore
nbVoisin = 8;
}
else { // voisiange de Moore avec un rayon
nbVoisin = pow((2 * r + 1), 2) - 1;
}
for (int i = 1; i <= v.r; i++) {
for (int j = 1; j <= i; j++) {
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][(ord + j) % largeur];
nb++;
if ((abs - i) < 0) {
if ((ord - j) < 0) {
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][largeur + ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
nb++;
}
else {
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[hauteur + abs - i][(ord + j) % largeur];
nb++;
}
}
else {
if ((ord - j) < 0) {
v.voisinage[nb] = &r.getReseau()[abs - i][largeur + ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][largeur + ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
nb++;
}
else {
v.voisinage[nb] = &r.getReseau()[abs - i][ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[(abs + i) % hauteur][ord - j];
nb++;
v.voisinage[nb] = &r.getReseau()[abs - i][(ord + j) % largeur];
nb++;
}
}
}
}
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]);
}
Voisinage::~Voisinage() {
voisinage.clear();
}
<<<<<<< HEAD
void calculVoisinage(Voisinage& v, const Reseau r, Coordonnees co){
=======
void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) { //définir get?
>>>>>>> d78cce4e7d49623a3ddb5aa18db685438295923d
v.voisinage = std::vector<Cellule*>();
unsigned int abs = v.celluleCentre->abs;
......@@ -213,7 +51,7 @@ void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) {
unsigned int largeur = r.getLargeur();
for (int nb = 0; nb < coordonnees.size(); nb++){
v.voisinage[nb] = &r.getReseau()[abs - co[nb].getx()] [ord - co[nb].gety()];
v.voisinage[nb] = &r.getReseau()[abs - coordonnees[nb].getx()] [ord - coordonnees[nb].gety()];
}
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment