С# mschart собственная функция уменьшения масштаба

Я пытаюсь сделать функцию уменьшения масштаба для моей диаграммы mschart. Моя идея состоит в том, чтобы иметь метод щелчка для диаграммы, и каждый раз, когда диаграмма щелкается правой кнопкой мыши, значение масштабирования должно меняться. Поэтому диаграмма должна реагировать и иметь место для большего количества значений. Я сделал 4 шага масштабирования: 240 значений, 3600 значений, 43 200 значений, 86 400. Методика кликов по графику выглядит так:

void chart_holder_Click(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            if (counter < 3)
            {
                counter++;
            }
            else
            {
                counter = 0;
            }

            switch (counter)
            {
                default:
                    //zoomsize -> 240s | 4min
                    zoomSize = 0;
                    graphSizing = 240;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 0:
                    //zoomsize -> 240s | 4min
                    zoomSize = 0;
                    graphSizing = 240;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;
                case 1:
                    //zoomsize -> 3'600s | 1h
                    zoomSize = 1;
                    graphSizing = 3600;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 2:
                    //zoomsize -> 43'200s | 12h
                    zoomSize = 2;
                    graphSizing = 43200;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 3:
                    //zoomsize -> 86'400s | 24h
                    zoomSize = 3;
                    graphSizing = 86400;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;
            }
        }
    }

AxisX.Maximum определяется свойством public static int graphSizing { get; set; }. Диаграмма, которая у меня есть, — это диаграмма в реальном времени, поэтому каждую секунду добавляются новые значения и т. д. TempbufferValuesTOZero, FileValuesTOZero заполняет весь массив значениями 0/0.

Прежде чем добавить значения на диаграмму, я подготавливаю их следующим образом: у меня есть оператор switch, который проверяет zoomSize, чтобы узнать, как подготовить данные.

public void prepareData()
        {
            switch (zoomSize)
            {
                default:
                    prepData1();
                    break;

                case 0:
                    prepData1();
                    break;

                case 1:
                    prepData2();
                    break;

                case 2:
                    prepData3();
                    break;

                case 3:
                    prepData4();
                    break;
            }
        }

пример как его готовят

public void prepData1()
    {
        graphSizing = 240;
        Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

        for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
        {
            bool exists = true;
            DateTime x = UnixTODateTime(i);

            if (exists != (Array.Exists(file, element => element.XValue == i)))
            {
                TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), 0) }).ToArray();
            }
            else
            {
                DataPoint point = Array.Find(file, element => element.XValue == i);
                TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), point.YValues) }).ToArray();
            }
        }
    }

После этого вызывается этот метод для отображения значений на графике:

public void fileRead()
        {
            chart_holder.Series[0].Points.Clear();

            foreach (DataPoint a in TempBuffer)
            {
                chart_holder.Series[0].Points.Add(a);
                if (a.YValues[0] == 9999)
                {
                    a.Color = Color.Red;
                }
            }
        }

TempBuffer — это массив DataPoint, в котором я храню значения (public DataPoint[] TempBuffer = new DataPoint[graphSizing];).

Но это не тихая работа, как ожидалось. Только случай по умолчанию / 0 работает отлично, как и планировалось. Но как только я хочу уменьшить масштаб, это уже не работает. В случае 2 значения AxisX совершенно неверны, а значения AxisY даже не отображаются. И в случае 3 и 4 программа вылетает. Кроме того, загрузка ЦП становится очень высокой.

Любая идея, почему другие случаи не работают, как по умолчанию / 1? И как я могу улучшить производительность и свести к минимуму высокую загрузку процессора?

Также для лучшей визуализации графика: 240 значений: введите описание изображения здесь

3600 значений: введите здесь описание изображения

Спасибо за помощь
Приветствую C.User


person C.User    schedule 29.06.2018    source источник
comment
Вам не нужно изменять свои данные для увеличения графика — вам нужно только изменить значения .AxisX.Minimum и .AxisX.Maximum, а все остальное он сделает за вас.   -  person Matthew Watson    schedule 29.06.2018
comment
@MatthewWatson, спасибо за подсказку! Но я уже использую его, для .AxisX.Maximum установлено значение graphSizing, и я изменяю это значение, щелкая правой кнопкой мыши.   -  person C.User    schedule 29.06.2018
comment
Что произойдет, если вы только измените ось min/max?   -  person Matthew Watson    schedule 29.06.2018
comment
@MatthewWatson, поскольку я загружаю данные из массива точек данных, я не могу изменить только ось max/min. Потому что в противном случае это дало бы мне нулевое исключение, потому что массив точек данных по-прежнему имел бы длину всего 240 и максимум, например, 3600 - теперь я изменяю длину массива на 3600 и ось на 3600   -  person C.User    schedule 29.06.2018
comment
Можете ли вы объяснить, что вам не нравится в встроенное масштабирование?   -  person TaW    schedule 01.07.2018
comment
@TaW, насколько я знаю, вы можете использовать масштабирование mschart только для увеличения. но мои данные начинаются с меньшего количества данных, и я хотел бы уменьшить масштаб, чтобы показать больше.   -  person C.User    schedule 02.07.2018
comment
Какие работают по умолчанию&0 или по умолчанию&0&1? Также; где программа вылетает? Можете ли вы проверить, где находится узкое место? Я подозреваю, что в prepDataX вы выполняете операции (Array.Exists и Array.Find ), которые становятся все более и более дорогими с большими объемами данных. Разве вы не можете найти только 1-ю и последнюю точку, а затем добавить все промежуточные точки без дальнейшего тестирования?   -  person TaW    schedule 02.07.2018