public void Dispose()
 {
     Graph = default(TGraph);
     VertexPositions.Clear();
     VisibleEdges.Clear();
     AlgorithmStorage = null;
 }
        public override void Compute(CancellationToken cancellationToken)
        {
            if (_graph.VertexCount == 0)
            {
                return;
            }
            if (_graph.VertexCount == 1)
            {
                VertexPositions.Clear();
                VertexPositions[_graph.Vertices.First().Original] = new Point(0, 0);
                return;
            }
            //
            //Phase 1 - Filters & Removals
            //
            FiltersAndRemovals();
            _statusInPercent = PERCENT_OF_PREPARATION;

            //
            //Phase 2 - Layer assignment
            //
            AssignLayers();

            //
            //Phase 3 - Crossing reduction
            //
            PrepareForSugiyama(cancellationToken);
            SugiyamaLayout(cancellationToken);
            _statusInPercent = PERCENT_OF_PREPARATION + PERCENT_OF_SUGIYAMA;

            //
            //Phase 4 - Horizontal position assignment
            //
            CopyPositions(cancellationToken);
            OnIterationEnded("Position adjusting finished");

            //Phase 5 - Incremental extension, add vertices connected with only general edges
            //IncrementalExtensionImproved();
            _statusInPercent = PERCENT_OF_PREPARATION + PERCENT_OF_SUGIYAMA + PERCENT_OF_INCREMENTAL_EXTENSION;
            _statusInPercent = 100;
        }
예제 #3
0
        protected override void InternalCompute()
        {
            if (_graph.VertexCount == 0)
            {
                return;
            }
            if (_graph.VertexCount == 1)
            {
                VertexPositions.Clear();
                VertexPositions[_graph.Vertices.First().Original] = new Point(0, 0);
                return;
            }
            //
            //Phase 1 - Filters & Removals
            //
            FiltersAndRemovals();
            _statusInPercent = percentOfPreparation;

            //
            //Phase 2 - Layer assignment
            //
            AssignLayers();

            //
            //Phase 3 - Crossing reduction
            //
            PrepareForSugiyama();
            SugiyamaLayout();
            _statusInPercent = percentOfPreparation + percentOfSugiyama;

            //
            //Phase 4 - Horizontal position assignment
            //
            CopyPositions();
            OnIterationEnded("Position adjusting finished");

            //Phase 5 - Incremental extension, add vertices connected with only general edges
            //IncrementalExtensionImproved();
            _statusInPercent = percentOfPreparation + percentOfSugiyama + percentOfIncrementalExtension;
            _statusInPercent = 100;
        }
        public override void Compute(CancellationToken cancellationToken)
        {
            VertexPositions.Clear();
            var bounds       = _parameters == null ? new RandomLayoutAlgorithmParams().Bounds : _parameters.Bounds;
            var boundsWidth  = (int)bounds.Width;
            var boundsHeight = (int)bounds.Height;
            var seed         = _parameters == null?Guid.NewGuid().GetHashCode() : _parameters.Seed;

            var rnd = new Random(seed);

            foreach (var item in VisitedGraph.Vertices)
            {
                if (item.SkipProcessing != ProcessingOptionEnum.Freeze || VertexPositions.Count == 0)
                {
                    var x    = (int)bounds.X;
                    var y    = (int)bounds.Y;
                    var size = VertexSizes.FirstOrDefault(a => a.Key == item).Value;
                    VertexPositions.Add(item,
                                        new Point(rnd.Next(x, x + boundsWidth - (int)size.Width),
                                                  rnd.Next(y, y + boundsHeight - (int)size.Height)));
                }
            }
        }
        protected void CopyPositionsSilent(bool shouldTranslate)
        {
            //calculate the topLeft position
            var translation = new Vector(float.PositiveInfinity, float.PositiveInfinity);

            if (shouldTranslate)
            {
                foreach (var v in _graph.Vertices)
                {
                    if (double.IsNaN(v.RealPosition.X) || double.IsNaN(v.RealPosition.Y))
                    {
                        continue;
                    }

                    translation.X = Math.Min(v.RealPosition.X, translation.X);
                    translation.Y = Math.Min(v.RealPosition.Y, translation.Y);
                }
                translation   *= -1;
                translation.X += Parameters.VerticalGap / 2;
                translation.Y += Parameters.HorizontalGap / 2;

                //translate with the topLeft position
                foreach (var v in _graph.Vertices)
                {
                    v.RealPosition += translation;
                }
            }
            else
            {
                translation = new Vector(0, 0);
            }

            //copy the positions of the vertices
            VertexPositions.Clear();
            foreach (var v in _graph.Vertices)
            {
                if (v.IsDummyVertex)
                {
                    continue;
                }

                Point pos = v.RealPosition;
                if (!shouldTranslate)
                {
                    pos.X += v.Size.Width * 0.5 + translation.X;
                    pos.Y += v.Size.Height * 0.5 + translation.Y;
                }
                VertexPositions[v.Original] = pos;
            }

            //copy the edge routes
            EdgeRoutes.Clear();
            foreach (var e in _graph.HiddenEdges)
            {
                if (!e.IsLongEdge)
                {
                    continue;
                }

                EdgeRoutes[e.Original] =
                    e.IsReverted
                        ? e.DummyVertices.Reverse().Select(dv => dv.RealPosition).ToArray()
                        : e.DummyVertices.Select(dv => dv.RealPosition).ToArray();
            }
        }