diff --git a/GPA675Lab1GOL/GOLTeamH.cpp b/GPA675Lab1GOL/GOLTeamH.cpp index d82afc1..6447040 100644 --- a/GPA675Lab1GOL/GOLTeamH.cpp +++ b/GPA675Lab1GOL/GOLTeamH.cpp @@ -232,10 +232,10 @@ void GOLTeamH::drawBorder() mData.fillBorder(GridTeamH::CellType::alive); break; case GOL::BorderManagement::warping: - mData.fillBorderWarped(); + mData.setBorderManagement(GridTeamH::BorderManagement::Warpping); break; case GOL::BorderManagement::mirror: - mData.fillBorderMirror(); + mData.setBorderManagement(GridTeamH::BorderManagement::Mirror); break; } } @@ -478,8 +478,8 @@ void GOLTeamH::processOneStep() ptrGrid = nullptr; ptrGridInt = nullptr; - mData.switchToIntermediate(); - mIteration.value()++; + mData.switchToIntermediate(); //mise à jour de la grille + mIteration.value()++; mData.setAliveCount(aliveCount); } diff --git a/GPA675Lab1GOL/GOLTeamH.h b/GPA675Lab1GOL/GOLTeamH.h index fcb9227..10e7990 100644 --- a/GPA675Lab1GOL/GOLTeamH.h +++ b/GPA675Lab1GOL/GOLTeamH.h @@ -17,6 +17,9 @@ // - 2024/01/17 // - - - - - - - - - - - - - - - - - - - - - - - // Classe GOLTeamH +// +// Cette classe nosu permet de créer et de manipuler un jeu de la vie. +// Elle se base sur l'utilisation de la classe GridTeamH afin de gérer les mouvement dans la grid // - - - - - - - - - - - - - - - - - - - - - - - constexpr unsigned char MAX_ALPHA = 255; diff --git a/GPA675Lab1GOL/GridTeamH.cpp b/GPA675Lab1GOL/GridTeamH.cpp index 6689443..94ba3c3 100644 --- a/GPA675Lab1GOL/GridTeamH.cpp +++ b/GPA675Lab1GOL/GridTeamH.cpp @@ -8,14 +8,14 @@ // Constructeur Grid par défaut GridTeamH::GridTeamH() - : GridTeamH(100, 100, CellType::dead) + : GridTeamH(100, 100, CellType::dead,Classic) { } -GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue) +GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue, BorderManagement borderType) :mWidth{ width }, mHeight{ height }, mEngine(mRandomDevice()), mDistribution(0.0, 1.0) , mAliveCount{}, mLastGenAliveCount{} - , mData{}, mIntermediateData{} + , mData{}, mIntermediateData{}, mBorderType{ Classic } { resize(width, height, initValue); } @@ -95,6 +95,7 @@ void GridTeamH::resize(size_t width, size_t height, CellType initValue) fill(initValue, true); } + void GridTeamH::dealloc() { if (mData && mIntermediateData) { @@ -108,32 +109,75 @@ void GridTeamH::dealloc() // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. GridTeamH::CellType GridTeamH::value(int column, int row) const { - return mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)]; + if (mBorderType == Warpping) { + return mData[(static_cast(row) + mHeight) % mHeight * mWidth + (static_cast(column) + mWidth) % mWidth]; + + } + else if (mBorderType == Mirror) { + + } + else if (mBorderType == Classic) { + return mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)]; + } } // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. void GridTeamH::setValue(int column, int row, CellType value) { - mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)] = value; + if(mBorderType== Warpping){ + mData[(static_cast(row) + mHeight) % mHeight * mWidth + (static_cast(column) + mWidth) % mWidth]= value; + + } + else if(mBorderType== Mirror){ + + } + else if(mBorderType== Classic){ + + mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)] = value; + } + } // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. std::optional GridTeamH::at(int column, int row) const { - if (column >= mWidth || row >= mHeight) - return std::nullopt; + if (mBorderType == Warpping) { + // Logique de gestion des bords toroïdaux + column = (column + mWidth) % mWidth; + row = (row + mHeight) % mHeight; + } + else if (mBorderType == Mirror) { - return mData[(row - 1) * mWidth + (column - 1)]; + } + else if (mBorderType == Classic) { + if (column >= mWidth || row >= mHeight) + return std::nullopt; + + return mData[(row - 1) * mWidth + (column - 1)]; + } + } // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. void GridTeamH::setAt(int column, int row, CellType value) { - if (column > mWidth || row > mHeight) - return; + if (mBorderType == Warpping) { + // Logique de gestion des bords toroïdaux + column = (column + mWidth) % mWidth; + row = (row + mHeight) % mHeight; + mData[(static_cast(row) + mHeight) % mHeight * mWidth + (static_cast(column) + mWidth) % mWidth] = value; + } + else if (mBorderType == Mirror) { - mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)] = value; + } + else if (mBorderType == Classic) { + if (column > mWidth || row > mHeight) + return; + + mData[(static_cast(row) - 1) * mWidth + (static_cast(column) - 1)] = value; + + } } void GridTeamH::setAliveCount(size_t aliveCount) @@ -276,6 +320,7 @@ void GridTeamH::fillBorderManipulations(DataType ptr, CellType value) const } // TODO + void GridTeamH::fillBorderWarped() { @@ -293,6 +338,7 @@ void GridTeamH::switchToIntermediate() auto* temp{ mData }; mData = mIntermediateData; mIntermediateData = temp; + } diff --git a/GPA675Lab1GOL/GridTeamH.h b/GPA675Lab1GOL/GridTeamH.h index 204a3fc..407da52 100644 --- a/GPA675Lab1GOL/GridTeamH.h +++ b/GPA675Lab1GOL/GridTeamH.h @@ -19,6 +19,7 @@ // La classe point représente une grille dans l’espace 2d des réels. // Deux tableaux sont utilisés, un réel et un intermédiaire. +//Elle comporte des méthodes pour manipuler les cellules de la grille et en sortir des statstiques. class GridTeamH { @@ -27,9 +28,15 @@ public: using CellType = GOL::State; using DataType = CellType*; + enum BorderManagement { + Warpping, + Classic, + Mirror, + }; + // Définition des constructeurs / destructeur GridTeamH(); - GridTeamH(size_t width, size_t height, CellType initValue = CellType{}); + GridTeamH(size_t width, size_t height, CellType initValue = CellType{}, BorderManagement borderType = Classic); GridTeamH(GridTeamH const&); GridTeamH(GridTeamH&&) noexcept; @@ -53,7 +60,7 @@ public: void setAt(int column, int row, CellType value); void setAliveCount(size_t aliveCount); - + void setBorderManagement(BorderManagement borderType) { mBorderType = borderType; } // Accesseurs du "buffer" de la grille DataType const& data() const; DataType& data(); @@ -61,6 +68,7 @@ public: DataType const& intData() const; DataType& intData(); + //méthode pour les statistiques size_t totalDead() const; float totalDeadRel() const; @@ -76,25 +84,31 @@ public: int tendencyAbs() const; float tendencyRel() const; + //Méthode de remplissage void fill(CellType value, bool fillBorder); void fillAlternately(CellType initValue, bool fillBorder); void randomize(double percentAlive, bool fillBorder); + //Méthode de gestion de bordure void fillBorder(CellType value); void fillBorderWarped(); void fillBorderMirror(); + //Alternance entre les deux grilles void switchToIntermediate(); private: DataType mData, mIntermediateData; size_t mWidth, mHeight, mAliveCount, mLastGenAliveCount; + BorderManagement mBorderType; + // Pour la génération de nombres aléatoires std::random_device mRandomDevice; std::mt19937 mEngine; std::uniform_real_distribution<> mDistribution; + // Méthodes utilisées en interne void fillBorderManipulations(DataType ptr, CellType value) const; void dealloc(); };