Introduction to Computer Science I Term
Swarm and Flocking Behavior:
Swarming and Edge Avoidance (last updated 4/14/2006)
For the third deliverable, you will combine the first and second
actual swarm behavior.
This week, you should modify your update-critter function so that the
new velocity vector reflects the combination of the existing velocity
and the steering vectors from
alignment, cohesion, and separation. You may have to do some
experimentation to discover how best to accomplish this. For
example, the different steering components may need to be weighted
are ideas in
this paper, but you
are encouraged to think about alternatives of your own design. Be
especially careful to document this part of your code. Note: you may want to modify the contract
of your update-critter function to also consume a swarm in addition to
the critter to be updated.
In addition, you should modify your update-critter so that instead of
wrapping around the edge of the canvas, the edges exert a repelling
force (like that of separation) causing critters to steer away from
them. You might choose to apply this avoidance only in situations
where the wall is closer than the defined radius of vision; that is, if
the wall is close enough to be a neighbor (if it was a critter) then
construct and apply the appropriate avoidance vector. The wall
avoidance steering vector should be included in the same context as
alignment, cohesion and separation.
Lastly, without some help your critters will tend to form a group
and then sit there in one place or move very slowly. To look more
interesting and life-like, you should add a default-speed or nominal speed to
your critter definition. Thus, our structure definition is
(define-struct critter (location velocity type color
default-speed)). Critters will tend to move at this speed
unless influenced by other critters and walls. Notice, that speed
is directionless; the speed of a critter is merely the magnitude of its
vector. You will need to add or subtract a small amount to your
new velocity if the critter is moving slower or faster (respectively)
than its nominal speed. Again, the speed-adjustment should be
included in the same context as the other steering vectors.
For this week's project deliverable, you should have working code that
of critters should coalesce and move together. They should not
bunch up but should move as a group.
When a swarm of critters approach an edge, it (the swarm) should steer
away from it. This should happen as a consequence of the
individual critters steering away from the edge. However, the
front of the swarm will naturally notice and turn first, which should
have a cascading effect on the rest of the swarm.
animate-swarm: swarm number
-> true. Make sure you have this function from the
To grade this deliverable, I will review your code (including
contracts, purpose statements, indentation, etc.) and I will run the animate-swarm with my own
swarm. It is important that you follow
the instructions carefully.