Exemplo n.º 1
0
    public List <int> GetIntersectionNeighbors(int intersectionIndex)
    {
        List <int> outList = new List <int>();

        foreach (int segmentIndex in this.intersectionToSegmentDict[intersectionIndex])
        {
            StreetSegment seg = this.Streets[segmentIndex];
            int           i0  = seg.EndpointIndices[0];
            int           i1  = seg.EndpointIndices[1];

            int unselected = -1;
            if (i0 == intersectionIndex)
            {
                unselected = i1;
            }
            else
            {
                unselected = i0;
            }
            if (!outList.Contains(unselected))
            {
                outList.Add(unselected);
            }
        }
        return(outList);
    }
Exemplo n.º 2
0
        public static List <StreetSegment> GetConnectingStreetSegments(List <StreetConnector> connectors)
        {
            StreetType           t;
            List <StreetSegment> s = new List <StreetSegment>();

            foreach (StreetConnector sc1 in connectors)
            {
                foreach (StreetConnector sc2 in connectors)
                {
                    if (sc1 != sc2 && sc1.FindNeighbours() != null && sc1.FindNeighbours().Contains(sc2))
                    {
                        if (sc1.EP1.FindNeighbours().Contains(sc2))
                        {
                            t = sc1.EP1.Self;
                        }
                        else
                        {
                            t = sc1.EP2.Self;
                        }
                        if (t is StreetSegment)
                        {
                            StreetSegment segment = (StreetSegment)t;
                            if (!s.Contains(segment))
                            {
                                s.Add(segment);
                            }
                        }
                    }
                }
            }
            return(s);
        }
Exemplo n.º 3
0
        public async Task <StreetSegmentResponse> PostStreetSegment(PostStreetSegmentRequest model)
        {
            StreetSegment insert = new StreetSegment
            {
                Name       = model.Name,
                Geom       = model.Geom,
                CreateDate = DateTime.UtcNow.AddHours(7).Date,
                WardId     = model.WardId,
                StreetId   = model.StreetId
            };

            try
            {
                _unitOfWork.Repository <StreetSegment>().Insert(insert);
                await _unitOfWork.CommitAsync();

                return(new StreetSegmentResponse
                {
                    Name = insert.Name,
                    Geom = insert.Geom,
                    CreateDate = insert.CreateDate,
                    WardId = insert.WardId,
                    Id = insert.Id,
                    StreetId = insert.StreetId
                });
            }
            catch (Exception e)
            {
                throw new CrudException(HttpStatusCode.BadRequest, "Insert Error!!!", e.InnerException?.Message);
            }
        }
Exemplo n.º 4
0
    void AddStreetRange(StreetSegment seg, float f0, float f1)
    {
        //Debug.Log(string.Format("Adding segment with values {0} {1}", f0, f1));

        Vector2 v0 = seg.InterpolateEndpoints(f0);
        Vector2 v1 = seg.InterpolateEndpoints(f1);

        GridAddress a0 = new GridAddress(v0);
        GridAddress a1 = new GridAddress(v1);

        if (a0 == a1)
        {
            //Debug.Log(string.Format("Adding segment at location {0}", a0));
            AddStreetAtPoint(seg, v0);
        }
        else
        if ((Mathf.Abs(a0.x - a1.x) <= 1) &&
            (Mathf.Abs(a0.y - a1.y) <= 1))
        {
            //Debug.Log(string.Format("Adding segment at locations {0} and {1}", a0, a1));
            AddStreetAtPoint(seg, v0);
            AddStreetAtPoint(seg, v1);
        }
        else
        {
            float fh = (f0 + f1) / 2.0f;
            AddStreetRange(seg, f0, fh);
            AddStreetRange(seg, fh, f1);
        }
    }
Exemplo n.º 5
0
    public void AddStreetAtPoint(StreetSegment seg, Vector2 pt)
    {
        GridAddress addr = new GridAddress(pt);

        if (!addressToStreetSegmentIdListDict.ContainsKey(addr))
        {
            addressToStreetSegmentIdListDict[addr] = new List <int>();
        }

        int streetSegmentId = -1;

        if (!StreetSegmentIdToStreetSegmentDict.ContainsValue(seg))
        {
            streetSegmentId = nextStreetSegmentId++;
            StreetSegmentIdToStreetSegmentDict[streetSegmentId] = seg;
        }
        else
        {
            foreach (int segId in StreetSegmentIdToStreetSegmentDict.Keys)
            {
                if (seg == StreetSegmentIdToStreetSegmentDict[segId])
                {
                    streetSegmentId = segId;
                    break;
                }
            }
        }

        if (!addressToStreetSegmentIdListDict[addr].Contains(streetSegmentId))
        {
            addressToStreetSegmentIdListDict[addr].Add(streetSegmentId);
        }
    }
Exemplo n.º 6
0
    public Vector2 GetRandomPointOnStreet()
    {
        int           streetIndex = Random.Range(0, Streets.Count);
        StreetSegment seg         = Streets[streetIndex];
        Vector2       randPos     = seg.InterpolateEndpoints(Random.Range(0.0f, 1.0f));

        return(randPos);
    }
Exemplo n.º 7
0
 public static void SetSpeedlimit(StreetSegment segment, double speedlimit)
 {
     if (segment.SpeedLimit != speedlimit)
     {
         RoadInstruction ri = new RoadInstruction(segment.ID, speedlimit, true);
         SendRoadInstruction(ri);
     }
 }
Exemplo n.º 8
0
        //adapts the speed limit of the chosen road
        private static bool AdaptSpeedLimit(int roadId, double limit)
        {
            StreetSegment road = roads.Find(x => x.ID == roadId);

            if (road != null)
            {
                road.SpeedLimit = limit;
                return(true);
            }
            return(false);
        }
Exemplo n.º 9
0
        //adapts the state of the chosen road
        private static bool AdaptRoadState(int roadId, bool state)
        {
            StreetSegment road = roads.Find(x => x.ID == roadId);

            if (road != null)
            {
                road.IsUsable = state;
                return(true);
            }
            return(false);
        }
Exemplo n.º 10
0
        //the DataLinker calls this method to forward a new road command from SS3
        //it returns true if the command is valid

        /// <summary>
        /// This method gets called by the DataLinker and receives a new RoadCommand from SS3.
        /// </summary>
        /// <param name="command"></param>
        /// <returns></returns>
        public static bool ReceiveRoadCommand(RoadInstruction command)
        {
            if (command != null)
            {
                StreetSegment road = roads.Find(x => x.ID == command.Id); //check, if there is a road with this id
                if (road != null)                                         //road should be valid
                {
                    ExecuteRoadCommand(command);
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 11
0
    bool WithinExistingAngles(int intersectionIndex, float candidateAngleRadians)
    {
        candidateAngleRadians = Wrap(candidateAngleRadians, 2 * Mathf.PI);

        //Debug.Log("Trying angle " + candidateAngleRadians);

        Vector2 myPos = intersections[intersectionIndex];

        float minStreetAngleRadians = MIN_INTERSECTION_ANGLE_DEGREES * Mathf.PI / 180.0f;

        if (!intersectionToSegmentDict.ContainsKey(intersectionIndex))
        {
            //Debug.Log("no segments for this intersection, no overlap");
            return(false);
        }

        foreach (int segIndex in intersectionToSegmentDict[intersectionIndex])
        {
            int           otherIntersectionIndex = -1;
            StreetSegment seg = Streets[segIndex];
            if (seg.EndpointIndices[0] == intersectionIndex)
            {
                otherIntersectionIndex = seg.EndpointIndices[1];
            }
            else
            {
                otherIntersectionIndex = seg.EndpointIndices[0];
            }

            Vector2 otherPos     = intersections[otherIntersectionIndex];
            Vector2 deltaPos     = otherPos - myPos;
            float   angleToOther = Mathf.Atan2(deltaPos.y, deltaPos.x);
            //Debug.Log("existing angle:" + angleToOther);

            float deltaAngle = Wrap(angleToOther - candidateAngleRadians, 2 * Mathf.PI);
            if (deltaAngle > Mathf.PI)
            {
                deltaAngle -= 2 * Mathf.PI;
            }
            //Debug.Log("delta angle:" + deltaAngle);
            //Debug.Log("delta angle degrees: " + deltaAngle * 180 / Mathf.PI);
            if (Mathf.Abs(deltaAngle) < minStreetAngleRadians)
            {
                //Debug.Log("deltaAngle too close, reporting overlap");
                return(true);
            }
        }
        //Debug.Log("no overlap");
        return(false);
    }
Exemplo n.º 12
0
        public void TestGetConnectingStreetSegmentWithStreetHub()
        {
            List <StreetConnector> sc1 = new List <StreetConnector>();
            StreetConnector        c1  = new StreetConnector(0, 0);
            StreetConnector        c2  = new StreetConnector(0, 50);
            StreetConnector        c3  = new StreetConnector(0, 120);
            StreetConnector        ch1 = new StreetConnector(0, 200);
            StreetConnector        ch2 = new StreetConnector(0, 210);
            StreetConnector        ch3 = new StreetConnector(5, 205);
            StreetConnector        c4  = new StreetConnector(0, 300);
            StreetConnector        c5  = new StreetConnector(50, 205);

            sc1.Add(c1);
            sc1.Add(c2);
            sc1.Add(c3);
            sc1.Add(ch1);
            sc1.Add(ch2);
            sc1.Add(ch3);
            sc1.Add(c4);
            sc1.Add(c5);

            List <StreetConnector> h = new List <StreetConnector>();

            h.Add(ch1);
            h.Add(ch2);
            h.Add(ch3);

            List <StreetSegment> ss1 = new List <StreetSegment>();
            StreetSegment        s1  = new StreetSegment(c1, c2);
            StreetSegment        s2  = new StreetSegment(c2, c3);
            StreetSegment        s3  = new StreetSegment(c3, ch1);
            StreetSegment        s4  = new StreetSegment(ch2, c4);
            StreetSegment        s5  = new StreetSegment(ch3, c5);

            ss1.Add(s1);
            ss1.Add(s2);
            ss1.Add(s3);
            ss1.Add(s4);
            ss1.Add(s5);

            List <StreetSegment> sTest1 = ControlSystem.GetConnectingStreetSegments(sc1);

            Assert.AreEqual(5, sTest1.Count());
            Assert.AreEqual(true, sTest1.Contains(s1));
            Assert.AreEqual(true, sTest1.Contains(s2));
            Assert.AreEqual(true, sTest1.Contains(s3));
            Assert.AreEqual(true, sTest1.Contains(s4));
            Assert.AreEqual(true, sTest1.Contains(s5));
        }
Exemplo n.º 13
0
        public List <StreetSegment> CreateStreetSegments(List <Way> OsmStreets, Dictionary <long?, OsmGeo> allNodes)
        {
            var boundLines = this.geometryService.CreateBoundingLines();
            List <StreetSegment> streetSegments = new List <StreetSegment>();

            foreach (var osmStreet in OsmStreets)
            {
                var points = new List <XYZ>();
                foreach (var nodeId in osmStreet.Nodes)
                {
                    var geometry = allNodes[nodeId];
                    if (geometry is Node node)
                    {
                        var coords = coordService.GetRevitCoords((double)node.Latitude, (double)node.Longitude);
                        points.Add(coords);
                    }
                }

                for (int i = 0; i < points.Count - 1; i++)
                {
                    var start = points[i];
                    var end   = points[i + 1];

                    if (!geometryService.IsInsideBounds(boundLines, start) &&
                        !geometryService.IsInsideBounds(boundLines, end))
                    {
                        continue;
                    }

                    var line    = Line.CreateBound(points[i], points[i + 1]);
                    var segment = new StreetSegment();
                    segment.Id        = (long)osmStreet.Id;
                    segment.SegmentId = osmStore.MoveNextId();
                    segment.Line      = line;
                    segment.Width     = osmStore.DefaultStreetWidth;
                    if (osmStreet.Tags.TryGetValue("name", out string name))
                    {
                        segment.Name = name;
                    }

                    streetSegments.Add(segment);
                }
            }

            return(streetSegments);
        }
        public async void ShouldCreateGroup()
        {
            var now = DateTime.Now;
            //Given

            var segments = new StreetSegment[] {
                Segments[0],
                Segments[1]
            };
            //When
            var group = await Repository.CreateGroup(segments);

            //Then
            Assert.NotNull(group);
            Assert.Equal(1, group.Key);
            Assert.Equal(2, group.Bridges.Count);
        }
Exemplo n.º 15
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.º 16
0
 bool AreIntersectionsJoined(int i0, int i1)
 {
     if (!intersectionToSegmentDict.ContainsKey(i0))
     {
         return(false);
     }
     foreach (int segIndex in intersectionToSegmentDict[i0])
     {
         StreetSegment seg = Streets[segIndex];
         if (((seg.EndpointIndices[0] == i0) &&
              (seg.EndpointIndices[1] == i1)) ||
             ((seg.EndpointIndices[0] == i1) &&
              (seg.EndpointIndices[1] == i0)))
         {
             return(true);
         }
     }
     return(false);
 }
Exemplo n.º 17
0
        public List <StreetSegment> CreateStreetSegments(List <Way> OsmStreets, Dictionary <long?, OsmGeo> allNodes)
        {
            var boundLines = this.geometryService.CreateBoundingLines();
            List <StreetSegment> streetSegments = new List <StreetSegment>();

            foreach (var osmStreet in OsmStreets)
            {
                var points = this.geometryService.GetPointsFromNodes(osmStreet.Nodes, allNodes);
                if (points == null)
                {
                    continue;
                }

                for (int i = 0; i < points.Count - 1; i++)
                {
                    var start = points[i];
                    var end   = points[i + 1];

                    if (!geometryService.IsInsideBounds(boundLines, start) &&
                        !geometryService.IsInsideBounds(boundLines, end))
                    {
                        continue;
                    }

                    var line    = Line.CreateBound(points[i], points[i + 1]);
                    var segment = new StreetSegment();
                    segment.Id        = (long)osmStreet.Id;
                    segment.SegmentId = osmStore.MoveNextId();
                    segment.Line      = line;
                    segment.Width     = osmStore.DefaultStreetWidth;
                    if (osmStreet.Tags.TryGetValue("name", out string name))
                    {
                        segment.Name = name;
                    }

                    streetSegments.Add(segment);
                }
            }

            return(streetSegments);
        }
Exemplo n.º 18
0
    void JoinIntersections(int index1, int index2, int[] branchesPerIntersection)
    {
        StreetSegment seg = new StreetSegment(intersections[index1], intersections[index2], Random.Range(MIN_STREET_WIDTH, MAX_STREET_WIDTH));

        seg.SetEndpointIndices(index1, index2);
        Streets.Add(seg);
        branchesPerIntersection[index1]++;
        branchesPerIntersection[index2]++;
        int streetIndex = Streets.Count - 1;

        if (!intersectionToSegmentDict.ContainsKey(index1))
        {
            intersectionToSegmentDict[index1] = new List <int>();
        }
        if (!intersectionToSegmentDict.ContainsKey(index2))
        {
            intersectionToSegmentDict[index2] = new List <int>();
        }
        intersectionToSegmentDict[index1].Add(streetIndex);
        intersectionToSegmentDict[index2].Add(streetIndex);
    }
Exemplo n.º 19
0
        public void TestShortestPath()
        {
            List <StreetConnector> sc = new List <StreetConnector>();
            StreetConnector        c1 = new StreetConnector(0, 0);
            StreetConnector        c2 = new StreetConnector(0, 50);
            StreetConnector        c3 = new StreetConnector(0, 120);
            StreetConnector        c4 = new StreetConnector(20, 0);
            StreetConnector        c5 = new StreetConnector(20, 40);
            StreetConnector        c6 = new StreetConnector(20, 100);

            sc.Add(c1);
            sc.Add(c2);
            sc.Add(c3);
            sc.Add(c4);
            sc.Add(c5);
            sc.Add(c6);

            List <StreetSegment> ss = new List <StreetSegment>();
            StreetSegment        s1 = new StreetSegment(c1, c2);
            StreetSegment        s2 = new StreetSegment(c2, c3);
            StreetSegment        s3 = new StreetSegment(c1, c4);
            StreetSegment        s4 = new StreetSegment(c4, c5);
            StreetSegment        s5 = new StreetSegment(c5, c6);
            StreetSegment        s6 = new StreetSegment(c6, c3);

            ss.Add(s1);
            ss.Add(s2);
            ss.Add(s3);
            ss.Add(s4);
            ss.Add(s5);
            ss.Add(s6);

            BaseRoute b = new ShortestBaseRoute(c1, c6);

            Assert.AreEqual(2, b.Waypoints.Count);
            Assert.AreEqual(true, b.Waypoints[0] == c4);
            Assert.AreEqual(true, b.Waypoints[1] == c5);
        }
Exemplo n.º 20
0
        public void TestGetConnectingStreetSegments()
        {
            List <StreetConnector> sc1 = new List <StreetConnector>();
            StreetConnector        c1  = new StreetConnector(0, 0);
            StreetConnector        c2  = new StreetConnector(0, 50);
            StreetConnector        c3  = new StreetConnector(0, 120);

            sc1.Add(c1);
            sc1.Add(c2);
            sc1.Add(c3);

            List <StreetSegment> ss1 = new List <StreetSegment>();
            StreetSegment        s1  = new StreetSegment(c1, c2);
            StreetSegment        s2  = new StreetSegment(c2, c3);

            ss1.Add(s1);
            ss1.Add(s2);

            List <StreetSegment> sTest1 = ControlSystem.GetConnectingStreetSegments(sc1);

            Assert.AreEqual(2, sTest1.Count());
            Assert.AreEqual(true, sTest1.Contains(s1));
            Assert.AreEqual(true, sTest1.Contains(s2));
        }
Exemplo n.º 21
0
 /// <summary>
 /// Adds a new StreetSegment to the list of roads.
 /// </summary>
 /// <param name="road">The StreetSegment which needs to be added.</param>
 public static void AddRoadSegment(StreetSegment road)
 {
     roads.Add(road);
 }
Exemplo n.º 22
0
 public void AddStreet(StreetSegment seg)
 {
     AddStreetRange(seg, 0.0f, 1.0f);
 }
Exemplo n.º 23
0
 /// <summary>
 /// Removes a StreetSegment from the list roads. Returns true in case of a success.
 /// </summary>
 /// <param name="road">The StreetSegment which needs to be removed.</param>
 /// <returns></returns>
 public static bool RemoveRoadSegment(StreetSegment road)
 {
     return(roads.Remove(road));
 }
Exemplo n.º 24
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");
            }
        }