From: Poul R. <Pou...@sk...> - 2011-10-14 21:08:15
|
Here is a small section of the original faces_heightfield example: class Model: def __init__(self): self.frame = frame() self.model = faces(frame=self.frame, color=color.cyan) self.vertices = [] def FacetedTriangle(self, v1, v2, v3, color=color.white): """Add a triangle to the model""" for v in (v1,v2,v3): self.vertices.append(v) I cannot see why the color=color.white is there - it seems to have no effect!? Replacing white with red doesn't change anything. Rather, I would like to input something like c1,c2,c3 (three colors for the vertices) in the FacetedTriangle. But how exactly? I regret that I'm such a poor programmer but it could be a great help if someone would implement this change in faces_heightfield. Poul Riis |
From: Poul R. <Pou...@sk...> - 2011-10-14 21:24:53
|
A little timetesting indicates that not the calculation of z-values but the drawing takes time.... Poul Riis |
From: Shawn D. <sh...@ty...> - 2011-10-15 04:33:43
|
Poul wrote... > Yes, I know, but even the original example 'faces_heightfield' is > too complicated for me to see how I can add these colors. Can > someone give me just a little hint? Below is some added color. Search for “s.dube” -Shawn Dube 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) # function added by s.dube def PosArrayToHueColorArray( aPos, index ): # aPos is an array of positions # index chooses from which axis (x,y,z) to base color aPos= aPos.copy() v= hsplit(aPos,3)[index] v -= v.min() v *= 5.0 / v.max() # red r= v+1.0 r %= 6.0 r -= 3.0 r= abs(r) r -= 1.0 r= r.clip(0.0,1.0) # green g = v+3.0 g %= 6.0 g -= 3.0 g= abs(g) g -= 1.0 g= g.clip(0.0,1.0) # blue b= v b += 5.0 b %= 6.0 b -= 3.0 b= abs(b) b -= 1.0 b= b.clip(0.0,1.0) # wrap-up return hstack((r,g,b)) class Mesh (Model): def __init__(self, xvalues, yvalues, zvalues): global g 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.color= PosArrayToHueColorArray( self.model.pos, 1 ) # added by s.dube 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 ) |
From: Bruce S. <Bru...@nc...> - 2011-10-14 22:49:37
|
You're right, that 4th argument for FacetedTriangle isn't used and can be deleted. Or, if you want to call FacetedTriangle with both vertex locations and color specfications, you could revise the routine like this: def FacetedTriangle(self, v1, v2, v3, c1, c2, c3): self.vertices.append(pos=v1, color=c1) self.vertices.append(pos=v2, color=c2) self.vertices.append(pos=v3, color=c3) Then you would say self.FacetedTriangle(v1, v2, v3, c1, c2, c3). Bruce Sherwood On Fri, Oct 14, 2011 at 3:07 PM, Poul Riis <Pou...@sk...> wrote: > > Here is a small section of the original faces_heightfield example: > class Model: > def __init__(self): > self.frame = frame() > self.model = faces(frame=self.frame, color=color.cyan) > self.vertices = [] > def FacetedTriangle(self, v1, v2, v3, color=color.white): > """Add a triangle to the model""" > for v in (v1,v2,v3): > self.vertices.append(v) > I cannot see why the color=color.white is there - it seems to have no > effect!? Replacing white with red doesn't change anything. > Rather, I would like to input something like c1,c2,c3 (three colors for the > vertices) in the FacetedTriangle. But how exactly? > I regret that I'm such a poor programmer but it could be a great help if > someone would implement this change in faces_heightfield. > Poul Riis |