Exercice 10 : dessiner en mémoire (sur un bitmap) pour pouvoir avoir un rafraîchissement même si la fenêtre a été cachée
Exercice 9 : terminer la simulation. pouvoir appliquer un critère de terminaison de la simulation
Exercice 8 : équations différentielles. Analogue à Simulation, on aura une interface Java pour des modèles s'exprimant avec une équation différentielle ordinaire. Plus précisément, chaque individu élémentaire i sera représenté par un vecteur Xi dont les premières composantes seront les coordonnées spatiales. Le système différentiel sera:
dXi/dt = F(X, t) i=0, N-1
Où F est une fonction du vecteur X de tous les individus élémentaires.
Pour un individu élémentaire aussi bien que pour le système entier, on s'inspirera de l'interface ecolosim.numeric.FunctionRn1 pour créer DifferentialIndividual analogue à Individual. Pour la résolution, on utilisera ecolosim.numeric.RungeKutta .
Il faut aussi imaginer une interface DifferentialSimulation analogue à IterativeSimulation pour rassembler les modèles élémentaires et générer le système différentiel global à partir des modèles élémentaires. Cette interface DifferentialSimulation sera implementée par DifferentialSimulationImpl .
Enfin il faut une application graphique analogue à MultipleModelsApp, disons DifferentialModelsApp, qui va montrer les trajectoires.
Exercice 7 bis : initialisation avec de multiples modèles. Pour chacun des types de modèles disponibles, on permettra à l'utilisateur de saisir :
Exercice 7 : introduire BeanPeelerPane dans la fenêtre MultipleModelsApp pour éditer les propriétés du modèle
Exercice 6 : pouvoir modifier en temps réel l'effectif de la population. Pour cela on modifiera l'interface Individual:
public void runModel(IterativeSimulation population);
et on ajoutera dans IterativeSimulation :
public Individual[] getIndividuals();
Pour tester on implémentera 2 comportements:
Exercice 5 : pouvoir lire un fichier tabulaire de positions initiales : on créera une classe utilitaire CSVBridge, avec une méthode :
Simulation createSimulation ( String fileName, Class modelClass)
On ajoutera un bouton "Read initial position" dans l'application MultipleModelsApp
Exercice 4 :
Créer un "emballage" (wrapper) autour de deux classes Individual qui va ajouter les vecteurs déplacements de ces 2 modèles.
On l'appelera VectorAddWrapperModel.
Pour tester on "ajoutera" SimpleAgregationModel et RandomSimpleModel .
Je suggère le squelette suivant où l'on peut "ajouter" un nombre quelconque de modèles :
package ecolosim.simu.models;
public class VectorAddWrapperModel implements Individual {
public addDisplacement(Individual model) {
//????
}
}
Exercice 3 bis : créer une classe prédateur simple, SimplePredatorModel, qui suit le plus proche non-prédateur. On pourra utiliser une interface "marqueur" Predator.
Exercice 3 : raffiner la classe précédente pour faire un barycentre des animaux qui sont à l'intérieur d'un cercle de rayon R. Ce rayon R sera donné par une méthode setVisibilityRadius(double r) .
On l'appelera SimpleAgregationWithVisibilityModel.
Exercice 2 bis : Refactoring: pendant qu'on y est, dans l'application MultipleModelsApp, on remplacera :
Individual modeles[];
par :
IterativeSimulation simul = new IterativeSimulationImpl();
et on supprimera :
Displayer[] afficheurs;
en conséquence, dans afficherPoints() on appelera :
simul.process((Graphics2D)g);
NOTE: Si on veut créer des afficheurs personalisés en fonction du type de modèle et de ses propriétés, il convient de sous-traiter ça à un DisplayerManager.