def get_ray_through_pixel(self, col, row): w = self.screen_width h = self.screen_height return Line(vec3(0, 0, 0), vec3(-w / 2 + col * (w / self.hpixels), -h / 2 + row * (h / self.vpixels), -self.distance_to_screen))
def test(): epsilon = 0.0000001 radius = 1.3 s = Sphere(vec3(0, 0, 0), radius) l1 = Line(vec3(-1, 2, 0), vec3(1, 2, 0)) assert s.intersect(l1) == [] l2 = Line(vec3(-1, 0, 0), vec3(1, 0, 0)) expected = sorted([vec3(-radius, 0, 0), vec3(+radius, 0, 0)]) got = sorted(s.intersect(l2)) for e, g in zip(expected, got): assert (e-g).length() < epsilon l3 = Line(vec3(-1, radius, 0), vec3(1, radius, 0)) got = s.intersect(l3) print got assert len(got) == 1 and (got[0] - vec3(0, radius, 0)).length() < epsilon
def test2(): # Assume we are two screen widths from the center, and we have square # pixels. hpixels = 200 vpixels = 100 distance_to_screen = 2 screen_width = 1 screen_height = screen_width * vpixels / hpixels scene = [Sphere(center=vec3(0, 0, -5), radius= .5, color=colors['red'])] img = render(scene, View(distance_to_screen, screen_width, screen_height, hpixels, vpixels)) img.save("out.png")