Profile Picture

Extract nearest X,Y data from line series during mouseover event

Posted By Michael Rovak 8 Years Ago

Extract nearest X,Y data from line series during mouseover event

Author
Message
Michael Rovak
Question Posted 8 Years Ago
View Quick Profile
Forum Newbie

Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)Forum Newbie (0 reputation)

Group: Forum Members
Last Active: 8 Years Ago
Posts: 2, Visits: 2
I'm doing an evaluation of this product. I'm using VS2015, C#, winforms.
I'd like to know how to extract X,Y data from a line series chart at the nearest data point to where I mouse over the plotted line in the chart.

Thanks.


Nevron Support
Posted 8 Years Ago
View Quick Profile
Supreme Being

Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)Supreme Being (4,329 reputation)

Group: Forum Members
Last Active: Last Year
Posts: 3,039, Visits: 3,746
Hi Michael,

The following code snippet shows how to get the data point which is closest to the current mouse position and highlight it dynamically:

using System;
using System.Drawing;
using System.Windows.Forms;
using Nevron.Chart;
using Nevron.GraphicsCore;

namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
   public Form1()
   {
    InitializeComponent();
   }
   /// <summary>
   /// Handles mouse move
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   void nChartControl1_MouseMove(object sender, MouseEventArgs e)
   {
    NChart chart = nChartControl1.Charts[0];
    NXYScatterSeries series = (NXYScatterSeries)chart.Series[0];
    NPointF mousePos = new NPointF(e.X, e.Y);

    // find the data point closest to the mouse
    double minDistance = GetDistanceFromDataPoint(series, 0, mousePos);
    int minDistanceIndex = 0;

    for (int i = 1; i < series.Values.Count; i++)
    {
      double curDistance = GetDistanceFromDataPoint(series, i, mousePos);
      if (curDistance < minDistance)
      {
       minDistance = curDistance;
       minDistanceIndex = i;
      }
    }

    // mark it
    series.MarkerStyles.Clear();

    NMarkerStyle ms = new NMarkerStyle();
    ms.Visible = true;
    ms.FillStyle = new NColorFillStyle(Color.Red);
    series.MarkerStyles[minDistanceIndex] = ms;

    nChartControl1.Refresh();
   }
   /// <summary>
   /// Gets the distance between a data point and the mouse
   /// </summary>
   /// <param name="series"></param>
   /// <param name="dataPointIndex"></param>
   /// <param name="mousePosition"></param>
   /// <returns></returns>
   private static double GetDistanceFromDataPoint(NXYScatterSeries series, int dataPointIndex, NPointF mousePosition)
   {
    NScale2DToViewTransformation view2Scale = new NScale2DToViewTransformation(series.Chart, (int)StandardAxis.PrimaryX, (int)StandardAxis.PrimaryY);

    NPointF dataPointPosition = new NPointF();
    view2Scale.Transform(new NVector2DD(series.UseXValues ? (double)series.XValues[dataPointIndex] : dataPointIndex, (double)series.Values[dataPointIndex]), ref dataPointPosition);

    double dx = mousePosition.X - dataPointPosition.X;
    double dy = mousePosition.Y - dataPointPosition.Y;

    return Math.Sqrt(dx * dx + dy * dy);
   }

   private void Form1_Load(object sender, EventArgs e)
   {
    NChart chart = nChartControl1.Charts[0];

    // create a dymmy line series
    NLineSeries line = new NLineSeries();

    line.DataLabelStyle.Visible = false;

    chart.Series.Add(line);

    Random rand = new Random();

    for (int i = 0; i < 20; i++)
    {
      line.Values.Add(rand.Next(100));
    }

    nChartControl1.MouseMove += new MouseEventHandler(nChartControl1_MouseMove);
   }
  }
}

Hope this helps - let us know if you meet any problems or have any questions.

Best Regards,
Nevron Support Team





Similar Topics


Reading This Topic