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---------------