Шпаргалка по ZedGraph. Как узнать координаты точки на кривой, ближайшей к точке клика

Запустив этот пример, вы можете пощелкать по графику, при этом на кривой будут выделяться точки, ближайшие к точке клика.

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

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

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

        DrawGraph ();
    }


    /// <summary>
    /// Обработка события MouseClick - клик по графику
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void zedGraph_MouseClick (object sender, MouseEventArgs e)
    {
        // Сюда будет сохранена кривая, рядом с которой был произведен клик
        CurveItem curve;

        // Сюда будет сохранен номер точки кривой, ближайшей к точке клика
        int index;

        GraphPane pane = zedGraph.GraphPane;

        // Максимальное расстояние от точки клика до кривой в пикселях,
        // при котором еще считается, что клик попал в окрестность кривой.
        GraphPane.Default.NearestTol = 10;

        bool result = pane.FindNearestPoint (e.Location, out curve, out index);

        if (result)
        {
            // Максимально расстояние от точки клика до кривой не превысило NearestTol

            // Добавим точку на график, вблизи которой произошел клик
            PointPairList point = new PointPairList ();

            point.Add (curve[index]);

            // Кривая, состоящая из одной точки. Точка будет отмечена синим кругом
            LineItem curvePount = pane.AddCurve ("",
                new double[] { curve[index].X },
                new double[] { curve[index].Y },
                Color.Blue,
                SymbolType.Circle);

            //
            curvePount.Line.IsVisible = false;

            // Цвет заполнения круга - колубой
            curvePount.Symbol.Fill.Color = Color.Blue;

            // Тип заполнения - сплошная заливка
            curvePount.Symbol.Fill.Type = FillType.Solid;

            // Размер круга
            curvePount.Symbol.Size = 7;
        }
    }


    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);

        // Включим отображение сетки
        pane.XAxis.MajorGrid.IsVisible = true;
        pane.YAxis.MajorGrid.IsVisible = true;

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

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

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

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

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



Андрей 05.06.2012 - 16:31

Тоже самое с DateAsOrdinal

Как сделать то же самое, если ось X типа DateAsOrdinal?
В общем вот код(копипаст отсюда же):
private void SetPoint(STick Tick, Color color)
{

      GraphPane zPane = zedGraph.GraphPane;
      LineItem curvePount = zPane.AddCurve("", 
               new double[] { new XDate(Tick.TickTime) }, 
               new double[] { Tick.AveragePrice }, 
               color,                                                      
               SymbolType.Circle);

      curvePount.Line.IsVisible = false;

      curvePount.Symbol.Fill.Color = color;

      curvePount.Symbol.Fill.Type = FillType.Solid;

      curvePount.Symbol.Size = 7;

}


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