Das macht man z.B. so, daß man die Grafik mittig in das Canvas.ClipRect (Width, Height) einpasst.
Die Parameter für die GetDrawInfo sind die Abmessungen der Zeichenfläche (Width, Height) sowie ggf. Ränder (MarginX, MarginY) in Pixel.
XMax, XMin, YMax, YMin sind die Eckpunkte des umhüllenden Rechtecks der darzustellenden Figur in Weltkoordinaten.
GetDrawPoint kann dann aus den Weltkoordinaten die Punkte auf dem Canvas zum Zeichnen ermitteln.
Delphi-Quellcode:
TDrawInfo = record
X0, Y0, Scale: double;
Width, Height: integer;
end;
function GetDrawInfo(const XMin, YMin, XMax, YMax: double;
const Width, Height, MarginX, MarginY: integer): TDrawInfo;
var
ScaleX, ScaleY, XM, YM: double;
begin
if (XMax - XMin) <> 0 then
ScaleX := (Width - 2 * MarginX) / (XMax - XMin)
else
ScaleX := 1E8;
if (YMax - YMin) <> 0 then
ScaleY := (Height - 2 * MarginY) / (YMax - YMin)
else
ScaleY := 1E8;
if ScaleX < ScaleY then
Result.Scale := ScaleX // Maßstab;
else
Result.Scale := ScaleY; // Maßstab;
XM := (XMax + XMin) / 2;
YM := (YMax + YMin) / 2;
Result.X0 := Width / 2 - XM * Result.Scale;
Result.Y0 := Height / 2 - YM * Result.Scale;
Result.Width := Width;
Result.Height := Height;
end;
function GetDrawPoint(const X, Y: double; const DrawInfo: TDrawInfo): TPoint;
begin
Result.X := Round(DrawInfo.X0 + X * DrawInfo.Scale);
Result.Y := Round(DrawInfo.Y0 + Y * DrawInfo.Scale);
// Falls Viewport unten/links;
// Result.Y := DrawInfo.Height - Round(DrawInfo.Y0 + Y * DrawInfo.Scale);
end;