private void BuildFlockGraph() { flockGraph = new FlockGraph(); foreach (long friendUid in FriendsList) { flockGraph.AddVertex(new FlockVertex(friendUid)); } foreach (KeyValuePair<long, List<long>> kvp in EdgeMap) { long source = kvp.Key; foreach (long target in kvp.Value) { //Error at 20% if ((flockGraph.VertexDictionary.ContainsKey(source)) && (flockGraph.VertexDictionary.ContainsKey(target))) flockGraph.AddEdge(new FlockEdge(flockGraph.VertexDictionary[source], flockGraph.VertexDictionary[target])); else Debug.WriteLine("Edge Dropped"); } } }
public FlockLayoutAgent(string fbToken, long userUid, List<long> friendsList, bool isTestMode) { FbToken = fbToken; UserUid = userUid; FriendsList = friendsList; IsTestMode = isTestMode; EdgeMap = new Dictionary<long, List<long>>(); FlockPoints = new Dictionary<long, Point>(); flockGraph = new FlockGraph(); }
public void BuildRandomGraph(FlockGraph Graph, int NumberOfVertexes, int NumberOfEdges) { Random r = new Random(DateTime.Now.Millisecond); //Build Vertexes for (int i = 0; i < NumberOfVertexes; i++) { FlockVertex v = new FlockVertex(i); Graph.AddVertex(v); } //Build Edges double vc = Graph.VertexCount; int flock1 = (int)Math.Round(vc / 3); int flock2 = flock1 * 2; int flock3 = Graph.VertexCount - 1; int flocks = (int)Math.Round((double)(NumberOfEdges / 3)); FlockVertex s = Graph.Vertices.ElementAt(1); FlockVertex t = Graph.Vertices.ElementAt(flock2); Graph.AddEdge(new FlockEdge(s, t)); s = Graph.Vertices.ElementAt(flock2); t = Graph.Vertices.ElementAt(flock3); Graph.AddEdge(new FlockEdge(s, t)); for (int i = 0; i < flocks; i++) { FlockVertex source = Graph.Vertices.ElementAt(r.Next(1, flock1)); FlockVertex target = Graph.Vertices.ElementAt(r.Next(1, flock1)); Graph.AddEdge(new FlockEdge(source, target)); } for (int i = 0; i < flocks; i++) { FlockVertex source = Graph.Vertices.ElementAt(r.Next(flock1, flock2)); FlockVertex target = Graph.Vertices.ElementAt(r.Next(flock1, flock2)); Graph.AddEdge(new FlockEdge(source, target)); } for (int i = 0; i < flocks; i++) { FlockVertex source = Graph.Vertices.ElementAt(r.Next(flock2, flock3)); FlockVertex target = Graph.Vertices.ElementAt(r.Next(flock2, flock3)); Graph.AddEdge(new FlockEdge(source, target)); } }
/// <summary> /// Computes XY Layout of Graph. /// <remarks> /// Layout algorithms only support bidirected, /// so class packs/unpack from undirected to directed /// </remarks> /// </summary> /// <param name="graph">Graph to Compute Vertex.X/Y Points</param> /// <returns></returns> public FlockLayout(FlockGraph Graph, BackgroundWorker Worker) { this.Graph = Graph; this.Worker = Worker; }
//Done private FlockGraphDirected ToDirected(FlockGraph Graph) { FlockGraphDirected directed = new FlockGraphDirected(); foreach (FlockVertex v in Graph.VertexDictionary.Values) { directed.AddVertex(v); } foreach (FlockEdge e in Graph.Edges) { directed.AddEdge(e); } return directed; }
//public void GetGridLayout(FlockGraph Graph) //{ // Log.Start("GetGridLayout", string.Format(":{0}", Graph)); // int side; // double dSide = Math.Sqrt(Graph.VertexCount); // if (dSide == Math.Floor(dSide)) // side = Convert.ToInt32(Math.Floor(dSide)); // else // side = Convert.ToInt32(Math.Floor(dSide)) + 1; // Queue<FlockVertex> VertexQ = new Queue<FlockVertex>(); // for (int i = 0; i < Graph.VertexCount; i++) // { // VertexQ.Enqueue(Graph.Vertices.ElementAt(i)); // } // for (int l = 0; l < side; l++) // { // for (int t = 0; t < side; t++) // { // if (VertexQ.Count == 0) // return; // FlockVertex v = VertexQ.Dequeue(); // v.GridPoint = new Point(t * 61, l * 61); // } // } //} //Requires Background Worker public void GetFlockLayout(FlockGraph Graph, BackgroundWorker Worker) { FlockLayout layout = new FlockLayout(Graph, Worker); layout.Run(); }