1 Formes Géométriques 2 Listes de Formes

Transcription

1 Formes Géométriques 2 Listes de Formes
Master Informatique
Université Bordeaux
1
Approche Objet – 4TIN706U
2016 – 2017
TD N o 4 Polymorphisme dynamique
Formes Géométriques
On souhaite écrire un programme pour manipuler des formes géométriques. On doit disposer
de méthodes donnant leur centre de gravité, leur dimension (rayon, côté,...), leur surface. On
doit pouvoir déplacer ou dilater les formes en leur appliquant les transformations suivantes :
— une translation de vecteur (dx, dy) (il s’agira de déplacer le le point p centre de gravité
de la forme),
— une homothétie de rapport k (un réel) et de centre le point p centre de gravité de la
forme (il s’agira de multiplier les dimensions de la forme par k).
— on doit disposer également d’une méthode placer positionnant la forme (c’est-à-dire son
centre de gravité p) en un point donné.
On utilisera les classes Cercle et Rectangle fournies.
Exercices
1. Ecrire une interface Forme correspondant aux spécifications ci-dessus. Les classes Cercle
et Rectangle implémenteront cette interface.
2. Ecrire une classe Main.java qui crée des cercles et des carrés et teste leurs fonctionnalités.
Que se passe-t-il si l’on translate plusieurs formes ayant la même instance de Point2D
comme centre de gravité ? Proposez une solution et ajouter un accesseur qui donne le
centre de gravité d’une forme.
3. Rappeler le concept de classe abstraite. Comparer le code des classes Cercle et Rectangle.
Quel défaut présente-t-il ? Proposer une solution basée sur l’héritage simple, pour y
remédier.
4. L’interface est-elle toujours nécessaire ? Justifier votre réponse.
5. Ecrire une classe Afficheur, qui contient une méthode d’affichage pour les cercles (affichant le centre et le rayon sur la sortie standard) et une méthode d’affichage pour les
carrés (affichant le centre et le côté sur la sortie standard) Critiquer en terme d’extensibilité. Proposer une solution.
6. on souhaite pouvoir manipuler des formes colorées, disposant d’une couleur pour le
contour et d’une couleur pour le fond. Proposer une solution basée sur l’héritage simple
(les formes colorées devront afficher aussi leurs couleurs).
7. Créer dans la classe Main un cercle c1 et un cercle coloré c2. Tester l’affichage de c1 et
de c2. Si maintenant on ajoute le code suivant :
c1 = (Cercle) c2;
que va produire l’affichage de c1 ? Tester.
2
Listes de Formes
On souhaite manipuler des listes de formes géométriques. On doit pouvoir appliquer les
différentes transformations géométriques à l’ensemble des formes d’une liste.
Exercices
1. Chercher dans l’API (https ://docs.oracle.com/javase/8/docs/api/) les classes génériques
relatives aux Listes. Comparer l’arborescence de ces classes et celle choisie dans le td3.
2. Ecrire une classe Formes (au pluriel) permettant de créer une liste de formes, d’ajouter
des formes dans la liste, de translater toutes les formes de la liste, d’appliquer une
homotéthie à toutes les formes de la liste.
Chercher dans l’API la classe Iterator et utiliser cette classe pour toutes les méthodes
géométriques de la classe Formes.
3. Tester avec une liste contenant des cercles, des rectangles, colorés ou non.
3
Délégation
Rappeler le principe de la délégation.
Exercices
1. Créer un nouveau projet FormeDeleg et écrire une autre version du programme précédent
utilisant la délégation.
2. Ajouter une classe Carre.java. L’affichage d’un carre devra afficher son centre de gravité
et son côté.
3. Quelles sont les différences avec la version par héritage ? Avantages, inconvénients ?
Code fourni 1
Listing 1 – Main.java
1
package f o r m e s ;
3
import j a v a . awt . geom . ∗ ;
5
7
public c l a s s C e r c l e {
private Point2D c e n t r e G r a v i t e ;
private double rayon ;
public C e r c l e ( Point2D p , double rayon ) {
centreGravite = p ;
t h i s . rayon = rayon ;
}
9
11
13
public double rayon ( ) {
return rayon ;
}
15
17
public double s u r f a c e ( ) {
return Math . PI ∗ rayon ∗ rayon ;
}
19
21
public void t r a n s l a t e r ( double dx , double dy ) {
c e n t r e G r a v i t e . s e t L o c a t i o n ( c e n t r e G r a v i t e . getX ()+ dx , c e n t r e G r a v i t e . getY ()
}
23
25
public void h o m o t h e t i e ( double k )
rayon ∗= k ;
}
27
{
29
public void p l a c e r ( Point2D q ) {
centreGravite = q ;
}
31
33
}
Listing 2 – Main.java
1
package f o r m e s ;
3
import j a v a . awt . geom . ∗ ;
5
public c l a s s R e c t a n g l e {
7
9
11
13
private Point2D c e n t r e G r a v i t e ;
private double h a u t e u r ;
private double l a r g e u r ;
public R e c t a n g l e ( Point2D p , double hauteur , double l a r g e u r ) {
centreGravite = p ;
this . hauteur = hauteur ;
this . l a r g e u r = l a r g e u r ;
1. le code est disponible à cette URL : www.labri.fr/perso/clement/enseignements/ao/
}
15
public double h a u t e u r ( ) {
return h a u t e u r ;
}
17
19
public double l a r g e u r ( ) {
return l a r g e u r ;
}
21
23
public double s u r f a c e ( ) {
return h a u t e u r ∗ l a r g e u r ;
}
public void t r a n s l a t e r ( double dx , double dy ) {
c e n t r e G r a v i t e . s e t L o c a t i o n ( c e n t r e G r a v i t e . getX ()+ dx , c e n t r e G r a v i t e . getY ()
}
25
27
29
31
public void h o m o t h e t i e ( double k )
h a u t e u r ∗= k ;
l a r g e u r ∗= k ;
}
33
35
{
public void p l a c e r ( Point2D q ) {
centreGravite = q ;
}
37
39
}
Listing 3 – Main.java
package f o r m e s ;
2
import j a v a . awt . geom . Point2D ;
4
6
8
10
12
14
public c l a s s TestFormes {
public s t a t i c void main ( S t r i n g a r g s [ ] ) {
R e c t a n g l e r = new R e c t a n g l e (new Point2D . Double ( Double . p a r s e D o u b l e ( a r g s [ 0
. p a r s e D o u b l e ( a r g s [ 1 ] ) ) , Double . p a r s e D o u b l e ( a r g s [ 2 ] ) , Dou
. parseDouble ( args [ 3 ] ) ) ;
C e r c l e c = new C e r c l e (new Point2D . Double ( Double . p a r s e D o u b l e ( a r g s [ 4 ] ) , Do
. p a r s e D o u b l e ( a r g s [ 5 ] ) ) , Double . p a r s e D o u b l e ( a r g s [ 6 ] ) ) ;
System . out . p r i n t l n ( r . s u r f a c e ( ) ) ;
System . out . p r i n t l n ( c . p e r i m e t r e ( ) ) ;
}
}