[futurebasic] Boids! Nice ones. :)

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : June 2002 : Group Archive : Group : All Groups

From: Robert Covington <artlythere@...>
Date: Tue, 25 Jun 2002 05:31:19 -0400
FB^3 Program. They really work now. :)

Beware the line wrap. Tried to accomodate, but one never knows.

Cool!:)

Robert Bob Flockenheimer


'------------ Begin FB 3 Program---------------
/*
Boids, FB 3 Program By Robert Covington ©2002

Based on PseudoCode by Conrad Parker <conrad@...>
describing and enhancing Reynold's Boid Algorithm
*/

Begin Globals

_TotalBoids = 80 // adjust to suit

_wndW  = 500
_wndH  = 500

begin record Vector
DIM x as Double
DIM y as Double
end Record

Begin Record Boid
DIM position   as Vector
DIM velocity   as Vector
End Record

DIM bd(_TotalBoids) as Boid

DIM pc as vector// for passing , rule 1
DIM cc as vector// for passing , rule 2
DIM pv as vector// for passing , rule 3
DIM pz as vector // for passing , Zookeeping

End Globals


/* Rule 1: Boids try to fly towards the centre of mass of
 neighbouring boids.*/

Local
LOCAL FN Rule_1(sumBoid)
DIM j as int
pc.x = 0
pc.y = 0

// Total Center of Mass
//c = (b1.position + b2.position + ... + bN.position) / N

For j = 0 to _totalBoids
Long IF sumBoid <> j
pc.x = pc.x + bd.position.x(j)
pc.y = pc.y + bd.position.y(j)
END IF
Next j

pc.x = pc.x / (_TotalBoids - 1)
pc.y = pc.y / (_TotalBoids - 1)

pc.x = (pc.x - bd.position.x(sumboid)) / 200
pc.y = (pc.y - bd.position.y(sumboid)) / 200

END FN

/* Rule 2: Boids try to keep a small distance away
from other objects (including other boids).*/

Local
DIM tx as Double
DIM ty as double
Local FN BoidDistance#(b1,b2)
tx = (bd.position.x(b1)-bd.position.x(b2))^2
ty = (bd.position.y(b1)-bd.position.y(b2))^2
End FN = SQR(tx+ty)

Local
DIM dist as double
LOCAL FN Rule_2(sumBoid)
DIM j as int
cc.x = 0
cc.y = 0
FOR j = 0 to _TotalBoids
LONG IF j <> sumBoid
dist = FN BoidDistance#(sumboid,j)
Long IF dist < 4// Adjust to spread flock
cc.x = cc.x - (bd.position.x(sumboid) - bd.position.x(j))
cc.y = cc.y - (bd.position.y(sumboid) - bd.position.y(j))
END IF
End if
Next j
END FN

/* Rule 3: Boids try to match velocity with near boids. */


LOCAL FN Rule_3(sumboid)
DIM j as int

FOR j = 0 to _TotalBoids
Long IF j <> sumboid
pv.x = pv.x + bd.velocity.x(j)
pv.y = pv.y + bd.velocity.y(j)
END IF
Next j

pv.x = pv.x / (_TotalBoids - 1)
pv.y = pv.y / (_TotalBoids - 1)

pv.x = (pv.x - bd.velocity.x(sumboid)) / 8
pv.y = (pv.y - bd.velocity.y(sumboid)) / 8

END FN


Local FN ZooZoo(sumboid)

pz.x = 0
pz.y = 0

LONG IF bd.position.x(sumBoid) < 0
pz.x = 10
XELSE
LONG IF bd.position.x(sumBoid) > _wndW
pz.x = -10
END IF
END IF

LONG IF bd.position.y(sumBoid) < 0
pz.y = 10
XELSE
Long If bd.position.y(sumBoid) > _wndH
pz.y = -10
End IF
END IF

End FN


LOCAL FN Move_All_Boids_To_New_Positions
DIM j as int

FOR j = 0 to _TotalBoids

FN Rule_1(j) // Returns pc
FN Rule_2(j) // Returns cc
FN Rule_3(j) // Returns pv
FN ZooZoo(j)

bd.velocity.x(j) = bd.velocity.x(j) + pc.x + cc.x + pv.x + pz.x
bd.velocity.y(j) = bd.velocity.y(j) + pc.y + cc.y + pv.y + pz.y

// Calc Boid new position and velocity sums

bd.position.x(j) = bd.position.x(j) + bd.velocity.x(j)
bd.position.y(j) = bd.position.y(j) + bd.velocity.y(j)

Next j

END FN

LOCAL FN Init_Boid_Positions
DIM j
// 'Maybe' helps smooth first dive to lower right
for j = 0 to _TotalBoids
bd.position.x(j) = RND(_wndW)
bd.position.y(j) = RND(_wndH)
bd.velocity.x(j) = RND(_wndW)\_wndW*Maybe
bd.velocity.y(j) = RND(_wndH)\_wndH*Maybe
Next j
End FN

Local FN Draw_All_Boids
DIM j,track

//track = _ZTrue // Don't Track,otherwise, a boid number.

Cls // Erase to background.

For j = 0 to _TotalBoids
//if j = track Then Long color 0,0,65535,1 ¬
//else Long color 65535,65535,0,1
Plot bd.position.x(j),bd.position.y(j)
Next j

End FN

// MAIN

FN Init_Boid_Positions // Fire It Up

DIM ticks as long

Window 1,"Boids",(0,0)-(_wndW,_wndH),_DocNoGrow

long color 0,0,0,0 // Erase To Black
Long color 65535,65535,0,1 // Boid Color

FN Draw_All_Boids // Init Draw

ticks = FN TickCount

Do
Long if FN TickCount-Ticks >= 2 // or 3.
FN Draw_All_Boids
FN Move_All_Boids_To_New_Positions
ticks = FN tickCount
end if // End Frame Speed Limiter
Until FN Button

'------------ End FB 3 Program---------------