class Biconvex(unittest.TestCase): def setUp(self): self.lens = SphericalLens(diameter=1., depth=0.1, R1=10., R2=-10., refr_idx=1.5) def test_focal_length(self): """Biconvex calculated focal length is as expected from the lensmaker equation""" self.failUnlessEqual(self.lens.focal_length(), 2./(0.2 - 0.05/150)) def test_paraxial_ray(self): """A paraxial ray reaches the focus""" rb = RayBundle(N.c_[[0., 0.001, 1.]], N.c_[[0., 0., -1.]], energy=N.r_[1.], ref_index=N.r_[1.]) screen = rect_one_sided_mirror(5, 5) f = self.lens.focal_length() screen.set_transform(translate(0, 0, -f)) e = TracerEngine(Assembly([self.lens, screen])) vert, _ = e.ray_tracer(rb, 3, 1e-6) self.failUnlessAlmostEqual(vert[1,2], 0, 4) def test_cylinder(self): """The bounding cylinder exists for biconvex lens""" f = self.lens.focal_length() rb = RayBundle(N.c_[[0., 0., 0.08]], N.c_[[1., 0., 0.]], energy=N.r_[1.], ref_index=N.r_[1.5]) e = TracerEngine(Assembly([self.lens])) verts, dirs = e.ray_tracer(rb, 1, 1e-6) N.testing.assert_array_equal(verts, N.tile(N.c_[[0.5, 0., 0.08]], (1,2))) N.testing.assert_array_equal(dirs, N.c_[[-1., 0., 0.], [1., 0., 0.]])
class Biconcave(unittest.TestCase): def setUp(self): self.lens = SphericalLens(diameter=1., depth=0.1, R1=-10., R2=10., refr_idx=1.5) def test_focal_length(self): """Biconcave calculated focal length is as expected from the lensmaker equation""" self.failUnlessEqual(self.lens.focal_length(), 2. / (-0.2 - 0.05 / 150)) def test_image_size(self): """Image size of an object imaged by a biconcave lens matches theory""" origin = N.c_[[0., 0.001, 1.]] direct = -origin / N.linalg.norm(origin) rb = RayBundle(origin, direct, energy=N.r_[1.], ref_index=N.r_[1.]) # Magnification, see [1] p. 26. f = self.lens.focal_length() m = f / (origin[2] + f) # Image location, [ibid]: loc = origin[2] * m screen = rect_one_sided_mirror(5, 5) screen.set_transform(translate(0, 0, -loc)) e = TracerEngine(Assembly([self.lens, screen])) vert, _ = e.ray_tracer(rb, 3, 1e-6) self.failUnlessAlmostEqual(vert[1, 2], -m * origin[1], 4) def test_cylinder(self): """The bounding cylinder exists for biconcave lens""" f = self.lens.focal_length() rb = RayBundle(N.c_[[0., 0., 0.08]], N.c_[[1., 0., 0.]], energy=N.r_[1.], ref_index=N.r_[1.5]) e = TracerEngine(Assembly([self.lens])) verts, dirs = e.ray_tracer(rb, 1, 1e-6) N.testing.assert_array_equal(verts, N.tile(N.c_[[0.5, 0., 0.08]], (1, 2))) N.testing.assert_array_equal(dirs, N.c_[[-1., 0., 0.], [1., 0., 0.]])
class Biconcave(unittest.TestCase): def setUp(self): self.lens = SphericalLens(diameter=1., depth=0.1, R1=-10., R2=10., refr_idx=1.5) def test_focal_length(self): """Biconcave calculated focal length is as expected from the lensmaker equation""" self.failUnlessEqual(self.lens.focal_length(), 2./(-0.2 - 0.05/150)) def test_image_size(self): """Image size of an object imaged by a biconcave lens matches theory""" origin = N.c_[[0., 0.001, 1.]] direct = -origin/N.linalg.norm(origin) rb = RayBundle(origin, direct, energy=N.r_[1.], ref_index=N.r_[1.]) # Magnification, see [1] p. 26. f = self.lens.focal_length() m = f/(origin[2] + f) # Image location, [ibid]: loc = origin[2]*m screen = rect_one_sided_mirror(5, 5) screen.set_transform(translate(0, 0, -loc)) e = TracerEngine(Assembly([self.lens, screen])) vert, _ = e.ray_tracer(rb, 3, 1e-6) self.failUnlessAlmostEqual(vert[1,2], -m*origin[1], 4) def test_cylinder(self): """The bounding cylinder exists for biconcave lens""" f = self.lens.focal_length() rb = RayBundle(N.c_[[0., 0., 0.08]], N.c_[[1., 0., 0.]], energy=N.r_[1.], ref_index=N.r_[1.5]) e = TracerEngine(Assembly([self.lens])) verts, dirs = e.ray_tracer(rb, 1, 1e-6) N.testing.assert_array_equal(verts, N.tile(N.c_[[0.5, 0., 0.08]], (1,2))) N.testing.assert_array_equal(dirs, N.c_[[-1., 0., 0.], [1., 0., 0.]])
def setUp(self): self.lens = SphericalLens(diameter=1., depth=0.05, R1=10., R2=N.inf, refr_idx=1.5)
def setUp(self): self.lens = SphericalLens(diameter=1., depth=0.1, R1=-10., R2=10., refr_idx=1.5)