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

Merge

parents e2197561 22e8a3dc
......@@ -4,6 +4,8 @@ QT += widgets
INCLUDEPATH += "includes"
QMAKE_CXXFLAGS = -g -ggdb
SOURCES += src/autocell.cpp
SOURCES += src/voisinage.cpp
SOURCES += src/reseau_cellule_etats.cpp
......
......@@ -5,6 +5,7 @@
#include <Fonction.h>
#include <voisinage.h>
#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
///
......@@ -88,17 +89,23 @@ class Automate {
void setLargeur(unsigned int largeur) { l = largeur; }
/// 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
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
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
void step() {
if(itBuffer==buffer.end())
if(itBuffer==(--buffer.end()))
nextTimer();
itBuffer++;
AutoCell::getInstance().afficherGrille(&*itBuffer);
std::cout << buffer.size() << std::endl;
}
/// Execution multiple de la méthode step
void run(int n) {
......@@ -118,10 +125,10 @@ class Automate {
Reseau getReseauCourant() { return *itBuffer; }
/// 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
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
const Reseau& getReseauInit() const { return reseauInit; }
/// Récupérer le nom de l'automate
......
......@@ -117,6 +117,9 @@ class AutoCell : public QWidget
void defNouveauModele();
void afficherErreur(QString& msg);
void initAutomate(const QString& name);
void changeDelai();
void previous();
void next();
};
#endif // AUTOCELL_H
......@@ -10,7 +10,6 @@ private:
unsigned int indEtat;
unsigned int abs;
unsigned int ord;
Cellule();
//inline Cellule():indEtat(0), abs(0), ord(0){};
void initCellule(const unsigned int ind, const unsigned int &x, const unsigned int &y);
friend class Reseau;
......@@ -22,6 +21,8 @@ private:
public:
inline unsigned int getIndEtat() const {return indEtat;}
void incrementerEtat();
Cellule();
Cellule(const Cellule& c): indEtat(c.indEtat), abs(c.abs), ord(c.ord) {}
};
class Etat{
......
......@@ -48,7 +48,7 @@ public:
i++;
}
bool isDone(){
return (vsn->voisinage.size() <= i);
return !(i < vsn->voisinage.size());
}
Cellule* currentItem(){
return vsn->voisinage[i];
......
......@@ -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
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(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 ?)
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
for(size_t i = 0; i<h; i++)
{
for(size_t j = 0; j<l; j++)
{
Voisinage voisinage(&(*buffer.end()).getReseau()[i][j]);
regleVoisinage->calculVoisinage(voisinage, *buffer.end());
Voisinage voisinage(&(*(--buffer.end())).getReseau()[i][j]);
regleVoisinage->calculVoisinage(voisinage, *(--buffer.end()));
const Etat e = fonction->getEtatSuivant(voisinage, r.getReseau()[i][j]);
while(r.getReseau()[i][j].getIndEtat()!=e.getIndice())
r.getReseau()[i][j].incrementerEtat();
......@@ -27,6 +28,10 @@ void Automate::nextTimer()
buffer.erase(buffer.begin());
}
}
else {
buffer.push_back(reseauInit);
nextTimer();
}
}
}
......
......@@ -10,7 +10,10 @@ bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellu
cellules->first();
while(!cellules->isDone())
{
nb[cellules->currentItem()->getIndEtat()]++;
cellules->next();
}
delete cellules;
......@@ -28,7 +31,10 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
cellules->first();
while(!cellules->isDone())
{
nb[cellules->currentItem()->getIndEtat()]++;
cellules->next();
}
delete cellules;
......
......@@ -146,14 +146,15 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent)
edit_time_step = new QLineEdit;
edit_time_step->setStyleSheet("background-color: rgb(255,255,255)");
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->setStyleSheet("background-color: rgb(255,255,255)");
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->setStyleSheet("background-color: rgb(255,255,255)");
button_prev->setFixedSize(40,40);
connect(button_prev, SIGNAL(clicked()), this, SLOT(previous()));
button_run = new QPushButton("RUN");
button_run->setFixedSize(40,40);
button_run->setStyleSheet("background-color: rgb(255,255,255)");
......@@ -161,6 +162,7 @@ AutoCell::AutoCell(QWidget* parent):QWidget(parent)
button_next = new QPushButton(">>");
button_next->setFixedSize(40,40);
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->setStyleSheet("background-color: rgb(255,255,255)");
button_reinitialiser->setFixedWidth(200);
......@@ -282,7 +284,8 @@ void AutoCell::initialiserGrille(){
this->Grille = new Reseau(h,l);
if (check_aleatoire->isChecked()) Grille->setAleatoire();
if (check_aleatoire->isChecked())
Grille->setAleatoire();
QString nom_grille = list_grids->currentText();
......@@ -301,6 +304,8 @@ void AutoCell::initialiserGrille(){
Automate::getInstance().reset();
this->afficherGrille(this->Grille);
Automate::getInstance().setReseauInit(*Grille);
Automate::getInstance().initialiserBuffer();
};
void AutoCell::RAZ(){
......@@ -308,7 +313,7 @@ void AutoCell::RAZ(){
grid = new QTableWidget(0,0,win_grid);
edit_largeur->setText("");
edit_hauteur->setText("");
edit_time_step->setText("1");
edit_time_step->setText("1000");
check_aleatoire->setCheckState(Qt::Unchecked);
check_load_grid->setCheckState(Qt::Unchecked);
;}
......@@ -388,3 +393,16 @@ void AutoCell::initAutomate(const QString& name) {
std::cout << name.toStdString() << std::endl;
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[])
{
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();
return app.exec();
......
......@@ -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 j = -static_cast<int>(rayon); j <= static_cast<int>(rayon); j++)
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 {
v.voisinage = std::vector<Cellule*>();
unsigned int cellX = v.celluleCentre->abs;
unsigned int cellY = v.celluleCentre->ord;
unsigned int hauteur = r.getHauteur();
unsigned int largeur = r.getLargeur();
int cellX = static_cast<int>(v.celluleCentre->abs);
int cellY = static_cast<int>(v.celluleCentre->ord);
int hauteur = r.getHauteur();
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 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)
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() {
for(auto& cel: voisinage)
delete cel;
voisinage.clear();
}
......@@ -42,7 +62,7 @@ void RegleVoisinageArbitraire::calculVoisinage(Voisinage &v, const Reseau& r) co
unsigned int largeur = r.getLargeur();
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