Algorithmique de la mobilité
Cet exercice propose de coder un type de noeud générique, permettant de visiter séquentiellement une suite de destinations (données comme des points 2D).
Q1. Créer une classe WaypointNode
qui hérite de la classe Node
. Cette classe doit avoir deux champs:
speed
et destinations
. Le premier sera utilisé pour régler la vitesse de déplacement des noeuds (plus exactement, la distance parcourue à chaque top d'horloge), et le second contiendra à terme une suite de points (de type io.jbotsim.core.Point
) à
visiter. Afin d'utiliser la liste de points comme une file, nous en restreignons l'usage via l'interface Queue
.
private double speed = 1; // Number of units to be moved in each step.
private Queue<Point> destinations = new LinkedList<Point>();
Q2. Créer un "getter" et un "setter" pour le champs speed
.
Q3. Créer une méthode addDestination()
dans cette classe, prenant en argument un point et l'ajoutant à la file de destinations.
Q4. En surchargeant la méthode onClock()
(Ctrl + o sous IntelliJ), on souhaite réaliser le comportement suivant: à chaque top d'horloge, vérifier si la file contient (au moins) une destination. Si oui, tester la distance actuelle à cette destination. Deux cas possibles : a) Si la distance est supérieure à speed
, fixer la direction du noeud vers cette destination (il existe une méthode pour ça), puis s'en rapprocher de speed
unités (il existe une méthode pour ça). b) Si la distance est inférieure ou égale, on déplace le noeud directement sur la destination et on supprime la destination de la liste (on "défile").
Nous avons donc une classe de noeuds capable d'enregistrer des destinations et de s'y rendre séquentiellement. Testons-là, voir si tout fonctionne.
Q5. Créer une classe qui hérite de WaypointNode
. Surchargez la méthode onStart()
, dans laquelle vous ajouterez quelques destinations.
Il ne reste plus qu'à dire à JBotSim d'utiliser cette classe là comme modèle de noeud comme suit.
Q6. Écrire une méthode main()
dans cette classe ou dans une autre classe dédiée (peu importe). En plus du code habituel pour créer la topologie et le viewer, nous indiquons à JBotSim que les noeuds doivent être, par défaut, du type de la classe crée.
Topology tp = new Topology();
tp.setDefaultNodeModel(VotreClasse.class);
new JViewer(tp);
tp.start();
La classe WaypointNode
que nous avons créée est très générique et peut servir de base pour implémenter de nombreux comportements (les exercices suivants en proposeront quelques-uns). Afin de rendre cette classe plus utile, il serait bon que les classes filles puissent être notifiées lorsque le noeud arrive sur chaque destination.
Q7. Définir une méthode onArrival()
dans WaypointNode
que l'on appelera à chaque fois qu'une destination est atteinte. Cette méthode peut rester vide ici, son contenu étant à spécifier dans les classes filles. Concernant les paramètres, on pourra également passer le point atteint.
Q8. Créer une classe RandomWaypointNode
qui hérite de WaypointNode
. Son comportement consiste à initialement ajouter une destination aléatoire (en utilisant les méthodes de la classe mère WaypointNode
). Puis, à chaque fois que la destination est atteinte, on choisit une nouvelle destination aléatoire et l'on s'y rend à nouveau. Cet algorithme ne termine jamais, et c'est normal.
Q9 (bonus). Détecter les collisions entre entités et choisissez une autre destination lorsque ces collisions se produisent. On pourra utiliser par exemple setSensingRange()
et onSensingIn()
.