public List <Node> ReorderFrame(Story story, PositionTable <int> perm, List <Tuple <int, int> > orders, int frame, int reference) { // initialize nodes Dictionary <int, Node> nodeDict = Init(story, perm, frame, reference); // initialize constraints Constrainer ctr = new Constrainer(orders, nodeDict, perm, frame); // initialize constrainted and unconstrained nodes List <Node> cNodeList = new List <Node>(); List <Node> uNodeList = new List <Node>(); foreach (var node in nodeDict.Values) { if (ctr.cNodes.Contains(node.ID)) { cNodeList.Add(node); } else { uNodeList.Add(node); } } Tuple <int, int> constraint = ctr.FindViolatedConstraint(); int nodeCount = story.Characters.Count + 100; while (constraint.Item1 != constraint.Item2) { int id = nodeCount++; Node cNode = new Node(id, -1); nodeDict.Add(id, cNode); Node sNode = nodeDict[constraint.Item1]; Node tNode = nodeDict[constraint.Item2]; cNode.Indeg = sNode.Indeg + tNode.Indeg; // cNode.BaryCenter = (sNode.BaryCenter * sNode.Indeg + tNode.BaryCenter * tNode.Indeg) / cNode.Indeg; cNode.L = sNode.L.Concat(tNode.L).ToList(); // cNode.I = sNode.I.Concat(tNode.I).ToList(); cNode.GetBaryCenter2(); ctr.RemoveSelfLoops(cNode.ID, sNode.ID, tNode.ID); // if cNode has no incident constraints if (!ctr.cNodes.Contains(cNode.ID)) { uNodeList.Add(cNode); } // update constrained nodes cNodeList = UpdateConstranedNodes(cNodeList, ctr); constraint = ctr.FindViolatedConstraint(); } // union constrained and unconstrained nodes List <Node> unionNodeList = cNodeList.Concat(uNodeList).ToList(); // sort nodes according to their barycenters List <Node> sortedUnionNodeList = BaryCenterSort(unionNodeList); List <Node> finalNodeList = new List <Node>(); foreach (var node in sortedUnionNodeList) { finalNodeList = finalNodeList.Concat(node.L).ToList(); } return(finalNodeList); }
public List <Node> UpdateConstranedNodes(List <Node> cNodes, Constrainer ctr) { List <Node> newCNodes = new List <Node>(); foreach (var cNode in cNodes) { if (ctr.cNodes.Contains(cNode.ID)) { newCNodes.Add(cNode); } } return(newCNodes); }