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 {
virtual ~RegleGen() = default;
/// 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] cellule La cellule pour laquelle on vérifie la règle
virtual bool verify(const Voisinage& voisins, const Cellule& cellule) const = 0;
virtual bool verify(const Voisinage& voisins) 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
virtual int getCourant() const { return -1; }
/// Obtenir la destination de cette règle
......@@ -42,8 +41,7 @@ class Regle: public RegleGen {
Regle(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8]);
/// 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] cellule La cellule pour laquelle on vérifie la règle
virtual bool verify(const Voisinage& voisins, const Cellule& cellule) const override;
virtual bool verify(const Voisinage& voisins) const override;
/// 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
/// @param[in] i numéro de l'état
......@@ -70,8 +68,7 @@ class RegleAvecEtatCourant: public Regle {
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
/// @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 Cellule& cellule) const override;
bool verify(const Voisinage& voisins) const override;
/// Obtenir l'état courant requis pour valider la règle
/// Principalement utilisé pour sauvegarder une règle de transition
int getCourant() const override { return static_cast<int>(etatCourant); }
......@@ -109,7 +106,7 @@ class Fonction {
/// 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] 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
const std::list<Regle*>& getRules() const { return regles; }
};
......
......@@ -86,6 +86,10 @@ class AutoCell : public QWidget
QWidget* win_grid;
QTableWidget* grid;
//notice
std::unique_ptr<QWidget> fenetre_notice;
std::unique_ptr<QLabel> lab_notice;
explicit AutoCell(QWidget* parent=nullptr);
friend class NouveauModele;
public:
......@@ -140,6 +144,8 @@ class AutoCell : public QWidget
void setMatriceTorique(int val);
/// Revenir au réseau initial
void reinitialiserSimulation();
///Afficher la notice d'utilisation
void afficherNotice();
};
#endif // AUTOCELL_H
......@@ -36,7 +36,7 @@ INSERT INTO Etats VALUES(
2,
"Orange foncé",
255,
69,
109,
0
);
......
......@@ -12,7 +12,7 @@ void Automate::nextTimer() {
for(size_t j = 0; j < l; ++j) {
Voisinage voisinage(&(*(--buffer.end())).getReseau()[i][j]);
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())
r.getReseau()[i][j].incrementerEtat();
}
......
#include <Fonction.h>
bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellule) const {
if(cellule.getIndEtat() != etatCourant)
bool RegleAvecEtatCourant::verify(const Voisinage& voisins) const {
if(voisins.getCelluleCentre().getIndEtat() != etatCourant)
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};
auto *cellules = voisins.creerIterator();
......@@ -28,9 +28,9 @@ bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
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)
if (regle->verify(voisins, cellule))
if (regle->verify(voisins))
return regle->getDestination();
return etatDefaut;
......
......@@ -88,7 +88,7 @@ this->setWindowTitle("Automate cellulaire");
//définition de la frame initialisation
win_init = new QWidget;
win_init->setFixedWidth(400);
win_init->setFixedWidth(500);
lab_init = new QLabel("Configuration du modèle :");
form_init = new QGridLayout(win_init);
......@@ -100,6 +100,7 @@ this->setWindowTitle("Automate cellulaire");
form_init->addLayout(form_config, 1,0);
list_grids = new QComboBox;
list_grids->setFixedWidth(150);
check_load_grid = new QCheckBox;
edit_largeur = new QLineEdit;
......@@ -150,7 +151,7 @@ this->setWindowTitle("Automate cellulaire");
spin_time_step->setFixedWidth(70);
spin_time_step->setValue(1000);
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->setStyleSheet("background-color: rgb(255,255,255)");
button_prev->setFixedSize(40,40);
......@@ -216,6 +217,8 @@ this->setWindowTitle("Automate cellulaire");
win_grid = new QWidget;
grid = new QTableWidget(0,0,win_grid);
afficherNotice();
};
void AutoCell::afficherGrille(const Reseau* grille)
......@@ -311,6 +314,7 @@ void AutoCell::initialiserGrille(){
}
this->afficherGrille(&grille);
Automate::getInstance().reset();
Automate::getInstance().setReseauInit(grille);
Automate::getInstance().initialiserBuffer();
};
......@@ -380,7 +384,6 @@ void AutoCell::chargerGrilles(){
text = liste->currentText();
list_grids->clear();
list_grids->setFixedWidth(90);
vector<QString> noms = Database::getInstance().getListeReseaux(text);
nb.setNum(noms.size());
......@@ -450,3 +453,11 @@ void AutoCell::reinitialiserSimulation()
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 {
int type = query.value("type").toInt();
RegleVoisinage *regle = nullptr;
if(type == 1) {
if(query.isNull("rayon"))
throw "Error: r can't be undefined here";
RegleVoisinageNeumann *regle = new RegleVoisinageNeumann;
regle->setr(query.value("rayon").toInt());
return regle;
regle = new RegleVoisinageNeumann;
dynamic_cast<RegleVoisinageNeumann*>(regle)->setr(query.value("rayon").toInt());
}
else if(type == 2) {
if(query.isNull("rayon"))
throw "Error: r can't be undefined here";
RegleVoisinageMoore *regle = new RegleVoisinageMoore;
regle->setr(query.value("rayon").toInt());
return regle;
regle = new RegleVoisinageMoore;
dynamic_cast<RegleVoisinageMoore*>(regle)->setr(query.value("rayon").toInt());
}
else if(type != 3) {
query.prepare("SELECT x, y FROM coord_voisinage WHERE id = :id");
......@@ -192,20 +189,20 @@ RegleVoisinage* Database::getRegleVoisinage(const QString& name) const {
if(!query.first())
throw "There must be at least one coord in this rule";
RegleVoisinageArbitraire *regle = new RegleVoisinageArbitraire;
regle = new RegleVoisinageArbitraire;
Coordonnees coord;
do {
coord.x = query.value(0).toUInt();
coord.y = query.value(1).toUInt();
regle->coordonnees.push_back(coord);
dynamic_cast<RegleVoisinageArbitraire*>(regle)->coordonnees.push_back(coord);
} while(query.next());
query.prepare("SELECT COUNT(*) FROM coord_voisinage WHERE id = :id");
query.bindValue(":id", name);
query.exec();
return regle;
}
return regle;
}
/// Retourne un descriptif des réseaux ("id", "nom", "id", "nom", etc.) liés à un automate
......
......@@ -5,17 +5,6 @@
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->setMinimumSize(850, 650);
......@@ -378,7 +367,7 @@ void NouveauModele::paramRegle() {
seuilValidator->setRange(0,1);
layouth1->addWidget(seuilMin);
for(unsigned int i=0; i<8; i++) {
for(int i=0; i<8; i++) {
numSeuilMin[i]=new QLineEdit;
numSeuilMin[i]->setFixedWidth(22);
numSeuilMin[i]->setMaxLength(2);
......@@ -391,7 +380,7 @@ void NouveauModele::paramRegle() {
layouth2->addWidget(seuilMax);
for(unsigned int i=0; i<8; i++) {
for(int i=0; i<8; i++) {
numSeuilMax[i]=new QLineEdit;
numSeuilMax[i]->setFixedWidth(22);
numSeuilMax[i]->setMaxLength(2);
......@@ -456,6 +445,7 @@ void NouveauModele::validerParametrage(){
void NouveauModele::changerEtatDefault(){
etat_default = new QSpinBox;
etat_default->setRange(0,(nb_etats->value())-1);
......
......@@ -5,10 +5,10 @@
void RegleVoisinageNeumann::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 = static_cast<int>(r.getHauteur());
int largeur = static_cast<int>(r.getLargeur());
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++)
......@@ -31,8 +31,8 @@ void RegleVoisinageMoore::calculVoisinage(Voisinage& v, const Reseau& r) const {
v.voisinage = std::vector<Cellule*>();
int cellX = static_cast<int>(v.celluleCentre->abs);
int cellY = static_cast<int>(v.celluleCentre->ord);
int hauteur = r.getHauteur();
int largeur = r.getLargeur();
int hauteur = static_cast<int>(r.getHauteur());
int largeur = static_cast<int>(r.getLargeur());
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++)
......
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