public BleReceiver GetOther(BleReceiver receiver) { if (Equals(receiver, From)) { return(To); } if (Equals(receiver, To)) { return(From); } return(null); }
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); }
public ReceiverPath(BleReceiver from, BleReceiver to) { From = from; To = to; WayPoints = new ObservableCollection <PointF>(); }
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)); }