def checkInter(self, objlist): min_length = 1.0e8 min_object = face(vector3(0.0,0.0,0.0), vector3(0.0,0.0,0.0), 0) for element in objlist: dest = self.intersection(element) if vector3.norm(dest) < min_length : min_length = vector3.norm(dest) min_object = element i_point = vector3.add_vec(self.point, vector3.mul_vec(self.direction, min_length)) return i_point, min_object
h = 240 PI = 3.14159265 view_angle = 60 * PI / 180.0 view_ratio = tan(view_angle/2) / (w/2.0) img_size = (w,h) im = Image.new("RGB", img_size, 'rgb(128,128,128)') draw = ImageDraw.Draw(im) ## objects in virtual space ## ''' set light ''' light = ray(vector3(1.0,-1.8,5.0), vector3(0.0,1.0,0.0)) ''' set eye position''' eye = vector3(0.0,0.0,-1.0) ''' primitive objects ''' obj_list = [] obj_list.append(face(vector3(0.0,-2.0,0.0), vector3(0.0,1.0,0.0), 255)) obj_list.append(face(vector3(0.0, 2.0,0.0), vector3(0.0,-1.0,0.0), 255<<8)) obj_list.append(face(vector3(-2.0,0.0,0.0), vector3(1.0,0.0,0.0), 255<<16)) obj_list.append(face(vector3( 2.0,0.0,0.0), vector3(-1.0,0.0,0.0), 255 + (255<<8))) obj_list.append(face(vector3(0.0,0.0,10.0), vector3(0.0,0.0,-1.0), 255 + (255<<8) + (255<<16))) obj_list.append(sphere(vector3(0.0,0.7,5.0), 1.5, 255 + (255<<16))) v_percentage = 1 ## each line ## for y in range(0,h): if v_percentage <= y*100 // h : print str(v_percentage) + " %" v_percentage = y*100//h + 1 ## each pixel ## for x in range(0,w): screen = vector3((x-w/2)*view_ratio, (y-h/2)*view_ratio, 0.0)