コード例 #1
0
ファイル: test_tracer_engine.py プロジェクト: joewan/tracer
 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)
コード例 #2
0
ファイル: test_tracer_tree.py プロジェクト: kraken22/Tracer
    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)
コード例 #3
0
 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])
コード例 #4
0
 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)
コード例 #5
0
    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)
コード例 #6
0
 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)
コード例 #7
0
 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)
コード例 #8
0
    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)
コード例 #9
0
    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)
コード例 #10
0
ファイル: test_tracer_tree.py プロジェクト: kraken22/Tracer
    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)
コード例 #11
0
 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)
コード例 #12
0
    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)
コード例 #13
0
    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)