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