Page 1 of 1

CursorTool intersection with multiple series

Posted: Wed Feb 25, 2009 5:58 am
by 13051032
I have a chart that displays one or more fastline series. I also have a MarksTip tool and cursorTool attached to this chart. Now, i can move the vertical cursor and when mouse is on the series display, it shows the series values in tooltip.

I like to merge both the functionalities. When the cursor tool moves from point A to point B, i like to display the point values (the info. on the markstip tool's tooltip) as a note to the user such that if there are multiple series displayed, the note will list the series and the cursortool's intersecting point with each of the series. (Very similar to Interpolating line series demo shown in the TeeChart Demo app, but it is not the interpolation i am interested, but in actual point itself as the data is too close to worry about inerpolation).

Please suggest on how i can do it?

Thanks.

Posted: Wed Feb 25, 2009 12:08 pm
by yeray
Hi asupriya,

To customize your text box to show I recommend you to use an annotation tool instead of mark tips tool.

Here there is an example of how you could show some info of the nearest point when the cursor tool is moved. If I understand well, you are trying to do something similar to this.

Code: Select all

        public Form1()
        {
            InitializeComponent();

            InitializeChart();
        }

        Steema.TeeChart.Tools.CursorTool cursor1;
        Steema.TeeChart.Tools.NearestPoint nearestPoint1;
        Steema.TeeChart.Tools.Annotation annotation1;

        private void InitializeChart()
        {
            chartController1.Chart = tChart1;
            tChart1.Aspect.View3D = false;

            cursor1 = new Steema.TeeChart.Tools.CursorTool(tChart1.Chart);
            nearestPoint1 = new Steema.TeeChart.Tools.NearestPoint(tChart1.Chart);
            annotation1 = new Steema.TeeChart.Tools.Annotation(tChart1.Chart);

            Random rnd = new Random();
            double yval;

            for (int i = 0; i < 10; i++)
            {
                new Steema.TeeChart.Styles.Points(tChart1.Chart);

                for (int j = 0; j < 50; j++)
                {
                    yval = rnd.NextDouble()*1000;
                    tChart1[i].Add(yval,yval.ToString());
                }
                
            }

            cursor1.Change += new Steema.TeeChart.Tools.CursorChangeEventHandler(cursor1_Change);
        }

        void cursor1_Change(object sender, Steema.TeeChart.Tools.CursorChangeEventArgs e)
        {
            int[] NearestPoints;
            int SeriesIndex, ValueIndex;
            double Dist, tmp;
            Point P1, P2;

            NearestPoints = new int[tChart1.Series.Count];
            P1 = new Point(0, 0);
            P2 = new Point(tChart1.Width, tChart1.Height);
            SeriesIndex = 0;
            ValueIndex = 0;

            for (int i = 0; i < NearestPoints.Length; i++)
            {
                nearestPoint1.Series = tChart1[i];
                NearestPoints[i] = nearestPoint1.GetNearestPoint(new Point(e.x, e.y));
            }

            nearestPoint1.Series = null;

            Dist = Distance(P1, P2);

            for (int i = 0; i < NearestPoints.Length; i++)
            {
                P1.X = tChart1[i].CalcXPos(NearestPoints[i]);
                P1.Y = tChart1[i].CalcYPos(NearestPoints[i]);
                P2.X = e.x;
                P2.Y = e.y;
                tmp = Distance(P1, P2);

                if ((i == 0) || (tmp < Dist))
                {
                    Dist = tmp;
                    SeriesIndex = i;
                    ValueIndex = NearestPoints[i];
                }
            }

            annotation1.Text = "Series: " + SeriesIndex + " - ValueIndex: " + ValueIndex + " - Label: " + tChart1[SeriesIndex].Labels[ValueIndex];
            annotation1.Left = e.x + 5;
            annotation1.Top = e.y - 25;
        }

        private double Distance(Point Pt1, Point Pt2)
        {
            int dx, dy;

            dx = Pt1.X - Pt2.X;
            dy = Pt1.Y - Pt2.Y;

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

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 1:18 am
by 6923298
Hi Yeray,

I tried the code you suggested but I got an error "Steema.TeeChart.Tools.NearestPoint' does not contain a definition for 'GetNearestPoint'" for the following part:

Code: Select all

NearestPoints[i] = nearestPoint1.GetNearestPoint(new Point(e.x, e.y));
Please advise, thanks.

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 4:30 am
by 13051032
I finally got some time to try the nearest point idea you gave; but the values of Y-axis obtained from the nearest value are not correct (even by visual inspection of chart). Please see the following code.

Please suggest a way that can provide exact values of cursorTool intersecting points with multiple series

Thanks

Code: Select all

Imports Steema.TeeChart.Styles
Public Class Form1
    Private WithEvents tchart1 As New Steema.TeeChart.TChart
    Private subChartTool1 As Steema.TeeChart.Tools.SubChartTool
    Private WithEvents cursorTool1 As Steema.TeeChart.Tools.CursorTool
    Dim line1 As Steema.TeeChart.Styles.FastLine
    Dim line2 As Steema.TeeChart.Styles.FastLine
    Dim line3 As Steema.TeeChart.Styles.FastLine

    Dim np1 As Steema.TeeChart.Tools.NearestPoint
    Dim xval As Double

    Dim startTime As System.DateTime = New System.DateTime(1970, 1, 1, 0, 0, 0, 0)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            Dim rand As New Random
            np1 = New Steema.TeeChart.Tools.NearestPoint(tchart1.Chart)

            Controls.Add(tchart1)
            tchart1.Dock = DockStyle.Fill

            tchart1.Aspect.View3D = False
            tchart1.Legend.Visible = False
            line1 = New Steema.TeeChart.Styles.FastLine()
            line2 = New Steema.TeeChart.Styles.FastLine()
            line3 = New Steema.TeeChart.Styles.FastLine()

            line1.Color = Color.Blue
            line2.Color = Color.Green
            line3.Color = Color.Red

            line1.FillSampleValues(200)
            line2.FillSampleValues(200)
            line3.FillSampleValues(200)

            cursorTool1 = New Steema.TeeChart.Tools.CursorTool()
            AddHandler cursorTool1.Change, AddressOf cursorTool1_Change

            cursorTool1.FollowMouse = True
            cursorTool1.Style = Steema.TeeChart.Tools.CursorToolStyles.Vertical

            tchart1.Legend.Visible = True
            tchart1.Series.Add(line1)
            tchart1.Series.Add(line2)
            tchart1.Series.Add(line3)
            tchart1.Tools.Add(cursorTool1)
        Catch ex As Exception

        End Try
        
    End Sub
    Private Sub cursorTool1_Change(ByVal sender As Object, ByVal e As Steema.TeeChart.Tools.CursorChangeEventArgs)
        Try
            xval = e.XValue
            tchart1.Header.Text = ""
            Dim p1, p2 As Point
            p1 = New Point(0, 0)
            p2 = New Point(tchart1.Width, tchart1.Height)
            Dim NearestPoints As Integer()
            ReDim NearestPoints(tchart1.Series.Count - 1)

            For i As Integer = 0 To tchart1.Series.Count - 1
                If TypeOf tchart1.Series(i) Is Steema.TeeChart.Styles.FastLine Then
                    np1.Series = tchart1.Series(i)
                    NearestPoints(i) = np1.GetNearestPoint(New Point(e.x, e.y))
                End If
            Next
            'np1.Series = Nothing

            For i As Integer = 0 To tchart1.Series.Count - 1
                If TypeOf tchart1.Series(i) Is Steema.TeeChart.Styles.FastLine Then
                    tchart1.Header.Text += tchart1.Series(i).Title + ": Y(" + e.XValue.ToString("0.00") + ")= "
                    tchart1.Header.Text += tchart1.Series(i).YValues(NearestPoints(i)).ToString("0.00")
                End If
            Next
            'Exit Sub
        Catch ex As InvalidOperationException
            MsgBox(ex.Message)
        End Try

    End Sub
End Class

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 9:53 am
by yeray
Hi pw,
pw wrote:Hi Yeray,

I tried the code you suggested but I got an error "Steema.TeeChart.Tools.NearestPoint' does not contain a definition for 'GetNearestPoint'" for the following part:

Code: Select all

NearestPoints[i] = nearestPoint1.GetNearestPoint(new Point(e.x, e.y));
Please advise, thanks.
Could you please tell us what TeeChart version are you using?

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 10:56 am
by yeray
Hi asupriya,

If I understood well you are trying to do the same that is done in the interpolation example but changing the points that are drawn for annotations. Take a look at this example:

Code: Select all

public Form1()
        {
            InitializeComponent();

            InitializeChart();
        }

        Steema.TeeChart.Tools.CursorTool cursor1;

        private double InterpolateLineSeries(Custom series, int firstindex, int lastindex, double xvalue)
        {
            int index;
            for (index = firstindex; index <= lastindex; index++)
            {
                if (index == -1 || series.XValues.Value[index] > xvalue) break;
            }
            // safeguard
            if (index < 1) index = 1;
            else if (index >= series.Count) index = series.Count - 1;
            // y=(y2-y1)/(x2-x1)*(x-x1)+y1
            double dx = series.XValues[index] - series.XValues[index - 1];
            double dy = series.YValues[index] - series.YValues[index - 1];
            if (dx != 0.0) return dy * (xvalue - series.XValues[index - 1]) / dx + series.YValues[index - 1];
            else return 0.0;
        }

        private double InterpolateLineSeries(Custom series, double xvalue)
        {
            return InterpolateLineSeries(series, series.FirstVisibleIndex, series.LastVisibleIndex, xvalue);
        }


        private void InitializeChart()
        {
            chartController1.Chart = tChart1;
            tChart1.Aspect.View3D = false;

            for (int i = 0; i < 3; i++)
            {
                new Steema.TeeChart.Styles.Line(tChart1.Chart);
                tChart1[i].FillSampleValues(50);

                new Steema.TeeChart.Tools.Annotation(tChart1.Chart);
            }

            cursor1 = new Steema.TeeChart.Tools.CursorTool(tChart1.Chart);

            cursor1.Change += new Steema.TeeChart.Tools.CursorChangeEventHandler(cursor1_Change);
        }

        void cursor1_Change(object sender, Steema.TeeChart.Tools.CursorChangeEventArgs e)
        {
            int ys;
            double YValue;
            int xs = tChart1.Axes.Bottom.CalcXPosValue(e.XValue);

            for (int i = 0; i < tChart1.Series.Count; i++)
                if (tChart1.Series[i] is Custom)
                {
                    YValue = InterpolateLineSeries(tChart1.Series[i] as Steema.TeeChart.Styles.Custom, e.XValue);
                    ys = tChart1.Series[i].GetVertAxis.CalcYPosValue(YValue);
                    ((Steema.TeeChart.Tools.Annotation)tChart1.Tools[i]).Left = xs;
                    ((Steema.TeeChart.Tools.Annotation)tChart1.Tools[i]).Top = ys;
                    ((Steema.TeeChart.Tools.Annotation)tChart1.Tools[i]).Text = tChart1.Series[i].Title + ": Y(" + e.XValue.ToString("0.00") + ")= ";
                    ((Steema.TeeChart.Tools.Annotation)tChart1.Tools[i]).Text += YValue.ToString("0.00") + "\r\n";
                }

        }

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 1:53 pm
by 13051032
This is exactly what I needed. Thanks alot.

Re: CursorTool intersection with multiple series

Posted: Wed Aug 05, 2009 9:54 pm
by 6923298
Yeray wrote:Hi pw,
Could you please tell us what TeeChart version are you using?
Hi Yeray,

I'm using version 3.5.3187.15584. I assume that I should update to a newer version?

Re: CursorTool intersection with multiple series

Posted: Thu Aug 06, 2009 11:04 am
by 10050769
Hello pw,

I'm using version 3.5.3187.15584. I assume that I should update to a newer version?
Yes, Please update version with last version if 30 Jul 2009 and check that in this version your application works fine.

Thanks,