LightRays/rapport.tm
2020-03-04 23:14:44 +01:00

366 lines
62 KiB
Tcl

<TeXmacs|1.99.11>
<style|<tuple|base|french>>
<\body>
<\hide-preamble>
\;
<assign|by-text|<macro|>>
<assign|verbatim|<macro|body|<with|color|darker
grey|<with|font-family|tt|language|verbatim|<arg|body>>>>>
</hide-preamble>
<doc-data|<doc-title|Projet <verbatim|C++> : Moteur d'optique géométrique
<name|2d>>|<doc-author|<author-data|<author-name|Félix Faisant>>>>
<em|Le code nécessite la bibliothèque SFML pour l'affichage (paquet
<verbatim|libsfml-dev> sur Mint ou Debian).>
<subsection|Objectifs et méthodes>
Le but de ce projet est de simuler les lois de l'optique géométrique sur
une scène <name|2d>, et ainsi de construire un moteur d'illumination de
scènes <name|2d>. Le principe est simple :
<\itemize-arrow>
<item>Les <strong|sources> envoient des rayons lumineux, par exemple dans
toutes les directions pour une source isotrope, ou dans une seule
direction et de façon étendue pour une source de type "soleil".
<item>Les rayons sont interceptés par les <strong|objets> de la scène.
Suivant l'objet, le rayon peut être réfléchi, réfracté, diffusé, filtré,
absorbé<text-dots> L'objet ré-émet alors zéro, un ou plusieurs rayons.
<item>Des <strong|écrans> accumulent l'intensité des rayons qu'ils
interceptent sur une matrice de pixels.
<item>Le processus d'interception - ré-émission est répété jusqu'à ce que
le rayon soit totalement absorbé.
</itemize-arrow>
On peut alors se servir des pixels des écrans comme image, comme un
<name|ccd> de caméra (<name|1d> !) si on a placé une lentille devant, ou
comme la luminosité qu'aurait un mur à cet endroit (par exemple pour
illuminer une scène d'un jeu de plateforme). Plutôt qu'un long discours,
mieux vaut regarder les exemples page 2.
On peut voir ça comme une méthode de Monte-Carlo. C'est très inefficace
pour construire des images (on appelle ça alors le <em|pathtracing>) car
une toute petite fraction des rayons émis arrivent au "<name|ccd>" (comme
pour une caméra réelle)<\footnote>
Pour faire du rendu d'image réaliste performant, les rayons sont lancés
depuis l'écran et sont propagés dans le sens inverse (on appelle ça alors
le <em|raytracing>). C'est beaucoup moins simple à implémenter pour les
processus irréversibles (diffusion<text-dots>).
</footnote>. C'est par contre adapté pour faire une illumination
physiquement réaliste (on appelle ça alors l'illumination par
<em|radiosité>).
<\compact>
Les différents objets implémentés ici sont :
<\itemize-dot>
<item>Des lignes ou des arcs de cercles, dont les calculs
d'interception sont détaillés dans <verbatim|lois.pdf>.
<item>Des dioptres (lois de Snell-Descartes et coefficients de Fresnel,
détaillées dans <verbatim|lois.pdf>), des miroirs, des objets
diffusants (<hlink|diffusion lambertienne|https://fr.wikipedia.org/wiki/Loi_de_Lambert>
ou plus sophistiqué), des écrans, des filtres<text-dots>
<item>Ou bien des objets non localisés, comme du brouillard.
</itemize-dot>
</compact>
Pour implémenter les couleurs, on choisit de rester proche des lois
physiques en attribuant un <strong|spectre> discret à chaque rayon (ici 4
longueurs d'onde). De plus, il faut prendre en compte la polarisation
<math|><name|te> / <name|tm>, qui se comportent différemment pour la
réflexion/réfraction<\footnote>
Le plan d'incidence des rayons est toujours le même : le plan où vivent
les objets <name|2d>. Ainsi, les polarisations <math|><name|te> et
<name|tm> (relatives au plan d'incidence) sont toujours les mêmes, on
peut donc séparer la lumière de façon globale en composantes <name|te> et
<name|tm>, et les traiter séparément.
</footnote>. Ainsi, chaque rayon possède <em|8 composantes>. De plus, on
oublie tout phénomène de nature ondulatoire. On travaille alors directement
en <em|intensité lumineuse>, plutôt qu'en amplitude, et on les additionne
simplement. Cela simplifie largement l'implémentation.
<subsection|Structure du code>
Les fichiers <verbatim|Util.h>/<verbatim|Util.cpp> implémentent des
structures et fonctions utilitaires classiques : un vecteur <name|2d>
<verbatim|vec_t> et un point <name|2d> <verbatim|point_t> avec les
surcharges d'opérateurs usuelles, les rotations/translations/homothéties,
une structure <verbatim|angle_interv_t> qui implémente un intervalle
angulaire dans <math|\<bbb-R\>> modulo <math|2\<pi\>><text-dots> Le fichier
<verbatim|sfml_c01.hpp> contient des fonctions utilitaires pour l'affichage
avec SFML, notamment pour convertir les coordonnées
<math|<around*|[|0,1|]>\<times\><around*|[|0,1|]>> en coordonnées
fenêtre.<new-page>
<new-page>
La structure <verbatim|Rayon> est implémentée dans
<verbatim|Rayon.h>/<verbatim|Rayon.cpp>. Un rayon est défini par son point
d'origine, sa direction (angle par rapport à l'horizontale), et son spectre
de couleur/polarisation en intensité. La structure <verbatim|Specte>
contient les 8 composantes ainsi que des routines de manipulation des
composantes.
<subsubsection|Objets>
Pour décrire le contenu de la scène, on utilise un arbre de classes (voir
diagramme page 4), pensé pour être facilement extensible, éviter toute
duplication de code, et utiliser le polymorphisme au maximum.
On distingue les sources, qui ne font qu'émettre des rayons, de tous les
autres objets de la scène. Tous les types de sources dérivent de la classe
virtuelle <verbatim|Source>, et implémentent la méthode
<verbatim|genere_rayons> qui renvoie un
<verbatim|vector\<less\>Rayon\<gtr\>>. On pourra regarder la classe
<verbatim|Source_SecteurDisqueLambertien> (<verbatim|Source.h:127>), qui
implémente une source étendue lambertienne en forme de secteur.
Tous les autres objets de la scène dérivent de la classe virtuelle de base
<verbatim|Objet>, qui déclare l'interface commune utilisée lors de la
propagation (interception puis ré-émission) des rayons, et pour
l'affichage. Un objet est capable de <strong|tester l'interception d'un
rayon> avec la méthode <verbatim|essai_intercept(rayon)>, et, le cas
échéant, de <strong|ré-émettre le rayon> avec <verbatim|re_emit(rayon,
intercept)> ( <verbatim|intercept> est une structure opaque renvoyée par
<verbatim|essai_intercept>, conservant les informations de l'interception)
:
<\big-figure|<image|<tuple|<#255044462D312E350A25B5EDAEFB0A332030206F626A0A3C3C202F4C656E6774682034203020520A2020202F46696C746572202F466C6174654465636F64650A3E3E0A73747265616D0A789C957D4B8F6DBD6DE57CFF8A330EE0EAADB734CD2440033D703234326854FAFA43507790F4C07FBFB9D6A21EFB54C10DE3837D8B3C7A5014459194C4FD5FD7FD31E2C821BEBEFFF1DF7F7DFD8FFF7DBFFEFA7FAFFB85FFFEF55FECB7565E7F33F87FDAFFFEF3FACBBF1BE67EFDC7955FFFEBF55FAFC0627FC23FA1DC1FB9C6DADAEBF3F715EEF411637B85FBFE48A5BC7EBF420C1FF58EAF363E5A0FAF10AC9D915FA97CC496ACB6FD1ADA2BDF1FB1BC3E5F61E48F16CAF54AF9A396F88A217CC45A5F7D7CE462CD8EF651AC7688F1A3E4860AADA3C22B54A3181D5BC51EAD446A1FE11E9751622DF66188FBA366F4D1B3B5D1AD0DFBA1F4578F1F3D5B85BB7F5847EF03F87CFDF1C3A0FEF99F5E7FBEFE0E1BE21D3F9231367D8481F2312634DE3FC6B031191501449557ACF163F46CA88FD4319CD86D52EA78A564F87EBDE228C6BDF2CAED231B13AD4D5252CAC71D513EC54EEAAD9D9ABB71CDCAE5F0AAF9231B25A9D68F3B19583FD26D4CFD7CFD9BD10D4685629D1C531D82CDCDDFAEBF18C5F79D9B3170FE61136FD3FEF7C66A5214C5E69838E1C6DFBBBF5AF9081543AB2439978FD2ACD9DA3E7AB589AF9B1A08DA12B07FA4A760F372A7576B1F23BCBED8DCDF93CD47719B946232054A2838AA1EC08D7EA711F71FC6A27FA0D5D23903C504B61F8DE681C6F61FFF58A326DC10772B03D9FEFA711AFF4E73257F84945EBD7DB496BCB9545EE3E6D2F98238159B1093355307B37936669A21DEC1842DD952FC08C62763FB303936197604D664B7691946E25850FB883D71410BCE1FA39804B2AEF13C7D6463029B365171D0C4DF56DADDF6CF46B7FD6AC26E2A6242D6F218170B0B314C830455ED7552F5463596F142DD1FC1D6BD0980AD52282147001C21A3C198EA06D921FB23E20241C97E98D56D6CF9EE7B300231F421952404C0606BD86B3B789DACF202EA9FD573DCD43DA8FF7140BFAE68EA35A78C3E311B364647980242A35F567850951C88FA51C0B160CBA110D13EEE9C2EB45BB93250C7D6318A0C2F228477A3467A6F3F2092295B9B78C398EE2269C49C8859E78FEFE4DB886C99D6681B470AA6E9A6322D392D4CB4CD2043104CC39BC46FD874E36D23FD9C18E3351A332DC4263035A6ABC8DC28353B615469A6B1FB51C2F699D6D8424BF53A109DE2F9B9314687AD36B6D0F341E673209CC185B395DD1A07677C6B1B83568AED24210EF27EC3BB5B62303868FBB49BB0C6B914D6E08AAF8588FD069BE42A61DB93C9B8B7701D88CDC28999745813F920F339909F0767B3691B5BA991DB7408D4C22972879F9868EC49B62598C2320BC0188F7D3B028EB69A408915C8099369985B9284BF7223A66365DABFEA25697CE8754168C2E4ABF589B1F1C21C511F58030B0429AA20840D5EED676D1D9871582918A14DCA058642043F170AF283E50E22AB887A60DA9D380D366F1A87A9744770D158C709D689F514236BE4AA59A8F980C1139BD0CF0313354F686084EBE0EF73063853DF66E5D7FFC75C8449547B87A131284826D2AF3F9966B181FDF7FF41F5B97D8C2413C40C2223F8F76B048ED961DB8260FF546374AC13B2BDB3173071C2DDA6C1D8E1550B6CA13C1B76C80A67726AFE6A9B86CD3076E3B8006BD7F4F5F53911E8D610A8691237497A100CF64C8C751F20C606D3E6126CB54D342AF699E48077F43941B32C6D57BBBC5EC1CA4D8B7E41563672CB9FBF5AE3A3CDAA13126330002166AF56358C45D083DC9F06F0EBB2BDE5B66DD99A0F378724B826E3302C8001BED50336D9C5EF30BB8BE0411E19AD97CA27B3200C81812FD8DB67F97E87EF70833D64304DEB66DBFA3B6657F9E31BD1BF6899C31006AAD3DB98083375CCFE02088BDD850260BFC79619D892B1B56B17C85495ABBA836AFEF344D4D467758003468E9ABF26FCB9FBDF059C5C557F503F5D8DC78030464844C5E4570E3BC02782A408F12584CDBF21305B07D84D821DBC60F549D266818A1D5F2E59EE794A7CC0DEDE8F054002F68A3082CC6249947F734F5E135CAB76214C067A7F2DFA278B0714928317CB0F2D732F60E440391B88E18158AF3E4A20F5B621348A01A8FF22C2FA23DB436373BD91E7771CBB3F811A8ED7D7EF9D7B8781C5B8E3D45E93BB9A14E388569BD60F9D5888BB106460253FE37DF0F35E52E36D3AE64B1829A048923BDDDAD9DEB3BF1F4930B9805DB9F485BCA1DE1702A0395B006D5B2108EB14C3141B4C6717B3972F94E79A0606FE29186F54A246697B56D4DB5A3966C6E6BC579679513019B170201304D159D794099CF2596C9994298F68197457586F124F737E13B9055201D6C4DF6BDB50A012F83C11D97FEF839C6D1CB62DD86AB2E1B00887D5BE0A9891C2E2506C201416B58BB62807170DD1216B17CA8FCAC510289DD85EFB5A3BE82EF763ED8889EB67D38F8972632BF33AE13B179F14226EC9051CA146BD3FD478AE742D6B9B53A05FD55861A0C5C0E85C2608A37478714724FD0CF77C49CB214C9744EE4DBE207183FEE7217263EA3F35627DD5B845AED3D33844CED6707F485C67DC63499CA9C97AC89477B764CE1C92434F9837623F6F9913BC856EC22E75F004CD809D52676D81F443EA066CE243EC0635F1143B87B6D82D44F6DFE3D85265ADDF659C620767AA6EB9346AEE9697DCC1F90AFD903B4380952E771711D849A6DC59736D2C338AFDE574CA9D58B9040F5372C8DD04A7D8099E52D7E93F4CA9835E2F5BEA3009FA954D1938465D5237C125751B91F47329630BCC295053ECDE84CCE4CE3C9CFBCE5390106212A2DE5A950B0EDAB6CD8DC961F3C6167C9A6B921B0E227F7B51466CE28022EB9A3A69B4649C3786E86DCC89FE92FDDE34B7DCC50D862D3395377CAA90B6F206A21F9B851147727CF31548B16B12C459E0A671FAC50610AE3910595D08010A53E2C2EFB15E1BEE73439E88262BC4C0B5018BFC7A6A76C4C56026AF0255DCB7451A13C194B991DCD5C94571FC9CC4FB69D97178660BDC32B0600C7C12930617F948C527CFFC9925137BB243C9AFB7B9BF282246E15DD8C7A8CD438E30571D41FE645A00B18D139455EE884B413A494089D38021BB6B3DEC199F10477C6D84CCB82FC51546A3B28C2E03256E721EE4FE38021372388CD8153319F79B6E33D4BB2318DD28F4B8A85C2798B0483F177C1982D3346B271961B3F534A7C13C46C404D7EF41FBDCAC4DF03A9AF7DF67EF5E7BD376D0CE11A28236462CABDF7459638E13F1B5115A465F1EA1EFDF10D7F601500711F5EF88E536204C90E30F0856B98811698767F18D5ACC870DDD7CFC5229782621AF3FC9F0A47F1B72E029C29E2E43C43D5B06618227BF2638D9B96163F7B52AFB64CCB6D7641962C81DD3EFB609D435570B1AD26E0EEF9E5975D37590CD99427939733E53D93693548E999A883531D60A8F19DE10E74C2518F5FD07C49A989CA8D6BE23F64C3969E74CBD538BA928DCD9BD210C0081EC71B62C8429CC2197215719038A3B00AC7D5B892137DF1F7DF33698F5E7CF5DBB2DB6E4B641A9E3CF89389D59C34CC7F3810045D28213C10D1F104CA7B9678180BCB7F34F523CC2B63B71C8A22DEDAE1AEECD95551A75B421E4E0452C273184E39F53FCC7772E1A638BED74654C6FD8186B88DB0D3C4946498C726182208A0571B6E95819806096404A6689E7CFD16323B00B16603B98975450A596ECFD78BCC310D7EC79CBC1D7AAF20E276E625F3C69A45796D0E182AFB386A9CCBBFE80D864781BEF08117E9D1893181C3296288EF95E5A9222516BB305C776148B0C4E81924323F439035CAEEF938279AA74E5768400366F3B230440F41D21D820230402CF08811798468A8177D9D6A4F5DD4B3CA4D108A84B5CCD492AEEE17984C0C1BDA34E84470826FD93098D2ED61121C0EE7F8471ACA1907784C040AFEE1182A29D654708303F3800F50801CFE80E49F4FE5684C0105E5FBF579E51CF0881A87D4608C0917A460850B86FA30F0C4C3B4230F9B92204B3CD1D2140A7794708AC03B86BABBD477F3F9260725171D2BD43AF01E1BCED331884331C681C4C0262777D85143F8968B99E5AA3BA97B216485D6E8BAF07B827F5070458D9EAAE727DC31CBAB12652F21DB1AB44539BD911D78181047B91E42A9C8A0923973B05BAC098BCA8FC245C700E70D04D0CBDBF489BBB9A7A4C6F88984F6D6108F7C1224EBCD0C411557BCC0527EC6D76305F9D7BB5FBC798B04E43DF11A1369A959D6A7D425AC39F138653074300756F0F8440E4BC6D07517CD08E5FBFDB8A975B82038876D36486F435E9EE767BEBF0EBBE08DF95C3A7996ED54BDA1A62F6B6340489BBF6EF26DD830644E4650081C7581CD1B5C3A2F6BD3D7FB57E1D6AD4BA77278405407E484B4188F6657FF367B2591EDD85EA1E9EE662436B6173FD312B9ABAB789B2B96BF154B936774D81A2AD838150B8860CDF2075B0C053077B81A9835B99F63339D8B234CAE23008E863EBE01618CD9B3AD8C1AD8327C275F0A47F72304F153B75B061A661CD0238A2AA9BC56556771D6C08458F5C055BF501B974156C20A27653C5CEEE960A6E69069FF8739CFB0535B0687D6A60F0A394430383DEB6FC70B24FF19A781FDC5C1A78B6B935705BC1390A4543283FEEF61EFDFD4802A4629CA75DA0CAB6AEB8D749EB3CDC74BBCD2046DE97DD064430AF772B99D6181CFF86C0150E9BCD2FD6499188EAE370041DEECB31B570EEA8488CA6D3463110C1E8BDB83AAE9D2CA325749C356A26B32D7987F7A1D7444CF318579ACADE769E2CF97C5D7F904DC54324896CEA370F85A7C16DA0C7C719FC72F0E891886B1E97B1FA7D88CF10855BBA3A6F59ADDFBB7828B3D619A6D6B4153A0B61AD2B06D456C09E436CDB37780E4572F1363A938B5EA96DB7656D882C9DE3F3DAEB727DB081F5C228D4A4B83324741D43EAF959C0D697822A30AF37E4F6B523E67E77A9BF76DABABD1E61B1AF5DE51B6259D83D2192746D135B88B34AE4B5B7EF88DDAB57D986BE639CF603E116B69141CE4DE92CBC297848AFA9D1B04FF83A6383D3BE7ECE0367EB7D6A305B83616AECFD462566CB113A0E0588182738018A46502C38D33BC6C59E1BCE9A31A660997FB142CE641D234EBDBB25C08DC1A17B1A2782A1FB108E55558D07AB4F6D234C11E5AB7AEFB01FC5522B318F444759B423426B5C7C1F9C58F0365E63C1A83C5DDF2C70843713469967F3EC6464ADB83A0761888E4B2A4EE7171B80B25BE33003570B80C37470736122C4A46B569F2C54FBCEE1CF4580CFC197080C63CF918F873378BDDEC6472EBC0FF9D7158D085D624DAECFA315E24D10C7E0BE66C3BD98101959D8F0EDFBAE632E1D4CE2F6D96CE2EE94D0D589C3A832786776971854C86801D18105A3132AC48D89DE87B69D4DE67320BC04B270D1F7AF38A4E52606D7E0F0371492FE3EFA233515719B55CD103065F680869B3618F2E0906789CAFB8DDEC484AF07DBBCC8EABF52856FDA9ED4FF3CA25F57BA6D57E70965A6A4FE7E0173F3185C9874C383EF3A12335149BCD797752CC9F900A6F01825B987020C0C4296B11D026DC6A2535398C7ECB5A605A30D73FCBDD7004D070442C86802DBC409CBEEDC98481D0F3813D62E0422421C922C9D52394A92E394669E463C3143B313D21A8C31E03A519911401DC627C24D67F3236E28D1F9FADC884CD22F56C71DAFC5E2E72460B2BE4F0C26ABE9461D08E99AAC89E954CFE94668B0ACA50118074C7BF1A49B0775D75164F0246D3731E1E1B6E08981F6F026FCA242BC8E5E865FF4D874087352AE269E23D188DF47672386A89253B7FB110907CED430B73B12C4542D3FE8C213862BE1F0B566EBF32812698F038E29AFF59F02E34E873E20215B43D89831D75DCA000EC586E7125D18B0CFE4678D65321EA28E20F1313998EC948F22858616EF68D86001CF26E4570093A36EA9D8482EF223AF7E4323C80B839CB531BB5D30DA48AB0D9588882E6AE1C0C1789F05CE1685B91DCA84C4B39430646A1093E37D32394CC152BBD7427D1135357564234917FE56A3CF6E7F260582337819DA352AA8EBF4B026067098974BA05F42E3F3078ED9D9D2E0D2890D3AA06721DE09EAF426D0488AC77479A76B3E711579ACE5685283537795E0C29FE0D019FD84A724F378F85033B8DB9DA4E162E5013187D589299C3AB8AF2A01BDBBC03835E081C95E82674A641EF9A05B8B13D6207009649588B894AC0B33B9106CAE8619E8F161044D080FA4592668F5800EF205AEC55A6F83E74DE77A0367AFA3446300914DBEC1BE1D2C4C70C9E97AA5126E9E04A18F18741DA9361FD72C90352C38B4BC3EE5CC277C0F3FBB778C9B2A812DF246FC12A987CC4934DFC4D02413A7AB2D9FA26998A94FD90E6E6387B84533E2E4209EA21931150FC94499D4B6641ACC7740533457AF5B36E1229FA2595709C9665D74BA703A6249A74E919674C6E23B8BC4935532AF752CF10455BE5142F816B8C4F3C0641CB8B2857C0A5FE6B9D0299E45D7DB5789A2174F4B3E2B42AED7D2D43E92104FF9ACDAAE967C165DA99FD2871B1263C1D7A43494A3089E2E6DF9DCA08BE744B874E25E450C978B277BE0A5F42D9D7E5B7C4A6761F4794BA7C32E9DD7E703955422DDE390AAA7DC513CBFC9A2C96732BFBCE4256D269F1313FCD6D74644990C38FEAE072B865E6B1DCB39A2B147895B201C5FBCDACA6E2E4E6E753AD34B0EBE5827388A26049A2CDB9A052C9B72EE0C29DDBCB9B04AA47BD2E5DBBE101C982E9B9C185D2E0126F67262F0C6ACA689B988C0455C6EFD368C05DF33B8B831BAF8CAE11D9600AEAF87F4B004D06DDC5E1060CD8A82306039C2D99C39DA988698152A2ED00041FEDCDD078BD72AD2103A464FB85E9FA52374EA8A32889A2C99D144BB090DC3FD4D3824448A16B319DEDEE054B5BA30E4D89009821B28272C87C9315A0EB94B425C378385187E0AF5B4AED64CDD7E0D656164635E8E6A519B7E740988EDA0EB49F9CFA3C19228BE0F17BFDD008CF68EE2CC2D7AEC441B271E70D60D07475CC46802670B59D6E1EA23AFE929BC08BA4B54DF55B36E499C08EF642236156A6153798E83E3451DDF8A758320E1A6C7D8ABF3EBC0440F1FA4547CC38EF3CECF42B9B7E5D572F911B3BCAD8453ADB831D781DAD59CC685F9896ECC53D70392BBFD78492565DDD53AE63157292267102E06F865513270C193C3421CD3381BF0395A3DAC59C45D8A561F2546382671C3DE83C39382597D52F81C02A710557238A730EB3DED31850BB3A6302BA27A4EE1446DCEA35AEA3F62D614E62E0D794CE142ED6A4EE33985DFE8C6140D1915DE988DA5DC7A69B53B9C1838583C4D0146A688C24C09B70E18549A464109733B76ABA1446F631688BEC347050F16EC4AFE73A30E42D2F6AE9F18902695BA30B435AE54DC989B5B21EE651C76C42769E553BB5522C83CC4EE5835FAE2B7A5752E0254198FD9762E2ECC1F3F70D6B88D9B03F758BE3FB8DDF54E8B2F1A35A4AEC7509839483C62F2873B89B8F33DBD2459A7B82FF028B16C12FF53517742903EC665D98F825C27AA1E02F2E5559E50F6787B622C554126EBEB3A31BB46D18BB21F30BBD7594B98B321A7FDC47486DD018B6FBE5FE3FA417CF88285A75947E005B1620F6CD2387E9B0C2EED6F136493865396F48889F074FE111301261D319103A6792AF811135945DC384228F93E0C5CBCA9BFE329A83CEE59185BF675FAAB1E1359F0DAB52766C644E658264F10CF0ECF98088E4FCE9056D58B86151331BA67131E13A9BE5D1D31919A56BFB0036A72BFDC4554DD9E325CC36A4325FC06E88A89BCCD02670B2C0A8F9808884F87098A8B17FD88892C26AF9888DA7DC4446A589B2DAD18D0168E98C85BB73F9302C1191F47900BD4F58FD30BAF8DE73654559C1CDC61DE31E64F62F2A8D7B97E2ADDAB1F316B4555DDCEFB8671ADC11B2AABDA0F98A55E6B1745EF986743FED0F83B06C2BE30CE51EAB4DA9743C87336B0CA431E3AFF20A23DF4D5C204BF02030CDF782F0C592E966EEE8CE54A6A8D8CA9BB35078F39D254BE4D9BCD64D3ADFCE9FFDB54368FA83B06B08714B0474CD097FFA723A46C6FF89FA89F7D878460CE1E1C468D2C8F6395C87E2E80C7C5176105AC238D7CD428EA34FA251916714791DE84C1B11F2A469D3E1CC749F82CA19BB6ECC486BBE13D30C730688D0842F3B387A93F16EF96860119A7AFD5B2F3D2350CC7711D6E024AB89DA42B3340C8D97247031738EA311B8FF9D2CB8EEF9388896D0F4D6E13DB67E86CE9F6EEA95DA66E3F60EA76C10FDDBE8AB86E6F6399F8626B77B5B4F9DE7C3798BABD55853EA76E5FF0D2ED133375FB1CCB622B7CBCFED0EDB889308E5DD3E844D28AC5795C64F0265CB7F77B06D4A66A6F63754BCE0F0538A7E256AFA76A6F7DC5E458A0616B3834FBDB1C68AEBAEBE9A5D9718B21EE700359EA0A829A7DB1786976B5FBD0EC6D473125365D292F56A3CF6E7F26C5C4A6E7C7B12BC426F1D5E79A618393C330227BF2038E6543F6384F4996AAEA51A70FDF31C891C1EB356CA809A3FB358EB9CEB0424FBC384C4BA7A9F787B1D4F556FD100C5CE868CB7C32F1E37D0CDFD3ADD105AF33D78D710BBEEB087E73803C3A95CB1F645C9C21A224C615BE655D8E412FEB0082A1C105EF8E899100496AF33ECE8584193C697711EC89A7EFBB4472BE0E5D2EDD6C1D7EE76661E05948E7F47D34A201A78F560EC239B4ED03FD3C5E139EE107BCDB091861F9813EF1B85631DD376C98E3567C6E0E60304AF6F002FA7816C12D0A8F2DC1153840770726666EC2DE6D7C18E7239C91C3AFA3D6778C3C03D8EFBD23C0365D8313B16B35DED8FC0913E7ADA05D6DD13331DB335818F70CFA7066BAB08355777BA84170F3308287C2A9D32F789B1FCEE3B739C33C661D0184E03734362629148E6C6259B1081EE58FEAC1F5E2577312F26B29585E7537876D0C719391B891A635C2CD6782F3EEF0444099F2D865D6BF753DCE7B78E9553CB79A498561E624E77DAA3DCA1C87A40B81DAF7A18A25EFC3FF7565DC5518F9C02D8CB794EF7BDD365157C3D76A5B031AF07FAF45F1971A49618D0970F7F502B5B8E045DEC6906DD76E62B175C8CB16DF3F37213E375F22B58E357B3E946B4DEFFB68C195EF1CF875D5B97323DA8E007F2D7EE427042E09B92177EB519B4044D3D1AA23781FE2EEAB368EFC0393ABCD2352E553C1C56BBF5FC0DFDDD4A026690E2AF0CB4C43F377F4DE59B9D74DDA93748CB06EBB04295F6C346D39A14054BD66E0E145DAD0ECCD612A25BC7EF1CA1087788E85B9766AF1033FFD5A98D8CDEB2E507CBA545C18755D3E3CC044B29E64FF38925F57DB212724DAF9FD9A084FA2F50584A47E216EDE77A31E2B51083F6962C6205699F1A4D20FD83B618DE2DBF33744BC796796CEC0443C60D5F8E33BE9369ABA42877D60F33910C83364D6D0ED7A1092427BE91024647F739D171023684AAAB26A6FB03394BA10F09FCAAE6EFB9209D86C9DD0A5E6D5BBFF5E57E493B59FB463BEBE0DE7D7D53D16B1965657C68289E87105D291F4ABC7759ECF94670667FF99E9E1BE5E3DF09D8B639E885483103318F04440487B5A55AE6F9863FA7AF2CB113F20BC4AFC7057DCE06B23E084CC02C3DD6183ADBE445F54C1EC70FF0320934E22EBC475902D0C03AE4970EF4F786CDE08317D961B89E390C7F250156F538109FB363B3661CD2F02DE5CC3BF91632985B8105F44F865422CB003444A36072FF20162B17E8FCC93D6875F1974A23A93AF6CA2BAAE71AEDFAB9B92D07E66E7083E74EF4440F542809C7C5F23B81A7B2C983E7C83983F0F26A9E209A08DCD489D952B95611FEB6262A0668025E57679C7638CDEFD665147D2B7DD1D008E65C633F96B53601546647C3D192D0FB877B9054BE1F5792D5308306F9ABCF7C1CBDB97A0B7794DCC17317E7C8B3C5CA0E8DE3AF7ADBF1F49F875C1B46AC9B7FBFAED1069348F654D8909B85478974364889967F7DC2136CCA49082B5E935E5149A252436CCF6D4B7DE8031D0F32137A0222DC4053878A80E72B3C0293713E1723307E1823194AD6369D64F6018CAF202A0276FC90138EB4B7480993709243BC0B8D146E94193CBA833BE1E7D4A7C704DB66DE11ACD8F2B283E22F85A4CFE54FEABE047389ABB3156981108A5CC0A4B7E3653A7009DAD4A80469BB734203F48FB35B674BC75F8230D485055FC0ADB5433C0240FF2DD1C53D917D6681B673EE7DD0D33B156F64D5BB467263CDA4D2029503F24029819039825E6C146D3AD25342544D2B37BDC31F5B329E95460A67FF886995B833754CFDD7F61A0FCF5EC063982E7E5BF216A7C61D3BC4A7EC3D0111A71F0C89E8AE4457EBC4F3830BFE9E7C66CAB04A85E9E9439E6A0AC2C2523CACA5601EC182F85FA93B6BAA2252A52F94268D336E14D9B634EDA2ADDF383342170F98499471742591B013EA79C72753DB6B4EFC2F68B76B94C82E28950E998F4BA30346AAADF1C48E301D7A8A465C3CF3BE032A7A3854C05B2FB10AC3C64D1733EDDEE2F64BFF59CD2F580BD8F0333FC704A2D6C2ACF71281DCEBD0C8BA184DAD049E5340C4E4C526225787BA56FCCB551CB6465353F68FA8EF139831895F83A57C381F26A93C6C31AFE4E37F247359D20B8018B0452F5C38FB67C28C8C6EC46742294E7F5511A3215D7EBAE4389F25EC0A348D9A72A7E3564C22525AF318F6BCC12BB66AFA11C362530F3DADDA46C577BC764ED225F2F79252E13A13D30BB5A52F2D51F318BA25D6D52E4181FC889C12D10DDA4197B8F63A6329E5D2DFB88FCF4237115A9EB889C2987DF264802F83E694A04A630552075CA04361F40C00B63A2A7249AA831908CCBD3ADA53C335CE5D294B7ACE9555D187EC5297317071C3C031CCD8A0507B7AA17069BE6A0573DB6CF94E3EC85BA65A4E1FD921233779CB3D1AFCD21FE74C739162D99DC5EEFA39D59AA9E1C409AAABA2D78716562BC21E40D72F79A1DC5ECCE789BE3C11D46ED5DA257C986FC269D06D43E5C9CA9CC1DDC1C9908B2EC5AD5274BD5C162FAE726C267C6D31B957ECC1D47711D93FB1CA8321ABD0F1E62C21B9D25982695E1A8E45F78D0C0A1059C39966A6693249CB99F0B5EE63A8817C5B865C5A8AE92C3E0A22AA855D348E74C73CC53C316664F09DC02D10FAC691CF8B117940447F41CB67AF22C25F4AC7A591CE763BAC294DF7CD142924656E62D1EF9016643A20F71509E2BB06493411395910AC12CA4C1529EBCA2C76791B62F4666E3BD483DF3DE419FD4457E66A7806E42B5461F69C980F96C1BEFF101E8CD7F50AA36DC299630203459024169E5E78C20798E69FC802AC8EC8BDC394A6D85E4CB043044A45F08CC631ED41779939593031166085A56EE3F24FFAFCCD99ECA4175513ED82C66F12636068853C7A2E79C78B9D7C98DCADC52E0067AD57B4D9C48E22DBED2024054494365E8D9C5E08B85916CAECE1C087AA3EE535D95670C099D9426644E362A23EC38280898C0E0AF482BE85756255E2645657DBE019B1BEEC45426800FC1854FB9B5985F0DBA9642A364DBB83003CF25E499202DC05E2C33355B2CCA7CC3096D9EF780D74AF1E3E0E08B72866D46310B011B461E79175D3E6916BF713F92DAB66B3ECC44AE7A25AE69470C43CF6C1B8F840B9EEEEA5DB99E1FDB8A8707D13425F80E4607C4E465D658AE9A056632C0491B998E336F349D39042653C3037E65151161B6EC20EA554F536DF1148A45BB09E5E6795F28BF26C5108432CB82AD812FCCD84C74618CEC85F9B14C05915ABC5E7B1371E54AC1990A2EAA0DBA2B48C6365800C96DC8C6E4996B948318E356BA1EAD72781A145C84B69D0F188BB8126F974DCE6C5212BACA64AAD6053F38C13F4BEDCEBDAA459BF439000E335149E2C7C205AEFE9DB7264249694A949926F3C201970A55430B8D13116FFE58E73431032CAEC0C79727612D5929F00AD38251ABF8DAE023612880C22F1EF0B3237ABD1894E1109A602E24360C35C1B5E1D2D0727E3D587DFDC07C2449E07B2D6492508E84CE935B5C28E3F219CA930D4BB1F233138292BEFDC054BF3696A44F4228F33116153E99A047C8E8B010EAE48E7CE1E8DFD4C05760AABE75409D54701C84F73B495A36A96C95EE6BBDF1C7D2E7961275E050B4A77F02F69458554B2B6A9DF98713E89252C44920D37A476EEDD1F31AEB230B9B40DCD57F5D788B5309557EDE42AFA583873BC88841585F9060728D40AB63D0DD13F08997D3CA8DC0E306B297B90F0C6CAC09E3483FC2C6419684E8E663545298A2942FA0086642D163FEA8386299BE36E96537D8AF39155203851FACA0C04FDEC2E2C1D2C8FA29711595D40EA84E0A8AD618BFE2A0BB7590B4989D5D6C48968D9BA04C5146FA9842467B59D429185799DBB96F52882F4F4C25EF9FD288349DA0B807BEB2E0F9909BA9C9B8720CCAB88D894740B85B0ADB25266D4B385DE6C77E6EE67D7146E9740949AC30627C40202ABB6A06E44965E0EBDAF2816936920B17A0AAB46914C43A53B04826224C48AE9BC81FE1B461DDE0A9001E04252E94A66F9BD4F95D217E41A330B0890D1A550BDF9151F893139CA65EB9341CAA0EAC773CE552C3FC064AF4ACD385BA37425DCB9C7A3DB9CB3420F82489D6950E5090B6541B6964C3555641C7D24E5232650A06F658D98A91247125E1316904FDB748D27759F07EEAE6AF582B91D18F69B8E12DD5200977777E07998714CEAA5587BB7CF1155D9F36D32B55ED32316E97BA29736E68BE46659D667A832282358FD816FD551220DB09908F36B01DE7779255D77570030EAB706E6491927CCF2F5B28E79E8B6592A1096B22BD9EECBDF4E18727C74DE8BBB2B3C21AC2FB28646B4DCC9303A3C314980C09A40ACE0283123795920467255A0C484FC297434C249107F216286BE44D9B186FFA997AFB6657788632D870BBF1B65DDF23B8699BE1B1171FB200B6BD0CB94D036B16DCBBBA677ADCA293644F238A579BE1E5EF88909C31F2E936AFFD81403A0E49F73C303E3E2755B259D0520925AE4C99D349399B917508829FF4E8134B15770B788701AB3AE96533FB8178273DDAD6B70B2A2DD72F0D810BBBEBE68742B5B8FE3C1AA14A88CF876E65DC5D6DDF3228A141C80CDC29542E5B0E9086DC701726DD4AC06683E0C37DDEB702C477F81FB767101B9A8FA144FE2330AD043C4740A67231578DE333835165B1CEC1B71B692E6427E10A18E7D985020E0C56511733F43C2CEA6132D8580050A30FEEE72C8A4497A5ABA52E1F103502C589C66477730C1D656DFF5D0ECEBBF8228F2B735FE21F8F0D26BD037504FED56789B20C8C03C6B75D3E27469F50298829CD1614299C1DB8AD1092BFAD9C3F2B35E7AE5CF5C989B3835D4424CC163689C710945EB7EAB163D2A7B27EB3B2BEB623CCD78181954F446170ED095FCA1D1CBD4619DFE13848E917BFAAC7CC08DF31ACA3F4BA93346FE5276A312F7C88BD9AFACD0CB13C343D1A770CBECBE3631A7C8BAD8F0101625E4734CC9071F627CE699D12E4DB3FFFB74B4025B105C432168C0733F5F22A446D3A98DEB6FC84493AC1383149D1402002052069E2F3AD7B230E7F2A256E6BBB44F2DBA12929B89398DC585F3A1A720092525F9EB3EC7C5C983F7EE0ADB2E4F2B492AB7C789A5CA654A17E51125ABFEB87A94B4A241B7C2A2988397B443ECDAF9001C5F3DFA3084F1BD028C676C0DACE36268AE3DE2F1B21CA313CA4D8E35CD5BE63709B52670E48219CB592A2628A0BB3AB459D0AFF8039289AD5364569714B17004E0C437339E9B498BA3293BEC607308E5022DEE01F9252117D798F1305917B9BA44F4FCCFB9C384CA67F058C79AB15B7190CFE3AE24B089CE525790107C8691A1E1CC603D79B2182552232F69E87EBC129BE7E36B8C5771141CCC52CC4FAE65B54407AC1C1AD9E8DB9C97BE6351EF5E007CF449F2CF3E42BABC858559CCC2E89F563993C74AC8A2EE664EA710377CAC44EE0716F91EDABC6146AE4A28F478986E7F1927B04DFDFF9AF79DA0CC23532CDC95DC6C290F42039ABB11D2C9E5F84F376AF85FA12AAE8835E35C7958B7A37FAECF66752902438E969B0CFDF6F2523AE7B46039F086A0709E007BC546D1FEE64C2D5EBAE6E7DE914262EFF01B1D64D9125F413E65E6785B3D63DCF9D1CB1152EA22C23FC8499952E519CC3A39D8909F39001A36C12734C2D988000889307B8E6A973BB4272C9F9B247B031A16BD87AFFF04044469F0ED664EF2AD163402B3C4358FC7FCE908225EFB3F68B997E97566E0CAC97F9D1B7DB67AEEA4E37C49561AC0907DD02748446C91B1AAB85A463334419475EB092223369CE5182A97B120FEC2FA63C9E1FE1738D427FD81B51426DA95D6E0CA5AD6FF09599E1D846751D0A66913D8B14FF3460E48DB50DAF614D04C20DFC52E7A15B26DBB66A0109291C25F4A12BAA166CE58BFE7B5E1361912ACD00EFF14B7CE892395E15A13F988FB978CED6CCD5FC9C4124FF95697EA87424A76BA74AAFFA64D354E90708C60A7CA8F455422A1D69460F6142E6655E36DD1C5F444C950EB7A21D2A7DC14BA52F8CABF4EA4F5A2653EBBC8DB7F95EF5D1E75D24AE2A4E664EA74A6712E9A74A47D6EAB8553A52A69643A5D7B06AB84A87EB781F2A9D2EEAA9D2DFF8AF3CBF9B41AED241BA5B5BD4BE20FD3E54FA62F152E96AF7A1D2AB67039A2A9DDFE33D54FA5BB73F93029129BA14BF557AD5B9CB9EE1CC8F5E2F8BB2663D15D806255F93C6874EC71BCD147FC2E02B94D2A295874140B8E9E8084DDAE5182A5AFF6826601ECDAE592FF4D54EB9A88C19EE120C775F73E227E294BE857173BE569DF72E063C58E49F1842CF731275610977955D15D34BA83A79997BDF86CF8E4373DA34F3CAD0BA05ACCC2D6D4AA0DED0ADDFB39E4DC8FABE4E0EFA75918988FE61DE5D650E36EB91CAA29AE3DAEED0CF8345C4FD9605B47D8176CB355CAE007366FB960C57605EB39EE423FFB72C953DC0E146D11CE1588E2035FE01BB2BB030DBF09E57AFF766DBF4D8FF90C6F1F0264F0C3D01BC80418A6E0E68390213B12B35FFD2EE77CCECFB5AB5163513B1BC808DA01360A4F052C8926104D1CB43FDD980D2B111019E9FD6A513F0363B8A4EBFCF983E4143839D413F7DF824C892750C5DD02E987B133C5B98DF8821CAA4CB3C93BF54A5C991BDFDF3C191272568441F0B8E6E80CF6EE332D1FDEABB30977B4642D0A85AF08CCD6F4CD60DB3AC93767E9A8BAE0382ED645BE67DC04FF6BB3E631CF4291BDE6E4468353EC039B68DE95C61FCF88D3E68C5504074EED4152CC033A7F82821AE1767053F99701131BD26CF5D86D87008EE1606FF9832EDF3C883F1C01C5C4DBD5240EAD4489BC375450A66157E617DC165B95E138397BBE245E49B1D84BEE925F81B07F037CDB1F14613C2CB4525787914F1FB7E8049B7273F1FA83454E35DBA4EF993E7F12E937256A919210D1E7968DA96D0F2F27268A7FB67C9F9059EBB1D7D55BF93B33A038A49B48E227CD51CDDC03CE019799898B2FDFCE68D94E5E7EB5B03FCAE99870766B5EF98B6230FC587D456E46162EA11B0604E9A1F30E58C85A85A396221935B33F2B031C13FFF43CF622D517C019CAB7AAFD1E624CF224D7B098EAE1879784E9226F37DE2E07C0465D77459FDCDAFE4F02EEC94DEA2ECEC945E1AC0FEC2602FCC8237CD7E396932C25F7FFD80D97C18BC2EFA1D91961FB92AA5E9002E4C5C7EA3BF10FB01B31B02D1399F0D2D4C5E9EA43E54CB8175F1A1E7451F5A557E17477C0A35F2398403331D477D31E88951DED4CD9CE2A95681F1BE782B76CDC17396E474BCCF9C8202BC71EA2D2B28C03723475F1393D6C037E6960BCD279453B4706ACE6B4E4BF87861A11E254C657709566F72ECE8A7F03C4ACA8737A7D26396742FE827CCA6B5C89216E67AA0925E83D14974EA79AB9017AD8EC554F2AA10FCF346B8E0D3AEA3C8649BF4D709F7B41CF72767C1EDB1959A3BEE3AD19818C0214867C9719F709E1E2E11122A39EEB385EA6EB9BFBE75580EDADCD3BC806CF9E27E7BD5B1FEB1A7E1E82C7B1BDD1D16A6C2C096D6D4864CFB296EC39FF82E79DB94D7E5DEF39509CF5BC701AF914D449ABE7BF74EA7D04CEE6DB1F217D7B30446E230FD778DC3E74D37602B3FFD42FEBAFB3E5CC7B989C48F49C563461E73E60EC4B789D4C796F8CE77EF72B0DFD3961219F0BE23719363DE9E6307AB4CB1F9D8E4F019A3501E4518999C9BDC014F9B7A62F696826EC3437302331E2B6755FB8ED99B1C3DF37C6E720BB3AB4D1BF43BE6A06856DB14C5C5AC69586F8C2CEBB8EC52CD76F2A7DB5B206A76926711BF213D37B9B7399A9F617ACEDBAFEB7EE1BF7FFD97D75F5E383DE6FFFDBB61FEE3FAAF57E06F7FC23FFC3E5C354698C0FFA6878E27CF5D89B37F53D67021A3F9BEC003CFA8235EC5E4703F409768145C4554F4A231C8FD1869D392E794F6238AA4ABA33808D2A7613CB1284E0E759A3A3CC09C1B53F1F341106E82EA5E74F4EF0244E634F3C370AE51243908BC89F9F9FAB7D79F9D07FFFDD7D76206F73F0CE86FD75F8C1B1F8B1F388547AC73FDF10377F07AD2C6C90FAF54BD13C5B1726BBCA9F1F5E2275A9A7EE74B3C7D7D131F72293AD47A6FE19FFFC9A8FCF3F5FF0045283AB20A656E6473747265616D0A656E646F626A0A342030206F626A0A20202031313832310A656E646F626A0A322030206F626A0A3C3C0A2020202F457874475374617465203C3C0A2020202020202F6130203C3C202F43412031202F63612031203E3E0A2020203E3E0A3E3E0A656E646F626A0A352030206F626A0A3C3C202F54797065202F506167650A2020202F506172656E742031203020520A2020202F4D65646961426F78205B20302030203430342E373139303235203135302E343632363737205D0A2020202F436F6E74656E74732033203020520A2020202F47726F7570203C3C0A2020202020202F54797065202F47726F75700A2020202020202F53202F5472616E73706172656E63790A2020202020202F4920747275650A2020202020202F4353202F4465766963655247420A2020203E3E0A2020202F5265736F75726365732032203020520A3E3E0A656E646F626A0A312030206F626A0A3C3C202F54797065202F50616765730A2020202F4B696473205B203520302052205D0A2020202F436F756E7420310A3E3E0A656E646F626A0A362030206F626A0A3C3C202F43726561746F722028636169726F20312E31342E322028687474703A2F2F636169726F67726170686963732E6F726729290A2020202F50726F64756365722028636169726F20312E31342E322028687474703A2F2F636169726F67726170686963732E6F726729290A3E3E0A656E646F626A0A372030206F626A0A3C3C202F54797065202F436174616C6F670A2020202F50616765732031203020520A3E3E0A656E646F626A0A787265660A3020380A303030303030303030302036353533352066200A30303030303132323337203030303030206E200A30303030303131393337203030303030206E200A30303030303030303135203030303030206E200A30303030303131393133203030303030206E200A30303030303132303039203030303030206E200A30303030303132333032203030303030206E200A30303030303132343239203030303030206E200A747261696C65720A3C3C202F53697A6520380A2020202F526F6F742037203020520A2020202F496E666F2036203020520A3E3E0A7374617274787265660A31323438310A2525454F460A>|pdf>|0.65par|||>>
Scénario typique (celui de <verbatim|Scene::interception_re_emission>)
d'utilisation des objets.
</big-figure>
Cela semble compliqué, mais l'interception et la ré-émission sont séparés
pour des raisons de performance : les calculs de ré-émission peuvent être
lourds (e.g.<nbsp>lois de Fresnel) et ne sont pas nécessaires à chaque
interception (par exemple si le rayon a été intercepté plus en amont par un
autre objet). <verbatim|essai_intercept> renvoie aussi la distance entre le
point d'émission du rayon et l'interception, qui sert à déterminer quel est
l'objet le plus proche sur la trajectoire du rayon (voir plus loin pour
l'utilisation de ces méthodes).
D'un côté, on définit alors des classes (virtuelles) qui s'occupent
uniquement de la <strong|géométrie> et de l'interception des rayons.
<verbatim|ObjetCourbe> décrit une courbe/interface bien définie, et la
structure opaque renvoyée par <verbatim|essai_intercept> contient le point
d'incidence, l'angle d'incidence dans le repère de la scène, l'angle à la
normale de la courbe, et le côté sur lequel le rayon est intercepté.
L'interception est enfin implémentée pour deux géométries particulières :
<verbatim|ObjetLigne> décrit un segment, et <verbatim|ObjetArc> décrit un
arc de cercle. On pourra regarder le header <verbatim|ObjetsCourbes.h> et
les méthodes <verbatim|ObjetArc::essai_intercept_courbe>
(<verbatim|ObjetsCourbes.cpp:100>) et <verbatim|ObjetCourbe::essai_intercept>
(<verbatim|ObjetsCourbes.cpp:10>).
D'un autre côté, on implémente la <strong|physique> et la
<strong|ré-émission> des rayons dans des classes virtuelles indépendantes
de la géométrie : <verbatim|ObjetCourbe_Milieux> pour la
réflexion/réfraction sur un dioptre, <verbatim|ObjetCourbe_Diffusant> pour
une surface diffusante, <verbatim|ObjetCourbe_Miroir> pour les
miroirs<text-dots> Ces classes implémentent, elles, la méthode
<verbatim|re_emit()>. On pourra regarder
<verbatim|ObjetCourbe_Milieux::re_emit> (<verbatim|ObjetMilieux.cpp:20>),
qui implémente les fameuses lois
<\equation*>
\<theta\><rsub|<text|r>>=\<theta\><rsub|<text|i>>,<space|1em>n<rsub|2>*sin<around*|(|\<theta\><rsub|<text|t>>|)>=n<rsub|1>*sin<around*|(|\<theta\><rsub|<text|i>>|)>,<space|1em><with|math-display|false|R<rsub|<text|TE>><separating-space|0.2em>=<separating-space|0.2em><around*|\||<frac|n<rsub|1>*cos
\<theta\><rsub|<text|i>>-n<rsub|2>*cos
\<theta\><rsub|<text|t>>|n<rsub|1>*cos
\<theta\><rsub|<text|i>>+n<rsub|2>*cos
\<theta\><rsub|<text|t>>>|\|><rsup|2>,<space|1em>R<rsub|<text|TM>><separating-space|0.2em>=<separating-space|0.2em><around*|\||<frac|n<rsub|2>*cos
\<theta\><rsub|<text|i>>-n<rsub|1>*cos
\<theta\><rsub|<text|t>>|n<rsub|2>*cos
\<theta\><rsub|<text|i>>+n<rsub|1>*cos
\<theta\><rsub|<text|t>>>|\|><rsup|2>>
</equation*>
Enfin, comme illustré sur le diagramme, on combine ces classes pour en
faire des objets complètements définis : par exemple
<verbatim|ObjetLigne_Milieux>, qui est un dioptre plan, hérite des classes
<verbatim|ObjetCourbe_Milieux> et <verbatim|ObjetLigne>.<new-dpage>
Les écrans (définis dans <verbatim|Ecran.h>) accumulent les rayons
incidents et calculent une intensité moyenne pour afficher ou enregistrer
le résultat. On utilise surtout <verbatim|EcranLigne_Multi>, qui est une
matrice (<name|1d>) de pixels et qui hérite de <verbatim|ObjetLigne>.
<subsubsection|Scène>
La logique de la propagation des rayons est implémentée dans la classe
<verbatim|Scene> (<verbatim|Scene.h>/<verbatim|Scene.cpp>), qui stocke les
sources et les objets de façon polymorphique
(<verbatim|std::vector\<less\>std::shared_ptr\<less\>Objet\<gtr\>\<gtr\>>).
Pour illuminer / former une image, on appelle la méthode
<verbatim|emission_propagation()> qui lance les rayons à partir des
sources. Pour chaque rayon, la méthode <verbatim|propagation_recur(Rayon)>
est appelée. Cette méthode effectue les tests d'interception et la
ré-émission de façon récursive. Schématiquement, on a
<\indent>
<\wide-tabular>
<tformat|<cwith|1|1|1|1|cell-tborder|0ln>|<cwith|1|1|1|1|cell-bborder|0ln>|<cwith|1|1|1|1|cell-lborder|1ln>|<cwith|1|1|1|1|cell-rborder|0ln>|<cwith|1|1|1|1|cell-lsep|10pt>|<cwith|1|1|1|1|cell-background|#F5F5F5>|<table|<row|<\cell>
<\compact>
<\verbatim>
<\small>
void Scene::propagation_recur (rayon) {
\ \ \ \ rayons_re_emis = interception_re_emission(rayon);
\ \ \ \ for (ray : rayons_re_emis)\
\ \ \ \ \ \ \ \ propagation_recur(ray);
}
std::vector\<less\>Rayon\<gtr\> Scene::interception_re_emission
(ray) {
\ \ \ \ <samp|Teste <verbatim|objet-\<gtr\>essai_intercept(ray)>
sur tous les objets de la scène et sélectionne le premier>
\ \ \ \ \ \ <samp|objet sur le chemin du rayon.>
\ \ \ \ objet_le_plus_proche-\<gtr\>re_emit(ray,
intercept_struct);
}
</small>
</verbatim>
</compact>
</cell>>>>
</wide-tabular>
</indent>
(cf.<nbsp>figure page 3). Les rayons sont ainsi propagés sur la scène
jusqu'à ce qu'ils soient absorbés par un écran ou qu'ils soient d'intensité
négligeable (<verbatim|Scene::intens_cutoff>). Une limite est fixée pour
éviter les récursion infinies (par exemple avec une réflexion interne
totale dans une lame).
Enfin, la méthode <verbatim|dessiner_scene()> est appelée pour afficher
tous les objets de la scène dans la fenêtre. Tant que rien ne bouge dans la
scène, on répète ce processus (une <em|frame>) autant que possible pour
avoir un résultat de moins en moins bruité sur les écrans (merci au
théorème central limite).
<subsubsection|Divers>
La classe <verbatim|SceneTest> étend <verbatim|Scene> et regroupe tout le
code indépendant du reste et qu'on trouverait typiquement dans les
<verbatim|main()>, mais pas assez générique pour être dans la classe
<verbatim|Scène> : création des fenêtres <name|sfml>, de quelques objets
courants, d'une lentille et d'un écran pour former une image, <text-dots>
Le code est fourni avec 4 scènes démonstratives utilisant
<verbatim|SceneTest> : <verbatim|main_milieux.cpp> (qu'on pourra regarder),
<verbatim|main_brouillard.cpp>, <verbatim|main_store.cpp>,
<verbatim|main_diffus_test.cpp>, et qu'on peut faire tourner avec
<verbatim|make milieux>, <verbatim|make brouillard>, <verbatim|make store>,
et <verbatim|make diffus_test> respectivement.
<\compact>
Quelques remarques finales :
<\itemize-dot>
<item>Tous les attributs de classes qui ne sont pas associés à des
contraintes/invariants et qui sont susceptibles d'être utiles à
l'utilisateur de la classe sont publiques. L'encapsulation, ce n'est
pas embêter l'utilisateur avec des getters, c'est protéger
l'utilisateur contre des bêtises.
<item>L'extensibilité et la clarté a été préférée à la performance
quand le choix se posait.
<item>Lorsque les constructeurs par copie et d'affectation ne sont pas
déclarés, c'est qu'on laisse le compilateur générer celui par défaut,
ou, lorsque marqué <em|deleted> dans une classe parent, aucun.
</itemize-dot>
</compact>
<\wide-tabular>
<tformat|<cwith|1|-1|1|-1|cell-valign|t>|<cwith|1|1|2|2|cell-lsep|10pt>|<cwith|1|1|1|1|cell-tsep|10pt>|<table|<row|<\cell>
<subsection|Conclusion>
On reproduit tout à fait de nombreux effets d'optique géométrique que
l'on connait bien : lentilles épaisses pas tout à fait stigmatiques et
avec des aberrations chromatiques, fibres optiques<text-dots>
On obtient une illumination réaliste (toutefois gourmande en
<name|cpu>) d'une scène <name|2d>. La formation d'images <name|1d> (par
exemple, à droite, un surface bleue diffusante avec reflet de la source
ponctuelle l'éclairant) sont correctes mais un peu ennuyeuses. Cela
donne envie d'étendre le programme à une scène <name|3d> (ce qui ne
serait pas difficile) pour obtenir de vraies images <name|2d>.
</cell>|<\cell>
<image|<tuple|<#89504E470D0A1A0A0000000D494844520000004D000000FF0806000000B40B5BCE0000161B694343504943432050726F66696C6500005809AD58755816CFDA9E7DFB7DE97AE9EEEE96EE924E91EE6E240441040941524AE916149110831044544424544241444054500451EA5BFD7DD739E78FEFFCF7CD75EDCCBDB3CFCEEECE333BCF73DF00D01BBB868404202801080C8A08B3D0D3E4B0B377E0C07E0010200314000FA45CDDC34334CCCC8CC17F2DBB33B0355C2645FF8CF55FCDFEEF0B541E9EE1EE004066F065378F70F74018DF86B1997B4858040008148CB9A32342FE600118D386C12F08E3137FB0F73FF8CFBDB46EFF608FBF3656165AB0CD190070A4AEAE61DE001052E07E8E28776F781C422D0018EA200FDF2000287B60ACEAEEE30ADF47DC836D44020383614CCF036301B7FF18C7FB3FB0ABABDBBFC67475F5FE17FEE75BE03BE1076BFB868704B8C6FC3DF9FFAC020322E1F9FA5B10704DEA19646D09B7D4F021E015A66B01B744F850025A201804C04718E000C6F099F6FFD61CC01DEE8D84AF79C2755884E719784E00D00A0E8909F3F5F689E0D080BDE8C96110E42E26C22125212501C09F35F1C706806D8BBFBE8688E3FFEE73BC0480AC1A3C8F4FFFDD1702CF719B0C006C42FFEE13AC038005B66D53708F0C8BFA673CD49F060D08F05AA3058C800D700301200AA4801C5006EA40071802536005EC8113FCD63E2010FE9A68100F92402AC804974121280515A006348256700B74837B60003C024FC10B300DE6C02258011B600BEC827D0882B0101944033142EC102F240C49410A902AA403194316903DE4027943415024140F9D8732A13CA814AA829AA076E80E34008D4213D01B68095A87BE43BF114804298216C18AE043882314101A08238415E234C21B118A8845A420B211C5886AC47544176200F114318D58446C20769000498224223991A24805A416D214E980F4428621139019C8226435B20DD98B1C414E2217919F91BF5018140D8A03258A5246E9A3AC51EEA85054022A0B558A6A4475A1865093A825D416EA084D8666410BA395D006683BB4373A1A9D8A2E42D7A33BD1C3E869F40A7A1783C11031FC18798C3EC61EE38789C36461AE626E60FA31139865CC0E168B65C40A6355B0A658576C0436155B82BD8EEDC3BEC4AE60F7702438769C144E17E7800BC225E38A70CDB807B897B855DC3E9E12CF8B57C29BE23DF031F81C7C2DBE173F8E5FC1EF13A808FC04158215C18F90442826B4118609F3846D1212122E12451273125F927324C52437491E932C91FC22A5261522D52275248D24CD266D20ED277D43BA4D4646C647A64EE6401641964DD644F690EC2DD91E390DB918B901B907792279197917F94BF2AF14780A5E0A0D0A278A588A228A0E8A718ACF94784A3E4A2D4A57CA04CA32CA3B94AF2877A868A824A94CA902A9B2A89AA946A9D6A8B1D47CD43AD41ED429D435D40FA997699034DC345A34EE34E7696A698669566831B4FCB406B47EB499B4ADB4CF69B7E8A8E964E86CE8CED095D1DDA75B2422897C440362003187788B3843FC4DCF4AAF41EF499F4EDF46FF92FE270333833A83274306C30D866986DF8C1C8C3A8CFE8CB98CDD8C0B4C2826212673A668A66B4CC34C9F9969999599DD9933986F31CFB2205884582C58E2586A589EB1ECB0B2B1EAB186B096B03E64FDCC46645367F3632B607BC0B6CE4EC3AECAEECB5EC0DEC7FE89838E43832380A3986388638B9385539F3392B38AF339E73E173F97355732D70DAE056E02B702B7177701F720F7160F3B8F094F3C4F0BCF2C2F9E5781D787F70AEF08EF4F3E7E3E5BBE34BE6EBE357E067E03FE58FE16FE79013201358150816A8129418CA082A0BFE055C11742082159211FA132A1716184B09CB0AFF055E10911B488A2489048B5C82B5152510DD128D116D12531A298B158B258B7D857711E7107F15CF111F12309598900895A8939496A4943C964C95EC9EF524252EE52655253D264D2BAD289D23DD2DF6484653C65AEC9BC96A59135914D931D943D9493970B936B935B97E79177912F977FA540AB60A690A5F05811ADA8A998A8784FF197929C5284D22DA54D6551657FE566E5B513FC273C4FD49E5856E1527155A9525954E5507551AD545D54E3547355AB567BAFCEADEEA15EAFBEAA21A8E1A7715DE3ABA684669866A7E64F2D25ADB35AFDDA486D3DED0CEDE73AD43AD63AA53A6F75B974BD755B74B7F464F5E2F4FAF5D1FA46FAB9FAAF0C580DDC0D9A0CB60CE50DCF1A0E19911A591A951ABD3716320E33EE354198189AE49BCC9FE43D1974B2DB14981A98E69B2E98F19B859ADD35C7989B9997997FB490B488B718B1A4B174B66CB6DCB5D2B4CAB19AB316B08EB41EB4A1B071B469B2F969AB6D9B67BB68276E77D6EEA93D93BDAF7D8F03D6C1C6A1DE61E794CEA9C2532B8EB28EA98E33A7F94F9F393DEAC4E414E074DF99C2D9D5B9C305ED62EBD2EC72E06AEA5AEDBAE366E056EEB6E5AEE57EC57DC343DDA3C063DD53C533CF73D54BC52BCF6BCD5BC53BDF7BDD47CDA7C8E7B3AF966FA9EF373F7DBF0ABF9FFEA6FE0DFEC701B601370271812E817782A883FC838682D982CF044F840887A4862C862A8516866E851985D58743E1A7C37B2268E1E0FB2C5220F242E452946A5459D45EB44D74C719AA3341679EC508C5A4C7ACC6EAC6D6C5A1E2DCE306E339E393E297CE6A9CAD4A8012DC120613B913531257CEE99D6B4C2224F9278D254B24E725FF386F7BBE378535E55CCAF205BD0B2DA9E4A961A9AFD294D32A2EA22EFA5E7C9E2E9D5E927E94E191F1245322B328F320CB3DEBC925C94BC5978EB3BDB29FE7C8E55CBB8CB91C747926572DB7318F2A2F366F39DF24BFAB80A320A3E047A173E168914C51C515C295C82B8BC5C6C53D253C25974B0E4A7D4AA7CB34CB6E94B394A797FFBCEA71F5E535F56B6D15AC159915BF2B7D2B5F57E9557555F35517D5606AA26A3ED6DAD48ED429D435D533D567D61F3604352C365A340E35C9373535B334E7B4205A225BD6AF3B5E7FD1AADDDAD326DA5675837823F326B81979F353BB4BFBCC2DA35B831D0A1D6DB7796F9777D2746674415D315D5BDD3EDD8B3DF63D13770CEF0CF62AF776DE15BBDB708FF35ED97DBAFB390F080F521E1CF7C5F6EDF487F47F1EF01E581E741E9C7B68F7706AC87CE8F9B0D1F0E347BA8F1E8E688CF43D56797C6F5469F4CE138527DD4FE59E763D937DD639263BD6F95CEE79D7B8FC78CF0BC517BD1327261EBC547B3930A93DF968CA60EAE9F4C9E98919EB99D7AF1C5F2DBEF678BDF626E0CDB7D9A8D9FDB973F3E8F98C05CA85A2B72C6FABDF09BEBBB128B7787F497BE9D97BCBF773CBEECB1B1FC23F1CACA47C24FB58B4CABEDAB426B5766F5D77FDC5A7539F56364236F63FA77EA1FA52FE55E0EBED4DF5CD675B765B2BDFC2BE1D7FCFDA66DC6EF821F36370C76CE7ED6EE0EEFECF8C3DC6BDC65F0ABF467EDBFE5EDD8F3EC01E141F0A1EF61E191DCD1F071E1F87B886B9FECD0590708DF0F202E07B030064F600D0BC807335F27F72B6BF160020E144F34FD66303714337117E4845141EB58AEEC714639371D1784F823D8903A93D9913B927851F6524D505EA529A0EDA2774EBF468061E465D261FE64C965BAC0BEC380E694E67AE4CEE5E9E353E367E238104C136A12511A2A8BE589C789BC48214A5B4A64C886C95DCB8FC91A29092B572E289669549D55FEA6C1A1A9A5E5A17B51B741EE92EEB03031643392333631F93849385A6CD667DE653166B9607D614365CB6B2767AF6F60E01A7121C734E573BDD767EEC32E7FAD51DF2A0F514F03AE16DE6E3E91BE377C9BF3AA02BF049D0DBE0EFA1E8308670E10895C893512ED1C1671263B2624BE2EAE26F9EED4918487C7C6E2C692279EAFC74CAF485A9D489B4B18B8FD30732EE64B667355C2ACFBE9C73FE7244AE579E6DBE6E816C21771155D1F1958DE257250F4B6F949596A75C0DBA6657A159295C455B7558BD523356DB5977B5FE424340A365935233470BB6E5CBF5A9D6DEB6CA1BA937FDDB2D6EC977B0DE46DE5EEB7CDE75BBBBB4E7DC1DCF5EA3BB12F788F70EEEBF7FF0B8AFADBF602066D0F9A1F690D030E5F0CEA3B991FEC775A3E94F829E5A3C931F631E3B7EBE3CFEE845F344D6CBE0498B29D969FAE95F3373AFEEBDBEF62671D6754E739E6701BDB0FAF6C9BBEB8B979722DF3B2C6B7C105CA15939FAF8797561EDC5FAA34F7D1BF73EDFFF32F07574731A5E4DBFB6A97F88EF98EE86FF2CDD1BFEB5BDCF73607D987E34707C0CFB5F180C4185087B241DF203AA121D8EB1C32AE298F068FC066196648274846C90FC21C520E530D518F524CD32ED36DD113D0D031FA332933573084B3A6B3DDB20FB074E341717B72E8F0F6F265F2BFF84C08E1093F0091167D164B13AF161898F52186901196D5937B904F912855B8AA34A6F957FA8605519D504D5153574352DB44E697BE804EA86EB45EBC719241A2619251927999C3B99689A6016671E6311651961156A1D68E367EB6DE769EFE6E07ACAD9F1F4E9D34E8ECE8E2EA75D9DDC9CDD5D3DDC3CBDBCFCBC037C427C23FD62FCCF062407A60665055F0E290C2D09BB1A5E15511B591FD514DD7CA625A625B639AE39BEF16C5D4255E2D5732549F9C997CE5F4849B81091EA9FE67AD126DD30433553328BE712311B97FD2BE7D3E5D9DCD1BC3BF90D0585852945A1579C8A8D4AE44BB9CB28CAF6CB57AF4E5EEBAB68AE2CAA4AAE0EACB1AFD5A993AC676D2034FC6CFCD034D1DCD7D27ABDBC35A32DE686EF4DFB76835B8A1DC2B7593AC9E11D6CBB7BB567EECE8BDEE1BB77EFB5DF6F7A50D557DA9F3F903398F9306D2875F8C2A3D491B4C799A3394F8A9E5E7BD63076EB79DFF8D88B8589AF938829FA69B119DD57AEAFE3DF94CEDE999B9D3F78CBFE4E6BD16729FBFDEDE5B915E823FFAAC95AE87AE1A7EE8D579F77BE526D0A6DA97FB3FCEEBE1DFC23662761F7DCCFC4BDB85F11BFFDF64F1F981EAA1F891D33FEF53F2B380F7140AD084DC424D21B854355C399F01EA61A6B8E43E2BAF1817046BA4C524DEA0167961BE46D1451945A54E45473D40D3491B4BA742C741BC43EFA02065F46752646A62DE6C72C55AC716C56ECA21C188E25CE5EAE3CEE001E3D5E76DE5DBE31FE1A81184153216EA15DE1519152513F3125719CF8B4449564A0948234901E91C996B59263945B90AF54F050E455FCA854AFEC0DE7282B2AB5AAEE704EF24EFDAA86A32693E66BAD2BDAD63AB43A93BAF97A96FA34FA530645867646CC460BC655265E27854E6E9A76999D35D7B620B598B6ACB0F2B596B63EB279625B64E7612FE5001C9E9FBAE618745ACD89D2E9BD73A74B9AEB2937717794FBAC47BBE7452F176F051F2A9F0DDF477E95FEF1017681324154419BC163212DA11961BEE1FA11FC9198C895A8A1E8DA33E763DC62D5E3D8E30EE3E7E05DA53031ECDCC924A1644CF2D2F97B29451742520DD2B8D30E2E4EA7B766A4663A65C95D22BFB49ADD97537C3934D7308F27EF28FF754147614E91FF15FD62BE1254C972E950595D79DA55FF6B66157295AC55E8AACDEAD99A91DAAEBAFAFAE286ACC6E4A6D8E6C896B0EB61AD916DF137D26E16B637DE1AE878D789EA92E876EFA9B8B37257F6DEE5FB7B7D41FDDB83A94322C3CB23D747339E9E1D4B1DAF9D989DE29B497F839C2B7CABB2F87BF9E9C7F6F5A6CFED9B23DF377789BF4C0EAEFCF1FF3FDCFD4F4CC0C80170251766A8308FB7D600208B0EA6C1B00563092C21900160A508105B3500D13908A0C69D7FC50FE82FE7A482192737108799A601CC307D411CC806D5A0078C835508404C902CCC0D83A16CA80D1A87BE21E8108A0867C405442B6206667422483B642AB213DE7F8830538B47B5C371880D6D8BCE453FC3E061DE9586798C2581195601761EC7830BC6DDC5E3F176F826FC01C19CD04802919C22E92625924691BE215321AB2527258F265FA6B0A078482947D942C54555464DA4CEA7A1A6C9A725D296D171D1B510658983F4E6F44B0CE18C58C6722619A631661F16344B2DAB36EB47B60C7609F6D71C499CA29CB35C19DCCADC9B3C75BCA7F9E8F9A6F8F305AC041905DF093509478A688B12453F8B0D8957482448BA48E94A8BCBB0C892CA01B93DF96D85EF8A3B4AFB27302AB4AA7C6ACAEAD61A619A795ADDDAEF74097A8AFA0106D586F3C68C26F627AF9AAE988B5B9CB51CB7E6B189B77D6D2FEF5072EAF8B48FD3B48BB66B8FBB984783178F779DAF80DF8D0085C0E160EB90F5B0C40886C8CE68AB333F63AFC6EB9EFD96589964711E97D29F1A7F5139FD3073F052668E6D2E7FDEEF8289A2EBC519A5FEE5E6D7942AF9ABE96B49EB518DA0195C47B591DCA4BFC5775BA1EB648F4F6FCABD9A0743FDAB0F498625466C46E39E568C0D8C2F4D1C4ED1CF88BE569D359C377F6BB568F1DEF083EA47D135FAF5A38DC52F7D9B65DF22B78D773876BFEF3DFE5D76E07FA4F877FF40C0FE2781351316C0076B0DEAB0C6E0022B0B176035E12618817583DF101DAC1098C29A400E74139A847E2258E0BDC60F918FB88F5887A38E16321C59839C86771E155438AA19B58C6645DBC31C7C1A4387B1C5946116B1FCD8606C2F0E83B3C2D5E276F186F82AFC2F8225E12609054908C924A92269151929590CD91AB903F938852E451FA532652F9532551FCC57C768EC606E1A4987A12B254A1247E93D18004305A31AE37BA6346651E6199673AC22ACB3B0CF4FB06F71D4713A7211B926B8B3794C7829785FF215F33B0B080AEC080E09150AFB88A88AD28B7E177B21DE2E5128192FE5296D21A3292B2B272CCFA3C0A1C8A1C4AD2C78425A455DD54CCD433D4EA350B3436B4A7B4F9743CF483FD6E0BAE1923193890D9CD7BC3667B3F0B6BC6D8DB2B1B56DB5C738B89D1A38CDED94E6BCE96AEFF6C843D6B3C19BD927CF8FC43F2D10159412820DCD0CA78E288BE28BEE88D18C9D8CF73A7B90989F249CFC28C52D15A455A6AB67BCCF4ACD16CA19CF8DCC67297858E45F4C5B72BFCCEB2AC5B59E4AD76A424D479D6303BAB1B5D9A6E5A8B5EE86C9CD1FB7CA6E6B76AE77E7DC91EB5DB897F240A46F6AE0EC43FEA1978F121F8B8DBE7D9A3BA6F7FCF8C5DD9771536A33D857D36F1AE79217DCDE192E292E4BAC88AFCAAF1B6E787EC9D8BCF3EDDB0FE9DD84BDB17DDEC38B7FFD8F84954D1A581793009AC01656C3D2413D18061F21022401AB41E7619FBF43502174604DA703F1052984F4453623BFA264E0FF7C044D87F6447763C8309E983E2C2B3601FB1E6780EBC073E2F308184222619F248EE498348D8C06FEAB15C95F5284505253F6507950D3508FD024D29EA03DA41B2466D2DB3108321C32CE30B533E7B284B3DAB369C2D18785939C0BC1F59BFB07CF16EF16DF77FE5D814321AC30AD08B7A88C98BEB8B3C419C902A95BD293323B72CCF25A0A818A254A23CA7B2AC2AA2E6A57D45F68926A196A67E88CE951EBDB1BD4186E1AAB99E49EFC68A66A5E62B167E560DD672B6057E8803E15EBF8DD2918F65D84DBA1478617B377BBAF91DF5A40469044F09BD0B4708588CF51B5679C6259E2E6CF56247A268924EFA60CA4665F74CC10C93CBC349E530D7B4DBF90B5E85BF170696979D0358D4ADAAA8F35DD75690DD64D9CCD1BD73BDAA26FCAB7FFE868ED74EDA6E8E9E93D75F7E7FD4B7DCCFDD5839C0F8B87718F42462646859EC43E1D1C433D571F8F78513931F2727D0A314D3FC3FF4AE2B5EC1BD95989398179A605C2C28FB7F3EFFA16AB9612DEDB2F4B7CC07C78B5D2F8317255730DBFF672BDE893C306CBC6FCE7F22F765FE9BE8E6F5EDCD2D8DAFB76E3BBC736C3F6B31F093B923B8BBB977F6AFCDCDEABFB65F51BF5BB63DFE580FCA0F7D0E388FCA8F3D8E18FFFC3BDA4A5FE440F00916AC2F2E3DBE3E36D3E00B079001CE61E1FEF571F1F1FD6C064631E80FE807FF4E03FC6184A00CA9DFFA07E56FBAA3FED7F96FF0121221D192F6E36C40000019C69545874584D4C3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C7264663A4465736372697074696F6E207264663A61626F75743D22220A202020202020202020202020786D6C6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869662F312E302F223E0A2020202020202020203C657869663A506978656C5844696D656E73696F6E3E37373C2F657869663A506978656C5844696D656E73696F6E3E0A2020202020202020203C657869663A506978656C5944696D656E73696F6E3E3235353C2F657869663A506978656C5944696D656E73696F6E3E0A2020202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F7264663A5244463E0A3C2F783A786D706D6574613E0AED9F3F270000101E494441547801ED9D5B73DC460E85A5515BF6C6EB75F935FBFF7F5EE2ADB22B71124BB3E71C5CD8A446AE080FBB2D09B4860DA0010E8DFE846E722EBABEBABA3AE3D1DB1332707A826FBB7A063A6905143A699DB442060A214D5A27AD9081424893D6492B64A010D2A475D20A19288434699DB442060A214D5A27AD9081424893D6492B64A010D2A475D20A19288434699DB442060A214D5A27AD90814248935648DA38BDB99DC2AE25DB7E323F26EE1C77CA63112FC2DEA4158671BCFDE903C2264AAE27593DD0F7A6CD7F67DF298F865C3858E1B4FFBF214D5A21FFE3ED874F57D7A2CB49816C12F6125C9B6404EC9ECAE2C3E47DE96242AA07B7E7485E931683F88476DCBE7B0F77D045149220EACE86B7A9133FFDECFBED39FD3852A2DF7A8228B786717ACECDB4BAD4A4154668DCBEFF17A842EE48947EB8B387AA1B44762469E89BEDEA751A15E72791FE3CA89CBCC375B7EA390F0EE1B86CDBA4158666BCF9C77B00723292448C5345A252C791530E720EC4D13F4E40BE54788C349AB019A46FDD2945C0B26D9356189AF1F6FD47D0B09126BA8EBA880109A2892D4592B1B799CEBDD9E37CB6FAC610C671B336B4CD6EBD2BEF9BB4C2E88CD3CDC020DBEC6994B10E1DC9233B4E0F6973CA92A0C9A673A06BF8C3907EEC6CD294A257B71BF7F77718FCB368383B31E7EB7BE8FCCD75AA2692088AFCD0C796E4606FB2E85294EB96CF26EDD571F5F03F3C48C1F52988422D132DA1B38D7AC7E0CD9EB2CC6E672CBD44A0A44D97A44E97DCF7813D0CEBB63D7B16C6A693D6492B64A01032F419BC333F88A739D00EA172839DECF121BDA97FF744077BAA29ECBC5F82D2BF9E8551C4150157FF760560B3DE3C635E982DB52E03456C394B724B3974726B3ED92FC17C4D345F8FD031C265F5B6492B8CD07833DEF83A6DBEDEDCCB1B4904C20832CAF6B281E704B95F50657DD49C2D37B8D6A41506EF59858C773FFD047A4096AE0AF0DB0A02F635EE58EF8E74ED75B134519675CF094B7D434C09DB48D411964E62D7B4C2F08C77B7B7A08C340551C8A353472AC26E04FA8C39DBF1A4A247D7A8AC588690D92679B6EF600A9FF9EC13C3D9B88CDCA41586627CFCF8F12AD76A22CEE90A794761901654820851E77672C6E224B38D8774D9FDECD88F0D9E6648DD54EDDD365996129BB4C2708C0F1FFE79753ADDE0017A922ED731E2FB7A4792E8E72D89A08F3F241B669B0D2715B4F1FC18ABB649531E5ECD6EFCFCF3BF51D386483BDDDC888A99BC8D40D6B113FC82B6ADAE25A1248FD58AE4915A21653A8C4AEA89B3ACECDEB89D71B11999A1ADD7764D2B8CC9F8F4E9D3D5CD2069AC63200D2491B8A02D6DAA65AC67A02D6550C47FB4E1419AF42F48735D760789BEDC8226FABBC1DAA92F0D8B094D5A6140C6BBB76F37D24418A9016951DFDC66F56C4F5AD095E4912C3C088F6C92CD966405694E58D849636C690BC3626D935618109076FB90B4B9A65D220DB42479A40B7A50C71A455268534B9914F1812D66CFA4C9EDA9C3679615B4D8AE492B0CC830228C9458939106CA7A70A6743D888A1A1674455C5246BA9AB4C270BCE090FEF52C0C6E27AD90B4C117D1F91ABA5A0878AB5ACAD117B668CF9C08DD8FCF493FF551890DB64BDB23E64BAECBDA9AB4C2D08C6FDFBE3D5CA7F515C10F53D9A4FD303D973BC76FBFFF6EF7D3F09E8EF9CE46ACBD74C723EE6A60FD15F658BB71A57F9AD665A86E5AD1CFEBB4B0F114F2CE2D62A4FB35288F135B5F1144265E503B3E7FFE7C75E3D79AB1E2B776BB8B1BD488B2A48A773C740DE0AB7F5E392033ECE73FBF2260AE448E9314D79E41969BE945576D4D5A64E205B5E3F3AFBFFABD33BBD634422639AF21FDAEC55127597CC04E5A8C1C278D89F2FE2029288A36899B936A07992D4BC93D7B168663FCF2EB2F9A3545D84C51C8D1EA6E07EA8EC871EA48849364E418752C4F9C5DB90551D1D25FF6A861A9CB6C3BB74D96A5C426AD301CE3CB972FDBECB7A32A6A18B179842C52665839514E1A4E446405456A9DB0A0C8547AEAB4C36CFF87EC3475B17D93561890F1F5EB5780646B32D5210CB9D65F17E8C21DFE24284812138C112AD0F4C39D7ADC8E330BDDC98AA6492B8CDA730C197F7DB7CF7B9204CDA04420DEAF11325BF6939668614BDDFBD570C78D7E66A0A21F99A77EEAB119A9A1ADDD764D2B8CCFF8E38F6F80E2383B22974E54D044544236825CE7934EF4E91C04965169BA2224D2D705EB726DB38761DDB6492B8C8D7D0A0F81C77BF7E461B6EDF49D5278D6671ED2A4150610DF96806F4638E1DB12B006E3FE1A2F359D5D276AB976632D92EEDF9210350EAD7E54AB5CE631DC9FE7C45A98D4CA4F569D2EA13521A5B02CDB366985A1E9A475D20A192884E05D435C6F0138D49AADA5CCFA1436962DD3CDC6FAE33E7C52F9994DE740DDEDD64853177D5D5013DA66F7EE859BFEF52C0C8ECD9E186ECD70784386B54E9868D29429BBD185495424F90CE95469B6148DF2EAEF1A2A0CC68B0E19AC3EA4CB6A18AE41458BEBEA8B7AC73C841F2B51F8500C99C8AA47ADEF9C52C66383AF6DD686B6D9BD7BE1A66B5A6170C6F9FE3BDE5F1677397055406A7C459FF50DF8A866B14F2819595AE5BBCD6A1ACE20490B86E83B9D592A66CCAEB44FBE8B8A4D5A6160C6CDED3BBB634B6272BD86F19FEFB14D74111BFE531B74283698611F7FCCC7CE89C7F6B3DB0419C2BC3914FE17FFE39026AD90F071F7FD2F0CF2855799481D792119499213433D48924C5732435FFE584C9C8F8EB1292ED15FEEA62BDEC4D5F74D5A61843A699DB442060A214D5A27AD908142885F7B6216E3ECA599D05B9FCDD27ED03547CA467F8FB7A9B367CFC240BCF890AE698521EEA41592863F468028D6A6684DB043C9AE8265FDEC0B5BC8F49C6DA94BE0CEFA4D9A643EE1B4F118CF646BD20A0365DF12EF74C5352367CCDDAC49C082ACE8A325E8986C3A07EA14BC3FFD261B8F28557BECE258A12FDC366985C1E957A30A496BD23A69850C14429AB442D28666314E649CBD3483791BB359D88F7ACCA66A3D3EE4ECF3338A58AA29DBECE91E933D2DCB0A4D5A6168B04EE32073CD8568B6A4C4F7D2CDC1FA69775D3E0AF238C9468FF9F06C269D2AB788893EB34EF630ACDB366985B1E9BFB152485A9356481ABE6BE8EEEAEA1EB9E39705E915761C2575D624D8F9E54251CB5CA67A0E59EFFDE0B3D32F5A09938D766C879A66C6D99E96658526AD303458A7892585920DBE13E8B1564EBDC3272E7A7B7206B04EB36F51CE770C91B378C7370E9776AF450FD769F0E78FFA5D36439E8CF5B97AA86988B02DED6158B76DD20A63D3AF111492D6A4159286F7DCDEFB94C97AC4B51A5BE452ADDBA246A9EED0C66E7EB24E02F67C4F2E9FDDFADC613B1DC5B99AB2022EFB6CD625A526AD302CFC23ECC4E6F0C09144046998FA82A4E88B383E71DAA4B84E199BFA4CDC641E7BDA669FC9BCA2D8A4154665DCE0EFABD8DA6B7EDFED2C1B69BACFE664859CEB2FD84D767A181284F2A4D81F27974499E5A13D1CD76D9BB4C2D88CFB3B7C038CAE00CEF6691530713EE173ED7A773721B19934A8621B9FB84BBA489608A2C09FF0B133524C9C5C931699785D6DFF7A16C6BB9356481AEEDCE28A40776AD1B2DEF031EB57BC62703BFB74C3CD3F81BCBB73EB77E2E062854D829D52D63176853D5A73D9ECAE2FDC346985C1E9A475D20A192884F8FD3444B2C41C1F71C0B053FF911CFD73FB23997DB1F1B8CF64EB5FCFC240E115765C09684A244458C9E39FEDA163F47DB2340FD24003717BF047551E7BF60C7ACCE1D9D99BB4C290F5AB5185A4356985A48DB356FCCC1D56FEAA552C64931E76F6E9C16761DD63E5636D83C4F772A8D8D187DBEC1BBA3ABCEF68BBA487FF7A6D9356189371BE0361F80EC833EE9BD97D2F90839951DF04038AD4922A12453DE882AC8D76B7994ECE8C4077208CDB968A19B32BED9BEBAA52935618994E5A27AD908142C8B8C6DF8CE2EB00BAC7CFFAC4DAA29610CE3AAB0F7536AC5AE667B2D9D86F3FDE0733371DD344C59AC803C9DD55D34D597BDFBF9E85F1E94FAC1492D6A4159236AEFC9BFAAEAEEDB54EADC7B8C297EE2D0A15ED5ED0AC5571C3335A91F3963ACF227C4366EB5BC4996358B7F8CDB2ACD4A41586467FB35857001A79DC2CD3FDB2CB4722443FE8BE1CF402AD4D5A6150C7B87D8BF772207787B5DAFE3D1CDB7ACDD66556B372FD853A95B2EA19ABDABEAE6DA58CBC72B33634AB8DD6B3FABE492B8CD0B8BBFB8E89B3AF089E92BB26ED29D972DF71FFFD4F9413D6B4AD6EF1EFADC43568DA59A558806CB7F5CBA40E1D326BDB56C42CC46B58345DD37C045E4B334E78CF6DCC9C461C613A920792480E1E312B1A48B38D29A3CE1FB35B129DD0C8E844A047B81B629EC9D635AD30507A8D8060D9B525D7FBA404AD93450A69E28EF54A7E49127DAD4FFE2ECA3813251F76629BED66B17DDA67E39A72935618177FDD9391C481E4E0C1BF4F00CDAE33FDF550BAC8E27EE90BB36268E7114063FA99451D3A22A5B87A357FEBE3FEA86F3DAB494D5A6144FCAF2ECEA3CF7AE67A98FFEE8109CB5363FEEEB117F26BD20A83314EE30D4AD27605605702079D958A750B0FFED30F7513D2663AF7E61BE793570934284E82BA791413520ACBB26D9356189A7ECF6D21694D5A21697835EA1EAB7C44B25EA1B6D9875068A3CE35175ABD3AE575CA1C54BEF87E5DAB51DEC7A953A529749E11E5694A3DD4B43CE7B4A76559A1492B0C0DBEE7169FF7CCF7A361F54FC2FC7E5ABCD669B31FC9C3324C44188546194388171F268B2BD9647137EB77377AB27352BD5FD6B5774D5A617CF0972FB82643EE404610A33674ADE178E499AECD97A84053BC9EFFA82B6E3AB389403BAAF7A57DF25D546CD20A0363350D9FF9B499D308DACD9C784F47D636C30A4F335347C8588F84187BECF233C9A12FCF4CBB6C42702BD494E8BCF4D6A41586E7F0D7B131DA18F1983D35FAD445811393B2F9F239A37F9365A48AAD49B33CBCF23DEE72DC8294C35D0DD1C5DF5CA7EC026DE81195A451D5C8099439FA3CB946622A21A8552C25C57BD7E24DD7B4C2008DEF7FFCB627CD29B1B51B01F0BC8A28A3CBA070D2040979A1CE1FCA54ADDD280BBB75CB996EA9A6149665DB26AD3034F8BCA75D118808D24442A22537AECB462E04C464C7931A4DD677248D013C8407661382BAD49D12B5A5B726AD303CE374E2F7DC22770FE822813862CCAC1483BA20D0C9135D86931D8727127A924623B6C92E55C6D91E8675DB26AD3036E3CFDFBE1A1D4E51D4A7A40A76238947677DF2DA437BC8B35D6EE633F7E7B979CC830A96C74ACF658526AD3034E3CFDFBF18312407FFACE63845C261222A2851EBAC3024E3B633784099BBD39BDB419D2DEA5F79D7A41546677CFBFA1F2785D1A4CA5A17767D3A3EFA4596DC9217A3550EB193A32B93DFD46DE2D6175DABB74D5A6184C65F3E7B32D66A93493A96609948F09AA6BEA4D2B4A94A4DA2C54E4778D017D1CFA96DD20AA3757DFBFE5FF9F2F746DA7CA41D271329F4D9FA36698A4D630A53E7F3159BB4C2D8E1B2F32649CBF88B605C3466C86B129AB4C268139F87A4150EF49A429AB4C26877D23A69850C14429AB44E5A2103859026AD9356C84021A449EBA41532500869D23A69850C14429AB44E5A2103859026AD9356C84021A449EBA41532500869D23A69850C14429AB44E5A2103859026AD9356C84021A449EBA41532500869D23A69850C14429AB44E5A2103859026AD9356C84021A4492B24EDBF715B6C9BFCC1EE7D0000000049454E44AE426082>|png>||120pt||>
</cell>>>>
</wide-tabular>
</body>
<\initial>
<\collection>
<associate|page-medium|paper>
</collection>
</initial>
<\references>
<\collection>
<associate|auto-1|<tuple|1|1>>
<associate|auto-2|<tuple|2|1>>
<associate|auto-3|<tuple|2.1|3>>
<associate|auto-4|<tuple|1|3>>
<associate|auto-5|<tuple|2.2|5>>
<associate|auto-6|<tuple|2.3|5>>
<associate|auto-7|<tuple|3|5>>
<associate|footnote-1|<tuple|1|1>>
<associate|footnote-2|<tuple|2|1>>
<associate|footnr-1|<tuple|1|1>>
<associate|footnr-2|<tuple|2|1>>
</collection>
</references>
<\auxiliary>
<\collection>
<\associate|figure>
<tuple|normal|<\surround|<hidden-binding|<tuple>|1>|>
Scénario typique (celui de <with|font-family|<quote|tt>|language|<quote|verbatim>|Scene::interception_re_emission>)
d'utilisation des objets.
</surround>|<pageref|auto-4>>
</associate>
<\associate|toc>
<with|par-left|<quote|1tab>|1.<space|2spc>Objectifs et méthodes
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-1>>
<with|par-left|<quote|1tab>|2.<space|2spc>Structure du code
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-2>>
<with|par-left|<quote|2tab>|2.1.<space|2spc>Objets
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-3>>
<with|par-left|<quote|2tab>|2.2.<space|2spc>Scène
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-5>>
<with|par-left|<quote|2tab>|2.3.<space|2spc>Divers
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-6>>
<with|par-left|<quote|1tab>|3.<space|2spc>Conclusion
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-7>>
</associate>
</collection>
</auxiliary>