Пример #1
0
        /// <summary>
        /// Рисует график
        /// </summary>
        /// <param name="_initialeValue">исходное значение</param>
        private void ChartsDraw(InitialValue _initialeValue, Func <Point, Brush, Size, Rectangle> _generateElementChartAction, Action <Rectangle, InitialValue, double, double> _scaleYTypeAction, Action <Rectangle, double> _setBottomAction)
        {
            Size         sizeChart = new Size();
            ChangeMinMax changeMinMax;
            Point        coordinates = new Point();

            double countElement = ElementsChart.Count;

            sizeChart    = new Size(sizePanel.size.Width, sizePanel.size.Height);
            changeMinMax = new ChangeMinMax(MinCalc(_initialeValue, ref extremumInitialeValue), MaxCalc(_initialeValue, ref extremumInitialeValue));

            scaleValue.X_scale = X_ScaleValueCalc(SettingsCharts.maxCountValueCharts.Count, sizeChart.Width);
            scaleValue.Y_scale = Y_ScaleValueCalc(extremumInitialeValue, sizeChart);
            YScale             = scaleValue.Y_scale;
            MinValue           = extremumInitialeValue.Min;

            coordinates.Y   = Y_Set(_initialeValue, extremumInitialeValue.Min, scaleValue.Y_scale);
            YCoordinateLine = sizePanel.size.Height - coordinates.Y; // для линии начало системы координат находится в верхнем левом углу, мой график сделан для начала координат в нижнем левом углу.
            CurrentValue    = _initialeValue.Value;

            // масштабирование по У если изменился макс/мин
            ScaleChart_Y(changeMinMax, countElement, ElementsChart, initialDataList, extremumInitialeValue, scaleValue, _scaleYTypeAction);

            // масштабируем по Х
            TrimmingData_X(ElementsChart, initialDataList, sizeChart, _setBottomAction, ref scaleValue, ref extremumInitialeValue, ref countElement);

            coordinates.X = X_Set(countElement, scaleValue.X_scale);

            dispatcher.Invoke(() =>
            {
                ElementsChart.Add(_generateElementChartAction(coordinates, colorElemChart.BrushAll, sizeAllPoint));
            }, DispatcherPriority.Background);

            initialDataList.Add(_initialeValue);

            // обновляем данные для дополнительных панелей
            foreach (var item in FullyDependentPanelList)
            {
                item.FullyDependentPanel.CoordinatesPanel = new Point(coordinates.X, coordinates.Y);
            }
            foreach (var item in PartiallyDependentPanelList)
            {
                item.UpdateDependentValue(new ValuesPartiallyDependentPanel(extremumInitialeValue.Min, scaleValue.Y_scale, coordinates.X));
            }
            //--------------------------------------------
        }
        /// <summary>
        /// Рисуем график гистограм.
        /// </summary>
        /// <param name="_initialeValue"></param>
        public void ChartDrawGistogram(InitialValue _initialeValue)
        {
            double invalue      = _initialeValue.Value;
            Point  coordinates  = new Point();
            double countElement = ElementsChart.Count;

            if (invalue > 1)
            {
                invalue = 1;
            }
            if (invalue < -1)
            {
                invalue = -1;
            }

            ScaleValue scaleValue = new ScaleValue(sizePanel.size.Width / SettingsCharts.maxCountValueCharts.Count, sizePanel.size.Height / diapason);

            coordinates.X       = X_Set(countElement, scaleValue.X_scale);
            sizeAllPoint.Height = Math.Abs(invalue) * scaleValue.Y_scale;

            if (invalue != 0)
            {
                if (invalue > 0)
                {
                    coordinates.Y = (1 - invalue) * scaleValue.Y_scale;
                }
                else
                {
                    coordinates.Y = sizePanel.size.Height / diapason;
                }
            }
            else
            {
                coordinates.Y = sizePanel.size.Height / diapason;
            }

            dispatcher.Invoke(() =>
            {
                ElementsChart.Add(GistogramGenerate(coordinates, brushAll, sizeAllPoint));
            }, DispatcherPriority.Background);

            initialDataList.Add(_initialeValue);

            // масштабируем по Х
            TrimmingData_X(ElementsChart, initialDataList, scaleValue, ref countElement);
        }