123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import numpy as np
- import vedo
- from optics_base import Lens, Ray, Mirror, Detector, Screen # see file ./optics_base.py
- ###################################################################### thin lenses
- s = vedo.Sphere(r=2, res=50) # construct a thin lens:
- shape = s.boolean("intersect", s.clone().z(3.5)).z(1.4)
- lens = Lens(shape, ref_index=1.52).color("orange9")
- screen= Screen(3,3).z(5)
- elements = [lens, screen]
- source = vedo.Disc(r1=0, r2=0.7, res=4).points # numpy 3d points
- lines = [Ray(pt).trace(elements).asLine() for pt in source] # list of vedo.Line
- vedo.show("Test of 1/f = (n-1) :dot (1/R1-1/R2) :approx 1/2",
- elements, lines, lens.boundaries().lw(2),
- azimuth=-90, zoom=1.2, size=(1100,700), axes=dict(zxgrid=True)).close()
- ####################################################################### dispersion
- s = vedo.Cone(res=4).scale([1,1,0.4]).rotate_y(-90).rotate_x(45).pos(-0.5,0,1.5)
- prism = Lens(s, ref_index="glass").lw(1)
- screen= Screen(2,2).z(6)
- lines = []
- for wl in np.arange(450,750, 10)*1e-09:
- ray = Ray(direction=(-0.5,0,1), wave_length=wl)
- line = ray.trace([prism,screen]).asLine()
- lines.append(line)
- vedo.show("Test of chromatic dispersion", prism, screen, lines,
- zoom=1.5, size=(1100,700), axes=1).close()
- ################################################################ spherical mirrors
- s1 = vedo.Sphere(r=7, res=50).cut_with_plane([0,0,6],'z').cut_with_cylinder(invert=True)
- s2 = vedo.Sphere(r=5, res=50).cut_with_plane([0,0,-2],'-z').cut_with_cylinder().z(10)
- m1 = Mirror(s1)
- m2 = Mirror(s2)
- screen = Screen(5,5).z(9)
- elements = [m2, m1, m2, m1, screen] ## NOTE ordering!
- source= vedo.Disc(r1=1, r2=3, res=[20,60]).cut_with_plane().cut_with_plane(normal='y').z(1)
- lines = [Ray(pt).trace(elements).asLine(2) for pt in source.points]
- vedo.show("Reflection from spherical mirrors", elements, lines, axes=1).close()
- ################################################################# parabolic mirror
- s = vedo.Paraboloid(res=200).cut_with_plane([0,0,-0.4], 'z').scale([1,1,0.1]).z(1)
- elements = [Mirror(s), Screen(0.2,0.2).z(0.35)]
- source= vedo.Disc(r1=.1, r2=.3, res=[10,30]).cut_with_plane().cut_with_plane(normal='y')
- lines = [Ray(pt).trace(elements).asLine() for pt in source.points]
- vedo.show("Reflection from a parabolic mirror", elements, lines, axes=2, azimuth=-90).close()
- ################################################################# mesh mirror
- # Create the mirror from a vedo.Mesh object
- shape = vedo.Mesh(vedo.dataurl+"bunny.obj").fill_holes().subdivide().smooth()
- shape.scale(7).pos(0.1,-0.6,0).rotate_x(90)
- mirror = Mirror(shape).color("silver")
- # Create a detector surface as a quad-sphere surrounding the shape
- sd = vedo.Sphere(quads=1, res=12).cut_with_plane([0,-0.8,0], normal='y')
- detector = Detector(sd).color("white").alpha(1).lw(1)
- source = vedo.Grid(res=[30,30]).rotate_x(90).y(-1)
- lines=[]
- for pt in source.points:
- ray = Ray(pt, direction=(0,1,0)).trace([mirror, detector])
- line = ray.asLine(min_hits=2, max_hits=4)
- lines.append(line)
- detector.count().cmap("Reds", on='cells', vmax=10).add_scalarbar("Counts")
- vedo.show(mirror, detector, lines, "A Mesh mirror and a spherical detector",
- elevation=-90, axes=1, bg='bb', bg2='blue9').close()
|