//------- // автомасштабирование по оси У private void ScaleChart_Y(ChangeMinMax _changeMinMax, double _countValueChart, CollectionGraphicElementsChart _collectionGraphicElementsChart, InitialDataChartList _initialDataChartList, ExtremumValue _extremumValue, ScaleValue _scaleValue, Action <Rectangle, InitialValue, double, double> _scaleYTypeAction) { if (_changeMinMax.ChangeMin | _changeMinMax.ChangeMax) { dispatcher.Invoke(() => { for (int i = 0; i < _countValueChart; i++) { _scaleYTypeAction(_collectionGraphicElementsChart[i], _initialDataChartList[i], _extremumValue.Min, _scaleValue.Y_scale); } }); } }
/// <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)); } //-------------------------------------------- }