From b7788e6401102949624188f27711a1ec883f792e Mon Sep 17 00:00:00 2001
From: Benjamin Koltes <benjamin.koltes@student.ecp.fr>
Date: Thu, 31 Mar 2016 05:32:45 +0200
Subject: [PATCH] =?UTF-8?q?commentaires=20et=20carr=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../multiprocessing.cpython-33.pyc            | Bin 2018 -> 2018 bytes
 .../multiprocessing_2.cpython-33.pyc          | Bin 0 -> 2022 bytes
 scenes/__pycache__/square.cpython-33.pyc      | Bin 0 -> 1941 bytes
 .../three_triangles.cpython-33.pyc            | Bin 0 -> 2402 bytes
 .../with_multiprocessing.cpython-33.pyc       | Bin 0 -> 2028 bytes
 "scenes/carr\303\251.png"                     | Bin 0 -> 654 bytes
 scenes/one_sphere.py                          |   2 +
 scenes/square.py                              |  41 ++++++++++++++++++
 scenes/triangle.png                           | Bin 0 -> 1541 bytes
 scenes/two_spheres_processing.png             | Bin 0 -> 28201 bytes
 scenes/with_multiprocessing.py                |  40 +++++++++++++++++
 11 files changed, 83 insertions(+)
 create mode 100644 scenes/__pycache__/multiprocessing_2.cpython-33.pyc
 create mode 100644 scenes/__pycache__/square.cpython-33.pyc
 create mode 100644 scenes/__pycache__/three_triangles.cpython-33.pyc
 create mode 100644 scenes/__pycache__/with_multiprocessing.cpython-33.pyc
 create mode 100644 "scenes/carr\303\251.png"
 create mode 100644 scenes/square.py
 create mode 100644 scenes/triangle.png
 create mode 100644 scenes/two_spheres_processing.png
 create mode 100644 scenes/with_multiprocessing.py

diff --git a/scenes/__pycache__/multiprocessing.cpython-33.pyc b/scenes/__pycache__/multiprocessing.cpython-33.pyc
index 7645044adc3b046eaaed0994c6f051d98fc9fd62..069cae04b5d3f178ffa85e6fa38aedecf12af2ac 100644
GIT binary patch
delta 23
fcmaFF|A?P`9uF_q_Q`)Xvd>{*WZArg#f}*OXtxLI

delta 23
fcmaFF|A?P`9uF_q=Odpsvd>{*<k-A~#f}*OZX5_v

diff --git a/scenes/__pycache__/multiprocessing_2.cpython-33.pyc b/scenes/__pycache__/multiprocessing_2.cpython-33.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3b1bc7d67f06e608fcd0f9976d850e582e3233ed
GIT binary patch
literal 2022
zcmbQo!^^dO@}Dp-RtAP-1|-1Fz`)?Zz`#&k&cwiw!oZNi$dJRp5XHcd%D|At$dJXv
zkix{!%*en9l4EAbVP?o>VTfXZ@L3pgSQ$b<GAs-^Y;YDkgvH2^!@&^62{x6LA%}}0
zmzyDq8={kuA%}+{iU%ym$dJR!5XH-o!p4xo&d|cZ5XHxkBFYfM%n-%T5GBA6CCHG<
z!jQ_(kSf5C!o|?c%n-%QkSfHGDh$@nz>vbtkj@NpWC{-h6mc-5@G>;BF+_>LRB}NT
zV^PTmRw>GmDu!exKg>)4hEx%-rQ$FJ5L*Oc3V0Y&MZpRr7*Zt}ni&|PSQ%2Kz(#R_
z9Gt=cRS9x1M1%_}(#*sVCC!k^%8(_)kSY%H0wa_o0q4jvq)J0LoD5lVuyEjKNCSI0
zN}eHAfgx29B;L#jQWvEJ6A=J$n;99Rl))lA3|T4+sY(o~$_%N@4C#y@dqJcih~3Nz
zQXHkqkgCRzBE*o*#86bsl*-GHrOuEd43^ShNY!A-(qu^GV@OqH0J&TXETRqaG9yS%
z2g2fH$kJs<)dFeC(gV2*6mR_C5Rzv|<z`3`VMvt+8NiqaPH({)VhjunnV>}JSIWe|
zz@Vq6!N|bCP|C)@z~G#in_83z;e!OVAWV={W^Qp}S!yy!6r>j<1j5ds)C?kO7#Lz$
z8EP3BYMB^nnHg$X7;0G=O2Emwgo&YsnIVgrp@xy6h6&`B8Wxa94J$)43quwQ$Ro{+
z48dT_{4`iWt^v6$ub>pfPAn=)tSseZU|=XIN=#0T2k}5w7bRB4CzgPfB<JTBrD%Wz
zOF<4S0h5_vG7IdnWU$A;YKxOo^HNKB7#JAxlH!X}({fTPGV}8^K%N2<r9Pm5u!;#S
zPAw{qaZ1h0O3cm7i*d<MF3nBND?t)+&n$^aNiB=d$xn{~n_3)`TbfgnSx}UpoLXF*
znU@}Kq*qW`3JP$z)8lhXOLAaJ_&}k@0<xM>lo5}*%oofI44ERJhy(dA9i)SS;e$Pt
z@xVTP)=UuCX`gNk2AAzKnHd-upu#WhGeO~5%E7?E5FekLn3)$Jp9!+IR0<TT<@xc&
z1sSPDsm1XKr|T8urE7r9fY=RpfQCLOdO#AzmBpnXLkbd0GQfeHSWu9fmjY%&!y6PM
zkTiu9^q@G+$xP2E0mo@kVkJ0iioh!JN^=V;!O1eOpj3c?fgv}sq#!51BquXTFEckW
zJr!&^BrSrqXO^TEmE`B=6qoXYRHFtzo)CrDQ30VUF_Hr~sC*MkQj0PZbHH|nr6!l;
z7nO>FY=MZELPIS+DJQiw6{}29eks(+!QcP}+XD$}s4h@CgbF|ugF+`5oJ2t>KDYqn
zcTiY?s*aq}+|1OX)KV@628P6xl=%Fltkh&kFoL*{Km{34m0FZvTnf^Xn3k5AoRJES
zsGQ7VNOmbo%u9y|73G&h)FtQVl;-9^*ab!TDW%B}rOAm!C8^-hh>y=p%uS7t2OAZT
zpPvI}6o43@)R3E4P|6K*7sSGN5Fg}}<edCsh+SFvnR(zyhGb}v>xxo~GZG6@!TAnB
zP(KHP6247teoARhsvRgN6oV>Z9!3Es0Y)w`<Y5$G<YDAt;$h)u6k^n3)M8X*RAl62
X)MexaLkUJ9kT??$BS;>kM~)EyfvLcK

literal 0
HcmV?d00001

diff --git a/scenes/__pycache__/square.cpython-33.pyc b/scenes/__pycache__/square.cpython-33.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..835a68db460c108aac51e15ff355cbee1d6990a5
GIT binary patch
literal 1941
zcmbQo!^;&k^H11y76yi71|-1Fz`)?Zz`#(P#l*mn!oZNi$dJRp5XHcd%D|At$dJXv
zkix{!%*en9l4EAbVP?o>VTfXZ@L3pgSQ$b<GAs-^Y;YDkgvH2^!@&^62{x6LA%}}0
zmzyDq8={kuA%}+{iU%ym$dJR!5XH-o!p4xo&d|cZ5XHxkBFGTK%n-%T5GBA6CCHG<
z!jQ_(kSf5C!o|?c%n-%QkSfHGDh%SLaDm8lW{@LOxIt`?2-wzUHijq>ureWr6k&!G
z9tMcAC{eH=7ek5&lAst^P!wzeT%|Zz5NriPy97h3BtxnwL#h}<syIWc1VgF_Lo+Kw
zloUg%G($53Lli4Rsti~oBuE*c_JSM?5#fT0G&3<o$ugv}GGxgyq)LIjzzE{VGo;Ew
zIGhYw3NWwpGNgfh8KuaOs>G103=(f<1gVQsfr$u!xXp|VQL11O9)>J6hEx@XR8@vl
zW`=Y|kX0a35X5d~1u2eFXGqmxNa171W@0ExV@l;^$kJp;;Rj1;F{ElSWN9;`@-d{U
zGk_ec0~XN*`H~SNrw3tiGGys9r0Re)Wf_3n1&S(Oa8xNWq;fN)2r#57f(&5H11GUy
z4KW4=hD=a8^ebgzU|`VG(_my^U?^o{U|?`g%uOvygz!OvS`a2kDl@k@u`D$iBnr|C
z5&~goPyz-KH4F?ftPHh`47E%Qwag5)EDW`*3?<-{T*Aaq!_1Jy%uvI~P{RarOAQN1
zq=uEDnS~*X1>})tMuuRpWqum0AlHCgmRC>;VkZ_AC03SlGB7Zd6eT97#)EhutBVpV
z;}c83N|N*Qi&8W|f~6n_mVn7jFqsARSTfjSV70}`sd=fTJPZsBc}ej_scAW>6`A>Y
z8X!-BiBd;UKv>0u7N-^!$2g_tWhLfj=Eb<=Czs}?=9M4`xo4Kdq@<R`=j5lyfK4rq
zDK0EcEK1cYs4NAAGTgoKxuqpJnFU4p$*IM~e4rp>0olhW%7{l@<_S<liGT=@r_yK5
z1c8(GnV_)AWCn#22Ll5`e0*+VW?p=JCdkNAE(QjM<iw()!z=X)^3pXxsvzbd4Ez88
z|Nl%>Lc<Vb8c1<*WpOFUpn}Ab3~<OL78IoBrGS~xKm-LdB%vUMCn%zFGSf3kz!6oH
zSPAxf5m-fDX>LI!IIZOslnO8~Fytnd6y)TW<YXr4W#%TPr-Ds~Brve{%#zfilKlLf
z;!=K)>e8GNSlDIerQ-=Ph#eIWsuClPOF_Zqn^=-sl$n?Vwlgd>xg@`+R2*arM7%V<
zxF937C^bGQCowNMBNc2`nE`|{giuBh$`~9_fu)HlrQFa^hiU`+IvAYJK*=_^0OVIt
z*no=soYLIP)S^^yOeLnI#OEhvr6xmy4a9{6A}BbkQj7A7OF>!^)6z0QZUIG1PG&JA
z%@-x+rKf_OP?TQ|QJ0*bQ<|FxVHXtTr<5i`lqM$@m861wA0MBWn420O57rlupPvI}
z6o43@*w0NY0Q&`MVLXTra!PVeelf(Zto+P8u=gOj66Cs~)Z&c9f>dzkK@e2RMxZFO
z$<0qG%}KQbrTbzh1_lNmMgb-PMlLYqVH9BGVdP=rVc};KV$@<3g+d8NPDWiuUPfL<
S2}U813=<C{NCilj93uc19;*fb

literal 0
HcmV?d00001

diff --git a/scenes/__pycache__/three_triangles.cpython-33.pyc b/scenes/__pycache__/three_triangles.cpython-33.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7c55f41e1296e48281a1596b7e34494b1b15d06e
GIT binary patch
literal 2402
zcmbQo!^>s<^H<mpHU@@d1|-1Fz`)?Zz`#)K%gn%#!oZNi$dJRp5XHcd%D|At$dJXv
zkix{!%*en9l4EAbVP?o>VTfXZ@L3pgSQ$b<GAs-^Y;YDkgvH2^!@&^62{x6LA%}}0
zmzyDq8={kuA%}+{iU%ym$dJR!5XH-o!p4xo&d|cZ5XHxkBFqrO%n-%T5GBA6CCHG<
z!jQ_(kSf5C!o|?c%n-%QkSfHGDh$@n01`}R201c?n*oZzCO5M&M2R4&<N~S3sZtcC
z609tRfdQvVF(j2-NVbF7DO?OGU_XOw7iUNjXNZzuNR?nn;bRa^5nzx=;bstyl7u;)
z4<w!{$si7~EJ_M2A;FL$i6$WpmXKyhkwKG?0ZTyQjt}bQC|QP7IfhgzhE!>WR9S{p
zF@|OqhA4Tkpfp3O3|LSUET{k$l!6J0fCUv9Qk58*85p8i8B&#z%!h>uDCA+Dg*d#K
zi6KgbA(fROOO+v20TdUEP>v!pM;^{mV@Oqja5x#V)M2s9&yWU=$S4hlR859dEs%IK
zBS>A8HcUhS#BF9|h|&Rz@GxZQGNfuVr0OuFGBczzf*b)N1wrg)R*>Q-J%&_$h7>`D
zY$k>xPv%r!hAaby6tFo_h775O3|U4DseBBndJG_M7=uMjK>lY0$(ce}oD5lJ45`K-
z^RmoA?gFJoesF5kU`XX=ND*R4)c_g5m<P^9!5Xp*3=El|tmaqB#K6Fyr>DWlz`#(-
z#=yYfoS2(hlnCL21hpVckW^-Fabj6&GDsAp7bFD2&Y(OBB5D{IVpth!85wGs7;2dr
zYFQX+Ss6;enYDz8p@x|ui<zN@k)ehO<dzy1kVp+HC|0vrKptskWC#XZ=BL35at+93
zc?G2)c4ARcVr3~O0|P@zQDSmxJctLfx+t+SKCuL>Bso97C`AJ#SPF7r37E_TlUZPo
zC4)T%R$H8$nwMJ2!@$6hmlR)=nwFDVk(r;T0rC`>DD?sbgjGyvacWU<j8ke}R$^{u
zUW`kAa%paAUI~(rduB;YN@`hrPJVg}*wo^fl8mC%)cBI3%*4F(oYZ2yg33}cWQWJ+
zmX_pX78K<trxq9Ufx?ajWHF;CBOY~`CqOYK0wO@ZO9$y-V0d7k`GT2&A(I0n4hpVJ
zW)KTxUMWZ{K0Y@wGcP_K>{XbH^a}FQHNfh?W`YTj!Rf1fB3@K&`)v<pa66=H35)HT
z_g2jzJ=P=TjiVU1161m_edhoF|Np~zFvfncu!aRF_CPiiR~DCo98-{3k^zo`#Dap<
zyc94K8XcergCsemm;pt3PG)*W2{_7&5-Y*6UIbQ=SDIT;2~M?n1*HNE3=Fx6B?US8
zB{`W%dYQS2>8W7TAxRaiJ+maWs3bo>r?`|Kq`EYx1Qz(2dFgn99AZZWgsKDwA#!Q~
z2e5BqNorAMVh-5Ou+-#|{Gw7(kS!4L()i+njMSpk_@tcF(p0Q6WvN9a*ky|HOVd+J
z#j%=}n3tT93QpU}U@`~n$}$58WeA~+Ae1rKr6JJtSPDvUu%r+Vv4a<!JR#{d9^{}>
z6cLc)!9gDk&NiT27+e4fa8Lw+D(Rfk+|1OX)KV@628P6xl=%Fltkh&k+<~}|m;}XX
zRccXwaVbbkVp>`z$P1v<k&{^r$-+g6dFiR(1XGk>4pEn!pHrHf2VoZ!<)@S;LzE^b
zf`Sc_#`6+$Q{&^o`U3LvbHI!O5CfD1a}x_nxk2uNSQroDgPf9_lV1$6D=R-U59~ci
zAp>$<QEG8UVnHgnEI<&{E)_tox5>><Da}c>17+Ug5C#SY9!3Es0Y)w`<Y5$G<YDAt
w;$h)u6k^nZLN-PrMoBOfWduVePDWiuUJzvBWt3nP0;y%<VFc*`nIp#t0MiN>p#T5?

literal 0
HcmV?d00001

diff --git a/scenes/__pycache__/with_multiprocessing.cpython-33.pyc b/scenes/__pycache__/with_multiprocessing.cpython-33.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6fde5bcf463542dd0af33171a0216e504f6d35f6
GIT binary patch
literal 2028
zcmbQo!^^dO@}Dp-RtAP-1|-1Fz`)?Zz`#&k&cwiw!oZNi$dJRp5XHcd%D|At$dJXv
zkix{!%*en9l4EAbVP?o>VTfXZ@L3pgSQ$b<GAs-^Y;YDkgvH2^!@&^62{x6LA%}}0
zmzyDq8={kuA%}+{iU%ym$dJR!5XH-o!p4xo&d|cZ5XHxkBFYfM%n-%T5GBA6CCHG<
z!jQ_(kSf5C!o|?c%n-%QkSfHGDh$@nz>vbtkj@NpWC{-h6mc-5@G>;BF+_>LRB}NT
zV^PTmRw>GmDu!exKg>)4hEx%-rQ$FJ5L*Oc3V0Y&MZpRr7*Zt}ni&|PSQ%2Kz(#R_
z9Gt=cRS9x1M1%_}(#*sVCC!k^%8(_)kSY%H0wa_o0q4jvq)J0LoD5lVuyEjKNCSI0
zN}eHAfgx29B;L#jQWvEJ6A=J$n;99Rl))lA3|T4+sY(o~$_%N@4C#y@dqJcih~3Nz
zQXHkqkgCRzBE*o*#86bsl*-GHrOuEd43^ShNY!A-(qu^GV@OqH0J&TXETRqaG9yS%
z2g2fH$kJs<)dFeC(gV2*6mR_C5Rzv|<z`3`VMvt+8NiqaPH({)VhjunnV>}JSIWe|
zz@Vq6!N|bCP|C)@z~G#in_83z;e!OVAWV={W^Qp}S!yy!6r>j<1j5ds)C?kO7#Lz$
z8EP3BYMB^nnHg$X7;0G=O2Emwgo&YsnIVgrp@xy6h6&`B8Wxa94J$)43quwQ$Ro{+
z48dT_{4`iWt^v6$ub>pfPAn=)tSseZU|=XIN=#0T2k}5w7bRB4CzgPfB<JTBrD%Wz
zOF<4S0h5_vG7IdnWU$A;YKxOo^HNKB7#JAxlH!X}({fTPGV}8^K%N2<rT(CRu!;#S
zPAw{qaZ1h0O3cm7i*d<MF3nBND?t)+&n$^aNiB=d$xn{~n_3)Go>`I+pIe$!l37rc
zpPX7;oSB!dS5R3B3Uj#Y<8w<(a$pMhKmo`CvYk<s5s$je7t9O{nIfRL19>qWq=SLs
zgFTe-z&?G}Oc2;<pKc5Wm+do|85kI#!Y}PJK|xx|!N9-}AD^3;nHL|Q39`0S3KX#A
z`SHaC8L367#qr1v&r8<;nE|mI?f?yaPz-@2iYtptL5370mSlj#IkBK1H7^Csga$b%
zQXt6+DfB_nnv<EHQ38(EqQpvY*c5?P<dx<YRDx4xUO}k<0|P^DVo5<xeo0Pdl3r$R
zVtOjrbVzapYtJl6Eh@>+&nYhD2dPF4d^{lvv7-V)Rbr$Fa8UUsmZTPCCgy<c3`<Qe
z$uBAu1=#`-FNKC$d{RzoX)0EkqWn^*lY_wl47LXn)=*ubqzDy&C<cX2FgTTh5`Az1
z$nT)A0@WTlrMa1@MX9A+3=9m3DJk*!Nm;4MkYEIHA%O}qpenT}zqk~nB{3~6GdUv_
z98o!$#gH6Rl$e(e5h}_rhp0==&neB#gRl#V@>5EaAxe`Ii%L?#p%EXSmzbLx9}hMv
zAU{6`%qRdcK&c@&v7nS2<SvMX@gP3PDakqc#Spu)@-y?mkqpVxAlDV87H1?Dq=K^^
zf}lwz1f_kO-29Z%oK!ndW+(<##XO7xOahEtV93KLz{tbM!^FeF&nU#G#i+%o$f(H3
Y$*9Z73x*PmLLhM_9!8KnNRJ#N09;DLmjD0&

literal 0
HcmV?d00001

diff --git "a/scenes/carr\303\251.png" "b/scenes/carr\303\251.png"
new file mode 100644
index 0000000000000000000000000000000000000000..8385ce8dd579179058a2b02d721e72b2a59b86c1
GIT binary patch
literal 654
zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Bd2>3~M9S&0}C-U@3O;4B_D5;Hcq9>0n@B
z;4JWnEM{QfPXuAc752+B85o!hJY5_^D(1Ysx{>#ggNVz)d>8k3`&q7+oD;0#^mv}I
ztjTxYw;3}{4}`D3%lzOZ3zMUQzyJ{UcC-IEUAgYA@Q;Gn<L@}_KM#m22EgMORz93D
ob89t=%~bYA1py8w`V;1=DQx{y10|Rl7#J8lUHx3vIVCg!010?(1ONa4

literal 0
HcmV?d00001

diff --git a/scenes/one_sphere.py b/scenes/one_sphere.py
index 448b2e3..e8717f0 100644
--- a/scenes/one_sphere.py
+++ b/scenes/one_sphere.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 # Show to python where to find the modules
 import sys
 sys.path.append('..')
diff --git a/scenes/square.py b/scenes/square.py
new file mode 100644
index 0000000..4371d79
--- /dev/null
+++ b/scenes/square.py
@@ -0,0 +1,41 @@
+# Show to python where to find the modules
+import sys
+sys.path.append('..')
+
+from camera import Camera
+from scene import *
+from light import *
+from raytracer import *
+import numpy as np
+from matplotlib.image import imsave
+import itertools
+import multiprocessing
+
+def trace_ray_mutliprocess(t):
+    (i, j, camera, scene, nb_reflexion) = t
+    return np.array(trace_ray(camera.ray_at(i, j), scene, camera, nb_reflexion).coord())
+
+(nx, ny, nb_reflexion) = (200, 200, 20)
+camera = Camera(nx, ny, 1)
+materiau_sphere_blanche = Material(Vector([1,1,1]), 0.2, 1, 1, 20, 0)
+v0 = Vector([-1,-1,2])
+v1 = Vector([1,-1,2])
+v2 = Vector([-1,1,2])
+v3 = Vector([1,1,2])
+carre_blanc = Quad(v0,v1,v2,v3,materiau_sphere_blanche)
+scene = Scene()
+lumiere = Spotlight(Vector([0,0,0]), Vector([0,0,1]))
+scene.add_object(carre_blanc)
+scene.add_light(lumiere)
+affiche = np.zeros((nx, ny, 3))
+rows = list(range(nx))
+columns = list(range(ny))
+carte = list(itertools.product(rows, columns, [camera], [scene], [nb_reflexion]))
+
+if __name__ == '__main__':
+    pool = multiprocessing.Pool(4)
+    affiche_map = pool.map(trace_ray_mutliprocess, carte)
+    pool.close()
+    pool.join()
+    affiche = np.array(affiche_map).reshape(nx, ny, 3)
+    imsave('carré.png', affiche)
diff --git a/scenes/triangle.png b/scenes/triangle.png
new file mode 100644
index 0000000000000000000000000000000000000000..4903dab3f31361c73814004329e1137c9c72c6d7
GIT binary patch
literal 1541
zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Bd2>3~M9S&0}C-U@3O;4B_D5;Hcq9>0n@B
z;4JWnEM{QfPXuAc752+B85mfXd%8G=RLpsM_jOTlsmQU1p~tgR1lS6uJT#CwwX{IM
z)kQ?mMeowDg}qlwp1-|k{d>xj%CxM7y19>@m}mc;yv26as>w`JwWi-$8&rikSeP0e
z6a)q{Rm3sxTrFeSbcb&@Hg6XH^}FgF_kj;#fij_2AE$?w8a-~kS;%x#+5fdk*W%6l
z<=6gGo^X$4llr`?Q4*nFU$}NAdo$fEe13i9=SG`93y&BwG`?B!IdM(gdjARkV=9<)
zIa7{r;e34Xw2>{F(gfK{CFeROH?QSPVc)|0c*UxB|3gCm`;_1OHrGKcCs<<j_1X81
z7qDy!IDbB_ob&O$)kWVVW;lqYnVRnM>)UOAeY%B>g@r_;&XHeMsavDi8qef(7`)q~
zC!DOpG&AtB<>4n0VvT1M<{Iy6DGUkSem~^%-CgGtn*~m^>}o5#`8)4_)N;X&L=&c&
z4zr8h?q^6$cW}G*ZO%p03GeSsTWQGH*t6uV)z#9iMwZJ|Cp0cC&02Bw)$RMQA0517
znIgg@d1Auz9<%&xSCeSr6AZJit=!18^Xs}hFVs~g=;nN`aGPIW{JCG~_z{*%&euz`
zrd&Ps%Y?JB<VyNnDWwV0@4W?#1w6cS-_MoGzMCY+wDZV?*CF#8*41m=ce565%-Qhr
zx$jv)kL+`*&B7kdxpHr$t)^wmpB5HMSD8?J>(7@7n#@0+trt3ah9zkB^_9!E`|iy%
zT;I&M<mK{({h}V%Hy^+1pIW7J;2@jP5yhG_nTL&JViczP_U<$PrI@_))6P3<cMGtK
zpP0P)y8fzH7g^%p*M{D;`2D$k)vmgCwewfKdbM+Zy`FGNCf|p1hh=9d&R;*rZ^GoQ
z)4y&n{W;_Dm;Wukd>^J)*sZ)AefpPf_U-A*qO;HU@BQ?>B7D9dpTUHwhDwq~2Gbri
zFt3!#pOs^s=y&ej^VB@{a*zCNQ5Saq3;Q^^XwAKRc00#wvf)=B&#J#`RsHkX;}h4X
zpXOL{F(CVTYIbP%?uF~-x;~09;?}<AR(pM&WM@W!+KHvtuCMEBf1Atyx-_Wt@A;4G
z)p~s<T)X8r#g6^^viiq-4XOr?R<mDzoGkrbeP`L9`J9)$uYW$tarr=HvXI(|u(0Qo
z?Ve9E^IsBGefw;=aIAh9i%|#X^>xuoGbf2=8@$fGejz)w|9m>{?OB{gJHBMp+zx#+
zssH!4?cMQVJc|t+-8RqCIRDtabUx3!e{&~s8ts}m@AlWbw>{S%U1;Q}W_WCK>)ViE
z14p%~@5J5}hJXB??`OX@%uRVhWJzsQZO8L(`e);vOqvBwtZB2FZy?rqX5Hz{t>$~)
zpL_jM|65~$M|_X$pMR5?6Pk4V&gcK$`}@`D<r_+Q-4wc~D&5?Wb+`KJpOr7pc5ThL
zwr=N41?$Aix2_s^zWZ-+z4eYa(@o9X`C;b+ST+^+y-w1|p8VwC>7RP{<`uHtjFdg6
z-sY9BcH&(2EDiNg{`fOhE5Efmd^=Vc8?jZcGbK7~&E8GF{zg8(ruX`4n9qd0C3$bH
zzDb-i^O>;s+4pt1uNmsy6}O}xZ5rgI7SqA~N(-wr4*uJ5fq{X6!PC{xWt~$(69AvS
BiqQZ7

literal 0
HcmV?d00001

diff --git a/scenes/two_spheres_processing.png b/scenes/two_spheres_processing.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e826b11ab21bf10d09e3815d63b7989a70ebfe5
GIT binary patch
literal 28201
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

literal 0
HcmV?d00001

diff --git a/scenes/with_multiprocessing.py b/scenes/with_multiprocessing.py
new file mode 100644
index 0000000..cb2dcff
--- /dev/null
+++ b/scenes/with_multiprocessing.py
@@ -0,0 +1,40 @@
+# Show to python where to find the modules
+import sys
+sys.path.append('..')
+
+from camera import Camera
+from scene import *
+from light import *
+from raytracer import *
+import numpy as np
+from matplotlib.image import imsave
+import itertools
+import multiprocessing
+
+def trace_ray_mutliprocess(t):
+    (i, j, camera, scene, nb_reflexion) = t
+    return np.array(trace_ray(camera.ray_at(i, j), scene, camera, nb_reflexion).coord())
+
+(nx, ny, nb_reflexion) = (1000, 1000, 20)
+camera = Camera(nx, ny, 1)
+materiau_sphere_bleue = Material(Vector([0,0,1.]), .5, .5, .5, 1000,.1)
+materiau_sphere_rouge = Material(Vector([1,0,0]), .5, .5, .5, 1000, .3)
+sphere_bleue = Sphere(Vector([0,0,3]), .8, materiau_sphere_bleue)
+sphere_rouge = Sphere(Vector([.5,.5,2]), .5, materiau_sphere_rouge)
+scene = Scene()
+lumiere = Spotlight(Vector([1,1,0]), Vector([1,1,1]))
+scene.add_object(sphere_bleue)
+scene.add_object(sphere_rouge)
+scene.add_light(lumiere)
+affiche = np.zeros((nx, ny, 3))
+rows = list(range(nx))
+columns = list(range(ny))
+carte = list(itertools.product(rows, columns, [camera], [scene], [nb_reflexion]))
+
+if __name__ == '__main__':
+    pool = multiprocessing.Pool(4)
+    affiche_map = pool.map(trace_ray_mutliprocess, carte)
+    pool.close()
+    pool.join()
+    affiche = np.array(affiche_map).reshape(nx, ny, 3)
+    imsave('two_spheres_processing.png', affiche)
-- 
GitLab