summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--canevas.cpp81
-rw-r--r--canevas.h5
-rw-r--r--carre.cpp15
-rw-r--r--carre.h13
-rw-r--r--cercle.cpp32
-rw-r--r--cercle.h19
-rw-r--r--couche.cpp71
-rw-r--r--couche.h37
-rw-r--r--graphicus-02.cpp (renamed from graphicus-01.cpp)10
-rw-r--r--makefile45
-rw-r--r--rectangle.cpp42
-rw-r--r--rectangle.h22
-rw-r--r--tests.cpp324
-rw-r--r--tests.h9
-rw-r--r--vecteur.cpp74
-rw-r--r--vecteur.h30
17 files changed, 773 insertions, 58 deletions
diff --git a/.gitignore b/.gitignore
index d493a72..6a1ed24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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();
+};
diff --git a/canevas.h b/canevas.h
index 21ed457..64b833a 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 <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";
+};
diff --git a/carre.h b/carre.h
new file mode 100644
index 0000000..bf1cc84
--- /dev/null
+++ b/carre.h
@@ -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
diff --git a/couche.cpp b/couche.cpp
index 07c4418..b84cc73 100644
--- a/couche.cpp
+++ b/couche.cpp
@@ -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;
+};
+
+
diff --git a/couche.h b/couche.h
index 32cba2f..4ef44a2 100644
--- a/couche.h
+++ b/couche.h
@@ -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;
}
diff --git a/makefile b/makefile
index 86bcbe2..5b05003 100644
--- a/makefile
+++ b/makefile
@@ -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
diff --git a/tests.cpp b/tests.cpp
index 83bce1c..12dff1d 100644
--- a/tests.cpp
+++ b/tests.cpp
@@ -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.
+};
diff --git a/tests.h b/tests.h
index 3397fb9..73aaaad 100644
--- a/tests.h
+++ b/tests.h
@@ -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