示例#1
0
    def test_reflection(self):

        transform = scaling(-1, 1, 1)

        p = point(2, 3, 4)

        p_out = point(-2, 3, 4)

        self.assertEqual(transform * p, p_out, 'The reflection failed')
示例#2
0
    def test_scaling_vector(self):

        transform = scaling(2, 3, 4)

        v = vector(-4, 6, 8)

        v_out = vector(-8, 18, 32)

        self.assertEqual(transform * v, v_out, 'The scaling of vector failed')
示例#3
0
    def test_scaling(self):

        transform = scaling(2, 3, 4)

        p = point(-4, 6, 8)

        p_out = point(-8, 18, 32)

        self.assertEqual(transform * p, p_out, 'The scaling of point fail')
示例#4
0
    def test_sphere_transformed(self):
        "Tests the sphere normal vector under a transformation"

        s_var = sphere()
        m_var = scaling(1, 0.5, 1) * rotation_z(pi / 5)
        s_var.set_transform(m_var)

        n_var = normal_at(s_var, point(0, sqrt(2) / 2, -sqrt(2) / 2))

        self.assertEqual(n_var, vector(0, 0.97014, -0.24254),\
                'The normal of an sphere transformed is wrong.')
示例#5
0
    def test_inverse_scaling(self):

        transform = scaling(2, 3, 4)

        inv = inverse(transform)

        v = vector(-4, 6, 8)

        v_out = vector(-2, 2, 2)

        self.assertEqual(inv * v, v_out, 'The inverse scaling failed')
示例#6
0
    def test_sphere_transformed(self):

        r = ray(point(0, 0, -5), vector(0, 0, 1))

        s = sphere()

        s.set_transform(scaling(2, 2, 2))

        xs = intersect(s, r)

        self.assertEqual(len(xs), 2, 'There should have been 2 intersections')
        self.assertEqual(xs[0].t, 3, 't=3 should have been present')
        self.assertEqual(xs[1].t, 7, 't=4 should have been present')
示例#7
0
    def test_transformation(self):

        r = ray(point(1, 2, 3), vector(0, 1, 0))

        m = translation(3, 4, 5)

        r2 = transform(r, m)

        self.assertEqual(r2.origin, point(4, 6, 8),
                         'The ray translation failed')
        self.assertEqual(r2.direction, vector(0, 1, 0),
                         'The ray translation failed')

        m2 = scaling(2, 3, 4)

        r3 = transform(r, m2)

        self.assertEqual(r3.origin, point(2, 6, 12), 'The ray scaling failed')
        self.assertEqual(r3.direction, vector(0, 3, 0),
                         'The ray scaling failed')
示例#8
0
    def test_chain_transform1(self):

        p = point(1, 0, 1)

        A = rotation_x(pi / 2)
        B = scaling(5, 5, 5)
        C = translation(10, 5, 7)

        p2 = point(1, -1, 0)

        self.assertEqual(A * p, p2, 'The rotation failed')

        p3 = point(5, -5, 0)

        self.assertEqual(B * p2, p3, 'The chain scaling failed')

        p4 = point(15, 0, 7)

        self.assertEqual(C * p3, p4, 'The chain translation failed')

        self.assertEqual(C * B * A * p, p4, 'The chain transformations failed')
示例#9
0
with open('shadow_sphere.ppm', 'w') as f:
    f.write(c.to_PPM())

print('blank canvas wrote')

pad_x = -CANVAS_W / 2
pad_y = -CANVAS_H / 2

light_position = point(-10, 10, -10)
light_color = color(1, 1, 1)
light = PointLight(light_position, light_color)

s = sphere()
s.material = Material()
s.material.color = color(1, 0.2, 1)
trans = scaling(200, 200, 1) * translation(0, 0, 800)
s.set_transform(trans)

print('{:04d},{:04d}'.format(0, 0), end='\r')
h = False
for i in range(CANVAS_W):
    #print()
    for j in range(CANVAS_H):
        print('{:04d},{:04d}'.format(i, j), end='\r')
        r = ray(point(0, 0, 0), vector(i + pad_x, -pad_y - j, CANVAS_DISTANCE))
        inter = intersect(s, r)
        if hit(inter) != None:
            c[i, j] = HIT_COLOR
            h = True
        #if h:
        #print('\033[48;2;255;0;0m  \033[0m', end='', flush=True)
示例#10
0
 def __init__(self, center=point(0, 0, 0), r=1):
     self.center = center
     self.r = r
     self.transform = scaling(r, r, r) * translation(*center)
     self.material = Material()