示例#1
0
 public BleReceiver GetOther(BleReceiver receiver)
 {
     if (Equals(receiver, From))
     {
         return(To);
     }
     if (Equals(receiver, To))
     {
         return(From);
     }
     return(null);
 }
示例#2
0
        public bool PointOnPath(BleReceiver origin, PointF location, out double distance)
        {
            PointF start = origin.Position;

            distance = 0;
            PointF end;
            bool   backwards;

            if (Equals(origin, From))
            {
                end       = To.Position;
                backwards = false;
            }
            else if (Equals(origin, To))
            {
                end       = From.Position;
                backwards = true;
            }
            else
            {
                return(false);
            }
            if (WayPoints.IsNullOrEmpty())
            {
                return(GeometryUtil.PointOnPath(location, start, end, out distance));
            }
            PointF firstWayPoint, lastWayPoint;
            var    waypPontCount = WayPoints.Count;
            double totalDistance;

            if (backwards)
            {
                firstWayPoint = WayPoints.Last();
                if (GeometryUtil.PointOnPath(location, start, firstWayPoint, out distance))
                {
                    return(true);
                }
                totalDistance = GeometryUtil.GetDistance(start, firstWayPoint);
                for (int i = waypPontCount - 1; i > 0; i--)
                {
                    if (GeometryUtil.PointOnPath(location, WayPoints[i], WayPoints[i - 1], out distance))
                    {
                        distance += totalDistance;
                        return(true);
                    }
                    totalDistance += GeometryUtil.GetDistance(WayPoints[i], WayPoints[i - 1]);
                }
                lastWayPoint = WayPoints.First();
                if (GeometryUtil.PointOnPath(location, lastWayPoint, end, out distance))
                {
                    distance += totalDistance;

                    return(true);
                }
            }

            firstWayPoint = WayPoints.First();
            if (GeometryUtil.PointOnPath(location, start, firstWayPoint, out distance))
            {
                return(true);
            }

            totalDistance = GeometryUtil.GetDistance(start, firstWayPoint);
            for (int i = 0; i < waypPontCount - 1; i++)
            {
                if (GeometryUtil.PointOnPath(location, WayPoints[i], WayPoints[i + 1], out distance))
                {
                    distance += totalDistance;
                    return(true);
                }
                totalDistance += GeometryUtil.GetDistance(WayPoints[i], WayPoints[i + 1]);
            }
            lastWayPoint = WayPoints.Last();
            if (GeometryUtil.PointOnPath(location, lastWayPoint, end, out distance))
            {
                distance += totalDistance;
                return(true);
            }
            return(false);
        }
示例#3
0
 public ReceiverPath(BleReceiver from, BleReceiver to)
 {
     From      = from;
     To        = to;
     WayPoints = new ObservableCollection <PointF>();
 }
示例#4
0
        public PointF FindPointInPath(BleReceiver source, double distance)
        {
            PointF end, lastWayPoint;
            double diff;
            var    start = source.Position;

            if (Equals(source, From))
            {
                end = To.Position;
                if (distance >= Distance)
                {
                    return(end);
                }
                if (WayPoints.IsNullOrEmpty())
                {
                    return(GeometryUtil.CalculatePointInBetween(start, end, distance));
                }
                var firstWayPoint = WayPoints.First();

                var currentDistance = GeometryUtil.GetDistance(start, firstWayPoint);
                if (distance < currentDistance)
                {
                    return(GeometryUtil.CalculatePointInBetween(start, firstWayPoint, distance));
                }
                var acccumelativeDistance = currentDistance;
                var wayPointCount         = WayPoints.Count;
                for (int i = 0; i < wayPointCount - 1; i++)
                {
                    currentDistance = GeometryUtil.GetDistance(WayPoints[i], WayPoints[i + 1]);
                    //if (acccumelativeDistance + currentDistance > distance)
                    //{

                    //}
                    acccumelativeDistance += currentDistance;
                    if (acccumelativeDistance < distance)
                    {
                        continue;
                    }
                    diff = currentDistance - (acccumelativeDistance - distance);
                    return(GeometryUtil.CalculatePointInBetween(WayPoints[i], WayPoints[i + 1], diff));
                }
                lastWayPoint = WayPoints.Last();
                //lastWayPoint = WayPoints.Last();
            }
            else if (Equals(source, To))
            {
                end = From.Position;
                if (distance >= Distance)
                {
                    return(end);
                }
                if (WayPoints.IsNullOrEmpty())
                {
                    return(GeometryUtil.CalculatePointInBetween(start, end, distance));
                }
                lastWayPoint = WayPoints.First();
                var currentDistance = GeometryUtil.GetDistance(start, lastWayPoint);

                if (distance < currentDistance)
                {
                    return(GeometryUtil.CalculatePointInBetween(start, lastWayPoint, distance));
                }
                var acccumelativeDistance = currentDistance;
                var wayPointCount         = WayPoints.Count;
                for (int i = wayPointCount - 1; i > 0; i--)
                {
                    currentDistance        = GeometryUtil.GetDistance(WayPoints[i], WayPoints[i - 1]);
                    acccumelativeDistance += currentDistance;
                    if (acccumelativeDistance < distance)
                    {
                        continue;
                    }
                    diff = currentDistance - (acccumelativeDistance - distance);
                    return(GeometryUtil.CalculatePointInBetween(WayPoints[i], WayPoints[i - 1], diff));
                }
            }
            else
            {
                //TODO log warning
                return(start);
            }
            diff = GeometryUtil.GetDistance(lastWayPoint, end) - (Distance - distance);
            return(GeometryUtil.CalculatePointInBetween(lastWayPoint, end, diff));
        }