Spel28: Många Bollar

manyparticles               Titta på simuleringar av partikeldynamik och häpna.

Vi programmerar dynamiken hos många studsande bollar som interagerar genom elastiska fjädrar som aktiveras då bollarna är i kontakt då avståndet mellan bollars mittpunkt är lika med två radier. Bollars position kan ändras via touch. Styrning av bollradie R, fjäderstyvhet E, dämpning D och gravitation D. Jämför med Mechanics1 på App Store.

Template: (Följ dynamiken)

— Många bollar

function setup()

print(“Många studsande bollar som interagerar genom elastiska fjädrar som aktiveras då bollarna är i kontakt.”)
print(“Bollars position kan ändras via touch.”)
print(“Styrning av bollradie R, fjäderstyvhet E, dämpning D och gravitation D.”)

I=20

parameter.number(“R”,1,200,50)
parameter.number(“E”,10,1000,100)
parameter.number(“G”,-1000,1000,100)
parameter.number(“D”,0,100,10)
x={}
xold={}
xm={}
v={}
vold={}
vm={}
a={}
f={}
F={}
mass={}
for i=1,I do
x[i]=vec2(math.random(100,400),math.random(100,800))
xold[i]=vec2(math.random(100,400),math.random(100,800))
xm[i]=vec2(math.random(100,400),math.random(100,800))
v[i]=vec2(0,0)
vold[i]=vec2(0,0)
vm[i]=vec2(0,0)
f[i]=vec2(0,0)
a[i]=vec2(0,0)
mass[i]=1
end

dt=0.01
n=0
end
t=0
function draw()
t=t+dt
print(t)
background(40, 40, 50)
fill(0, 68, 255, 255)
rect(0,200,1000,20)
rect(10,200,20,1000)
rect(450,200,20,1000)

for i=1,I do
fill(255, 0, 40, 255)
ellipse(x[i].x,x[i].y,R)
end

for p=1,4 do
for i=1,I do
f[i]=vec2(0,-G)
for j=1,I do
xm[i]=(x[i]+xold[i])/2
vm[i]=(v[i]+vold[i])/2
length=(xm[i]-xm[j]):len()
if length<R-5 then
f[i]=f[i]+E*(xm[i]-xm[j])
end
end
if x[i].y<250 then
f[i].y=f[i].y+E*10*(250-x[i].y)
end
if x[i].x<50 then
f[i].x=f[i].x+E*10*(50-x[i].x)
end
if x[i].x>420 then
f[i].x=f[i].x+E*10*(420-x[i].x)
end
a[i]=f[i]/mass[i]
v[i]=(1-0.001*D)*vold[i]+a[i]*dt
x[i]=xold[i]+vm[i]*dt
end
end

for i=1,I do
xold[i]=x[i]
vold[i]=v[i]
end
end
function touched(touch)
if touch.state==ENDED then
n=n+1
x[n]=vec2(CurrentTouch.x,CurrentTouch.y)
xm[n]= x[n]
xold[n]= x[n]
fill(255, 0, 40, 255)
ellipse(x[n].x,x[n].y,R)
end
end

Leave a comment