voisinage.h 2.89 KB
Newer Older
Maxime Goret's avatar
Maxime Goret committed
1
//
Boris Cazic's avatar
Boris Cazic committed
2
//  voisinage.h
Maxime Goret's avatar
Maxime Goret committed
3
4
5
6
7
//  LO21-Projet
//
//  Created by Maxime Goret on 20/04/2021.
//

Boris Cazic's avatar
Boris Cazic committed
8
9
#ifndef voisinage_h
#define voisinage_h
Maxime Goret's avatar
Maxime Goret committed
10

Boris Cazic's avatar
Boris Cazic committed
11
12
#include"reseau_cellule_etats.h"
#include"coordonnees.h"
13
#include<cstdio>
Boris Cazic's avatar
Boris Cazic committed
14
15
16
#include<iostream>
#include<string>
#include<vector>
Maxime Goret's avatar
Maxime Goret committed
17
#include"parametragemodele.h"
18

19

Maxime Goret's avatar
Maxime Goret committed
20
21
22
23
24
using namespace std;

class Voisinage {
private :
    const Cellule* celluleCentre;
Maxime Goret's avatar
Maxime Goret committed
25
    vector<Cellule*> voisinage;
Maxime Goret's avatar
Maxime Goret committed
26
27
28
    friend class RegleVoisinage;
    friend class RegleVoisinageMoore;
    friend class RegleVoisinageNeumann;
Luning Yang's avatar
Luning Yang committed
29
    friend class RegleVoisinageArbitraire;
Maxime Goret's avatar
Maxime Goret committed
30
    friend class VoisinageIterator;
Luning Yang's avatar
Luning Yang committed
31
    
Maxime Goret's avatar
Maxime Goret committed
32
public:
Maxime Goret's avatar
Maxime Goret committed
33
34
35
    
    class VoisinageIterator {
        const Voisinage *vsn;
36
        size_t i;
Maxime Goret's avatar
Maxime Goret committed
37
38
39
40
41
42
43
        public :
        
        VoisinageIterator(const Voisinage *v){
            vsn = v;
        }
        
        void first(){
44
            i = 0;
Maxime Goret's avatar
Maxime Goret committed
45
46
47
48
49
50
        }
        
        void next(){
            i++;
        }
        bool isDone(){
Maxime Goret's avatar
Maxime Goret committed
51
            return (vsn->voisinage.size() <=  i);
Maxime Goret's avatar
Maxime Goret committed
52
53
54
55
56
57
        }
        Cellule* currentItem(){
            return vsn->voisinage[i];
        }
        
    };
Maxime Goret's avatar
Maxime Goret committed
58

59
    Voisinage(const Cellule* centre) : celluleCentre(centre) {}
Maxime Goret's avatar
Maxime Goret committed
60
    ~Voisinage();
Maxime Goret's avatar
Maxime Goret committed
61
    Cellule getCelluleCentre()const {return *celluleCentre;}
Maxime Goret's avatar
Maxime Goret committed
62

Maxime Goret's avatar
Maxime Goret committed
63
64
65
    VoisinageIterator *creerIterator()const{
        return new VoisinageIterator(this);
    }
Maxime Goret's avatar
Maxime Goret committed
66
67
68
69
    
};

class RegleVoisinage{
70
	public :
71
		virtual void calculVoisinage(Voisinage& v, const Reseau& r) const = 0;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
72
		virtual int getType() const = 0;
73
74
		/// Renvoie le rayon d'une règle de voisinage, 0 si ce n'est pas pertinant pour ce voisinage (arbitraire, ...)
		virtual unsigned int getr() const { return 0; }
Maxime Goret's avatar
Maxime Goret committed
75
76
};

Luning Yang's avatar
Luning Yang committed
77
class RegleVoisinageNeumann : public RegleVoisinage {
78
79
	private:
		unsigned int rayon;
80
	public:
81
		void calculVoisinage(Voisinage& v, const Reseau& r) const override;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
82
		void setr(unsigned int r) { rayon = r; }
Maxime Goret's avatar
Maxime Goret committed
83
84
        unsigned int getr() const override { return rayon; }
        int getType() const override { return 1; }
Maxime Goret's avatar
Maxime Goret committed
85
86
87
};

class RegleVoisinageMoore : public RegleVoisinage {
88
89
	private:
		unsigned int rayon;
90
	public:
91
		void calculVoisinage(Voisinage& v, const Reseau& r) const override;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
92
		void setr(unsigned int r) { rayon = r; }
Maxime Goret's avatar
Maxime Goret committed
93
94
        unsigned int getr() const override { return rayon; }
        int getType() const override { return 2; }
Maxime Goret's avatar
Maxime Goret committed
95
};
Maxime Goret's avatar
Maxime Goret committed
96

Boris Cazic's avatar
Boris Cazic committed
97
class RegleVoisinageArbitraire : public RegleVoisinage { //définit la règle pour le voisinage arbitraire
Maxime Goret's avatar
Maxime Goret committed
98
99
100
101
102
103
104
105
    private:
        unsigned int nbVoisin;
    public:
        int getType() const override{ return 3; }
        void setNbVoisins(unsigned int r) { nbVoisin = r; }
        unsigned int getNbVoisin() { return nbVoisin; }
        vector<Coordonnees> coordonnees;
        void calculVoisinage(Voisinage& v, const Reseau& r) const override; // Calcul du voisinage en fonction de la cellule centre
Maxime Goret's avatar
Maxime Goret committed
106
        vector<Coordonnees> getVoisinage(const QTableWidget* grid ); // Dééfinition des coordonnées relatives pour le calcul du voisinage
Boris Cazic's avatar
Boris Cazic committed
107
108
};

Boris Cazic's avatar
Boris Cazic committed
109
#endif /* voisinage_h */