Среда программирования:
Lazarus 1.0.14 win 64
Статья по теме:
Программа, осуществляющая операции масштабирования, поворота и смещения произвольной фигуры и отрисовку ее в экранной области.
В Lazarus`е создаем форму, на которую добавляем следующие объекты: область для рисования, текстовые поля, в которые будут вводиться коэффициент масштабирования, угол поворота и координаты смещения данной фигуры, и кнопки, по нажатию которых будут соответственно выполняться требуемые операции.
И функции:
Init(), куда будут передаваться координаты всех вершин фигуры;
Draw(), отвечающая за отрисовку изображения.
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Init(); procedure Draw(); private { private declarations } public { public declarations } end; var Form1: TForm1; x,y : array [0..100] of Integer; i,tmpx,x0,y0,dx,dy: Integer; k,angle: Double; implementation {$R *.lfm} { TForm1 } //Масштабирование procedure TForm1.Button1Click(Sender: TObject); begin //Коэффициент масштабирования k:=StrToFloat(Edit1.Text); if k=1 then Form1.Init(); for i:=0 to 10 do begin x[i]:=Round(x[i]*k); y[i]:=Round(y[i]*k); end; x0 := Round(x0*k); y0 := Round(y0*k); Form1.Draw(); end; //Поворот procedure TForm1.Button2Click(Sender: TObject); begin //Угол поворота angle := pi*StrToInt(Edit2.Text)/180; for i:=0 to 9 do begin tmpx :=x[i]; x[i]:=x0+Round((x[i]-x0)*cos(angle))-Round((y[i]-y0)*sin(angle)); y[i]:=y0+Round((tmpx-x0)*sin(angle))+Round((y[i]-y0)*cos(angle)); end; Form1.Draw(); end; //Смещение procedure TForm1.Button3Click(Sender: TObject); begin //Координаты, на которые осуществляется сдвиг dx:=StrToInt(Edit3.Text); dy:=StrToInt(Edit4.Text); x0:=x0+dx; y0:=y0-dy; for i:=0 to 9 do begin tmpx :=x[i]; x[i]:=x[i]+dx; y[i]:=y[i]-dy; end; Form1.Draw(); end; //Координаты всех вершин фигуры procedure TForm1.Init(); begin //Координаты точки, относительно которой осуществляется поворот x0:=200; y0:=200; //Лодка x[0]:=50; y[0]:=200; x[1]:=105; y[1]:=275; x[2]:=250; y[2]:=275; x[3]:=275; y[3]:=200; //Парус1 x[4]:=50; y[4]:=195; x[5]:=140; y[5]:=30; x[6]:=140; y[6]:=195; //Парус2 x[7]:=145; y[7]:=195; x[8]:=145; y[8]:=15; x[9]:=275; y[9]:=195; end; //Отрисовка procedure TForm1.Draw(); begin with PaintBox1.Canvas do begin Brush.Color:=clDefault; Rectangle(0,0,PaintBox1.Width,PaintBox1.Height); //Лодка Brush.Color:=RGBToColor(181,181,181); Polygon([Point(x[0],y[0]),Point(x[1],y[1]),Point(x[2],y[2]),Point(x[3],y[3])]); //Парус1 Brush.Color:=RGBToColor(0,245,255); Polygon([Point(x[4],y[4]),Point(x[5],y[5]),Point(x[6],y[6])]); //Парус2 Brush.Color:=RGBToColor(0,197,205); Polygon([Point(x[7],y[7]),Point(x[8],y[8]),Point(x[9],y[9])]); end; end; end
Прикрепленный файл | Размер |
---|---|
ship.zip | 1.1 Мб |