summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--canevas.cpp15
-rw-r--r--canevas.h1
-rw-r--r--carre.h2
-rw-r--r--cercle.cpp2
-rw-r--r--cercle.h4
-rw-r--r--config.mk11
-rw-r--r--couche.cpp25
-rw-r--r--couche.h7
-rw-r--r--graphicus-02.cpp8
-rw-r--r--makefile33
-rw-r--r--rectangle.cpp4
-rw-r--r--rectangle.h2
-rw-r--r--tests.cpp317
-rw-r--r--tests.h4
-rw-r--r--vecteur.cpp4
-rw-r--r--vecteur.h1
16 files changed, 359 insertions, 81 deletions
diff --git a/canevas.cpp b/canevas.cpp
index 1010ea6..0c203fc 100644
--- a/canevas.cpp
+++ b/canevas.cpp
@@ -10,9 +10,9 @@
Canevas::Canevas() {
Couche couches[MAX_COUCHES];
- for (int i = 0; i < MAX_COUCHES; i++) {
- couches[i] = Couche();
- };
+ /* for (int i = 0; i < MAX_COUCHES; i++) { */
+ /* couches[i] = Couche(); */
+ /* }; */
couches[0].changerEtat(STATE_ACTIVE);
}
@@ -70,9 +70,7 @@ bool Canevas::retirerForme(int index) {
double Canevas::aire() {
double aire = 0;
for (int i = 0; i < MAX_COUCHES; i++) {
- if (couches[i].getEtat() == STATE_ACTIVE) {
aire += couches[i].aire();
- };
};
return aire;
};
@@ -92,3 +90,10 @@ void Canevas::afficher(ostream & s) {
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 1833e52..64b833a 100644
--- a/canevas.h
+++ b/canevas.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.h b/carre.h
index d986f7f..bf1cc84 100644
--- a/carre.h
+++ b/carre.h
@@ -5,7 +5,7 @@
class Carre : public Rectangle {
public:
- Carre(int x, int y, int cote);
+ Carre(int x=0, int y=0, int cote=1);
~Carre();
void afficher(ostream &s);
};
diff --git a/cercle.cpp b/cercle.cpp
index d2e7f61..bd3c876 100644
--- a/cercle.cpp
+++ b/cercle.cpp
@@ -2,8 +2,6 @@
#include <math.h>
Cercle::Cercle(int x, int y, int r):Forme(x,y) {
- Coordonnee xy = {x,y};
- setAncrage(xy);
setRayon(r);
};
diff --git a/cercle.h b/cercle.h
index c4a5923..1254193 100644
--- a/cercle.h
+++ b/cercle.h
@@ -3,11 +3,11 @@
#include "forme.h"
-class Cercle:Forme {
+class Cercle:public Forme {
private:
int rayon;
public:
- Cercle(int x, int y, int r);
+ Cercle(int x=0, int y=0, int r=1);
~Cercle();
void setRayon(int r);
int getRayon();
diff --git a/config.mk b/config.mk
deleted file mode 100644
index adcbe37..0000000
--- a/config.mk
+++ /dev/null
@@ -1,11 +0,0 @@
-
-SHELL = /bin/bash
-
-# c++ compiler flags that are used for all targets:
-# they make binaries faster and smaller
-# -s : strips the binary
-# -O3 : optimizes the binary
-# -Ofast : optimizes the binary
-# -march=native : optimizes the binary for the current CPU
-# -flto : link time optimization
-CFLAGS = -Ofast -march=native -flto -s
diff --git a/couche.cpp b/couche.cpp
index 9273031..b84cc73 100644
--- a/couche.cpp
+++ b/couche.cpp
@@ -10,7 +10,7 @@
Couche::Couche() {
state = STATE_INIT;
- vecteur = Vecteur();
+ Vecteur vecteur;
};
Couche::~Couche() {
@@ -42,9 +42,11 @@ void Couche::afficher(ostream &s) {
};
bool Couche::changerEtat(int newState) {
- if (state == STATE_INIT) return false;
- state = newState;
- return true;
+ if ( newState>=STATE_INIT && newState<=STATE_INACTIVE ) {
+ state = newState;
+ return true;
+ };
+ return false;
};
bool Couche::translater(int deltaX, int deltaY) {
@@ -55,17 +57,16 @@ bool Couche::translater(int deltaX, int deltaY) {
};
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;
+ if (state != STATE_ACTIVE) return false;
+ return vecteur.ajouterForme(f);
};
Forme *Couche::supprimerForme(int index) {
- if (state != STATE_ACTIVE) return NULL;
+ if (state != STATE_ACTIVE) {
+ return NULL;
+ } else {
+ return vecteur.supprimerForme(index);
+ };
return vecteur.supprimerForme(index);
};
diff --git a/couche.h b/couche.h
index dc82e01..4ef44a2 100644
--- a/couche.h
+++ b/couche.h
@@ -39,4 +39,11 @@ class Couche {
};
+static const char* const STATES[] = {
+ "initialisee",
+ "actif",
+ "inactif"
+};
+
+
#endif
diff --git a/graphicus-02.cpp b/graphicus-02.cpp
index b01b3a9..d42dd8f 100644
--- a/graphicus-02.cpp
+++ b/graphicus-02.cpp
@@ -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 db6d4eb..5b05003 100644
--- a/makefile
+++ b/makefile
@@ -7,49 +7,48 @@
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
-include config.mk
+# graphicus-02: $(ALL)
+# g++ $(CFLAGS) -o $@ $^ && strip $@ $^
graphicus-02: $(ALL)
- g++ ${CFLAGS} -o $@ $^ && strip $@ $^
-
-# graphicus-02: $(ALL)
-# g++ ${CFLAGS} -o $@ $^
+ g++ $(CFLAGS) -o $@ $^
tests.o: tests.cpp tests.h canevas.h couche.h forme.h
- g++ ${CFLAGS} -c tests.cpp
+ g++ $(CFLAGS) -c tests.cpp
canevas.o: canevas.cpp canevas.h couche.h forme.h
- g++ ${CFLAGS} -c canevas.cpp
+ g++ $(CFLAGS) -c canevas.cpp
couche.o: couche.cpp couche.h forme.h
- g++ ${CFLAGS} -c couche.cpp
+ g++ $(CFLAGS) -c couche.cpp
forme.o: forme.cpp forme.h
- g++ ${CFLAGS} -c forme.cpp
+ g++ $(CFLAGS) -c forme.cpp
vecteur.o: vecteur.cpp vecteur.h coordonnee.h
- g++ ${CFLAGS} -c vecteur.cpp
+ g++ $(CFLAGS) -c vecteur.cpp
rectangle.o: rectangle.cpp rectangle.h forme.h
- g++ ${CFLAGS} -c rectangle.cpp
+ g++ $(CFLAGS) -c rectangle.cpp
carre.o: carre.cpp carre.h rectangle.h forme.h
- g++ ${CFLAGS} -c carre.cpp
+ g++ $(CFLAGS) -c carre.cpp
cercle.o: cercle.cpp cercle.h forme.h
- g++ ${CFLAGS} -c cercle.cpp
+ g++ $(CFLAGS) -c cercle.cpp
graphicus-02.o: graphicus-02.cpp canevas.h couche.h forme.h
- g++ ${CFLAGS} -c graphicus-02.cpp
+ 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"
+ @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
index f1d23da..a70bfe4 100644
--- a/rectangle.cpp
+++ b/rectangle.cpp
@@ -1,8 +1,6 @@
#include "rectangle.h"
-Rectangle::Rectangle(int x, int y, int w, int h){
- Coordonnee xy = {x, y};
- setAncrage(xy);
+Rectangle::Rectangle(int x, int y, int w, int h):Forme(x, y){
setLargeur(w);
setHauteur(h);
};
diff --git a/rectangle.h b/rectangle.h
index 0c85119..59b990b 100644
--- a/rectangle.h
+++ b/rectangle.h
@@ -8,7 +8,7 @@ class Rectangle:public Forme{
int largeur;
int hauteur;
public:
- Rectangle(int x, int y, int l, int h);
+ Rectangle(int x=0, int y=0, int l=1, int h=1);
~Rectangle();
int getLargeur();
int getHauteur();
diff --git a/tests.cpp b/tests.cpp
index 83bce1c..ffb37c7 100644
--- a/tests.cpp
+++ b/tests.cpp
@@ -9,42 +9,311 @@
#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" << endl;
+ c.activerCouche(0);
+
+ cout << "Etape " << etape++
+ << ": Ajouter les trois formes géométriques suivantes" << endl;
+ 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++
+ << ": 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 aefc8d0..73aaaad 100644
--- a/tests.h
+++ b/tests.h
@@ -12,6 +12,10 @@
#include <iostream>
#include "canevas.h"
+#include "forme.h"
+#include "rectangle.h"
+#include "carre.h"
+#include "cercle.h"
using namespace std;
diff --git a/vecteur.cpp b/vecteur.cpp
index 2fd3589..56b59ed 100644
--- a/vecteur.cpp
+++ b/vecteur.cpp
@@ -23,6 +23,10 @@ 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);
diff --git a/vecteur.h b/vecteur.h
index e451974..de5e163 100644
--- a/vecteur.h
+++ b/vecteur.h
@@ -19,6 +19,7 @@ class Vecteur {
bool estVide();
Forme *getForme(int index);
int getTaille();
+ int getCapacite();
void afficher(ostream &s);
// Manipulations
bool ajouterForme(Forme *f);