public SwarmInstinct(ISwarmer _swarmer, float _radiusOfRepulsion = 20, float _radiusOfAlignment = 40, float _radiusOfAttraction = 80, float _repulsionMultiplier = 50, float _alignmentMultiplier = 1, float _attractionMultiplier = 1) { swarmer = _swarmer; //Verify arguments if (_radiusOfRepulsion > _radiusOfAlignment) { throw new ArgumentException("_radiusOfRepulsion must be <= _radiusOfAlignment"); } if (_radiusOfAlignment > _radiusOfAttraction) { throw new ArgumentException("_radiusOfAlignment must be <= _radiusOfAttraction"); } RadiusOfRepulsion = _radiusOfRepulsion; RadiusOfAlignment = _radiusOfAlignment; RadiusOfAttraction = _radiusOfAttraction; RadiusOfRepulsionSquared = RadiusOfRepulsion * RadiusOfRepulsion; RadiusOfAlignmentSquared = RadiusOfAlignment * RadiusOfAlignment; RadiusOfAttractionSquared = RadiusOfAttraction * RadiusOfAttraction; RepulsionMultiplier = _repulsionMultiplier; AlignmentMultiplier = _alignmentMultiplier; AttractionMultiplier = _attractionMultiplier; }
/// <summary> /// Determines what this swarmer should do in response to the given neighbor within the radius of attraction /// </summary> /// <param name="_neighbor"></param> /// <returns>The vector for what direction this swarmer should do in response to the given neighbor</returns> private Vector2 swarmVectorForNeighbor(ISwarmer _neighbor) { if (swarmer == _neighbor) { return(Vector2.Zero); } var position = new Vector2(swarmer.X, swarmer.Y); var neighborPosition = new Vector2(_neighbor.X, _neighbor.Y); var distanceSquared = neighborPosition.DistanceSquared(position); return(distanceSquared < 0.001f ? Vector2.Zero : distanceSquared <= RadiusOfRepulsionSquared ? RepulsionMultiplier * (position - neighborPosition).Normalized() : distanceSquared <= RadiusOfAlignmentSquared ? AlignmentMultiplier *Engine.Utils.Vector2(_neighbor.Angle) : distanceSquared <= RadiusOfAttractionSquared ? AttractionMultiplier * (neighborPosition - position).Normalized() : Vector2.Zero); }