TAChart: Fix TChart.IsPointInViewPort to allow for floating point round-off errors (issue #34961).

git-svn-id: trunk@60235 -
This commit is contained in:
wp 2019-01-28 08:59:55 +00:00
parent 7ede3bf313
commit 7a10cc1e56
2 changed files with 10 additions and 1 deletions

View File

@ -1306,7 +1306,8 @@ function TChart.IsPointInViewPort(const AP: TDoublePoint): Boolean;
begin
Result :=
not IsNan(AP) and
InRange(AP.X, XGraphMin, XGraphMax) and InRange(AP.Y, YGraphMin, YGraphMax);
SafeInRangeWithBounds(AP.X, XGraphMin, XGraphMax) and
SafeInRangeWithBounds(AP.Y, YGraphMin, YGraphMax);
end;
procedure TChart.KeyDownAfterInterface(var AKey: Word; AShift: TShiftState);

View File

@ -28,6 +28,7 @@ function InRangeUlps(AX, ALo, AHi: Double; AMaxUlps: Word): Boolean;
function SafeInfinity: Double; inline;
function SafeInRange(AValue, ABound1, ABound2: Double): Boolean;
function SafeInRangeWithBounds(AValue, ABound1, ABound2: Double): Boolean;
function SafeMin(A, B: Double): Double;
function SafeNan: Double; inline;
function SafeEqual(A, B: Double): Boolean;
@ -159,6 +160,13 @@ begin
Result := InRange(AValue, ABound1, ABound2);
end;
function SafeInRangeWithBounds(AValue, ABound1, ABound2: Double): Boolean;
begin
EnsureOrder(ABound1, ABound2);
Result := InRange(AValue, ABound1, ABound2) or
SameValue(AValue, ABound1) or SameValue(AValue, ABound2);
end;
function SafeMin(A, B: Double): Double;
begin
if IsNan(A) then