from visual import * from visual.graph import * import blackbody print """ Click and drag the temperature slider to demonstrate the Black Body radiation at that temperature. """ scene.userspin = 0 grey = (0.85, 0.85, 0.85) scene.center=(0,0,0.5) scene.x=10 scene.y=10 scene.width=500 scene.height=500 def colorbars(sc): bars=gvbars(delta=500) bars.plot(pos=(4250,sc), color=(0.8,0.0,1.0)) #purple bars.plot(pos=(4750,sc), color=color.blue) bars.plot(pos=(5250,sc), color=color.green) bars.plot(pos=(5750,sc), color=color.yellow) bars.plot(pos=(6250,sc), color=(1.0,0.5,0.0)) #orange bars.plot(pos=(6750,sc), color=color.red) return bars class slider: def __init__(self, pos=vector(0,0,0), axis=vector(0,1.,0), value=None, width=0.15, min=0, max=100., color=(1,0,0)): pos = vector(pos) axis = vector(axis) if value == None: value = min self.min = min self.max = max self.value = value self.shaft = cylinder(pos=pos, axis=axis, radius=width/4., color=grey) self.start = pos self.axis = axis self.control = sphere(pos=self.start+(value-self.min)/(self.max-self.min)*self.axis, radius=width/2., color = color) self.label = label(pos=self.control.pos, text="%0.2f" % value, opacity=0, box=0, line=0) def getslider(self, pos=None): pos = vector(pos) value = self.min+(self.max-self.min)*(pos.y-self.start.y)/mag(self.axis) self.setslider(value) return value def setslider(self, value=None): if value > self.max: value = self.max if value < self.min: value = self.min self.value = value self.control.pos = vector(self.start+(float(value)-self.min)/(self.max-self.min)*self.axis) self.label.pos = self.control.pos self.label.text="%0.2f" % value scene.title = "Black Body Demo" temp=1000 tslider=slider(pos=(-1,0,0), color=(0.8,0.8,0.8), min=1000, max=10000, value=temp) tplus=box(pos=(-1,1.2,0), color=(0.8,0.8,0.8), size=(0.2,0.2,0.2)) tminus=box(pos=(-1,-0.2,0), color=(0.8,0.8,0.8), size=(0.2,0.2,0.2)) tcol=blackbody.BlackBody(temp) ball = sphere(pos=(0,0.5,0), radius=0.5, color=tcol) dragobj = None graph1=gdisplay(title='A vs Wavelength', xtitle='wavelength (Angstroms)', ytitle='amplitude', x=10, y=550, height=600) func=gcurve(color=tcol) for wlen in range(100,30000,100): func.plot(pos=(wlen, blackbody.rho(wlen*1e-10,temp))) cb=colorbars(graph1.minmax[1][1]*0.8) while 1: rate(50) clicked=0 if scene.mouse.events: m = scene.mouse.getevent() if m.click == "left": if m.pick == ball: func=gcurve(color=blackbody.BlackBody(temp)) for wlen in range(100,30000,100): func.plot(pos=(wlen, blackbody.rho(wlen*1e-10,temp))) cb.visible=0 del cb cb=colorbars(graph1.minmax[1][1]*0.8) elif m.pick == tplus: temp=temp+500 tslider.setslider(temp) temp=tslider.value clicked=1 elif m.pick == tminus: temp=temp-500 tslider.setslider(temp) temp=tslider.value clicked=1 elif m.drop == "left": dragobj = None elif m.drag == "left": if m.pick is tslider.control: pos = m.project(normal=(0,0,1)) dragobj = tslider newpos = scene.mouse.project(normal=(0,0,1)) if (dragobj and (newpos != pos)) or clicked: if not clicked: pos = newpos dragobj.getslider(pos) temp=tslider.value tcol=blackbody.BlackBody(temp) ball.color = tcol