/// <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); }