public override SteeringForce Calculate(BaseEntity entity) { var fleeFromEntities = GameWorld.Instance.EntitiesInArea(entity.Location, Radius); SteeringForce force = new SteeringForce(); int forcesCount = 0; foreach (var fleeFromEntity in fleeFromEntities) { if (fleeFromEntity.Type == FleeFrom) { var direction = Utility.Direction(entity.Location, fleeFromEntity.Location) - Math.PI; var distance = Utility.Distance(entity.Location, fleeFromEntity.Location); force += new SteeringForce(direction, (1 / distance) * Multiplier); forcesCount++; } } if (forcesCount == 0) { return(force); } force = force / forcesCount; return(force); }
private SteeringForce Alignment(BaseEntity entity, List <BaseEntity> closeEntities) { var force = new SteeringForce(); foreach (var closeEntity in closeEntities) { force += new SteeringForce(closeEntity.Direction, AlignmentStrength); } return(force / closeEntities.Count); }
private SteeringForce Seperation(BaseEntity entity, List <BaseEntity> closeEntities) { var force = new SteeringForce(); foreach (var closeEntity in closeEntities) { var direction = Utility.Direction(entity.Location, closeEntity.Location); var distance = Utility.Distance(entity.Location, closeEntity.Location); force += new SteeringForce(direction + Math.PI, (searchRadius - distance) * SeperationStrength); } return(force / closeEntities.Count); }
public override SteeringForce Calculate(BaseEntity entity) { avoidedObstacles = new List <ObstacleCircle>(); var force = new SteeringForce(); var obstacles = GameWorld.Instance.ObstaclesInArea(entity.Location, searchArea); double totalForce = 0; int forceCounterL = 0; int forceCounterR = 0; foreach (var obstacle in obstacles) { var distance = Utility.Distance(obstacle.Location, entity.Location); var angle = Utility.Direction(entity.Location, obstacle.Location); var angleDiff = angle - entity.Direction; var offset = Math.Sin(angleDiff) * distance; while (angleDiff > Math.PI) { angleDiff -= Math.PI * 2; } while (angleDiff < -Math.PI) { angleDiff += Math.PI * 2; } // ignore obstacles behind the entity if (Math.Abs(angleDiff) < Math.PI / 2) { if (Math.Abs(offset) < offsetMargin + obstacle.Radius) { avoidedObstacles.Add(obstacle); var amountToSteer = obstacle.Radius - Math.Abs(offset) + offsetMargin; var steeringNeed = distance; if (offset < 0) { force += new SteeringForce(entity.Direction + Math.PI / 2, avoidanceFactor / steeringNeed * amountToSteer); forceCounterL++; } else { force += new SteeringForce(entity.Direction - Math.PI / 2, avoidanceFactor / steeringNeed * amountToSteer); forceCounterR++; } totalForce += force.Amount; } } } if (forceCounterL + forceCounterR > 1) { force = new SteeringForce(forceCounterL > forceCounterR ? entity.Direction + Math.PI / 2 : entity.Direction - Math.PI / 2, totalForce); } return(force); }