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
|
#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é.
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.
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 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 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.
\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
\emph on
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
color{red}{Réponse incohérente! La question conçernant l'énergie me perturbe...}
\end_layout
\end_inset
\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 considération de la méthode.
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 d'attribut et le facteur gamma sous forme de méthode.
Ceci pour plusieurs raisons:
\end_layout
\begin_layout Enumerate
Au cours de la simulation, la vitesse sera changée très fréquemment, beaucoup
plus que les appels à gamma.
Une implémentation de gamma sous forme de méthode améliore donc la performance.
\end_layout
\begin_layout Enumerate
Le premier argument pourrait s'appliquer également à l'énergie, or il faut
remarquer que l'énergie est une grandeur spécifiée durant la création d'une
particule et que en fait la vitesse dépend de l'énergie
\begin_inset Foot
status open
\begin_layout Plain Layout
Complément mathématique:
\begin_inset Quotes eld
\end_inset
Aux énergies atteintes dans un accélérateur, les particules sont tellement
proches de la vitesse de la lumière qu'il faudrait garder au moins 7 décimales
pour que la vitesse permette de connaître l'énergie de façon assez précise.
On caractérise donc plutôt une particule en termes d'énergie totale que
de vitesse.
\begin_inset Quotes erd
\end_inset
\end_layout
\end_inset
.
On pourrait alors penser à définir la vitesse comme méthode mais d'après
l'argument 1, ce serait complètement absurde au niveau de la performance.
\end_layout
\begin_layout Section*
Question P6.1
\end_layout
\begin_layout Standard
Pour représenter et organiser les
\family typewriter
\size small
Element
\family default
\size default
s, nous avons choisi dans ce projet de coder les
\family typewriter
\size small
Element
\family default
\size default
s
\family typewriter
\size small
[Magnetic (Straight
\family default
\size default
et
\family typewriter
\size small
Curved)
\family default
\size default
et
\family typewriter
\size small
Electric
\family default
\size default
] sous formes de classes.
Concrètement, la classe
\family typewriter
\size small
Element
\family default
\size default
est la classe grand-mère, les trois classes filles sont les classes
\family typewriter
\size small
Straight
\family default
\size default
,
\family typewriter
\size small
Curved
\family default
\size default
et
\family typewriter
\size small
Magnetic
\family default
\size default
.
Les trois classes petites-filles sont
\family typewriter
\size small
MagneticStraight
\family default
\size default
,
\family typewriter
\size small
MagneticCurved
\family default
\size default
et
\family typewriter
\size small
Electric
\family default
\size default
, où
\family typewriter
\size small
MagneticStraight
\family default
\size default
hérite à la fois de
\family typewriter
\size small
Magnetic
\family default
\size default
et de
\family typewriter
\size small
Straight
\family default
\size default
, et où
\family typewriter
\size small
MagneticCurved
\family default
\size default
hérite de
\family typewriter
\size small
Magnetic
\family default
\size default
et de
\family typewriter
\size small
Curved
\family default
\size default
.
\family typewriter
\size small
Electric
\family default
\size default
n'hérite 'que' de
\family typewriter
\size small
Straight
\family default
\size default
.
\end_layout
\begin_layout Section*
Question P6.2
\end_layout
\begin_layout Standard
Les champs magnétiques et électriques sont représentés à l'aide d'un
\family typewriter
\size small
Vector3D
\family default
\size default
indiquant la direction et l'intensité du champ, et nous allons nous arranger
pour que sa norme soit initialisée une fois pour toutes (pour garder l'intensit
é de champ constante).
Ainsi, à chaque nouvelle manipulation (modification d'orientation) du
\family typewriter
\size small
Vector3D
\family default
\size default
\family typewriter
\size small
field
\family default
\size default
, nous ferons appel à la méthode
\family typewriter
\size small
rotate
\family default
\size default
.
Ce faisant, puisque la rotation est une isométrie, nous pouvons définir
n'importe quelle orientation que pourrait prendre le champ, en nous assurant
d'avoir une intensité de champ constante.
\end_layout
\begin_layout Standard
En effet, en physique on représente les lignes de champ par des lignes parrallèl
es, continues, et nous disons que le champ a une certaine intensité, qui
reste la même tout le long des lignes.
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
Dans la classe
\family typewriter
\size small
Courbe
\family default
\size default
, nous avons implémenté le centre de courbure sous forme d'un
\family typewriter
\size small
Vector3D
\family default
\size default
, puisque tous les points sont naturellement représentés par des vecteurs
dans
\begin_inset Formula $\mathbb{R}^{3}$
\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 à la fois, nous avons décidé
de rajouter un pointeur à chaque particule, qui soit responsable de lui
indiquer dans quel
\family typewriter
\size small
Element
\family default
\size default
elle doit être.
Cela pour garantir un effet de traçababilité.
\end_layout
\end_body
\end_document
|