def setUp(self): """ Prepare an assembly with two subassemblies: one assembly representing a spherical lens behind a flat screen, and one asssembly representing a perfect mirror. The mirror will be placed at the two subassemblies' focus, so a paraxial ray will come back on the other side of the optical axis. Reference: In [1], the lensmaker equation """ # focal length = 1, thickness = 1/6 R = 1./6. back_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -R/2.]) front_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., R/2.], rotation=rotx(N.pi/2.)[:3,:3]) front_lens = AssembledObject(surfs=[back_surf, front_surf]) back_surf = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -0.01]) front_surf = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., 0.01]) glass_screen = AssembledObject(surfs=[back_surf, front_surf], transform=translate(0., 0., 0.5)) lens_assembly = Assembly(objects=[glass_screen, front_lens]) lens_assembly.set_transform(translate(0., 0., 1.)) full_assembly = Assembly(objects=[rect_one_sided_mirror(1., 1., 0.)], subassemblies = [lens_assembly]) self.engine = TracerEngine(full_assembly)
def setUp(self): self.assembly = Assembly() surface1 = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.array([0, 0, -1.])) surface2 = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.array([0, 0, 1.])) object1 = AssembledObject(surfs=[surface1, surface2]) boundary = BoundarySphere(location=N.r_[0, 0., 3], radius=3.) surface3 = Surface(CutSphereGM(2., boundary), opt.perfect_mirror) object2 = AssembledObject(surfs=[surface3], transform=translate(0., 0., 2.)) self.assembly = Assembly(objects=[object1, object2]) x = 1. / (math.sqrt(2)) dir = N.c_[[0, 1., 0.], [0, x, x], [0, 0, 1.]] position = N.c_[[0, 0, 2.], [0, 0, 2.], [0, 0., 2.]] self._bund = RayBundle(position, dir, ref_index=N.ones(3), energy=N.ones(3)) self.engine = TracerEngine(self.assembly)
def test_transformed(self): """A transformed triangle excludes rays correctly""" frame = np.dot(translate(0, -1, 0.5), rotx(np.pi/4.)) prm = self.tri.find_intersections(frame, self.bund) np.testing.assert_array_equal(np.isfinite(prm), np.r_[False, False, True, False, False, True])
def setUp(self): dir = N.c_[[1, 1, -1], [-1, 1, -1], [-1, -1, -1], [1, -1, -1]] / math.sqrt(3) position = N.c_[[0,0,1], [1,-1,1], [1,1,1], [-1,1,1]] self._bund = RayBundle(position, dir) self.gm = FlatGeometryManager() frame = SP.translate(1., 0., 0.) self.prm = self.gm.find_intersections(frame, self._bund)
def setUp(self): dir = N.c_[[1, 1, -1], [-1, 1, -1], [-1, -1, -1], [1, -1, -1]] / math.sqrt(3) position = N.c_[[0, 0, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1]] self._bund = RayBundle(position, dir) self.gm = FlatGeometryManager() frame = SP.translate(1., 0., 0.) self.prm = self.gm.find_intersections(frame, self._bund)
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_paraxial_ray(self): """A paraxial ray reaches the focus of a planoconvex lens""" 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 setUp(self): """ Prepare an assembly with two subassemblies: one assembly representing a spherical lens behind a flat screen, and one asssembly representing a perfect mirror. The mirror will be placed at the two subassemblies' focus, so a paraxial ray will come back on the other side of the optical axis. Reference: In [1], the lensmaker equation """ # focal length = 1, thickness = 1/6 R = 1. / 6. back_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -R / 2.]) front_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., R / 2.], rotation=rotx(N.pi / 2.)[:3, :3]) front_lens = AssembledObject(surfs=[back_surf, front_surf]) back_surf = Surface(RoundPlateGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -0.01]) front_surf = Surface(RoundPlateGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., 0.01]) glass_screen = AssembledObject(surfs=[back_surf, front_surf], transform=translate(0., 0., 0.5)) lens_assembly = Assembly(objects=[glass_screen, front_lens]) lens_assembly.set_transform(translate(0., 0., 1.)) full_assembly = Assembly(objects=[rect_one_sided_mirror(1., 1., 0.)], subassemblies=[lens_assembly]) self.engine = TracerEngine(full_assembly)
def setUp(self): self.assembly = Assembly() surface1 = Surface(FlatGeometryManager(), opt.perfect_mirror) self.object1 = AssembledObject() self.object1.add_surface(surface1) boundary = BoundarySphere(location=N.r_[0,0.,3], radius=3.) surface3 = Surface(CutSphereGM(2., boundary), opt.perfect_mirror) self.object2 = AssembledObject() self.object2.add_surface(surface3) self.transform1 = generate_transform(N.r_[1.,0,0], N.pi/4, N.c_[[0,0,-1.]]) self.transform2 = translate(0., 0., 2.) self.assembly.add_object(self.object1, self.transform1) self.assembly.add_object(self.object2, self.transform2)
def setUp(self): self.assembly = Assembly() surface1 = Surface(FlatGeometryManager(), opt.perfect_mirror) self.object1 = AssembledObject() self.object1.add_surface(surface1) boundary = BoundarySphere(location=N.r_[0, 0., 3], radius=3.) surface3 = Surface(CutSphereGM(2., boundary), opt.perfect_mirror) self.object2 = AssembledObject() self.object2.add_surface(surface3) self.transform1 = generate_transform(N.r_[1., 0, 0], N.pi / 4, N.c_[[0, 0, -1.]]) self.transform2 = translate(0., 0., 2.) self.assembly.add_object(self.object1, self.transform1) self.assembly.add_object(self.object2, self.transform2)
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_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 setUp(self): self.assembly = Assembly() surface1 = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.array([0,0,-1.])) surface2 = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.array([0,0,1.])) object1 = AssembledObject(surfs=[surface1, surface2]) boundary = BoundarySphere(location=N.r_[0,0.,3], radius=3.) surface3 = Surface(CutSphereGM(2., boundary), opt.perfect_mirror) object2 = AssembledObject(surfs=[surface3], transform=translate(0., 0., 2.)) self.assembly = Assembly(objects=[object1, object2]) x = 1./(math.sqrt(2)) dir = N.c_[[0,1.,0.],[0,x,x],[0,0,1.]] position = N.c_[[0,0,2.],[0,0,2.],[0,0.,2.]] self._bund = RayBundle(position, dir, ref_index=N.ones(3), energy=N.ones(3)) self.engine = TracerEngine(self.assembly)