Translated this "fluid simulation" snippet I found from the internet to BlitzMax. Use mouse to apply force. Can be easily converted to blitz too.
'http://local.wasp.uwa.edu.au/~pbourke/modelling/fluid/
'->bmx = nawitus
Strict
Graphics 800,600,0
Const MinX#=0,MinY#=0,MaxX#=800,MaxY#=600
Const e#=0.96,accx#=0,accy#=0.01
Const numballs=400
Const Dee#=4,Dee2=Dee*dee*4,tc#=1.0
Global px#[numballs],py#[numballs],vx#[numballs],vy#[numballs],r#[numballs],ncollisions
SetClsColor(255,255,255)
SetColor(0,0,255)
create_balls()
Local FPSTimer,FPSCalc,FPS,a
Repeat
update_balls()
display_balls()
FPSCalc=FPSCalc+1
If MilliSecs()>FPSTimer+999 Then
FPSTimer=MilliSecs()
FPS=FPSCalc
FPSCalc=0
EndIf
DrawText "FPS: " + FPS,0,0
DrawText "Collisions: " + ncollisions,0,10
Flip False
Cls
If MouseDown(1)
For a=0 To numballs-1
vx[a]=vx[a]+0.05*MouseX()/GraphicsWidth()-0.025
vy[a]=vy[a]+0.05*MouseY()/GraphicsHeight()-0.025
Next
EndIf
Until KeyHit(KEY_ESCAPE)
Function create_balls()
Local i
For i=1 To numballs
px#[i-1] = Dee+Rnd()*(MaxX#-Dee*2)
py[i-1] = Dee+Rnd()*(MaxY#-Dee*2)
vx[i-1] = Rnd()*0.2
vy[i-1] = Rnd()*0.2
r#[i-1] = Dee
Next
End Function
Function display_balls()
Local i
For i=1 To numballs
DrawOval px[i-1]-r[i-1],py[i-1]-r[i-1],r[i-1]*2,r[i-1]*2
Next
End Function
Function update_balls()
Local a,b
ncollisions=0
Local d#,vxa#,vya#,vxb#,vyb#,nx#,ny#,m#,cdx#,dd#,cdy#,cosam#
For a=0 To numballs-1
For b=0 To numballs-1
If (a<>b)
d = (px[a]-px[b])*(px[a]-px[b])+(py[a]-py[b])*(py[a]-py[b])
If (d < Dee2) Then
ncollisions=ncollisions+1
d=Sqr(d)
vxa= vx[a]
vya=vy[a]
vxb=vx[b]
vyb=vy[b]
nx=px[b]-px[a]
ny=py[b]-py[a]
If Abs(d)>0.0001
cdx=nx/d
cdy=ny/d
dd=r[a]+r[b]-d
px[a] = px[a]-dd*cdx '/* just move them apart */
py[a] = py[a]-dd*cdy '/* no physical rationale, sorry */
px[b] = px[b]+dd*cdx
py[b] = py[b]+dd*cdy
m = Sqr(vx[a]*vx[a]+vy[a]*vy[a])
If (Abs(m)>0.0001) 'a velocity > 0 ? */
cosam = (cdx*vx[a]+cdy*vy[a]) * e
vxa = vxa-cdx*cosam
vya = vya-cdy*cosam '/* conserve momentum */
vxb = vxb+cdx*cosam
vyb = vyb+cdy*cosam
EndIf
m = Sqr(vx[b]*vx[b]+vy[b]*vy[b])
If (Abs(m) >0.0001)
cosam = (cdx*vx[b]+cdy*vy[b]) * e
vxa = vxa+cdx*cosam
vya = vya+cdy*cosam
vxb = vxb-cdx*cosam
vyb = vyb-cdy*cosam
EndIf
vx[a]=vxa
vy[a]=vya
vx[b]=vxb
vy[b]=vyb
EndIf
EndIf
EndIf
Next
Next
For a=0 To numballs-1
If (px[a]<= (minx+r[a]))
px[a]=minx+r[a]
vx[a] = -vx[a] * e
EndIf
If (px[a]>= (maxx-r[a]))
px[a]=maxx-r[a]
vx[a] = -vx[a] * e
EndIf
If (py[a]<= (miny+r[a]))
py[a]=miny+r[a]
vy[a] = -vy[a] * e
EndIf
If (py[a]>= (maxy-r[a]))
py[a]=maxy-r[a]
vy[a] = -vy[a] * e
EndIf
Next
For a=0 To numballs-1
vx[a] = vx[a]+accx*tc
vy[a] = vy[a]+accy*tc
px[a] = px[a]+vx[a]*tc
py[a] = py[a]+vy[a]*tc
Next
End Function
[edit ~ Blitzversion added to topic title]