Code archives/Algorithms/Queueing behaviour
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Simulates queueing of entities (people, cars etc) at intersection points. Pretty simple to understand and re-use. Feel free to use this as you wish but, please, say 'Hello' in the credits. | |||||
; Queueing behaviour from DarkNature. Graphics 640,480 Type person Field x,y Field tx,ty Field xd,yd Field img End Type Type target Field x,y End Type Global maxx=GraphicsWidth() Global maxy=GraphicsHeight() Global peepSize=10 Global maxpeeps=30 Global numpeeps=0 Global targets=3 SeedRnd(MilliSecs()) Function makePeople() imgPeep=CreateImage(peepSize,peepSize) SetBuffer(ImageBuffer(imgPeep)) Color 255,255,255 Oval 0,0,peepSize,peepSize Color 255,0,0 Oval 0,0,peepSize,peepSize,0 For i=0 To maxpeeps-1 p.person=New person p\x=Rnd(maxx) p\y=Rnd(maxy) p\img=CopyImage(imgPeep) numpeeps=numpeeps+1 MidHandle p\img Next FreeImage imgPeep SetBuffer BackBuffer() End Function Function makeTargets() For i=0 To targets-1 t.target=New target t\x=Rnd(maxx) t\y=Rnd(maxy) Next End Function Function chooseTarget(p.person) tmpD=999999 For a.target=Each target tdist=Sqr((p\x-a\x)^2+(p\y-a\y)^2) If tdist<tmpD tmpD=tdist p\tx=a\x p\ty=a\y End If Next End Function Function doPeople() For a.person=Each person a\xd=0 a\yd=0 chooseTarget(a) If a\x>a\tx a\xd=-1 If a\y>a\ty a\yd=-1 If a\x<a\tx a\xd=1 If a\y<a\ty a\yd=1 For b.person=Each person If a<>b tdistA=Sqr((a\x-a\tx)^2+(a\y-a\ty)^2) tdistB=Sqr((b\x-b\tx)^2+(b\y-b\ty)^2) dist=Sqr((a\x-b\x)^2+(a\y-b\y)^2) cdist=peepSize*1.5 If dist<cdist If tdistA>tdistB a\xd=0 a\yd=0 End If End If End If Next a\x=a\x+a\xd a\y=a\y+a\yd If a\x=a\tx And a\y=a\ty Delete a: numpeeps=numpeeps-1 Next End Function Function drawTargets() For t.target=Each target Color 0,0,0 Oval t\x-10,t\y-10,20,20 Color 255,255,0 Oval t\x-10,t\y-10,20,20,0 Next End Function Function drawPeople() Color 255,255,255 For a.person=Each person DrawImage a\img,a\x,a\y Next End Function ClsColor 0,0,100 tim=CreateTimer(30) go=False makeTargets() makePeople() While Not KeyHit(1) WaitTimer(tim) Cls Color 255,255,0 Text 20,20,"Left: "+numpeeps If go=False Text 300,450,"press space" If KeyHit(57) go=True End If If go doPeople() drawTargets() drawPeople() Flip If numpeeps=0 For t.target=Each target Delete t Next makeTargets() makePeople() End If Wend End |
Comments
None.
Code Archives Forum