Author Topic: Water physics, maybe? (Blitzmax)[BMAX]  (Read 3934 times)

0 Members and 1 Guest are viewing this topic.

Offline nawitus

  • C= 64
  • **
  • Posts: 50
  • Karma: 1
    • View Profile
Water physics, maybe? (Blitzmax)[BMAX]
« on: October 14, 2006 »
Translated this "fluid simulation" snippet I found from the internet to BlitzMax. Use mouse to apply force. Can be easily converted to blitz too.

Code: [Select]
'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]
« Last Edit: July 21, 2007 by Shockwave »

Offline Dad1916

  • Atari ST
  • ***
  • Posts: 112
  • Karma: 3
    • View Profile
Re: Water physics, maybe?
« Reply #1 on: October 14, 2006 »
Thanks for the conversion. Only getting 5 fps on this ibook though:(

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17412
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Water physics, maybe?
« Reply #2 on: October 14, 2006 »
Exe Please ! :)
Thank you.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline nawitus

  • C= 64
  • **
  • Posts: 50
  • Karma: 1
    • View Profile

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17412
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Water physics, maybe?
« Reply #4 on: October 15, 2006 »
Cool! :) That really does behave quite a lot like water! Very nice and fun to play with too.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline Rbz

  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 2757
  • Karma: 493
    • View Profile
    • https://www.rbraz.com/
Re: Water physics, maybe?
« Reply #5 on: October 15, 2006 »
Very cool simulation!

For those who want learn more about it, check out Paul Bourke pages:
http://local.wasp.uwa.edu.au/~pbourke/modelling/fluid/index.html
and here
http://local.wasp.uwa.edu.au/~pbourke/modelling/particle/index.html
Challenge Trophies Won: