Projet 2023-24:
Simulation du traitement de tumeurs par inhibition de la glycolyse
Vous apprendrez à l'aide de ce projet à réaliser un programme complet et de taille plus importante que ceux avec lesquels vous avez travaillé jusqu'à présent. Votre programme comportera également une composante graphique. Sur le plan informatique, ce projet a pour but de consolider vos connaissances en programmation ainsi que de vous faire pratiquer les concepts essentiels de la programmation orientée-objet : abstraction et encapsulation, héritage, méthodes virtuelles et polymorphisme.
Il est déconseillé d'imprimer tout l'énoncé du projet : des compléments d'informations peuvent y être apporté en cours de route.Introduction
Tout programme doit être conçu avant d'être implémenté. Cette phase de conception a pour but d'établir une modélisation informatique des composants du programme et elle implique que l'on se pose un certain nombre de questions :- De quelles informations le programme a-t-il besoin et quelles sont les relations entre ces différentes informations ?
- Quelles transformations ces informations vont-elles subir ?
- Qui devra décider, et en fonction de quels paramètres, quand ces transformations seront appliquées ?
- etc
L'explication ci-dessous a pour but d'ébaucher dans les (très) grandes lignes la conception à laquelle nous vous proposerons d'adhérer pour ce projet.
Premiers pas vers la conception d'un programme
Lorsqu'on lance le programme une fenêtre doit s'ouvrir et afficher la vue externe de la simulation (un élevage de hamsters de laboratoire). Si l'on clique sur un des hamsters, l'on fait apparaître une vue interne sur un fragment d'organe de ce dernier ainsi que le réseau sanguin qui l'irrigue.
Vue externe : élevage de hamster | Vue interne : fragment d'organe d'un hamster et réseau sanguin l'irriguant |
On peut se douter que chacun de ces éléments à l'écran devra avoir un équivalent C++ dans votre code.
En concevant le programme, il faut non seulement recenser les éléments à modéliser, mais aussi se poser un certain nombre de questions comme :
- comment les éléments intervenant dans la simulation interagissent-ils entre eux ?
- ont-ils des points communs, ou sont-ils totalement indépendants ?
- etc..
Nous ébauchons pour vous dans ce qui suit, les éléments fondamentaux qui vont intervenir dans le programme à mettre en oeuvre.
Objets de base
Au vu de la description qui précède, les classes suivantes semblent imposer d'emblée leur présence:
- des classes pour représenter le «laboratoire» (classe Lab) où vivent des hamsters (classe Hamster) et les «cages» (classe Cage) où ils seront confinés: ils s'y déplaceront parfois en quête de «nourriture» (des tas de granulés, classe Pellets);
- d'autres pour les différentes cellules simulées au niveau interne (cellule du réseau sanguin ou de l'organe);
- puisque l'évolution des cases/cellules de l'organe et du réseau sanguin vont dépendre de traitements administrés aux hamsters sous la forme de nutriments et d'inhibiteurs, il faudra bien sûr aussi nous atteler à la modélisation de ces «substances» (classe Substance);
- etc.
Plus finement, il apparaîtra aussi que certains éléments ont des aspects communs (par exemple, toutes les cellules/cases du niveau interne vont être communément caractérisées par leur position). Elles auront néanmoins aussi des différences : les cellules de l'organe vont évoluer différemment de celles représentant une portion du réseau sanguin, puisqu'elles peuvent devenir tumorales.
La notion d'héritage pourra ici être mise à profit (OrganCell, ou BloodCell dérivant de Cell par exemple).
Pour résumer donc, on peut ainsi anticiper les différents éléments intervenant dans la simulation et proposer progressivement une conception possible pour le programme. Vous trouverez au fur et à mesure de votre progression dans le projet, des schémas détaillés vous expliquant l'architecture du programme à laquelle nous vous proposons d'adhérer. Il est indispensable de la comprendre pour pouvoir l'implémenter correctement. Il est évident que d'autres solutions plus simples, plus compliquées, ou simplement différentes existent. Chacune (simple ou compliquée) a généralement ses avantages et ses inconvénients. Toutefois, la modélisation que nous vous proposons est raisonnable, et la suivre vous permettra d'économiser du temps.
Noyau de simulation et affichages graphiques
Pour réaliser la simulation, nous allons faire évoluer les composants du programmes au cours du temps (les hamsters, les cellules etc.).Le temps est échantillonné (on parlera de pas de temps discrets). A chaque pas de temps, chaque hamster, par exemple, pourra subir ou être à l'origine d'un certain nombre d'événements selon le contexte (se nourrir, se détourner d'un obstacle etc.). Ces actions déterminent l'évolution du système au cours du temps. Il faudra bien entendu re-afficher les composants après chaque événement pour effctivement visualiser l'évolution du système.
Les éléments du système auront donc de façon générale :
- un contenu (les données et méthodes permettant de les modéliser);
- une représentation graphique (notre façon de les afficher);
- un comportement (les actions entreprises selon le contexte ou comment ils doivent réagir aux éventuels événements extérieurs.
Les directives de l'énoncé du projet vous aideront à aboutir à une conception qui va dans ce sens.
Le noyau de simulation, qui va faire évoluer le monde au cours du temps et tenir compte des éventuelles interventions de l'utilisateur, sera fourni. Ce noyau permettra de :
- démarrer la simulation;
- communiquer au programme d'éventuelles interventions de l'utilisateur (par exemple son souhait de stopper la simulation);
- et surtout appeler "en boucle" les méthodes nécessaires au déroulement de la simulation. L'une de vos tâches essentielles dans ce projet sera de fournir ces méthodes.
Bibliothèque graphique
Il n'existe pas de bibliothèque standard en C++ pour définir des interfaces graphiques. Chacune des bibliothèques existantes a donc ses propres spécificités (fonctionnalités, prototypes, etc).Parmi les possibilités :
C'est cette dernière option que nous avons retenue, pour sa simplicité d'utilisation. Elle vous fournira les fonctionnalités nécessaires au graphisme et à la gestion d'événements dans votre programme.
Inscription
Si vous n'êtes pas encore inscrits, faites-le avant le lundi 18 Mars à 9h!
Étapes
Créez un sous-répertoire projet dans le répertoire ~/myfiles/cpp. Tous les fichiers concernant ce projet devront se trouver dans le répertoire ~/myfiles/cpp/projet.Un échéancier des différentes étapes est donné dans la description du projet. De plus, vous trouverez ci-dessous des conseils sur les classes à implémenter et comment le faire. Il est recommandé de suivre ces indications, mais vous pouvez évidemment ajouter ou modifier les éléments que vous désirez afin de personnaliser votre programme.
Le projet est
conçu pour être fait
à deux. Donc partagez
vous le travail dès que vous commencerez à vous
sentir à l'aise avec le sujet.
Développer en parallèle et de façon
complémentaire est à coup sûr une
expérience instructive, mais qui nécessite évidemment une
bonne communication entre vous pour être efficace.
Vous pouvez tout au long du développement vérifier votre programme à l'aide de petits programmes de test. Pour débugger votre programme, vous avez deux possibilités (qui souvent sont utilisées en conjonction) :
- utiliser des cout (ou, beaucoup mieux, des cerr) pour identifier l'endroit où le programme "plante" ainsi que la valeur des attributs à cet endroit
- utiliser "debugger", est indispensable pour certains types d'erreurs.
Important: L'énoncé fourni est assez détaillé mais ne donnera pas nécessairement toutes les indications. Il faut donc compléter ce qui vous est fourni par un peu d'investigation personnelle. Les assistant.es - en particulier votre coach - sont là pour vous aider. Il est aussi possible que des compléments d'indications soient fournis en cours de route si cela s'avérait nécessaire.
Les archives nécessaires sont fournies au fur et à mesure qu'elles deviennent nécessaires.
N'oubliez pas de commenter votre code et de coder proprement. Une partie de la note finale en sera impactée. De plus, cela vous facilitera la tâche lorsque vous devrez relire votre code après plusieurs semaines.
Étape 1 : Classes utilitaires (échauffement)
But: Implémentation de deux classes de base : l'une permettant de gérer de façon simplifiée le test de collision entre objets et l'autre approximant de façon basique les « substances » véhiculées sur une portion d'organe.
Concepts nécessaires: classes, encapsulation, constructeurs, destructeurs et surcharge d'opérateurs
Ces concepts sont expliqués dans le cours 16, 17 & 18.Durée prévue pour le codage : 1 semaine encadrée de TP (depuis le mardi de la semaine 5 compris, jusqu'au mardi de la semaine 6 non-compris, selon la numérotation du plan du cours)
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 2 : Laboratoire
But: Modéliser un «laboratoire» pouvant contenir des cages, des hamsters et leur nourriture.
Concepts nécessaires: classes d'objets, constructeurs/destructeurs, surcharge d'opérateurs et héritage
Ces concepts sont expliqués dans les cours 16, 17, 18 & 19.Durée prévue pour le codage: 1 semaine de TP (depuis le mardi de la semaine 6 compris, jusqu'au mardi de la semaine 7 non-compris, selon la numérotation du plan du cours)
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 3 : Élevage de hamsters
But: Simulation des hamsters élevés» en laboratoire. Ils se déplacent dans leur cage et se nourrissent.
Concepts nécessaires: classes d'objets, constructeurs/destructeurs, héritage et polymorphisme.
Ces concepts sont expliqués dans les cours 16, 17, 18, 19 & 20.Durée prévue pour le codage: 2 semaines encadrées de TP (depuis le mardi de la semaine 7 compris, jusqu'au mardi de la semaine 9 non-compris, selon la numérotation du plan du cours)
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 4 : Réseau sanguin
- Intégrer la vue sur les organes.
- Doter les hamsters d'un réseau sanguin.
Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme
Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.Durée prévue pour le codage: 2 semaines encadrées de TP (depuis le mardi de la semaine 9 compris, jusqu'au mardi de la semaine 11 non-compris, selon la numérotation du plan du cours.
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 5 : Organe et diffusion de substances
- les hamsters soient dotés d'un organe;
- les substances puissent se diffuser.
Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme
Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.Durée prévue pour le codage: 1 semaine encadrée de TP (depuis le mardi de la semaine 11 compris, jusqu'au mardi de la semaine 12 non-compris, selon la numérotation du plan du cours.
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 6 : Tumeurs
- les cellules malignes entrent en scène;
- l'administration de substances puisse se faire interactivement.
Concepts nécessaires: classes, constructeurs/destructeurs, héritage et polymorphisme
Ces concepts sont expliqués dans les cours 16, 17, 18, 19, 20 & 21.Durée prévue pour le codage: 1 semaine encadrées de TP (depuis le mardi de la semaine 12 compris, jusqu'au mardi de la semaine 13 non-compris, selon la numérotation du plan du cours.
Cliquez ici pour accéder à l'énoncé de cette partie.
Étape 6 : Extensions
Cliquez ici pour accéder à quelques suggestions.
Quelques références
Vous trouverez également des références sur le langage C++ ici.