Commit 92b79832 authored by Maxime Goret's avatar Maxime Goret
Browse files

Merge

parents e2197561 22e8a3dc
...@@ -4,6 +4,8 @@ QT += widgets ...@@ -4,6 +4,8 @@ QT += widgets
INCLUDEPATH += "includes" INCLUDEPATH += "includes"
QMAKE_CXXFLAGS = -g -ggdb
SOURCES += src/autocell.cpp SOURCES += src/autocell.cpp
SOURCES += src/voisinage.cpp SOURCES += src/voisinage.cpp
SOURCES += src/reseau_cellule_etats.cpp SOURCES += src/reseau_cellule_etats.cpp
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <Fonction.h> #include <Fonction.h>
#include <voisinage.h> #include <voisinage.h>
#include <QObject> #include <QObject>
#include <autocell.h>
/// La classe automate se charge de gérer les informations d'un automate (fonction de transition, règle de voisinage, réseau, ...) et joue également le rôle de simulateur /// La classe automate se charge de gérer les informations d'un automate (fonction de transition, règle de voisinage, réseau, ...) et joue également le rôle de simulateur
/// ///
...@@ -88,17 +89,23 @@ class Automate { ...@@ -88,17 +89,23 @@ class Automate {
void setLargeur(unsigned int largeur) { l = largeur; } void setLargeur(unsigned int largeur) { l = largeur; }
/// Se placer sur l'état précédent si disponible /// Se placer sur l'état précédent si disponible
void previous() { if(itBuffer!=buffer.begin()) itBuffer--; } void previous() {
if(itBuffer!=buffer.begin())
itBuffer--;
AutoCell::getInstance().afficherGrille(&*itBuffer);
}
/// Se placer sur l'état suivant si disponible /// Se placer sur l'état suivant si disponible
void next() { if(itBuffer!=buffer.end()) itBuffer++; } void next() { if(itBuffer!=(--buffer.end())) itBuffer++; }
/// On vide la buffer et on l'initialise avec une première grille /// On vide la buffer et on l'initialise avec une première grille
void reset() { buffer.clear(); buffer.push_back(reseauInit); } void reset() { buffer.clear(); buffer.push_back(reseauInit); }
/// Se placer sur l'état suivant du buffer et le calculer s'il n'y en a plus de disponible /// Se placer sur l'état suivant du buffer et le calculer s'il n'y en a plus de disponible
void step() { void step() {
if(itBuffer==buffer.end()) if(itBuffer==(--buffer.end()))
nextTimer(); nextTimer();
itBuffer++; itBuffer++;
AutoCell::getInstance().afficherGrille(&*itBuffer);
std::cout << buffer.size() << std::endl;
} }
/// Execution multiple de la méthode step /// Execution multiple de la méthode step
void run(int n) { void run(int n) {
...@@ -118,10 +125,10 @@ class Automate { ...@@ -118,10 +125,10 @@ class Automate {
Reseau getReseauCourant() { return *itBuffer; } Reseau getReseauCourant() { return *itBuffer; }
/// initialiser le buffer s'il est vide avec un réseau /// initialiser le buffer s'il est vide avec un réseau
void initialiserBuffer() { if(buffer.begin()==buffer.end()) buffer.push_front(reseauInit); } void initialiserBuffer() { buffer.clear(); buffer.push_front(reseauInit); }
/// Définir le réseau initial de l'automate /// Définir le réseau initial de l'automate
void setReseauInit(Reseau& r) { reseauInit = r; } void setReseauInit(Reseau& r) { reseauInit = r; h = r.getHauteur(); l = r.getLargeur(); }
/// Récupérer le réseau initial de l'automate /// Récupérer le réseau initial de l'automate
const Reseau& getReseauInit() const { return reseauInit; } const Reseau& getReseauInit() const { return reseauInit; }
/// Récupérer le nom de l'automate /// Récupérer le nom de l'automate
......
...@@ -117,6 +117,9 @@ class AutoCell : public QWidget ...@@ -117,6 +117,9 @@ class AutoCell : public QWidget
void defNouveauModele(); void defNouveauModele();
void afficherErreur(QString& msg); void afficherErreur(QString& msg);
void initAutomate(const QString& name); void initAutomate(const QString& name);
void changeDelai();
void previous();
void next();
}; };
#endif // AUTOCELL_H #endif // AUTOCELL_H
...@@ -10,7 +10,6 @@ private: ...@@ -10,7 +10,6 @@ private:
unsigned int indEtat; unsigned int indEtat;
unsigned int abs; unsigned int abs;
unsigned int ord; unsigned int ord;
Cellule();
//inline Cellule():indEtat(0), abs(0), ord(0){}; //inline Cellule():indEtat(0), abs(0), ord(0){};
void initCellule(const unsigned int ind, const unsigned int &x, const unsigned int &y); void initCellule(const unsigned int ind, const unsigned int &x, const unsigned int &y);
friend class Reseau; friend class Reseau;
...@@ -22,6 +21,8 @@ private: ...@@ -22,6 +21,8 @@ private:
public: public:
inline unsigned int getIndEtat() const {return indEtat;} inline unsigned int getIndEtat() const {return indEtat;}
void incrementerEtat(); void incrementerEtat();
Cellule();
Cellule(const Cellule& c): indEtat(c.indEtat), abs(c.abs), ord(c.ord) {}
}; };
class Etat{ class Etat{
......
...@@ -48,7 +48,7 @@ public: ...@@ -48,7 +48,7 @@ public:
i++; i++;
} }
bool isDone(){ bool isDone(){
return (vsn->voisinage.size() <= i); return !(i < vsn->voisinage.size());
} }
Cellule* currentItem(){ Cellule* currentItem(){
return vsn->voisinage[i]; return vsn->voisinage[i];
......
...@@ -5,18 +5,19 @@ std::unique_ptr<Automate> Automate::instance = nullptr; ...@@ -5,18 +5,19 @@ std::unique_ptr<Automate> Automate::instance = nullptr;
/// La méthode nextTimer calcule un nouveau pas de temps, elle s'occupe également de la taille du buffer des réseaux qui est pour le moment hardcodé mais qui peut très facilement devenir un attribut modifiable par accesseur si besoin /// La méthode nextTimer calcule un nouveau pas de temps, elle s'occupe également de la taille du buffer des réseaux qui est pour le moment hardcodé mais qui peut très facilement devenir un attribut modifiable par accesseur si besoin
void Automate::nextTimer() void Automate::nextTimer()
{ {
std::cout << l << h << std::endl;
if((l!=0)&&(h!=0)) //il faut que l et h aient été initialisés autrement que nuls if((l!=0)&&(h!=0)) //il faut que l et h aient été initialisés autrement que nuls
{ {
if(buffer.size()!=0) //il faut que l'on ait un premier réseau dans le buffer, if(buffer.size()!=0) //il faut que l'on ait un premier réseau dans le buffer,
{ //choisi par l'utilisateur (besoin d'une fonction initialiser() dans automate ?) { //choisi par l'utilisateur (besoin d'une fonction initialiser() dans automate ?)
Reseau r(*buffer.end()); //on crée un nouveau réseau à partir de l'ancien Reseau r = Reseau(*(--buffer.end())); //on crée un nouveau réseau à partir de l'ancien
//on parcourt la liste de ses cellules //on parcourt la liste de ses cellules
for(size_t i = 0; i<h; i++) for(size_t i = 0; i<h; i++)
{ {
for(size_t j = 0; j<l; j++) for(size_t j = 0; j<l; j++)
{ {
Voisinage voisinage(&(*buffer.end()).getReseau()[i][j]); Voisinage voisinage(&(*(--buffer.end())).getReseau()[i][j]);
regleVoisinage->calculVoisinage(voisinage, *buffer.end()); regleVoisinage->calculVoisinage(voisinage, *(--buffer.end()));
const Etat e = fonction->getEtatSuivant(voisinage, r.getReseau()[i][j]); const Etat e = fonction->getEtatSuivant(voisinage, r.getReseau()[i][j]);
while(r.getReseau()[i][j].getIndEtat()!=e.getIndice()) while(r.getReseau()[i][j].getIndEtat()!=e.getIndice())
r.getReseau()[i][j].incrementerEtat(); r.getReseau()[i][j].incrementerEtat();
...@@ -27,6 +28,10 @@ void Automate::nextTimer() ...@@ -27,6 +28,10 @@ void Automate::nextTimer()
buffer.erase(buffer.begin()); buffer.erase(buffer.begin());
} }
} }
else {
buffer.push_back(reseauInit);
nextTimer();
}
} }
} }
......
...@@ -10,7 +10,10 @@ bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellu ...@@ -10,7 +10,10 @@ bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellu
cellules->first(); cellules->first();
while(!cellules->isDone()) while(!cellules->isDone())
{
nb[cellules->currentItem()->getIndEtat()]++; nb[cellules->currentItem()->getIndEtat()]++;
cellules->next();
}
delete cellules; delete cellules;
...@@ -28,7 +31,10 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const { ...@@ -28,7 +31,10 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
cellules->first(); cellules->first();
while(!cellules->isDone()) while(!cellules->isDone())
{
nb[cellules->currentItem()->getIndEtat()]++; nb[cellules->currentItem()->getIndEtat()]++;
cellules->next();
}
delete cellules; delete cellules;
......
...@@ -146,14 +146,15 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent) ...@@ -146,14 +146,15 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent)
edit_time_step = new QLineEdit; edit_time_step = new QLineEdit;
edit_time_step->setStyleSheet("background-color: rgb(255,255,255)"); edit_time_step->setStyleSheet("background-color: rgb(255,255,255)");
edit_time_step->setFixedWidth(30); edit_time_step->setFixedWidth(30);
edit_time_step->setText("1"); //valeur par défaut pour le pas de temps edit_time_step->setText("1000"); //valeur par défaut pour le pas de temps
button_valider_delai = new QPushButton("valider"); button_valider_delai = new QPushButton("valider");
button_valider_delai->setStyleSheet("background-color: rgb(255,255,255)"); button_valider_delai->setStyleSheet("background-color: rgb(255,255,255)");
button_valider_delai->setFixedWidth(50); button_valider_delai->setFixedWidth(50);
//connect(button_valider_delai, SIGNAL(clicked()), Automate::getInstance(), SLOT(Automate::getInstance().setDelai())); connect(button_valider_delai, SIGNAL(clicked()), this, SLOT(changeDelai()));
button_prev = new QPushButton("<<"); button_prev = new QPushButton("<<");
button_prev->setStyleSheet("background-color: rgb(255,255,255)"); button_prev->setStyleSheet("background-color: rgb(255,255,255)");
button_prev->setFixedSize(40,40); button_prev->setFixedSize(40,40);
connect(button_prev, SIGNAL(clicked()), this, SLOT(previous()));
button_run = new QPushButton("RUN"); button_run = new QPushButton("RUN");
button_run->setFixedSize(40,40); button_run->setFixedSize(40,40);
button_run->setStyleSheet("background-color: rgb(255,255,255)"); button_run->setStyleSheet("background-color: rgb(255,255,255)");
...@@ -161,6 +162,7 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent) ...@@ -161,6 +162,7 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent)
button_next = new QPushButton(">>"); button_next = new QPushButton(">>");
button_next->setFixedSize(40,40); button_next->setFixedSize(40,40);
button_next->setStyleSheet("background-color: rgb(255,255,255)"); button_next->setStyleSheet("background-color: rgb(255,255,255)");
connect(button_next, SIGNAL(clicked()), this, SLOT(next()));
button_reinitialiser = new QPushButton("Réinitialiser la simulation"); button_reinitialiser = new QPushButton("Réinitialiser la simulation");
button_reinitialiser->setStyleSheet("background-color: rgb(255,255,255)"); button_reinitialiser->setStyleSheet("background-color: rgb(255,255,255)");
button_reinitialiser->setFixedWidth(200); button_reinitialiser->setFixedWidth(200);
...@@ -282,7 +284,8 @@ void AutoCell::initialiserGrille(){ ...@@ -282,7 +284,8 @@ void AutoCell::initialiserGrille(){
this->Grille = new Reseau(h,l); this->Grille = new Reseau(h,l);
if (check_aleatoire->isChecked()) Grille->setAleatoire(); if (check_aleatoire->isChecked())
Grille->setAleatoire();
QString nom_grille = list_grids->currentText(); QString nom_grille = list_grids->currentText();
...@@ -301,6 +304,8 @@ void AutoCell::initialiserGrille(){ ...@@ -301,6 +304,8 @@ void AutoCell::initialiserGrille(){
Automate::getInstance().reset(); Automate::getInstance().reset();
this->afficherGrille(this->Grille); this->afficherGrille(this->Grille);
Automate::getInstance().setReseauInit(*Grille);
Automate::getInstance().initialiserBuffer();
}; };
void AutoCell::RAZ(){ void AutoCell::RAZ(){
...@@ -308,7 +313,7 @@ void AutoCell::RAZ(){ ...@@ -308,7 +313,7 @@ void AutoCell::RAZ(){
grid = new QTableWidget(0,0,win_grid); grid = new QTableWidget(0,0,win_grid);
edit_largeur->setText(""); edit_largeur->setText("");
edit_hauteur->setText(""); edit_hauteur->setText("");
edit_time_step->setText("1"); edit_time_step->setText("1000");
check_aleatoire->setCheckState(Qt::Unchecked); check_aleatoire->setCheckState(Qt::Unchecked);
check_load_grid->setCheckState(Qt::Unchecked); check_load_grid->setCheckState(Qt::Unchecked);
;} ;}
...@@ -388,3 +393,16 @@ void AutoCell::initAutomate(const QString& name) { ...@@ -388,3 +393,16 @@ void AutoCell::initAutomate(const QString& name) {
std::cout << name.toStdString() << std::endl; std::cout << name.toStdString() << std::endl;
Database::getInstance().initSingletonAutomate(name); Database::getInstance().initSingletonAutomate(name);
} }
void AutoCell::changeDelai() {
// @todo : implémenter un message d'erreur
Automate::getInstance().setDelai(static_cast<unsigned int>(edit_time_step->text().toInt()));
}
void AutoCell::next() {
Automate::getInstance().step();
}
void AutoCell::previous() {
Automate::getInstance().previous();
}
...@@ -22,13 +22,6 @@ int main(int argc, char* argv[]) ...@@ -22,13 +22,6 @@ int main(int argc, char* argv[])
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
EnsembleEtat enseEtats;
enseEtats.ajouterEtat(0, "vivant", 239, 239, 239);
enseEtats.ajouterEtat(1, "mort", 90, 94, 107);
enseEtats.ajouterEtat(2, "zombie", 131, 166, 151);
enseEtats.ajouterEtat(3, "fantôme", 22, 166, 151);
AutoCell::getInstance().show(); AutoCell::getInstance().show();
return app.exec(); return app.exec();
......
...@@ -13,23 +13,43 @@ void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) const ...@@ -13,23 +13,43 @@ void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) const
for (int i = -static_cast<int>(rayon); i <= static_cast<int>(rayon); i++) 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++) for (int j = -static_cast<int>(rayon); j <= static_cast<int>(rayon); j++)
if (abs(i) + abs(j) <= static_cast<int>(rayon) && i != 0 && j != 0) if (abs(i) + abs(j) <= static_cast<int>(rayon) && i != 0 && j != 0)
v.voisinage.push_back(&r.getReseau()[(cellY+i)%hauteur][(cellX+j)%largeur]); {
int x = (cellY+i)%hauteur;
if (x < 0)
x = largeur + x;
int y = (cellX+j)%largeur;
if (y < 0)
y = hauteur + y;
v.voisinage.push_back(new Cellule(r.getReseau()[x][y]));
}
} }
void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const { void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const {
v.voisinage = std::vector<Cellule*>(); v.voisinage = std::vector<Cellule*>();
unsigned int cellX = v.celluleCentre->abs; int cellX = static_cast<int>(v.celluleCentre->abs);
unsigned int cellY = v.celluleCentre->ord; int cellY = static_cast<int>(v.celluleCentre->ord);
unsigned int hauteur = r.getHauteur(); int hauteur = r.getHauteur();
unsigned int largeur = r.getLargeur(); int largeur = r.getLargeur();
std::cout << "hauteur" << hauteur << "largeur" << largeur << std::endl;
for (int i = -static_cast<int>(rayon); i <= static_cast<int>(rayon); i++) 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++) for (int j = -static_cast<int>(rayon); j <= static_cast<int>(rayon); j++)
if (abs(i) <= static_cast<int>(rayon) && abs(j) <= static_cast<int>(rayon) && i != 0 && j != 0) if (abs(i) <= static_cast<int>(rayon) && abs(j) <= static_cast<int>(rayon) && i != 0 && j != 0)
v.voisinage.push_back(&r.getReseau()[(cellY+i)%hauteur][(cellX+j)%largeur]); {
int x = (cellY+i)%hauteur;
if (x < 0)
x = largeur + x;
int y = (cellX+j)%largeur;
if (y < 0)
y = hauteur + y;
v.voisinage.push_back(new Cellule(r.getReseau()[x][y]));
}
} }
Voisinage::~Voisinage() { Voisinage::~Voisinage() {
for(auto& cel: voisinage)
delete cel;
voisinage.clear(); voisinage.clear();
} }
...@@ -42,7 +62,7 @@ void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) co ...@@ -42,7 +62,7 @@ void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) co
unsigned int largeur = r.getLargeur(); unsigned int largeur = r.getLargeur();
for (size_t nb = 0; nb < coordonnees.size(); nb++){ for (size_t nb = 0; nb < coordonnees.size(); nb++){
v.voisinage[nb] = &r.getReseau()[(abs - coordonnees[nb].x)%hauteur] [(ord - coordonnees[nb].y)%largeur]; v.voisinage[nb] = new Cellule(r.getReseau()[(abs - coordonnees[nb].x)%hauteur] [(ord - coordonnees[nb].y)%largeur]);
} }
} }
......
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