Шпаргалка по ZedGraph. Как выводить постоянно обновляемые данные (более простой вариант) | jenyay.net

Шпаргалка по ZedGraph. Как выводить постоянно обновляемые данные (более простой вариант)

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

Однако, в библиотеке ZedGraph для подобной работы есть уже готовый класс-контейнер RollingPointPairList. Как его использовать демонстрирует следующий код.

zedgraph_rolling_01.png: 600x500, 9k (31.05.2012 10:09)
zedgraph_rolling_02.png: 600x500, 9k (31.05.2012 10:09)

Все примеры объединены в одном solution для Visual Studio 2005 и написаны на языке C#, скачать их можно отсюда.

Проект в примере - RollingPoint

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;

using ZedGraph;
using System.Drawing;

namespace QueueTime
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Количество отображаемых точек
        /// </summary>
        int _capacity = 100;

        /// <summary>
        /// Здесь храним данные
        /// </summary>
        RollingPointPairList _data;

        // Параметры отображаемой синусоиды
        double _amplitude = 5;
        double _freq = 3;
        double _step = 0.1;

        // Текущее значение на графике
        double _currentx = 0;


        public Form1 ()
        {
            // !!! Создаем массив данных с ограниченной емкостью.
            // При превышениизаданной емкости первые элементы в массиве будут удаляться
            _data = new RollingPointPairList (_capacity);

            InitializeComponent ();
            PrepareGraph ();
        }


        /// <summary>
        /// Метод вызывается по таймеру
        /// </summary>
        private void timer_Tick (object sender, EventArgs e)
        {
            // Вычислим новое значение
            double newValue = _amplitude * Math.Sin (_currentx * _freq);

            // !!! Добавим новый отсчет к данным
            _data.Add (_currentx, newValue);
            _currentx += _step;

            // Рассчитаем интервал по оси X, который нужно отобразить на графике
            double xmin = _currentx - _capacity * _step;
            double xmax = _currentx;

            GraphPane pane = zedGraph.GraphPane;
            pane.XAxis.Scale.Min = xmin;
            pane.XAxis.Scale.Max = xmax;

            // Обновим оси
            zedGraph.AxisChange ();

            // Обновим сам график
            zedGraph.Invalidate ();
        }


        /// <summary>
        /// Подготовка к отображению данных
        /// </summary>
        private void PrepareGraph ()
        {
            // Получим панель для рисования
            GraphPane pane = zedGraph.GraphPane;

            // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
            pane.CurveList.Clear ();

            // Добавим кривую пока еще без каких-либо точек
            LineItem myCurve = pane.AddCurve ("sin (x)", _data, Color.Blue, SymbolType.None);

            // Устанавливаем интересующий нас интервал по оси Y
            pane.YAxis.Scale.Min = -_amplitude;
            pane.YAxis.Scale.Max = _amplitude;

            // Вызываем метод AxisChange (), чтобы обновить данные об осях.
            zedGraph.AxisChange ();

            // Обновляем график
            zedGraph.Invalidate ();
        }
    }
}

Вернуться к остальным примерам


Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
4.5 stars

Рейтинг 4.4/5. Всего 8 голос(а, ов)