Exemplo n.º 1
0
 protected void FreeSpace(StreetType last)
 {
     if (last is StreetSegment)
     {
         StreetSegment segment   = (StreetSegment)last;
         int           direction = segment.EP1.Connector == currentConnector ? 2 : 1;
         segment.FreeSpace(direction, size);
     }
     else if (last is StreetHub)
     {
         StreetHub hub = (StreetHub)last;
         hub.FreeSpace(size);
     }
     else
     {
         throw new StreetMapException("Unknown StreetType");
     }
 }
Exemplo n.º 2
0
        protected bool AdvanceRoute()
        {
            StreetType typeCur, typeLast;
            TimeSpan   requiredTime;

            if (currentConnector.EP1.FindNeighbours().Contains(nextConnector))
            {
                typeCur  = currentConnector.EP1.Self;
                typeLast = currentConnector.EP2.Self;
            }
            else
            {
                typeCur  = currentConnector.EP2.Self;
                typeLast = currentConnector.EP1.Self;
            }

            if (typeCur is StreetSegment)
            {
                StreetSegment segment = (StreetSegment)typeCur;

                if (!claimedSpace)
                {
                    int direction = segment.EP1.Connector == currentConnector ? 1 : 2;
                    if (!segment.ClaimSpace(direction, size))
                    {
                        timeBonus = TimeSpan.Zero;
                        return(false);
                    }
                    if (isFirstClaim)
                    {
                        isFirstClaim = false;
                    }
                    else
                    {
                        FreeSpace(typeLast);
                    }
                    claimedSpace = true;
                }

                requiredTime = maxSpeed < segment.SpeedLimit ? TimeSpan.FromSeconds(segment.Length / maxSpeed) : segment.MinDriveTime;
                if (requiredTime.CompareTo(timeBonus) > 0)
                {
                    return(false);
                }

                timeBonus        = timeBonus.Subtract(requiredTime);
                lastConnector    = currentConnector;
                currentConnector = nextConnector;
                nextConnector    = null;
                claimedSpace     = false;
                ReportManager.PrintDebug(this + " advanced to " + currentConnector + " over " + segment + ".");
                return(true);
            }
            else if (typeCur is StreetHub)
            {
                StreetHub hub = (StreetHub)typeCur;
                bool      isGreen;

                hub.IsGreenList.TryGetValue(currentConnector.ID, out isGreen);
                if (!isGreen)
                {
                    timeBonus = TimeSpan.Zero;
                    return(false);
                }

                if (!claimedSpace)
                {
                    if (!hub.ClaimSpace(size))
                    {
                        timeBonus = TimeSpan.Zero;
                        return(false);
                    }
                    if (isFirstClaim)
                    {
                        isFirstClaim = false;
                    }
                    else
                    {
                        FreeSpace(typeLast);
                    }
                    claimedSpace = true;
                }

                double speed = maxSpeed < hub.SpeedLimit ? maxSpeed : hub.SpeedLimit;
                requiredTime = TimeSpan.FromSeconds(Coordinate.GetDistance(currentConnector.Coordinate, nextConnector.Coordinate) / speed);
                if (requiredTime.CompareTo(timeBonus) > 0)
                {
                    return(false);
                }

                timeBonus        = timeBonus.Subtract(requiredTime);
                lastConnector    = currentConnector;
                currentConnector = nextConnector;
                nextConnector    = null;
                claimedSpace     = false;
                ReportManager.PrintDebug(this + " advanced to " + currentConnector + " over " + hub + ".");
                return(true);
            }
            else
            {
                throw new StreetMapException("Unknown StreetType");
            }
        }