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,