예제 #1
0
        public void AssertThat_GenerateBounds_ProducesAlternatelyAlignedRectangle_WithDepth3()
        {
            //Create a tree with hand calculated split values
            var tree = new Node <TestData>(null, null, true, 10)
            {
                new Node <TestData>(null, new TestData("0"), false, 4)
                {
                    new Node <TestData>(null, new TestData("1"), 2),
                    new Node <TestData>(null, new TestData("2"), 8),
                },
                new Node <TestData>(null, new TestData("3"), 6),
            };

            //Generate the boundaries for this tree
            Treemap <TestData> .GenerateBounds(new BoundingRectangle(new Vector2(0, 0), new Vector2(10, 10)), new [] { tree }, true);

            DrawTreemap(tree);

            //Does the root take all the available space?
            Assert.AreEqual(new BoundingRectangle(new Vector2(0, 0), new Vector2(10, 10)), tree.Bounds);

            //Do the inner nodes take the correct space?
            Assert.AreEqual(new BoundingRectangle(new Vector2(0, 0), new Vector2(4, 10)), tree.First().Bounds);
            Assert.AreEqual(new BoundingRectangle(new Vector2(4, 0), new Vector2(10, 10)), tree.Skip(1).First().Bounds);

            //Do the leaves take the correct space?
            Assert.AreEqual(new BoundingRectangle(new Vector2(0, 0), new Vector2(4, 2)), tree.First().First().Bounds);
            Assert.AreEqual(new BoundingRectangle(new Vector2(0, 2), new Vector2(4, 10)), tree.First().Skip(1).First().Bounds);
        }
예제 #2
0
        public void DrawChart(bool refresh = false)
        {
            if (refresh)
            {
                Treemap.BuildAndDraw();
            }
            else
            {
                var indx  = Indexes.Select(i => Data.GetValues <string>(i.Column)).ToList();
                var size  = Data.GetValues <double>(SizeColumn).ToList();
                var color = Data.GetValues <object>(ColorColumn);

                TreemapParameters parameters = GetParameters();
                parameters.AutoRefresh = AutoRefresh;

                Treemap.DrawChart(indx, size, color, parameters);
            }

            if (!Treemap.IsActive)
            {
                IsDead = true;
                Messenger.Default.Send(new NotificationMessage <ChartBase>(Treemap, "Chart has been unactivated"), "ChartUnactivated");
                MessageBox.Show("An error has occured during chart rendering.", "Unexpected error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
예제 #3
0
        public void AssertThat_MultiLevelTree_AssignsCorrectAreas()
        {
            var tree = new Tree <TestData>(new Tree <TestData> .Node {
                new Tree <TestData> .Node(new TestData("1", 1)),
                new Tree <TestData> .Node(new TestData("2", 2)),
                new Tree <TestData> .Node(new TestData("3"))
                {
                    new Tree <TestData> .Node(new TestData("3a", 0.8f)),
                    new Tree <TestData> .Node(new TestData("3b", 1)),
                    new Tree <TestData> .Node(new TestData("3c", 1.2f))
                }
            });

            var result = Treemap <TestData> .Build(new BoundingRectangle(new Vector2(0, 0), new Vector2(3, 2)), tree);

            DrawTreemap(result);

            //Check all the areas
            RecursiveAssert(result.Root, (p, c) => {
                if (p.Value?.Area != null)
                {
                    Assert.AreEqual(p.Value.Area.Value, p.Bounds.Area(), 0.0001f);
                }
            });
        }
예제 #4
0
 private void butTreemap_Click(object sender, RoutedEventArgs e)
 {
     Reset(ChartType.TreeMap);
     modelChart            = Treemap.Create();
     controller.ChartModel = modelChart;
     RenderChart();
 }
예제 #5
0
        public void AssertThat_GenerateBounds_ProducesSpecifiedRectangles_WithRootNode_WithTwoChildren_WithNonZeroRectangle()
        {
            var a = new Node <TestData>(null, new TestData("0"), 4);
            var b = new Node <TestData>(null, new TestData("1"), 6);

            Treemap <TestData> .GenerateBounds(new BoundingRectangle(new Vector2(-7, -5), new Vector2(3, 5)), new[] { a, b, }, true);

            Assert.AreEqual(new BoundingRectangle(new Vector2(-7, -5), new Vector2(-3, 5)), a.Bounds);
            Assert.AreEqual(new BoundingRectangle(new Vector2(-3, -5), new Vector2(3, 5)), b.Bounds);
        }
예제 #6
0
        public void Playground()
        {
            var tree = new Tree <TestData>(new Tree <TestData> .Node {
                new Tree <TestData> .Node(new TestData("1", 1)),
                new Tree <TestData> .Node(new TestData("2", 2)),
                new Tree <TestData> .Node(new TestData("3", 3))
            });

            var result = Treemap <TestData> .Build(new BoundingRectangle(new Vector2(0, 0), new Vector2(3, 2)), tree);

            DrawTreemap(result);
        }
예제 #7
0
        public void AssertThat_SingleLevelTree_AssignsCorrectArea()
        {
            //Construct a single level tree with a hardcoded area
            var tree = new Tree <TestData>(new Tree <TestData> .Node(new TestData("a", 6)));

            var result = Treemap <TestData> .Build(new BoundingRectangle(new Vector2(0, 0), new Vector2(3, 2)), tree);

            DrawTreemap(result);

            //Check that the resulting area is correct
            Assert.AreEqual(6, result.Root.Bounds.Area(), 0.0001f);
        }
예제 #8
0
        private void RenderTreemap(Point2I size)
        {
            Stopwatch sw = Stopwatch.StartNew();

            if (treemap == null || treemapSize.X != size.X || treemapSize.Y != size.Y)
            {
                treemapSize = size;
                UI.Invoke(() => {
                    treemap = new WriteableBitmap(size.X, size.Y, 96, 96, PixelFormats.Bgra32, null);
                });
            }
            Treemap.DrawTreemap(treemap, new Rectangle2I(size), rootItem);
            //Treemap.DrawTreemap(treemap, new Rectangle2I(size), fileRoot, options);
            Console.WriteLine($"Took {sw.ElapsedMilliseconds}ms to render treemap");
        }
예제 #9
0
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FInput.IsChanged || FSortIn.IsChanged || FAlgorithmIn.IsChanged)
            {
                var n = MakeTree(SpreadMax);
                FTreeMap           = new Treemap(n, FSortIn[0]);
                FTreeMap.Algorithm = FAlgorithmIn[0];
                FTreeMap.DoLayout();

                FCenterOut.SliceCount      = SpreadMax;
                FSizeOut.SliceCount        = SpreadMax;
                FFormerSliceOut.SliceCount = SpreadMax;

                var childs = FTreeMap.Root.Children;
                for (int i = 0; i < SpreadMax; i++)
                {
                    var c = childs[i];
                    FCenterOut[i]      = c.Rect.Center;
                    FSizeOut[i]        = c.Rect.Size;
                    FFormerSliceOut[i] = (int)c.Value;
                }
            }
        }
예제 #10
0
        public void AssertThat_MultiLevelTree_MaintainsParentChildRelationship()
        {
            var tree = new Tree <TestData>(new Tree <TestData> .Node(new TestData("root"))
            {
                new Tree <TestData> .Node(new TestData("1", 1)),
                new Tree <TestData> .Node(new TestData("2", 2)),
                new Tree <TestData> .Node(new TestData("3"))
                {
                    new Tree <TestData> .Node(new TestData("3a", 0.8f)),
                    new Tree <TestData> .Node(new TestData("3b", 1)),
                    new Tree <TestData> .Node(new TestData("3c", 1.2f))
                }
            });

            var result = Treemap <TestData> .Build(new BoundingRectangle(new Vector2(0, 0), new Vector2(3, 2)), tree);

            DrawTreemap(result);

            //Check that all child bounds are contained within parent bounds
            RecursiveAssert(result.Root, (p, c) => {
                Assert.IsTrue(p.Bounds.Contains(c.Bounds));
            });
        }
예제 #11
0
        private void RenderHighlight(Point2I size)
        {
            Stopwatch sw = Stopwatch.StartNew();

            if (highlight == null || highlightSize.X != size.X || highlightSize.Y != size.Y)
            {
                highlightSize = size;
                UI.Invoke(() => {
                    highlight = new WriteableBitmap(size.X, size.Y, 96, 96, PixelFormats.Bgra32, null);
                });
                Trace.WriteLine($"Took {sw.ElapsedMilliseconds}ms to setup highlight bitmap");
            }
            sw.Restart();
            if (highlightMode == HighlightMode.Extension)
            {
                Treemap.HighlightExtensions(highlight, new Rectangle2I(size), rootItem, Settings.HighlightColor, extension);
            }
            else if (highlightMode == HighlightMode.Selection)
            {
                Treemap.HighlightItems(highlight, new Rectangle2I(size), Settings.HighlightColor, selection);
            }
            Trace.WriteLine($"Took {sw.ElapsedMilliseconds}ms to render highlight");
            Trace.WriteLine("");
        }
예제 #12
0
 private static void DrawTreemap <T>(Treemap <T> map) where T : ITreemapNode
 {
     DrawTreemap(map.Root);
 }