From 1b07758eaea2c648ce02a999b2095a2249dfef26 Mon Sep 17 00:00:00 2001
From: Benjamin KOLTES <benjamin.koltes@student.ecp.fr>
Date: Sat, 5 Mar 2016 15:02:38 +0100
Subject: [PATCH] v2

---
 __pycache__/camera.cpython-34.pyc           | Bin 771 -> 787 bytes
 __pycache__/intersection.cpython-34.pyc     | Bin 1279 -> 1279 bytes
 __pycache__/light.cpython-34.pyc            | Bin 961 -> 1009 bytes
 __pycache__/operation_vector.cpython-34.pyc | Bin 4015 -> 4704 bytes
 __pycache__/raytracer.cpython-34.pyc        | Bin 591 -> 1873 bytes
 __pycache__/scene.cpython-34.pyc            | Bin 1478 -> 1466 bytes
 camera.py                                   |   6 ++---
 light.py                                    |   7 ++++--
 one_sphere.png                              | Bin 0 -> 6359 bytes
 one_sphere.py                               |   6 +++++
 raytracer.py                                |  26 ++++++++++++++------
 scene.py                                    |   4 +--
 script.py                                   |  20 ++++++++++-----
 13 files changed, 49 insertions(+), 20 deletions(-)
 create mode 100644 one_sphere.png
 create mode 100644 one_sphere.py

diff --git a/__pycache__/camera.cpython-34.pyc b/__pycache__/camera.cpython-34.pyc
index dd826e474bf65093d2ed713bc690c7f9b6969846..792f368305503a061e7064d9fe99759a111bce47 100644
GIT binary patch
delta 194
zcmZo>o6HvXj)#|vi+5_+7Dfh!#|%h-nSp`9fq{XcSe=1^A%%e<g^?kLfgzWXA&QZK
z(LIHUA%&Ttg#ko1GciOlF{H3C1Z%Rs1eu`8c#AD8HMu0eXk#!dBct);NJcL)9|i`7
z8U}_eut`$2%nUWm3^k0CcQP8YrZF=#GfsZTD8^dE#K6EXnTM&BQE>7kCIboPTLSq7
YsYQt;nfZC~Wnd#AO0F{LFbOaL0N!RM=Kufz

delta 201
zcmbQt*31_Cj)#}4w74v6Eh7WNV+JI^%)r3lz`(#ztjNH?kix)_!pM-rz!2h|!o-lm
z%+SIBBAb~Qq8J%cSQvseSzm(mYBJtp)Y=%w%E)LqIfc<n%#(qEp@xAW3#?tLmYJc3
zk)eip@)1U3g=S`kU`-~!mrM){44N!OEDQ_`MXU@A47b?AQj<&aizbURwK57#p37t)
i%5+O0zaX_Ju_QA;FTM;cTf{thE|d7=e@wzmTucB%jVcBJ

diff --git a/__pycache__/intersection.cpython-34.pyc b/__pycache__/intersection.cpython-34.pyc
index ce45d81abd4216de5f6724547e34233a307f722a..48d1d03c1c4b208c1a94e28030de92106bd258d7 100644
GIT binary patch
delta 144
zcmey*`Ja>h9S<*;aA@yFc6UZb<IVnz$xKSO_=-ysi%K%{(&G#AGxJJrai(Mzr6!kT
z=I7mFDXA<-jhcLgSxxa4OJ06aZV@vB1H&yY5Hm3+vnn-3lQ)VrKPfA<<kn<qmR@xw
q1_lN{O_o~%`30#(i6ArL%Tkj|@{4Y<7AL3XrGoVrDNR1lVgLYN;4$w2

delta 144
zcmey*`Ja>h9S<+pv!~q~+1(i#jW+u;CNn8T@fDXO7L{b?rN<ZKXXcgM;!MdbN=+`w
z%+I^UQc_uvdTa6(W;Mkqmc0C;+#+TM28Jju5Hm3+vnn-3lQ)VrKPfA<Bx<rWORu^-
p0|SGfCQFn+enDzcBFK#Rvee{~{Guq<;^fr4RIvUc`N`*53;>AiFv$P_

diff --git a/__pycache__/light.cpython-34.pyc b/__pycache__/light.cpython-34.pyc
index b02808540f9d300cadbe77fbc522f8dab99b25c5..2c5c24287247609d3dab3d207689a77f08f299d3 100644
GIT binary patch
delta 246
zcmX@e{*j&Y9S<*85AW2lvW=XQjEu&Ul^G}T@iH(lurM$%I5RLX6wjG_n6X`{mWQE+
zhoOdnA&ZTnhM6G?%n%j{)@1T~$;80GpvgWtl*y94h#AD@ojifbp7|DI=H&BCYKcM&
z3=9m6JRry<%*ewi#wfrf$5bTEz`&3U(h8CW(I5=AQG|hkp@tD`2P2HZ#2^x^$>^ua
zT*Sk`z;KH_F*hkQF|Pz{-(**2eR+_kVvrFGj772x3=ANpj0_A6V0(&WCpR#PPhQ0=
H#>fW%{Q4*c

delta 197
zcmey!evqB>9S<*;*}d*C&5fLrjEqK;l^G}T@h~tjurM$%I5RLX6t_-3%-GHytjXl}
zl8J$VL6dEA4wEI5CeP$GO!kxCF{uRzFfcGMF!F#PlQ1I>qZp$AQ;`${14A-MJxCHn
zGs4W{VqjpXVPwc+V8~)*2-alu(_|_FSs2Bhn46TDnpZNplv!V12xK)#9|L2NGy?;J
ZpC)q=$Oy2(MbeWS7{w>wVisfM0RY)fAj<#%

diff --git a/__pycache__/operation_vector.cpython-34.pyc b/__pycache__/operation_vector.cpython-34.pyc
index 0a79b5b1543fbe633d1c9a6b7a13dfe5b2dd286f..b4fddc08c6eb3ea624590739f481c8628ba886bb 100644
GIT binary patch
delta 2220
zcmZ24|3Ibw9S<*8PE>E0A~yrWV+JI^%)r3lz`(#z?9ITykix)_!pM-rz>v$p5XHd2
z=$^vFkiyK+!T=(hnHZuN8B$mnQdmJEQA`XeYz!&vU^X*D3I{_9Cz#E`kix|ftjYZn
zWQ!)_Ew-Y>Jn5AD+++|RhM8d2GB8d|ekq-z2G%OdkfP3zq5)=$F{EfR1Z!$d_Gio!
zVqsulC}IT>YzzzxD;bJ7C!c53VKkonhf$7^WwJC=xE87sO~xX2kaA8q!3AP*FfcH1
zO`gM~Cz{2;z)-@#P{YX3%*ar}$dJv%P!v5mjzxR&4<>o78n8?WGea{2gNS&rCZnGw
z%Pp3Y%7WA)P=FPI%(=yqpO;!ZS&dmm6V;Ym?D6r5DJk*syr6Ie*~`Ev#3;%r$|yfM
zpE=bDq#10CChIM>vee{~{GwYdnI);YMZzFAihu}F5P@baM|^xyZfQ<@yvSrR7BzQJ
z5Q4BX$QF>95J!VuTLjXo$y6i`GDZSKfCRvzMIZ;=0+|JNqr_xIb}{C}l$6PaER8`$
zJRr4jFKTiW@qq;RK?IuP1VCbfAVLU4pqbAe9}jk_^ki1nP(_d=_87Uvl9ykUt30`y
zHIAu>aq?|eNllQOqu7d*6LS)aAT9=Jhd7%%KE9-=G&Lo&EIwXsvMigAwHyNj!^{8w
z|NjRo)nvNG4hd017{drG0U^L%XOE9BE=`J$*O_d<DLQ#4o4Fy#znV<9n2Sq_z%h%%
zsh}`REhvhQ*PpD&-fXN2@-{K44wN2>ON!#-jled(VQ=FGMHeIqa7>=aA*uroLbLz|
z`x;EZoL!M$6d!Loc^`+19?088iXaz&RN!zhdwhIeYI=OU)no%s8x{Nt3-XKO<83ET
z;G8Rfo(4cJ)F#4(Z1M4_h4JwYlWVzR^@$1?j`;Y@lGLL3c=ySi+^eJ*LH+@21bYvZ
z-(P}KcoEy=v)t0oU>T5L5vUNj#pRiol3L+fRFq$&$pp^rx0th2D<Lrr@+>^bq^FjE
zvR8b(&tz?$BiO7d(gRtI&6*;81_lOAX0Z811`G@gw^+*(b4pXOSW^tMCTwy#uXa7i
z<)GpY<YJK1!THpYfq@~NfuWX(p+XN_{(uXbW+n!gSXqV`CWcyOhFTVe8YYG;Mur+@
zh8h+Ik!D5)#zHZM@De7FcrzmdxHw|I#axwHaEmRmpdd9b1(KFni<Cg#PzJlwEiE%I
zF{cP*Go<7M2ML&frKf`Y^7!}!Sn<KY$i^tcD9TvH7X~hq^y1?S^2;ap^BSnjfWiQ4
ziF%6*lz$U*GOJQk(k4ISm1h*6%*Ll$&kb@2IF*ZmSdt(@3PebQ2#|S23LusWh)@F&
z8X!UwL}-BsZ4jXYB6LB7A&4*r5#}Jm0z`oQf*?S?0*3=L1A`DlF~~d~MjkdEW*&AP
z79Qrw8~CJHc-V@VC!gVSs0Sx7P<qp3E`qa*paLKYA*#s?7KacZwVI4zYmia^*byN6
zZ?PmL7N=%{f)pJ6j72sK3=AkWA1Fec>p?0&p-{pAs(hMJ$#iB=r38*<CWuua!?4>|
zl$e*212PSygn_Zh7OQ<A1t9m8FfgPrF*GyQGX!fg`+@xk3jmPMAOg6(R|Klj@<E0{
wZ3FTBG+B#4T!>3S{slV%tQM=AIc##p^HWN5QtdziT?|Sk0!+ebJj^`I05^<sc>n+a

delta 1668
zcmaE$vR*#<9S<+pp^)CNLQV#T#|%h-nSp`9fq{XcSeb!=!99h6A%&5l1xz+GF+?#i
zq%bk0FoQ&*7#UJn7=krflaX{YFu}CHV3;`TC3CQ*+T?kRc|suJB9PHVEDQ_`D;bK|
zC(AMEFd9wvW|CuMnw-THu7#>Zld*`Efq|ij9Zqn7SZoXo3>=eRGwCsUPX5GUI60PC
znqQOAPm`$#BvZu5z`!th5wnUas<vC~@$rc%De>{#Adi7mGBAoVicWsdoazMPf%R#!
z-eN0DO)kkVy2X-NlA2q@53*1IL<oWiG$T3U<BM`jbK>I#CQoBgo2<@S7JQ4Pq_Q9t
zY#7)%njA%3Ae|sv(M{t4N$`RQJ`jOsID33N*ldx>?^#0?L6X?R;}%O^eo?N><W#me
zmzSVuxW$~Am-Z4A44RC$SkrRy6H7Fiii8;$7^2vUlM{0ii_k*!7I%DnNl|HPN@iJn
zy!>Q#b{}hL1_p+g|NsC04_2zl6vYk+7DE`r2rL01K(PV}-r~}v_;}UH2RXzhFJU(`
z1iOIg7ISe)5hN(EM&~V1Af^@+#m8$*=H_TNRsaPBG3fwoV@Xkby!PaS9J758aflq^
zXhDoWI@#mnEAort<Mk%5;B?Ug1woM<$TfJvo;^N3FEu?r-gxps4$;Z_T<R+L6&K_e
z$H$w2758&>1c-r*2Za+PfXH?^TYP+KVSK#h<aF*>eWC)7BR)Q}B(*3$-eK}*?p5`Y
zAcuf8g1rsOr7yu;P*$xH&df_mtx(7>Em6o%Q%K4$%}XiPWGMnG04W7$=v!Q#AXTnK
zMfpXVOyHb*i#a>B5|Tzh!BPZHDBSV!>8T~4+!Y`13d)Oo3=ETHc=uv+Ly;!PUBtVg
zNQ;4iL6aG5d66~)1H&!Wvc#OyR4i^NhPlBX=7tD9mB}vry6O@jGq9&sE>KoW%*m`u
zO^KX5gI}Iebn*^<)p|~lE5Qj+2*eTv5#k^MWK@wXh$Rmq6hQ>2Of6CYu~b2X8i-H_
z5gH&u2Sn(B2z?L%4mJb<3cw;zdI8~LkRd#bJZx+{%si|-ER*vDq?n2rC-(?A)PrLY
z6selbMR0ZzQ~*RFL^YYg;t&F)R+ABI1yY!S9RRZX7E4lMacT@G#6XeHz*uC=z`y`1
idO;2XbHLhEz$AnK>*KJ=%}*)KNwov1D+cKmjs^g*qbYy@

diff --git a/__pycache__/raytracer.cpython-34.pyc b/__pycache__/raytracer.cpython-34.pyc
index a55b6635259f896d52b898063ac511914cad7b30..541ae3bafce63d5351a9328de18fffded84bcccf 100644
GIT binary patch
literal 1873
zcmaFI!^?GDdTN*q8w0~*1|-1Dz`)?Zz`#&k&A`Br!oZNi$dJRpkjuyr#mJD$#1O^A
zzz7m$V#r};$Yo)OVuA3P8FE+|a@iQ7*dTlsh8%W=Tn>gP4u)J#hA2)3M)wp}h7>l2
z76uU6%)}7I#gM|zkir2HiQ;BR;bchR0<(D-Qn(p{HF;iwT&2l$OQ0YlKQBE#Gbg7s
zH#0A>B=we1Vs27qVqOW7m?q;b&dj`$)S}|l<PuHBTWn#e$tC$knoPG?6N`!xD{rw@
zr55EECxgs{VJ4VYWf&M3QW-!#Okn`|FolsJg$e8yW`-1IhG0#WTg*X;mC2y60ci%&
zAkEI8a1vu+V5nhas9|7;XJDvd0y7vvAs4L4=%>kai?6sOv8W_7FFn2>KQpi77H3Lk
zQEGBYW`3R~^DUO*)SR>;P6h^sA}$67hLsFOJPZsBzfAQr@^e%5vlH{u^Yisx@{>z*
zQ}arS^#dwPGV=5EJ%bI6%nbBHT#WUL5-UrJ5|dMl^a?6(am2@G=4F<|$FqYR#sYFG
zBPU}OPf%i|9!$zllLe$MFEKYYKK>S0e0*+xN@)&=%@ZGASelpvktyN>xe4SLu!|rB
zFG!4ofq{VyWIiYaco>U7e0a$4GcYi4GcYiKLnerkfgzoNp_ZAU1e}hV85wF>7%DPB
z!Ij0x;1V0hP|M0t!o*O+3JSGmCWcxzh8i|d*kv;_6v=?tS<E1*EEWcdELMhQ28LR8
zh7vZ08Wx5cb_S3J7AQNLiJ_<pq@k9Bp|FafPzHp;YgiCggH$YLC}9UhZ3+{JOlM|j
zW@HF1;b5rYU;tUf!H~rXHkFg1!WHaFE(VuaD~4Jwh8j+W5^jbXE+nNqU^XWfBb!+n
z%xgIr3J)=agG}aR$l_(l;$x`g1{ssZ5AsJ0Gea#8LoF{uEg#4Lke_%!X|0(F>_1*4
zHXoD?b*?6h-!10MytE=l1_p+gAVO2%7He8geqzZj?);>z)Z~)*oXp~qB2fI_;wZ>3
z&IBbka3Z_Kl9ykUdy6?YGp~ph6q%rue2WdD>lRl|W_kuxGbnOzv4K=4=G@}QO)N<*
z%1q3;#hRR-lV1d)@{3Y5`EN0UvsQ6(YF_Fsw&cXz)S|>FK6pL^yCaGtC9}9BF)umw
z7Gr)CM^S2VX--LE$t}i|DE{P}#Ny(3xcVYl1_p*(tYBwE@qn$0hqx_@IXS)pL{x%^
zDoAn!r%qmw7EW*;h%ZX4<OZcoC2-1TW8`5JVB}}yVH5+C0*pe8!i=Jf0*n@n{EVWE
zMXC%849Osmf|P@@A1En<Q|?Ako@QXkVqmCc0;fMla4Kd3=Wk|EnV1GnJD}v;%uvD%
z5^n~j=u%LMuE+rkfmMJLIUCpv7H~Re11B(ch7wj#M5lliLDMn^C?(WzfD&E}14A=2
zLoFvb!Ek^Q3@FL7f)Y5W^kraZWnxHUX0R!AX9zDeVE`rcU`-akm!S9rCk#zyFohsA
zId5@i<|d}6#^)8~mlwl1$@w|OMWFKH7Hd&rUV7>+wxYz!_{0)$zJ??cP&gIIF)%P_
zauq3pQjG!w149%?UVKhwdR}UA6jxq6D6aDIQj2e~C#I!kCTFDHV$8h7m=(nfG7Mhe
z70H8igCZF{0tMjZSbR}xUP>z1x?&Mf#4vI)ax#iC3Ns2b3NeZ@3NflP7U?lCF!*Wm
z7O8;D1I1tw$m6$o;3+9HKM#`r1@a40ixNQ@AifM-BY?dW#hO=|TTod9D#yT{hxiuk
jQIOe4&O;<J4jV{OX$Q)4#UODpMgc|vMlmK~Rvuvhg7}&G

delta 234
zcmcb}cb-N09S<*8@6+zEd?p5l#|%h-nSp`9fq{Xc*mk0_rlflcGeZgsLkk0lY-VDJ
zVr58SWeC<}o4D9&;`eF1YzzzxMeGa=3@aImI493y)R8pOFG{Q|DN0OEEz&Efyu}e8
zpP83g5+Bbx`97nQIX6f>Cn~`O;<7R@FtC8EWny4p;9)ER@%=Q}qF8e>(=$pYpJJ0W
f0*e)4(R_=;CO1E&G$+-L5o7|$O=64!Ov3yCb^R?|

diff --git a/__pycache__/scene.cpython-34.pyc b/__pycache__/scene.cpython-34.pyc
index 5ab218016de0b0e358a757fb5370f11787373659..958548fa5bf8dc8b725d4a0da95a25b99990d1b9 100644
GIT binary patch
delta 548
zcmX@cy^EXk9S<*;2>aBqJrg-k>DDkZ)G#o_GceRJff<YpHOycJ6GI9EL$D^JpC)q@
zTXJe%Nl|LlWFAHh4i*LmhLsFO?2~O6br_8&XEH{MaxyS56tSZc9FuP{M*FidKmdql
zVqjo!W?*0_He_I6z+-O>3)lh73^lA^1`FIJtdl#K^bOdGSV30tfe3yOApjx-L4**9
zKsba0#O0j)h)LIy3&i9G5j-FQtBXMrybKHsAjx8oYk3%pcqhMOl$@N%JV_L6DTdh`
zEFnrF3=9mn*b)m0Qu9(YnZT~Q#h8y2ARLqHSQ6w#LFS7wFfhQ?<e;ee%c570&6yG)
zeNrF-VLO-w_MR{U0|UtK#h@VOVdP=qVJ-rR`DwC53FH@~7A2Ns=I6zir6!l;7Zovs
Ti~;!(tOm(?h=G$=vC04d=gd_1

delta 537
zcmdnReT<v)9S<*8^_%Xn-4i)aS(Y#`)G#o_GcwdLff-B;HOycJGeZgkL$D^JpC(Hb
zS59VnMoDsheo@LTw&c{jlA_dGlNdEP*cccXRx%WEPBviFVKkZ?%NQ-n&A`A=#ED99
zO+L#Q9m2{00U(-*fq}u9fq|jekO6Fe3B(DE3?K#*$SoiSGsrC<1`9(C3s{O3?kKh*
zb_NE9$>mJ?+N?zaAo~PCgb;`j1`#440^txY5SM%MH6~q49uSikMDT$KtS$yg@G~$l
zfD9-Gxt52qh<~yT^J-C$wMZU>n)`=2L`jT+f#DWgVnIP_UWz6Y*nPJc^O4m~E@DZL
z7YCUw!N9-(SCfOH<|B)qA2ugSf%M6M2#}+YwSdG#85kHqAy5p86COq$79QpzkeHt)
Z%dN?|tm0B2-+)Dsbb<}ynmmtH1^_p~RK@@R

diff --git a/camera.py b/camera.py
index 3074d0d..a4e5e23 100644
--- a/camera.py
+++ b/camera.py
@@ -1,4 +1,4 @@
-from operation_vector import *
+from operation_vector import Vector
 
 class Camera:
     def __init__(self, image_nrows, image_ncols, distance_focale):
@@ -8,9 +8,9 @@ class Camera:
 
     def ray_at(self, row, col):
         n = self.image_nrows//2
-        x = (row-n)/n
+        x = (n-row)/n
         n = self.image_ncols//2
         y = (n-col)/n
-        return Vector(x, y, self.focal_length)
+        return Vector((x, y, self.focal_length))
 
     
diff --git a/light.py b/light.py
index cacff89..38106c2 100644
--- a/light.py
+++ b/light.py
@@ -13,7 +13,10 @@ def phong_illuminate(light, position, normal, object, viewer):
     R = 2*(L*N)*N - L
     V = (viewer - position).normalized()
 
-    return kd*(L*N) + ks*(R*V)**alpha
+    i = kd*(L*N) + ks*(R*V)**alpha
+    
+    return i*(light.color ** object.material.color)
     
 def ambiant_illuminate(position, object):
-    return object.material.ambient
+    return object.material.ambiant*object.material.color
+
diff --git a/one_sphere.png b/one_sphere.png
new file mode 100644
index 0000000000000000000000000000000000000000..7aed7ee4f5582aad31f2be17bef7755f16ff7f32
GIT binary patch
literal 6359
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
QU|?YIboFyt=akR{0AB;LO8@`>

literal 0
HcmV?d00001

diff --git a/one_sphere.py b/one_sphere.py
new file mode 100644
index 0000000..3925b79
--- /dev/null
+++ b/one_sphere.py
@@ -0,0 +1,6 @@
+from scene import *
+from light import Spotlight
+
+materiau_sphere = Material(Vector((0,0,1)), .2, .2, .2, .2)
+sphere = Sphere(Vector([0,0,3]), 1, materiau_sphere)
+lumiere = Spotlight(Vector((1,1,0)), Vector((1,1,1)))
diff --git a/raytracer.py b/raytracer.py
index 0f1a436..4b746b3 100644
--- a/raytracer.py
+++ b/raytracer.py
@@ -1,5 +1,7 @@
 from light import phong_illuminate, ambiant_illuminate
 from intersection import intersect
+from operation_vector import Vector
+from numpy import array, zeros
 
 class Ray:
     def __init__(self, starting_point, direction):
@@ -17,12 +19,22 @@ def trace_ray(ray, scene, camera):
             if distance == d:
                 class_intersect = resultat
     if distance == float('inf'):
-        return [0,0,0]
-    I = ambiant_illuminate(class_intersect.position, class_intersect.object)
+        return Vector([0,0,0])
+    color = ambiant_illuminate(class_intersect.position, class_intersect.object)
     for light in scene.light_list:
-        I += phong_illuminate(light, class_intersect.position, class_intersect.normal, class_intersect.object, camera.position)
+        color += phong_illuminate(light, class_intersect.position, class_intersect.normal, class_intersect.object, Vector([0,0,0]))
     color_object = class_intersect.object.material.color
-    color_ray = 
-    return [I*
-            
-    
+    c_x, c_y, c_z = color.coord()
+    return Vector([min(c_x,1), min(c_y,1), min(c_z,1)])
+
+def raytracer_render(camera, scene):
+    n_lignes = camera.image_nrows
+    n_colonnes = camera.image_ncols
+    affiche = zeros((n_lignes, n_colonnes,3))
+    for i in range(n_lignes):
+        for j in range(n_colonnes):
+            ray_direction = camera.ray_at(i, j)
+            ray = Ray(Vector((0,0,0)), ray_direction)
+            color = trace_ray(ray, scene, camera)
+            affiche[i,j,:] = color.coord()
+    return affiche
diff --git a/scene.py b/scene.py
index fffa1ed..ff44e7b 100644
--- a/scene.py
+++ b/scene.py
@@ -2,12 +2,12 @@ from operation_vector import *
 
 class Sphere:
     def __init__(self, coord, rayon, material):                                                
-        self.centre = lightcoord
+        self.centre = coord
         self.radius = rayon
         self.material = material
 
 class Material:
-    def __init__(color, ambiant, diffuse, specular, shininess):
+    def __init__(self, color, ambiant, diffuse, specular, shininess):
         self.color = color
         self.ambiant = ambiant
         self.diffuse = diffuse
diff --git a/script.py b/script.py
index eb61027..a15d386 100644
--- a/script.py
+++ b/script.py
@@ -1,7 +1,15 @@
-from intersection import *
-from camera import *
-from raytracer import *
+from scene import *
+from light import Spotlight
+from camera import Camera
+from raytracer import raytracer_render
+from matplotlib.image import imsave
 
-s = Sphere(Vector((0,0,0)),15,1)
-r =  Ray(Vector((0,0,150)),Vector((0,0,-11)))
-i=(intersect(s,r))
+camera = Camera(200,200,2)
+materiau_sphere = Material(Vector((0,0,1)), .01, .5, .01, 1)
+sphere = Sphere(Vector([0,0,3]), 1, materiau_sphere)
+lumiere = Spotlight(Vector((1,1,0)), Vector((1,1,1)))
+scene = Scene()
+scene.add_object(sphere)
+scene.add_light(lumiere)
+affiche = raytracer_render(camera, scene)
+imsave('one_sphere.png',affiche)
-- 
GitLab