お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"Canvasに実数座標で描画"





(*
 数学関数で描画したい時や、TChartを使う程でもない
単純なグラフの描画なんかに.
*)
 
type
  TRcRect=record
    Left, Top, Right, Bottom: Double;
  end;
 
  TRcPoint=record
    X, Y: Double;
  end;
 
  TRealCoord = class
    Canvas: TCanvas;                          { 出力先 Canvas }
    World: TRcRect;                           { 実座標 表示範囲 }
    View: TRect;                              { 画面 表示範囲 }
    RatioX, RatioY: Double;                   { 換算比 }
    constructor Create(Dest: TCanvas);
    procedure ReCalc;
    function Vx(const x: Double): integer;    { X座標 変換 }
    function Vy(const y: Double): integer;    { Y座標 変換 }
    function Wp(const pt: TPoint): TRcPoint;  { 画面->実座標 変換 }
  end;
 
{ 以下 implementation }
 
constructor TRealCoord.Create(Dest: TCanvas);
begin
  Canvas:=Dest;
  with World do  begin
    Left:=0.0;   Top:=0.0;    Right:=105.0;    Bottom:=105.0;
  end;
  View:=Rect(0, 0, 105, 105);
  RatioX:=1.0;
  RatioY:=1.0;
end;
 
procedure TRealCoord.ReCalc;
begin
  RatioX := (View.Right-View.Left) / (World.Right-World.Left);
  RatioY := (View.Bottom-View.Top) / (World.Bottom-World.Top);
end;
 
function TRealCoord.vx(const x: Double): integer;
begin
  Result:=round( (x - World.Left)*RatioX );
end;
 
function TRealCoord.vy(const y: Double): integer;
begin
  Result:=round( (World.Bottom - y)*RatioY );
end;
 
function TRealCoord.wp(const pt: TPoint): TRcPoint;
begin
  Result.X:=pt.X / RatioX + World.Left;
  Result.Y:=World.Bottom - pt.Y / RatioY;
end;
 
 
{ ---------- 使用例 ---------- }
{ PaintBox上に折れ線を描きます }
 
type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    rc: TRealCoord;
  end;
 
{ 以下 implementation }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  rc:=TRealCoord.Create(PaintBox1.Canvas);
  with rc.World do  begin
    Left:=0; Top:=0; Right:=10000; Bottom:=4000;
  end;
end;
 
procedure TForm1.PaintBox1Paint(Sender: TObject);
var i: integer;
begin
  rc.View:=Rect(0, 0, PaintBox1.ClientWidth, PaintBox1.ClientHeight);
  rc.ReCalc;
  rc.Canvas.MoveTo(0,0);
  for i:=0 to 500 do  begin
    rc.Canvas.LineTo(rc.Vx(i*20), rc.Vy(random(3000)+i*2));
  end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  PaintBox1.Refresh;
end;
 
 
                                                YH

Original document by YH              氏 ID:(BYI15567)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum