Partiel LI260 2011: groupe 2
Téléphones portables éteints, formulaire de 8 pages autorisé
Comme il en a été convenu en TD, vous utiliserez comme base de travail les fonctions présentes dans votre projet afin de simplifier la résolution des problèmes posés.
La lisibilité du code produit sera prise en compte dans la notation.
Toutes les questions sont indépendantes, ne restez pas coincés !
1. Construction de terrain
Au lieu de charger un fichier, nous allons générer un terrain. Ce terrain aura la forme de celui de la figure ci‐contre. Les questions suivantes permettent une génération en plusieurs étapes.
Dans toutes les questions suivantes, on considère que l’utilisateur donne des valeurs de paramètre raisonnable et on ne fait pas de test sur les arguments.
1.1. Positionnement dans le projet
La classe que nous allons écrire permet de créer un circuit. Où la placer dans l’arborescence des packages ? Quelle classe remplacetelle (par rapport au main) ? Proposer un nom de classe pour ce fichier.
1.2. Signature, attributs et constructeur
Le constructeur prend en argument la hauteur (en X), la largeur (en Y) et la taille de la bordure. Les sens de départ et d’arrivée sont fixés à (0,1), comme d’habitude.
Donner la signature, les attributs et le constructeur de la classe.
NB : il peut être utile de garder une ligne pour compléter la liste des attributs au cours des questions suivantes.
1.3. Initialisation
La méthode void init(Terrain[][] track) prend en argument un tableau de Terrain (déjà instancié, pas de new ici), l’initialise avec de l’herbe sur les bords et du goudron au milieu.
Donner le code de cette méthode.
1.4. Point de départ et ligne d’arrivée
Le point de départ est tiré aléatoirement dans un carré dont les dimensions et le positionnement sont donnés sur la figure. La ligne d’arrivée se trouve en bas à droite de l’image, elle est parallèle à l’axe X, touche la bordure et fait une hauteur de 40 pixels.
Donner le code de la méthode void initDepartArrivee(Terrain[][] track)
NB : dans la classe Random (constructeur sans argument), la méthode méthode int nextInt(i) retourne un entier entre 0 et i‐1 (bornes incluses). La méthode nextDouble() retourne un réel entre 0 et 1.
Bordure X
10 40 Y
1.5. Ajout de bruit
Afin de rendre ce circuit plus compliqué, on ajoute de l’herbe aléatoirement suivant le processus suivant : chaque case de goudron à 1 chance sur 10 de se transformer en herbe.
Donner le code de la méthode void ajoutBruit(Terrain[][] track).
Avec ce genre de stratégie, il y a toujours un risque de blocage si on n’a pas de chance…
Proposer une solution (simple) pour éviter les blocages (en quelques phrases, pas de code)
1.6. Méthode build()
Enfin, la méthode build() regroupe les appels aux méthodes précédentes.
Quel est le type de retour de build() ?
Comment choisir l’accessibilité (public, protected, private) des méthodes précédentes ? Justifier rapidement votre choix.
Donner le code de la méthode build().
1.7. Sauvegarde du circuit
Il est intéressant de sauvegarder les circuits créés.
Dans quelle classe effectuer cette opération (la même ou une autre) ? Quelle solution technique utiliser (serializable, fichier ASCII…) ? Justifier chacune de vos 2 réponses précédentes.
1.8. Création de circuit à partir d’une image
Il est souvent plus agréable de travailler sous Photoshop ou Gimp pour créer des images/circuits.
Quelles seraient les contraintes de création de l’image pour que l’importation se fasse facilement ? Au niveau architecture, quelle classe faudraitil créer pour importer des images en tant que circuit ? Proposer un nom pour la classe, préciser si le constructeur prend des arguments ou pas et le(s)quel(s).
Où trouver les méthodes d’importation d’images dans JAVA selon vous ?
2. StrategieMixte
Les stratégies basées sur l’algorithme Dijkstra sont globalement très efficaces.
Cependant, parfois un virage est pris trop court et on sort dans l’herbe à la corde (1). D’autres fois, on sort du virage trop vite et on sort du goudron à l’extérieur du virage (2).
• Pour éviter le cas 1, on propose d’ajouter des points de passage obligés : si la voiture voit un point, elle doit aller vers lui.
• Pour éviter le cas 2, on ajoute des points warning : dans une zone
circulaire de rayon 10 pixels autour de ces points, la voiture passe en stratégie prudente et avance plus lentement.
Nous disposons de 3 stratégies : StrategieDijkstra, StrategiePrudente, StrategieAllerVers1Point.
La voiture voit un point de passage si les conditions suivantes sont réunies:
• la trajectoire entre la voiture et le point est réalisable (il n’y a pas d’herbe sur la trajectoire)
• le point se trouve devant la voiture
1.1. Point réalisable
Dans la classe ToolsTerrain, on écrit le code de boolean estVisible(Voiture v, Vecteur cible, Circuit track).
L’algorithme est dérivé du radar :
1. Construire le vecteur direction entre la position de la voiture et la cible 2. Si la cible est derrière la voiture Alors, return false
3. Partir de la position de la voiture
4. Tant que l’on se trouve à plus de 1 pixel de la cible : a. ajouter epsilon*direction à la position b. Si on rencontre de l’herbe, return false 5. A la fin de la méthode, return true
Donner le code de la fonction, faites attention à la signature de la méthode.
NB : on part du principe que la classe Vecteur dispose d’une méthode distance(Vecteur B) calculant la distance en pixel entre l’instance du vecteur et le vecteur B.
1.2. Strategie
Donner la signature de la classe StrategieMixte Donner le code de la classe entière
NB : les deux listes de points (passage et warning) sont données lors de la création des objets stratégies.
NB2 : pour simplifier la programmation, tous les points sont testés systématiquement et un ancien point ne vient jamais poser de problème… Bref, tout se passe pour le mieux !
NB3 : il n’y a pas d’interférence entre les points (tout se passe encore pour le mieux)
3. Pour ceux qui ont fini en avance…
Lorsque deux itinéraires sont possibles avec 1 optimal au sens de Dijkstra et 1 plus long mais plus simple (comme dans le circuit 8), comment faire pour choisir le plus simple ?
Proposer des idées les illustrer et les discuter.