1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- """Simulation of an optical system with lenses and mirrors of arbitrary shapes and orientations
- (points mark the exit locations of photons, many from internal total reflection)"""
- import numpy as np
- from vedo import Grid, Sphere, Cube, Cone, Points, show
- from optics_base import Lens, Ray, Mirror, Screen # see file ./optics_base.py
- # Create meshes as ordinary vedo objects
- sm = Sphere(r=8).z(-8.1)
- sp = Sphere(r=8).z(+8.1)
- shape1 = Sphere(r=0.9, res=53).cut_with_plane().cap().rotate_y(-90).pos(0,0,0.5)
- shape2 = Cube(side=2).triangulate().boolean('-', sm).boolean("-", sp).z(3)
- shape3 = Cone().rotate_y(-90).z(6)
- shape4 = Cube().scale([1.7,1,0.2]).rotate_y(70).pos(-0.3,0,8)
- shape5 = Sphere(r=2).boolean("intersect", Sphere(r=2).z(3.5)).rotate_x(10).pos(0.8,0,7.5)
- shape6 = Grid(res=[1,1]).rotate_y(-60).rotate_x(30).pos(0,-1,11)
- # Build lenses (with their refractive indices), and mirrors, using those meshes
- lens1 = Lens(shape1, ref_index=1.35).c("blue9") # constant refr. index
- lens2 = Lens(shape2, ref_index="glass").c("blue7")
- lens3 = Lens(shape3, ref_index="glass").c("green9")
- lens4 = Lens(shape4, ref_index="glass").c("purple9").linewidth(1)
- lens5 = Lens(shape5, ref_index="glass").c("orange9")
- mirror= Mirror(shape6)
- screen= Screen(4,4).rotate_y(20).pos(1,0,12)
- elements = [lens1, lens2, lens3, lens4, lens5, mirror, screen]
- # Generate photons and trace them through the optical elements
- lines = []
- source = Grid(res=[20,20]).points # a numpy array
- for pt in source:
- λ = np.random.uniform(low=450, high=750)*1e-09 # nanometers
- ray = Ray(pt, direction=(0,0,1), wave_length=λ)
- line = ray.trace(elements).asLine(min_hits=4, cmap_amplitudes="Blues") # vedo.Line
- lines.append(line)
- lines = list(filter(None, lines)) # remove possible None to add a scalar bar to lines[0]
- lines[0].add_scalarbar("Ampl.")
- # Grab the coords of photons exiting the conic lens3 (hits_type==-1)
- cone_hits = Points(lens3.hits[lens3.hits_type==-1]).color("green1").point_size(8)
- # Show everything
- show(__doc__, elements, lines, lens5.boundaries().lw(2), cone_hits,
- size=(1500,700), bg='k2', bg2='k9', zoom=2, azimuth=-90,
- )
|