voisinage.h 2.93 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(){
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
51
            return !(i < vsn->voisinage.size());
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; }
75
		virtual ~RegleVoisinage() = default;
Maxime Goret's avatar
Maxime Goret committed
76
77
};

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

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

Boris Cazic's avatar
Boris Cazic committed
98
class RegleVoisinageArbitraire : public RegleVoisinage { //définit la règle pour le voisinage arbitraire
Maxime Goret's avatar
Maxime Goret committed
99
100
101
102
103
104
105
106
    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
107
        vector<Coordonnees> getVoisinage(const QTableWidget* grid ); // Dééfinition des coordonnées relatives pour le calcul du voisinage
Boris Cazic's avatar
Boris Cazic committed
108
109
};

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