예제 #1
0
    // Create area segments borders
    private void CreateAreaBlockerLines()
    {
        foreach (var edge in VoronoiDiagram.Edges)
        {
            if (!edge.Visible())
            {
                continue;
            }

            int         leftAreaSegmentID  = _siteAreaSegmentMap[edge.LeftSite.Coord];
            int         rightAreaSegmentID = _siteAreaSegmentMap[edge.RightSite.Coord];
            AreaSegment leftAreaSegment    = AreaSegmentGraph.GetNodeData(leftAreaSegmentID);
            AreaSegment rightAreaSegment   = AreaSegmentGraph.GetNodeData(rightAreaSegmentID);

            var leftNeighborhood = AreaSegmentGraph.GetNeighbours(leftAreaSegmentID);

            if (leftAreaSegmentID == rightAreaSegmentID ||
                leftAreaSegment.Type == AreaSegment.EAreaSegmentType.Border ||
                rightAreaSegment.Type == AreaSegment.EAreaSegmentType.Border ||
                !leftNeighborhood.Contains(rightAreaSegmentID) ||
                AreaSegmentGraph.GetEdgeValue(leftAreaSegmentID, rightAreaSegmentID) != (int)AreaSegment.EAreaSegmentEdgeType.NonNavigable)
            {
                continue;
            }

            var p0      = edge.ClippedEnds[LR.LEFT].ToUnityVector2();
            var p1      = edge.ClippedEnds[LR.RIGHT].ToUnityVector2();
            var segment = new[] { p0, p1 };
            AreaBlockerLines.Add(segment);
        }
    }
예제 #2
0
    // Checks if segments are neighbours
    private bool AreNeighbours(IEnumerable <int> areaSegments)
    {
        // Check for null
        if (areaSegments == null || !areaSegments.Any())
        {
            return(false);
        }

        // Check if segments are neighbours
        var found    = new List <int> {
        };
        var frontier = new Queue <int>();

        frontier.Enqueue(areaSegments.ElementAt(0));
        while (found.Count < areaSegments.Count() && frontier.Count > 0)
        {
            var element = frontier.Dequeue();
            if (areaSegments.Contains(element))
            {
                found.Add(element);
                foreach (int neighbour in AreaSegmentGraph.GetNeighbours(element))
                {
                    frontier.Enqueue(neighbour);
                }
            }
        }
        return(found.Count == areaSegments.Count());
    }
예제 #3
0
    // Get area data graph that contains the given area segments, with the respective center and polygon, and neighborhood information
    public Graph <AreaData> GetAreaDataGraph(IEnumerable <int> areaSegments)
    {
        if (!AreNeighbours(areaSegments))
        {
            return(null);
        }

        // Build polygons and gather roads for each site
        Dictionary <int, Vector2[]>         areaSegmentPolygonMap = new Dictionary <int, Vector2[]>();
        Dictionary <int, List <Vector2[]> > areaSegmentRoadMap    = new Dictionary <int, List <Vector2[]> >();

        foreach (int areaSegment in areaSegments)
        {
            var site = new Vector2f(_areaSegmentCenterMap[areaSegment]);
            areaSegmentPolygonMap.Add(areaSegment, GetSitePolygon(site));
            areaSegmentRoadMap.Add(areaSegment, GetSitePaths(site));
        }

        // Build graph
        Dictionary <int, int> graphMap      = new Dictionary <int, int>();
        Graph <AreaData>      areaDataGraph = new Graph <AreaData>();

        foreach (int areaSegment in areaSegments)
        {
            AreaData data = new AreaData
            {
                Center  = _areaSegmentCenterMap[areaSegment],
                Polygon = areaSegmentPolygonMap[areaSegment],
                Segment = AreaSegmentGraph.GetNodeData(areaSegment),
                Paths   = areaSegmentRoadMap[areaSegment]
            };
            int newID = areaDataGraph.AddNode(data);
            graphMap.Add(areaSegment, newID);
        }
        foreach (int areaSegment in areaSegments)
        {
            foreach (int neighbour in AreaSegmentGraph.GetNeighbours(areaSegment))
            {
                if (areaSegments.Contains(neighbour))
                {
                    areaDataGraph.AddEdge(graphMap[areaSegment], graphMap[neighbour], 0);
                }
            }
        }

        return(areaDataGraph);
    }