public IPosition GetEscapePath(IPosition current, IEnumerable <IPosition> escape, IBattlefield battlefield) { const float desiredDistance = 20; var orderedByDistance = escape .Select(o => new { Position = o, Distance = current.GetDistance(o) }) .OrderByDescending(o => o.Distance); var low = orderedByDistance.First(); var high = orderedByDistance.Last(); var tuples = current .GetVector2() .GetDistancesTo(low.Position.GetVector2(), high.Position.GetVector2(), desiredDistance) .OrderByDescending(o => o.Item3); var escapeVectors = tuples .Where(o => o.Item1.AsVector3().IsInsideBounds(battlefield.CurrentBounds)); var best = escapeVectors .FirstOrDefault(); if (best == null) { best = tuples.First(); } return(best .Item1 .AsVector3() .Clamp(battlefield.CurrentBounds.Low, battlefield.CurrentBounds.High) .GetPosition()); }
public static float GetDistanceAbs(this IPosition position, IPosition other) { return(Math.Abs(position.GetDistance(other))); }