Exemple #1
0
        private void Rearrange(int pointsCount)
        {
            CtlPresenter.Clear();

            if (pointsCount != Const.CurrentValue)
            {
                PointsCount = pointsCount;
            }

            if (Data == null || Data.Length != PointsCount)
            {
                Data = new double[PointsCount];
                Stat = new double[PointsCount];
            }

            double maxStat = Stat == null ? 0 : Stat.Max();

            for (int p = 0; p < PointsCount; ++p)
            {
                var pos = GetPointPosition(p);

                if (Data[p] > Threshold)
                {
                    DrawPoint(pos.Item1, pos.Item2, Data[p], true);
                }
                else
                {
                    DrawPoint(pos.Item1, pos.Item2, maxStat > 0 ? Stat[p] / maxStat : 0, false);
                }
            }

            CtlPresenter.Update();
        }
        private void Rearrange(int pointsCount)
        {
            if (pointsCount == Const.CurrentValue)
            {
                pointsCount = PointsCount;
            }
            else
            {
                PointsCount = pointsCount;
            }

            var width = Math.Max(Width, PointsRearrangeSnap * PointSize);

            int snaps = width / (PointsRearrangeSnap * PointSize);

            CtlPresenter.Height = 1 + PointSize * (int)Math.Ceiling(1 + (double)(PointsCount / (snaps * PointsRearrangeSnap)));

            CtlPresenter.StartRender();

            Range.For(PointsCount, p =>
            {
                var pos = GetPointPosition(p);
                DrawPoint(pos.Item1, pos.Item2, 0);
            });

            if (Data != null)
            {
                Range.For(Data.Length, y => TogglePoint(y, Data[y] > Threshold ? Data[y] : 0));
            }

            CtlPresenter.CtlBox.Invalidate();
        }
        private void DrawLabel(DynamicStatistics.PlotPoints data, Color color)
        {
            var text = new FormattedText(TimeSpan.FromTicks(data.Last().Item2 - data[0].Item2).ToString(@"hh\:mm\:ss") + " / " + Converter.DoubleToText(data.Last().Item1, "N6", false) + " %", Culture.Current, FlowDirection.LeftToRight, Font, 10, Tools.Draw.GetBrush(color), Render.PixelsPerDip);

            CtlPresenter.DrawRectangle(Tools.Draw.GetBrush(Tools.Draw.GetColor(150, Colors.White)), null, Rects.Get((ActualWidth - AxisOffset - text.Width) / 2 - 5, ActualHeight - AxisOffset - 20, text.Width + 10, text.Height));
            CtlPresenter.DrawText(text, Points.Get((ActualWidth - AxisOffset - text.Width) / 2, ActualHeight - AxisOffset - 20));
        }
        public void Draw(Dictionary<string, string> stat)
        {
            CtlPresenter.Clear();

            if (stat == null)
            {
                return;
            }

            string text = string.Empty;
            foreach (var pair in stat)
            {
                if (pair.Key.Length == 0)
                {
                    text += "\r\n";
                }
                else
                {
                    text += pair.Key + ": " + pair.Value + "\r\n";
                }
            }

            var formattedText = new FormattedText(text, Culture.Current, FlowDirection.LeftToRight, Font, 10, Brushes.Black, Render.PixelsPerDip);
            CtlPresenter.DrawText(formattedText, Points.Get(10, 0));

            Width = Math.Max(ActualWidth, formattedText.WidthIncludingTrailingWhitespace + 10);

            CtlPresenter.Update();
        }
Exemple #5
0
        private void Draw(bool fullState, NetworkDataModel model, bool isOnlyWeights, bool isOnlyChangedWeights, bool isHighlightChangedWeights)
        {
            if (model == null)
            {
                CtlPresenter.Clear();
                return;
            }

            CtlPresenter.Clear();

            //lock (Main.ApplyChangesLocker)
            {
                if (model.Layers.Count > 0)
                {
                    foreach (var layer in model.Layers)
                    {
                        if (layer == model.Layers.Last())
                        {
                            break;
                        }

                        DrawLayersLinks(fullState, model, layer, layer.Next, isOnlyWeights, isOnlyChangedWeights, isHighlightChangedWeights);
                    }

                    foreach (var layer in model.Layers)
                    {
                        DrawLayerNeurons(fullState, model, layer);
                    }
                }
            }

            CtlPresenter.Update();
        }
Exemple #6
0
        private void DrawPoint(int x, int y, double value, bool isData)
        {
            var brush = value == 0 ? Brushes.White : (isData ? Draw.GetBrush(value) : Draw.GetBrush(Draw.GetColor((byte)(255 * value), Colors.Green)));
            var pen   = Draw.GetPen(Colors.Black);

            CtlPresenter.DrawRectangle(brush, pen, Rects.Get(x * PointSize, y * PointSize, PointSize, PointSize));
        }
Exemple #7
0
        private void Render2()
        {
            int left     = 3 + (CtlPresenter.Width / 2) - ((Model.Layers.Count - 1) * 125) / 2;
            int top      = (CtlPresenter.Height / 2) - Model.Layers[0].Height / 2 - 30;
            int distance = 50;

            int alpha = 100;
            int mult  = Height / 12;

            var zeroColor = new Pen(Color.FromArgb(alpha, Color.Gray));

            for (int layer = 0; layer < Model.Layers.Count - 1; ++layer)
            {
                var neuronsCount = Model.Layers[layer].Neurons.Count;
                for (int neuron = 0; neuron < neuronsCount; ++neuron)
                {
                    CtlPresenter.G.DrawLine(zeroColor, left - neuron + layer * 150, top + neuron, 100 + left - neuron + layer * 150, top + neuron);

                    for (int weight = 0; weight < Model.Layers[layer].Neurons[neuron].Weights.Count; ++weight)
                    {
                        var value = Model.Layers[layer].Neurons[neuron].Weights[weight].Weight;
                        var hover = value == 0 ? 0 : 30 * Math.Sign(value);
                        using (var pen = Draw.GetPen(value, 0, alpha))
                        {
                            CtlPresenter.G.DrawLine(pen,
                                                    left - neuron + layer * 150 + weight,
                                                    top + neuron - hover,
                                                    left - neuron + layer * 150 + weight,
                                                    top + neuron - hover - (float)(mult * value));

                            CtlPresenter.G.FillEllipse(Brushes.Orange,
                                                       left - neuron + layer * 150 + weight - 1,
                                                       top + neuron - hover - (float)(mult * value),
                                                       2,
                                                       2);
                        }
                    }
                }

                CtlPresenter.G.DrawLine(Pens.Black,
                                        left - 105,
                                        top + 100 - 30,
                                        left - 105,
                                        top + 100 - 30 - mult);

                CtlPresenter.G.DrawString("1", Font, Brushes.Black,
                                          left - 115,
                                          top + 100 - Font.Height - 30);

                CtlPresenter.Invalidate();
            }

            zeroColor.Dispose();
        }
Exemple #8
0
        public RandomViewer(string randomizer, double?a)
        {
            InitializeComponent();
            Text = "Randomizer Viewer | " + randomizer;

            Randomizer = randomizer;
            A          = a;

            RandomizeMode.Helper.Invoke(Randomizer, Model, A);

            CtlPresenter.Width  = Screen.PrimaryScreen.Bounds.Width;
            CtlPresenter.Height = Screen.PrimaryScreen.Bounds.Height;
            CtlPresenter.Left   = Width / 2 - CtlPresenter.Width / 2;
            CtlPresenter.Top    = Height / 2 - CtlPresenter.Height / 2;

            CtlPresenter.StartRender();
        }
Exemple #9
0
        private void DrawLayerNeurons(bool fullState, NetworkDataModel model, LayerDataModel layer)
        {
            double threshold = model.Layers[0] == layer ? model.InputThreshold : 0;

            var biasColor = Tools.Draw.GetPen(Colors.Orange);

            NeuronDataModel prevNeuron = null;

            foreach (var neuron in layer.Neurons)
            {
                if (fullState || neuron.IsBias || neuron.Activation > threshold || layer.Id > 0)
                {
                    if (!Coordinator.ContainsKey(neuron))
                    {
                        Coordinator.Add(neuron, Points.Get(LayerX(model, layer), TOP_OFFSET + VerticalShift(model, layer) + neuron.Id * VerticalDistance(layer.Height)));
                    }

                    // Skip intersected neurons on first layer to improove performance.
                    if (!fullState && !neuron.IsBias && model.Layers[0] == layer && prevNeuron != null)
                    {
                        if (Coordinator[neuron].Y - Coordinator[prevNeuron].Y < NEURON_SIZE)
                        {
                            continue;
                        }
                    }
                    prevNeuron = neuron;

                    var pen   = Tools.Draw.GetPen(neuron.Activation);
                    var brush = pen.Brush;

                    if (neuron.IsBias)
                    {
                        CtlPresenter.DrawEllipse(Brushes.Orange, biasColor, Coordinator[neuron], BIAS_RADIUS, BIAS_RADIUS);
                    }

                    CtlPresenter.DrawEllipse(brush, pen, Coordinator[neuron], NEURON_RADIUS, NEURON_RADIUS);
                }
            }
        }
        private void DrawData(DynamicStatistics.PlotPoints data, Color color, PointFunc func, bool isRect)
        {
            if (data == null || data.FirstOrDefault() == null)
            {
                return;
            }

            var pen = Tools.Draw.GetPen(color);

            var firstData = data[0];
            var lastData  = data.Last();

            var ticks = lastData.Item2 - firstData.Item2;

            Point prevPoint = new Point(-1000, -1000);
            var   prevData  = firstData;

            foreach (var d in data)
            {
                var point = func(data, d, ticks);
                if ((point.X - prevPoint.X) > 10 || Math.Abs(point.Y - prevPoint.Y) > 10 || d == lastData) // opt
                {
                    CtlPresenter.DrawLine(pen, func(data, prevData, ticks), point);

                    if (isRect)
                    {
                        CtlPresenter.DrawRectangle(pen.Brush, pen, Rects.Get(point.X - 6 / 2, point.Y - 6 / 2, 6, 6));
                    }
                    else
                    {
                        CtlPresenter.DrawEllipse(pen.Brush, pen, Points.Get(point.X, point.Y), 7 / 2, 7 / 2);
                    }

                    prevData  = d;
                    prevPoint = point;
                }
            }
        }
        public void Draw(ListX <NetworkDataModel> models, NetworkDataModel selectedModel)
        {
            if (IsBaseRedrawNeeded)
            {
                DrawPlotter();
                IsBaseRedrawNeeded = false;
            }

            CtlPresenter.Clear();

            if (models == null)
            {
                return;
            }

            var model = models[0];

            while (model != null)
            {
                if (!model.IsEnabled)
                {
                    continue;
                }

                DrawData(model.DynamicStatistics.CopyForRender.PercentData, Tools.Draw.GetColor(220, model.Color), GetPointPercentData, false);
                DrawData(model.DynamicStatistics.CopyForRender.CostData, Tools.Draw.GetColor(150, model.Color), GetPointCostData, true);

                model = model.Next;
            }

            if (selectedModel != null && selectedModel.DynamicStatistics.PercentData.Count > 0)
            {
                DrawLabel(selectedModel.DynamicStatistics.PercentData, selectedModel.Color);
            }

            CtlPresenter.Update();
        }
Exemple #12
0
        private void Render()
        {
            int left     = 3 + (CtlPresenter.Width / 2) - ((Model.Layers.Count - 1) * 125) / 2;
            int top      = (CtlPresenter.Height / 2) - Model.Layers[0].Height / 2 - 30;
            int distance = 50;

            int alpha = 200;
            int mult  = Height / 12;

            int unit = 30;

            var zeroColor  = new Pen(Color.FromArgb(100, Color.Gray));
            var rangeColor = new Pen(Color.FromArgb(50, Color.White));

            // get ranges
            var ranges = new Dictionary <int, HashSet <int> >();

            for (int layer = 0; layer < Model.Layers.Count - 1; ++layer)
            {
                ranges[layer] = new HashSet <int>();

                var neuronsCount = Model.Layers[layer].Neurons.Count;
                for (int neuron = 0; neuron < neuronsCount; ++neuron)
                {
                    CtlPresenter.G.DrawLine(zeroColor, left - neuron + layer * 150, top + neuron, 100 + left - neuron + layer * 150, top + neuron);

                    bool hasNextRange = false;

                    for (int weight = 0; weight < Model.Layers[layer].Neurons[neuron].Weights.Count; ++weight)
                    {
                        var value = Model.Layers[layer].Neurons[neuron].Weights[weight].Weight;
                        if (value > 0)
                        {
                            ranges[layer].Add(1);
                        }
                        if (value > 1)
                        {
                            ranges[layer].Add(2);
                        }
                        if (value > 2)
                        {
                            ranges[layer].Add(3);
                        }
                        if (value > 3)
                        {
                            ranges[layer].Add(4);
                        }
                        if (value > 4)
                        {
                            ranges[layer].Add(5);
                        }
                        if (value > 5)
                        {
                            ranges[layer].Add(6);
                        }
                        if (value > 6)
                        {
                            ranges[layer].Add(7);
                        }
                    }
                }
            }

            for (int layer = 0; layer < Model.Layers.Count - 1; ++layer)
            {
                var neuronsCount = Model.Layers[layer].Neurons.Count;
                for (int neuron = 0; neuron < neuronsCount; ++neuron)
                {
                    CtlPresenter.G.DrawLine(zeroColor, left - neuron + layer * 150, top + neuron, 100 + left - neuron + layer * 150, top + neuron);

                    for (int r = 0; r < ranges[layer].Count; ++r)
                    {
                        for (int weight = 0; weight < Model.Layers[layer].Neurons[neuron].Weights.Count; ++weight)
                        {
                            var value     = Model.Layers[layer].Neurons[neuron].Weights[weight].Weight;
                            var origValue = value;

                            if (value > 0)
                            {
                                if (value > r + 1)
                                {
                                    value = 1;
                                }
                                else
                                {
                                    value -= r;
                                }
                            }

                            var hover = value == 0 ? 0 : unit *Math.Sign(value);

                            using (var pen = new Pen(Draw.GetColorDradient(Color.Black, origValue >= 0 ? Color.Red : Color.Blue, 200, Math.Abs(origValue) / ranges[layer].Max())))//  .GetPen(origValue, 1, alpha))
                            {
                                if (value > 0 && r > 0)
                                {
                                    CtlPresenter.G.FillEllipse(Brushes.White,
                                                               left - neuron + layer * 150 + weight - 1,
                                                               top + neuron - hover - mult * r - 1,
                                                               3,
                                                               3);
                                }

                                if (value >= 0 || r == 0)
                                {
                                    CtlPresenter.G.DrawLine(pen,
                                                            left - neuron + layer * 150 + weight,
                                                            top + neuron - hover - mult * r,
                                                            left - neuron + layer * 150 + weight,
                                                            top + neuron - hover - (float)(mult * (r + 1) * value));
                                }

                                if ((value < 0 && r == 0) || (value >= 0 && value < 1))
                                {
                                    CtlPresenter.G.FillEllipse(Brushes.Orange,
                                                               left - neuron + layer * 150 + weight - 1,
                                                               top + neuron - hover - (float)(mult * (r + 1) * value),
                                                               2,
                                                               2);
                                }
                            }
                        }



                        if (r < ranges[layer].Count - 1)
                        {
                            CtlPresenter.G.DrawLine(rangeColor, left - neuron + layer * 150, top + neuron - unit - mult * (r + 1), 100 + left - neuron + layer * 150, top + neuron - unit - mult * (r + 1));
                        }
                    }
                }

                CtlPresenter.G.DrawLine(Pens.Black,
                                        left - 105,
                                        top + 100 - unit,
                                        left - 105,
                                        top + 100 - unit - mult);

                CtlPresenter.G.DrawString("1", Font, Brushes.Black,
                                          left - 115,
                                          top + 100 - Font.Height - unit);

                CtlPresenter.Invalidate();
            }


            zeroColor.Dispose();
            rangeColor.Dispose();
        }
Exemple #13
0
        private void DrawLayersLinks(bool fullState, NetworkDataModel model, LayerDataModel layer1, LayerDataModel layer2, bool isOnlyWeights, bool isOnlyChangedWeights, bool isHighlightChangedWeights)
        {
            double threshold = model.Layers[0] == layer1 ? model.InputThreshold : 0;

            NeuronDataModel prevNeuron = null;

            foreach (var neuron1 in layer1.Neurons)
            {
                if (!Coordinator.ContainsKey(neuron1))
                {
                    Coordinator.Add(neuron1, Points.Get(LayerX(model, layer1), TOP_OFFSET + VerticalShift(model, layer1) + neuron1.Id * VerticalDistance(layer1.Height)));
                }

                // Skip intersected neurons on first layer to improove performance.
                if (!fullState && !neuron1.IsBias && model.Layers[0] == layer1 && prevNeuron != null)
                {
                    if (Coordinator[neuron1].Y - Coordinator[prevNeuron].Y < NEURON_SIZE)
                    {
                        continue;
                    }
                }

                if (fullState || neuron1.IsBias || neuron1.Activation > threshold)
                {
                    foreach (var neuron2 in layer2.Neurons)
                    {
                        if (!neuron2.IsBias || (neuron2.IsBiasConnected && neuron1.IsBias))
                        {
                            if (fullState || ((neuron1.IsBias || neuron1.Activation > threshold) && neuron1.AxW(neuron2) != 0))
                            {
                                Pen  pen             = null;
                                Pen  penChange       = null;
                                bool isWeightChanged = false;
                                var  weight          = neuron1.WeightTo(neuron2);

                                if (WeightsData.TryGetValue(weight, out double prevWeight))
                                {
                                    if (prevWeight != weight.Weight)
                                    {
                                        isWeightChanged     = true;
                                        WeightsData[weight] = weight.Weight;
                                    }
                                }
                                else
                                {
                                    prevWeight      = 0;
                                    isWeightChanged = true;
                                    WeightsData.Add(weight, weight.Weight);
                                }

                                double fraction = Math.Min(1, Math.Abs((prevWeight - weight.Weight) / prevWeight));
                                if (fraction <= 0.001)
                                {
                                    isWeightChanged = false;
                                }

                                if (isWeightChanged && isHighlightChangedWeights)
                                {
                                    penChange = Tools.Draw.GetPen(Colors.Lime);
                                }

                                if (isOnlyWeights)
                                {
                                    if ((isWeightChanged && isOnlyChangedWeights) || !isOnlyChangedWeights)
                                    {
                                        pen = Tools.Draw.GetPen(weight.Weight, 1);
                                    }
                                }
                                else
                                {
                                    pen = Tools.Draw.GetPen(neuron1.AxW(neuron2), 1);
                                }

                                if (!isOnlyChangedWeights && isHighlightChangedWeights && isWeightChanged)
                                {
                                    pen       = penChange;
                                    penChange = null;
                                }

                                if (pen != null)
                                {
                                    if (!Coordinator.ContainsKey(neuron2))
                                    {
                                        Coordinator.Add(neuron2, Points.Get(LayerX(model, layer2), TOP_OFFSET + VerticalShift(model, layer2) + neuron2.Id * VerticalDistance(layer2.Height)));
                                    }

                                    CtlPresenter.DrawLine(pen, Coordinator[neuron1], Coordinator[neuron2]);
                                    prevNeuron = neuron1;
                                }

                                if (penChange != null)
                                {
                                    CtlPresenter.DrawLine(penChange, Coordinator[neuron1], Coordinator[neuron2]);
                                    prevNeuron = neuron1;
                                }
                            }
                        }
                    }
                }
            }
        }
        public void Render(long startTicks, long endTicks, DataManager manager, bool isOdd, bool isHeadOfGroup)
        {
            CtlPresenter.Clear();

            using (var dc = CtlPresenter.G())
            {
                var width  = CtlPresenter.ActualWidth;
                var height = CtlPresenter.ActualHeight;

                if (Values.Count == 0)
                {
                    //todo: add grid
                    return;
                }

                CtlGroup.Visibility = isHeadOfGroup ? Visibility.Visible : Visibility.Collapsed;

                double rangeMin = RangeMinimum;
                double rangeMax = RangeMaximum;

                /* auto range
                 * if (manager.IsAutoRangeMinMax)
                 * {
                 *  var min = Values.Min(v => v.CtlValue.Value);
                 *  var max = Values.Max(v => v.CtlValue.Value);
                 *
                 *  rangeMax = max + min;
                 *  rangeMin = 0;
                 * }
                 */

                // Min-Max range
                if (manager.IsAutoRangeMinMax)
                {
                    var min = Values.Min(v => v.CtlValue.Value);
                    var max = Values.Max(v => v.CtlValue.Value);

                    rangeMax = max;
                    rangeMin = min;
                }

                if (rangeMin == rangeMax)
                {
                    var pen = GetPenFromValue(rangeMin);

                    CtlMinRange.Text = Converter.DoubleToText(rangeMin, "F3", true);
                    CtlMinRange.VerticalAlignment = VerticalAlignment.Center;
                    CtlMinRange.Background        = pen.Brush;
                    CtlMaxRange.Visibility        = Visibility.Collapsed;
                }
                else
                {
                    var penMin = GetPenFromValue(rangeMin);
                    var penMax = GetPenFromValue(rangeMax);

                    CtlMinRange.Text       = Converter.DoubleToText(rangeMin, "F3", true);
                    CtlMinRange.Background = penMin.Brush;
                    CtlMaxRange.Text       = Converter.DoubleToText(rangeMax, "F3", true);
                    CtlMaxRange.Background = penMax.Brush;
                }

                double optimalValue = CriticalMinumim + (CriticalMaximum - CriticalMinumim) / 2;

                if (manager.IsShowOptimalLine && CriticalMinumim > 0)
                {
                    if (rangeMax < optimalValue)
                    {
                        rangeMax = optimalValue;
                    }

                    if (rangeMin > optimalValue)
                    {
                        rangeMin = optimalValue;
                    }
                }

                var prevValue = Values[0];

                double val     = prevValue.CtlValue.Value;
                var    prevPen = GetPenFromValue(val);
                double prevX   = GetX(startTicks, endTicks, prevValue.CtlDate.SelectedDate.Value);

                foreach (var value in Values)
                {
                    if (prevValue != null)
                    {
                        var v       = value.CtlValue.Value;
                        var currPen = GetPenFromValue(v);
                        if (currPen != prevPen)
                        {
                            var end         = value == Values[Values.Count - 1] ? value.CtlDate.SelectedDate.Value : value.CtlDate.SelectedDate.Value.AddDays(-1);
                            var dayOfChange = GetDayOfChange2(prevValue, value, end, prevPen);

                            val = GetValueForDate(prevValue, value, dayOfChange.Ticks);
                            var pen = GetPenFromValue(val);

                            bool lastDay = value == Values[Values.Count - 1] && dayOfChange == end;
                            if (pen != prevPen || lastDay)
                            {
                                double x = (lastDay && pen == prevPen) ? width : GetX(startTicks, endTicks, dayOfChange);
                                CtlPresenter.DrawRectangle(prevPen.Brush, prevPen, Rects.Get(prevX, 0, x - prevX, height), dc);

                                prevX   = x;
                                prevPen = pen;
                            }
                        }
                    }

                    prevValue = value;
                }

                CtlPresenter.DrawRectangle(prevPen.Brush, prevPen, Rects.Get(prevX, 0, width - prevX, height), dc);

                // grid

                var endDate   = new DateTime(endTicks);
                var startDate = new DateTime(startTicks);

                for (DateTime day = startDate; day <= endDate; day = day.AddMonths(1))
                {
                    double x = GetX(startTicks, endTicks, day);
                    CtlPresenter.DrawLine(day.Month == 1 ? penGridYear : (isOdd ? penGrid : penGridAlt), Points.Get(x, 0), Points.Get(x, height), dc);
                }

                double xt = GetX(startTicks, endTicks, DateTime.Today);
                CtlPresenter.DrawLine(penToday, Points.Get(xt, 0), Points.Get(xt, height), dc);

                // optimal line
                if (manager.IsShowOptimalLine && CriticalMinumim > 0)
                {
                    double y = GetY(optimalValue, rangeMin, rangeMax);
                    CtlPresenter.DrawLine(penOptimalValue, Points.Get(0, y), Points.Get(width, y), dc);
                }

                // graph
                prevValue = null;
                foreach (var value in Values)
                {
                    var point = GetValuePoint(value, startTicks, endTicks, rangeMin, rangeMax);
                    if (prevValue != null)
                    {
                        var prevPoint = GetValuePoint(prevValue, startTicks, endTicks, rangeMin, rangeMax);
                        CtlPresenter.DrawLine(penLine, prevPoint, point, dc);
                    }

                    // Critical border circle

                    var pointPen = penLine;

                    double pointRadius = 5 * Tools.Render.PixelSize;

                    if (CriticalMinumim != CriticalMaximum)
                    {
                        if (CriticalMinumim > RangeMinimum && value.CtlValue.Value == CriticalMinumim)
                        {
                            CtlPresenter.DrawEllipse(penCriticalBorder.Brush, penCriticalBorder, point, pointRadius, pointRadius, dc);
                            pointPen = penLow;
                        }
                        else if (CriticalMaximum < RangeMaximum && value.CtlValue.Value == CriticalMaximum)
                        {
                            CtlPresenter.DrawEllipse(penCriticalBorder.Brush, penCriticalBorder, point, pointRadius, pointRadius, dc);
                            pointPen = penHigh;
                        }
                    }

                    // Value point

                    CtlPresenter.DrawEllipse(pointPen.Brush, pointPen, point, pointRadius / 2, pointRadius / 2, dc);

                    prevValue = value;
                }
                //

                // values
                var brush     = Tools.Draw.GetBrush(Colors.White);
                var prevRects = new List <Rect>();
                for (int i = Values.Count - 1; i >= 0; --i)
                {
                    var value = Values[i];
                    var point = GetValuePoint(value, startTicks, endTicks, rangeMin, rangeMax);
                    var fmt   = new FormattedText(Converter.DoubleToText(value.CtlValue.Value, "F3"), Culture.Current, FlowDirection.LeftToRight, Font, 9, Brushes.Black, Tools.Render.PixelsPerDip);
                    var x     = point.X + Tools.Render.PixelSize;
                    var y     = point.Y >= height / 2 ? point.Y - Tools.Render.PixelSize - fmt.Height : point.Y + Tools.Render.PixelSize;
                    var rect  = Rects.Get(x, y, fmt.Width + 2 * Tools.Render.PixelSize, fmt.Height - 2 * Tools.Render.PixelSize);

                    if (!prevRects.Any(prevRect => Rects.Intersects(rect, prevRect)))
                    {
                        CtlPresenter.DrawRectangle(brush, null, rect, dc);
                        CtlPresenter.DrawText(fmt, Points.Get(x + Tools.Render.PixelSize, y - Tools.Render.PixelSize), 0, dc);
                        prevRects.Add(rect);
                    }
                }
            }

            IsRenderNeeded = false;
        }
Exemple #15
0
 private void RandomizerViewer_SizeChanged(object sender, SizeChangedEventArgs e)
 {
     CtlPresenter.SetValue(System.Windows.Controls.Canvas.LeftProperty, (CtlCanvas.ActualWidth - CtlPresenter.ActualWidth) / 2);
     CtlPresenter.SetValue(System.Windows.Controls.Canvas.TopProperty, (CtlCanvas.ActualHeight - CtlPresenter.ActualHeight) / 2);
 }
Exemple #16
0
 public void Clear()
 {
     CtlPresenter.Clear();
 }
Exemple #17
0
        public void Draw(ErrorMatrix matrix)
        {
            if (!IsLoaded)
            {
                return;
            }

            if (IsClassesChanged(matrix.Classes))
            {
                InitClassesFmtText(matrix.Classes);
                DrawBase(matrix);
            }

            Classes = matrix.Classes;
            CtlPresenter.Clear();

            int  size       = 9;
            long goodMax    = 1;
            long badMax     = 1;
            long axisOffset = 12;
            long bound      = 30;

            for (int y = 0; y < matrix.Output.Length; ++y)
            {
                for (int x = 0; x < matrix.Input.Length; ++x)
                {
                    if (x == y)
                    {
                        goodMax = Math.Max(goodMax, matrix.Matrix[x, y]);
                    }
                    else
                    {
                        badMax = Math.Max(badMax, matrix.Matrix[x, y]);
                    }
                }
            }

            for (int y = 0; y < matrix.Output.Length; ++y)
            {
                for (int x = 0; x < matrix.Input.Length; ++x)
                {
                    if (matrix.Matrix[y, x] > 0)
                    {
                        var value = (double)matrix.Matrix[y, x] / (double)(x == y ? goodMax : badMax);
                        var color = Tools.Draw.GetColorDradient(Colors.LightGray, x == y ? Colors.Green : Colors.Red, 255, value);
                        var brush = Tools.Draw.GetBrush(color);
                        CtlPresenter.DrawRectangle(brush, PenSilver, Rects.Get(axisOffset + x * size, axisOffset + y * size, size, size));
                    }
                }
            }

            long outputMax = Math.Max(matrix.Output.Max(), 1);

            for (int x = 0; x < matrix.Output.Length; ++x)
            {
                var color = Tools.Draw.GetColorDradient(Colors.White, matrix.Output[x] > matrix.Input[x] ? Colors.Red : matrix.Output[x] < matrix.Input[x] ? Colors.Blue : Colors.Green, 100, (double)matrix.Output[x] / (double)outputMax);
                var brush = Tools.Draw.GetBrush(color);
                CtlPresenter.DrawRectangle(brush, PenSilver, Rects.Get(axisOffset + x * size, 10 + axisOffset + matrix.Input.Length * size, size, (int)(bound * (double)matrix.Output[x] / (double)outputMax)));
            }

            long inputMax = Math.Max(matrix.Input.Max(), 1);

            for (int y = 0; y < matrix.Input.Length; ++y)
            {
                var color = Tools.Draw.GetColorDradient(Colors.White, Colors.Green, 100, (double)matrix.Input[y] / (double)inputMax);
                var brush = Tools.Draw.GetBrush(color);
                CtlPresenter.DrawRectangle(brush, PenSilver, Rects.Get(11 + axisOffset + matrix.Output.Length * size, axisOffset + y * size, (int)(bound * (double)matrix.Input[y] / (double)inputMax), size));
            }

            CtlPresenter.Update();
        }
        public void Render(DateTime start, DateTime end)
        {
            CtlPresenter.Clear();

            byte alpha = 100;

            var winterColor = Draw.GetBrush(Draw.GetColor(alpha, Colors.White));
            var springColor = Draw.GetBrush(Draw.GetColor(alpha, Colors.Blue));
            var summerColor = Draw.GetBrush(Draw.GetColor(alpha, Colors.Green));
            var autumColor  = Draw.GetBrush(Draw.GetColor(alpha, Colors.Yellow));

            var year0Color = Draw.GetBrush(Draw.GetColor(255, Colors.WhiteSmoke));
            var year1Color = Draw.GetBrush(Draw.GetColor(255, Colors.DarkGray));

            var dictMonth = new Dictionary <int, Brush>()
            {
                { 1, winterColor },
                { 2, winterColor },
                { 3, springColor },
                { 4, springColor },
                { 5, springColor },
                { 6, summerColor },
                { 7, summerColor },
                { 8, summerColor },
                { 9, autumColor },
                { 10, autumColor },
                { 11, autumColor },
                { 12, winterColor }
            };

            var dictYear = new Dictionary <int, Brush>()
            {
                { 0, year0Color },
                { 1, year1Color }
            };

            var width  = CtlPresenter.ActualWidth;
            var height = CtlPresenter.ActualHeight;

            const double yearHeight = 5;

            // grid
            for (DateTime day = start; day <= end; day = day.AddMonths(1))
            {
                double x  = GetX(start.Ticks, end.Ticks, day.Ticks);
                double x2 = GetX(start.Ticks, end.Ticks, day.AddMonths(1).Ticks);

                CtlPresenter.DrawRectangle(dictMonth[day.Month], penGrid, Rects.Get(x, 0, x2 - x, height - yearHeight));

                if (day.Month == 1)
                {
                    CtlPresenter.DrawLine(penGridYear, Points.Get(x, 0), Points.Get(x, height - yearHeight));
                }

                var fmt = new FormattedText(day.Date.ToString("MMM") + "\r\n" + (day.Date.Year - 2000), Culture.Current, FlowDirection.LeftToRight, Font, 9, Brushes.Black, Tools.Render.PixelsPerDip);
                CtlPresenter.DrawText(fmt, Points.Get(x + (x2 - x - fmt.Width) / 2, (height - fmt.Height) / 2 - 3));

                CtlPresenter.DrawRectangle(dictYear[day.Year % 2], null, Rects.Get(x, height - yearHeight, x2 - x, yearHeight));
            }
            CtlPresenter.DrawLine(penGrid, Points.Get(0, 0), Points.Get(width, 0));
            //
        }