TeeChart 系列双击时 LineSeries XY 值和光标值之间的差异
TeeChart Different between LineSeries XY value and Cursor value on Series Double Click
我使用的是 Delphi 10.1 附带的基本 TeeChart 版本。
双击 LineSeries 切换该系列的点和标记。
我还提供了光标值。
但是,两者之间有一个转变,它们并不完全相同。
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;
如何解决?
这不可能解决。当您从实数值 space 映射到整数屏幕 space 并再次返回时,信息会丢失。
CalcPosPoint
采用整数屏幕坐标并将其映射到实数值轴 space。另一方面 XValue[]
和 YValue[]
return 原始数据。
图表代码以 XValue[]
和 YValue[]
中的实际值开头。这些被映射到整数值。在转换为实轴值之后,该映射必然四舍五入为最接近的整数。那时信息丢失,无法检索。
作为一个思想实验,考虑两个非常接近的真实 X 值。为了便于讨论,我们假设 XValue[0] = 0.0
和 XValue[1] = 1e-6
。 X 轴的范围从 0
到 1
比方说。现在,在这种情况下,屏幕上需要 1e6
个像素,以便这两个点在映射到屏幕上时具有不同的整数坐标。您的屏幕没有那么多像素,因此这两个具有不同实际 X 值的点映射到屏幕上相同的 X 坐标。
希望这个例子能说明你试图做的事情是不可能的。也许你能做到的最好的是搜索 XValue[]
和 YValue[]
中的原始坐标以找到接近 (tmpX1, tmpY1)
的值,并报告那些最接近的原始坐标值。
我使用的是 Delphi 10.1 附带的基本 TeeChart 版本。 双击 LineSeries 切换该系列的点和标记。 我还提供了光标值。 但是,两者之间有一个转变,它们并不完全相同。
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;
如何解决?
这不可能解决。当您从实数值 space 映射到整数屏幕 space 并再次返回时,信息会丢失。
CalcPosPoint
采用整数屏幕坐标并将其映射到实数值轴 space。另一方面 XValue[]
和 YValue[]
return 原始数据。
图表代码以 XValue[]
和 YValue[]
中的实际值开头。这些被映射到整数值。在转换为实轴值之后,该映射必然四舍五入为最接近的整数。那时信息丢失,无法检索。
作为一个思想实验,考虑两个非常接近的真实 X 值。为了便于讨论,我们假设 XValue[0] = 0.0
和 XValue[1] = 1e-6
。 X 轴的范围从 0
到 1
比方说。现在,在这种情况下,屏幕上需要 1e6
个像素,以便这两个点在映射到屏幕上时具有不同的整数坐标。您的屏幕没有那么多像素,因此这两个具有不同实际 X 值的点映射到屏幕上相同的 X 坐标。
希望这个例子能说明你试图做的事情是不可能的。也许你能做到的最好的是搜索 XValue[]
和 YValue[]
中的原始坐标以找到接近 (tmpX1, tmpY1)
的值,并报告那些最接近的原始坐标值。