teechart 获取曲线交点的方法

问题:

在如下图的红色曲线中,如何获得当y为一确定值(如-3)时相应的x的值(可能为多个)?

image

解答:

方法有两个

1.teechart标准版可实现

当y=-3时,取x的第一个值和最后一个值,计算两个点的屏幕坐标值

用CalcXPosValue,根据x值计算出屏幕坐标的值,由于在坐标轴上,可如下:

x0:=chart1.BottomAxis.CalcXPosValue(ASeries.XValue[0])

同样:

xn:=BottomAxis.CalcXPosValue(ASeries.XValues.MaxValue)
计算y的对应屏幕坐标值,
y0:=LeftAxis.CalcYPosValue(-3)
然后,根据x的屏幕坐标值,循环,如果(x,y)在曲线上,就是一个交点了。
判断屏幕坐标值(x,y)是否在一个Series上的方法:
if ASeries.Clicked(x, y) <> -1 then //在曲线上
begin
px := ASeries.GetHorizAxis.CalcPosPoint(x); //根据屏幕坐标,计算x,y的实际值
py := ASeries.GetVertAxis.CalcPosPoint(y); ListBox1.Items.Add(FloatToStr(px) + ',' + FloatToStr(py));//保存 end;

最后,listbox1里面保存的就是交点坐标了。

优点:Delphi自带的tchart就可以实现了;

缺点:可能会有重复的点,就是说,一个交点,可能因为用了两个像素描绘,导致了获取两次。一个可能的结果如下:

image 其实,本来就2个点,可结果是4个,并且两个点距离相当近,这样,对结果就要进行一定的处理了。

2.利用teechart pro的Functions功能

假设目标曲线是series1,建立一个y=-3的series2,再建立一个function曲线series3,函数为cross points

具体做法:

在series1数据添加完成后,根据series1的x值,添加y=-3的值到series2

  Series2.Clear;
  tmpDbl := Series1.YValues.MaxValue-3;
  for j := 0 to Series1.XValues.Count - 1 do
  begin
    Series2.AddXY(ALineSeries.XValues[j],-3);
  end;

设定Series3的参数

  Series3.SetFunction(TeeFunction1);
  Series3.DataSources.Clear;
  Series3.DataSources.Add(Series2);
  Series3.DataSources.Add(Series4);
  Series3.CheckDataSource;//获取数据

TeeFunction1为一个cross Points的Teefunctions,可在charteditor中设定,或者这里直接Create。

数据源设置为取交点的两个series。

 

这样,series3中,就保存了两个的交点了。不需要在另外处理。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据