diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | canevas.cpp | 81 | ||||
-rw-r--r-- | canevas.h | 5 | ||||
-rw-r--r-- | carre.cpp | 15 | ||||
-rw-r--r-- | carre.h | 13 | ||||
-rw-r--r-- | cercle.cpp | 32 | ||||
-rw-r--r-- | cercle.h | 19 | ||||
-rw-r--r-- | couche.cpp | 71 | ||||
-rw-r--r-- | couche.h | 37 | ||||
-rw-r--r-- | graphicus-02.cpp (renamed from graphicus-01.cpp) | 10 | ||||
-rw-r--r-- | makefile | 45 | ||||
-rw-r--r-- | rectangle.cpp | 42 | ||||
-rw-r--r-- | rectangle.h | 22 | ||||
-rw-r--r-- | tests.cpp | 324 | ||||
-rw-r--r-- | tests.h | 9 | ||||
-rw-r--r-- | vecteur.cpp | 74 | ||||
-rw-r--r-- | vecteur.h | 30 |
17 files changed, 773 insertions, 58 deletions
@@ -3,8 +3,8 @@ *.out *.o *.obj -*.so *.a +graphicus-* # Ctags: tags diff --git a/canevas.cpp b/canevas.cpp index bc7a0e5..0c203fc 100644 --- a/canevas.cpp +++ b/canevas.cpp @@ -9,38 +9,91 @@ #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++) { + 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); + }; +}; + +bool Canevas::reinitialiserCouche(int index) { + if (index < 0 || index >= MAX_COUCHES){ + return false; + }; + return couches[index].reinitialiser(); +}; @@ -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 <iostream>
#include "forme.h"
@@ -34,6 +34,7 @@ public: double aire();
bool translater(int deltaX, int deltaY);
void afficher(ostream & s);
+ bool reinitialiserCouche(int index);
private:
Couche couches[MAX_COUCHES];
diff --git a/carre.cpp b/carre.cpp new file mode 100644 index 0000000..627eb91 --- /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=" << aire() + << ")\n"; +}; @@ -0,0 +1,13 @@ +#ifndef __CARRE_H__ +#define __CARRE_H__ + +#include "rectangle.h" + +class Carre : public Rectangle { +public: + Carre(int x=0, int y=0, int cote=1); + ~Carre(); + void afficher(ostream &s); +}; + +#endif diff --git a/cercle.cpp b/cercle.cpp new file mode 100644 index 0000000..bd3c876 --- /dev/null +++ b/cercle.cpp @@ -0,0 +1,32 @@ +#include "cercle.h" +#include <math.h> + +Cercle::Cercle(int x, int y, int r):Forme(x,y) { + setRayon(r); +}; + +Cercle::~Cercle() { +}; + +void Cercle::setRayon(int r) { + rayon = r; +}; + +int Cercle::getRayon() { + return rayon; +}; + +double Cercle::aire() { + return M_PI*pow(rayon,2); +}; + +double Cercle::getPerimetre() { + return 2*M_PI*rayon; +}; + +void Cercle::afficher(ostream & s) { + s << "Cercle (x=" << getAncrage().x + << ", y=" << getAncrage().y + << ", r=" << getRayon() + << ", aire=" << aire() << ")\n"; +}; diff --git a/cercle.h b/cercle.h new file mode 100644 index 0000000..1254193 --- /dev/null +++ b/cercle.h @@ -0,0 +1,19 @@ +#ifndef __CERCLE_H__ +#define __CERCLE_H__ + +#include "forme.h" + +class Cercle:public Forme { + private: + int rayon; + public: + Cercle(int x=0, int y=0, int r=1); + ~Cercle(); + void setRayon(int r); + int getRayon(); + double aire(); + double getPerimetre(); + void afficher(ostream & s); +}; + +#endif @@ -8,4 +8,73 @@ #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 ( newState>=STATE_INIT && newState<=STATE_INACTIVE ) { + state = newState; + return true; + }; + return false; +}; + +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) { + if (state != STATE_ACTIVE) return false; + return vecteur.ajouterForme(f); +}; + +Forme *Couche::supprimerForme(int index) { + if (state != STATE_ACTIVE) { + return NULL; + } else { + return vecteur.supprimerForme(index); + }; + return vecteur.supprimerForme(index); +}; + +bool Couche::reinitialiser() { + if (state == STATE_INIT) return false; + state = STATE_INIT; + vecteur.vider(); + return true; +}; + + @@ -8,11 +8,42 @@ * 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(); + }; +static const char* const STATES[] = { + "initialisee", + "actif", + "inactif" +}; + + #endif diff --git a/graphicus-01.cpp b/graphicus-02.cpp index b544cc8..d42dd8f 100644 --- a/graphicus-01.cpp +++ b/graphicus-02.cpp @@ -1,5 +1,5 @@ /******** - * Fichier: graphicus-01.cpp + * Fichier: graphicus-02.cpp * Auteurs: C.-A. Brunet * Date: 08 janvier 2018 (creation) * Description: gestionnaire de tests pour l'application Graphicus. Ce @@ -10,9 +10,11 @@ using namespace std; int main() { - Tests tests; + Tests tests; - tests.tests_application(); - return 0; + /* tests.tests_unitaires(); */ + tests.tests_application_cas_01(); + + return 0; } @@ -1,27 +1,54 @@ #
# Auteur: C.-A. Brunet
# Date: 08 janvier 2018
-# Description: compilation de graphicus-01. Ce fichier fait partie de
+# Description: compilation de graphicus-02. Ce fichier fait partie de
# la distribution de Graphicus.
#
-graphicus-01: graphicus-01.o tests.o canevas.o couche.o forme.o
- g++ -o graphicus-01 graphicus-01.o tests.o canevas.o couche.o forme.o
+ALL := graphicus-02.o tests.o canevas.o couche.o forme.o vecteur.o cercle.o rectangle.o carre.o
+
+CFLAGS := -flto -Ofast -march=native
+
+# graphicus-02: $(ALL)
+# g++ $(CFLAGS) -o $@ $^ && strip $@ $^
+
+graphicus-02: $(ALL)
+ g++ $(CFLAGS) -o $@ $^
-graphicus-01.o: graphicus-01.cpp canevas.h couche.h forme.h
- g++ -c graphicus-01.cpp
tests.o: tests.cpp tests.h canevas.h couche.h forme.h
- g++ -c tests.cpp
+ g++ $(CFLAGS) -c tests.cpp
canevas.o: canevas.cpp canevas.h couche.h forme.h
- g++ -c canevas.cpp
+ g++ $(CFLAGS) -c canevas.cpp
couche.o: couche.cpp couche.h forme.h
- g++ -c couche.cpp
+ g++ $(CFLAGS) -c couche.cpp
forme.o: forme.cpp forme.h
- g++ -c forme.cpp
+ g++ $(CFLAGS) -c forme.cpp
+
+vecteur.o: vecteur.cpp vecteur.h coordonnee.h
+ g++ $(CFLAGS) -c vecteur.cpp
+
+rectangle.o: rectangle.cpp rectangle.h forme.h
+ g++ $(CFLAGS) -c rectangle.cpp
+
+carre.o: carre.cpp carre.h rectangle.h forme.h
+ g++ $(CFLAGS) -c carre.cpp
+
+cercle.o: cercle.cpp cercle.h forme.h
+ g++ $(CFLAGS) -c cercle.cpp
+
+graphicus-02.o: graphicus-02.cpp canevas.h couche.h forme.h
+ g++ $(CFLAGS) -c graphicus-02.cpp
clean:
rm -f *.o
+
+options:
+ @echo "Option de compilation de GRAPHICUS:"
+ @echo " graphicus-02: Construction de l'executable dans sa totalité"
+ @echo " clean: Nettoyage des fichiers temporaires '.o'"
+ @echo " *.o: Construction des fichiers objets"
+
diff --git a/rectangle.cpp b/rectangle.cpp new file mode 100644 index 0000000..a70bfe4 --- /dev/null +++ b/rectangle.cpp @@ -0,0 +1,42 @@ +#include "rectangle.h" + +Rectangle::Rectangle(int x, int y, int w, int h):Forme(x, y){ + setLargeur(w); + setHauteur(h); +}; + +Rectangle::~Rectangle(){ +}; + +int Rectangle::getLargeur(){ + return largeur; +}; + +int Rectangle::getHauteur(){ + return hauteur; +}; + +Coordonnee Rectangle::getAncrageForme(){ + return getAncrage(); +}; + +void Rectangle::setLargeur(int l){ + largeur=l; +}; + +void Rectangle::setHauteur(int h){ + hauteur=h; +}; + +double Rectangle::aire(){ + return largeur*hauteur; +}; + +void Rectangle::afficher(ostream &s){ + s << "Rectangle:(x=" << getAncrageForme().x + << ", y=" << getAncrageForme().y + << ", l=" << getLargeur() + << ", h=" << getHauteur() + << ", aire=" << aire() + << ")\n"; +}; diff --git a/rectangle.h b/rectangle.h new file mode 100644 index 0000000..59b990b --- /dev/null +++ b/rectangle.h @@ -0,0 +1,22 @@ +#ifndef __RECTANGLE_H__ +#define __RECTANGLE_H__ + +#include "forme.h" + +class Rectangle:public Forme{ + private: + int largeur; + int hauteur; + public: + Rectangle(int x=0, int y=0, int l=1, int h=1); + ~Rectangle(); + int getLargeur(); + int getHauteur(); + Coordonnee getAncrageForme(); + void setLargeur(int l); + void setHauteur(int h); + double aire(); + void afficher(ostream &s); +}; + +#endif @@ -9,42 +9,318 @@ #include "tests.h" +// Tests sur les formes geometriques void Tests::tests_unitaires_formes() { - // Tests sur les formes geometriques -} + cout << "----- Tests des formes geometriques -----\n"; + cout << "\n--- Tests sur le rectangle ---\n"; + + cout << "Initialisation rectangle 3x4 en (1,2): \n\t"; + Rectangle r1(1, 2, 3, 4); + r1.afficher(cout); + + cout << "Translation de (-1,2) pour arriver à (0,4): \n\t"; + r1.translater(-1, 2); + r1.afficher(cout); + + cout << "Initialisation rectangle par defaut (1x1 en (0,0)): \n\t"; + Rectangle r2; + r2.afficher(cout); + cout << "\n"; + + cout << "\n--- Tests sur le carre ---\n"; + + cout << "Initialisation carre de cote=12 en (-2,-2): \n\t"; + Carre cr1(-2, -2, 12); + cr1.afficher(cout); + + cout << "Initialisation carre par defaut (1x1 en (0,0)): \n\t"; + Carre cr2; + cr2.afficher(cout); + cout << "\n"; + + + cout << "\n--- Tests sur le cercle ---\n"; + cout << "Initialisation cercle de rayon 5 en (0,0): \n\t"; + Cercle cc1(0, 0, 5); + cc1.afficher(cout); + + cout << "Initialisation cercle par defaut (rayon=1 en (0,0)): \n\t"; + Cercle cc2; + cc2.afficher(cout); + cout << "\n"; +}; + +// Tests sur la classe Vecteur void Tests::tests_unitaires_vecteur() { - // Tests sur la classe Vecteur -} + cout << "----- Tests de la classe Vecteur -----\n\n"; + + cout << "--- Initialisation d\'un vecteur vide ---"; + Vecteur v1; + cout << "\nVide: " << ((v1.estVide())? "Oui" : "Non") + << "\nTaille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout d'une forme (sans redimensionnement) ---"; + v1.ajouterForme(new Rectangle() ); // a=1 + cout << "\nVide: " << ((v1.estVide())? "Oui" : "Non") + << "\nTaille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout des autres formes (redimensionnement necessaire) ---"; + v1.ajouterForme( new Rectangle(1, 2, 8, 3) ); + v1.ajouterForme( new Carre(5, 6, 5) ); + v1.ajouterForme( new Cercle(0, 0, 1) ); + v1.ajouterForme( new Rectangle(-1,-1,95,10) ); + cout << "\nTaille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n\n"; + cout << "--- Suppression de la forme 4 (sans deplacement) ---"; + Forme* f1 = v1.supprimerForme(4); + cout << "\nForme supprimee: "; + f1->afficher(cout); + cout << "Taille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n"; + + cout << "--- Suppression de la forme 1 (avec deplacement) ---"; + cout << "\nForme supprimee: "; + delete f1; + f1 = v1.supprimerForme(1); + f1->afficher(cout); + cout << "Taille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n"; + delete f1; + + cout << "--- Reinitialisation du vecteur ---"; + v1.vider(); + cout << "\nVide: " << ((v1.estVide())? "Oui" : "Non") + << "\nTaille: " << v1.getTaille() + << "\nCapacite: " << v1.getCapacite() + << "\nAffichage: {\n"; + v1.afficher(cout); + cout << "}\n"; +}; + +// Tests sur la classe Couche void Tests::tests_unitaires_couche() { - // Tests sur la classe Couche -} + cout << "----- Tests de la classe Couche -----\n"; + + cout << "\n--- Initialisation d'une couche ---"; + Couche c1; + cout << "\nEtat: " << c1.getEtat() + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout d'une forme dans une couche initialisée ---"; + cout << "\nReussite: " << ( (c1.ajouterForme(new Carre()))? "Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + + cout << "--- Changement de l\'etat de la couche (inactif) ---"; + cout << "\nReussite: " << (c1.changerEtat(STATE_INACTIVE)?"Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout d'une forme dans une couche active ---"; + c1.changerEtat(STATE_ACTIVE); + cout << "\nReussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Changement pour un etat invalide (ex: 3) ---"; + cout << "\nReussite: " << (c1.changerEtat(STATE_INACTIVE+1)?"Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Suppression d'une forme dans une couche inactive ---"; + c1.changerEtat(STATE_INACTIVE); + cout << "\nReussite: " << ((c1.supprimerForme(0) != NULL)? "Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Translation d'une couche inactive (1,2) ---"; + cout << "\nReussite: " << (c1.translater(1, 2)?"Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Translation d'une couche active (1,2) ---"; + c1.changerEtat(STATE_ACTIVE); + cout << "\nReussite: " << (c1.translater(1, 2)?"Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Suppression d'une forme dans une couche active ---"; + cout << "\nReussite: " << ((c1.supprimerForme(0) != NULL)? "Oui":"Non") + << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + cout << "--- Reinitialisation de la couche ---"; + c1.reinitialiser(); + cout << "\nEtat: " << STATES[c1.getEtat()] + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + + +}; + +// Tests sur la classe Canevas void Tests::tests_unitaires_canevas() { - // Tests sur la classe Canevas -} +}; void Tests::tests_unitaires() { - // Fait tous les tests unitaires - tests_unitaires_formes(); - tests_unitaires_vecteur(); - tests_unitaires_couche(); - tests_unitaires_canevas(); -} + // Fait tous les tests unitaires + tests_unitaires_formes(); + tests_unitaires_vecteur(); + tests_unitaires_couche(); + tests_unitaires_canevas(); +}; void Tests::tests_application() { - // Fait tous les tests applicatifs - tests_application_cas_01(); - tests_application_cas_02(); -} + // Fait tous les tests applicatifs + tests_application_cas_01(); + tests_application_cas_02(); +}; void Tests::tests_application_cas_01() { - cout << "TESTS APPLICATION (CAS 01)" << endl; - // Il faut ajouter les operations realisant ce scenario de test. -} + // Mise en place + int etape = 1; + Canevas c; + + cout << "TESTS APPLICATION (CAS 01)" << endl; + // Il faut ajouter les operations realisant ce scenario de test. + // + cout << "Etape " << etape++ + << ": Activation de la couche 1" << endl; + c.activerCouche(1); + + cout << "Etape " << etape++ + << ": Ajout des trois formes géométriques suivantes" << endl; + cout << "\t* Un rectangle (x=0, y=0, largeur=2, hauteur=3)" << endl; + c.ajouterForme(new Rectangle(0,0,2,3)); + cout << "\t* Un carré (x=2, y=3, cote=4)" << endl; + c.ajouterForme(new Carre(2,3,4)); + cout << "\t* Un cercle (x=7, y=8, rayon=6)" << endl; + c.ajouterForme(new Cercle(7,8,6)); + + cout << "Etape " << etape++ + << ": Activer la couche 2" << endl; + c.activerCouche(2); + + cout << "Etape " << etape++ + << ": Ajouter la forme géométrique suivante" << endl; + cout << "\t* Un rectangle (x=0, y=0, largeur=4, hauteur=5)" << endl; + c.ajouterForme(new Rectangle(0,0,4,5)); + + cout << "Etape " << etape++ + << ": Afficher le canevas" << endl; + c.afficher(cout); + + cout << "Etape " << etape++ + << ": Afficher l'aire du canevas" << endl; + cout << "\t* Aire du canevas: " << c.aire() << endl; + + cout << "Etape " << etape++ + << ": Activer la couche 0 et ajouter les formes suivantes" << endl; + c.activerCouche(0); + cout << "\t* Un rectangle (x=0, y=0, largeur=1, hauteur=1)" << endl; + c.ajouterForme(new Rectangle()); + cout << "\t* Un carré (x=0, y=0, cote=1)" << endl; + c.ajouterForme(new Carre()); + cout << "\t* Un cercle (x=0, y=0, rayon=1)" << endl; + c.ajouterForme(new Cercle()); + + cout << "Etape " << etape++ + << ": Translater les formes de la couche selon x=5, y=5 pour obtenir les formes suivantes lorsque affiché" << endl; + c.translater(5, 5); + cout << "\t* Un rectangle (x=5, y=5, largeur=1, hauteur=1)" << endl; + cout << "\t* Un carré (x=5, y=5, cote=1)" << endl; + cout << "\t* Un cercle (x=5, y=5, rayon=1)" << endl; + c.afficher(cout); + + + + cout << "Etape " << etape++ + << ": Couche 2 - initialisée" << endl; + c.reinitialiserCouche(2); + + cout << "Etape " << etape++ + << ": Couche 3 - initialisée" << endl; + c.reinitialiserCouche(3); + + cout << "Etape " << etape++ + << ": Couche 4 - initialisée" << endl; + c.reinitialiserCouche(4); + + cout << "Etape " << etape++ + << ": Afficher le canevas" << endl; + c.afficher(cout); + + cout << "Etape " << etape++ + << ": Afficher l'aire du canevas" << endl; + + cout << "Etape " << etape++ + << ": Retirer la première forme de la couche 1" << endl; + c.activerCouche(1); + c.retirerForme(0); + + cout << "Etape " << etape++ + << ": Afficher le canevas" << endl; + c.afficher(cout); + + cout << "Etape " << etape++ + << ": Afficher l'aire du canevas" << endl; + cout << "\t* Aire du canevas: " << c.aire() << endl; + + cout << "Etape " << etape++ + << ": Réinitialiser le canevas" << endl; + c.reinitialiser(); + + cout << "Etape " << etape++ + << ": Afficher le canevas" << endl; + c.afficher(cout); + + cout << "Etape " << etape++ + << ": Afficher l'aire du canevas" << endl; + cout << "\t* Aire du canevas: " << c.aire() << endl; + +}; void Tests::tests_application_cas_02() { - cout << "TESTS APPLICATION (CAS 02)" << endl; - // Il faut ajouter les operations realisant ce scenario de test. -} + cout << "TESTS APPLICATION (CAS 02)" << endl; + // Il faut ajouter les operations realisant ce scenario de test. +}; @@ -7,8 +7,15 @@ * fait partie de la distribution de Graphicus. ********/ +#ifndef __TESTS_H__ +#define __TESTS_H__ + #include <iostream> #include "canevas.h" +#include "forme.h" +#include "rectangle.h" +#include "carre.h" +#include "cercle.h" using namespace std; @@ -26,3 +33,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 new file mode 100644 index 0000000..56b59ed --- /dev/null +++ b/vecteur.cpp @@ -0,0 +1,74 @@ +#include "vecteur.h" + +Vecteur::Vecteur(){ + capacite = 1; + taille = 0; + formes = new Forme*[capacite]; +} + +Vecteur::~Vecteur(){ + vider(); + delete[] formes; +} + +bool Vecteur::estVide(){ + return (taille == 0); +}; + +Forme *Vecteur::getForme(int index){ + return (index < 0 || index >= taille) ? NULL : formes[index]; +}; + +int Vecteur::getTaille(){ + return taille; +}; + +int Vecteur::getCapacite(){ + return capacite; +}; + +void Vecteur::afficher(ostream &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; + } + 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; +}; + +void Vecteur::vider() { + for (int i = 0; i < taille; i++) { + delete formes[i]; + } + capacite = 1; + taille = 0; + Forme **newFormes = new Forme*[capacite]; + delete[] formes; + formes = newFormes; +} diff --git a/vecteur.h b/vecteur.h new file mode 100644 index 0000000..de5e163 --- /dev/null +++ b/vecteur.h @@ -0,0 +1,30 @@ +#ifndef __VECTEUR_H__ +#define __VECTEUR_H__ + +#include <iostream> +#include "forme.h" + +using namespace std; + +class Vecteur { + private: + int capacite; // capacité maximale actuelle du vecteur + int taille; + // dynamic array of pointers to Forme + Forme **formes; + public: + Vecteur(); + ~Vecteur(); + // Informations + bool estVide(); + Forme *getForme(int index); + int getTaille(); + int getCapacite(); + void afficher(ostream &s); + // Manipulations + bool ajouterForme(Forme *f); + Forme *supprimerForme(int index); + void vider(); +}; + +#endif |