summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Chausse <benjamin@chausse.xyz>2023-01-16 03:26:28 -0500
committerBenjamin Chausse <benjamin@chausse.xyz>2023-01-16 03:26:28 -0500
commit20ae6ae3f82a4eeeb123d9c1f895f10c8967f44b (patch)
treeda18c55250fb9f544b5b67aacc1a3fab4a7ccf75
parent267868847b0885f60aaae43afd4f54ce028181d8 (diff)
parent5f8fa959dab1106105f9e58325f65d0b51bb1631 (diff)
Merge branch 'development'
-rw-r--r--.gitignore26
-rw-r--r--canevas.cpp21
-rw-r--r--canevas.h23
-rw-r--r--cas-dapplication-01.txt95
-rw-r--r--cas-dapplication-02.txt95
-rw-r--r--couche.cpp1
-rw-r--r--couche.h5
-rw-r--r--forme.h8
-rw-r--r--graphicus-02.cpp6
-rw-r--r--rapport/algpseudocode.sty92
-rw-r--r--rapport/class.pngbin0 -> 142596 bytes
-rw-r--r--rapport/document.sty72
-rw-r--r--rapport/frpseudocode.sty79
-rw-r--r--rapport/main.pdfbin0 -> 577902 bytes
-rw-r--r--rapport/main.tex216
-rw-r--r--rapport/sequence.pngbin0 -> 102706 bytes
-rw-r--r--rapport/titlepage.sty69
-rw-r--r--rapport/usecase.pngbin0 -> 264876 bytes
-rw-r--r--rectangle.h12
-rw-r--r--tests.cpp172
-rw-r--r--tests.h1
-rw-r--r--vecteur.cpp1
-rw-r--r--vecteur.h21
23 files changed, 944 insertions, 71 deletions
diff --git a/.gitignore b/.gitignore
index 41dc0ab..71895e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,9 @@
-# C++ binary files:
+# C++ files:
*.exe
*.out
*.o
*.obj
+*.a
graphicus-*
# Ctags:
@@ -10,3 +11,26 @@ tags
# Vim buffers:
*.swp
+
+# LaTeX Files
+*.4tc
+*.xref
+*.tmp
+*.pyc
+*.pyo
+*.fls
+*.vrb
+*.fdb_latexmk
+*.bak
+*.swp
+*.aux
+*.log
+*.bbl
+*.blg
+*.bcf
+*.run.xml
+*.synctex
+_minted-*
+*.lof
+*.lot
+*.toc
diff --git a/canevas.cpp b/canevas.cpp
index 0c203fc..edcb8be 100644
--- a/canevas.cpp
+++ b/canevas.cpp
@@ -10,10 +10,7 @@
Canevas::Canevas() {
Couche couches[MAX_COUCHES];
- /* for (int i = 0; i < MAX_COUCHES; i++) { */
- /* couches[i] = Couche(); */
- /* }; */
- couches[0].changerEtat(STATE_ACTIVE);
+ activerCouche(0);
}
Canevas::~Canevas() {
@@ -40,13 +37,6 @@ bool Canevas::activerCouche(int index) {
return couches[index].changerEtat(STATE_ACTIVE);
};
-bool Canevas::cacherCouche(int index) {
- if (index < 0 || index >= MAX_COUCHES)
- return false;
- couches[index].changerEtat(STATE_INACTIVE);
- return true;
-};
-
bool Canevas::ajouterForme(Forme *p_forme) {
int active = -1;
for (int i = 0; i < MAX_COUCHES; i++)
@@ -91,6 +81,15 @@ void Canevas::afficher(ostream & s) {
};
};
+void Canevas::getEtats(ostream &s) {
+ s << "[ ";
+ for (int i = 0; i < MAX_COUCHES; i++) {
+ s << STATES[couches[i].getEtat()];
+ if (i < MAX_COUCHES - 1) s << ", ";
+ else s << " ]\n";
+ };
+}
+
bool Canevas::reinitialiserCouche(int index) {
if (index < 0 || index >= MAX_COUCHES){
return false;
diff --git a/canevas.h b/canevas.h
index 64b833a..6ccd68a 100644
--- a/canevas.h
+++ b/canevas.h
@@ -22,22 +22,17 @@ class Canevas {
public:
Canevas();
~Canevas();
-
- bool reinitialiser();
-
- bool activerCouche(int index);
- bool cacherCouche(int index);
-
- bool ajouterForme(Forme *p_forme);
- bool retirerForme(int index);
-
+ bool reinitialiser();
+ bool activerCouche(int index);
+ bool ajouterForme(Forme *p_forme);
+ bool retirerForme(int index);
double aire();
- bool translater(int deltaX, int deltaY);
- void afficher(ostream & s);
- bool reinitialiserCouche(int index);
-
+ bool translater(int deltaX, int deltaY);
+ void afficher(ostream &s);
+ void getEtats(ostream &s);
+ bool reinitialiserCouche(int index);
private:
- Couche couches[MAX_COUCHES];
+ Couche couches[MAX_COUCHES];
};
#endif
diff --git a/cas-dapplication-01.txt b/cas-dapplication-01.txt
new file mode 100644
index 0000000..35821ca
--- /dev/null
+++ b/cas-dapplication-01.txt
@@ -0,0 +1,95 @@
+TESTS APPLICATION (CAS 01)
+Etape 1: Activation de la couche 1
+Etape 2: Ajout des trois formes géométriques suivantes
+ * Un rectangle (x=0, y=0, largeur=2, hauteur=3)
+ * Un carré (x=2, y=3, cote=4)
+ * Un cercle (x=7, y=8, rayon=6)
+Etape 3: Activer la couche 2
+Etape 4: Ajouter la forme géométrique suivante
+ * Un rectangle (x=0, y=0, largeur=4, hauteur=5)
+Etape 5: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Rectangle:(x=0, y=0, l=4, h=5, aire=20)
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 6: Afficher l'aire du canevas
+ * Aire du canevas: 155.097
+Etape 7: Activer la couche 0 et ajouter les formes suivantes
+ * Un rectangle (x=0, y=0, largeur=1, hauteur=1)
+ * Un carré (x=0, y=0, cote=1)
+ * Un cercle (x=0, y=0, rayon=1)
+Etape 8: Translater les formes de la couche selon x=5, y=5 pour obtenir les formes suivantes lorsque affiché
+ * Un rectangle (x=5, y=5, largeur=1, hauteur=1)
+ * Un carré (x=5, y=5, cote=1)
+ * Un cercle (x=5, y=5, rayon=1)
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Rectangle:(x=0, y=0, l=4, h=5, aire=20)
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 9: Couche 2 - initialisée
+Etape 10: Couche 3 - initialisée
+Etape 11: Couche 4 - initialisée
+Etape 12: Afficher le canevas
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Rectangle:(x=0, y=0, l=2, h=3, aire=6)
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 13: Afficher l'aire du canevas
+Etape 14: Retirer la première forme de la couche 1
+Etape 15: Afficher le canevas
+----- Couche 0
+Rectangle:(x=5, y=5, l=1, h=1, aire=1)
+Carre(x=5, y=5, c=1, a=1)
+Cercle (x=5, y=5, r=1, aire=3.14159)
+----- Couche 1
+Carre(x=2, y=3, c=4, a=16)
+Cercle (x=7, y=8, r=6, aire=113.097)
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 16: Afficher l'aire du canevas
+ * Aire du canevas: 134.239
+Etape 17: Réinitialiser le canevas
+Etape 18: Afficher le canevas
+----- Couche 0
+Couche initialisée
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
+Etape 19: Afficher l'aire du canevas
+ * Aire du canevas: 0
diff --git a/cas-dapplication-02.txt b/cas-dapplication-02.txt
new file mode 100644
index 0000000..3bee6df
--- /dev/null
+++ b/cas-dapplication-02.txt
@@ -0,0 +1,95 @@
+TESTS APPLICATION (CAS 02)
+Étape 1: Activer la couche d'index 4
+Étape 2: Ajouter les formes suivantes au canevas:
+ - Un cercle (x= 1, y= 2, rayon=1/sqrt(pi) )
+ - Un rectangle (x= 3, y= 4, largeur=3, hauteur=4)
+ - Un carré (x=-1, y=-1, cote=2)
+Étape 3: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 4: Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17)
+ * Aire du canevas: 16
+Étape 5: Activer la couche d'index 3
+Étape 6: Ajouter les formes par défaut au canevas. Soit:
+ - Un cercle (x=0, y=0, rayon=1)
+ - Un rectangle (x=0, y=0, largeur=1, hauteur=1)
+ - Un carre (x=0, y=0, cote=1)
+Étape 7: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Cercle (x=0, y=0, r=1, aire=3.14159)
+Rectangle:(x=0, y=0, l=1, h=1, aire=1)
+Carre(x=0, y=0, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 8: Translater la couche active de (1,1)
+Étape 9: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Cercle (x=1, y=1, r=1, aire=3.14159)
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Carre(x=-1, y=-1, c=2, a=4)
+Étape 10: Supprimer la forme d'index 0 (la premiere)
+Étape 11: Activer la couche d'index 4
+Étape 12: Supprimer la forme d'index 2 (la dernière)
+Étape 13: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Cercle (x=1, y=2, r=0, aire=0)
+Rectangle:(x=3, y=4, l=3, h=4, aire=12)
+Étape 14: Initialiser la couche d'index 4
+Étape 15: Afficher le canevas
+----- Couche 0
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Rectangle:(x=1, y=1, l=1, h=1, aire=1)
+Carre(x=1, y=1, c=1, a=1)
+----- Couche 4
+Couche initialisée
+Étape 16: Imprimer l'aire du canevas
+ * Aire du canevas: 2
+Étape 17: Réinitialiser le canevas
+Étape 18: Afficher le canevas
+----- Couche 0
+Couche initialisée
+----- Couche 1
+Couche initialisée
+----- Couche 2
+Couche initialisée
+----- Couche 3
+Couche initialisée
+----- Couche 4
+Couche initialisée
diff --git a/couche.cpp b/couche.cpp
index b84cc73..3d31ebb 100644
--- a/couche.cpp
+++ b/couche.cpp
@@ -71,7 +71,6 @@ Forme *Couche::supprimerForme(int 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 4ef44a2..ec71444 100644
--- a/couche.h
+++ b/couche.h
@@ -19,18 +19,15 @@
class Couche {
private:
- int state;
+ 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);
diff --git a/forme.h b/forme.h
index c719366..f1fb5b6 100644
--- a/forme.h
+++ b/forme.h
@@ -19,11 +19,11 @@ class Forme {
public:
Forme(int x = 0, int y = 0);
virtual ~Forme();
- void translater(int deltaX, int deltaY);
+ void translater(int deltaX, int deltaY);
Coordonnee getAncrage();
- void setAncrage(Coordonnee c);
- virtual double aire() = 0;
- virtual void afficher(ostream & s) = 0;
+ void setAncrage(Coordonnee c);
+ virtual double aire() = 0;
+ virtual void afficher(ostream & s) = 0;
protected:
Coordonnee ancrage;
};
diff --git a/graphicus-02.cpp b/graphicus-02.cpp
index d42dd8f..800b393 100644
--- a/graphicus-02.cpp
+++ b/graphicus-02.cpp
@@ -1,7 +1,7 @@
/********
* Fichier: graphicus-02.cpp
- * Auteurs: C.-A. Brunet
- * Date: 08 janvier 2018 (creation)
+ * Auteurs: Benjamin Chausse - chab1704
+ * Date: 15 janvier 2023 (modification)
* Description: gestionnaire de tests pour l'application Graphicus. Ce
* fichier fait partie de la distribution de Graphicus.
********/
@@ -13,7 +13,7 @@ int main() {
Tests tests;
/* tests.tests_unitaires(); */
- tests.tests_application_cas_01();
+ tests.tests_application();
return 0;
}
diff --git a/rapport/algpseudocode.sty b/rapport/algpseudocode.sty
new file mode 100644
index 0000000..8cc2bf0
--- /dev/null
+++ b/rapport/algpseudocode.sty
@@ -0,0 +1,92 @@
+% PSEUDOCODE ALGORITHMIC STYLE -- Released 27 APR 2005
+% for LaTeX version 2e
+%
+% Copyright Szasz Janos
+% E-mail szaszjanos@users.sourceforge.net
+% Based on Peter Williams's algorithmic.sty
+%
+\NeedsTeXFormat{LaTeX2e}%
+\ProvidesPackage{algpseudocode}%
+\RequirePackage{ifthen}%
+\RequirePackage{algorithmicx}%
+\typeout{Document Style - pseudocode environments for use with the `algorithmicx' style}%
+%
+\def\ALG@noend{f}%
+\newboolean{ALG@compatible}%
+\setboolean{ALG@compatible}{false}%
+%
+\DeclareOption{noend}{\def\ALG@noend{t}}%
+\DeclareOption{end}{\def\ALG@noend{f}}%
+\DeclareOption{compatible}{\typeout{For compatibility mode use algcompatible.sty!!!}\setboolean{ALG@compatible}{true}}%
+\DeclareOption{noncompatible}{\setboolean{ALG@noncompatible}{false}}%
+\ProcessOptions%
+%
+% *** DECLARATIONS ***
+%
+\algnewlanguage{pseudocode}%
+\alglanguage{pseudocode}%
+%
+% *** KEYWORDS ***
+%
+\algnewcommand\algorithmicend{\textbf{end}}
+\algnewcommand\algorithmicdo{\textbf{do}}
+\algnewcommand\algorithmicwhile{\textbf{while}}
+\algnewcommand\algorithmicfor{\textbf{for}}
+\algnewcommand\algorithmicforall{\textbf{for all}}
+\algnewcommand\algorithmicloop{\textbf{loop}}
+\algnewcommand\algorithmicrepeat{\textbf{repeat}}
+\algnewcommand\algorithmicuntil{\textbf{until}}
+\algnewcommand\algorithmicprocedure{\textbf{procedure}}
+\algnewcommand\algorithmicfunction{\textbf{function}}
+\algnewcommand\algorithmicif{\textbf{if}}
+\algnewcommand\algorithmicthen{\textbf{then}}
+\algnewcommand\algorithmicelse{\textbf{else}}
+\algnewcommand\algorithmicrequire{\textbf{Require:}}
+\algnewcommand\algorithmicensure{\textbf{Ensure:}}
+\algnewcommand\algorithmicreturn{\textbf{return}}
+\algnewcommand\textproc{\textsc}
+%
+% *** DECLARED LOOPS ***
+%
+\algdef{SE}[WHILE]{While}{EndWhile}[1]{\algorithmicwhile\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicwhile}%
+\algdef{SE}[FOR]{For}{EndFor}[1]{\algorithmicfor\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicfor}%
+\algdef{S}[FOR]{ForAll}[1]{\algorithmicforall\ #1\ \algorithmicdo}%
+\algdef{SE}[LOOP]{Loop}{EndLoop}{\algorithmicloop}{\algorithmicend\ \algorithmicloop}%
+\algdef{SE}[REPEAT]{Repeat}{Until}{\algorithmicrepeat}[1]{\algorithmicuntil\ #1}%
+\algdef{SE}[IF]{If}{EndIf}[1]{\algorithmicif\ #1\ \algorithmicthen}{\algorithmicend\ \algorithmicif}%
+\algdef{C}[IF]{IF}{ElsIf}[1]{\algorithmicelse\ \algorithmicif\ #1\ \algorithmicthen}%
+\algdef{Ce}[ELSE]{IF}{Else}{EndIf}{\algorithmicelse}%
+\algdef{SE}[PROCEDURE]{Procedure}{EndProcedure}%
+ [2]{\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+ {\algorithmicend\ \algorithmicprocedure}%
+\algdef{SE}[FUNCTION]{Function}{EndFunction}%
+ [2]{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+ {\algorithmicend}%
+%
+\ifthenelse{\equal{\ALG@noend}{t}}%
+ {%
+ \algtext*{EndWhile}%
+ \algtext*{EndFor}%
+ \algtext*{EndLoop}%
+ \algtext*{EndIf}%
+ \algtext*{EndProcedure}%
+ \algtext*{EndFunction}%
+ }{}%
+%
+% *** OTHER DECLARATIONS ***
+%
+\algnewcommand\Require{\item[\algorithmicrequire]}%
+\algnewcommand\Ensure{\item[\algorithmicensure]}%
+\algnewcommand\Return{\algorithmicreturn{} }%
+\algnewcommand\Call[2]{\textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}%
+%
+%
+%
+\ifthenelse{\boolean{ALG@compatible}}%
+ {%
+ \ifthenelse{\equal{\ALG@noend}{t}}%
+ {\RequirePackage[noend]{algcompatible}}%
+ {\RequirePackage{algcompatible}}%
+ }%
+ {}%
+%
diff --git a/rapport/class.png b/rapport/class.png
new file mode 100644
index 0000000..cfb3804
--- /dev/null
+++ b/rapport/class.png
Binary files differ
diff --git a/rapport/document.sty b/rapport/document.sty
new file mode 100644
index 0000000..511d030
--- /dev/null
+++ b/rapport/document.sty
@@ -0,0 +1,72 @@
+\ProvidesPackage{document}
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Packages %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+% Margin Setup according to University methodology:
+\RequirePackage[top=2.5cm,bottom=2.5cm,inner=3cm,outer=2.5cm]{geometry}
+% IEEE references & bibliography
+\RequirePackage[style=ieee]{biblatex}
+\RequirePackage[T1]{fontenc} % French compatibility
+\RequirePackage[utf8]{inputenc} % Sensible text encoding
+\RequirePackage[french]{babel} % French document environment
+\RequirePackage{fancyhdr} % Footer customisation
+\RequirePackage{booktabs} % Elegant tables
+\RequirePackage{float} % Accurate positionning of figures
+\usepackage{titlesec} % Font sizes for sections/subsection
+\RequirePackage{amsmath} % Mathematics environments
+\RequirePackage{amssymb} % Mathematical symbols
+\RequirePackage{siunitx} % SI Units
+\RequirePackage{setspace} % Line spacing
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Headers/Footers %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+\renewcommand{\footrulewidth}{.5pt} % Line at the bottom
+\cfoot{\thepage} % Centered page number (footer)
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Sections %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+% Font size for section (16)
+\titleformat{\section}
+{\normalfont\fontsize{16}{19}\bfseries}{\thesection}{1em}{}
+% Font size for subsection (14)
+\titleformat{\subsection}
+{\normalfont\fontsize{14}{17}\bfseries}{\thesubsection}{1em}{}
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Equations/Math %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+% Number equation with section number (ex: First equation in section 3 is 3.1)
+\numberwithin{equation}{section}
+% Use french commas when writing numbers
+\sisetup{locale=FR}
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Line Spacing %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+% Set 1.5 linespacing for the document
+\onehalfspacing
+
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Figures/Tables %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+
+% Count within sections (third table of section 5 would be Table 5.3)
+\counterwithin{figure}{section}
+\counterwithin{table}{section}
+% Separate section number from fig/table with a hyphen (5-3 instead of 5.3)
+\renewcommand{\thefigure}{\thesection-\arabic{figure}}
+\renewcommand{\thetable}{\thesection-\arabic{table}}
+
diff --git a/rapport/frpseudocode.sty b/rapport/frpseudocode.sty
new file mode 100644
index 0000000..8e1732a
--- /dev/null
+++ b/rapport/frpseudocode.sty
@@ -0,0 +1,79 @@
+%% @author Oliver Irwin
+%% DATE
+\ProvidesPackage{frpseudocode}[DATE French Pseudocode VERSION]
+\RequirePackage{algpseudocode}
+
+%% Global mod
+\floatname{algorithm}{Algorithme}
+
+%% Functions %%
+\algrenewcommand\algorithmicprocedure{\textbf{PROCÉDURE}}
+\algrenewcommand\algorithmicfunction{\textbf{FONCTION}}
+\algrenewcommand\algorithmicreturn{Retourner}
+
+\algrenewtext{Procedure}[2]%
+{\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}\ :}
+
+\algrenewtext{Function}[2]%
+{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}\ :}
+
+%% Inputs
+\algrenewcommand\algorithmicrequire{\textbf{REQUIERT : }}
+\algrenewcommand\algorithmicensure{\textbf{VÉRIFIER : }}
+
+%% Control Instructions %%
+\algrenewcommand\algorithmicwhile{\textbf{TANT QUE}}
+\algnewcommand\algorithmicwhilem{\textbf{TANT QUE}}
+\algrenewcommand\algorithmicdo{\textbf{FAIRE}}
+\algnewcommand\algorithmicdom{\textbf{FAIRE}}
+\algrenewcommand\algorithmicend{\textbf{FIN}}
+\algrenewcommand\algorithmicfor{\textbf{POUR}}
+\algrenewcommand\algorithmicforall{\textbf{POUR TOUT}}
+\algnewcommand\algorithmicfrom{\textbf{DE }}
+\algnewcommand\algorithmicto{\textbf{À}}
+\algnewcommand\algorithmicform{\textbf{POUR}}
+
+\algrenewcommand\algorithmicrepeat{\textbf{RÉPÉTER}}
+\algrenewcommand\algorithmicuntil{\textbf{JUSQU'À}}
+
+\algdef{SE}[FORFT]{ForFT}{EndFor}[3]{}%
+
+%% Change commands
+\algrenewtext{ForFT}[3]%
+{\algorithmicfor\ #1 \algorithmicfrom #2 \algorithmicto\ #3,\ \algorithmicdom\ :}
+
+\algrenewtext{For}[1]%
+{\algorithmicfor\ #1,\ \algorithmicdom\ :}
+
+\algrenewtext{EndFor}[0]%
+{\algorithmicend\ \algorithmicform}
+
+\algrenewtext{While}[1]%
+{\algorithmicwhile\ #1,\ \algorithmicdom\ :}
+
+\algrenewtext{EndWhile}[0]%
+{\algorithmicend\ \algorithmicwhilem}
+
+%% Conditionnals %%
+
+\algrenewcommand\algorithmicif{\textbf{SI}}
+\algnewcommand\algorithmicifm{\textbf{SI}}
+\algrenewcommand\algorithmicelse{\textbf{SINON}}
+\algrenewcommand\algorithmicthen{\textbf{ALORS}}
+\newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif}
+
+\algrenewtext{SINON SI}[1]%
+{\algorithmicelse ,\ \algorithmicifm\ #1}
+
+\algrenewtext{ENDIF}[0]%
+{\algorithmicend\ \algorithmicifm}
+
+
+\algtext*{EndWhile}% Remove "end while" text
+\algtext*{EndIf}% Remove "end if" text
+% \algtext*{EndFunction}% Remove "end if" text
+
+%% Logical
+%\algrenewcommand{\algorithmicnot}{\textbf{non}}
+%\algrenewcommand{\algorithmicand}{\textbf{et}}
+%\algrenewcommand{\algorithmicor}{\textbf{ou}}
diff --git a/rapport/main.pdf b/rapport/main.pdf
new file mode 100644
index 0000000..e705be0
--- /dev/null
+++ b/rapport/main.pdf
Binary files differ
diff --git a/rapport/main.tex b/rapport/main.tex
new file mode 100644
index 0000000..bdf975e
--- /dev/null
+++ b/rapport/main.tex
@@ -0,0 +1,216 @@
+\documentclass[a11paper, 11pt]{article}
+
+\usepackage{document}
+\usepackage{titlepage}
+\usepackage{float}
+\usepackage{algorithm}
+\usepackage{amsmath}
+\usepackage{graphicx}
+\usepackage{tikz-uml}
+\usepackage{algpseudocode}
+\usepackage{frpseudocode}
+\usepackage[T1]{fontenc}
+\usepackage[french]{babel}
+
+% \addbibresource{bibliography.bib}
+% \nofiles
+
+
+% \institution{Université de Sherbrooke}
+% \faculty{Faculté de génie}
+% \department{Département de génie électrique et de génie informatique}
+\title{Rapport d'APP}
+\classnb{GEN241}
+\class{Modélisation et programmation orientée objet}
+\author{
+ \addtolength{\tabcolsep}{-0.4em}
+ \begin{tabular}{rcl} % Ajouter des auteurs au besoin
+ Benjamin Chausse & -- & chab1704 \\
+ \end{tabular}
+}
+\teacher{Domingo Palao Muñoz}
+% \location{Sherbrooke}
+% \date{\today}
+
+
+\begin{document}
+\maketitle
+\newpage
+\tableofcontents
+\listoffigures
+\listoftables
+\newpage
+
+\section{Diagrammes UML}
+
+La figure \ref{fig:class} montre les diverses relation entre les classes de
+graphicus-02. Elle permet d'observer la hiérarchie des classes ainsi que les
+facteurs de dépendance entre les classes.
+
+\begin{figure}[H] % Diagramme de classes {{{
+\centering
+\caption{Diagrame de classes de graphicus-02}\label{fig:class}
+\includegraphics[width=0.8\textwidth]{class.png}
+\end{figure} % }}}
+
+La figure \ref{fig:sequence} montre comment l'application procéderait
+lorsqu'un utilisateur voudrait activer la couche 1 du canevas alors que la
+couche 0 est présentement active. Les autres couches ont été omises pour
+alléger le diagramme.
+
+\begin{figure}[H] % Diagramme de séquence {{{
+\centering
+\caption{Diagrame de séquence d'activation de couche}\label{fig:sequence}
+\includegraphics[width=\textwidth]{sequence.png}
+\end{figure} % }}}
+
+
+La figure \ref{fig:usecase} montre les différentes actions que l'utilisateur
+peut exécuter dans l'application. Nous voyos par la suite comment certaines de
+ces actions agissent en arrière plan et dépendent d'autres actions (parfois
+même d'autres actions accessibles à l'utilisateur).
+
+\begin{figure}[H]
+\centering\caption{Diagramme de cas d'utilisation}\label{fig:usecase}
+\includegraphics[width=\textwidth]{usecase.png}
+\end{figure}
+
+
+\section{Pseudo-code}
+
+\begin{algorithm} % {{{
+\caption{Ajout d'un élément au vecteur}\label{alg:ajouterForme}
+\begin{algorithmic}[1]
+ \Function{Vecteur::ajouterForme}{$f$}{ Booléen}\\
+ \hspace{.5cm}// $f$: Forme à ajouter au vecteur\\
+ \hspace{.5cm}// $Vecteur::taille$: nombre d'éléments actuellement dans le vecteur (entier)\\
+ \hspace{.5cm}// $Vecteur::capacite$: capacité maximale du vecteur actuellement (entier)\\
+ \hspace{.5cm}// $Vecteur::formes$: Liste de pointeurs vers les formes du vecteur (*Forme)\\
+ \textbf{DÉBUT}\\
+ \hspace{.5cm}// $newCapacite$: nouvelle capacité du vecteur (entier)\\
+ \hspace{.5cm}// $newFormes$: nouvelle liste de pointeurs vers les formes du vecteur (*Forme)
+ \If{$f$ est de valeur nulle}
+ \Comment{Vérifier si la forme est valide}
+ \State\Return{Faux}
+ \EndIf
+ \If{$Vecteur::taille =\joinrel= Vecteur::capacite$}
+ \Comment{Si le vecteur est plein}
+ \State $newCapacite := Vecteur::capacite\times2$
+ \If{L'espace disponible en mémoire $<$ $newCapacite\times taille(Forme)$}
+ \State\Return{Faux}
+ \EndIf
+ \State $newFormes :=\ $allouer$(newCapacite\times taille(Forme))$
+ \For{\textbf{CHAQUE} Forme $i$ dans $Vecteur::formes$}
+ \State $newFormes[i] := Vecteur::formes[i]$
+ \EndFor
+ \State $Vecteur::capacite := newCapacite$
+ \State libérer$(Vecteur::formes)$
+ \State $Vecteur::formes := newFormes$
+ \EndIf
+ \State $Vecteur::taille := Vecteur::taille + 1$
+ \State $Vecteur::formes[Vecteur::taille] := f$
+ \State \Return{Vrai}
+ \EndFunction
+\end{algorithmic}
+\end{algorithm} % }}}
+
+\section{Plan de test}
+
+\subsection{Identification}
+\begin{table}[H] % {{{
+\centering\caption{Informations générales du plan de test}\label{fig:planTest}
+\begin{tabular}{rl}
+ \\ \toprule
+ Nom: & Scénario de test du rapport d'APP \\
+ But: & Vérifier les fonctionnalitées globales de graphicus-02\\
+ Acteur principal: & classe \verb|Test| \\
+ Date de création: & 2023-01-14 \\
+ Auteur: & Benjamin Chausse -- chab1704 \\
+ Version: & 1.0 \\
+ \bottomrule
+\end{tabular}
+\end{table}% }}}
+
+\subsection{Scénario}
+
+\subsubsection{Préconditions}
+
+\begin{itemize}
+ \item Un canevas vierge vient d'être créé
+ \item Ce cas d'utilisation emploie la méthode \verb|tests_application_cas_02|
+ de la classe \verb|Tests|. La première ayant été utilisée lors de la
+ validation en classe.
+\end{itemize}
+
+
+\subsubsection{Postconditions}
+
+\begin{itemize}
+ \item Le déroulement du test se fait sans intervention de l'utilisateur.
+ \item L'affichage doit-être accessible à l'évaluateur:
+ \begin{itemize}
+ \item soit par écriture dans un fichier
+ \item soit par affichage dans un terminal
+ \end{itemize}
+ \item Le numéro de chaque étape est identifié avant son exécution.
+ \item La description de chaque étape est affichée avant son exécution.
+ \item Les informations passées à chaque étape sont affichées avant son exécution.
+\end{itemize}
+
+
+\subsubsection{Limitations}
+
+\begin{itemize}
+ \item Le test ne vérifie pas la totalité des cas limites
+ (ex: capacité insuffisante en mémoire pour agrandir le vecteur).
+\end{itemize}
+
+
+\subsection{Enchaînement nominal}
+
+\subsubsection{Étapes 1 à 4}
+\begin{enumerate}
+ % \setcounter{enumi}{1}
+ \item Activer la couche d'index 4
+ \item Ajouter les formes suivantes au canevas:
+ \begin{itemize}
+ \item un cercle de centre (1, 2) et de rayon $\frac{1}{\sqrt{\pi}}$
+ \item un rectangle anchré en (3, 4), de dimensions $3\times4$
+ \item un carré anchré en (-1, -1), de côté 2
+ \end{itemize}
+ \item Afficher le canevas
+ \item Imprimer l'aire du canevas (doit être égale à $1+12+4$ soit $17$)
+\end{enumerate}
+
+\subsubsection{Étapes 5 à 13}
+\begin{enumerate}
+ \setcounter{enumi}{4}
+ \item Activer la couche d'index 3
+ \item Ajouter les formes par défaut au canevas. Soit:
+ \begin{itemize}
+ \item un cercle de centre (0, 0) et de rayon 1
+ \item un rectangle anchré en (0, 0), de largeur 1 et de hauteur 1
+ \item un carré anchré en (0, 0), de côté 1
+ \end{itemize}
+ \item Afficher le canevas
+ \item Translater la couche active de (1, 1)
+ \item Afficher le canevas
+ \item Supprimer la forme de l'index 0 (la première)
+ \item Activer la couche d'index 4
+ \item Supprimer la forme de l'index 2 (la dernière)
+ \item Afficher le canevas
+\end{enumerate}
+\subsubsection{Étapes 14 à 18}
+\begin{enumerate}
+ \setcounter{enumi}{13}
+ \item Initialiser la couche d'index 4
+ \item Afficher le canevas
+ \item Imprimer l'aire du canevas (doit être égale à $1+1$ soit $2$)
+ \item Réinitialiser le canevas
+ \item Afficher le canevas
+\end{enumerate}
+
+
+% \newpage
+% \printbibliography[heading=bibintoc]
+\end{document}
diff --git a/rapport/sequence.png b/rapport/sequence.png
new file mode 100644
index 0000000..bdb1aae
--- /dev/null
+++ b/rapport/sequence.png
Binary files differ
diff --git a/rapport/titlepage.sty b/rapport/titlepage.sty
new file mode 100644
index 0000000..72caa5b
--- /dev/null
+++ b/rapport/titlepage.sty
@@ -0,0 +1,69 @@
+\ProvidesPackage{titlepage}[
+Sherbrooke Engineering Title Page by Benjamin Chausse
+]
+\RequirePackage{setspace}
+\RequirePackage{tabularx}
+\RequirePackage[french]{babel}
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Plain Definitions %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+\newcommand*{\institution}[1]{\gdef\@institution{#1}}
+\newcommand*{\faculty}[1]{\gdef\@faculty{#1}}
+\newcommand*{\department}[1]{\gdef\@department{#1}}
+\renewcommand*{\title}[1]{\gdef\@title{#1}}
+\newcommand*{\class}[1]{\gdef\@class{#1}}
+\newcommand*{\classnb}[1]{\gdef\@classnb{#1}}
+\newcommand*{\presentation}[1]{\gdef\@presentation{#1}}
+\newcommand*{\teacher}[1]{\gdef\@teacher{#1}}
+\renewcommand*{\author}[1]{\gdef\@author{#1}}
+\newcommand*{\location}[1]{\gdef\@location{#1}}
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Templated Definitions %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+\newcommand*{\@institution}{Université de Sherbrooke}
+\newcommand*{\@faculty}{Faculté de génie}
+\newcommand*{\@department}{Département de génie électrique et de génie informatique}
+\renewcommand*{\@title}{Titre du document}
+\newcommand*{\@class}{Mathématiques des circuits logiques}
+\newcommand*{\@classnb}{GEN420}
+\newcommand*{\@presentation}{Présenté à}
+\newcommand*{\@teacher}{Prénom Nom}
+\renewcommand*{\@author}{Prénom Nom -- CIP}
+\newcommand*{\@location}{Sherbrooke}
+
+% Simple Macro
+\newcommand{\usp}{\unskip\strut\par}
+
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+% Updated Title Page Template %
+%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
+\renewcommand*{\maketitle}{
+\begin{titlepage}
+ % \centering\LARGE\setstretch{.7}
+ \centering\normalsize
+
+ {\MakeUppercase{\@institution}\usp}
+ {\@faculty\usp}
+ {\@department}
+ \vfill
+
+ {\LARGE{\@title}}
+ \vfill
+
+ {\@class\usp}
+ {\@classnb}
+ \vfill
+
+ {\@presentation\usp}
+ {\@teacher}
+ \vfill
+
+ {Présenté par\usp}
+ {\@author}
+ \vfill
+
+ {\large \@location\ -- \@date\usp}
+\end{titlepage}
+}
diff --git a/rapport/usecase.png b/rapport/usecase.png
new file mode 100644
index 0000000..2bf4ea9
--- /dev/null
+++ b/rapport/usecase.png
Binary files differ
diff --git a/rectangle.h b/rectangle.h
index 59b990b..02aeb98 100644
--- a/rectangle.h
+++ b/rectangle.h
@@ -10,13 +10,13 @@ class Rectangle:public Forme{
public:
Rectangle(int x=0, int y=0, int l=1, int h=1);
~Rectangle();
- int getLargeur();
- int getHauteur();
+ int getLargeur();
+ int getHauteur();
Coordonnee getAncrageForme();
- void setLargeur(int l);
- void setHauteur(int h);
- double aire();
- void afficher(ostream &s);
+ void setLargeur(int l);
+ void setHauteur(int h);
+ double aire();
+ void afficher(ostream &s);
};
#endif
diff --git a/tests.cpp b/tests.cpp
index 12dff1d..843454b 100644
--- a/tests.cpp
+++ b/tests.cpp
@@ -8,8 +8,10 @@
********/
#include "tests.h"
+#include "math.h"
-// Tests sur les formes geometriques
+
+// Tests sur les formes geometriques {{{
void Tests::tests_unitaires_formes() {
cout << "----- Tests des formes geometriques -----\n";
@@ -49,9 +51,9 @@ void Tests::tests_unitaires_formes() {
Cercle cc2;
cc2.afficher(cout);
cout << "\n";
-};
+}; // }}}
-// Tests sur la classe Vecteur
+// Tests sur la classe Vecteur {{{
void Tests::tests_unitaires_vecteur() {
cout << "----- Tests de la classe Vecteur -----\n\n";
@@ -114,9 +116,9 @@ void Tests::tests_unitaires_vecteur() {
<< "\nAffichage: {\n";
v1.afficher(cout);
cout << "}\n";
-};
+}; // }}}
-// Tests sur la classe Couche
+// Tests sur la classe Couche {{{
void Tests::tests_unitaires_couche() {
cout << "----- Tests de la classe Couche -----\n";
@@ -193,29 +195,97 @@ void Tests::tests_unitaires_couche() {
<< "\nAffichage: {\n";
c1.afficher(cout);
cout << "}\n\n";
+}; // }}}
+// Tests sur la classe Canevas {{{
+void Tests::tests_unitaires_canevas() {
+ cout << "----- Tests de la classe Canevas -----\n\n";
+ cout << "--- Initialisation d'un canevas ---\n";
+ Canevas c1;
+ cout << "Couches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
-};
+ cout << "--- Ajout d'une forme (doit aller dans la couche 0) ---\n";
+ cout << "Couches: ";
+ c1.getEtats(cout);
+ cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non")
+ << "\nAffichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
-// Tests sur la classe Canevas
-void Tests::tests_unitaires_canevas() {
-};
+ cout << "--- Activation de la couche 3 ---\n";
+ cout << "Reussite: " << (c1.activerCouche(3)? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
+
+ cout << "--- Ajout de forme (doit aller dans la couche 3) ---\n";
+ cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
+ cout << "--- Reinitialisation de la couche active (3) ---\n";
+ cout << "Reussite: " << (c1.reinitialiserCouche(3)? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
+
+ cout << "--- Translation de couche initialisée (couche 3 par 1,2) ---\n";
+ cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
+
+ cout << "--- Translation d'une couche active (couche 0 par 1,2) ---\n";
+ c1.activerCouche(0);
+ cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n\n";
+
+ cout << "--- Réinitialisation du canevas ---\n";
+ cout << "Reussite: " << (c1.reinitialiser()? "Oui":"Non")
+ << "\nCouches: ";
+ c1.getEtats(cout);
+ cout << "Affichage: {\n";
+ c1.afficher(cout);
+ cout << "}\n";
+
+
+}; // }}}
+
+// Execution de tout les tests unitaires {{{
void Tests::tests_unitaires() {
// Fait tous les tests unitaires
tests_unitaires_formes();
tests_unitaires_vecteur();
tests_unitaires_couche();
tests_unitaires_canevas();
-};
+}; // }}}
+// Execution de tout les tests de mise en application {{{
void Tests::tests_application() {
// Fait tous les tests applicatifs
tests_application_cas_01();
tests_application_cas_02();
-};
+}; // }}}
+// Premiere application {{{
void Tests::tests_application_cas_01() {
// Mise en place
int etape = 1;
@@ -317,10 +387,84 @@ void Tests::tests_application_cas_01() {
cout << "Etape " << etape++
<< ": Afficher l'aire du canevas" << endl;
cout << "\t* Aire du canevas: " << c.aire() << endl;
+}; // }}}
-};
+// takes an int pointer and increments it, prints the message: "Step i: msg\n"
+void step(string msg, int *i) {
+ cout << "Étape " << *i << ": " << msg << endl;
+ (*i)++;
+}
+// Deuxieme application {{{
void Tests::tests_application_cas_02() {
cout << "TESTS APPLICATION (CAS 02)" << endl;
- // Il faut ajouter les operations realisant ce scenario de test.
-};
+ // Mise en place
+ Canevas c;
+ int etape = 1;
+
+
+ step("Activer la couche d'index 4", &etape);
+ c.activerCouche(4);
+
+ step("Ajouter les formes suivantes au canevas:", &etape);
+ cout << "\t- Un cercle (x= 1, y= 2, rayon=1/sqrt(pi) )\n"
+ << "\t- Un rectangle (x= 3, y= 4, largeur=3, hauteur=4)\n"
+ << "\t- Un carré (x=-1, y=-1, cote=2)\n";
+ c.ajouterForme(new Cercle(1, 2, 1/sqrt(M_PI)));
+ c.ajouterForme(new Rectangle(3, 4, 3, 4));
+ c.ajouterForme(new Carre(-1, -1, 2));
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+ step("Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17)", &etape);
+ cout << "\t* Aire du canevas: " << c.aire() << endl;
+
+ step("Activer la couche d'index 3", &etape);
+ c.activerCouche(3);
+
+ step("Ajouter les formes par défaut au canevas. Soit:", &etape);
+ cout << "\t- Un cercle (x=0, y=0, rayon=1)\n"
+ << "\t- Un rectangle (x=0, y=0, largeur=1, hauteur=1)\n"
+ << "\t- Un carre (x=0, y=0, cote=1)\n";
+ c.ajouterForme(new Cercle());
+ c.ajouterForme(new Rectangle());
+ c.ajouterForme(new Carre());
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+ step("Translater la couche active de (1,1)", &etape);
+ c.translater(1, 1);
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+ step("Supprimer la forme d'index 0 (la premiere)", &etape);
+ c.retirerForme(0);
+
+ step("Activer la couche d'index 4", &etape);
+ c.activerCouche(4);
+
+ step("Supprimer la forme d'index 2 (la dernière)", &etape);
+ c.retirerForme(2);
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+ step("Initialiser la couche d'index 4", &etape);
+ c.reinitialiserCouche(4);
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+ step("Imprimer l'aire du canevas", &etape);
+ cout << "\t* Aire du canevas: " << c.aire() << endl;
+
+ step("Réinitialiser le canevas", &etape);
+ c.reinitialiser();
+
+ step("Afficher le canevas", &etape);
+ c.afficher(cout);
+
+}; // }}}
diff --git a/tests.h b/tests.h
index 73aaaad..ebafc72 100644
--- a/tests.h
+++ b/tests.h
@@ -27,7 +27,6 @@ public:
void tests_unitaires_couche();
void tests_unitaires_canevas();
void tests_unitaires(); // Appel de tous les tests unitaires
-
// Methodes pour les tests unitaires des classes
void tests_application_cas_01();
void tests_application_cas_02();
diff --git a/vecteur.cpp b/vecteur.cpp
index 56b59ed..fdb153f 100644
--- a/vecteur.cpp
+++ b/vecteur.cpp
@@ -34,6 +34,7 @@ void Vecteur::afficher(ostream &s){
};
bool Vecteur::ajouterForme(Forme *f) {
+ if (f == NULL) return false;
if (taille == capacite) {
// Double the size of the array
int newCapacite = capacite * 2;
diff --git a/vecteur.h b/vecteur.h
index de5e163..0f36348 100644
--- a/vecteur.h
+++ b/vecteur.h
@@ -8,23 +8,20 @@ using namespace std;
class Vecteur {
private:
- int capacite; // capacité maximale actuelle du vecteur
- int taille;
- // dynamic array of pointers to Forme
- Forme **formes;
+ int capacite; // capacité maximale actuelle du vecteur
+ int taille; // nombre d'éléments actuellement dans le vecteur
+ Forme **formes; // dynamic array of pointers to Forme
public:
Vecteur();
~Vecteur();
- // Informations
- bool estVide();
+ bool estVide();
Forme *getForme(int index);
- int getTaille();
- int getCapacite();
- void afficher(ostream &s);
- // Manipulations
- bool ajouterForme(Forme *f);
+ int getTaille();
+ int getCapacite();
+ void afficher(ostream &s);
+ bool ajouterForme(Forme *f);
Forme *supprimerForme(int index);
- void vider();
+ void vider();
};
#endif