|
From: Poul R. <Pou...@sk...> - 2011-10-14 08:22:59
|
Now it works! (please try my further developed example below).
However, it is far too slow.
Is there any possibility to speed it up?
How can I add colors depending on the z-value?
Poul Riis
from visual import *
from time import *
class Model:
def __init__(self):
self.frame = frame()
self.model = faces(frame=self.frame, color=color.blue)
self.vertices = []
def FacetedTriangle(self, v1, v2, v3, color=color.red):
"""Add a triangle to the model"""
for v in (v1,v2,v3):
self.vertices.append(v)
def FacetedPolygon(self, *v):
"""Appends a planar polygon of any number of vertices to the
model"""
for t in range(len(v)-2):
self.FacetedTriangle( v[0], v[t+1], v[t+2] )
self.FacetedTriangle( v[0], v[t+2], v[t+1] )
def DrawNormals(self, scale):
pos = self.model.pos
normal = self.model.normal
for i in range(len(pos)):
arrow(pos=pos[i], axis=normal[i]*scale)
class Mesh (Model):
def __init__(self, xvalues, yvalues, zvalues):
Model.__init__(self)
points = zeros( xvalues.shape + (3,), float )
points[...,0] = xvalues
points[...,1] = yvalues
points[...,2] = zvalues
for i in range(zvalues.shape[0]-1):
for j in range(zvalues.shape[1]-1):
self.FacetedPolygon( points[i,j], points[i,j+1],
points[i+1,j+1], points[i+1,j] )
self.model.pos = self.vertices
self.model.make_normals()
self.model.smooth()
self.model.make_twosided()
dxy=0.02 # Length of x-y-intervals
x = arange(-1,1+dxy,dxy)
y = arange(-1,1+dxy,dxy)
d=0.8 # Distance between two oscillators
dh=d/2 # Half that distance
lambdah=d/5 # Wavelength
k=2*pi/lambdah
T=10 # Oscillator period
A=0.025 # Oscillator amplitude
omega=2*pi/T
m1=12 #Number of wavelengths from oscillator 1 to point of constructive
interference
m2=10 #Number of wavelengths from oscillator 2 to point of constructive
interference
n=m1-m2
m=m2
xci=n*(n+2*m)*lambdah**2/2/d
yci=sqrt((d**2-(n*lambdah)**2)*(((n+2*m)*lambdah)**2-d**2))/2/d
print('Point of constructive interference: (',xci,yci,')')
print(sqrt((xci-dh)**2+yci**2)/lambdah)
print(sqrt((xci+dh)**2+yci**2)/lambdah)
N1=m*20
N2=(m+n)*20
a1points=[]
a2points=[]
for i in range(0,N1+1):
a1points.append((i*(xci-dh)/N1+dh,2*A*cos(i/N1*m*2*pi),1-i*yci/N1))
for i in range(0,N2+1):
a2points.append((i*(xci+dh)/N2-dh,2*A*cos(i/N2*(m+n)*2*pi),1-i*yci/N2))
def f(x,y,t):
return
A*(sin(k*sqrt((x-dh)*(x-dh)+y*y)-omega*t)+sin(k*sqrt((x+dh)*(x+dh)+y*y)-omega*t))
source1=sphere(radius=0.02,pos=(dh,0,1),color=color.yellow)
source2=sphere(radius=0.02,pos=(-dh,0,1),color=color.red)
z = zeros( (len(x),len(y)), float )
x,y = x[:,None]+z, y+z
curve(pos=a1points,color=color.red)
curve(pos=a2points,color=color.yellow)
Ncp=20
ncmax=floor(d/lambdah)
if ncmax*lambdah==d:
ncmax=ncmax-1
for nc in range(1,ncmax+1):
bhyp=sqrt(-(nc*lambdah/2)**2+(d/2)**2)
ahyp=bhyp*nc/sqrt(-nc*nc+(d/lambdah)**2)
print('ahyp,bhyp:',ahyp,bhyp)
txmax=acosh(1/ahyp)
tymax=acosh(2/bhyp)
tmax=txmax
if tymax<txmax:
tmax=tymax
hyppoints=[]
for i in range(0,Ncp+1):
t=i*tmax/Ncp
hyppoints.append((ahyp*cosh(t),2*A,-bhyp*sinh(t)+1))
curve(pos=hyppoints,color=color.green)
hyppoints=[]
for i in range(0,Ncp+1):
t=i*tmax/Ncp
hyppoints.append((-ahyp*cosh(t),2*A,-bhyp*sinh(t)+1))
curve(pos=hyppoints,color=color.green)
hyppoints=[]
hyppoints.append((0,2*A,-1))
hyppoints.append((0,2*A,1))
curve(pos=hyppoints,color=color.green)
for i in range(0,100):
surface=Mesh( x, f(x,y-1,i) , y )
#sleep(0.01)
surface.model.visible=False
del surface
source1.pos=(-dh,-A*sin(omega*i),1)
source2.pos=(dh,-A*sin(omega*i),1)
i=100
surface=Mesh( x, f(x,y-1,i) , y )
|