mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-17 11:29:27 +02:00
TAChart: Optimize TFuncSeries drawing
git-svn-id: trunk@29093 -
This commit is contained in:
parent
8033e87029
commit
154d4b002a
@ -282,6 +282,7 @@ operator *(const A, B: TPoint): TPoint; inline;
|
||||
operator *(const A, B: TDoublePoint): TDoublePoint; overload; inline;
|
||||
operator /(const A, B: TDoublePoint): TDoublePoint; overload; inline;
|
||||
operator =(const A, B: TMethod): Boolean; overload; inline;
|
||||
operator <= (const A, B: TDoublePoint): Boolean; overload; inline;
|
||||
|
||||
operator :=(const APoint: TPoint): TSize; inline;
|
||||
operator :=(const ASize: TSize): TPoint; inline;
|
||||
@ -898,6 +899,11 @@ begin
|
||||
Result := (A.Code = B.Code) and (A.Data = B.Data);
|
||||
end;
|
||||
|
||||
operator <= (const A, B: TDoublePoint): Boolean;
|
||||
begin
|
||||
Result := (A.X <= B.X) and (A.Y <= B.Y);
|
||||
end;
|
||||
|
||||
operator := (const APoint: TPoint): TSize;
|
||||
begin
|
||||
Result.cx := APoint.X;
|
||||
|
@ -211,7 +211,6 @@ begin
|
||||
end;
|
||||
|
||||
procedure TFuncSeries.Draw(ACanvas: TCanvas);
|
||||
|
||||
type
|
||||
TTransform = function (A: Double): Double of object;
|
||||
TMakeDoublePoint = function (AX, AY: Double): TDoublePoint;
|
||||
@ -221,27 +220,35 @@ var
|
||||
makeDP: TMakeDoublePoint;
|
||||
r: TDoubleRect = (coords:(NegInfinity, NegInfinity, Infinity, Infinity));
|
||||
prev: TDoublePoint;
|
||||
prevInExtent: Boolean;
|
||||
|
||||
function CalcAt(AXg, AXa: Double): TDoublePoint;
|
||||
procedure CalcAt(AXg, AXa: Double; out APt: TDoublePoint; out AIn: Boolean);
|
||||
begin
|
||||
Result := makeDP(AXg, axisToGraphYr(calc(AXa)));
|
||||
APt := makeDP(AXg, axisToGraphYr(calc(AXa)));
|
||||
AIn := (r.a <= APt) and (APt <= r.b);
|
||||
end;
|
||||
|
||||
procedure MoveTo(AXg, AXa: Double);
|
||||
begin
|
||||
prev := CalcAt(AXg, AXa);
|
||||
CalcAt(AXg, AXa, prev, prevInExtent);
|
||||
if prevInExtent then
|
||||
ACanvas.MoveTo(FChart.GraphToImage(prev));
|
||||
end;
|
||||
|
||||
procedure LineTo(AXg, AXa: Double);
|
||||
var
|
||||
p, t: TDoublePoint;
|
||||
inExtent: Boolean;
|
||||
begin
|
||||
t := CalcAt(AXg, AXa);
|
||||
p := t;
|
||||
if LineIntersectsRect(prev, t, r) then begin
|
||||
CalcAt(AXg, AXa, p, inExtent);
|
||||
t := p;
|
||||
if inExtent and prevInExtent then
|
||||
ACanvas.LineTo(FChart.GraphToImage(p))
|
||||
else if LineIntersectsRect(prev, t, r) then begin
|
||||
ACanvas.MoveTo(FChart.GraphToImage(prev));
|
||||
ACanvas.LineTo(FChart.GraphToImage(t));
|
||||
end;
|
||||
prevInExtent := inExtent;
|
||||
prev := p;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user