C # mschart собственная функция уменьшения масштаба - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь создать функцию уменьшения масштаба для моей диаграммы 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 программа падает. Также загрузка ЦП очень высока.

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

Также для лучшей визуализации графика: 240 значений: enter image description here

3600 Значения: enter image description here

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

...