Автопрокрутка графика (эффект осциллографа) - PullRequest
0 голосов
/ 28 апреля 2018

Моя проблема в том, что всякий раз, когда я добавляю точку на график, она сжимает все точки. Вместо этого я хочу, чтобы он автоматически прокручивался.

Вот два .gifs, чтобы объяснить, в чем моя проблема

Что у меня сейчас

enter image description here

Чего я хочу достичь

enter image description here

Код, который у меня сейчас есть,

    DateTime dt;

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        dt = DateTime.Now;
        if (checkBox1.Checked)
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 1);
        }
        else
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 0);
        }

    }

1 Ответ

0 голосов
/ 28 апреля 2018

У вас есть выбор:

  • Вы можете удалить точку слева для каждой точки, которую вы добавили справа (после определенного числа)

  • Можно сместить оси X Minimum и Maximum значения

  • Вы можете настроить график на увеличение и панорамирование, а затем на панорамирование, т.е. переместите ScaleView

Первый вариант прост и будет поддерживать постоянным число точек данных. Это может быть хорошо или плохо, в зависимости от ваших потребностей.

Два других будут сохранять набор точек и только панорамировать на графике.

Общие ссылки:

ChartArea ca = chart.ChartAreas[0];
Series s = chart.Series[0];

Вот код для 1-го варианта:

s.Points.AddXY(..);
s.Points.RemoveAt(0);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();

Вот код для варианта 2:

int ix = s.Points.AddXY(..);

ca.AxisX.Maximum  = s.Points[ix].XValue;
ca.AxisX.Minimum += s.Points[ix].XValue - s.Points[ix-1].XValue;
ca.RecalculateAxesScale();

Вот код для варианта 3:

int ix = s.Points.AddXY(..);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();

ca.AxisX.ScaleView.Zoom(s.Points[ix-pointMax ].XValue, s.Points[ix].XValue );

Предполагается, что в серии уже есть pointMax очков.

Все примеры предполагают, что у вас уже есть несколько пунктов. Опции 1 и 3 также предполагают, что ни Minimum, ни Maximum оси x не установлены, т.е. они double.NaN.

Последний вариант позволит вам удобно просматривать данные.

1-й поддерживает низкое количество точек данных, но теряет все, кроме последних.

Давайте посмотрим все варианты на работе:

enter image description here

Обратите внимание, что варианты 2 и 3 также предполагают, что у вас есть допустимые значения x. Если вы этого не сделаете, вам нужно сделать индексирование по оси X и использовать индекс точек вместо значений.

...