summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Chausse <benjamin@chausse.xyz>2023-01-13 02:34:01 -0500
committerBenjamin Chausse <benjamin@chausse.xyz>2023-01-13 02:34:01 -0500
commit3fb8effa3603e9a9b96d263009fc1397433436ba (patch)
treeae4d7bf573f69245713b07c253a8027ace8d5244
parentb4f16386c70bfeab700e7cc129f2f04295aa0059 (diff)
Tout sauf les tests
-rw-r--r--.gitignore1
-rw-r--r--canevas.cpp76
-rw-r--r--canevas.h4
-rw-r--r--carre.cpp2
-rw-r--r--carre.h5
-rw-r--r--cercle.cpp4
-rw-r--r--cercle.h7
-rw-r--r--couche.cpp70
-rw-r--r--couche.h30
-rw-r--r--rectangle.cpp4
-rw-r--r--rectangle.h7
-rw-r--r--tests.h5
-rw-r--r--vecteur.cpp50
-rw-r--r--vecteur.h18
14 files changed, 217 insertions, 66 deletions
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 <iostream>
#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 <iostream>
#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 <iostream>
#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