Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }