TAChart: Fix issues in TIntervalList due to Epsilon being considered to be an absolute number. Issue #35250.

git-svn-id: trunk@60737 -
This commit is contained in:
wp 2019-03-20 15:56:33 +00:00
parent ac2f063963
commit 113bfca313

View File

@ -122,6 +122,8 @@ type
TIntervalList = class
private
FEpsilon: Double;
FEpsilonScale: Double;
FAbsoluteEpsilon: Double;
FIntervals: array of TDoubleInterval;
FOnChange: TNotifyEvent;
procedure Changed;
@ -731,6 +733,11 @@ begin
FIntervals[k] := FIntervals[k - 1];
end;
FIntervals[i] := DoubleInterval(AStart, AEnd);
if (abs(FIntervals[i].FStart) <> Infinity) and (abs(FIntervals[i].FStart) > FEpsilonScale) then
FEpsilonScale := abs(FIntervals[i].FStart);
if (abs(FIntervals[i].FEnd) <> Infinity) and (abs(FIntervals[i].FEnd) > FEpsilonScale) then
FEpsilonScale := abs(FIntervals[i].FEnd);
FAbsoluteEpsilon := IfThen(FEpsilonScale = 0, FEpsilon, FEpsilon * FEpsilonScale);
Changed;
end;
@ -755,6 +762,7 @@ end;
constructor TIntervalList.Create;
begin
FEpsilon := DEFAULT_EPSILON;
FEpsilonScale := 0.0
end;
function TIntervalList.GetInterval(AIndex: Integer): TDoubleInterval;
@ -776,11 +784,11 @@ begin
if Length(FIntervals) = 0 then exit;
AHint := EnsureRange(AHint, 0, High(FIntervals));
while (AHint > 0) and (FIntervals[AHint].FStart > ARight) do
while (AHint > 0) and (FIntervals[AHint].FStart - FAbsoluteEpsilon > ARight) do
Dec(AHint);
while
(AHint <= High(FIntervals)) and (FIntervals[AHint].FStart <= ARight)
(AHint <= High(FIntervals)) and (FIntervals[AHint].FStart - FAbsoluteEpsilon <= ARight)
do begin
if FIntervals[AHint].FEnd >= ALeft then begin
if not Result then fi := AHint;
@ -791,8 +799,8 @@ begin
end;
if Result then begin
ALeft := FIntervals[fi].FStart - Epsilon;
ARight := FIntervals[li].FEnd + Epsilon;
ALeft := FIntervals[fi].FStart - FAbsoluteEpsilon;
ARight := FIntervals[li].FEnd + FAbsoluteEpsilon;
end;
end;
@ -802,6 +810,10 @@ begin
if AValue <= 0 then
raise EChartIntervalError.Create('Epsilon <= 0');
FEpsilon := AValue;
if FEpsilonScale = 0 then
FAbsoluteEpsilon := FEpsilon
else
FAbsoluteEpsilon := FEpsilon * FEpsilonScale;
Changed;
end;