Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }