Пример #1
0
        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);
        }
Пример #2
0
 public static float CalculateNormalizedDistanceTo(IRectangularF a, IRectangularF b) => NormalizeQuantity(a.CalculateDistanceTo(b), a.CalculateAngleTo(b), true);