diff --git a/GPA675Lab1GOL/GOLTeamH.cpp b/GPA675Lab1GOL/GOLTeamH.cpp index 3e2dc2d..9edbb53 100644 --- a/GPA675Lab1GOL/GOLTeamH.cpp +++ b/GPA675Lab1GOL/GOLTeamH.cpp @@ -59,7 +59,7 @@ GOL::ImplementationInformation GOLTeamH::information() const { return std::move(ImplementationInformation{ .title{"Laboratoire 1"}, - .authors{{"Timothée Leclaire-Fournier"}, {"et Martin Euzenat"} } + .authors{{"Timothée Leclaire-Fournier"}, {"Martin Euzenat"} } // Réponses aux questions... }); } @@ -171,13 +171,38 @@ void GOLTeamH::setSolidColor(State state, Color const& color) // TODO void GOLTeamH::processOneStep() { - + } -// TODO void GOLTeamH::updateImage(uint32_t* buffer, size_t buffer_size) const { + if (buffer == nullptr) + return; + auto s_ptr = buffer; + auto e_ptr = &buffer[buffer_size]; + + for (const auto& i : mData.data()) { + if (i == GridTeamH::CellType::alive) { + *s_ptr &= 0; // Clear + *s_ptr |= MAX_ALPHA << 24; // Alpha = 255 + *s_ptr |= mAliveColor.red << 16; + *s_ptr |= mAliveColor.green << 8; + *s_ptr |= mAliveColor.blue; + } + else { + *s_ptr &= 0; + *s_ptr |= MAX_ALPHA << 24; + *s_ptr |= mDeadColor.red << 16; + *s_ptr |= mDeadColor.green << 8; + *s_ptr |= mDeadColor.blue; + } + s_ptr++; + + // Sanity check + if (s_ptr > e_ptr) + break; + } } std::optional GOLTeamH::convertCharToNumber(const char c) diff --git a/GPA675Lab1GOL/GOLTeamH.h b/GPA675Lab1GOL/GOLTeamH.h index bc89e4b..87c7859 100644 --- a/GPA675Lab1GOL/GOLTeamH.h +++ b/GPA675Lab1GOL/GOLTeamH.h @@ -5,7 +5,9 @@ #include #include #include -#include "Grid.h" +#include "GridTeamH.h" + +constexpr unsigned char MAX_ALPHA = 255; class GOLTeamH : public GOL { @@ -38,7 +40,7 @@ private: std::optional mBorderManagement; std::optional mIteration; - Grid mData; + GridTeamH mData; std::bitset<9> mParsedRuleRevive, mParsedRuleSurvive; Color mDeadColor, mAliveColor; diff --git a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj index a2e6ea8..6a3e938 100644 --- a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj +++ b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj @@ -111,14 +111,14 @@ - + - + diff --git a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters index b0bf2be..b088907 100644 --- a/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters +++ b/GPA675Lab1GOL/GPA675Lab1GOL.vcxproj.filters @@ -31,7 +31,7 @@ Source Files - + Source Files @@ -39,7 +39,7 @@ - + Header Files diff --git a/GPA675Lab1GOL/Grid.h b/GPA675Lab1GOL/Grid.h deleted file mode 100644 index a31052b..0000000 --- a/GPA675Lab1GOL/Grid.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "GOL.h" - -class Grid // Classe facilitant la gestion d'un tableau dynamique 2d. -{ // -public: // - // Définition des types // - using CellType = GOL::State; // Correspond au type fondamental de chaque cellule de la grille. - using DataType = std::vector; // Correspond à la grille, au conteneur de cellules. À vous de déterminer la structure de données à utiliser. - // - // Définition des constructeurs / destructeur // - Grid(); // - Grid(size_t width, size_t height, CellType initValue = CellType{}); // - Grid(Grid const&) = delete; // - Grid(Grid&&) = delete; // - Grid& operator=(Grid const&) = delete; // - Grid& operator=(Grid&&) = delete; // - ~Grid(); // - // - // Accesseurs et mutateurs de la grille // - size_t width() const; // Accesseur retournant la largeur de la grille. - size_t height() const; // Accesseur retournant la hauteur de la grille. - size_t size() const; // Accesseur retournant le nombre de cellule de la grille. - // - void resize(size_t width, size_t height, CellType initValue = CellType{}); // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée. - // - // Accesseurs et mutateurs des cellules // - CellType value(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. - void setValue(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Pour une raison de performance, cette fonction NE VALIDE PAS ses entrées. Autrement dit, c'est la responsabilité du programmeur utilisateur de faire ses validations, au risque de 'crasher' le programme. - // - std::optional at(int column, int row) const; // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et retourne un optional nul si la coordonnée est invalide. - void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide. - // - // Accesseurs du "buffer" de la grille. // - DataType const& data() const; // Accesseur en lecture seule sur le "buffer" de la grille. - DataType& data(); // Accesseur en lecture/écriture sur le "buffer" de la grille. - - size_t totalDead() const; - float totalDeadRel() const; - - size_t totalAlive() const; - float totalAliveRel() const; - - void fill(CellType value); - void fillAternately(CellType initValue); - void randomize(double percentAlive); - -private: // - DataType mData; // Il y a des attributs essentiels au fonctionnement de cette classe. - size_t mWidth, mHeight; // À vous de les déterminer. - - // Random - std::random_device mRandomDevice; - std::mt19937 mEngine; - std::uniform_real_distribution<> mDistribution; -}; \ No newline at end of file diff --git a/GPA675Lab1GOL/Grid.cpp b/GPA675Lab1GOL/GridTeamH.cpp similarity index 68% rename from GPA675Lab1GOL/Grid.cpp rename to GPA675Lab1GOL/GridTeamH.cpp index 782b7a9..a234884 100644 --- a/GPA675Lab1GOL/Grid.cpp +++ b/GPA675Lab1GOL/GridTeamH.cpp @@ -1,42 +1,42 @@ -#include "Grid.h" +#include "GridTeamH.h" #include "GOL.h" -Grid::Grid() - : Grid(100, 100, CellType::alive) +GridTeamH::GridTeamH() + : GridTeamH(100, 100, CellType::alive) { } -Grid::Grid(size_t width, size_t height, CellType initValue) +GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue) :mWidth{ width }, mHeight{ height }, mEngine(mRandomDevice()), mDistribution(0.0, 1.0) { resize(width, height, initValue); } // Destructeur Grid -Grid::~Grid() +GridTeamH::~GridTeamH() { } // Accesseur retournant la largeur de la grille. -size_t Grid::width() const +size_t GridTeamH::width() const { return mWidth; } // Accesseur retournant la hauteur de la grille. -size_t Grid::height() const +size_t GridTeamH::height() const { return mHeight; } // Accesseur retournant le nombre de cellule de la grille (la taille de la grille). -size_t Grid::size() const +size_t GridTeamH::size() const { return mWidth * mHeight; } // Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée. -void Grid::resize(size_t width, size_t height, CellType initValue) +void GridTeamH::resize(size_t width, size_t height, CellType initValue) { // TODO: Performance de resize avec beaucoup d'appel? // Investiguer reserve + resize @@ -48,19 +48,19 @@ void Grid::resize(size_t width, size_t height, CellType initValue) } // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. -Grid::CellType Grid::value(int column, int row) const +GridTeamH::CellType GridTeamH::value(int column, int row) const { return mData[(column - 1) * (row - 1)]; } // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. -void Grid::setValue(int column, int row, CellType value) +void GridTeamH::setValue(int column, int row, CellType value) { mData[(column - 1) * (row - 1)] = value; } // Accesseur retournant la valeur d'une cellule à une certaine coordonnée. -std::optional Grid::at(int column, int row) const +std::optional GridTeamH::at(int column, int row) const { if (column > mWidth || row > mHeight) return std::nullopt; @@ -69,7 +69,7 @@ std::optional Grid::at(int column, int row) const } // Mutateur modifiant la valeur d'une cellule à une certaine coordonn�e. -void Grid::setAt(int column, int row, CellType value) +void GridTeamH::setAt(int column, int row, CellType value) { if (column > mWidth || row > mHeight) return; @@ -77,44 +77,44 @@ void Grid::setAt(int column, int row, CellType value) mData[(column - 1) * (row - 1)] = value; } // Accesseur en lecture seule sur le "buffer" de la grille. -Grid::DataType const& Grid::data() const +GridTeamH::DataType const& GridTeamH::data() const { return mData; } // Accesseur en lecture/écriture sur le "buffer" de la grille. -Grid::DataType& Grid::data() +GridTeamH::DataType& GridTeamH::data() { return mData; } // https://en.cppreference.com/w/cpp/algorithm/count -size_t Grid::totalDead() const +size_t GridTeamH::totalDead() const { return std::count_if(mData.begin(), mData.end(), [](auto& i) { return i == CellType::dead; }); } -float Grid::totalDeadRel() const +float GridTeamH::totalDeadRel() const { return static_cast(totalDead()) / static_cast(size()); } -size_t Grid::totalAlive() const +size_t GridTeamH::totalAlive() const { return std::count_if(mData.begin(), mData.end(), [](auto& i) { return i == CellType::alive; }); } -float Grid::totalAliveRel() const +float GridTeamH::totalAliveRel() const { return static_cast(totalAlive()) / static_cast(size()); } -void Grid::fill(CellType value) +void GridTeamH::fill(CellType value) { for (auto& i : mData) i = value; } -void Grid::fillAternately(CellType initValue) +void GridTeamH::fillAternately(CellType initValue) { auto otherValue = (initValue == CellType::alive) ? CellType::dead : CellType::alive; @@ -122,10 +122,12 @@ void Grid::fillAternately(CellType initValue) mData[i] = !(i % 2) ? initValue : otherValue; } -void Grid::randomize(double percentAlive) +void GridTeamH::randomize(double percentAlive) { for (auto& i : mData) { if (mDistribution(mEngine) < percentAlive) i = CellType::alive; + else + i = CellType::dead; } } diff --git a/GPA675Lab1GOL/GridTeamH.h b/GPA675Lab1GOL/GridTeamH.h new file mode 100644 index 0000000..b1d9ab1 --- /dev/null +++ b/GPA675Lab1GOL/GridTeamH.h @@ -0,0 +1,61 @@ +#pragma once + +#include +#include +#include + +#include "GOL.h" + +class GridTeamH +{ +public: + // Définition des types + using CellType = GOL::State; + using DataType = std::vector; + + // Définition des constructeurs / destructeur + GridTeamH(); + GridTeamH(size_t width, size_t height, CellType initValue = CellType{}); + GridTeamH(GridTeamH const&) = delete; + GridTeamH(GridTeamH&&) = delete; + GridTeamH& operator=(GridTeamH const&) = delete; + GridTeamH& operator=(GridTeamH&&) = delete; + ~GridTeamH(); + + // Accesseurs et mutateurs de la grille + size_t width() const; + size_t height() const; + size_t size() const; + + void resize(size_t width, size_t height, CellType initValue = CellType{}); + + // Accesseurs et mutateurs des cellules + CellType value(int column, int row) const; + void setValue(int column, int row, CellType value); + + std::optional at(int column, int row) const; + void setAt(int column, int row, CellType value); + + // Accesseurs du "buffer" de la grille + DataType const& data() const; + DataType& data(); + + size_t totalDead() const; + float totalDeadRel() const; + + size_t totalAlive() const; + float totalAliveRel() const; + + void fill(CellType value); + void fillAternately(CellType initValue); + void randomize(double percentAlive); + +private: + DataType mData; + size_t mWidth, mHeight; + + // Pour la génération de nombres aléatoires + std::random_device mRandomDevice; + std::mt19937 mEngine; + std::uniform_real_distribution<> mDistribution; +}; \ No newline at end of file