Пример 3. Построение графика функции на канве. Преобразование координат

 

В данном примере представлено приложение, в котором осуществляется построение графика функции на канве формы.

 

В данном приложении область построения кривых ограничивается прямоугольником. Выбраны следующие пределы: по оси Oy от -4 до 4, по оси Ox от -8 до 8, это математическая система координат, определяемая пользователем.

Построение кривых и точек происходит в экранной системе координат, в которой за единицу измерения принят один пиксель, начало координат находится в верхнем левом углу, ось Ox направлена с лева на право, а ось Oy – с верху вниз.

 

Для перехода из пользовательской системы координат в экранную используются следующие формулы:

 

 

Где

 

Вид приложения во время его выполнения

 

 

Текст файла Unit1.pas

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs;

 

type

  TForm1 = class(TForm)

    procedure FormPaint(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  X,Y: real;       //  математические координаты

  PX,PY: longint;  //  координаты пикселей

  nx,ny: longint;  //  количество делений по осям X и Y

  vx,vy: real;     //  координаты делений на осях X И Y

  sx : real = 1.0; //  шаг разметки оси X

  sy : real = 0.5; //  шаг разметки оси Y

 

const

  xmin=-6;xmax=6;         // пользовательская СК

  ymin=-3;ymax=3;         // пользовательская СК

  xwmin=30; ywmin=20;     // рамка

  xwmax=630; ywmax=320;   // рамка

 

implementation

 

{$R *.dfm}

 

function convertX(x:real):integer;

begin

  convertX:=Round(xwmin+(xwmax-xwmin)*((x-xmin)/(xmax-xmin)));

end;

 

function convertY(y:real):integer;

begin

  convertY:=Round(ywmax-(ywmax-ywmin)*((y-ymin)/(ymax-ymin)));

end;

 

procedure TForm1.FormPaint(Sender: TObject);

var

  i: integer;

begin

   Color := clInfoBk;

   Canvas.Pen.Color:= 0;

   Canvas.Rectangle(xwmin,ywmin,xwmax+1,ywmax+1);   // рамка

   Canvas.MoveTo(convertX(0), ywmin );  // оси

   Canvas.LineTo(convertX(0), ywmax );

   Canvas.MoveTo(xwmin, convertY(0));

   Canvas.LineTo(xwmax, convertY(0));

 

   Canvas.Pen.Color:= clBlue;

   X:=xmin; {Y:= tn(X)/cos(X);} Y:=sin(X);

   PX:= convertX(X);

   PY:= convertY(Y);

   Canvas.MoveTo(PX,PY);

   while X<=xmax do begin

     Y:=sin(X);

     PX:= convertX(X);

     PY:= convertY(Y);

     Canvas.LineTo(PX,PY);

     X:=X+(xmax-xmin)/200;

   end;

   Canvas.Pen.Color:= clRed;

   X:=xmin;Y:=2.5*sin(X);

   PX:= convertX(X);

   PY:= convertY(Y);

   Canvas.MoveTo(PX,PY);

   while X<=xmax do begin

     Y:=2.5*sin(X);

     PX:= convertX(X);

     PY:= convertY(Y);

     Canvas.LineTo(PX,PY);

     X:=X+(xmax-xmin)/200;

   end;

 

   Y:=0;

   X:=0;

   Canvas.Brush.Style:=bsClear;

   Canvas.Pen.Color:= clGreen;

   Canvas.Ellipse(convertX(X-2), convertY(Y-2), convertX(X+2), convertY(Y+2));

 

   Canvas.Pen.Color:= 0;

   nx:= trunc((xmax-xmin)/sx)+1;

   for i:=1 to nx do begin

     vx:=xmin+sx*(i-1);

     Canvas.MoveTo( convertX(vx),ywmax);

     Canvas.LineTo( convertX(vx),ywmax+6);

     Canvas.TextOut(convertX(vx)-8, ywmax+8,floatToStrF(vx,fffixed,1,1));

   end;

   ny:= trunc((ymax-ymin)/sy)+1;

   For i:=1 to ny do begin

     vy:=ymin+sy*(i-1);

     Canvas.MoveTo(xwmin,convertY(vy));

     Canvas.LineTo(xwmin-6,convertY(vy));

     Canvas.TextOut(xwmin-25, convertY(vy)-6,floatToStrF(vy,fffixed,1,1));

   end;

 

end;

 

end.