Я пытаюсь создать функцию уменьшения масштаба для моей диаграммы 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 значений:
3600 Значения:
Спасибо за помощь
Привет C.User