// 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); } }
// 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()); }
// 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); }