Delphi T系列XY值和系列双击时光标值之间的差异

Delphi T系列XY值和系列双击时光标值之间的差异,delphi,teechart,Delphi,Teechart,我使用的是Delphi10.1附带的基本TeeChart版本。 双击线系列可切换该系列的点和标记。 我还将显示光标值。 然而,两者之间有一个转变,它们并不相同 procedure TfrmMain.SeriesDblClick(Sender: TChartSeries; ValueIndex: Integer; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var tmpX1,tmpY1,tmpX2,tmpY2:Dou

我使用的是Delphi10.1附带的基本TeeChart版本。 双击线系列可切换该系列的点和标记。 我还将显示光标值。 然而,两者之间有一个转变,它们并不相同

procedure TfrmMain.SeriesDblClick(Sender: TChartSeries; ValueIndex: Integer;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  tmpX1,tmpY1,tmpX2,tmpY2:Double;
begin
  // First values
  tmpX1:=Chart.Axes.Bottom.CalcPosPoint(X);
  tmpY1:=Chart.Axes.Left.CalcPosPoint(Y);

  // The prevous values are not identical to:
  tmpX2:=(Sender as tLineSeries).XValue[ValueIndex];
  tmpY2:=(Sender as tLineSeries).YValue[ValueIndex];
end;

如何修复它?

不可能解决这个问题。当您从实值空间映射到整数屏幕空间,然后再映射回来时,信息将丢失

CalcPosPoint
获取整数屏幕坐标并将其映射到实值轴空间。另一方面,
XValue[]
YValue[]
返回原始数据

图表代码以
XValue[]
YValue[]
中的实际值开始。它们被映射到整数值。转换为实轴值后,该映射必然舍入到最接近的整数。此时信息丢失,无法检索

作为一个思维实验,考虑两个非常接近的真实X值。为了便于论证,我们假设
XValue[0]=0.0
XValue[1]=1e-6
。X轴的范围从
0
1
不等。现在,在这个场景中,您需要在屏幕上显示
1e6
像素,以便在映射到屏幕上时这两个点具有不同的整数坐标。您的屏幕没有那么多像素,因此这两个点具有不同的实际X值,映射到屏幕上相同的X坐标


希望这个例子能说明你试图做的事情是不可能的。也许你能做到的最好的方法是在
XValue[]
YValue[]
中搜索原始坐标,找到接近
(tmpX1,tmpY1)
,并报告那些最接近的原始坐标值。

这是不可能解决的。当您从实值空间映射到整数屏幕空间,然后再映射回来时,信息将丢失

CalcPosPoint
获取整数屏幕坐标并将其映射到实值轴空间。另一方面,
XValue[]
YValue[]
返回原始数据

图表代码以
XValue[]
YValue[]
中的实际值开始。它们被映射到整数值。转换为实轴值后,该映射必然舍入到最接近的整数。此时信息丢失,无法检索

作为一个思维实验,考虑两个非常接近的真实X值。为了便于论证,我们假设
XValue[0]=0.0
XValue[1]=1e-6
。X轴的范围从
0
1
不等。现在,在这个场景中,您需要在屏幕上显示
1e6
像素,以便在映射到屏幕上时这两个点具有不同的整数坐标。您的屏幕没有那么多像素,因此这两个点具有不同的实际X值,映射到屏幕上相同的X坐标

希望这个例子能说明你试图做的事情是不可能的。也许您能达到的最佳效果是在
XValue[]
YValue[]
中搜索原始坐标,以找到接近
(tmpX1,tmpY1)
,并报告最接近的原始坐标值