Commit fdc08f98 authored by Yann Boucher's avatar Yann Boucher
Browse files

Support du paramétrage des frontières

parent e5f47cc8
Pipeline #79591 passed with stages
in 17 seconds
......@@ -279,7 +279,7 @@ pattern recorded :</string>
</sizepolicy>
</property>
<property name="text">
<string>Grid dimension</string>
<string>Grid dimensions</string>
</property>
</widget>
</item>
......@@ -343,6 +343,31 @@ pattern recorded :</string>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Border : </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="border_combo">
<item>
<property name="text">
<string>Periodic</string>
</property>
</item>
<item>
<property name="text">
<string>Inert</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="patternSettingsLayout">
<item row="0" column="0">
......@@ -576,7 +601,7 @@ pattern recorded :</string>
<x>0</x>
<y>0</y>
<width>1068</width>
<height>20</height>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFichier">
......
......@@ -18,6 +18,7 @@ class Automaton {
private:
Alphabet alphabet;
Grid grid;
BoundaryPolicy border_policy;
NeighborhoodRule* neighbourhoodRule;
TransitionRule* transitionRule;
......@@ -36,7 +37,9 @@ public:
//! \return Référence constante sur l'alphabet
const Alphabet& getAlphabet() const {return alphabet;}
//! \brief Configure la stratégie à adopter par rapport aux frontières du réseau.
void set_boundary_policy(BoundaryPolicy p)
{ border_policy = p; }
//! \brief Définit la règle de voisinage
//!
......
......@@ -17,28 +17,35 @@ Cette classe représente un réseau de cellules.
#include "coord.hpp"
using namespace std;
using namespace std;
/**
\class Grid
\brief Représente une grille d'états.
Cette structure représente une grille d'états.
**/
**/
class Structure;
class Structure;
//! \brief Enum spécifiant la stratégie à adopter aux frontières du réseau.
enum class BoundaryPolicy
{
//! \brief Frontière torique.
Periodic,
//! \brief Frontière toujours égale à l'état 0.
Inert
};
class Grid{
int nb_rows;
int nb_col;
std::vector<unsigned char> matrix;
BoundaryPolicy policy;
public:
//! \brief Constructeur par défaut, avec le nombre de ligne et de colonne souhaités
Grid(size_t l,size_t c);
//! \brief Constructeur par copie d'une grille
Grid(const Grid& g);
//! \brief Retourne le nombre de lignes
//! \return Retourne le nombre de lignes de la Grille
size_t get_rows() const {return nb_rows;}
......@@ -47,36 +54,54 @@ public:
//! \return Retourne le nombre de colonnes de la Grille
size_t get_col() const{return nb_col;}
//! \brief Configure la stratégie à adopter par rapport aux frontières du réseau.
void set_boundary_policy(BoundaryPolicy p)
{ policy = p; }
//! \brief Initialise la cellule de coordonnée pos à l'état 'state'
void set_cell(Coord pos, unsigned int state)
{
// fast path
// fast path, no boundaries concerned
if (pos.x >= 0 && pos.y >= 0 && pos.x < nb_col && pos.y < nb_rows)
{
matrix[pos.y*nb_col + pos.x] = state;
return;
}
int i = pos.y;
int j = pos.x;
matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
+((j%nb_col+nb_col)%nb_col)]
=state;
else
{
if (policy == BoundaryPolicy::Inert)
return;
else
{
int i = pos.y;
int j = pos.x;
matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
+((j%nb_col+nb_col)%nb_col)]
=state;
}
}
}
//! \brief Retourne l'état d'une cellule
//! \return Retourne l'état d'une cellule de coordonnées pos
unsigned int get_state(Coord pos)const{
// fast path
unsigned int get_state(Coord pos) const {
// fast path, no boundaries concerned
if (pos.x >= 0 && pos.y >= 0 && pos.x < nb_col && pos.y < nb_rows)
{
return matrix[pos.y*nb_col + pos.x];
}
int i = pos.y;
int j = pos.x;
return matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
+((j%nb_col+nb_col)%nb_col)];
else
{
if (policy == BoundaryPolicy::Inert)
return 0;
else
{
int i = pos.y;
int j = pos.x;
return matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
+((j%nb_col+nb_col)%nb_col)];
}
}
}
Grid& operator=(const Grid& g);
bool operator==(const Grid&);
......
......@@ -94,8 +94,12 @@ private slots:
//! \brief Bouton permettant de réintialiser la grille à zéro
void on_pushButton_clicked();
//! \brief Mets à jour la vitesse de simulation.
void on_simSpeedSlider_sliderMoved(int position);
//! \brief Mets à jour la stratégie de frontière.
void load_boundary_policy(int index);
private:
//! \brief Initialiser la liste des transitions et voisinages disponibles
void init_transition_neighborhood_list();
......
......@@ -38,7 +38,9 @@ public:
//! \param TR La nouvelle règle de transition
void setTransitionRule(TransitionRule*);
//! \brief Configure la stratégie à adopter par rapport aux frontières du réseau.
void set_boundary_policy(BoundaryPolicy p)
{ automaton.set_boundary_policy(p); }
//! \brief Définit l'aplhabet de l'automate de la simulation
//!
......
......@@ -19,7 +19,7 @@
],
"author": "JM",
"date": "sam. juin 5 2021",
"desc": "Jeu de la vie, implémenté à l'aide de règles de transition totalistiques génériques",
"desc": "Game of Life, implemented using generic totalistic transition rules",
"neighborhood_data": {
"radius": 1
},
......
#include "automaton.hpp"
Automaton::Automaton() : alphabet(), grid(0,0), neighbourhoodRule(nullptr), transitionRule(nullptr) {}
Automaton::Automaton() : alphabet(), grid(0,0), border_policy(BoundaryPolicy::Periodic), neighbourhoodRule(nullptr), transitionRule(nullptr) {}
Automaton::~Automaton() {
delete neighbourhoodRule;
......@@ -56,6 +56,8 @@ void Automaton::setGrid(const Grid& G) {
}
void Automaton::runOnce() {
// On s'assure d'avoir une stratégie de frontière de réseau à jour
grid.set_boundary_policy(border_policy);
Grid tempGrid(grid);
for(int i=0; i<static_cast<int>(grid.get_col()); ++i) {
for(int j=0; j<static_cast<int>(grid.get_rows()); ++j) {
......
......@@ -15,6 +15,7 @@ Cette classe représente un réseau de cellules.
Grid::Grid(size_t l,size_t c):nb_rows(l),nb_col(c){
this->matrix.resize(l*c);
policy = BoundaryPolicy::Periodic;
}
ostream& operator<<(ostream& f, const Grid& g){
......@@ -32,10 +33,6 @@ ostream& operator<<(ostream& f, const Grid& g){
return f;
}
Grid::Grid(const Grid& g):nb_rows(g.get_rows()),nb_col(g.get_col()){
this->matrix = g.matrix;
}
Grid& Grid::operator=(const Grid& g){
if(this ==&g)
......
......@@ -75,9 +75,11 @@ MainWindow::MainWindow(QWidget *parent)
{
load_from_image();
});
connect(ui->border_combo, QOverload<int>::of(&QComboBox::activated), this, &MainWindow::load_boundary_policy);
ui->struct_library->update_cell_pixel_size(ui->grid_view->cell_screen_size());
simulation.set_boundary_policy(BoundaryPolicy::Periodic);
if (!try_load_saved_state())
{
load_model(default_model());
......@@ -539,11 +541,13 @@ bool MainWindow::try_load_saved_state()
QJsonObject data = jsonDoc.object();
QJsonObject model = data.value("model").toObject();
QJsonObject config = data.value("config").toObject();
unsigned boundary_policy = data.value("boundary_policy").toInt(0);
if (model.isEmpty() || config.isEmpty())
return false;
load_model(model);
load_grid_configuration(config);
load_boundary_policy(boundary_policy);
return true;
}
......@@ -754,6 +758,7 @@ void MainWindow::closeEvent(QCloseEvent *e)
QJsonObject save_data;
save_data["config"] = config_data;
save_data["model"] = model;
save_data["boundary_policy"] = ui->border_combo->currentIndex();
QFile file("saved_state.json");
if (!file.open(QIODevice::WriteOnly | QFile::Text | QFile::Truncate))
......@@ -846,11 +851,6 @@ void MainWindow::on_recordSpinBox_valueChanged(int newSize) {
simulation.setHistorySize(newSize);
}
void MainWindow::on_pushButton_clicked()
{
Grid oldGrid = ui->grid_view->get_grid();
......@@ -882,3 +882,20 @@ void MainWindow::on_simSpeedSlider_sliderMoved(int position)
timer->setInterval(1000/frequence);
}
void MainWindow::load_boundary_policy(int index)
{
switch (index)
{
default:
case 0:
simulation.set_boundary_policy(BoundaryPolicy::Periodic);
break;
case 1:
simulation.set_boundary_policy(BoundaryPolicy::Inert);
break;
}
if (index >= 0 && index < ui->border_combo->count())
ui->border_combo->setCurrentIndex(index);
}
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