kind of a demo of how springs can be used in simulations where you wouldnt maybe look for springs in the first place.
Rem Project: jellybox
Rem Created: Wednesday, April 24, 2013
Rem ***** Main Source File *****
Rem Project: Dark Basic Pro Project
Rem Created: Wednesday, April 24, 2013
Rem ***** Main Source File *****
sync on
global b = 12
a = b*b-1 : r# = 5
dim p(a) : dim v(a) : dim f(a) : dim exist(a) : dim e(10) : dim y(a) : dim x(a) : dim stress#(a) : dim n(a)
for i = 0 to a
p(i) = createvector2() : v(i) = createvector2() : f(i) = createvector2()
n(i) = createvector4()
set vector2 p(i),(i-(i/b-0.5)*b)*r#*1+400,((i/b-0.5))*r#*1
x(i) = getx(i) : y(i) = gety(i)
exist(i) = 1
NEXT
for i = 0 to a
x = i-1 : y = i+1 : z = geti(x(i),y(i)-1) : w = geti(x(i),y(i)+1)
if x >= 0 and x <= a
if y(x) <> y(i) or exist(x) = 0 then x = -1
else
x = -1
endif
if y >= 0 and y <= a
if y(y) <> y(i) or exist(y) = 0 then y = -1
else
y = -1
endif
if z >= 0 and z <= a
if exist(z) = 0 then z = -1
else
z = -1
endif
if w >= 0 and w <= a
if exist(w) = 0 then w = -1
else
w = -1
endif
set vector4 n(i),x,y,z,w
NEXT
for i = 1 to 10 : e(i) = createvector2() : next
ms = createvector2()
g = createvector2()
set vector2 g,0,3.81
k# = 1
dmp# = 0.01
m# = 1
dt# = 0.1
r2# = 95
k2# =4
flr# = 100
f# = 30.0
fric# = 0.00
do
set vector2 ms,mousex(),mousey()
for i = 0 to a : stress#(i) = 0 : next
for i = 0 to a
if x vector4(n(i)) > -1
n = x vector4(n(i))
subtract vector2 e(1),p(n),p(i) : l# = length vector2(e(1)) : scale vector2 e(2),e(1),1/l# : d# = k#*(l#-r#) : inc stress#(i),abs(d#) : inc stress#(n),abs(d#)
multiply vector2 e(2),d# : addvec(e(2),v(i),e(3),-dmp#) : addvec(e(2),v(n),e(3),dmp#) : add vector2 f(i),f(i),e(2) : subtract vector2 f(n),f(n),e(2)
endif
if z vector4(n(i)) > -1
n = z vector4(n(i))
subtract vector2 e(1),p(n),p(i) : l# = length vector2(e(1)) : scale vector2 e(2),e(1),1/l# : d# = k#*(l#-r#) : inc stress#(i),abs(d#) : inc stress#(n),abs(d#)
multiply vector2 e(2),d# : addvec(e(2),v(i),e(3),-dmp#) : addvec(e(2),v(n),e(3),dmp#) : add vector2 f(i),f(i),e(2) : subtract vector2 f(n),f(n),e(2)
endif
if ((mousex()-x vector2(p(i)))^2+(mousey()-y vector2(p(i)))^2) < (r2#+r#)^2
subtract vector2 e(1),ms,p(i) : l# = length vector2(e(1)) : scale vector2 e(2),e(1),1/l# : d# = k2#*(l#-r2#-r#): inc stress#(i),abs(d#)
multiply vector2 e(2),d# : add vector2 f(i),f(i),e(2)
ENDIF
for j = i+1 to a
if (x vector2(p(j))-x vector2(p(i)))^2+(y vector2(p(j))-y vector2(p(i)))^2 < (r#*15)^2
subtract vector2 e(1),p(j),p(i) : l# = max(length vector2(e(1)),1) : scale vector2 e(2),e(1),1/l# : d# = -k#*(f#/(l#)): inc stress#(i),abs(d#) : inc stress#(j),abs(d#)
multiply vector2 e(2),d# : addvec(e(2),v(i),e(3),-dmp#) : addvec(e(2),v(j),e(3),dmp#) : add vector2 f(i),f(i),e(2) : subtract vector2 f(j),f(j),e(2)
endif
next
add vector2 f(i),f(i),g
if y vector2(p(i)) > screen height()-200 then set vector2 f(i),x vector2(f(i))-x vector2(v(i))*fric#,y vector2(f(i))+(screen height()-200-y vector2(p(i)))*flr#
if x vector2(p(i)) > screen width()-100 then set vector2 f(i),x vector2(f(i))+(screen width()-100-x vector2(p(i)))*flr#,y vector2(f(i))
if x vector2(p(i)) < 100 then set vector2 f(i),x vector2(f(i))+(100-x vector2(p(i)))*flr#,y vector2(f(i))
next
for i = 0 to a
multiply vector2 f(i),dt#/m#
add vector2 v(i),v(i),f(i)
set vector2 f(i),0,0
addvec(p(i),v(i),e(1),dt#)
next
inc loops
if tmr < hitimer(90000)
tmr = hitimer(90000)+3000
print loops*30.0
loops = 0
a2circle mousex(),mousey(),r2#+r#,rgb(255,255,255)
a2line 100,screen height()-200,screen width()-100,screen height()-200,rgb(255,255,255)
a2line 100,screen height()-200,100,0,rgb(255,255,255)
a2line screen width()-100,screen height()-200,screen width()-100,0,rgb(255,255,255)
a2starttrianglebatch a*2
for i =0 to a
rem if exist(i) = 1 then a2circle x vector2(p(i)),y vector2(p(i)),1,rgb(stress#(i),0,0)
i1 = x vector4(n(i)) : i2 = z vector4(n(i))
if i1 > -1 and i2 > -1
s1# = (stress#(i)^2)/64.0 : s2# = (stress#(i1)^2)/64.0 : s3# = (stress#(i2)^2)/64.0
vectriangle(p(i),p(i1),p(i2),rgb(min(s1#,255),min(s1#*0.5,255),min(s1#*0.1+50,255)),rgb(min(s2#,255),min(s2#*0.5,255),min(s2#*0.1+50,255)),rgb(min(s3#,255),min(s3#*0.5,255),min(s3#*0.1+50,255)))
endif
i1 = y vector4(n(i)) : i2 = w vector4(n(i))
if i1 > -1 and i2 > -1
s1# = (stress#(i)^2)/64.0 : s2# = (stress#(i1)^2)/64.0 : s3# = (stress#(i2)^2)/64.0
vectriangle(p(i),p(i1),p(i2),rgb(min(s1#,255),min(s1#*0.5,255),min(s1#*0.1+50,255)),rgb(min(s2#,255),min(s2#*0.5,255),min(s2#*0.1+50,255)),rgb(min(s3#,255),min(s3#*0.5,255),min(s3#*0.1+50,255)))
endif
remstart
if x(i) = b+b-1 or x(i) = b
if y(i) >= 0 and y(i) < b then a2line x vector2(p(i)),y vector2(p(i)),x vector2(p(geti(x(i),y(i)-1))),y vector2(p(geti(x(i),y(i)-1))),rgb(255,255,0)
endif
if y(i) = -1 or y(i) = b-2
if x(i) >= b+1 and x(i) < b+b then a2line x vector2(p(i)),y vector2(p(i)),x vector2(p(geti(x(i)-1,y(i)))),y vector2(p(geti(x(i)-1,y(i)))),rgb(255,255,0)
endif
remend
remstart
if (mousex()-x vector2(p(i)))^2+(mousey()-y vector2(p(i)))^2 < r#*r#*r#*r#
print z vector4(n(i))
print i
endif
remend
NEXT
a2endbatch
sync
cls
endif
LOOP
function vectriangle(p1,p2,p3,c1,c2,c3)
a2filltriangle x vector2(p1),y vector2(p1),x vector2(p2),y vector2(p2),x vector2(p3),y vector2(p3),c1,c2,c3
ENDFUNCTION
function createvector2()
n = find free vector()
u = make vector2(n)
ENDFUNCTION n
function createvector4()
n = find free vector()
u = make vector4(n)
ENDFUNCTION n
function gety(v)
y = floor(v/b-0.5)
ENDFUNCTION y
function getx(v)
x = v-floor(v/b-0.5)*b
ENDFUNCTION x
function geti(x,y)
n = x+b*y
ENDFUNCTION n
function addvec(v1,v2,v3,dt#)
scale vector2 v3,v2,dt#
add vector2 v1,v3,v1
ENDFUNCTION
[edit} much better version. looks way better and faster.
[edit2] heavy optimisation. runs twice faster and works much more realistically. fixed a bad rookie physics mistake.
requires a2plugin and maybe matr1x plugin