From b4f16386c70bfeab700e7cc129f2f04295aa0059 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Thu, 12 Jan 2023 23:40:59 -0500 Subject: vecteur est fomrmes sont finis --- carre.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 carre.cpp (limited to 'carre.cpp') diff --git a/carre.cpp b/carre.cpp new file mode 100644 index 0000000..1d0ad44 --- /dev/null +++ b/carre.cpp @@ -0,0 +1,15 @@ +#include "carre.h" + +Carre::Carre(int x, int y, int cote) : Rectangle(x, y, cote, cote) { +}; + +Carre::~Carre() { +}; + +void Carre::afficher(ostream &s) { + s << "Carre(x=" << getAncrage().x + << ", y=" << getAncrage().y + << ", c=" << getLargeur() + << ", a=" << getAire() + << ")\n"; +}; -- cgit v1.2.3 From 3fb8effa3603e9a9b96d263009fc1397433436ba Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Fri, 13 Jan 2023 02:34:01 -0500 Subject: Tout sauf les tests --- .gitignore | 1 + canevas.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++++----------- canevas.h | 4 ++-- carre.cpp | 2 +- carre.h | 5 ++++ cercle.cpp | 4 ++-- cercle.h | 7 +++++- couche.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++- couche.h | 30 ++++++++++++++++++++--- rectangle.cpp | 4 ++-- rectangle.h | 7 +++++- tests.h | 5 ++++ vecteur.cpp | 50 +++++++++++++++++++-------------------- vecteur.h | 18 ++++---------- 14 files changed, 217 insertions(+), 66 deletions(-) (limited to 'carre.cpp') diff --git a/.gitignore b/.gitignore index 7aa28f5..41dc0ab 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.out *.o *.obj +graphicus-* # Ctags: tags diff --git a/canevas.cpp b/canevas.cpp index bc7a0e5..1010ea6 100644 --- a/canevas.cpp +++ b/canevas.cpp @@ -9,38 +9,86 @@ #include "canevas.h" Canevas::Canevas() { + Couche couches[MAX_COUCHES]; + for (int i = 0; i < MAX_COUCHES; i++) { + couches[i] = Couche(); + }; + couches[0].changerEtat(STATE_ACTIVE); } Canevas::~Canevas() { + reinitialiser(); } bool Canevas::reinitialiser() { - return true; + for (int i = 0; i < MAX_COUCHES; i++) { + if (!couches[i].reinitialiser()) { + return false; + } + } + return true; } bool Canevas::activerCouche(int index) { - return true; -} + if (index < 0 || index >= MAX_COUCHES) + return false; + for (int i = 0; i < MAX_COUCHES; i++) { + if (couches[i].getEtat() == STATE_ACTIVE) { + couches[i].changerEtat(STATE_INACTIVE); + }; + }; + return couches[index].changerEtat(STATE_ACTIVE); +}; bool Canevas::cacherCouche(int index) { - return true; -} + if (index < 0 || index >= MAX_COUCHES) + return false; + couches[index].changerEtat(STATE_INACTIVE); + return true; +}; bool Canevas::ajouterForme(Forme *p_forme) { - return true; -} + int active = -1; + for (int i = 0; i < MAX_COUCHES; i++) + active = (couches[i].getEtat() == STATE_ACTIVE) ? i : active; + if (active == -1) + return false; + return couches[active].ajouterForme(p_forme); +}; bool Canevas::retirerForme(int index) { - return true; -} + int active = -1; + for (int i = 0; i < MAX_COUCHES; i++) + active = (couches[i].getEtat() == STATE_ACTIVE) ? i : active; + if (active == -1) + return false; + if (couches[active].supprimerForme(index)==NULL) + return false; + return true; +}; double Canevas::aire() { - return 0.0; -} + double aire = 0; + for (int i = 0; i < MAX_COUCHES; i++) { + if (couches[i].getEtat() == STATE_ACTIVE) { + aire += couches[i].aire(); + }; + }; + return aire; +}; bool Canevas::translater(int deltaX, int deltaY) { - return true; -} + int active = -1; + for (int i = 0; i < MAX_COUCHES; i++) + active = (couches[i].getEtat() == STATE_ACTIVE) ? i : active; + if (active == -1) + return false; + return couches[active].translater(deltaX, deltaY); +}; void Canevas::afficher(ostream & s) { -} + for (int i = 0; i < MAX_COUCHES; i++) { + s << "----- Couche " << i << "\n"; + couches[i].afficher(s); + }; +}; diff --git a/canevas.h b/canevas.h index 21ed457..1833e52 100644 --- a/canevas.h +++ b/canevas.h @@ -7,8 +7,8 @@ * Ce fichier fait partie de la distribution de Graphicus. ********/ -#ifndef DESSIN_H -#define DESSIN_H +#ifndef __DESSIN_H__ +#define __DESSIN_H__ #include #include "forme.h" diff --git a/carre.cpp b/carre.cpp index 1d0ad44..627eb91 100644 --- a/carre.cpp +++ b/carre.cpp @@ -10,6 +10,6 @@ void Carre::afficher(ostream &s) { s << "Carre(x=" << getAncrage().x << ", y=" << getAncrage().y << ", c=" << getLargeur() - << ", a=" << getAire() + << ", a=" << aire() << ")\n"; }; diff --git a/carre.h b/carre.h index 80b9d57..d986f7f 100644 --- a/carre.h +++ b/carre.h @@ -1,3 +1,6 @@ +#ifndef __CARRE_H__ +#define __CARRE_H__ + #include "rectangle.h" class Carre : public Rectangle { @@ -6,3 +9,5 @@ public: ~Carre(); void afficher(ostream &s); }; + +#endif diff --git a/cercle.cpp b/cercle.cpp index 4747258..d2e7f61 100644 --- a/cercle.cpp +++ b/cercle.cpp @@ -18,7 +18,7 @@ int Cercle::getRayon() { return rayon; }; -double Cercle::getAire() { +double Cercle::aire() { return M_PI*pow(rayon,2); }; @@ -30,5 +30,5 @@ void Cercle::afficher(ostream & s) { s << "Cercle (x=" << getAncrage().x << ", y=" << getAncrage().y << ", r=" << getRayon() - << ", aire=" << getAire() << ")\n"; + << ", aire=" << aire() << ")\n"; }; diff --git a/cercle.h b/cercle.h index d3eca66..c4a5923 100644 --- a/cercle.h +++ b/cercle.h @@ -1,3 +1,6 @@ +#ifndef __CERCLE_H__ +#define __CERCLE_H__ + #include "forme.h" class Cercle:Forme { @@ -8,7 +11,9 @@ class Cercle:Forme { ~Cercle(); void setRayon(int r); int getRayon(); - double getAire(); + double aire(); double getPerimetre(); void afficher(ostream & s); }; + +#endif diff --git a/couche.cpp b/couche.cpp index 07c4418..9273031 100644 --- a/couche.cpp +++ b/couche.cpp @@ -8,4 +8,72 @@ #include "couche.h" -// Implementation a faire... +Couche::Couche() { + state = STATE_INIT; + vecteur = Vecteur(); +}; + +Couche::~Couche() { + vecteur.vider(); +}; + +int Couche::getEtat() { + return state; +}; + +Forme *Couche::getForme(int index) { + return vecteur.getForme(index); +}; + +double Couche::aire() { + double aire = 0; + for (int i = 0; i < vecteur.getTaille(); i++) { + aire += vecteur.getForme(i)->aire(); + }; + return aire; +}; + +void Couche::afficher(ostream &s) { + if (state == STATE_INIT) { + s << "Couche initialisée\n"; + } else { + vecteur.afficher(s); + }; +}; + +bool Couche::changerEtat(int newState) { + if (state == STATE_INIT) return false; + state = newState; + return true; +}; + +bool Couche::translater(int deltaX, int deltaY) { + if (state != STATE_ACTIVE) return false; + for (int i = 0; i < vecteur.getTaille(); i++) + vecteur.getForme(i)->translater(deltaX, deltaY); + return true; +}; + +bool Couche::ajouterForme(Forme *f) { + int initialState = getEtat(); + if (initialState == STATE_INACTIVE) return false; + bool success = vecteur.ajouterForme(f); + if (success) { + changerEtat(STATE_ACTIVE); + }; + return success; +}; + +Forme *Couche::supprimerForme(int index) { + if (state != STATE_ACTIVE) return NULL; + return vecteur.supprimerForme(index); +}; + +bool Couche::reinitialiser() { + if (state == STATE_INIT) return false; + state = STATE_INIT; + vecteur.vider(); + return true; +}; + + diff --git a/couche.h b/couche.h index 32cba2f..dc82e01 100644 --- a/couche.h +++ b/couche.h @@ -8,11 +8,35 @@ * Ce fichier fait partie de la distribution de Graphicus. ********/ -#ifndef COUCHE_H -#define COUCHE_H +#ifndef __COUCHE_H__ +#define __COUCHE_H__ + +#define STATE_INIT 0 // Couche initialisee mais vide +#define STATE_ACTIVE 1 // Couche active (peut-etre modifiee) +#define STATE_INACTIVE 2 // Couche inactive (non modifiable) + +#include "vecteur.h" class Couche { - // Classe a completer + private: + int state; + Vecteur vecteur; + public: + // Initialisation + Couche(); + ~Couche(); + // Informations + int getEtat(); + Forme *getForme(int index); + double aire(); + void afficher(ostream &s); + // Modifications + bool changerEtat(int newState); + bool translater(int deltaX, int deltaY); + bool ajouterForme(Forme *f); + Forme *supprimerForme(int index); + bool reinitialiser(); + }; #endif diff --git a/rectangle.cpp b/rectangle.cpp index 239ea81..f1d23da 100644 --- a/rectangle.cpp +++ b/rectangle.cpp @@ -30,7 +30,7 @@ void Rectangle::setHauteur(int h){ hauteur=h; }; -double Rectangle::getAire(){ +double Rectangle::aire(){ return largeur*hauteur; }; @@ -39,6 +39,6 @@ void Rectangle::afficher(ostream &s){ << ", y=" << getAncrageForme().y << ", l=" << getLargeur() << ", h=" << getHauteur() - << ", aire=" << getAire() + << ", aire=" << aire() << ")\n"; }; diff --git a/rectangle.h b/rectangle.h index 3bdc8a1..0c85119 100644 --- a/rectangle.h +++ b/rectangle.h @@ -1,3 +1,6 @@ +#ifndef __RECTANGLE_H__ +#define __RECTANGLE_H__ + #include "forme.h" class Rectangle:public Forme{ @@ -12,6 +15,8 @@ class Rectangle:public Forme{ Coordonnee getAncrageForme(); void setLargeur(int l); void setHauteur(int h); - double getAire(); + double aire(); void afficher(ostream &s); }; + +#endif diff --git a/tests.h b/tests.h index 3397fb9..aefc8d0 100644 --- a/tests.h +++ b/tests.h @@ -7,6 +7,9 @@ * fait partie de la distribution de Graphicus. ********/ +#ifndef __TESTS_H__ +#define __TESTS_H__ + #include #include "canevas.h" @@ -26,3 +29,5 @@ public: void tests_application_cas_02(); void tests_application(); // Appel de tous les tests applicatifs }; + +#endif diff --git a/vecteur.cpp b/vecteur.cpp index d9a560c..2fd3589 100644 --- a/vecteur.cpp +++ b/vecteur.cpp @@ -24,38 +24,38 @@ int Vecteur::getTaille(){ }; void Vecteur::afficher(ostream &s){ - for (int i = 0; i < taille; i++) { - formes[i]->afficher(s); - } + for (int i = 0; i < taille; i++) { + formes[i]->afficher(s); + } }; bool Vecteur::ajouterForme(Forme *f) { - if (taille == capacite) { - // Double the size of the array - int newCapacite = capacite * 2; - Forme **newFormes = new (nothrow) Forme*[newCapacite]; - if(newFormes==nullptr) return false; - for (int i = 0; i < taille; i++) { - newFormes[i] = formes[i]; - } - capacite = newCapacite; - delete[] formes; - formes = newFormes; + if (taille == capacite) { + // Double the size of the array + int newCapacite = capacite * 2; + Forme **newFormes = new (nothrow) Forme*[newCapacite]; + if(newFormes==nullptr) return false; + for (int i = 0; i < taille; i++) { + newFormes[i] = formes[i]; } - formes[taille] = f; - taille++; - return true; + capacite = newCapacite; + delete[] formes; + formes = newFormes; + } + formes[taille] = f; + taille++; + return true; }; Forme *Vecteur::supprimerForme(int index) { - Forme *f = formes[index]; - while (index < taille) { - formes[index] = formes[index + 1]; - index++; - } - formes[taille] = NULL; - taille--; - return f; + Forme *f = formes[index]; + while (index < taille) { + formes[index] = formes[index + 1]; + index++; + } + formes[taille] = NULL; + taille--; + return f; }; void Vecteur::vider() { diff --git a/vecteur.h b/vecteur.h index 58843f7..e451974 100644 --- a/vecteur.h +++ b/vecteur.h @@ -1,22 +1,11 @@ +#ifndef __VECTEUR_H__ +#define __VECTEUR_H__ + #include #include "forme.h" using namespace std; -// - [x] Items stockés sont des pointeurs de Forme -// - [ ] Items toujours contigus en mémoire -// - [ ] connaître la capacité maximale du vecteur -// - [ ] connaître la taille courante du vecteur -// - [ ] Lorsqu'il manque d'espace pour ajouter une forme, -// le vecteur double sa capacité -// - [ ] vider le vecteur en un seul appel -// - [ ] lorsque le vecteur est vidé, détruire ses formes -// - [ ] savoir si le vecteur est vide (bool) -// - [ ] ajouter une forme à la fin du vecteur (true si ok) -// - [ ] supprimer une forme à un index (retourne la forme) NULL on error -// - [ ] récupérer une forme à un index (retourne la forme) NULL on error -// - [ ] afficher le vecteur en utilisant Forme::afficher() - class Vecteur { private: int capacite; // capacité maximale actuelle du vecteur @@ -37,3 +26,4 @@ class Vecteur { void vider(); }; +#endif -- cgit v1.2.3