mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 18:39:10 +02:00
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:
parent
ac2f063963
commit
113bfca313
@ -122,6 +122,8 @@ type
|
|||||||
TIntervalList = class
|
TIntervalList = class
|
||||||
private
|
private
|
||||||
FEpsilon: Double;
|
FEpsilon: Double;
|
||||||
|
FEpsilonScale: Double;
|
||||||
|
FAbsoluteEpsilon: Double;
|
||||||
FIntervals: array of TDoubleInterval;
|
FIntervals: array of TDoubleInterval;
|
||||||
FOnChange: TNotifyEvent;
|
FOnChange: TNotifyEvent;
|
||||||
procedure Changed;
|
procedure Changed;
|
||||||
@ -731,6 +733,11 @@ begin
|
|||||||
FIntervals[k] := FIntervals[k - 1];
|
FIntervals[k] := FIntervals[k - 1];
|
||||||
end;
|
end;
|
||||||
FIntervals[i] := DoubleInterval(AStart, AEnd);
|
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;
|
Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -755,6 +762,7 @@ end;
|
|||||||
constructor TIntervalList.Create;
|
constructor TIntervalList.Create;
|
||||||
begin
|
begin
|
||||||
FEpsilon := DEFAULT_EPSILON;
|
FEpsilon := DEFAULT_EPSILON;
|
||||||
|
FEpsilonScale := 0.0
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TIntervalList.GetInterval(AIndex: Integer): TDoubleInterval;
|
function TIntervalList.GetInterval(AIndex: Integer): TDoubleInterval;
|
||||||
@ -776,11 +784,11 @@ begin
|
|||||||
if Length(FIntervals) = 0 then exit;
|
if Length(FIntervals) = 0 then exit;
|
||||||
|
|
||||||
AHint := EnsureRange(AHint, 0, High(FIntervals));
|
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);
|
Dec(AHint);
|
||||||
|
|
||||||
while
|
while
|
||||||
(AHint <= High(FIntervals)) and (FIntervals[AHint].FStart <= ARight)
|
(AHint <= High(FIntervals)) and (FIntervals[AHint].FStart - FAbsoluteEpsilon <= ARight)
|
||||||
do begin
|
do begin
|
||||||
if FIntervals[AHint].FEnd >= ALeft then begin
|
if FIntervals[AHint].FEnd >= ALeft then begin
|
||||||
if not Result then fi := AHint;
|
if not Result then fi := AHint;
|
||||||
@ -791,8 +799,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
if Result then begin
|
if Result then begin
|
||||||
ALeft := FIntervals[fi].FStart - Epsilon;
|
ALeft := FIntervals[fi].FStart - FAbsoluteEpsilon;
|
||||||
ARight := FIntervals[li].FEnd + Epsilon;
|
ARight := FIntervals[li].FEnd + FAbsoluteEpsilon;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -802,6 +810,10 @@ begin
|
|||||||
if AValue <= 0 then
|
if AValue <= 0 then
|
||||||
raise EChartIntervalError.Create('Epsilon <= 0');
|
raise EChartIntervalError.Create('Epsilon <= 0');
|
||||||
FEpsilon := AValue;
|
FEpsilon := AValue;
|
||||||
|
if FEpsilonScale = 0 then
|
||||||
|
FAbsoluteEpsilon := FEpsilon
|
||||||
|
else
|
||||||
|
FAbsoluteEpsilon := FEpsilon * FEpsilonScale;
|
||||||
Changed;
|
Changed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user