Шпаргалка по ZedGraph. Как уменьшить количество точек, отображаемых на графике | jenyay.net

Шпаргалка по ZedGraph. Как уменьшить количество точек, отображаемых на графике

В комментариях задали вопрос:

Здравствуйте!
У меня вопрос: нет ли в ZedGraph опции, чтобы рисовались не все точки графика? Например, нет смысла на форме шириной 1024 пиксела рисовать миллион точек, т.к. из них реально видны будут только 1024, а времени тратится много. Достаточно нарисовать 1024 точки, которые будут аппроксимировать данный график из миллиона точек.

Как раз для этой цели в ZedGraph есть класс FilteredPointList, который позволяет уменьшить количество используемых точек. Использование этого класса показано далее.

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

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

public partial class Form1 : Form
{
    public Form1 ()
    {
        InitializeComponent ();

        DrawCurves ();
    }

    /// <summary>
    /// Рисование всех кривых
    /// </summary>
    private void DrawCurves ()
    {
        // Подготовим большие массивы данных по осям X и Y
        double xmin = -20;
        double xmax = 20;

        // Количество точек в полном массиве
        int count = 10000;

        // Массивы с координатами точек по X и Y
        double[] xlist = new double[count];
        double[] ylist = new double[count];

        // Шаг дискретизации
        double dx = (xmax - xmin) / count;

        // Заполним массив из большого количества элементов
        for (int i = 0; i < count; i++)
        {
            double currx = xmin + i * dx;

            xlist[i] = currx;
            ylist[i] = f(currx);
        }

        // Сначала нарисуем кривую по полноценным массивам
        PointPairList fullList = new PointPairList (xlist, ylist);
        DrawGraph (fullList, Color.Red);

        // Теперь воспользуемся классом FilteredPointList,
        // чтобы уменьшить количество отображаемых точек.
        // В конструктор класса передаются полноценные массивы
        FilteredPointList filteredList = new FilteredPointList (xlist, ylist);

        // Параметры фильтрации точек
        // Нас интересует только интервал от -15 до 15
        double filteredXMin = -15;
        double filteredXMax = 15;

        // Нам достаточно 20-ти точек
        int filteredCount = 20;

        // Установим параметры фильтрации
        filteredList.SetBounds (filteredXMin, filteredXMax, filteredCount);

        // Нарисуем кривую по отфильтрованным точкам
        DrawGraph (filteredList, Color.Blue);
    }


    /// <summary>
    /// Рисование одной кривой
    /// </summary>
    /// <param name="points">Точки для кривой</param>
    /// <param name="color">Цвет для кривой</param>
    private void DrawGraph (IPointList points, Color color)
    {
        // Получим панель для рисования
        GraphPane pane = zedGraph.GraphPane;

        // Создадим кривую, в названии которой содержится
        // количество фактически отображаемых точек
        pane.AddCurve (points.Count.ToString() + " точек",
            points,
            color,
            SymbolType.None);

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

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


    private double f (double x)
    {
        if (x == 0)
        {
            return 1;
        }

        return Math.Sin (x) / x;
    }
}

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

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

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




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 551