diff --git a/FireSimulator.cpp b/FireSimulator.cpp index 8729f9b0ab84b442c786e45a3a0ae91f82f0d2cd..8ac2973b7842600d2f1b8ef44f8483d982db156c 100644 --- a/FireSimulator.cpp +++ b/FireSimulator.cpp @@ -16,7 +16,9 @@ FireSimulator::FireSimulator(Image& img, int i, int j) { assert(img.getPixel(i, j) == Color::Green); - pImg = &img; + Image cpImg(img); + + pImg = &cpImg; Analyst a(img); @@ -50,6 +52,8 @@ FireSimulator::~FireSimulator() { vector <Image> FireSimulator::runSimulator(int n) { + assert(n >= 0); + vector <Image> tab; tab.push_back(getImage()); @@ -73,7 +77,7 @@ void FireSimulator::nextStage() { return; } - extinguishFire(); + if (experienceTime >= 3) extinguishFire(); vector <int> riskArea = unsafeList(); diff --git a/FireSimulator.h b/FireSimulator.h index 25e67fda0028c8a1bfc41c14d908403fef401306..7e378f0249970662f4766fb76170a83432ee959b 100644 --- a/FireSimulator.h +++ b/FireSimulator.h @@ -15,9 +15,13 @@ using std::set; +// Représente un feu sur le pixel k, allumé lors de l'étape lightTime. struct Fire { + // Pixel incendié. int k; + + // Naissance de l'incendie sur ce pixel. int lightTime; }; @@ -31,35 +35,67 @@ class FireSimulator { public: + // Prépare les données pour une simulation d'incendie sur l'image img, dans la zone + // de forêt du pixel k. FireSimulator(Image& img, int k); + // Prépare les données pour une simulation d'incendie sur l'image img, dans la zone + // de forêt du pixel de coordonnées (i,j). FireSimulator(Image& img, int i, int j); + // Destructeur, désalloue la mémoire. ~FireSimulator(); + // Fais avancer la simulation de n étapes. + // Retourne les images de chacune des étapes effectuées. vector <Image> runSimulator(int n); + // Fais avancer la simulation d'une étape. void nextStage(); + // Retourne l'image de la simulation à l'étape courante. Image getImage(); + // Retourne l'étape courante. int getTime(); private: + // Repère temporel sur l'état de la simulation. Commence à 0 et s'incrémente à chaque étape. int experienceTime; + + // Une copie modifiable de l'image de départ de la simulation. Image* pImg; - set <int> limitZone, dustZone; + + // Définit la zone de forêt dans laquelle l'incendie se déclare. Il ne peut se propager en dehors. + set <int> limitZone; + + // Définit l'ensembe des pixels de cendres, issues d'un incendie qui s'est éteint. Un feu ne peut pas s'y déclarer. + set <int> dustZone; + + // Définit la zone incendiée. Chaque pixel dans cette zone y est pour une durée temporaire (3 temps). set <Fire> fireZone; //////////////////////////////////////////////////////////////////////////////// + // Détermine aléatoirement l'emplacement du départ de feu parmi les pixels de limitZone. + // L'ajoute à fireZone. Appelée une fois au début de l'expérience. void lightFire(); + + // Vérifie quels feux doivent être éteints, les retire de fireZone et les ajoute à dustzone. + // Appelée à chaque stade de l'expérience à partir du 3e temps. void extinguishFire(); + + // Incrémente experienceTime et actualise l'image courante. void runTime(); + + // Actualise l'image courante à partir de fireZone et dustZone. void refreshImage(); + // Vrai si le pixel de coordonnées (i2, j2) est une zone de forêt qui touche une zone de flammes. bool isUnsafe(int i1, int j1, int i2, int j2); + + // Liste de tous les pixels de forêt en contact avec un pixel de flammes. vector <int> unsafeList(); };