Commit 2368b743 authored by Maxime Goret's avatar Maxime Goret
Browse files

Merge

parents 94d7f8c8 077af9d4
Pipeline #79771 passed with stage
in 16 seconds
No preview for this file type
...@@ -18,8 +18,7 @@ class RegleGen { ...@@ -18,8 +18,7 @@ class RegleGen {
virtual ~RegleGen() = default; virtual ~RegleGen() = default;
/// Vérifier si une règle est vérifiée /// Vérifier si une règle est vérifiée
/// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle /// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle
/// @param[in] cellule La cellule pour laquelle on vérifie la règle virtual bool verify(const Voisinage& voisins) const = 0;
virtual bool verify(const Voisinage& voisins, const Cellule& cellule) const = 0;
/// Utilisé pour obtenir l'état courant de la règle s'il existe, n'a pas de sens pour toutes donc on préfère mettre -1 par défaut /// Utilisé pour obtenir l'état courant de la règle s'il existe, n'a pas de sens pour toutes donc on préfère mettre -1 par défaut
virtual int getCourant() const { return -1; } virtual int getCourant() const { return -1; }
/// Obtenir la destination de cette règle /// Obtenir la destination de cette règle
...@@ -42,8 +41,7 @@ class Regle: public RegleGen { ...@@ -42,8 +41,7 @@ class Regle: public RegleGen {
Regle(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8]); Regle(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8]);
/// Vérifier si une règle est vérifiée /// Vérifier si une règle est vérifiée
/// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle /// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle
/// @param[in] cellule La cellule pour laquelle on vérifie la règle virtual bool verify(const Voisinage& voisins) const override;
virtual bool verify(const Voisinage& voisins, const Cellule& cellule) const override;
/// Obtenir le seuil minimum du nombre de voisins requis pour un état donné afin de valider la règle /// Obtenir le seuil minimum du nombre de voisins requis pour un état donné afin de valider la règle
/// Principalement utilisé pour sauvegarder une règle de transition /// Principalement utilisé pour sauvegarder une règle de transition
/// @param[in] i numéro de l'état /// @param[in] i numéro de l'état
...@@ -70,8 +68,7 @@ class RegleAvecEtatCourant: public Regle { ...@@ -70,8 +68,7 @@ class RegleAvecEtatCourant: public Regle {
RegleAvecEtatCourant(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8], const int nEtat); RegleAvecEtatCourant(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8], const int nEtat);
/// Vérifier si une règle est vérifiée /// Vérifier si une règle est vérifiée
/// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle /// @param[in] voisins Le voisinage de la cellule pour laquelle on vérifie la règle
/// @param[in] cellule La cellule pour laquelle on vérifie la règle bool verify(const Voisinage& voisins) const override;
bool verify(const Voisinage& voisins, const Cellule& cellule) const override;
/// Obtenir l'état courant requis pour valider la règle /// Obtenir l'état courant requis pour valider la règle
/// Principalement utilisé pour sauvegarder une règle de transition /// Principalement utilisé pour sauvegarder une règle de transition
int getCourant() const override { return static_cast<int>(etatCourant); } int getCourant() const override { return static_cast<int>(etatCourant); }
...@@ -109,7 +106,7 @@ class Fonction { ...@@ -109,7 +106,7 @@ class Fonction {
/// Appliquer la fonction de transition à une cellule et obtenir son prochain état /// Appliquer la fonction de transition à une cellule et obtenir son prochain état
/// @param[in] voisins voisins de la cellule à laquelle appliquer la fonction /// @param[in] voisins voisins de la cellule à laquelle appliquer la fonction
/// @param[in] cellule cellule à laquelle appliquer la fonction /// @param[in] cellule cellule à laquelle appliquer la fonction
virtual const Etat& getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const; virtual const Etat& getEtatSuivant(const Voisinage& voisins) const;
/// Accesseur sur la liste de règles, il est impossible de modifier les règles de cette manière, la liste est en lecture seule /// Accesseur sur la liste de règles, il est impossible de modifier les règles de cette manière, la liste est en lecture seule
const std::list<Regle*>& getRules() const { return regles; } const std::list<Regle*>& getRules() const { return regles; }
}; };
......
...@@ -86,6 +86,10 @@ class AutoCell : public QWidget ...@@ -86,6 +86,10 @@ class AutoCell : public QWidget
QWidget* win_grid; QWidget* win_grid;
QTableWidget* grid; QTableWidget* grid;
//notice
std::unique_ptr<QWidget> fenetre_notice;
std::unique_ptr<QLabel> lab_notice;
explicit AutoCell(QWidget* parent=nullptr); explicit AutoCell(QWidget* parent=nullptr);
friend class NouveauModele; friend class NouveauModele;
public: public:
...@@ -140,6 +144,8 @@ class AutoCell : public QWidget ...@@ -140,6 +144,8 @@ class AutoCell : public QWidget
void setMatriceTorique(int val); void setMatriceTorique(int val);
/// Revenir au réseau initial /// Revenir au réseau initial
void reinitialiserSimulation(); void reinitialiserSimulation();
///Afficher la notice d'utilisation
void afficherNotice();
}; };
#endif // AUTOCELL_H #endif // AUTOCELL_H
...@@ -36,7 +36,7 @@ INSERT INTO Etats VALUES( ...@@ -36,7 +36,7 @@ INSERT INTO Etats VALUES(
2, 2,
"Orange foncé", "Orange foncé",
255, 255,
69, 109,
0 0
); );
......
...@@ -12,7 +12,7 @@ void Automate::nextTimer() { ...@@ -12,7 +12,7 @@ void Automate::nextTimer() {
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, (*(--buffer.end())).getReseau()[i][j]); const Etat e = fonction->getEtatSuivant(voisinage);
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();
} }
......
#include <Fonction.h> #include <Fonction.h>
bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellule) const { bool RegleAvecEtatCourant::verify(const Voisinage& voisins) const {
if(cellule.getIndEtat() != etatCourant) if(voisins.getCelluleCentre().getIndEtat() != etatCourant)
return false; return false;
return Regle::verify(voisins, cellule); return Regle::verify(voisins);
} }
bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const { bool Regle::verify(const Voisinage& voisins) const {
int nb[8] = {0}; int nb[8] = {0};
auto *cellules = voisins.creerIterator(); auto *cellules = voisins.creerIterator();
...@@ -28,9 +28,9 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const { ...@@ -28,9 +28,9 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
return true; return true;
} }
const Etat& Fonction::getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const { const Etat& Fonction::getEtatSuivant(const Voisinage& voisins) const {
for(const auto& regle: regles) for(const auto& regle: regles)
if (regle->verify(voisins, cellule)) if (regle->verify(voisins))
return regle->getDestination(); return regle->getDestination();
return etatDefaut; return etatDefaut;
......
...@@ -88,7 +88,7 @@ this->setWindowTitle("Automate cellulaire"); ...@@ -88,7 +88,7 @@ this->setWindowTitle("Automate cellulaire");
//définition de la frame initialisation //définition de la frame initialisation
win_init = new QWidget; win_init = new QWidget;
win_init->setFixedWidth(400); win_init->setFixedWidth(500);
lab_init = new QLabel("Configuration du modèle :"); lab_init = new QLabel("Configuration du modèle :");
form_init = new QGridLayout(win_init); form_init = new QGridLayout(win_init);
...@@ -100,6 +100,7 @@ this->setWindowTitle("Automate cellulaire"); ...@@ -100,6 +100,7 @@ this->setWindowTitle("Automate cellulaire");
form_init->addLayout(form_config, 1,0); form_init->addLayout(form_config, 1,0);
list_grids = new QComboBox; list_grids = new QComboBox;
list_grids->setFixedWidth(150);
check_load_grid = new QCheckBox; check_load_grid = new QCheckBox;
edit_largeur = new QLineEdit; edit_largeur = new QLineEdit;
...@@ -150,7 +151,7 @@ this->setWindowTitle("Automate cellulaire"); ...@@ -150,7 +151,7 @@ this->setWindowTitle("Automate cellulaire");
spin_time_step->setFixedWidth(70); spin_time_step->setFixedWidth(70);
spin_time_step->setValue(1000); spin_time_step->setValue(1000);
spin_time_step->setRange(500,2500); spin_time_step->setRange(500,2500);
connect(spin_time_step, SIGNAL(valueChanged()), this, SLOT(changeDelai())); connect(spin_time_step, SIGNAL(valueChanged(int)), 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);
...@@ -216,6 +217,8 @@ this->setWindowTitle("Automate cellulaire"); ...@@ -216,6 +217,8 @@ this->setWindowTitle("Automate cellulaire");
win_grid = new QWidget; win_grid = new QWidget;
grid = new QTableWidget(0,0,win_grid); grid = new QTableWidget(0,0,win_grid);
afficherNotice();
}; };
void AutoCell::afficherGrille(const Reseau* grille) void AutoCell::afficherGrille(const Reseau* grille)
...@@ -311,6 +314,7 @@ void AutoCell::initialiserGrille(){ ...@@ -311,6 +314,7 @@ void AutoCell::initialiserGrille(){
} }
this->afficherGrille(&grille); this->afficherGrille(&grille);
Automate::getInstance().reset();
Automate::getInstance().setReseauInit(grille); Automate::getInstance().setReseauInit(grille);
Automate::getInstance().initialiserBuffer(); Automate::getInstance().initialiserBuffer();
}; };
...@@ -380,7 +384,6 @@ void AutoCell::chargerGrilles(){ ...@@ -380,7 +384,6 @@ void AutoCell::chargerGrilles(){
text = liste->currentText(); text = liste->currentText();
list_grids->clear(); list_grids->clear();
list_grids->setFixedWidth(90);
vector<QString> noms = Database::getInstance().getListeReseaux(text); vector<QString> noms = Database::getInstance().getListeReseaux(text);
nb.setNum(noms.size()); nb.setNum(noms.size());
...@@ -450,3 +453,11 @@ void AutoCell::reinitialiserSimulation() ...@@ -450,3 +453,11 @@ void AutoCell::reinitialiserSimulation()
afficherGrille(&Automate::getInstance().getReseauInit()); afficherGrille(&Automate::getInstance().getReseauInit());
} }
void AutoCell::afficherNotice(){
fenetre_notice.reset(new QWidget);
fenetre_notice.get()->setMinimumWidth(1000);
fenetre_notice->setWindowTitle("Notice");
QString str_notice("test");
lab_notice.reset(new QLabel(str_notice, fenetre_notice.get()));
fenetre_notice.get()->show();
};
...@@ -166,23 +166,20 @@ RegleVoisinage* Database::getRegleVoisinage(const QString& name) const { ...@@ -166,23 +166,20 @@ RegleVoisinage* Database::getRegleVoisinage(const QString& name) const {
int type = query.value("type").toInt(); int type = query.value("type").toInt();
RegleVoisinage *regle = nullptr;
if(type == 1) { if(type == 1) {
if(query.isNull("rayon")) if(query.isNull("rayon"))
throw "Error: r can't be undefined here"; throw "Error: r can't be undefined here";
RegleVoisinageNeumann *regle = new RegleVoisinageNeumann; regle = new RegleVoisinageNeumann;
regle->setr(query.value("rayon").toInt()); dynamic_cast<RegleVoisinageNeumann*>(regle)->setr(query.value("rayon").toInt());
return regle;
} }
else if(type == 2) { else if(type == 2) {
if(query.isNull("rayon")) if(query.isNull("rayon"))
throw "Error: r can't be undefined here"; throw "Error: r can't be undefined here";
RegleVoisinageMoore *regle = new RegleVoisinageMoore; regle = new RegleVoisinageMoore;
regle->setr(query.value("rayon").toInt()); dynamic_cast<RegleVoisinageMoore*>(regle)->setr(query.value("rayon").toInt());
return regle;
} }
else if(type != 3) { else if(type != 3) {
query.prepare("SELECT x, y FROM coord_voisinage WHERE id = :id"); query.prepare("SELECT x, y FROM coord_voisinage WHERE id = :id");
...@@ -192,20 +189,20 @@ RegleVoisinage* Database::getRegleVoisinage(const QString& name) const { ...@@ -192,20 +189,20 @@ RegleVoisinage* Database::getRegleVoisinage(const QString& name) const {
if(!query.first()) if(!query.first())
throw "There must be at least one coord in this rule"; throw "There must be at least one coord in this rule";
RegleVoisinageArbitraire *regle = new RegleVoisinageArbitraire; regle = new RegleVoisinageArbitraire;
Coordonnees coord; Coordonnees coord;
do { do {
coord.x = query.value(0).toUInt(); coord.x = query.value(0).toUInt();
coord.y = query.value(1).toUInt(); coord.y = query.value(1).toUInt();
regle->coordonnees.push_back(coord); dynamic_cast<RegleVoisinageArbitraire*>(regle)->coordonnees.push_back(coord);
} while(query.next()); } while(query.next());
query.prepare("SELECT COUNT(*) FROM coord_voisinage WHERE id = :id"); query.prepare("SELECT COUNT(*) FROM coord_voisinage WHERE id = :id");
query.bindValue(":id", name); query.bindValue(":id", name);
query.exec(); query.exec();
return regle;
} }
return regle;
} }
/// Retourne un descriptif des réseaux ("id", "nom", "id", "nom", etc.) liés à un automate /// Retourne un descriptif des réseaux ("id", "nom", "id", "nom", etc.) liés à un automate
......
...@@ -5,17 +5,6 @@ ...@@ -5,17 +5,6 @@
NouveauModele::NouveauModele(QWidget* parent) : QWidget() { NouveauModele::NouveauModele(QWidget* parent) : QWidget() {
Automate::getInstance().reset();
//create dumb ensembleetat
Automate::getInstance().getEnsemble().ajouterEtat(0, "État 1", 0, 0, 0);
Automate::getInstance().getEnsemble().ajouterEtat(1, "État 2", 10, 10, 30);
Automate::getInstance().getEnsemble().ajouterEtat(2, "État 3", 10, 30, 10);
Automate::getInstance().getEnsemble().ajouterEtat(3, "État 4", 30, 10, 10);
Automate::getInstance().getEnsemble().ajouterEtat(4, "État 5", 100, 70, 70);
Automate::getInstance().getEnsemble().ajouterEtat(5, "État 6", 70, 100, 70);
Automate::getInstance().getEnsemble().ajouterEtat(6, "État 7", 70, 70, 100);
Automate::getInstance().getEnsemble().ajouterEtat(7, "État 8", 200, 200, 200);
// fonction.reset(new Fonction(Automate::getInstance().getEnsemble().getEtat(0)));
this->setWindowTitle("Paramétrage d'un nouveau modèle"); this->setWindowTitle("Paramétrage d'un nouveau modèle");
this->setMinimumSize(850, 650); this->setMinimumSize(850, 650);
...@@ -378,7 +367,7 @@ void NouveauModele::paramRegle() { ...@@ -378,7 +367,7 @@ void NouveauModele::paramRegle() {
seuilValidator->setRange(0,1); seuilValidator->setRange(0,1);
layouth1->addWidget(seuilMin); layouth1->addWidget(seuilMin);
for(unsigned int i=0; i<8; i++) { for(int i=0; i<8; i++) {
numSeuilMin[i]=new QLineEdit; numSeuilMin[i]=new QLineEdit;
numSeuilMin[i]->setFixedWidth(22); numSeuilMin[i]->setFixedWidth(22);
numSeuilMin[i]->setMaxLength(2); numSeuilMin[i]->setMaxLength(2);
...@@ -391,7 +380,7 @@ void NouveauModele::paramRegle() { ...@@ -391,7 +380,7 @@ void NouveauModele::paramRegle() {
layouth2->addWidget(seuilMax); layouth2->addWidget(seuilMax);
for(unsigned int i=0; i<8; i++) { for(int i=0; i<8; i++) {
numSeuilMax[i]=new QLineEdit; numSeuilMax[i]=new QLineEdit;
numSeuilMax[i]->setFixedWidth(22); numSeuilMax[i]->setFixedWidth(22);
numSeuilMax[i]->setMaxLength(2); numSeuilMax[i]->setMaxLength(2);
...@@ -456,6 +445,7 @@ void NouveauModele::validerParametrage(){ ...@@ -456,6 +445,7 @@ void NouveauModele::validerParametrage(){
void NouveauModele::changerEtatDefault(){ void NouveauModele::changerEtatDefault(){
etat_default = new QSpinBox; etat_default = new QSpinBox;
etat_default->setRange(0,(nb_etats->value())-1); etat_default->setRange(0,(nb_etats->value())-1);
......
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
void RegleVoisinageNeumann::calculVoisinage(Voisinage& v, const Reseau& r) const { void RegleVoisinageNeumann::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 = static_cast<int>(r.getHauteur());
unsigned int largeur = r.getLargeur(); int largeur = static_cast<int>(r.getLargeur());
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++)
...@@ -31,8 +31,8 @@ void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const { ...@@ -31,8 +31,8 @@ void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const {
v.voisinage = std::vector<Cellule*>(); v.voisinage = std::vector<Cellule*>();
int cellX = static_cast<int>(v.celluleCentre->abs); int cellX = static_cast<int>(v.celluleCentre->abs);
int cellY = static_cast<int>(v.celluleCentre->ord); int cellY = static_cast<int>(v.celluleCentre->ord);
int hauteur = r.getHauteur(); int hauteur = static_cast<int>(r.getHauteur());
int largeur = r.getLargeur(); int largeur = static_cast<int>(r.getLargeur());
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++)
......
Markdown is supported
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