From 350227b30d8afdae14167210a33b8b87f4a39af3 Mon Sep 17 00:00:00 2001 From: Benjamin KOLTES <benjamin.koltes@student.ecp.fr> Date: Sat, 5 Mar 2016 15:02:02 +0100 Subject: [PATCH] v1 --- 1.py | 14 +++ __pycache__/camera.cpython-34.pyc | Bin 0 -> 771 bytes __pycache__/intersection.cpython-34.pyc | Bin 0 -> 1151 bytes __pycache__/operation_vector.cpython-34.pyc | Bin 0 -> 3882 bytes __pycache__/raytracer.cpython-34.pyc | Bin 0 -> 513 bytes __pycache__/scene.cpython-34.pyc | Bin 0 -> 502 bytes camera.py | 16 ++++ intersection.py | 37 ++++++++ operation_vector.py | 90 ++++++++++++++++++++ raytracer.py | 7 ++ scene.py | 14 +++ script.py | 7 ++ 12 files changed, 185 insertions(+) create mode 100644 1.py create mode 100644 __pycache__/camera.cpython-34.pyc create mode 100644 __pycache__/intersection.cpython-34.pyc create mode 100644 __pycache__/operation_vector.cpython-34.pyc create mode 100644 __pycache__/raytracer.cpython-34.pyc create mode 100644 __pycache__/scene.cpython-34.pyc create mode 100644 camera.py create mode 100644 intersection.py create mode 100644 operation_vector.py create mode 100644 raytracer.py create mode 100644 scene.py create mode 100644 script.py diff --git a/1.py b/1.py new file mode 100644 index 0000000..849cbdb --- /dev/null +++ b/1.py @@ -0,0 +1,14 @@ +from raytracer import * +from scene import * +from light import * +from camera import * + +class RenderSetup: + def __init__(self): + pass + + def read(self, filename): + f = open(filename, 'r') + string = f.read() + f.close() + return string diff --git a/__pycache__/camera.cpython-34.pyc b/__pycache__/camera.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd826e474bf65093d2ed713bc690c7f9b6969846 GIT binary patch literal 771 zcmaFI!^>4#To$&Lk%8ec0}^0nU|?`yU|=X#WME)OVPHsMWXNG)2ystgVn|_TXkh@6 z%}fkYj0`C(48fYLFF|@W8E-LaC4*Qn%mgz=gMon|l>w}tfgy?sWL^pr$ebu<kWnct zU^WXw3M)gfCfhAG=fvF9qQqnts6ikaWR^3?N%9N~3^j}lH4F^#3=B0)U<M;Y4KtX* z1afV#CZnGw^DXYo+{E<M_`IV0@?tnAIX|cP7EfA!a$-(=PHJ9yNrooNEtcZcoU|g4 zEk&#h3=C2HDVfD3iFwJX@nD6iD;bJ77#J9S8R=)_=cejsC+4N+=j*%VCzs}?=9Lud z2UM11<mc&o1{)fg8R&<&80sg3J)l=md5a@HJ~J<~Bt9Nwd@&oyM~s||oQzfc5KrpC z<dZ>x4w43`0VxLi))VAg28Jwf97xqNgT2noAW_52AYID>@^cm=C^*4V%%JdqNU<`M zFfr7yFx0Su)i5(OGcyEhGWop(g`*}5!n3#7!cvn<@{5W<)@rg9u`@6*++r@uFTcf{ zoS$=xG4B>*#Vy84Z~#CEPLK+=qQuJh#1as@m<!};MqWlfFs|Z-dJLk%Pm>iC26>6O zsqyi*xZ>k;^HWN5Ky04)_`=e}9EeO2$dDo-1_nq_Lu>*CdJ)KqB2d_Xa4{%gco=zD t!6JT|Ot%E`3sQ>`OEUBG;>#c&0jWdM4>#l%hYiGTJ4R4C0tEyY69AZWpf&&i literal 0 HcmV?d00001 diff --git a/__pycache__/intersection.cpython-34.pyc b/__pycache__/intersection.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09c8a08fc88f9354199cbafb2f76f1706f17932c GIT binary patch literal 1151 zcmaFI!^@RdTo$&5nStRk0}^0nU|?`yU|=XVXJBARVPHsMWXNG)2!XN~8A9Asm>5!+ z8Cn=XWHS>(6ca-V3quMkNF<7xA%%@0Sd;xF$V5%XTZ~%CAQlWW!3>vSU|>jPV2EM_ zSphPEks*Z%W&$%quqMkb9?!gz)S}|l<dV$%ykr)r5g;05iZjTG@(c_NHH-{33=HuM z3^hz(1|vfaGnl~yGCEk3(NB~47DqvTaVE%|TWopxMY)MNx7hNNvQm>vG+A!36sP8- z6@knxVr5`pC}Lw^U|7je#KFM8@XJC!BR@A)KRYomJwIRHB|o_|H#M)MSU;e$BqKjh z-!s_I$jm@L#KllQ6Uni91(mlr;^Q;(GE3s)L1q?%%w%BXWaMP55=Hiw9!!;=CJRVQ zUSe))eEco0`1suXl+qj!n<qZLurx6TB2&Z#av{iRVD~`?PLLQV+CY9N1_cfeV-bj- z3}S=Ajfa7O0VD|yG)qQspk*;I)G~oWFN=|(mYJc12^46}j0`2r4A~qEMW&233=CN; z47DsE@hnz`T2^qtGBb$OvVp^zg+Zd09h5vk;myt<B2vr2P{R&FA~mcaabbyCPKFu| zFf)aTp@xk?q=u70M5309p@s{Tc(Pd-iuQt3aD(_P48jsAj9_KbH5?2uF>#n!Iuk=J zH$$E}OfwTh(LJzcxB^D70yc(p1`wl!jiH8{p_vhE6B9!*2V)64k_ZDs5f5Vu14D2L z2dbzBLLEXbI1ii|f;CzFUV=jPB`7$H7#SEqmVtu!fxRYY6kl;kVo^zEUV3~%er8_D zEzXq8B1rnZ#ZppPka~+PxF937DD@Uwa%x^lQEC)hQDRDFY4I)QoYcHq%(;mbx0rJ? z^E7#)SV76NB#OBxvGNvU{w>CwB4GvwhFgq9w-^(nSW+_6(rz&(-C|6>#hQ|uQ<8X# z2RZ#gk_9-GfYQb-PPil&DA#C!+zU>OLST}Mk&BU!QHW8Dk%!Tck%v)~iH%W(k%du+ zk&CGal*RlsS)v5;3sQ>`L0KriEH$|#zbJ~eI5{;h6`at(s*r3&Sj}MrNyv7fpaN$D KE=DdUVKxADp6<l} literal 0 HcmV?d00001 diff --git a/__pycache__/operation_vector.cpython-34.pyc b/__pycache__/operation_vector.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483f9b840d48d805517698b88bcdc3b8bf1b2a1b GIT binary patch literal 3882 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 OBnIrjfdJAf90367gNJSa literal 0 HcmV?d00001 diff --git a/__pycache__/raytracer.cpython-34.pyc b/__pycache__/raytracer.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..582256ac81b09f05d7a902c4757bc47e0a6d1368 GIT binary patch literal 513 zcmaFI!^<UbyFBbT0|Ucj1|-1Dz`)?Zz`#(f$iTpm!oZNi$dJRp5aOP~#E`<w(82&B zo0%A*7#UJn7=krfUxM^%GTvg;N(QlDm<eW#3<Cp0Dg#(O149%O$h;ILkU3GzAftjc zS#B{0B~~Vb>;-8C(ICyvAU7y6Fff!bFw`(IG&3^PFfhb3g1JmEE)&Rw!J3SIn#{M@ z!cvn<@{4Zq6_+Fym1O3n#~0*h=9S#yOvx-tO)kmI&(mbS#ZsJ_lUBsaz`#(%#=yX^ zlA(x$fq~(dseVR&ZmNEEVqSWFzP?L-a%paAUP-ZjKxIirexAN(u%VHefqsaKp?*<f zWl2$Da%z!YLFFxu`1s7c%#!$c7La2>1Op>KV--(OVx=BT%1@I8q%JQpH#I)~7FT?H zZhlH>4v5VYA75CSm;;e1;sUt|<QTAvAOt5!3=|+BTnq{o9>yXN+fS3}mOy?%YEdG{ fU-4yNpMzx}8WHAzjJU;N1F_VO5#&ygIb2KtcqeW~ literal 0 HcmV?d00001 diff --git a/__pycache__/scene.cpython-34.pyc b/__pycache__/scene.cpython-34.pyc new file mode 100644 index 0000000000000000000000000000000000000000..605d82c4b0b82ab45d83dd2e7cee91a0972dadf7 GIT binary patch literal 502 zcmaFI!^?I5c6rzl1_p-53`l^Pfq}t+fq|h|k%56Bg@GZ3ks*hHA;dj}i6MoVp@jiN zHZw6qF*2mEFa&F|z69yjWW2?wl?-CRFcZue83qQ1R0gnm28Jjmka;OgAakOaK}H2@ zvfN?|F33nNN=*h?4bl&yLHeCR&H(8zVPL3XWN2n&s9|7;XJn{h0yCIE&I{IL^wVU% z#TJ&DT#{dOi!C`ducRpT7F$tbN@i)XCi5+p;?$h9Tdc|X`9&#FtVM~H`FSfDiZ~e< z7=9V*XXNLm>SrhBrRV4CyW}UA=BDPA6zd06mSp7T>3aqn8krgBhqxH(7bmCYrRo(_ z-r|Ul&&<m#iH~OixeY`xF!D22@k4x|2b1;FWC1D7OUzA;kH5tgAD^3_Qknx|^Tfv& zmL}#vWQw>M7$9x|I|xE>fy6*T0K&zfaNuDq0<rxxnQjT>7o-*?mSpDV#g~D743>dt Z<OFF16CfjQao9jCwPOT16=V(<695dsZms|T literal 0 HcmV?d00001 diff --git a/camera.py b/camera.py new file mode 100644 index 0000000..3074d0d --- /dev/null +++ b/camera.py @@ -0,0 +1,16 @@ +from operation_vector import * + +class Camera: + def __init__(self, image_nrows, image_ncols, distance_focale): + self.image_nrows = image_nrows + self.image_ncols = image_ncols + self.focal_length = distance_focale + + def ray_at(self, row, col): + n = self.image_nrows//2 + x = (row-n)/n + n = self.image_ncols//2 + y = (n-col)/n + return Vector(x, y, self.focal_length) + + diff --git a/intersection.py b/intersection.py new file mode 100644 index 0000000..ebed369 --- /dev/null +++ b/intersection.py @@ -0,0 +1,37 @@ +from operation_vector import * +from scene import * + +class Intersection: + def __init__(self, position, normal, object): + self.position = position + self.normal = normal + self.object = object + +def intersect(objet, ray): + o = ray.starting_point + l = ray.direction + if type(objet) is Sphere: + centre = objet.centre + r = objet.radius + a = l*l + diff = o-centre + b = 2*(l*diff) + c = diff*diff - r**2 + delta = b**2 - 4*a*c + if delta > 0: + intersection = [(-b - delta**0.5)/(2*a), (-b + delta**0.5)/(2*a)] + elif delta == 0: + intersection = [-b/(2*a)] + else: + intersection = [] + if len(intersection) == 0 or max(intersection) < 0: + return None + elif min(intersection) < 0: + return max(intersection) + else: + return min(intersection) + + + + + diff --git a/operation_vector.py b/operation_vector.py new file mode 100644 index 0000000..d29e644 --- /dev/null +++ b/operation_vector.py @@ -0,0 +1,90 @@ +class Vector: + def __init__(self, coord): + x, y, z = coord + self.x = x + self.y = y + self.z = z + + def coord(self): + return (self.x, self.y, self.z) + + def __add__(first, second): + a, b, c = first.coord() + d, e, f = second.coord() + return Vector((a + d, b + e, c + f)) + + def __rmul__(vector, item): + d, e, f = vector.coord() + return Vector((item*d, item*e, item*f)) + + def __mul__(first, second): + if type(second) == Vector: + d, e, f = first.coord() + a, b, c = second.coord() + return a*d + b*e + c*f + else: + return second*first + + def norm(self): + return (self*self)**0.5 + + def __truediv__(vector, scalar): + if scalar == 0: + return float('inf')*vector + else: + return (1/scalar)*vector + + def __sub__(vector1, vector2): + return vector1 + (-1 * vector2) + + def __repr__(self): + return 'Vector' + str(self.coord()) + + def __str__(self): + return '/ ' + str(self.x) + '\n| ' + str(self.y) + '\n\\ ' + str(self.z) + '\n' + + def __xor__(first, second): + a, b, c = first.coord() + d, e, f = second.coord() + return Vector((b*f - e*c, c*d - f*a, a*e - b*d)) + + def __neg__(self): + return -1*self + + def __pos__(self): + return self + + def __eq__(first, second): + if type(second) != Vector: + return False + a, b, c = first.coord() + d, e, f = second.coord() + return a == d and b == e and c == f + + def __iter__(self): + yield self.x + yield self.y + yield self.z + + def __getitem__(self, key): + if key == 0 or key == 'x': + return self.x + elif key == 1 or key == 'y': + return self.y + elif key == 2 or key == 'z': + return self.z + else: + raise IndexError('index out of bounds') + + def __setitem__(self, key, value): + if key == 0 or key == 'x': + self.x = value + elif key == 1 or key == 'y': + self.y = value + elif key == 2 or key == 'z': + self.z = value + else: + raise IndexError('index out of bounds') + +def base(): + return Vector((1,0,0)),Vector((0,1,0)),Vector((0,0,1)) diff --git a/raytracer.py b/raytracer.py new file mode 100644 index 0000000..c831502 --- /dev/null +++ b/raytracer.py @@ -0,0 +1,7 @@ +from operation_vector import * + +class Ray: + def __init__(self, starting_point, direction): + self.starting_point = Vector(starting_point) + self.direction = Vector(direction) + diff --git a/scene.py b/scene.py new file mode 100644 index 0000000..df42a52 --- /dev/null +++ b/scene.py @@ -0,0 +1,14 @@ +from operation_vector import * + +class Sphere: + def __init__(self, coord, rayon, material): + self.centre = Vector(coord) + self.radius = rayon + +class Material: + def __init__(color, ambiant, diffuse, specular, shininess): + self.color = Vector(color) + self.ambiant = ambiant + self.diffuse = diffuse + self.specular = specular + self.shininess = shininess diff --git a/script.py b/script.py new file mode 100644 index 0000000..4f21b32 --- /dev/null +++ b/script.py @@ -0,0 +1,7 @@ +from intersection import * +from camera import * +from raytracer import * + +s = Sphere((0,0,0),15) +r = Ray((0,0,0),(0,-1,1)) +i=(intersect(s,r)) -- GitLab