reseau_cellule_etats.cpp 3.97 KB
Newer Older
1
2
#include <reseau_cellule_etats.h>
#include <Automate.h>
3
4
#include <iostream>
#include <iomanip>
5
6
#include <cstdlib>

7
8
using namespace std;

9
10
11
12
13
14
15
16
17
18
//méthodes de la classe EnsembleEtat

EnsembleEtat::EnsembleEtat() {
    for (size_t i = 0; i < nbEtatsMax; i++) ensEtats[i] = nullptr;
}

EnsembleEtat::~EnsembleEtat() {
    for (size_t i = 0; i < nbEtats; i++) delete ensEtats[i];
}

19
void EnsembleEtat::ajouterEtat(unsigned int ind, std::string lab,int r, int g, int b){
20
    ensEtats[nbEtats] = new Etat(ind, lab, r, g, b);
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    nbEtats++;
}

void EnsembleEtat::supprimerEtat(const unsigned int ind){
    unsigned int i = 0;
    for(i=0; i<nbEtats; i++)
    {
        if(ensEtats[i]->indice == ind)
        {

            for(unsigned j = i; j<(nbEtats-1); j++){
                ensEtats[j] = ensEtats[j+1];}
                //ensEtats[j]->indice--; à voir si l'on veut laisser ou non l'utilisateur gérer les indices
        delete ensEtats[nbEtats];
        nbEtats--;
        }
    }
}

void EnsembleEtat::initEtat(const Etat* init_etats){
    /*if(ensEtats != nullptr){
        delete[] ensEtats;}*/

    for(unsigned int i=0; i< (sizeof (init_etats)-1); i++)
        ensEtats[i] = new Etat(init_etats[i].indice, init_etats[i].label, init_etats[i].color);
    nbEtats = sizeof (init_etats);
}

49
void EnsembleEtat::reset(){
50
51
52
53
54
55
56
57
58
	if (ensEtats != nullptr){
		for(auto& it: ensEtats) {
			if (it != nullptr) {
				delete it;
				it = nullptr;
			}
		}
		nbEtats=0;
	}
59
60
};

61
62
63
64
65
66
67
68
69
70
71
72
73
//méthodes de la classe Etat


//méthodes dela classe Cellule

Cellule::Cellule():indEtat(0), abs(0), ord(0){};

void Cellule::initCellule(const unsigned int ind, const unsigned int &x, const unsigned int &y){
    this->indEtat = ind;
    this->abs = x;
    this->ord = y;
}

74
void Cellule::incrementerEtat(){
75
    indEtat = (indEtat+1) % Automate::getInstance().getEnsemble().getNbEtats();}
76

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//méthodes de la classe Reseau

Reseau::Reseau(const unsigned int &h, const unsigned int &l):hauteur(h),largeur(l){
        reseau = new Cellule* [hauteur];
            for(unsigned int i=0; i<hauteur; i++)
                reseau[i] = new Cellule [largeur];
        for(unsigned int i=0; i<hauteur; i++) //initialisation des cellules dans un second car pas possible avec l'allocation dynamique
            for(unsigned int j=0; j<largeur; j++)
                reseau[i][j].initCellule(1,i,j);}

Reseau::~Reseau(){
    for(unsigned int i=0; i<hauteur; i++)
        delete[] reseau[i];
    delete[] reseau;
}

93
94
95
96
97
Reseau& Reseau::setAleatoire(){
    srand(time(NULL));
    for(unsigned int i=0; i<hauteur; i++)
        for(unsigned int j=0; j<largeur; j++)
        {
98
            unsigned int random_ind = rand() % (Automate::getInstance().getEnsemble().getNbEtats());
99
100
101
102
103
            reseau[i][j].initCellule(random_ind,i,j);
        };
    return *this;
}

104
Reseau::Reseau(const Reseau& init_grille){
105
106
107
108
109
110
111
112
113
114
115
116
    hauteur = init_grille.hauteur;
    largeur = init_grille.largeur;
    reseau = new Cellule* [hauteur];
    for(unsigned int i=0; i<hauteur; i++)
        reseau[i] = new Cellule [largeur];

    for(unsigned int i=0; i<hauteur; i++)
        for(unsigned int j=0; j<largeur; j++)
        {
            reseau[i][j].initCellule(init_grille.reseau[i][j].getIndEtat(),i,j);
        }

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
}

Reseau& Reseau::operator=(const Reseau& init_grille) {
	for(unsigned int i=0; i<hauteur; i++)
		delete[] reseau[i];
	delete[] reseau;

	hauteur = init_grille.hauteur;
	largeur = init_grille.largeur;
	reseau = new Cellule* [hauteur];
	for(unsigned int i=0; i<hauteur; i++)
		reseau[i] = new Cellule [largeur];
	for(unsigned int i=0; i<hauteur; i++)
		for(unsigned int j=0; j<largeur; j++)
			reseau[i][j].initCellule(init_grille.reseau[i][j].getIndEtat(),i,j);

	return *this;
}
135
136
137

bool Reseau::operator==(const Reseau&r){
    if (static_cast<int>(hauteur) != r.getHauteur() || static_cast<int>(largeur) != r.getLargeur()) return false;
138
    for(unsigned int i=0; i<hauteur; i++)
139
140
141
142
        for(unsigned int j=0; j<largeur; j++)
            if (reseau[i][j].getIndEtat() != r.getReseau()[i][j].getIndEtat()) return false;
    return true;
};