private static List <IRectangularF> GetLineOfSight(this IRectangularF from, IRectangularF to, List <IRectangularF> obstacles, float increment = .5f) { IRectangularF current = from; var currentDistance = current.CalculateDistanceTo(to); var a = current.Center().CalculateAngleTo(to.Center()); var path = new List <IRectangularF>(); while (currentDistance > increment) { current = RectangularF.Create(MoveTowards(current.Center(), a, increment), current); current = RectangularF.Create(current.Left - current.Width / 2, current.Top - current.Height / 2, current.Width, current.Height); foreach (var obstacle in obstacles) { if (obstacle == to || obstacle == from) { continue; } else if (obstacle.OverlapPercentage(current) > 0) { return(null); } } path.Add(current); currentDistance = current.CalculateDistanceTo(to); } return(path); }
public static float CalculateNormalizedDistanceTo(IRectangularF a, IRectangularF b) => NormalizeQuantity(a.CalculateDistanceTo(b), a.CalculateAngleTo(b), true);