c# ZedGraph: Динамическое прокручивание графика

273
09 сентября 2018, 01:00

График постоянно получает данные. Их может быть очень много. Поэтому очень неудобно, когда при поступлении новых данных на график, он сжимается.

Как можно автоматически прокручивать график, вслед за новым данными?

Суть примера состоит в том, что к данным периодически (с интервалом 100 мс) добавляются новые числа, при этом надо выводить только последние 30 значений. Источник

public partial class Form1 : Form
{
    /// <summary>
    /// Максимальный размер очереди
    /// </summary>
    int _capacity = 30;
    /// <summary>
    /// Здесь храним данные
    /// </summary>
    List<double> _data;
    /// <summary>
    /// Для генерации слуайных данные по таймеру
    /// </summary>
    Random _rnd = new Random ();
    // Интервал изменения данных по вертикали
    double _ymin = -1.0;
    double _ymax = 1.0;
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
    public Form1 ()
    {
        _data = new List<double> ();
        InitializeComponent ();
        timer.Interval = 1000; //интервал между срабатываниями 1000 миллисекунд
        timer.Tick += new EventHandler(timer_Tick); //подписываемся на события Tick
        timer.Start();
        DrawGraph ();
    }
    private void timer_Tick (object sender, EventArgs e)
    {
        // Вычислим новое значение
        double newValue = _rnd.NextDouble () * (_ymax - _ymin) + _ymin;
        // Добавим его в конец списка
        _data.Add (newValue);
        // Удалим первый элемент в списке данных, 
        // если заполнили максимальную емкость
        if (_data.Count > _capacity)
        {
            _data.RemoveAt (0);
        }
        DrawGraph ();
    }
    private void DrawGraph ()
    {
        // Получим панель для рисования
        GraphPane pane = zedGraph.GraphPane;
        // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
        pane.CurveList.Clear ();
        // Создадим список точек
        PointPairList list = new PointPairList ();
        // Интервал, где есть данные
        double xmin = 0;
        double xmax = _capacity;
        // Расстояние между соседними точками по горизонтали
        double dx = 1.0;
        double curr_x = 0;
        // Заполняем список точек
        foreach (double val in _data)
        {
            list.Add (curr_x, val);
            curr_x += dx;
        }
        // Очистим список кривых от прошлых рисунков (кадров)
        pane.CurveList.Clear ();
        LineItem myCurve = pane.AddCurve ("Random Value", list, Color.Blue, SymbolType.None);

        // Устанавливаем интересующий нас интервал по оси X
        pane.XAxis.Scale.Min = xmin;
        pane.XAxis.Scale.Max = xmax;
        // Устанавливаем интересующий нас интервал по оси Y
        pane.YAxis.Scale.Min = _ymin;
        pane.YAxis.Scale.Max = _ymax;
        // Вызываем метод AxisChange (), чтобы обновить данные об осях. 
        // В противном случае на рисунке будет показана только часть графика, 
        // которая умещается в интервалы по осям, установленные по умолчанию
        zedGraph.AxisChange ();
        // Обновляем график
        zedGraph.Invalidate ();
    }
}
READ ALSO
Замечание на sonar: &ldquo;Refactor your code not to use hardcoded absolute paths or URIs.&rdquo;

Замечание на sonar: “Refactor your code not to use hardcoded absolute paths or URIs.”

Имею проблему с указанием путей к файлам в WPF приложенииИзображение приложение находит только, когда они прописаны вот так:

257
Программа должна печатать ромб одним из значков (* или + или #)

Программа должна печатать ромб одним из значков (* или + или #)

Компилятор никакой ошибки не выдает, но массив не печатаетЧто не так?

659
Помогите со скриптом в Unity

Помогите со скриптом в Unity

Как сделать так, чтобы по нажатию мышкой (тапом) несколько раз, персонаж ускорялсяНапример, на денди была игра Hyper Sports (Прыжки в длину, бег на 100 м и тд)

280
Как отправить атрибуты используя WSDL Zimbra

Как отправить атрибуты используя WSDL Zimbra

Всем привет, создаю почту, но никак не понимаю как туда добавить атрибуты типо displayname,sn и givennameЗапрос через браузер выглядит так

282