<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lfall</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lfall"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Lfall"/>
	<updated>2026-05-21T07:42:45Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2204</id>
		<title>PHYS710 : Simulation et modélisation en physique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2204"/>
		<updated>2008-09-22T16:58:36Z</updated>

		<summary type="html">&lt;p&gt;Lfall : /* Résumé du 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; cours : rappel sur le langage C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Projet: Evolution d&#039;une galaxie]]&lt;br /&gt;
&lt;br /&gt;
Le but de ce cours est d&#039;initier les étudiants au développement d&#039;un logiciel de simulation ou de modélisation en physique. Ce logiciel sera modulaire et composé de sous-ensembles interagissant entre eux. Chaque module ou sous-ensemble sera développé par un binôme qui en aura la responsabilité. Le but sous-jacent est l&#039;initiation à un travail collaboratif.&lt;br /&gt;
&lt;br /&gt;
Dans cet esprit, la première séance consistera en une introduction succinte à l&#039;environnement de développement et au langage choisis, en l&#039;occurence [http://root.cern.ch ROOT] et le C/C++. Les séances suivantes, espacées de 2 à 3 semaines seront des occasions de faire le point, chaque binôme expliquant aux autres l&#039;évolution de leur travail et les points d&#039;accès pour que tous puissent faire des tests entre les modules. Entre temps, les étudiants communiqueront avec l&#039;enseignant et leurs camarades à travers un ensemble d&#039;outils tels cette page wiki et une liste de diffusion. L&#039;enseignant collectera les contributions (et suggérera/demandera éventuellement des modifications) de telle sorte qu&#039;elles soient disponibles pour tous.&lt;br /&gt;
&lt;br /&gt;
Autant que faire se peut, on envisagera une utilisation ultérieure du logiciel, soit dans le cadre des exercices &amp;quot;WIMS&amp;quot; de première année, soit pour servir de point de départ aux projets des années suivantes.&lt;br /&gt;
&lt;br /&gt;
== Introduction, outils de développement ==&lt;br /&gt;
=== Cadre général ===&lt;br /&gt;
* Simulation, modélisation en physique&lt;br /&gt;
* Développement d&#039;un logiciel de modélisation&lt;br /&gt;
* Contraintes, travail en groupe&lt;br /&gt;
* Exemple: un système mécanique complexe, le moteur à explosion&lt;br /&gt;
&lt;br /&gt;
=== Environnement ===&lt;br /&gt;
On utilisera [http://root.cern.ch &#039;&#039;&#039;ROOT&#039;&#039;&#039;]. &lt;br /&gt;
* Rappel de quelques commandes Unix (si nécessaire)&lt;br /&gt;
* Utilisation de ROOT&lt;br /&gt;
* Compilation d&#039;un petit code C&lt;br /&gt;
* Compilation d&#039;un code intégrant des fonctionnalités &#039;&#039;&#039;ROOT&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Langage ===&lt;br /&gt;
Nous utiliserons le C/C++. Les notions générales de C seront supposées connues (petit rappel rapide). On introduira les notions suivantes avec à chaque fois l&#039;analyse de petits exemples de macros ROOT.&lt;br /&gt;
* Rappels de C : variables, fonctions, structures de contrôle, exemple de programme complet&lt;br /&gt;
* Pointeurs&lt;br /&gt;
* Le préprocesseur&lt;br /&gt;
* Allocation dynamique en C&lt;br /&gt;
* Le langage C++&lt;br /&gt;
* Classes, objets&lt;br /&gt;
** Héritage&lt;br /&gt;
** Constructeurs, destructeurs&lt;br /&gt;
** Encapsulation&lt;br /&gt;
* Allocation dynamique en C++&lt;br /&gt;
&lt;br /&gt;
Petit programme complet à la fin de cette page. Essayez-le dans ROOT.&lt;br /&gt;
&lt;br /&gt;
En règle générale, on donnera les informations nécessaires pour comprendre les macros ROOT présentées. Il reste beaucoup d&#039;auto-formation à faire de la part des étudiants !&lt;br /&gt;
==== Quelques références ====&lt;br /&gt;
* [http://cpp.developpez.com/cours/polyCpp/ cours de C++ à partir du C]. &lt;br /&gt;
* [http://cpp.developpez.com/cours/cpp/ &amp;quot;mégacours&amp;quot; de C/C++]. &lt;br /&gt;
* [http://www.siteduzero.com/tutoriel-3-11406-apprenez-a-programmer-en-c.html Cours sur &amp;quot;le site du zéro&amp;quot;]&lt;br /&gt;
* Ce qu&#039;il ne faut pas faire : [http://fr.wikipedia.org/wiki/Antipattern les anti-patrons]&lt;br /&gt;
&lt;br /&gt;
=== Bibliothèques ===&lt;br /&gt;
&lt;br /&gt;
gsl, modules ROOT, bibliothèques trouvées ou produites par les étudiants&lt;br /&gt;
&lt;br /&gt;
==== Résumé du 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; cours : rappel sur le langage C ====&lt;br /&gt;
&lt;br /&gt;
;Variables &lt;br /&gt;
: int (entier)&lt;br /&gt;
: float (réel 4 octets)&lt;br /&gt;
: double (réel 8 octets)&lt;br /&gt;
: char (caractère 1 octet)&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
;Déclaration des variables &lt;br /&gt;
=&amp;gt; &#039;&#039;int i,j,k;&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt;Pour déclarer un tableau qui va de 0 à 99 : &#039;&#039;float a[100];&#039;&#039;&lt;br /&gt;
&amp;lt;br\&amp;gt;Puis initialisation : &#039;&#039;a[i]=0;&lt;br /&gt;
&lt;br /&gt;
;Boucles &lt;br /&gt;
=&amp;gt; for, while, do...&lt;br /&gt;
&amp;lt;br/&amp;gt;Exemple avec la boucle for : &#039;&#039;for (i=1 ; i&amp;lt;36 ; i++) {......}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Tests&lt;br /&gt;
&#039;&#039;if (i&amp;lt;35 &amp;amp;&amp;amp; i&amp;gt;27 &amp;amp;&amp;amp; i!=30) {......} else if (...) {...}&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt; On peut avoir : &lt;br /&gt;
:&amp;amp;&amp;amp; &amp;quot;et&amp;quot;&lt;br /&gt;
:== &amp;quot;égal&amp;quot;&lt;br /&gt;
:|| &amp;quot;ou&amp;quot;&lt;br /&gt;
:!= &amp;quot;différent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Commentaires&lt;br /&gt;
:en C : &#039;&#039;&#039;/*....*/&#039;&#039;&#039;&lt;br /&gt;
:en C++ : &#039;&#039;&#039;//&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Pointeurs&lt;br /&gt;
Déclaration : &#039;&#039;float* a;&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt;Utilisation : &#039;&#039;(*a)=18&#039;&#039;;&lt;br /&gt;
&amp;lt;br/&amp;gt;Exemple :&lt;br /&gt;
::&#039;&#039;z=23;&#039;&#039;&lt;br /&gt;
::&#039;&#039;a=&amp;amp;z;&#039;&#039;&lt;br /&gt;
::&#039;&#039;*a=18;&#039;&#039;&lt;br /&gt;
:On obtient donc au final que z=18&lt;br /&gt;
&lt;br /&gt;
;Place réservée&lt;br /&gt;
&#039;&#039;à venir&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Outils de travail collaboratif ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce wiki&#039;&#039;&#039; : Pour réaliser des pages sur ce wiki, il faut utiliser la [http://fr.wikipedia.org/wiki/Aide:Syntaxe_wikip%C3%A9dia syntaxe habituelle des wikis]&lt;br /&gt;
ce qui inclut des formules LaTeX encadrées par &amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Liste de diffusion&#039;&#039;&#039; : en cours de mise au point&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outil de gestion de versions&#039;&#039;&#039; : cvs ou svn. Accessible seulement à l&#039;enseignant.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés ==&lt;br /&gt;
&lt;br /&gt;
Evolution d&#039;une galaxie&lt;br /&gt;
&lt;br /&gt;
Système mécanique composé&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Programme en C++ montrant les diverses notions vues en cours ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;En cours d&#039;écriture&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous n&#039;êtes pas forcés de tout réécrire, vous pouvez télécharger les fichiers ici : [[http://www.lapp.in2p3.fr/~buskulic/Disque.h Disque.h]] et [[http://www.lapp.in2p3.fr/~buskulic/Disque.C Disque.C]]. Une fois que vous les avez téléchargés, suivez les instructions à la fin de ce paragraphe pour les utiliser dans ROOT. Avant, il faut comprendre ce qu&#039;ils contiennent.&lt;br /&gt;
&lt;br /&gt;
Les commentaires (après les //) devraient donner pas mal d&#039;explications.&lt;br /&gt;
&lt;br /&gt;
Voyons d&#039;abord le fichier en-tête, déclarant les classes, fonctions, etc... des différents programmes. On met toujours ces déclarations dans un fichier séparé pour pouvoir les réutiliser. On nomme ce fichier &amp;quot;Disque.h&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 // La classe suivante definit un objet &amp;quot;disque&amp;quot; que l&#039;on manipulera plus tard&lt;br /&gt;
 &lt;br /&gt;
 // Declaration de la classe&lt;br /&gt;
 &lt;br /&gt;
 class Disque&lt;br /&gt;
 {&lt;br /&gt;
    private:&lt;br /&gt;
       // Definition des variables privees&lt;br /&gt;
       double mXC;        // coordonnees du centre&lt;br /&gt;
       double mYC;&lt;br /&gt;
       double mEpaisseur;  // Epaisseur si en 3D&lt;br /&gt;
       double mR;            // rayon du disque&lt;br /&gt;
 &lt;br /&gt;
    public:&lt;br /&gt;
       &lt;br /&gt;
       // Methodes &amp;quot;getter&amp;quot; pour acceder aux variables privees &lt;br /&gt;
       double GetXC();&lt;br /&gt;
       double GetYC();&lt;br /&gt;
       double GetEpaisseur();&lt;br /&gt;
       double GetRayon();&lt;br /&gt;
       // Methodes &amp;quot;setter&amp;quot; pour initialiser les variables privees&lt;br /&gt;
       void SetXC(double x);&lt;br /&gt;
       void SetYC(double x);&lt;br /&gt;
       void SetEpaisseur(double x);&lt;br /&gt;
       void SetRayon(double x);&lt;br /&gt;
      &lt;br /&gt;
       // Methodes autres&lt;br /&gt;
       void Trace();                            // trace le disque&lt;br /&gt;
       void Deplace(double vX, double vY);  // Deplace le disque de (vX, vY)&lt;br /&gt;
       double Surface();                       // Renvoie la surface du disque&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Voici le contenu du fichier &amp;quot;Disque.C&amp;quot;. On commence par utiliser la directive &amp;quot;#include&amp;quot; pour inclure les fichiers d&#039;en-tête.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Disque.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TCanvas.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TEllipse.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on écrit le contenu des différentes méthodes de la classe en commençant par le constructeur&lt;br /&gt;
 &lt;br /&gt;
 // ======================&lt;br /&gt;
 //    Constructeur&lt;br /&gt;
 // ======================&lt;br /&gt;
 Disque::Disque(double xC, double yC, double epaisseur, double R)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = xC;&lt;br /&gt;
    mYC = yC;&lt;br /&gt;
    mEpaisseur = epaisseur;&lt;br /&gt;
    mR = R;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Les fonctions qui permettent de récupérer les informations &amp;quot;privées&amp;quot; de la classe. Ces fonctions ne sont pas absolument indispensables pour faire tourner le programme, sauf si on a besoin d&#039;accéder à des données privées. On est en plein dans les conséquences de la notion &amp;quot;d&#039;encapsulation&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 // ===========================&lt;br /&gt;
 //    &amp;quot;Getter&amp;quot; et &amp;quot;Setter&amp;quot;&lt;br /&gt;
 // ===========================&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetXC()&lt;br /&gt;
 {&lt;br /&gt;
    return mXC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetYC()&lt;br /&gt;
 {&lt;br /&gt;
    return mYC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetEpaisseur()&lt;br /&gt;
 {&lt;br /&gt;
    return mEpaisseur;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetRayon()&lt;br /&gt;
 {&lt;br /&gt;
    return mR;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetXC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetYC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mYC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetEpaisseur(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mEpaisseur = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetRayon(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mR = x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On passe maintenant aux méthodes spécifiques à la classe. Ici, on définit une méthode de tracé, une de déplacement et une de calcul simple.&lt;br /&gt;
 &lt;br /&gt;
 // =========================================================&lt;br /&gt;
 //     Methodes de visualisation, deplacement&lt;br /&gt;
 // =========================================================&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Trace()&lt;br /&gt;
 {&lt;br /&gt;
 // trace le disque dans un canvas&lt;br /&gt;
    TEllipse* ell;&lt;br /&gt;
    &lt;br /&gt;
 // **** ATTENTION, fuite de memoire !!!! ****&lt;br /&gt;
 // on ne detruit jamais l&#039;ellipse &amp;quot;ell&amp;quot; !&lt;br /&gt;
    ell = new TEllipse(mXC,mYC,mR);&lt;br /&gt;
    ell-&amp;gt;Draw();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Deplace(double vX, double vY)&lt;br /&gt;
 {&lt;br /&gt;
 // Deplace le disque de (vX, vY)&lt;br /&gt;
    mXC += vX;&lt;br /&gt;
    mYC += vY;&lt;br /&gt;
 // Probleme : on n&#039;est pas lie a l&#039;objet ellipse cree dans la methode &amp;quot;Trace&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // ============================&lt;br /&gt;
 //     Methodes de calcul&lt;br /&gt;
 // ============================&lt;br /&gt;
 double Disque::Surface()&lt;br /&gt;
 {&lt;br /&gt;
 // Renvoie la surface du disque&lt;br /&gt;
    double surf;&lt;br /&gt;
    double PI = 4*atan(1);&lt;br /&gt;
    &lt;br /&gt;
    surf = PI*mR*mR;&lt;br /&gt;
    return surf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la classe dans ROOT ===&lt;br /&gt;
&lt;br /&gt;
Avant de l&#039;inclure dans un programme, il est bon de voir ce que l&#039;on peut faire avec cette classe dans ROOT et comment on appelle chacune des méthodes. Comme ROOT contient un interpréteur C/C++, chaque ligne que nous écrirons sur la ligne de commande sera identique à ce que nous ferons plus tard dans un programme complet.&lt;br /&gt;
&lt;br /&gt;
Première chose, il faut charger la classe dans ROOT (une fois celui-ci lancé dans le répertoire où se trouvent Disque.h et Disque.C, bien sûr). Pour celà, on utilise la commande ROOT &amp;quot;.L&amp;quot; :&lt;br /&gt;
 root[0] .L Disque.C&lt;br /&gt;
Construisons ensuite un objet de la classe &amp;quot;Disque&amp;quot;. On va utiliser la commande &amp;quot;new&amp;quot; pour créer l&#039;objet et récupérer un pointeur sur cet objet :&lt;br /&gt;
 root[1] d = new Disque(0.5, 0.5, 0.1, 0.1)&lt;br /&gt;
Ce faisant, on a appelé le constructeur de la classe disque. Ce constructeur, nous l&#039;avons déclaré et défini pour qu&#039;il prenne 4 paramètres en entrée et qu&#039;il mette ces paramètres dans les variables privées de la classe. Si vous regardez le code, vous verrez que nous venons de définir un objet &amp;quot;Disque&amp;quot; de coordonnées du centre (0.5, 0.5), d&#039;épaisseur 0.1 et de rayon 0.1.&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on appelle maintenant la méthode de tracé, ce disque va se tracer tout seul :&lt;br /&gt;
root[2] d-&amp;gt;Trace()&lt;br /&gt;
&lt;br /&gt;
Et voilà ! On voit apparaître un disque dans une fenêtre, appelée &amp;quot;Canvas&amp;quot; dans ROOT. Si on demande la surface du disque en appelant la méthode &amp;quot;Surface()&amp;quot;, on obtient :&lt;br /&gt;
 root [3] d-&amp;gt;Surface()                   &lt;br /&gt;
 &#039;&#039;&#039;(double)3.14159265358979339e-02&#039;&#039;&#039;&lt;br /&gt;
Là encore, on a appelé la méthode de l&#039;objet d qui renvoie la valeur de la surface. Remarquez l&#039;emploi de l&#039;opérateur &amp;quot;-&amp;gt;&amp;quot; (signe &amp;quot;-&amp;quot; suivi du signe supérieur &amp;quot;&amp;gt;&amp;quot; ). On appelle cet opérateur l&#039;opérateur de déréférencement et il est employé pour indiquer &amp;quot;la méthode de l&#039;objet pointé par ...&amp;quot;. &amp;quot;d&amp;quot; est un pointeur, donc la méthode &amp;quot;Surface()&amp;quot; de l&#039;objet pointé par &amp;quot;d&amp;quot; est appelée en utilisant &amp;quot;-&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Analyse d&#039;une macro ROOT ===&lt;br /&gt;
&lt;br /&gt;
On appelle &amp;quot;macro&amp;quot; ou &amp;quot;script&amp;quot; un programme ou morceau de programme que ROOT va interpréter. Analysons la macro suivante &amp;quot;graph.C&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 void graph() {&lt;br /&gt;
    //Draw a simple graph&lt;br /&gt;
    //Author: Rene Brun&lt;br /&gt;
   &lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
 &lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
 &lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
 &lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
 &lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Vous pouvez l&#039;exécuter dans ROOT, c&#039;est une macro &amp;quot;standard&amp;quot; présente dans le répertoire ROOT. Faites simplement :&lt;br /&gt;
 root[4] .x $ROOTSYS/tutorials/graphs/graph.C&lt;br /&gt;
&lt;br /&gt;
Reprenons les lignes principales. Vous pouvez tester l&#039;effet de certaines en recopiant le fichier chez vous et en enlevant la ou les lignes correspondantes avant de lancer la macro.&lt;br /&gt;
&lt;br /&gt;
d&#039;abord, la déclaration de la fonction. Elle ne prend pas d&#039;argument :&lt;br /&gt;
 void graph()&lt;br /&gt;
 {&lt;br /&gt;
&lt;br /&gt;
Ensuite, on construit un objet &amp;quot;TCanvas&amp;quot; qui est une fenêtre graphique dans laquelle on va dessiner :&lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
&lt;br /&gt;
On en profite pour appeler des méthodes de cet objet &amp;quot;TCanvas&amp;quot; qui remplissent le fond d&#039;une certaine couleur&lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
et qui activent une option traçant une grille pointillée&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
&lt;br /&gt;
viennent ensuite les déclarations de variables que l&#039;on va utiliser. Ici, on a besoin de déclarer deux tableaux qui vont représenter des coordonnées de points à tracer. n est le nombre de points.&lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
&lt;br /&gt;
ces points, il faut bien leur donner des valeurs, d&#039;où la boucle ci-dessous :&lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
ensuite, on construit un objet &amp;quot;graphique&amp;quot; défini dans ROOT qui s&#039;appelle &amp;quot;TGraph&amp;quot;. On passe les pointeurs &amp;quot;x&amp;quot; et &amp;quot;y&amp;quot; sur les tableaux qu&#039;on vient de remplir à ce constructeur, ainsi que le nombre de points :&lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
&lt;br /&gt;
et on rend le graphe &amp;quot;joli&amp;quot;. Les noms des méthodes parlent d&#039;eux-même :&lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
enfin, l&#039;auteur a décidé de changer encore un peu le fond, libre à lui...&lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Amusez-vous à modifier le code ci-dessus et à tester vos modifications dans ROOT. Par exemple, mettre plus de points ou changer certaines caractéristiques de couleur. C&#039;est la meilleure manière d&#039;apprendre ou de vérifier que vous avez bien compris. La classe TGraph est documentée sur le site de ROOT à la page : [[http://root.cern.ch/root/html520/TGraph.html http://root.cern.ch/root/html520/TGraph.html]]&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de méthodes. Regardez certaines d&#039;entre elles pour voir si vous comprenez leur utilité.&lt;br /&gt;
&lt;br /&gt;
Il y a même un exemple encore plus simple de macro au début de cette page.&lt;br /&gt;
&lt;br /&gt;
Il y a dans ROOT un très grand nombre de classes différentes, nous verrons celles dont nous aurons besoin au fur et à mesure.&lt;/div&gt;</summary>
		<author><name>Lfall</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2203</id>
		<title>PHYS710 : Simulation et modélisation en physique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2203"/>
		<updated>2008-09-22T16:55:26Z</updated>

		<summary type="html">&lt;p&gt;Lfall : /* Résumé du 1^er cours : rappel sur le langage C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Projet: Evolution d&#039;une galaxie]]&lt;br /&gt;
&lt;br /&gt;
Le but de ce cours est d&#039;initier les étudiants au développement d&#039;un logiciel de simulation ou de modélisation en physique. Ce logiciel sera modulaire et composé de sous-ensembles interagissant entre eux. Chaque module ou sous-ensemble sera développé par un binôme qui en aura la responsabilité. Le but sous-jacent est l&#039;initiation à un travail collaboratif.&lt;br /&gt;
&lt;br /&gt;
Dans cet esprit, la première séance consistera en une introduction succinte à l&#039;environnement de développement et au langage choisis, en l&#039;occurence [http://root.cern.ch ROOT] et le C/C++. Les séances suivantes, espacées de 2 à 3 semaines seront des occasions de faire le point, chaque binôme expliquant aux autres l&#039;évolution de leur travail et les points d&#039;accès pour que tous puissent faire des tests entre les modules. Entre temps, les étudiants communiqueront avec l&#039;enseignant et leurs camarades à travers un ensemble d&#039;outils tels cette page wiki et une liste de diffusion. L&#039;enseignant collectera les contributions (et suggérera/demandera éventuellement des modifications) de telle sorte qu&#039;elles soient disponibles pour tous.&lt;br /&gt;
&lt;br /&gt;
Autant que faire se peut, on envisagera une utilisation ultérieure du logiciel, soit dans le cadre des exercices &amp;quot;WIMS&amp;quot; de première année, soit pour servir de point de départ aux projets des années suivantes.&lt;br /&gt;
&lt;br /&gt;
== Introduction, outils de développement ==&lt;br /&gt;
=== Cadre général ===&lt;br /&gt;
* Simulation, modélisation en physique&lt;br /&gt;
* Développement d&#039;un logiciel de modélisation&lt;br /&gt;
* Contraintes, travail en groupe&lt;br /&gt;
* Exemple: un système mécanique complexe, le moteur à explosion&lt;br /&gt;
&lt;br /&gt;
=== Environnement ===&lt;br /&gt;
On utilisera [http://root.cern.ch &#039;&#039;&#039;ROOT&#039;&#039;&#039;]. &lt;br /&gt;
* Rappel de quelques commandes Unix (si nécessaire)&lt;br /&gt;
* Utilisation de ROOT&lt;br /&gt;
* Compilation d&#039;un petit code C&lt;br /&gt;
* Compilation d&#039;un code intégrant des fonctionnalités &#039;&#039;&#039;ROOT&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Langage ===&lt;br /&gt;
Nous utiliserons le C/C++. Les notions générales de C seront supposées connues (petit rappel rapide). On introduira les notions suivantes avec à chaque fois l&#039;analyse de petits exemples de macros ROOT.&lt;br /&gt;
* Rappels de C : variables, fonctions, structures de contrôle, exemple de programme complet&lt;br /&gt;
* Pointeurs&lt;br /&gt;
* Le préprocesseur&lt;br /&gt;
* Allocation dynamique en C&lt;br /&gt;
* Le langage C++&lt;br /&gt;
* Classes, objets&lt;br /&gt;
** Héritage&lt;br /&gt;
** Constructeurs, destructeurs&lt;br /&gt;
** Encapsulation&lt;br /&gt;
* Allocation dynamique en C++&lt;br /&gt;
&lt;br /&gt;
Petit programme complet à la fin de cette page. Essayez-le dans ROOT.&lt;br /&gt;
&lt;br /&gt;
En règle générale, on donnera les informations nécessaires pour comprendre les macros ROOT présentées. Il reste beaucoup d&#039;auto-formation à faire de la part des étudiants !&lt;br /&gt;
==== Quelques références ====&lt;br /&gt;
* [http://cpp.developpez.com/cours/polyCpp/ cours de C++ à partir du C]. &lt;br /&gt;
* [http://cpp.developpez.com/cours/cpp/ &amp;quot;mégacours&amp;quot; de C/C++]. &lt;br /&gt;
* [http://www.siteduzero.com/tutoriel-3-11406-apprenez-a-programmer-en-c.html Cours sur &amp;quot;le site du zéro&amp;quot;]&lt;br /&gt;
* Ce qu&#039;il ne faut pas faire : [http://fr.wikipedia.org/wiki/Antipattern les anti-patrons]&lt;br /&gt;
&lt;br /&gt;
=== Bibliothèques ===&lt;br /&gt;
&lt;br /&gt;
gsl, modules ROOT, bibliothèques trouvées ou produites par les étudiants&lt;br /&gt;
&lt;br /&gt;
==== Résumé du 1&amp;lt;sup&amp;gt;er&amp;lt;/sup&amp;gt; cours : rappel sur le langage C ====&lt;br /&gt;
&lt;br /&gt;
;Variables &lt;br /&gt;
: int (entier)&lt;br /&gt;
: float (réel 4 octets)&lt;br /&gt;
: double (réel 8 octets)&lt;br /&gt;
: char (caractère 1 octet)&lt;br /&gt;
: ...&lt;br /&gt;
&lt;br /&gt;
;Déclaration des variables &lt;br /&gt;
=&amp;gt; &#039;&#039;int i,j,k;&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt;Pour déclarer un tableau qui va de 0 à 99 : &#039;&#039;float a[100];&#039;&#039;&lt;br /&gt;
&amp;lt;br\&amp;gt;Puis initialisation : &#039;&#039;a[i]=0;&lt;br /&gt;
&lt;br /&gt;
;Boucles &lt;br /&gt;
=&amp;gt; for, while, do...&lt;br /&gt;
&amp;lt;br/&amp;gt;Exemple avec la boucle for : &#039;&#039;for (i=1 ; i&amp;lt;36 ; i++) {......}&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Tests&lt;br /&gt;
&#039;&#039;if (i&amp;lt;35 &amp;amp;&amp;amp; i&amp;gt;27 &amp;amp;&amp;amp; i!=30) {......} else if (...) {...}&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt; On peut avoir : &lt;br /&gt;
:&amp;amp;&amp;amp; &amp;quot;et&amp;quot;&lt;br /&gt;
:== &amp;quot;égal&amp;quot;&lt;br /&gt;
:|| &amp;quot;ou&amp;quot;&lt;br /&gt;
:!= &amp;quot;différent&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;Commentaires&lt;br /&gt;
:en C : &#039;&#039;&#039;/*....*/&#039;&#039;&#039;&lt;br /&gt;
:en C++ : &#039;&#039;&#039;//&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Pointeurs&lt;br /&gt;
Déclaration : &#039;&#039;float* a;&#039;&#039;&lt;br /&gt;
&amp;lt;br/&amp;gt;Utilisation : &#039;&#039;(*a)=18&#039;&#039;;&lt;br /&gt;
&amp;lt;br/&amp;gt;Exemple :&lt;br /&gt;
::&#039;&#039;z=23&#039;&#039;;&lt;br /&gt;
::&#039;&#039;a=&amp;amp;z&#039;&#039;;&lt;br /&gt;
::&#039;&#039;*a=18;&#039;&#039;&lt;br /&gt;
:On obtient donc au final que z=18&lt;br /&gt;
&lt;br /&gt;
== Outils de travail collaboratif ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce wiki&#039;&#039;&#039; : Pour réaliser des pages sur ce wiki, il faut utiliser la [http://fr.wikipedia.org/wiki/Aide:Syntaxe_wikip%C3%A9dia syntaxe habituelle des wikis]&lt;br /&gt;
ce qui inclut des formules LaTeX encadrées par &amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Liste de diffusion&#039;&#039;&#039; : en cours de mise au point&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outil de gestion de versions&#039;&#039;&#039; : cvs ou svn. Accessible seulement à l&#039;enseignant.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés ==&lt;br /&gt;
&lt;br /&gt;
Evolution d&#039;une galaxie&lt;br /&gt;
&lt;br /&gt;
Système mécanique composé&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Programme en C++ montrant les diverses notions vues en cours ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;En cours d&#039;écriture&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous n&#039;êtes pas forcés de tout réécrire, vous pouvez télécharger les fichiers ici : [[http://www.lapp.in2p3.fr/~buskulic/Disque.h Disque.h]] et [[http://www.lapp.in2p3.fr/~buskulic/Disque.C Disque.C]]. Une fois que vous les avez téléchargés, suivez les instructions à la fin de ce paragraphe pour les utiliser dans ROOT. Avant, il faut comprendre ce qu&#039;ils contiennent.&lt;br /&gt;
&lt;br /&gt;
Les commentaires (après les //) devraient donner pas mal d&#039;explications.&lt;br /&gt;
&lt;br /&gt;
Voyons d&#039;abord le fichier en-tête, déclarant les classes, fonctions, etc... des différents programmes. On met toujours ces déclarations dans un fichier séparé pour pouvoir les réutiliser. On nomme ce fichier &amp;quot;Disque.h&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 // La classe suivante definit un objet &amp;quot;disque&amp;quot; que l&#039;on manipulera plus tard&lt;br /&gt;
 &lt;br /&gt;
 // Declaration de la classe&lt;br /&gt;
 &lt;br /&gt;
 class Disque&lt;br /&gt;
 {&lt;br /&gt;
    private:&lt;br /&gt;
       // Definition des variables privees&lt;br /&gt;
       double mXC;        // coordonnees du centre&lt;br /&gt;
       double mYC;&lt;br /&gt;
       double mEpaisseur;  // Epaisseur si en 3D&lt;br /&gt;
       double mR;            // rayon du disque&lt;br /&gt;
 &lt;br /&gt;
    public:&lt;br /&gt;
       &lt;br /&gt;
       // Methodes &amp;quot;getter&amp;quot; pour acceder aux variables privees &lt;br /&gt;
       double GetXC();&lt;br /&gt;
       double GetYC();&lt;br /&gt;
       double GetEpaisseur();&lt;br /&gt;
       double GetRayon();&lt;br /&gt;
       // Methodes &amp;quot;setter&amp;quot; pour initialiser les variables privees&lt;br /&gt;
       void SetXC(double x);&lt;br /&gt;
       void SetYC(double x);&lt;br /&gt;
       void SetEpaisseur(double x);&lt;br /&gt;
       void SetRayon(double x);&lt;br /&gt;
      &lt;br /&gt;
       // Methodes autres&lt;br /&gt;
       void Trace();                            // trace le disque&lt;br /&gt;
       void Deplace(double vX, double vY);  // Deplace le disque de (vX, vY)&lt;br /&gt;
       double Surface();                       // Renvoie la surface du disque&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Voici le contenu du fichier &amp;quot;Disque.C&amp;quot;. On commence par utiliser la directive &amp;quot;#include&amp;quot; pour inclure les fichiers d&#039;en-tête.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Disque.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TCanvas.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TEllipse.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on écrit le contenu des différentes méthodes de la classe en commençant par le constructeur&lt;br /&gt;
 &lt;br /&gt;
 // ======================&lt;br /&gt;
 //    Constructeur&lt;br /&gt;
 // ======================&lt;br /&gt;
 Disque::Disque(double xC, double yC, double epaisseur, double R)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = xC;&lt;br /&gt;
    mYC = yC;&lt;br /&gt;
    mEpaisseur = epaisseur;&lt;br /&gt;
    mR = R;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Les fonctions qui permettent de récupérer les informations &amp;quot;privées&amp;quot; de la classe. Ces fonctions ne sont pas absolument indispensables pour faire tourner le programme, sauf si on a besoin d&#039;accéder à des données privées. On est en plein dans les conséquences de la notion &amp;quot;d&#039;encapsulation&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 // ===========================&lt;br /&gt;
 //    &amp;quot;Getter&amp;quot; et &amp;quot;Setter&amp;quot;&lt;br /&gt;
 // ===========================&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetXC()&lt;br /&gt;
 {&lt;br /&gt;
    return mXC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetYC()&lt;br /&gt;
 {&lt;br /&gt;
    return mYC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetEpaisseur()&lt;br /&gt;
 {&lt;br /&gt;
    return mEpaisseur;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetRayon()&lt;br /&gt;
 {&lt;br /&gt;
    return mR;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetXC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetYC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mYC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetEpaisseur(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mEpaisseur = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetRayon(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mR = x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On passe maintenant aux méthodes spécifiques à la classe. Ici, on définit une méthode de tracé, une de déplacement et une de calcul simple.&lt;br /&gt;
 &lt;br /&gt;
 // =========================================================&lt;br /&gt;
 //     Methodes de visualisation, deplacement&lt;br /&gt;
 // =========================================================&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Trace()&lt;br /&gt;
 {&lt;br /&gt;
 // trace le disque dans un canvas&lt;br /&gt;
    TEllipse* ell;&lt;br /&gt;
    &lt;br /&gt;
 // **** ATTENTION, fuite de memoire !!!! ****&lt;br /&gt;
 // on ne detruit jamais l&#039;ellipse &amp;quot;ell&amp;quot; !&lt;br /&gt;
    ell = new TEllipse(mXC,mYC,mR);&lt;br /&gt;
    ell-&amp;gt;Draw();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Deplace(double vX, double vY)&lt;br /&gt;
 {&lt;br /&gt;
 // Deplace le disque de (vX, vY)&lt;br /&gt;
    mXC += vX;&lt;br /&gt;
    mYC += vY;&lt;br /&gt;
 // Probleme : on n&#039;est pas lie a l&#039;objet ellipse cree dans la methode &amp;quot;Trace&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // ============================&lt;br /&gt;
 //     Methodes de calcul&lt;br /&gt;
 // ============================&lt;br /&gt;
 double Disque::Surface()&lt;br /&gt;
 {&lt;br /&gt;
 // Renvoie la surface du disque&lt;br /&gt;
    double surf;&lt;br /&gt;
    double PI = 4*atan(1);&lt;br /&gt;
    &lt;br /&gt;
    surf = PI*mR*mR;&lt;br /&gt;
    return surf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la classe dans ROOT ===&lt;br /&gt;
&lt;br /&gt;
Avant de l&#039;inclure dans un programme, il est bon de voir ce que l&#039;on peut faire avec cette classe dans ROOT et comment on appelle chacune des méthodes. Comme ROOT contient un interpréteur C/C++, chaque ligne que nous écrirons sur la ligne de commande sera identique à ce que nous ferons plus tard dans un programme complet.&lt;br /&gt;
&lt;br /&gt;
Première chose, il faut charger la classe dans ROOT (une fois celui-ci lancé dans le répertoire où se trouvent Disque.h et Disque.C, bien sûr). Pour celà, on utilise la commande ROOT &amp;quot;.L&amp;quot; :&lt;br /&gt;
 root[0] .L Disque.C&lt;br /&gt;
Construisons ensuite un objet de la classe &amp;quot;Disque&amp;quot;. On va utiliser la commande &amp;quot;new&amp;quot; pour créer l&#039;objet et récupérer un pointeur sur cet objet :&lt;br /&gt;
 root[1] d = new Disque(0.5, 0.5, 0.1, 0.1)&lt;br /&gt;
Ce faisant, on a appelé le constructeur de la classe disque. Ce constructeur, nous l&#039;avons déclaré et défini pour qu&#039;il prenne 4 paramètres en entrée et qu&#039;il mette ces paramètres dans les variables privées de la classe. Si vous regardez le code, vous verrez que nous venons de définir un objet &amp;quot;Disque&amp;quot; de coordonnées du centre (0.5, 0.5), d&#039;épaisseur 0.1 et de rayon 0.1.&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on appelle maintenant la méthode de tracé, ce disque va se tracer tout seul :&lt;br /&gt;
root[2] d-&amp;gt;Trace()&lt;br /&gt;
&lt;br /&gt;
Et voilà ! On voit apparaître un disque dans une fenêtre, appelée &amp;quot;Canvas&amp;quot; dans ROOT. Si on demande la surface du disque en appelant la méthode &amp;quot;Surface()&amp;quot;, on obtient :&lt;br /&gt;
 root [3] d-&amp;gt;Surface()                   &lt;br /&gt;
 &#039;&#039;&#039;(double)3.14159265358979339e-02&#039;&#039;&#039;&lt;br /&gt;
Là encore, on a appelé la méthode de l&#039;objet d qui renvoie la valeur de la surface. Remarquez l&#039;emploi de l&#039;opérateur &amp;quot;-&amp;gt;&amp;quot; (signe &amp;quot;-&amp;quot; suivi du signe supérieur &amp;quot;&amp;gt;&amp;quot; ). On appelle cet opérateur l&#039;opérateur de déréférencement et il est employé pour indiquer &amp;quot;la méthode de l&#039;objet pointé par ...&amp;quot;. &amp;quot;d&amp;quot; est un pointeur, donc la méthode &amp;quot;Surface()&amp;quot; de l&#039;objet pointé par &amp;quot;d&amp;quot; est appelée en utilisant &amp;quot;-&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Analyse d&#039;une macro ROOT ===&lt;br /&gt;
&lt;br /&gt;
On appelle &amp;quot;macro&amp;quot; ou &amp;quot;script&amp;quot; un programme ou morceau de programme que ROOT va interpréter. Analysons la macro suivante &amp;quot;graph.C&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 void graph() {&lt;br /&gt;
    //Draw a simple graph&lt;br /&gt;
    //Author: Rene Brun&lt;br /&gt;
   &lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
 &lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
 &lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
 &lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
 &lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Vous pouvez l&#039;exécuter dans ROOT, c&#039;est une macro &amp;quot;standard&amp;quot; présente dans le répertoire ROOT. Faites simplement :&lt;br /&gt;
 root[4] .x $ROOTSYS/tutorials/graphs/graph.C&lt;br /&gt;
&lt;br /&gt;
Reprenons les lignes principales. Vous pouvez tester l&#039;effet de certaines en recopiant le fichier chez vous et en enlevant la ou les lignes correspondantes avant de lancer la macro.&lt;br /&gt;
&lt;br /&gt;
d&#039;abord, la déclaration de la fonction. Elle ne prend pas d&#039;argument :&lt;br /&gt;
 void graph()&lt;br /&gt;
 {&lt;br /&gt;
&lt;br /&gt;
Ensuite, on construit un objet &amp;quot;TCanvas&amp;quot; qui est une fenêtre graphique dans laquelle on va dessiner :&lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
&lt;br /&gt;
On en profite pour appeler des méthodes de cet objet &amp;quot;TCanvas&amp;quot; qui remplissent le fond d&#039;une certaine couleur&lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
et qui activent une option traçant une grille pointillée&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
&lt;br /&gt;
viennent ensuite les déclarations de variables que l&#039;on va utiliser. Ici, on a besoin de déclarer deux tableaux qui vont représenter des coordonnées de points à tracer. n est le nombre de points.&lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
&lt;br /&gt;
ces points, il faut bien leur donner des valeurs, d&#039;où la boucle ci-dessous :&lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
ensuite, on construit un objet &amp;quot;graphique&amp;quot; défini dans ROOT qui s&#039;appelle &amp;quot;TGraph&amp;quot;. On passe les pointeurs &amp;quot;x&amp;quot; et &amp;quot;y&amp;quot; sur les tableaux qu&#039;on vient de remplir à ce constructeur, ainsi que le nombre de points :&lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
&lt;br /&gt;
et on rend le graphe &amp;quot;joli&amp;quot;. Les noms des méthodes parlent d&#039;eux-même :&lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
enfin, l&#039;auteur a décidé de changer encore un peu le fond, libre à lui...&lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Amusez-vous à modifier le code ci-dessus et à tester vos modifications dans ROOT. Par exemple, mettre plus de points ou changer certaines caractéristiques de couleur. C&#039;est la meilleure manière d&#039;apprendre ou de vérifier que vous avez bien compris. La classe TGraph est documentée sur le site de ROOT à la page : [[http://root.cern.ch/root/html520/TGraph.html http://root.cern.ch/root/html520/TGraph.html]]&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de méthodes. Regardez certaines d&#039;entre elles pour voir si vous comprenez leur utilité.&lt;br /&gt;
&lt;br /&gt;
Il y a même un exemple encore plus simple de macro au début de cette page.&lt;br /&gt;
&lt;br /&gt;
Il y a dans ROOT un très grand nombre de classes différentes, nous verrons celles dont nous aurons besoin au fur et à mesure.&lt;/div&gt;</summary>
		<author><name>Lfall</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2202</id>
		<title>PHYS710 : Simulation et modélisation en physique</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=PHYS710_:_Simulation_et_mod%C3%A9lisation_en_physique&amp;diff=2202"/>
		<updated>2008-09-22T16:26:20Z</updated>

		<summary type="html">&lt;p&gt;Lfall : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Projet: Evolution d&#039;une galaxie]]&lt;br /&gt;
&lt;br /&gt;
Le but de ce cours est d&#039;initier les étudiants au développement d&#039;un logiciel de simulation ou de modélisation en physique. Ce logiciel sera modulaire et composé de sous-ensembles interagissant entre eux. Chaque module ou sous-ensemble sera développé par un binôme qui en aura la responsabilité. Le but sous-jacent est l&#039;initiation à un travail collaboratif.&lt;br /&gt;
&lt;br /&gt;
Dans cet esprit, la première séance consistera en une introduction succinte à l&#039;environnement de développement et au langage choisis, en l&#039;occurence [http://root.cern.ch ROOT] et le C/C++. Les séances suivantes, espacées de 2 à 3 semaines seront des occasions de faire le point, chaque binôme expliquant aux autres l&#039;évolution de leur travail et les points d&#039;accès pour que tous puissent faire des tests entre les modules. Entre temps, les étudiants communiqueront avec l&#039;enseignant et leurs camarades à travers un ensemble d&#039;outils tels cette page wiki et une liste de diffusion. L&#039;enseignant collectera les contributions (et suggérera/demandera éventuellement des modifications) de telle sorte qu&#039;elles soient disponibles pour tous.&lt;br /&gt;
&lt;br /&gt;
Autant que faire se peut, on envisagera une utilisation ultérieure du logiciel, soit dans le cadre des exercices &amp;quot;WIMS&amp;quot; de première année, soit pour servir de point de départ aux projets des années suivantes.&lt;br /&gt;
&lt;br /&gt;
== Introduction, outils de développement ==&lt;br /&gt;
=== Cadre général ===&lt;br /&gt;
* Simulation, modélisation en physique&lt;br /&gt;
* Développement d&#039;un logiciel de modélisation&lt;br /&gt;
* Contraintes, travail en groupe&lt;br /&gt;
* Exemple: un système mécanique complexe, le moteur à explosion&lt;br /&gt;
&lt;br /&gt;
=== Environnement ===&lt;br /&gt;
On utilisera [http://root.cern.ch &#039;&#039;&#039;ROOT&#039;&#039;&#039;]. &lt;br /&gt;
* Rappel de quelques commandes Unix (si nécessaire)&lt;br /&gt;
* Utilisation de ROOT&lt;br /&gt;
* Compilation d&#039;un petit code C&lt;br /&gt;
* Compilation d&#039;un code intégrant des fonctionnalités &#039;&#039;&#039;ROOT&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Langage ===&lt;br /&gt;
Nous utiliserons le C/C++. Les notions générales de C seront supposées connues (petit rappel rapide). On introduira les notions suivantes avec à chaque fois l&#039;analyse de petits exemples de macros ROOT.&lt;br /&gt;
* Rappels de C : variables, fonctions, structures de contrôle, exemple de programme complet&lt;br /&gt;
* Pointeurs&lt;br /&gt;
* Le préprocesseur&lt;br /&gt;
* Allocation dynamique en C&lt;br /&gt;
* Le langage C++&lt;br /&gt;
* Classes, objets&lt;br /&gt;
** Héritage&lt;br /&gt;
** Constructeurs, destructeurs&lt;br /&gt;
** Encapsulation&lt;br /&gt;
* Allocation dynamique en C++&lt;br /&gt;
&lt;br /&gt;
Petit programme complet à la fin de cette page. Essayez-le dans ROOT.&lt;br /&gt;
&lt;br /&gt;
En règle générale, on donnera les informations nécessaires pour comprendre les macros ROOT présentées. Il reste beaucoup d&#039;auto-formation à faire de la part des étudiants !&lt;br /&gt;
==== Quelques références ====&lt;br /&gt;
* [http://cpp.developpez.com/cours/polyCpp/ cours de C++ à partir du C]. &lt;br /&gt;
* [http://cpp.developpez.com/cours/cpp/ &amp;quot;mégacours&amp;quot; de C/C++]. &lt;br /&gt;
* [http://www.siteduzero.com/tutoriel-3-11406-apprenez-a-programmer-en-c.html Cours sur &amp;quot;le site du zéro&amp;quot;]&lt;br /&gt;
* Ce qu&#039;il ne faut pas faire : [http://fr.wikipedia.org/wiki/Antipattern les anti-patrons]&lt;br /&gt;
&lt;br /&gt;
=== Bibliothèques ===&lt;br /&gt;
&lt;br /&gt;
gsl, modules ROOT, bibliothèques trouvées ou produites par les étudiants&lt;br /&gt;
&lt;br /&gt;
==== Résumé du 1^er cours : rappel sur le langage C ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;u&amp;gt;Variables&amp;lt;/u&amp;gt; : ** int (entier)&lt;br /&gt;
** float (réel 4 octets)&lt;br /&gt;
** double (réel 8 octets)&lt;br /&gt;
** char (caractère 1 octet)&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;u&amp;gt;Déclaration des variables&amp;lt;/u&amp;gt; : &#039;&#039;int i,j,k;&#039;&#039;&lt;br /&gt;
Pour déclarer un tableau qui va de 0 à 99 : &#039;&#039;float a[100];&#039;&#039;&lt;br /&gt;
Puis initialisation : &#039;&#039;a[i]=0;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;u&amp;gt;Boucles&amp;lt;/u&amp;gt; : for, while, do...&lt;br /&gt;
Exemple avec la boucle for : &#039;&#039;for (i=1 ; i&amp;lt;36 ; i++) { ...... }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Outils de travail collaboratif ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ce wiki&#039;&#039;&#039; : Pour réaliser des pages sur ce wiki, il faut utiliser la [http://fr.wikipedia.org/wiki/Aide:Syntaxe_wikip%C3%A9dia syntaxe habituelle des wikis]&lt;br /&gt;
ce qui inclut des formules LaTeX encadrées par &amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt;...&amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Liste de diffusion&#039;&#039;&#039; : en cours de mise au point&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outil de gestion de versions&#039;&#039;&#039; : cvs ou svn. Accessible seulement à l&#039;enseignant.&lt;br /&gt;
&lt;br /&gt;
== Sujets proposés ==&lt;br /&gt;
&lt;br /&gt;
Evolution d&#039;une galaxie&lt;br /&gt;
&lt;br /&gt;
Système mécanique composé&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Programme en C++ montrant les diverses notions vues en cours ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;En cours d&#039;écriture&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous n&#039;êtes pas forcés de tout réécrire, vous pouvez télécharger les fichiers ici : [[http://www.lapp.in2p3.fr/~buskulic/Disque.h Disque.h]] et [[http://www.lapp.in2p3.fr/~buskulic/Disque.C Disque.C]]. Une fois que vous les avez téléchargés, suivez les instructions à la fin de ce paragraphe pour les utiliser dans ROOT. Avant, il faut comprendre ce qu&#039;ils contiennent.&lt;br /&gt;
&lt;br /&gt;
Les commentaires (après les //) devraient donner pas mal d&#039;explications.&lt;br /&gt;
&lt;br /&gt;
Voyons d&#039;abord le fichier en-tête, déclarant les classes, fonctions, etc... des différents programmes. On met toujours ces déclarations dans un fichier séparé pour pouvoir les réutiliser. On nomme ce fichier &amp;quot;Disque.h&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 // La classe suivante definit un objet &amp;quot;disque&amp;quot; que l&#039;on manipulera plus tard&lt;br /&gt;
 &lt;br /&gt;
 // Declaration de la classe&lt;br /&gt;
 &lt;br /&gt;
 class Disque&lt;br /&gt;
 {&lt;br /&gt;
    private:&lt;br /&gt;
       // Definition des variables privees&lt;br /&gt;
       double mXC;        // coordonnees du centre&lt;br /&gt;
       double mYC;&lt;br /&gt;
       double mEpaisseur;  // Epaisseur si en 3D&lt;br /&gt;
       double mR;            // rayon du disque&lt;br /&gt;
 &lt;br /&gt;
    public:&lt;br /&gt;
       &lt;br /&gt;
       // Methodes &amp;quot;getter&amp;quot; pour acceder aux variables privees &lt;br /&gt;
       double GetXC();&lt;br /&gt;
       double GetYC();&lt;br /&gt;
       double GetEpaisseur();&lt;br /&gt;
       double GetRayon();&lt;br /&gt;
       // Methodes &amp;quot;setter&amp;quot; pour initialiser les variables privees&lt;br /&gt;
       void SetXC(double x);&lt;br /&gt;
       void SetYC(double x);&lt;br /&gt;
       void SetEpaisseur(double x);&lt;br /&gt;
       void SetRayon(double x);&lt;br /&gt;
      &lt;br /&gt;
       // Methodes autres&lt;br /&gt;
       void Trace();                            // trace le disque&lt;br /&gt;
       void Deplace(double vX, double vY);  // Deplace le disque de (vX, vY)&lt;br /&gt;
       double Surface();                       // Renvoie la surface du disque&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Voici le contenu du fichier &amp;quot;Disque.C&amp;quot;. On commence par utiliser la directive &amp;quot;#include&amp;quot; pour inclure les fichiers d&#039;en-tête.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;Disque.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TCanvas.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;TEllipse.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on écrit le contenu des différentes méthodes de la classe en commençant par le constructeur&lt;br /&gt;
 &lt;br /&gt;
 // ======================&lt;br /&gt;
 //    Constructeur&lt;br /&gt;
 // ======================&lt;br /&gt;
 Disque::Disque(double xC, double yC, double epaisseur, double R)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = xC;&lt;br /&gt;
    mYC = yC;&lt;br /&gt;
    mEpaisseur = epaisseur;&lt;br /&gt;
    mR = R;&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
Les fonctions qui permettent de récupérer les informations &amp;quot;privées&amp;quot; de la classe. Ces fonctions ne sont pas absolument indispensables pour faire tourner le programme, sauf si on a besoin d&#039;accéder à des données privées. On est en plein dans les conséquences de la notion &amp;quot;d&#039;encapsulation&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
 // ===========================&lt;br /&gt;
 //    &amp;quot;Getter&amp;quot; et &amp;quot;Setter&amp;quot;&lt;br /&gt;
 // ===========================&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetXC()&lt;br /&gt;
 {&lt;br /&gt;
    return mXC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetYC()&lt;br /&gt;
 {&lt;br /&gt;
    return mYC;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetEpaisseur()&lt;br /&gt;
 {&lt;br /&gt;
    return mEpaisseur;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 double Disque::GetRayon()&lt;br /&gt;
 {&lt;br /&gt;
    return mR;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetXC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mXC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetYC(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mYC = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetEpaisseur(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mEpaisseur = x;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::SetRayon(double x)&lt;br /&gt;
 {&lt;br /&gt;
    mR = x;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
On passe maintenant aux méthodes spécifiques à la classe. Ici, on définit une méthode de tracé, une de déplacement et une de calcul simple.&lt;br /&gt;
 &lt;br /&gt;
 // =========================================================&lt;br /&gt;
 //     Methodes de visualisation, deplacement&lt;br /&gt;
 // =========================================================&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Trace()&lt;br /&gt;
 {&lt;br /&gt;
 // trace le disque dans un canvas&lt;br /&gt;
    TEllipse* ell;&lt;br /&gt;
    &lt;br /&gt;
 // **** ATTENTION, fuite de memoire !!!! ****&lt;br /&gt;
 // on ne detruit jamais l&#039;ellipse &amp;quot;ell&amp;quot; !&lt;br /&gt;
    ell = new TEllipse(mXC,mYC,mR);&lt;br /&gt;
    ell-&amp;gt;Draw();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void Disque::Deplace(double vX, double vY)&lt;br /&gt;
 {&lt;br /&gt;
 // Deplace le disque de (vX, vY)&lt;br /&gt;
    mXC += vX;&lt;br /&gt;
    mYC += vY;&lt;br /&gt;
 // Probleme : on n&#039;est pas lie a l&#039;objet ellipse cree dans la methode &amp;quot;Trace&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // ============================&lt;br /&gt;
 //     Methodes de calcul&lt;br /&gt;
 // ============================&lt;br /&gt;
 double Disque::Surface()&lt;br /&gt;
 {&lt;br /&gt;
 // Renvoie la surface du disque&lt;br /&gt;
    double surf;&lt;br /&gt;
    double PI = 4*atan(1);&lt;br /&gt;
    &lt;br /&gt;
    surf = PI*mR*mR;&lt;br /&gt;
    return surf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la classe dans ROOT ===&lt;br /&gt;
&lt;br /&gt;
Avant de l&#039;inclure dans un programme, il est bon de voir ce que l&#039;on peut faire avec cette classe dans ROOT et comment on appelle chacune des méthodes. Comme ROOT contient un interpréteur C/C++, chaque ligne que nous écrirons sur la ligne de commande sera identique à ce que nous ferons plus tard dans un programme complet.&lt;br /&gt;
&lt;br /&gt;
Première chose, il faut charger la classe dans ROOT (une fois celui-ci lancé dans le répertoire où se trouvent Disque.h et Disque.C, bien sûr). Pour celà, on utilise la commande ROOT &amp;quot;.L&amp;quot; :&lt;br /&gt;
 root[0] .L Disque.C&lt;br /&gt;
Construisons ensuite un objet de la classe &amp;quot;Disque&amp;quot;. On va utiliser la commande &amp;quot;new&amp;quot; pour créer l&#039;objet et récupérer un pointeur sur cet objet :&lt;br /&gt;
 root[1] d = new Disque(0.5, 0.5, 0.1, 0.1)&lt;br /&gt;
Ce faisant, on a appelé le constructeur de la classe disque. Ce constructeur, nous l&#039;avons déclaré et défini pour qu&#039;il prenne 4 paramètres en entrée et qu&#039;il mette ces paramètres dans les variables privées de la classe. Si vous regardez le code, vous verrez que nous venons de définir un objet &amp;quot;Disque&amp;quot; de coordonnées du centre (0.5, 0.5), d&#039;épaisseur 0.1 et de rayon 0.1.&lt;br /&gt;
&lt;br /&gt;
Si l&#039;on appelle maintenant la méthode de tracé, ce disque va se tracer tout seul :&lt;br /&gt;
root[2] d-&amp;gt;Trace()&lt;br /&gt;
&lt;br /&gt;
Et voilà ! On voit apparaître un disque dans une fenêtre, appelée &amp;quot;Canvas&amp;quot; dans ROOT. Si on demande la surface du disque en appelant la méthode &amp;quot;Surface()&amp;quot;, on obtient :&lt;br /&gt;
 root [3] d-&amp;gt;Surface()                   &lt;br /&gt;
 &#039;&#039;&#039;(double)3.14159265358979339e-02&#039;&#039;&#039;&lt;br /&gt;
Là encore, on a appelé la méthode de l&#039;objet d qui renvoie la valeur de la surface. Remarquez l&#039;emploi de l&#039;opérateur &amp;quot;-&amp;gt;&amp;quot; (signe &amp;quot;-&amp;quot; suivi du signe supérieur &amp;quot;&amp;gt;&amp;quot; ). On appelle cet opérateur l&#039;opérateur de déréférencement et il est employé pour indiquer &amp;quot;la méthode de l&#039;objet pointé par ...&amp;quot;. &amp;quot;d&amp;quot; est un pointeur, donc la méthode &amp;quot;Surface()&amp;quot; de l&#039;objet pointé par &amp;quot;d&amp;quot; est appelée en utilisant &amp;quot;-&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Analyse d&#039;une macro ROOT ===&lt;br /&gt;
&lt;br /&gt;
On appelle &amp;quot;macro&amp;quot; ou &amp;quot;script&amp;quot; un programme ou morceau de programme que ROOT va interpréter. Analysons la macro suivante &amp;quot;graph.C&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
 void graph() {&lt;br /&gt;
    //Draw a simple graph&lt;br /&gt;
    //Author: Rene Brun&lt;br /&gt;
   &lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
 &lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
 &lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
 &lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
 &lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Vous pouvez l&#039;exécuter dans ROOT, c&#039;est une macro &amp;quot;standard&amp;quot; présente dans le répertoire ROOT. Faites simplement :&lt;br /&gt;
 root[4] .x $ROOTSYS/tutorials/graphs/graph.C&lt;br /&gt;
&lt;br /&gt;
Reprenons les lignes principales. Vous pouvez tester l&#039;effet de certaines en recopiant le fichier chez vous et en enlevant la ou les lignes correspondantes avant de lancer la macro.&lt;br /&gt;
&lt;br /&gt;
d&#039;abord, la déclaration de la fonction. Elle ne prend pas d&#039;argument :&lt;br /&gt;
 void graph()&lt;br /&gt;
 {&lt;br /&gt;
&lt;br /&gt;
Ensuite, on construit un objet &amp;quot;TCanvas&amp;quot; qui est une fenêtre graphique dans laquelle on va dessiner :&lt;br /&gt;
    TCanvas *c1 = new TCanvas(&amp;quot;c1&amp;quot;,&amp;quot;A Simple Graph Example&amp;quot;,200,10,700,500);&lt;br /&gt;
&lt;br /&gt;
On en profite pour appeler des méthodes de cet objet &amp;quot;TCanvas&amp;quot; qui remplissent le fond d&#039;une certaine couleur&lt;br /&gt;
    c1-&amp;gt;SetFillColor(42);&lt;br /&gt;
et qui activent une option traçant une grille pointillée&lt;br /&gt;
    c1-&amp;gt;SetGrid();&lt;br /&gt;
&lt;br /&gt;
viennent ensuite les déclarations de variables que l&#039;on va utiliser. Ici, on a besoin de déclarer deux tableaux qui vont représenter des coordonnées de points à tracer. n est le nombre de points.&lt;br /&gt;
    const Int_t n = 20;&lt;br /&gt;
    double x[n], y[n];&lt;br /&gt;
&lt;br /&gt;
ces points, il faut bien leur donner des valeurs, d&#039;où la boucle ci-dessous :&lt;br /&gt;
    for (Int_t i=0;i&amp;lt;n;i++) {&lt;br /&gt;
      x[i] = i*0.1;&lt;br /&gt;
      y[i] = 10*sin(x[i]+0.2);&lt;br /&gt;
      printf(&amp;quot; i %i %f %f \n&amp;quot;,i,x[i],y[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
ensuite, on construit un objet &amp;quot;graphique&amp;quot; défini dans ROOT qui s&#039;appelle &amp;quot;TGraph&amp;quot;. On passe les pointeurs &amp;quot;x&amp;quot; et &amp;quot;y&amp;quot; sur les tableaux qu&#039;on vient de remplir à ce constructeur, ainsi que le nombre de points :&lt;br /&gt;
    gr = new TGraph(n,x,y);&lt;br /&gt;
&lt;br /&gt;
et on rend le graphe &amp;quot;joli&amp;quot;. Les noms des méthodes parlent d&#039;eux-même :&lt;br /&gt;
    gr-&amp;gt;SetLineColor(2);&lt;br /&gt;
    gr-&amp;gt;SetLineWidth(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerColor(4);&lt;br /&gt;
    gr-&amp;gt;SetMarkerStyle(21);&lt;br /&gt;
    gr-&amp;gt;SetTitle(&amp;quot;a simple graph&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetXaxis()-&amp;gt;SetTitle(&amp;quot;X title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;GetYaxis()-&amp;gt;SetTitle(&amp;quot;Y title&amp;quot;);&lt;br /&gt;
    gr-&amp;gt;Draw(&amp;quot;ACP&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
enfin, l&#039;auteur a décidé de changer encore un peu le fond, libre à lui...&lt;br /&gt;
    // TCanvas::Update() draws the frame, after which one can change it&lt;br /&gt;
    c1-&amp;gt;Update();&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetFillColor(21);&lt;br /&gt;
    c1-&amp;gt;GetFrame()-&amp;gt;SetBorderSize(12);&lt;br /&gt;
    c1-&amp;gt;Modified();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Amusez-vous à modifier le code ci-dessus et à tester vos modifications dans ROOT. Par exemple, mettre plus de points ou changer certaines caractéristiques de couleur. C&#039;est la meilleure manière d&#039;apprendre ou de vérifier que vous avez bien compris. La classe TGraph est documentée sur le site de ROOT à la page : [[http://root.cern.ch/root/html520/TGraph.html http://root.cern.ch/root/html520/TGraph.html]]&lt;br /&gt;
&lt;br /&gt;
Il y a beaucoup de méthodes. Regardez certaines d&#039;entre elles pour voir si vous comprenez leur utilité.&lt;br /&gt;
&lt;br /&gt;
Il y a même un exemple encore plus simple de macro au début de cette page.&lt;br /&gt;
&lt;br /&gt;
Il y a dans ROOT un très grand nombre de classes différentes, nous verrons celles dont nous aurons besoin au fur et à mesure.&lt;/div&gt;</summary>
		<author><name>Lfall</name></author>
	</entry>
</feed>