Exemplo n.º 1
0
        private FileTreeMapItem CreateMapItem(FileTreeItemRectangle pair)
        {
            var title = new TreeMapTitleDescription
            {
                Position = pair.AssociatedRectangle.Location,
                Size     = 16,
                Text     = pair.TreeItem.Title
            };

            var rectangle = new TreeMapRectangleDescription
            {
                Rectangle = pair.AssociatedRectangle,
                Brush     = ChooseBrush(pair.TreeItem)
            };

            return(new FileTreeMapItem(pair.TreeItem, title, rectangle));
        }
Exemplo n.º 2
0
        private IEnumerable <FileTreeItemRectangle> Subdivide(FileTreeItemRectangle itemRectangle, ISubdivisionStrategy strategy)
        {
            const int MIN_AREA = 64 * 64;

            if (itemRectangle.RectangleToSubdivide.Width < 4 ||
                itemRectangle.RectangleToSubdivide.Height < 4)
            {
                return(Enumerable.Empty <FileTreeItemRectangle>());
            }

            var rectangleArea = itemRectangle.RectangleToSubdivide.Width * itemRectangle.RectangleToSubdivide.Height;

            var totalSize       = itemRectangle.TreeItem.Items.Sum(i => i.Size);
            var conversionRatio = rectangleArea / totalSize;

            var itemsWithSize = itemRectangle.TreeItem.Items.Where(i => i.Size > 0).OrderByDescending(i => i.Size).ToList();

            if (!itemsWithSize.Any())
            {
                return(Enumerable.Empty <FileTreeItemRectangle>());
            }

            var subrectangleAreas = itemsWithSize.Select(i => new FileTreeItemArea {
                Item = i, Area = i.Size * conversionRatio
            }).ToList();

            // Удаляем самые маленькие прямоугольники и перераспределяем их площадь по остальным прямоугольникам.
            while (subrectangleAreas.Min(sa => sa.Area) < MIN_AREA && subrectangleAreas.Count > 1)
            {
                var last = subrectangleAreas.Last();
                subrectangleAreas.Remove(last);
                var areaToRedistribute = last.Area / subrectangleAreas.Count;
                foreach (var sub in subrectangleAreas)
                {
                    sub.Area += areaToRedistribute;
                }
            }

            var rectangles = strategy.Subdivide(itemRectangle.RectangleToSubdivide, subrectangleAreas.Select(a => a.Area));

            rectangles = DownsizeRectangles(rectangles);
            var pairs = subrectangleAreas.Zip(rectangles, (item, rectangle) => new FileTreeItemRectangle(item.Item !, rectangle));

            return(pairs);
        }