summaryrefslogtreecommitdiff
path: root/reponses.lyx
blob: 460652dc2274024b9d65216c8abe62402bc1b173 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
#LyX 1.6.7 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass article
\begin_preamble
\usepackage{color}
\end_preamble
\use_default_options true
\language french
\inputencoding auto
\font_roman charter
\font_sans default
\font_typewriter cmtt
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100

\graphics default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry true
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\leftmargin 2cm
\topmargin 2cm
\rightmargin 2cm
\bottommargin 2cm
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\author "" 
\author "" 
\end_header

\begin_body

\begin_layout Title
Réponses aux questions
\end_layout

\begin_layout Author
J.
 Odersky 
\begin_inset ERT
status collapsed

\begin_layout Plain Layout


\backslash
and
\end_layout

\end_inset

 C.
 Vázquez
\end_layout

\begin_layout Section*
Question P1.1
\end_layout

\begin_layout Standard
Un vecteur est représenté par la classe `Vector3D'.
 Cette classe comprend trois champs privés du type double: x, y et z corresponda
nt aux composantes du vecteur.
 Ces champs peuvent être accédés respectivement par les méthodes publiques
 getX(), getY() et getZ().
 Les méthodes 
\begin_inset Quotes eld
\end_inset

opérateurs
\begin_inset Quotes erd
\end_inset

 sur les vecteurs (par exemple l'addition, la norme, etc...) sont toutes publiques.
\end_layout

\begin_layout Standard
Ces méthodes s'appuient entre-elles, par exemple la méthode `opposée' retourne
 le vecteur multiplié par moins un et la méthode `soustraction' additionne
 l'opposé.
 C'est à partir de cette idee que nous avons aussi implémenté une norme
 au carré (=produit scalaire du vecteur avec lui-même) et une norm (=racine
 de la norme au carré).
 Ces appels consécutifs diminuent la performance d'une façon minimale mais
 évitent un duplicage de code considérable.
\end_layout

\begin_layout Standard
Un vecteur est complètement invariable.
 C'est-à-dire qu'une fois un vecteur initialisé, on ne peut plus changer
 ses composantes (pas de méthodes `set').
 De même, tous les opérations internes du sens mathématique (qui renvoyent
 un vecteur), renvoyent une nouvelle instance d'un vecteur.
 En aucun cas l'instance d'un vecteur n'est modifiée! Ceci facilite énormément
 le raisonement sur toute variable de type vecteur, c'est-à-dire qu'on peut
 toujours être sûr que personne n'a modifié le vecteur sur lequel on travaille.
 De plus, l'invariance d'un vecteur paraît naturelle, comme celle d'un nombre
 réel.
\end_layout

\begin_layout Standard
Quelques vecteurs remarquables sont définis comme variables statiques constantes.
 Parmi ceux-ci notamment le vecteur nulle (Null) et les vecteurs unitaires
 i, j, k selon respectivement les axes x, y et z.
\end_layout

\begin_layout Standard
Pour contourner la perte de performance due à l'immutabilité des vecteurs,
 nous avons rajouté un classe `MutableVector3D'.
 Cette classe représente des vecteurs mutables lesquelles peuvent changer
 leurs coordonnées.
 Ces vecteurs sont presque exclusivement utilisés pour représenter des champs
 qui varient souvent tel que la position d'une particule.
\end_layout

\begin_layout Section*
Question P3.1
\end_layout

\begin_layout Standard
Nous n'avons pas rajouté un constructeur de copie.
 Comme la classe `Vector3D' est invariable et ne contient pas de pointeurs
 ou références sur d'autres objets mutables, elle n'a pas d'état et donc
 l'utilisation du constructeur de copie par défaut suffit.
\end_layout

\begin_layout Standard
En revanche la classe `MutableVector3D' contient un constructeur de copie
 qui copie les champs d'un vecteur donné.
\end_layout

\begin_layout Section*
Question P3.2
\end_layout

\begin_layout Standard
Lorsque l'on décide d'implémenter le constructeur par défaut (qui crée un
 vecteur nul) et le constructeur par coordonnés cartésiennes dans une seule
 et même méthode, il se peut que lorsque l'on crée une nouvelle instance
 de Vector3D sans l'initialiser (en laissant donc le soin au constructeur
 par défaut de le faire), on se retrouve avec un vecteur nul à un endroit
 où il vaudrait mieux ne pas en avoir.
 Par conséquent, en séparant ces deux méthodes, le programmeur est amené
 à penser dès l'instanciation à quelle fin il crée son objet.
\end_layout

\begin_layout Section*
Question P3.3
\end_layout

\begin_layout Subsection*
a
\end_layout

\begin_layout Standard
En ajoutant un constructeur par coordonnées sphériques, les attributs de
 la classe ne devraient pas forcémant être changées.
 Il serait toute à fait envisageable, de garder les coordonnées carthésiennes
 comme attributs et de convertir les coordonnées sphériques avec le constructeur.
 L'accès et la modification des coordonnées shpériques pourrait égelement
 se faire par un méthode convertissant les deux types de coordonnées.
\end_layout

\begin_layout Subsection*
b
\end_layout

\begin_layout Standard
La surcharge serait une difficulté majeur pour créer un constructeur par
 coordonnées sphériques.
 Etant donné qu'un tel constructeur prendrait comme paramètres deux angles
 et une longueur, représentés par trois doubles, il serait en conflit avec
 le constructeur de coordonnées carthésiennes.
 Il serait alors impossible d'avoir les deux constructeurs dans une classe.
\end_layout

\begin_layout Standard
Néanmoins, une solution alternative serait d'implémenter une méthode statique
 (
\begin_inset Quotes eld
\end_inset

factory method
\begin_inset Quotes erd
\end_inset

) qui prendrait comme paramètres des coordonnées sphériques et qui renverait
 un vecteur ayant des coordonnées carthésiennes équivalentes (par exemple
 
\family typewriter
Vector3D Vector3D::fromSpherical(double phi, double theta, double r)
\family default
).
\end_layout

\begin_layout Section*
Question P3.4
\end_layout

\begin_layout Standard
La méthode `affiche()' d'un vecteur a été implémenté sous forme de l'opérateur
 `<<' de `std::ostream'.
 La méthode `compare' est équivalent à l'opérateur `=='.
\end_layout

\begin_layout Section*
Question P5.1
\end_layout

\begin_layout Standard
Les membres d'une particule représentant le facteur gamma
\begin_inset Formula $\gamma$
\end_inset

 et l'énergie
\begin_inset Formula $E$
\end_inset

 peuvent être implémentés soit sous forme d'attributs soit sous forme de
 méthodes.
 Il y a des avantages et inconvénients pour chaque forme.
\end_layout

\begin_layout Standard
L'avantage d'un attribut est que son accès est très rapide et ne prend (presque)
 pas de temps de calcul.
 Par contre, si la valeur d'un attribut est relié logiquement à la valeur
 d'un autre attribut et que ce dernier est modifié, il faudra manuellement
 changer le premier.
 Par exemple, le facteur gamma étant défini par:
\end_layout

\begin_layout Standard
\begin_inset Formula \[
\gamma=\frac{1}{\sqrt{1-\left(\frac{v}{c}\right)^{2}}}\]

\end_inset


\end_layout

\begin_layout Standard
si il est défini comme variable, il faudrait le mettre à jour à chaque fois
 que la vitesse change.
\end_layout

\begin_layout Standard
Contrairement à un attribut, une méthode est évaluée à chaque fois qu'on
 l'appelle.
 Ceci a l'avantage que si le résultat d'une méthode dépend d'une variable,
 la variable pourra être modifiée sans autre considération.
 Ainsi, si le facteur gamma est une méthode, une mise à jour de la vitesse
 pourra être effectuée directement sans explicitement changer 
\begin_inset Formula $\gamma$
\end_inset

.
\end_layout

\begin_layout Standard
Dans le cas de notre projet, nous avons décidés d'implémenter l'énergie
 sous forme de méthode et le facteur gamma sous forme d'attribut.
 Ceci pour plusieurs raisons:
\end_layout

\begin_layout Enumerate
Au cours de la simulation, le facteur gamma est accédé autant de fois que
 la vitesse, il est donc plus rapide de n'evoluer une racine qu'une seule
 fois pour un pas de temps.
\end_layout

\begin_layout Enumerate
L'énergie est accédée beaucoup plus rarement que la vitesse mais dépend
 quand même de cette dernière, ainsi nous avons décidé de l'implémenter
 sous forme de méthode.
\end_layout

\begin_layout Section*
Question P6.1
\end_layout

\begin_layout Standard
Pour représenter et organiser les éléments, nous avons créé une classe abtsraite
 `Element'.
 Celle-ci contient tous les attributs généraux d'un élément.
 De plus, elle contient des méthodes virtuelles pures tels que la détermination
 si une particule a heurté le bord ou est passé au suivant.
\end_layout

\begin_layout Standard
Dans la hierarchie en dessous de `Element' se trouvent deux classes representant
s les élements droits et courbes.
 Ceux-ci implémentent tout méthode relatif à la géométrie d'un élément (p.ex.
 les méthodes mentionés ci-dessus).
\end_layout

\begin_layout Standard
Finalement, en dessous de ces classes se trouvent les implémentations concrètes
 telles que les quadripoles, dipoles, etc...
\end_layout

\begin_layout Standard
Nous n'avons pas faits de classes séparés pour des élements générants un
 champ électrique ou magnétique car nous considérons qu'un élément ne générant
 pas de champ 
\emph on
possède
\emph default
 un champ nul.
 (voir question P6.2)
\end_layout

\begin_layout Section*
Question P6.2
\end_layout

\begin_layout Standard
Les champs magnétiques et électriques sont représentés par les méthodes
 `magneticFieldAt' et `electricFieldAt'.
 Ces méthodes prennent comme paramètre une position et renvoyent un vecteur
 représentant le champ à cette position.
\end_layout

\begin_layout Standard
Ceci représente concrètement les lignes de champs à un endroit donné.
\end_layout

\begin_layout Standard
En effet, en physique on représente les lignes de champ par des lignes continues.
 Or dans ce projet, cela ne nous intéresse pas de représenter ces lignes.
 Puisque les seules interactions de ces champs avec les particules invoquent
 des vecteurs représentant l'intensité et la direction du champ à l'endroit
 où se trouve la particule par rapport à l'
\family typewriter
\size small
Element
\family default
\size default
, on n'a besoin que d'un 
\family typewriter
\size small
Vector3D
\family default
\size default
.
\end_layout

\begin_layout Section*
Question P6.3
\end_layout

\begin_layout Standard
Nous représentons le centre de courbure 
\family typewriter
\size small
curvatureCenter
\family default
\size default
 à l'aide d'un attribut du type 
\family typewriter
\size small
Vector3D
\family default
\size default
 que l'on instancie indirectement en fournissant la courbure 
\family typewriter
\size small
k
\family default
\size default
 au constructeur des éléments courbes.
\end_layout

\begin_layout Standard
En effet, le centre de courbure d'une courbe est défini d'une manière unique
 si nous avons :
\end_layout

\begin_layout Itemize
une position d'entrée 
\family typewriter
\size small
entry
\family default
\size default
;
\end_layout

\begin_layout Itemize
une position de sortie 
\family typewriter
\size small
exit
\family default
\size default
;
\end_layout

\begin_layout Itemize
une courbure
\family typewriter
\size small
 k
\family default
\size default
 (donc un rayon de courbure 
\family typewriter
\size small
curvatureRadius
\family default
\size default
 ) avec son signe !;
\end_layout

\begin_layout Itemize
une convention à l'aide de laquelle nous savons, en fonction du signe du
 rayon, de quel côté de l'Element la courbe se courbe.
\begin_inset Foot
status open

\begin_layout Plain Layout
Les éléments courbes auront de plus une courbure k, constante (l’inverse
 du rayon de courbure), dont le signe indique le sens de courbure par rapport
 à l’orientation donnée par l’opposé de l’axe vertical (noté -
\begin_inset Formula $\overrightarrow{\textrm{e}{}^{3}}$
\end_inset

) .
\end_layout

\end_inset


\end_layout

\begin_layout Section*
Question P6.4
\end_layout

\begin_layout Standard
Afin qu'une particule soit dans un et un seul 
\family typewriter
\size small
Element
\family default
\size default
 à la fois, nous avons décidé de rajouter un attribut privé (un pointeur)
 à chaque particule, qui soit responsable de lui indiquer dans quel 
\family typewriter
\size small
Element
\family default
\size default
 elle se trouve.
 Elle ne peut se retrouver dans deux 
\family typewriter
\size small
Element
\family default
\size default
s.
 C'est un moyen simple de coller une étiquette 'Où je suis ?' sur une particule,
 et on pourra facilement vérifier qu'à chaque évolution du système, notre
 particule ne soit que dans un et un seul 
\family typewriter
\size small
Element
\family default
\size default
 à la fois.
 Cela modifie la classe 
\family typewriter
\size small
Particule
\family default
\size default
.
\end_layout

\begin_layout Section*
Question P7.1
\end_layout

\begin_layout Standard
La classe 
\family typewriter
\size small
Accelerator
\family sans
 
\family default
\size default
un accélerateur.
 Elle contient une collection de particules et d'élements (en attributs).
 De plus, nous avons décidé qu'un accélérateur sera entièrement responsable
 de la gestion de ses particules et elements.
 Cela implique que lors de l'ajout d'un de ces derniers, il sera copié.
\end_layout

\begin_layout Standard
Cette copie entraîne d'eutres conséquences tel que le rajout d'un méthode
 `clone' dans les éléments et particules.
\end_layout

\begin_layout Section*
Question P7.2
\end_layout

\begin_layout Standard
Le constructeur de copie privé : il doit servir à empêcher tout appel au
 constructeur de copie par défaut, puisqu'il ne fait rien, on ne pourra
 simplement pas faire de copie d'
\family typewriter
\size small
Accelerator
\family default
\size default
, donc pas de passage par valeur.
\end_layout

\begin_layout Standard
L'opérateur '=' : de même que pour le constructeur de copie, sa déclaration
 en privé empêche la copie d'un accélérateur vers un autre.
\end_layout

\begin_layout Standard
Ces restrictions sont présents pour éviter des problèmes de responsabilités
 d'allocation et de délocation de mémoire (car un accélérateur contient
 beaucoup de pointeurs d'éléments et de particules qui eux-mêmes pointent
 vers des particules).
 Mais aussi d'un point de vue logique: comment serait-ce physiquement possible
 de copier un accélérateur dans un état donné avec tous ses particules?
\end_layout

\begin_layout Section*
Question P8.1
\end_layout

\begin_layout Standard
En termes de POO, cela signifie que la méthode 
\family typewriter
\size small
heurte_bord
\family default
\size default
 (`isBeside' dans notre cas) est virtuelle (même virtuelle pure à l'intérieur
 de la classe 
\family typewriter
\size small
Element
\family default
\size default
).
\end_layout

\begin_layout Section*
Question P8.2
\end_layout

\begin_layout Standard
Cela implique donc que la classe 
\family typewriter
\size small
Element
\family default
\size default
 est 
\emph on
abstraite
\emph default
.
\end_layout

\begin_layout Section*
Question P8.3
\end_layout

\begin_layout Standard
La méthode `dessine' est elle aussi virtuelle pure dans la classe dessinable.
\end_layout

\begin_layout Section*
Question P9.1
\end_layout

\begin_layout Standard
FODO
\end_layout

\begin_layout Section*
Question P10.1
\end_layout

\begin_layout Standard
Concernant les classes contenant des pointeurs, il s'agit de fixer une manière
 de gérer les pointeurs, les montrer ou non.
 Si on choisi de les montrer, alors il faut gérer les 
\family typewriter
\size small
delete
\family default
\size default
 en externe, et cela induit un plus grand risque d'erreurs, plus que si
 on choisi la deuxième option.
 Dans ce cas, on peut envisager d'écrire les 
\family typewriter
\size small
new
\family default
\size default
 et les 
\family typewriter
\size small
delete
\family default
\size default
 en interne, ce qui implique qu'on est tout seul à manipuler des pointeurs,
 ce qui est plus élégant.
\end_layout

\begin_layout Section*
Question P10.2
\end_layout

\begin_layout Standard
Dans le cadre de la programmation oritentée-objets, on créerait une classe
 abstraite (p.ex.
 
\begin_inset Quotes eld
\end_inset

Dessinable
\begin_inset Quotes erd
\end_inset

) contenant la methode dessine() virtuelle pure.
 Tout objet dessinable hériterait ensuite de cette classe et implémenterait
 la méthode.
\end_layout

\begin_layout Section*
Question P10.3
\end_layout

\begin_layout Standard
La reponse à la dernière question n'implique pas de changement de notre
 code car, depuis le début du projet, nous avons défini la classe 
\begin_inset Quotes eld
\end_inset

Printable
\begin_inset Quotes erd
\end_inset

 (
\begin_inset Quotes eld
\end_inset

Dessinable
\begin_inset Quotes erd
\end_inset

 ci-dessus) et tout nos objets dessinables (notamment l'accelerateur, les
 particules et les elements) heritent de cette dernière et implémentent
 la méthode virtuelle pure 
\begin_inset Quotes eld
\end_inset

print()
\begin_inset Quotes erd
\end_inset

 qui affiche l'objet.
\end_layout

\begin_layout Section*
Question P10.4
\end_layout

\begin_layout Standard
Voir réponse à question P10.3.
\end_layout

\begin_layout Section*
Question P12.1
\end_layout

\begin_layout Standard
Comme tous ces propriétés changent pendant l'evolution de la simulation,
 nous les avons implémentés en tant que méthodes.
\end_layout

\begin_layout Section*
Question P14.1
\end_layout

\begin_layout Standard
Nous avons créé une classe Color qui implémente les couleurs données en
 exemple.
 Elle est en outre dotée de quelques méthodes pratiques (voir dans doxygen).
\end_layout

\begin_layout Standard
Aucun objet héritant de la classe Printable n'hérite de cette classe, car
 nous nous sommes concentrés sur l'interface graphique de GUI dans ce projet.
\end_layout

\begin_layout Section*
Question P19.1
\end_layout

\begin_layout Standard
Voici l'ensemble de balises (ouvrantes) que nous utilisons (dans l'ordre
 d'apparition dans le fichier 
\begin_inset Quotes eld
\end_inset

accelerator.xml
\begin_inset Quotes erd
\end_inset

) :
\end_layout

\begin_layout Itemize
<System>
\end_layout

\begin_layout Itemize
<Accelerator>
\end_layout

\begin_layout Itemize
<Particle>
\end_layout

\begin_layout Itemize
<Position>
\end_layout

\begin_layout Itemize
<Mass>
\end_layout

\begin_layout Itemize
<Charge>
\end_layout

\begin_layout Itemize
<Direction>
\end_layout

\begin_layout Itemize
<Energy>
\end_layout

\begin_layout Itemize
<FODO>
\end_layout

\begin_layout Itemize
<EntryPosition>
\end_layout

\begin_layout Itemize
<ExitPosition>
\end_layout

\begin_layout Itemize
<SectionRadius>
\end_layout

\begin_layout Itemize
<StraightLenght>
\end_layout

\begin_layout Itemize
<FocalizingCoefficient>
\end_layout

\begin_layout Itemize
<Dipole>
\end_layout

\begin_layout Itemize
<Curvature>
\end_layout

\begin_layout Itemize
<MagneticField>
\end_layout

\begin_layout Itemize
<Quadrupole>
\end_layout

\begin_layout Itemize
<StraightElement>
\end_layout

\begin_layout Standard
Voici les balises pour les commentaires :
\end_layout

\begin_layout Itemize
<! - - 
\end_layout

\begin_layout Itemize
- - >
\end_layout

\begin_layout Standard
Il n'y a donc pas de balises pour les constantes, car elles font partie
 d'un namespace commun au projet.
 Par ailleurs, l'aspect graphique de projet est séparé du reste du projet,
 ce qui explique qu'il n'y ait pas de balise de type <Camera> ou <Oeil>.
\end_layout

\end_body
\end_document