summaryrefslogtreecommitdiff
path: root/conception.lyx
blob: e240e75a725f5a3bc74b50206063ea96d3290f56 (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
#LyX 1.6.7 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass article
\use_default_options true
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100

\graphics default
\paperfontsize default
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\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 "" 
\end_header

\begin_body

\begin_layout Title
Virtual Hadron Collider
\begin_inset Newline newline
\end_inset

Conception
\end_layout

\begin_layout Author
Jakob Odersky 
\begin_inset ERT
status open

\begin_layout Plain Layout


\backslash
and
\end_layout

\end_inset

 Christian Vázquez
\end_layout

\begin_layout Part*
Introduction
\end_layout

\begin_layout Standard
Lors du projet nous avons suivi en général les indications données.
 Quelques fois, nous avons tout de même suivi nos propres idées qui n'étaient
 pas compatibles avec les propositions officielles.
 Dans ce texte sont décris en bref nos propres idées et leur implication
 sur la conception du projet.
 Pour une documentation plus complète est détaillée, il est conseillé de
 voir les commentaires du code ou la documentation générée par les commentaires
 du code.
\end_layout

\begin_layout Part*
Structure
\end_layout

\begin_layout Standard
Le dosier du projet, nommé `vhc' (pour `Virtual Hadron Collider'), est structuré
 de la manière suivante:
\end_layout

\begin_layout Standard
\begin_inset listings
lstparams "basicstyle={\ttfamily}"
inline false
status open

\begin_layout Plain Layout

vhc
\end_layout

\begin_layout Plain Layout

|-- bin
\end_layout

\begin_layout Plain Layout

|   |-- gui
\end_layout

\begin_layout Plain Layout

|   |-- main
\end_layout

\begin_layout Plain Layout

|   `-- test
\end_layout

\begin_layout Plain Layout

|-- doc
\end_layout

\begin_layout Plain Layout

|-- Doxyfile
\end_layout

\begin_layout Plain Layout

|-- JOURNAL.txt
\end_layout

\begin_layout Plain Layout

|-- Makefile
\end_layout

\begin_layout Plain Layout

|-- CONCEPTION.pdf
\end_layout

\begin_layout Plain Layout

|-- REPONSES.pdf
\end_layout

\begin_layout Plain Layout

|-- README.txt
\end_layout

\begin_layout Plain Layout

`-- src
\end_layout

\begin_layout Plain Layout

    |-- gui
\end_layout

\begin_layout Plain Layout

    |-- main
\end_layout

\begin_layout Plain Layout

    `-- test
\end_layout

\end_inset


\end_layout

\begin_layout Section*
vhc
\end_layout

\begin_layout Standard
Le répertoire principale (dit `de base') du projet est est `vhc'.
 Dans celui-ci se trouvent les fichiers expliqués dans la description officielle
 du projet.
 Notamment:
\end_layout

\begin_layout Itemize
JOURNAL
\end_layout

\begin_layout Itemize
REPONSES
\end_layout

\begin_layout Itemize
README
\end_layout

\begin_layout Itemize
Makefile
\end_layout

\begin_layout Standard
Il contient de plus le fichier `Doxyfile' utilisé pour générer de la documentati
on du code source.
\end_layout

\begin_layout Section*
src
\end_layout

\begin_layout Standard
Ce répertoire contient tout le code source, donc les fichiers les plus important
s du projet! Le code source est lui-meme reparti dans les sous-répertoires
 suivantes:
\end_layout

\begin_layout Itemize
main
\begin_inset Newline newline
\end_inset

Contient le code source principale, c'est à dire tout les fichiers sources
 du simulateur.
\begin_inset Newline newline
\end_inset

Exemples: Vector3D.cc, Vector3D.h, Particle.cc, etc...
\end_layout

\begin_layout Itemize
gui
\begin_inset Newline newline
\end_inset

Contient le code relatif à l'interface graphique.
\end_layout

\begin_layout Itemize
test
\begin_inset Newline newline
\end_inset

Contient le code source des tests.
 Les fichiers tests contenant une fonction `main' devraient se terminer
 avec `Test'.
\begin_inset Newline newline
\end_inset

Exemples: Vector3DTest.cc, etc...
\end_layout

\begin_layout Section*
doc
\end_layout

\begin_layout Standard
Contient de la documentation générée automatiquement par un outil comme
 `doxygen'.
\end_layout

\begin_layout Section*
bin
\end_layout

\begin_layout Standard
Contient les fichiers binaires (i.e.
 executables, objets, librairies etc...) compilés du code source.
 La structure de ce répertoire est identique a celle de `src', c'est-à-dire
 que les tests seront compilés dans `bin/test/' et les sources principaux
 dans `bin/main/'.
\end_layout

\begin_layout Part*
Makefiles
\end_layout

\begin_layout Standard
Afin d'automatiser le processus de compilation, un Makefile est présent
 dans le répertoire de base.
 A cause de la compléxité du répertoire source, le Makefile est récursif.
 Cela signifie que ce Makefile ne fait que de déléguer les commandes à deux
 makefiles contenus dans les répertoires src/main et src/test.
 Ainsi, lorsqu'on ajoute/supprime des fichiers des répertoires précédents,
 il suffit de modifier le Makefile contenu dans le répertoire respectif.
 En général, il ne faut pas modifer le Makefile de base.
\end_layout

\begin_layout Standard
Voici les commandes make de base:
\end_layout

\begin_layout Itemize
clean - supprime les fichiers générés
\end_layout

\begin_layout Itemize
build - compile les sources principaux
\end_layout

\begin_layout Itemize
test - lance tous les tests
\end_layout

\begin_layout Itemize
gui - compile et lance l'interface graphique
\end_layout

\begin_layout Itemize
doc - genere la documentation avec doxygen
\end_layout

\begin_layout Standard
Pour plus d'informations voir les commantaires des Makefiles.
\end_layout

\begin_layout Part*
Vecteurs
\end_layout

\begin_layout Standard
En commencant par la base.
 Nous avons choisi de garder un vecteur immuable.
 Il n'a donc pas de méthodes non-const.
 Ceci parait naturel pour un vecteur et facilite le raisonement sur la vie
 d'une de ses instances.
\end_layout

\begin_layout Standard
Pour des raisons d'efficacité, nous avons tout de même implémenté un vecteur
 muable.
 Celui-ci hérite d'un vecteur et défini en plus des méthodes non-const (tel
 que +=).
\end_layout

\begin_layout Part*
Eléments
\end_layout

\begin_layout Standard
La hierarchie des éléments ressemble à celle proposée par la description
 officielle du projet:
\end_layout

\begin_layout Standard
Tout en haut il y a un élément abstrait 
\emph on
Element
\emph default
.
 De celui-ci héritent les différents éléments géométriques: un droit 
\emph on
StraightElement
\emph default
, un courbé 
\emph on
CurvedElement
\emph default
 et un élément composé 
\emph on
CompositeElement
\emph default
.
 Les éléments concrets sont donc définis en héritant d'un de ces trois éléments.
\end_layout

\begin_layout Standard
Pour considérer les champs électriques et magnétiques, nous avons simplement
 déclaré des méthodes virtuelle 
\emph on
getElectricFieldAt(const Vector3D& position) 
\emph default
et 
\emph on
getMagneticFieldAt(const Vector3D& position) 
\emph default
dans la classe de base
\emph on
 Element
\emph default
 qui renvoyent zéro pour tout position.
 Les élements concrets peuvent donc redéfinir ces méthodes.
\end_layout

\begin_layout Standard
Un autre aspect assez important est la détermination de la contenance d'un
 particule dans un élément.
 Comme nous avons décidés que nos éléments peuvent être décentrés (pas de
 centre commun avec l'accélérateur) la méthode de détermination de passage
 d'une particule, telle que proposée ne fonctionne plus.
 Nous avons donc décidé de créer un système de positionement des particules
 dans les élements.
 Une particule peut être testée si elle est après, avant ou a côté d'un
 élément.
 Ceci facilite aussi la possibilité des particules de tourner à contre-sens:
 ces particules n'ont qu'a vérifier si elles se situent avant leurs éléments
 respectifs pour passer aux suivants.
\end_layout

\begin_layout Part*
Faisceaux
\end_layout

\begin_layout Standard
En créant un faisceau, l'utilisateur n'a pas besoin de se soucier dans quelle
 élément se trouve une particule.
 Il ne doit que l'ajouter à un accélérateur et il s'occupe du reste.
\end_layout

\begin_layout Standard
Cette simplicité est possible grâce a notre conception de faisceaux.
 Chaque faisceau à une méthode 
\emph on
initializeParticles() 
\emph default
qui initialise les particules du faisceau.
 Ainsi, lorsqu'on ajoute un faisceau à l'accélerateur, celui-ci appelle
 la méthode d'initialisation des faisceaux, positionne les particules dans
 leurs éléments respectifs et supprime tous ceux qui ne sont pas contenus
 dans un élément.
\end_layout

\begin_layout Part*
Accélérateur
\end_layout

\begin_layout Standard
Un accélérateur est l'objet principale d'un simulation.
 Il contient tous les éléments et faisceaux de la simulation.
 Afin de faciliter son utilisation, nous avons décidés q'un accélérateur
 contiendrait et sera responsable pour toutes ses composantes.
 Ainsi lorsqu'un élément ou une particule est ajoutée à un accélérateur,
 celle-ci est copiée dedans.
\end_layout

\begin_layout Standard
Pour garantir la validité d'un accélérateur, celui-ci est 
\begin_inset Quotes eld
\end_inset

fermé
\begin_inset Quotes erd
\end_inset

 avant une simulation.
 Concrètement cela veut dire qu'après avoir ajouter des éléments dans un
 accélérateur, une méthode est appelée pour vérifier sa continuité.
\end_layout

\begin_layout Part*
Forces inter-particules
\end_layout

\begin_layout Standard
Pour ajouter les forces interparticules à la simulation nous avons instauré
 la notion d'
\emph on
interacteur
\emph default
.
 Un interacteur (classe abstraite 
\emph on
Interactor
\emph default
) est un objet qui gère les interactions entre particules.
 Chaque accélérateur en a un.
 Concrètement un interacteur possède une méthode 
\emph on
applyInteractions()
\emph default
 qui applique tous les forces interparticules entre les particules gérés.
 Or comme les particules d'un accélarateur varient sans cesse et sont souvant
 supprimés, il faudrait un système plus efficace pour connaître les particules
 à gérer que d'accéder directement aux particules de l'accélérateur.
 Pour ceci, nous avons introduits le design pattern (motif de programmation?)
 des publishers/listeners.
\end_layout

\begin_layout Standard
Un 
\emph on
publisher
\emph default
 est une classe qui peut publier des évènements et un 
\emph on
listener
\emph default
 peut agir à la récéption d'un évènement.
 De plus, un listener doit se souscrire à un publisher pour être informé
 de ses évènements.
 Ainsi, dans notre projet, un faisceaux est un publisher et un interacteur
 un listener.
 Ceci implique que lorsqu'une particule est ajoutée à un faisceau, l'interacteur
 est informé et peut ajouter la particule à la collection des particules
 à gérer.
\end_layout

\begin_layout Standard
Cette conception donne de nombreux avantages.
 Premièrement, il est facile de changer de type de détecteur.
 On peut par exemple remplacer un détecteur force-brute avec un détecteur
 plus sophistiqué en une ligne de code.
 Deuxièmenent, il est très facile de concevoire ses propres détecteurs.
 Il suffit de créer une classe héritant de 
\emph on
Interactor
\emph default
.
 Troisièmement, grâce au motif publisher/listener, on peut créer un interacteur
 qui choisit les particules à gérer.
 Ceci permet doc de facilement transformer un interacteur gérant tous les
 interactions particules en un interacteur ne gérant que les interactions
 particules dans un faisceau.
\end_layout

\begin_layout Part*
Interface graphique
\end_layout

\begin_layout Standard
Notre projet utilise OpenGL et Qt pour l'interface graphique.
 Pour ne pas rendre l'entièreté du projet dépendant de ces deux frameworks
 nous avons utilisé une autre méthode que celle de la 
\begin_inset Quotes eld
\end_inset

spécialisation graphique
\begin_inset Quotes erd
\end_inset

 proposée.
\end_layout

\begin_layout Standard
Nous avons créés des rendeur graphiques (
\emph on
Renderer
\emph default
).
 Ces rendeurs sont spécialisés pour dessiner des objets d'un certain type.
 Un rendeur de faisceaux, par exemple, peut dessiner des faisceaux.
 Or, pour des hiérarchies de classes nécéssitant un traitement différent
 pour chaque type concret d'instance (par exemple les éléments: un élément
 droit ne peut pas être déssiné comme un élément courbe!), cette méthode
 n'est pas très élégante et nécéssite une quantité énorme de code.
\end_layout

\begin_layout Standard
Pour contourner cela nous avons donc implémenté le motif de programmation
 des visiteurs.
 C'est 
\begin_inset Quotes eld
\end_inset

une manière de séparer un algorithme de la structure d'un objet
\begin_inset Quotes erd
\end_inset


\begin_inset Foot
status open

\begin_layout Plain Layout
(http://fr.wikipedia.org/wiki/Visiteur_%28motif_de_conception%29)
\end_layout

\end_inset

 et s'avère particulièrement utile pour des structures récursives, telles
 que les éléments composés.
 Concrètement cela signifie qu'un rendeur d'éléments est un visiteur d'éléments.
 Voir les commentaires du code pour plus de detailles.
\end_layout

\begin_layout Part*
Conclusion
\end_layout

\begin_layout Standard
En conclusion, on remarque que nos déviations du projet ne sont pas dues
 à cause d'un incompréhension où une difficulté à suivre ce qui était demandé,
 mais uniquement pour ajouter de la fonctionalité et de faciliter l'extension
 de notre projet par des tiers.
\end_layout

\end_body
\end_document