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

В комментариях задали вопрос: "При ручном масштабировании с помощью колеса мышки, масштаб изменяется не ограниченно, как в вверх, так и вниз диапазона, каким образом можно выставить ограничение на увеличение/уменьшение масштаба ???"

Данный пример содержит пример обработчика события ZoomEvent, в котором происходит проверка интервала по осям X и Y. В этом примере используется явное изменение масштаба осей, если график становится слишком мелкий, кроме того, в обработчик события ZoomEvent передаются два экземпляра класса ZoomState: oldState и newState. Другой способ отмены масштабирования является вызов метода ApplyState() переменной oldState, чтобы вернуть "старое" значение масштаба, которе было до того как пользователь крутанул колесико мышки. Однако, этот способ таит опасность, связанный с тем, что при изменении масштаба с помощью выделения прямоугольной области на графике, oldState становится равным null, и возникают дополнительные проблемы с "предыдущим состоянием", поэтому этот способ в данном примере не рассматривается.

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

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

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

        // Подпишемся на сообщение, уведомляющее о том,
        // что пользователь изменяет масштаб графика
        zedGraph.ZoomEvent += new ZedGraphControl.ZoomEventHandler (zedGraph_ZoomEvent);

        DrawGraph ();
    }

    /// <summary>
    /// Обработчик события при изменении масштаба
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="oldState"></param>
    /// <param name="newState"></param>
    void zedGraph_ZoomEvent (ZedGraphControl sender, ZoomState oldState, ZoomState newState)
    {
        GraphPane pane = sender.GraphPane;

        // Для простоты примера будем ограничивать масштабирование
        // только в сторону уменьшения размера графика

        // Проверим интервал для каждой оси и
        // при необходимости скорректируем его

        if (pane.XAxis.Scale.Min <= -100)
        {
            pane.XAxis.Scale.Min = -100;
        }

        if (pane.XAxis.Scale.Max >= 100)
        {
            pane.XAxis.Scale.Max = 100;
        }

        if (pane.YAxis.Scale.Min <= -1)
        {
            pane.YAxis.Scale.Min = -1;
        }

        if (pane.YAxis.Scale.Max >= 2)
        {
            pane.YAxis.Scale.Max = 2;
        }
    }

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

        return Math.Sin (x) / x;
    }

    private void DrawGraph ()
    {
        // Получим панель для рисования
        GraphPane pane = zedGraph.GraphPane;

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

        // Создадим список точек
        PointPairList list = new PointPairList ();

        double xmin = -50;
        double xmax = 50;

        // Заполняем список точек
        for (double x = xmin; x <= xmax; x += 0.01)
        {
            // добавим в список точку
            list.Add (x, f (x));
        }

        // Создадим кривую с названием "Sinc",
        // которая будет рисоваться голубым цветом (Color.Blue),
        // Опорные точки выделяться не будут (SymbolType.None)
        LineItem myCurve = pane.AddCurve ("Sinc", list, Color.Blue, SymbolType.None);

        // Вызываем метод AxisChange (), чтобы обновить данные об осях.
        // В противном случае на рисунке будет показана только часть графика,
        // которая умещается в интервалы по осям, установленные по умолчанию
        zedGraph.AxisChange ();

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

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

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

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



Jiri 12.10.2010 - 14:04

Как вывдить текущее врем в качестве меток под осью Х?

Приветствую.
Надо динамически выводить данные, обновляемые каждую секунду. При этом надо, чтобы метки под осью Х отражали время получения данных в формате 12:03:57 и т.п.
my_pane.XAxis.Type = AxisType.Date; дает время, в котором шаг аргумента х, равный 1, дает шаг в 1 день, начиная с (не соврать бы) с 1-го января 1900 года. Понятно, что можно перевети текущую дату в соответствующее число.. Формат вывода даты тоже задается. Но.
Вопрос собственно в следующем. Проще можно как-нибудь?

TSEO 22.04.2011 - 13:24

Запрет на увеличение/уменьшение более чем в 1000 раз по оси X или Y

public partial class Form1 : Form
{
....
  private double xScaleMax;
  private double xScaleMin;
  private double yScaleMax;
  private double yScaleMin;
...


  private void DrawGraph ()
  {
...
//Сохраняем первоначальный масштаб
  this.xScaleMax = myPane.XAxis.Scale.Max;
  this.xScaleMin = myPane.XAxis.Scale.Min;
  this.yScaleMax = myPane.YAxis.Scale.Max;
  this.yScaleMin = myPane.YAxis.Scale.Min;
  }

  void perfomanceZedGraph_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState)
{
  GraphPane pane = sender.GraphPane;        
  double origialXScale = this.xScaleMax - this.xScaleMin;
  double newXScale = pane.XAxis.Scale.Max - pane.XAxis.Scale.Min;

  bool isXLess = (bool)((origialXScale / newXScale) > 1000);
  bool isXBigger = (bool)((origialXScale / newXScale) < 0.001);

  double origialYScale = this.yScaleMax - this.yScaleMin;
  double newYScale = pane.YAxis.Scale.Max - pane.YAxis.Scale.Min;

  bool isYLess = (bool)((origialYScale / newYScale) > 1000);
  bool isYBigger = (bool)((origialYScale / newYScale) < 0.001);

  if (isXLess || isXBigger || isYLess || isYBigger) sender.ZoomOut(sender.GraphPane);
        }
}

Руслан 25.07.2011 - 09:56

масштабирование перемещения

Здравствуйте,спасибо за пример.
Хотелось бы еще ограничить драг графика подобным образом, чтобы не видеть бесконечные просторы ZedGraph'а. Подскажите, какой метод отвечает за перемещение графика зажатием колеса мыши и как решить проблему? Пытался разобраться с zedGraphControl1.ScrollEvent, не очень вышло


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