Multiple-bodies physical interaction simulator


(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()
	
	

Return