def test_a_ray_misses_s_sphere(): # Given r = Ray(Point(0, 2, -5), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 0
def test_intersecting_a_translated_sphere_with_a_ray(): # Given r = Ray(Point(0, 0, -5), Vector(0, 0, 1)) s = Sphere() # When s.transform = translation(5, 0, 0) xs = s.intersect(r) # Then assert len(xs) == 0
def test_a_ray_intersects_a_sphere_at_two_points(): # Given r = Ray(Point(0, 0, -5), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].t == 4.0 assert xs[1].t == 6.0
def test_intersect_sets_the_object_on_the_intersection(): # Given r = Ray(Point(0, 0, -5), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].object == s assert xs[1].object == s
def test_a_sphere_is_behind_a_ray(): # Given r = Ray(Point(0, 0, 5), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].t == -6.0 assert xs[1].t == -4.0
def test_a_ray_originates_inside_a_sphere(): # Given r = Ray(Point(0, 0, 0), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].t == -1.0 assert xs[1].t == 1.0
def test_a_ray_intersects_a_sphere_at_a_tangent(): # Then r = Ray(Point(0, 1, -5), Vector(0, 0, 1)) s = Sphere() # When xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].t == 5.0 assert xs[1].t == 5.0
def test_intersecting_a_scaled_sphere_with_a_ray(): # Given r = Ray(Point(0, 0, -5), Vector(0, 0, 1)) s = Sphere() # When s.transform = scaling(2, 2, 2) xs = s.intersect(r) # Then assert len(xs) == 2 assert xs[0].t == 3 assert xs[1].t == 7
light_position = Point(-10, 10, -10) light_color = Color(1, 1, 1) light = PointLight(light_position, light_color) # for each row of pixels in the canvas for y in range(canvas_pixcels): # compute the world y coordinate (top = +half, bottom = -half) world_y = half - pixel_size * y for x in range(canvas_pixcels): # compute the world x coordinate (left = -half, right = half) world_x = -half + pixel_size * x # describe the point on the wall that the ray will target position = Point(world_x, world_y, wall_z) r = Ray(ray_origin, (position - ray_origin).normalize()) xs = shape.intersect(r) if isinstance(xs, Intersections): hit = xs[0] point = r.position(hit.t) normal = hit.object.normal_at(point) eye = -r.direction color = hit.object.material.lighting(light, point, eye, normal) canvas.write_pixel(x, y, color) print(canvas.to_ppm())