TAChart: Optimize TFuncSeries drawing

git-svn-id: trunk@29093 -
This commit is contained in:
ask 2011-01-18 06:07:26 +00:00
parent 8033e87029
commit 154d4b002a
2 changed files with 20 additions and 7 deletions

View File

@ -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;

View File

@ -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;