(GUI/graphic program)
Warning! Parts of the code have been hidden for unknown reasons; work is in progress to find the cause...
from tkinter import *
from time import *
from math import *
from random import *
#from transcol import *
#this is the "transcol" module:
def rgb(r,g,b):
hr=list(hex(int(r)))
hg=list(hex(int(g)))
hb=list(hex(int(b)))
hr.remove("0")
hr.remove("x")
hg.remove("0")
hg.remove("x")
hb.remove("0")
hb.remove("x")
if len(hr)<2:
hr.insert(0,"0")
if len(hg)<2:
hg.insert(0,"0")
if len(hb)<2:
hb.insert(0,"0")
return "#"+"".join(hr)+"".join(hg)+"".join(hb)
coll="null"
def simu(what,versus,wx,wy,wz,number,masschar,bounce,thread):
fin=Tk()
if what=="grav":
tit="GravSim"
if what=="elec":
tit="ElecSim"
fin.title(tit)
spa=Canvas(fin,width=wx,height=wy,bg=rgb(0,0,0))
spa.pack()
body=list(range(0,number))
m=list(range(0,number))
c=list(range(0,number))
cr=list(range(0,number))
cg=list(range(0,number))
cb=list(range(0,number))
x=list(range(0,number))
y=list(range(0,number))
z=list(range(0,number))
xv=list(range(0,number))
yv=list(range(0,number))
zv=list(range(0,number))
tha=list(range(0,number))
for i in tha:
tha[i]=list(range(0,number))
pha=list(range(0,number))
for i in pha:
pha[i]=list(range(0,number))
inta=list(range(0,number))
for i in inta:
inta[i]=list(range(0,number))
dx=list(range(0,number))
for i in dx:
dx[i]=list(range(0,number))
dy=list(range(0,number))
for i in dy:
dy[i]=list(range(0,number))
dz=list(range(0,number))
for i in dz:
dz[i]=list(range(0,number))
d=list(range(0,number))
for i in d:
d[i]=list(range(0,number))
switch=list(range(0,number))
for i in switch:
switch[i]=list(range(0,number))
for i in range(0,number):
m[i]=masschar
c[i]=uniform(-masschar,masschar)
x[i]=uniform(0,wy)
y[i]=uniform(0,wy)
z[i]=uniform(0,wz)
xv[i]=0
yv[i]=0
zv[i]=0
if what=="grav":
cr[i]=uniform(0,255)
cg[i]=uniform(0,255)
cb[i]=uniform(0,255)
if what=="elec":
cr[i]=128
cg[i]=128+128/masschar*c[i]
cb[i]=128-128/masschar*c[i]
for i in range(0,number):
body[i]=spa.create_oval(x[i]+m[i],y[i]+m[i],x[i]-m[i],y[i]-m[i],outline="",fill=rgb(cr[i],cg[i],cb[i]))
spa.update()
while True:
for i in range(0,number):
for j in range(0,number):
if not i==j:
dx[i][j]=x[i]-x[j]
dy[i][j]=y[i]-y[j]
dz[i][j]=z[i]-z[j]
d[i][j]=sqrt(dx[i][j]**2+dy[i][j]**2+dz[i][j]**2)
for i in range(0,number):
for j in range(0,number):
if not i==j:
tha[i][j]=acos(dz[i][j]/d[i][j])
pha[i][j]=atan2(dy[i][j],dx[i][j])
if what=="grav":
inta[i][j]=-versus*(m[i]*m[j])/(d[i][j]**2) # direct potential!
inta[j][i]=-inta[i][j] # inverse potential!
if what=="elec":
inta[i][j]=versus*(c[i]*c[j])/(d[i][j]**2) # direct potential!
inta[j][i]=-inta[i][j] # inverse potential!
tha[j][i]=acos(dz[i][j]/d[i][j])
pha[j][i]=atan2(dy[i][j],dx[i][j])
# COLLISION MODE:
if coll=="null": # no interaction mode
if what=="grav" and d[i][j]wx:
x[i]=2*wx-x[i]
xv[i]=-xv[i]
if y[i]>wy:
y[i]=2*wy-y[i]
yv[i]=-yv[i]
if z[i]>wz:
z[i]=2*wz-z[i]
zv[i]=-zv[i]
x[i]=x[i]+xv[i]
y[i]=y[i]+yv[i]
z[i]=z[i]+zv[i]
if thread=="true":
spa.create_oval(x[i]+1,y[i]+1,x[i]-1,y[i]-1,outline="",fill=rgb(cr[i],cg[i],cb[i]))
for s in range(0,number):
spa.move(body[s],xv[s],yv[s])
spa.update()
gui=Tk()
gui.title("PhiSim")
xspmes=Label(gui,text="Choose the space width (recommended: 1000):")
xspmes.grid(row=0,column=0)
xspins=Entry()
xspins.grid(row=0,column=1)
yspmes=Label(gui,text="Choose the space length (recommended: 1000):")
yspmes.grid(row=1,column=0)
yspins=Entry()
yspins.grid(row=1,column=1)
zspmes=Label(gui,text="Choose the space height (recommended: 1000; choose 0 for a 2D simulation):")
zspmes.grid(row=2,column=0)
zspins=Entry()
zspins.grid(row=2,column=1)
nummes=Label(gui,text="Choose the number of bodies (recommended: 12):")
nummes.grid(row=3,column=0)
numins=Entry()
numins.grid(row=3,column=1)
masmes=Label(gui,text="Choose the mass of the bodies (recommended: 12):")
masmes.grid(row=4,column=0)
masins=Entry()
masins.grid(row=4,column=1)
chames=Label(gui,text="Choose the maximum charge of the bodies (recommended: 12):")
chames.grid(row=5,column=0)
chains=Entry()
chains.grid(row=5,column=1)
bncmes=Label(gui,text="Type 'yes' for bouncing edges (recommended):")
bncmes.grid(row=6,column=0)
bncins=Entry()
bncins.grid(row=6,column=1)
gb=Button(gui,text="Start gravitational simulation",command=(lambda: simu("grav",1,int(xspins.get()),int(yspins.get()),int(zspins.get()),int(numins.get()),int(masins.get()),str(bncins.get()),"false")))
gb.grid(row=7,column=0)
gbh=Button(gui,text="Start antigravitational simulation",command=(lambda: simu("grav",-1,int(xspins.get()),int(yspins.get()),int(zspins.get()),int(numins.get()),int(masins.get()),str(bncins.get()),"false")))
gbh.grid(row=7,column=1)
cb=Button(gui,text="Start electric simulation",command=(lambda: simu("elec",1,int(xspins.get()),int(yspins.get()),int(zspins.get()),int(numins.get()),int(chains.get()),str(bncins.get()),"false")))
cb.grid(row=8,column=0)
cbh=Button(gui,text="Start electric simulation (inverted version)",command=(lambda: simu("elec",-1,int(xspins.get()),int(yspins.get()),int(zspins.get()),int(numins.get()),int(chains.get()),str(bncins.get()),"false")))
cbh.grid(row=8,column=1)
gui.mainloop()