# plot_spiral.py from Tkinter import * from spiral_trough import spiral root=Tk() root.title('plot_spiral.py') winw=400 winh=400 canvas=Canvas(root,width=winw,height=winh,bg='white') nx=20 ny=25 xmin=-1.0 xmax=1.0 print 'xmin=', print xmin, print ', xmax=', print xmax ymin=-1.0 ymax=1.0 print 'ymin=', print ymin, print ', ymax=', print ymax zmin=1000.0 zmax=-1000.0 hx=(xmax-xmin)/(nx-1) hy=(ymax-ymin)/(ny-1) # for plotting ya=0.5 # orthographic typ 0.1 to 0.5 zcol=['black', 'brown', 'red', 'orange', 'yellow', 'green', 'blue', 'violet', 'gray'] ncol=len(zcol) for i in range(ncol): canvas.create_line(5,60-6*i,30,60-6*i,width=5,fill=zcol[i]) def ortho(x, y, z, xm, ym, zm, xs, ys, ya, winh): x1=x-xm # zero base y1=y-ym z1=z-zm x2=x1+y1*ya # ortho z is up, y is back y2=z1+y1*ya x3=x2*xs # scale y3=y2*ys return x3+5, winh-y3-5 # away from boarder zp=[[0 for j in range(ny)] for i in range(nx)] for i in range(nx): x=xmin+hx*i for j in range(ny): y=ymin+hy*j z=spiral(x,y) zp[i][j]=z zmin=min(z,zmin) zmax=max(z,zmax) print 'zmin=', print zmin, print ', zmax=', print zmax # orthographic projection scaled to winw, winh xs=(xmax-xmin) ys=(ymax-ymin) zs=(zmax-zmin) xs=xs+ys*ya ys=zs+ys*ya xs=(winw-10)/xs ys=(winh-10)/ys print 'ya=', print ya, print 'xs=', print xs, print ', ys=', print ys x1, y1 = ortho(xmin, ymin, zmin, xmin, ymin, zmin, xs, ys, ya, winh) x2, y2 = ortho(xmax, ymin, zmin, xmin, ymin, zmin, xs, ys, ya, winh) x3, y3 = ortho(xmax, ymax, zmin, xmin, ymin, zmin, xs, ys, ya, winh) x4, y4 = ortho(xmin, ymax, zmin, xmin, ymin, zmin, xs, ys, ya, winh) canvas.create_line(x1,y1,x2,y2,width=2,fill=zcol[0]) canvas.create_line(x2,y2,x3,y3,width=2,fill=zcol[0]) canvas.create_line(x3,y3,x4,y4,width=2,fill=zcol[0]) canvas.create_line(x4,y4,x1,y1,width=2,fill=zcol[0]) x5, y5 = ortho(xmin, ymin, zmax, xmin, ymin, zmin, xs, ys, ya, winh) x6, y6 = ortho(xmax, ymin, zmax, xmin, ymin, zmin, xs, ys, ya, winh) x7, y7 = ortho(xmax, ymax, zmax, xmin, ymin, zmin, xs, ys, ya, winh) x8, y8 = ortho(xmin, ymax, zmax, xmin, ymin, zmin, xs, ys, ya, winh) canvas.create_line(x5,y5,x6,y6,width=2,fill=zcol[ncol-1]) canvas.create_line(x6,y6,x7,y7,width=2,fill=zcol[ncol-1]) canvas.create_line(x7,y7,x8,y8,width=2,fill=zcol[ncol-1]) canvas.create_line(x8,y8,x5,y5,width=2,fill=zcol[ncol-1]) for k in range(ncol): # vertical sides of box dx=(x5-x1)/(ncol) xt=x1+k*dx xu=xt+dx dy=(y5-y1)/(ncol) yt=y1+k*dy yu=yt+dy canvas.create_line(xt,yt,xu,yu,width=2,fill=zcol[k]) for k in range(ncol): dx=(x6-x2)/(ncol) xt=x2+k*dx xu=xt+dx dy=(y6-y2)/(ncol) yt=y2+k*dy yu=yt+dy canvas.create_line(xt,yt,xu,yu,width=2,fill=zcol[k]) for k in range(ncol): dx=(x7-x3)/(ncol) xt=x3+k*dx xu=xt+dx dy=(y7-y3)/(ncol) yt=y3+k*dy yu=yt+dy canvas.create_line(xt,yt,xu,yu,width=2,fill=zcol[k]) for k in range(ncol): dx=(x8-x4)/(ncol) xt=x4+k*dx xu=xt+dx dy=(y8-y4)/(ncol) yt=y4+k*dy yu=yt+dy canvas.create_line(xt,yt,xu,yu,width=2,fill=zcol[k]) for i in range(nx-1): x=xmin+hx*i for j in range(ny-1): y=ymin+hy*j z1=zp[i][j] x1, y1 = ortho(x, y, z1, xmin, ymin, zmin, xs, ys, ya, winh) z2=zp[i+1][j] x2, y2 = ortho(x+hx, y, z2, xmin, ymin, zmin, xs, ys, ya, winh) z3=zp[i][j+1] x3, y3 = ortho(x, y+hy, z3, xmin, ymin, zmin, xs, ys, ya, winh) icol=int((ncol/2.0)*((z1-zmin)+(z2-zmin))/(zmax-zmin)) canvas.create_line(x1,y1,x2,y2,fill=zcol[icol]) icol=int((ncol/2.0)*((z1-zmin)+(z3-zmin))/(zmax-zmin)) canvas.create_line(x1,y1,x3,y3,fill=zcol[icol]) for i in range(nx-1): x=xmin+hx*i y=ymax z1=zp[i][ny-1] x1, y1 = ortho(x, y, z1, xmin, ymin, zmin, xs, ys, ya, winh) x=x+hx z2=zp[i+1][ny-1] x2, y2 = ortho(x, y, z2, xmin, ymin, zmin, xs, ys, ya, winh) icol=int((ncol/2.0)*((z1-zmin)+(z2-zmin))/(zmax-zmin)) canvas.create_line(x1,y1,x2,y2,fill=zcol[icol]) for j in range(ny-1): y=ymin+hy*j x=xmax z1=zp[nx-1][j] x1, y1 = ortho(x, y, z1, xmin, ymin, zmin, xs, ys, ya, winh) y=y+hy z2=zp[nx-1][j+1] x2, y2 = ortho(x, y, z2, xmin, ymin, zmin, xs, ys, ya, winh) icol=int((ncol/2.0)*((z1-zmin)+(z2-zmin))/(zmax-zmin)) canvas.create_line(x1,y1,x2,y2,fill=zcol[icol]) canvas.pack() root.mainloop()