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

Advertisements

Spel29: Studsande Boll på Fjädrande Underlag

bouncing ball                                           Watch bouncing sibling balls

Vi programmerar dynamiken hos en stel boll som studsar och rullar på ett fjädrande underlag.

Template: (Titta på simulering)

— Bouncing Rolling Ball on Elastic Support

function setup()
print(“Boll som studsar och rullar på ett elastiskt underlag.”)
print(“Parametrar: tidssteg = 1/M, bollradie R, dämpning D.”)
print(“Nytt utgångsläge genom touch.”)
b={}
I=100
E=10

parameter.number(“M”,10,1000,100)
parameter.number(“R”,10,1000,200)
parameter.number(“D”,0,100,1)

for i=1,I do
b[i]=R*vec2(math.cos(2*math.pi*i/I),math.sin(2*math.pi*i/I))
end

cyl=vec2(200,700)
vel=vec2(0,0)
r=vec2(0,0)
force=vec2(0,0)
fill(0, 49, 255, 255)
t=0

end

function draw()
dt=1/M
t=t+1
background(216, 255, 0, 255)
fill(0, 38, 255, 255)
strokeWidth(0)
force=vec2(0.5,-4000)
m=0
for i=1,I do
dx= cyl.x+b[i].x
dy= cyl.y+b[i].y
if dy<400 then
m=m+1
force.y=force.y+E*(400-dy)
if m<3 then
fill(8, 231, 14, 255)
strokeWidth(0)
rect(0,200,800,dy-200)
end
stroke(255*(400-dy)/40,255*(dy-380)/20,0, 255)
strokeWidth(5)
line(dx,200,dx,dy)
end
end
vel=(1-0.01*D)*vel+force*dt
cyl=cyl+vel*dt

strokeWidth(0)
fill(0, 34, 255, 255)
ellipse(cyl.x,cyl.y,2*R)
fill(25, 26, 22, 255)
rect(0,190,800,20)
for i=1,I do
b[i]=R*vec2(math.cos(2*math.pi*(i/I-t/1000)),math.sin(2*math.pi*(i/I-t/1000)))
fill(255, 0, 242, 255)
ellipse(cyl.x+b[i].x,cyl.y+b[i].y,10)
end
end
function touched(touch)
if touch.state==ENDED then
cyl=vec2(touch.x,touch.y)
end
end

Spel30: Pin Ball Game

787530-pinball8                                                    3d Pinball Space Cadet

Pinball:

En rörlig boll studsar mot en uppsättning fasta bollar och väggar via fjädrar. Bollen kan påverkas i x-led via lutning av skärmen.

Styrning av bollradie R, fjäderstyvhet E, dämpning D och gravitation G.

Räkning av antalet studsar. Jämför med Mechanics1 på App Store.

Template: (Titta på ett game)

— Pin Ball

function setup()

print(“Pinball: En rörlig boll studsar mot en uppsättning fasta bollar och väggar via fjädrar.”)
print(“Bollen kan påverkas i x-led via lutning av skärmen.”)
print(“Styrning av bollradie R, fjäderstyvhet E, dämpning D och gravitation G.”)
print(“Räkning av antalet studsar.”)

speech.volume=1
speech.rate=0.01
speech.say(“Test my pinball game, please!”)

parameter.number(“R”,1,200,50)
parameter.number(“E”,10,2000,1000)
parameter.number(“G”,-1000,1000,100)
parameter.number(“D”,0,100,0)
x={}
ball=vec2(0,0)
v=vec2(math.random(100,500),0)
f=vec2(0,0)
I=8
n=0
t=0
dt=0.01
stop=0

for i=1,I do
x[i]=vec2(0,0)
end

x[1]=vec2(150,800)
x[2]=vec2(300,800)
x[3]=vec2(120,600)
x[4]=vec2(330,600)
x[5]=vec2(150,400)
x[6]=vec2(300,400)
x[7]=vec2(70,270)
x[8]=vec2(430,260)
ball =vec2(300,900)

end

function draw()

if stop ==0 then

background(40, 40, 50)
fill(0, 68, 255, 255)
rect(10,200,170,20)
rect(300,200,170,20)
rect(10,200,20,720)
rect(450,200,20,720)
rect(10,900,450,20)

for i=1,I do
fill(255, 0, 40, 255)
sprite(“Space Art:UFO”,x[i].x,x[i].y,R)
end

fill(0, 255, 0, 255)
ellipse(ball.x,ball.y,R)

for j=1,I do
length=(ball-x[j]):len()
if length<R-5 then
sound(“Game Sounds One:Knock 2”)
n=n+1
font(“AmericanTypewriter”)
fontSize(200)
fill(255, 7, 0, 255)
text(n,300,800)
sprite(“Space Art:Red Explosion”,x[j].x,x[j].y,100)
f=f+2*E*(ball-x[j])
v=v+f*dt
ball=ball+v*dt
end
end

f=vec2(1000*Gravity.x,-G)
if ball.y<250 and ball.x < 180 then
f.y=f.y+20*E*(250-ball.y)
end
if ball.y<250 and ball.x>320 then
f.y=f.y+20*E*(250-ball.y)
end
if ball.y<170 then
stop=1
font(“AmericanTypewriter”)
fontSize(100)
fill(255, 7, 0, 255)
text(“Game Over”,200,300)
text(“Total=”..n,200,400)
speech.say(“Sorry, game over,”)
end
if ball.y>900 then
f.y=f.y+20*E*(900-ball.y)
end
if ball.x<50 then
f.x=f.x+E*(50-ball.x)
end
if ball.x>420 then
f.x=f.x+E*(420-ball.x)
end
v=(1-0.001*D)*v+f*dt
ball=ball+v*dt

end
end

Spel31: Balans Kontroll

balldog                                          Hund som balanserar boll!

Vi programmerar ett spel som går ut på att balansera ett antal bollar staplade på varandra via fjädrar och utsatta för viss störning i x-led, genom att med touch flytta den understa bollen. Parametrar för bollradie R, fjäderstyvhet E, dämpning D och gravitation G.

Börja med 2 bollar, sedan 3 osv. Jämför med Mechanics2 på App Store.

Template: (Titta på exempel med 4 bollar)

— Balanskontroll

function setup()

print(“Försök balansera ett antal bollar travade på varandra via fjädrar och utsatta för viss störning i x-led, genom att med touch flytta den understa bollen.”)
print(“Parametrar för bollradie R, fjäderstyvhet E, dämpning D och gravitation G.”)
print(“Börja med 2 bollar,sedan 3 osv”)

I=4

parameter.number(“R”,1,200,75)
parameter.number(“E”,1,100000,100)
parameter.number(“G”,1,100000,2000)
parameter.number(“D”,1,1000,500)

x={}
v={}
f={}
xb={}

for i=1,I do
x[i]=vec2(200,100+2*i*R)
v[i]=vec2(0,0)
f[i]=vec2(0,0)
end

for i=1,I do
xb[i]={}
end

dt=0.01
start=0

end

function draw()

background(40, 40, 50)

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

for i=2,I do
f[i]=vec2(math.random(-100,100),-G)
for j=1,I do
dist=(x[i]-x[j]):len()
if dist < 2*R-5 then
f[i]=f[i]+E*(x[i]-x[j])
end
end
v[i]=(1-0.001*D)*v[i]+f[i]*dt
x[i]=x[i]+v[i]*dt
end

end

function touched(touch)

x[1]=vec2(CurrentTouch.x,CurrentTouch.y)

end

Spel32: AngryMathBirds WindMill

WindfarmBirdsTeoTodorovCCON                                                    Jämför med verkligheten

Vi programmerar en flock AngryMathBirds som måste passera genom en park av vindsnurror. Om en AngryMathBird träffas av en rotor faller den död ner och rotorn hejdas en stund i sin rotation.

Styrning av AngryMathBird genom skärmens lutning. Parameterkontroll av gravitation G, fjäderstyvhet E och bildstorlek R.

Räkning av totala antalet och antalet döda fåglar. Ny flock av AngryMathBirds genom touch. Antalet i flocken anges av J med start J=1, dvs en ensam fågel. Jämför med Biology1 på App Store.

Template: (Följ ensam fågel här och flock här)

– AngryBirds WindMill

function setup()

print(“En flock AngryBirds måste passera genom en park av vindsnurror.”)
print(“Om en AngryBird träffas av en rotor faller AngryBird död ner och rotorn hejdas en stund i sin rotation.”)
print(“Styrning av AngryBird genom skärmens lutning”)
print(“Parameterkontroll av gravitation G, fjäderstyvhet E och bildstorlek R.”)
print(“Räkning av totala antalet och antalet döda fåglar.”)
print(“Ny flock av AngryBirds genom touch.”)
print(“Antalet fåglar i flocken anges av J med start J=1.”)

I=12
J=1

parameter.number(“R”,1,200,50)
parameter.number(“E”,10,1000,100)
parameter.number(“G”,-100,100,-30)

x={}
xc={}
v={}
bird={}
birdv={}
g={}

for j=1,J do
bird[j]=vec2(0,0)
birdv[j]=vec2(0,0)
g[j]=0
end

f=vec2(0,0)
F=vec2(0,0)

n=0
N=0

for i=1,4 do
x[i]=vec2(0,0)
xc[i]=vec2(250*i-100,600)
v[i]=vec2(0,0)
end
for i=5,8 do
x[i]=vec2(0,0)
xc[i]=vec2(250*(i-4)-200,450)
v[i]=vec2(0,0)
end
for i=9,I do
x[i]=vec2(0,0)
xc[i]=vec2(250*(i-8)-100,300)
v[i]=vec2(0,0)
end

for j=1,I do
x[j]=vec2(30,0)
end

for i=1,I do
v[i]=vec2(0,10)
end

for j=1,J do
bird[j]=vec2(math.random(100,400),math.random(800,900))
birdv[j]=vec2(0,0)
end

t=0
dt=0.02
n=0

end

function draw()

t=t+1
background(252, 252, 252, 255)

for i=1,I do
v[i]=v[i]-100*x[i]*dt
x[i]=x[i]+v[i]*dt
d=x[i]:len()
x[i]=50*x[i]/d
sprite(“Dropbox:landscape2”,300,140,1000,200)
sprite(“Dropbox:windmill”,xc[i].x,xc[i].y,5*R)
stroke(214, 225, 214, 255)
strokeWidth(10)
line(xc[i].x-x[i].x,xc[i].y-x[i].y,xc[i].x+x[i].x,xc[i].y+x[i].y)
end

for j=1,J do
sprite(“Dropbox:angrybird”,bird[j].x,bird[j].y,R)
end

for j=1,J do
for i=1,I do
length=(bird[j]-x[i]-xc[i]):len()
if length<R-5 and g[j]==0 then
n=n+1
sound(“Game Sounds One:Horror Howl 2”)
g[j]=10
font(“AmericanTypewriter”)
fontSize(200)
fill(255, 7, 0, 255)
sprite(“Space Art:Red Explosion”,xc[i].x,xc[i].y,100)
F=0.01*E*(bird[j]-x[i]-xc[i])
bird[j]=bird[j]+birdv[j]*dt
f=vec2(x[i].y,-xc[i].x)*(x[i].y*F.x-x[i].x*F.y)
v[i]=v[i]-x[i]*dt-f*dt
x[i]=x[i]+v[i]*dt
end
fill(255, 15, 0, 255)
text(n,300,600)
fill(0, 41, 255, 255)
text(N,300,300)
birdv[j]=birdv[j]+vec2(0,-0.1*G-g[j])*dt+vec2(0.3*Gravity.x,0.1*Gravity.y)
birdv[j]=birdv[j]+0.01*F*dt
bird[j]=bird[j]+birdv[j]*dt
end
end

end

function touched(touch)
if touch.state==ENDED then
N=N+1
for j=1,J do
bird[j]=vec2(math.random(100,400),math.random(800,900))
birdv[j]=vec2(0,0)
g[j]=0
end
end
end

Spel34: Gunga med/utan Resonant Drivning

Image-Tacoma_Narrows_Bridge1

Titta på hur Tacoma Bridge kollapsar under resonant drivning från stormvind.

Vi programmerar harmonisk svängning av gunga med resonant eller icke-resonant drivning. Jämför med Secret of the Piano på App Store samt förstås Tacoma Bridge.

Template: (Titta på resonant drivning)

— Gunga Resonans
function setup()

print(“Harmonisk svängning av gunga driven av push-pull harmonisk svänging.”)
print(“Resonans om frekvensen av drivingen är lika med gungans egenfrekvens.”)
print(“Icke-resonans om frekvensen av drivingen är skild från gungans egenfrekvens.”)
x1=0
v1=0
x2=0
v2=5
dt=0.01
F1=1
F2=1

end

function draw()

background(236, 230, 234, 255)

x1=x1+v1*dt
v1=v1-F1^2*x1*dt+0.5*x2*dt

x2=x2+v2*dt
v2=v2-F2^2*x2*dt

strokeWidth(0)
stroke(255, 0, 44, 255)
sprite(“Dropbox:gungan”,300+200*math.sin(0.1*x1),600-200*math.cos(0.1*x1),80)
sprite(“Dropbox:gungan”,300+10*x1,200,80)
sprite(“Dropbox:pushpull”,310+10*x2,300,150)
strokeWidth(5)
line(300,600,300+150*math.sin(0.1*x1),600-150*math.cos(0.1*x1))
line(310,200,310+10*x1,200)

end

Spel33: Rally

rally                                                      Följ rally från insidan

Vi programmerar enkelt rally där bilen styrs genom lutning av skärmen i x-led. Banans kurvor styrs av harmonisk svängning (sinus eller cosinus). Parametrar för kurvor D, tidsteg 1/N (hastighet) och effekt av skärmlutning. Jämför med Mechanics2 på App Store

Template: (Följ rally från insidan)

function setup()
print(“Road Racing”)
print(“Följ vägbanan genom lutning i x-led.”)
print(“Parametrar för väg D, tidsteg 1/N och effekt av lutning G.”)

parameter.number(“D”,0,100,8)
parameter.number(“N”,10,100,10)
parameter.number(“G”,10,100,40)
car=vec2(400,100)
road=100
roadv=-100
font(“AmericanTypewriter”)
fill(248, 2, 16, 255)
fontSize(100)
sound(“Game Sounds One:Wind 2”)

end

function draw()

dt=1/N
background(3, 3, 3, 255)
inside = readImage(“Dropbox:insideracingcar”)
stroke(223, 255, 0, 255)

for i=1,1000 do
road=road+roadv*dt
roadv=roadv-road*dt
strokeWidth(2+(D*i)/100)
line(road+200,-D*i+1050,road+200+0.3*D*i,-D*i+1050)
sprite(“Planet Cute:Wall Block Tall”,road+150,-D*i+1050,10+0.05*D*i)
sprite(“Planet Cute:Wall Block Tall”,road+250+0.3*D*i,-D*i+1050,10+0.05*D*i)
end

car=car+vec2(G*Gravity.x,0)
sprite(inside,car.x,car.y,40*D)

end