366 lines
62 KiB
Tcl
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)> (où <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> |