Exemple #1
0
 protected Contour(Module root)
 {
     _moduleSequence = new List<Module>();
     _moduleSequence.Add(root);
     _whereMax = root;
     _insertationIndex = -1;
 }
Exemple #2
0
 /// <summary>
 /// Inserts new module into the contour and clears WhereMax value.
 /// </summary>
 /// <param name="module"></param>
 public void Update(Module module)
 {
     _moduleSequence.Insert(++_insertationIndex, module);
     _whereMax = new Module(-1, null);
 }
Exemple #3
0
        /// <summary>
        /// Operation of vertical O-tree. Calculates coordinates and takes one compaction step.
        /// </summary>
        /// <returns>Horizontal constraint graph</returns>
        private Graph ToHorizontalConstraintGraph()
        {
            //Empty module representing the root of the tree
            Module root = new Module(-1, null);
            _modules.Add(-1, root);
            _oTree.ModuleSequence.Insert(0, -1);

            //Stack containing module labels for parent module calculation
            Stack<int> stack = new Stack<int>();
            stack.Push(-1);

            //Vertical contsraint graph
            Graph constraintGraph = new Graph(_oTree.ModuleSequence);

            //Actual parent and child module
            Module parent = root;
            Module child;

            //Vertical contour for quick x-coordinate calculation
            Contour contour = new VerticalContour(root);

            //Index of child module in ModuleSequence
            int childIndex = 0;

            foreach (Bit bit in _oTree.DfsSequence)
            {
                //Forth step in DFS traversing, coordinates need to be calcuted
                if (bit == 0)
                {
                    child = _modules[_oTree.ModuleSequence[++childIndex]];

                    //In vertical O-tree, child module is on the top of parent module and adjacent with it
                    child.Y = parent.Y + parent.Height;
                    //Finding the minimum x-coordinate
                    child.X = contour.FindMax(child.Y + child.Height);

                    //There is an egde in the horizontal constraint graph, where the minimum is found
                    constraintGraph.AddEdge(contour.WhereMax.Name, child.Name, child.Y);

                    //Updating contour
                    contour.Update(child);

                    //Now child module is the actual parent
                    parent = child;
                    stack.Push(parent.Name);
                }

                //Back step in DFS traversing
                else
                {
                    //Updating parent module and insertation index of the contour
                    stack.Pop();
                    parent = _modules[stack.Peek()];
                    contour.InsertationIndex = contour.ModuleSequence.IndexOf(parent);
                }

            }

            //Removing root module
            _modules.Remove(-1);
            _oTree.ModuleSequence.RemoveAt(0);
            return constraintGraph;
        }
Exemple #4
0
 /// <summary>
 /// Deep copy.
 /// </summary>
 /// <returns></returns>
 public Module Copy()
 {
     var copy = new Module(_name, _image);
     copy._xCoordinate = _xCoordinate;
     copy._yCoordinate = _yCoordinate;
     return copy;
 }