## Implementation of the flocking algorithms

To implement the above mentioned behaviors, we will consider the following class hierarchy:

A single boid is represented by an instance of the `clBoid`

class, which holds a pointer to an instance of `iBehaviour`

. The `iBehavior`

interface contains a single member function, `GetControl()`

, which calculates the instant force acting on a boid. Since the force magnitude might depend on a boid's state, we pass a raw non-owning pointer to `clBoid`

into `GetControl()`

:

class iBehaviour: public iIntrusiveCounter { public: virtual vec2 GetControl( float dt, clBoid* Boid ) = 0; };

Let's consider the `clBoid`

class itself. It contains `m_Pos`

and `m_Vel`

fields, which hold the current position and velocity of the boid, respectively. These values are two-dimensional vectors, but the whole structure can be extended to 3D logic using three-component vectors:

class clBoid: public iActor { public: vec2 m_Pos; vec2 m_Vel;

The `m_Angle`

field is the boid's instant orientation, and it...