Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КГ2.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
359.42 Кб
Скачать

Лабораторная работа №2

«Преобразование 2D фигур»

студентки 532 группы

Казак Юлии

Задание: Разработать часть графического редактора, который позволяет совершать преобразование 2D фигур, а именно: изменять масштаб, отображать, сдвигать, смещать, поворачивать фигуры.

Код программы:

unit Unit1;

interface

uses

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

Dialogs, Menus, ExtCtrls, ExtDlgs,Unit2,Unit3,Unit4,Unit5,Unit6;

type

TForm1 = class(TForm)

Image1: TImage;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N10: TMenuItem;

N11: TMenuItem;

N12: TMenuItem;

N13: TMenuItem;

N14: TMenuItem;

N15: TMenuItem;

SavePictureDialog1: TSavePictureDialog;

OpenPictureDialog1: TOpenPictureDialog;

procedure FormCreate(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N3Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure N12Click(Sender: TObject);

procedure N13Click(Sender: TObject);

procedure N14Click(Sender: TObject);

procedure N15Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

xx,yy,i:integer;

tr,rec,cer:boolean;

Treangl:array[1..3,1..2] of integer;

rectangl:array[1..4,1..2] of integer;

Elips:array[1..3,1..2] of integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

yy:=round(image1.Height/2);

xx:=round(image1.Width/2);

form1.Image1.Canvas.MoveTo(0,yy);

form1.Image1.Canvas.LineTo(form1.Image1.Width,yy);

form1.Image1.Canvas.MoveTo(xx,0);

form1.Image1.Canvas.LineTo(xx,form1.Image1.Height);

form1.Image1.Canvas.MoveTo(form1.Image1.Width,yy);

form1.Image1.Canvas.LineTo(form1.Image1.Width-10,yy-7);

form1.Image1.Canvas.MoveTo(form1.Image1.Width,yy);

form1.Image1.Canvas.LineTo(form1.Image1.Width-10,yy+7);

form1.Image1.Canvas.MoveTo(xx,0);

form1.Image1.Canvas.LineTo(xx-7,15);

form1.Image1.Canvas.MoveTo(xx,0);

form1.Image1.Canvas.LineTo(xx+7,15);

image1.Canvas.TextOut(xx-20,yy+10,'0,0');

image1.Canvas.TextOut(2*xx-10,yy+15,'X');

image1.Canvas.TextOut(xx-15,5,'Y');

tr:=false;

rec:=false;

cer:=false;

end;

procedure TForm1.N7Click(Sender: TObject);

begin

tr:=true;

rec:=false;

cer:=false;

i:=1;

end;

procedure TForm1.N8Click(Sender: TObject);

begin

tr:=false;

rec:=true;

cer:=false;

i:=1;

end;

procedure TForm1.N9Click(Sender: TObject);

begin

tr:=false;

rec:=false;

cer:=true;

i:=1;

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var aa,bb,a,b,r,RB:integer;

bs:Tbrushstyle;

begin

if tr=true then

begin

if i<=3 then

begin

Treangl[i,1]:=x;

Treangl[i,2]:=y;

if i=3 then

begin

form1.Image1.Canvas.MoveTo(Treangl[1,1],Treangl[1,2]);

form1.Image1.Canvas.LineTo(Treangl[2,1],Treangl[2,2]);

form1.Image1.Canvas.LineTo(Treangl[3,1],Treangl[3,2]);

form1.Image1.Canvas.LineTo(Treangl[1,1],Treangl[1,2]);

end;

i:=i+1;

end;

end;

if rec=true then

begin

if i<=4 then

begin

rectangl[i,1]:=x;

rectangl[i,2]:=y;

if i=4 then

begin

form1.Image1.Canvas.MoveTo(rectangl[1,1],rectangl[1,2]);

form1.Image1.Canvas.LineTo(rectangl[2,1],rectangl[2,2]);

form1.Image1.Canvas.LineTo(rectangl[3,1],rectangl[3,2]);

form1.Image1.Canvas.LineTo(rectangl[4,1],rectangl[4,2]);

form1.Image1.Canvas.LineTo(rectangl[1,1],rectangl[1,2]);

end;

i:=i+1;

end;

end;

if cer=true then

begin

if i<=3 then

begin

Treangl[i,1]:=x;

Treangl[i,2]:=y;

if i=3 then

begin

bs:=form1.Image1.Canvas.Brush.Style;

form1.Image1.Canvas.Brush.Style:=bsClear;

a:= round(Treangl[2,1]-Treangl[1,1]);

b:= round(Treangl[2,2]-Treangl[1,2]);

r:=round(sqrt(sqr(a)+sqr(b)));

aa:= round(Treangl[3,1]-Treangl[2,1]);

bb:= round(Treangl[3,2]-Treangl[2,2]);

RB:=round(sqrt(sqr(aa)+sqr(bb)));

form1.Image1.Canvas.Ellipse(Treangl[2,1]-RB,

Treangl[2,2]-r,Treangl[2,1]+RB,Treangl[2,2]+r );

Form1.FormCreate(Sender);

form1.Image1.Canvas.Brush.Style:=bs;

end;

i:=i+1;

end;

end;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

if MessageDlg ('Все несохранённые данные будут потерянны', mtConfirmation, [mbYes, mbNo],0)=mrYes then

Begin

form1.Image1.Canvas.Rectangle(-1,-1,form1.Image1.Width+1, form1.Image1.Height+1);

Form1.FormCreate(Sender);

end;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

if form1.SavePictureDialog1.Execute then

begin

form1.Image1.Picture.SaveToFile(form1.SavePictureDialog1.FileName+'.bmp');

end

else

begin

showmessage('Введите имя файла и нажмите сохранить');

exit;

end;

end;

procedure TForm1.N5Click(Sender: TObject);

var s:string;

begin

if MessageDlg ('Все несохраненные данные будут потеряны', mtConfirmation, [mbYes, mbNo],0)=mrYes then

Begin

if form1.OpenPictureDialog1.Execute then

begin

form1.Image1.Picture.LoadFromFile(form1.OpenPictureDialog1.FileName);

end

else

begin

showmessage('Выберите файл и надавите открыть');

exit;

end;

end;

end;

procedure TForm1.N6Click(Sender: TObject);

begin

if messagedlg('Все несохраненные данные будут потеряны,вы уверены что хотите закрыть приложение?',mtConfirmation,[mbYes,mbNo],0)=mrYes then

form1.Close;

end;

procedure TForm1.N11Click(Sender: TObject);

begin

form2.show;

end;

procedure TForm1.N12Click(Sender: TObject);

begin

form3.show;

end;

procedure TForm1.N13Click(Sender: TObject);

begin

form4.Show;

end;

procedure TForm1.N14Click(Sender: TObject);

begin

form5.Show;

end;

procedure TForm1.N15Click(Sender: TObject);

begin

form6.Show;

end;

end.

unit Unit2;

Interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

type

TForm2 = class(TForm)

GroupBox1: TGroupBox;

Edit1: TEdit;

GroupBox2: TGroupBox;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Edit3: TEdit;

RadioGroup1: TRadioGroup;

Button1: TButton;

procedure RadioGroup1Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

TreanglA:array[1..3,1..3] of integer;

rectanglA:array[1..4,1..3] of integer;

TreanglR:array[1..3,1..3] of real;

rectanglR:array[1..4,1..3] of real;

B:array[1..3,1..3] of real;

Implementation

{$R *.dfm}

uses Unit1;

procedure TForm2.RadioGroup1Click(Sender: TObject);

begin

if form2.RadioGroup1.ItemIndex=0 then

begin

form2.GroupBox1.Visible:=true;

form2.GroupBox2.Visible:=false;

end;

if form2.RadioGroup1.ItemIndex=1 then

begin

form2.GroupBox2.Visible:=true;

form2.GroupBox1.Visible:=false;

end;

if form2.RadioGroup1.ItemIndex=2 then

begin

form2.GroupBox1.Visible:=true;

form2.GroupBox2.Visible:=false;

end;

if form2.RadioGroup1.ItemIndex=3 then

begin

form2.GroupBox2.Visible:=true;

form2.GroupBox1.Visible:=false;

end;

end;

procedure TForm2.Button1Click(Sender: TObject);

var ii,jj,kk:integer;

begin

form2.Hide;

for ii:=1 to 3 do

for jj:=1 to 3 do

if ii=jj then B[ii,jj]:=1

else

B[ii,jj]:=0;

if form2.RadioGroup1.ItemIndex=0 then

begin

b[1,1]:=sqrt(strtoint(form2.Edit1.Text));

b[2,2]:=sqrt(strtoint(form2.Edit1.Text));

end;

if form2.RadioGroup1.ItemIndex=1 then

begin

b[1,1]:=strtoint(form2.Edit2.Text);

b[2,2]:=strtoint(form2.Edit3.Text);

end;

if form2.RadioGroup1.ItemIndex=2 then

begin

b[1,1]:=1/sqrt(strtoint(form2.Edit1.Text));

b[2,2]:=1/sqrt(strtoint(form2.Edit1.Text));

end;

if form2.RadioGroup1.ItemIndex=3 then

begin

b[1,1]:=1/(strtoint(form2.Edit2.Text));

b[2,2]:=1/(strtoint(form2.Edit3.Text));

end;

if tr=true then

begin

for ii:=1 to 3 do

begin

TreanglA[ii,1]:=Treangl[ii,1]-xx;

TreanglA[ii,2]:=yy-Treangl[ii,2];

TreanglA[ii,3]:=1;

end;

for ii:=1 to 3 do

for kk:=1 to 3 do

begin

TreanglR[ii,kk]:=0;

for jj:=1 to 3 do

TreanglR[ii,kk]:=TreanglR[ii,kk]+TreanglA[ii,jj]*B[jj,kk];

end;

for ii:=1 to 3 do

begin

Treangl[ii,1]:=round(xx+TreanglR[ii,1]);

Treangl[ii,2]:=round(yy-TreanglR[ii,2]);

end;

form1.Image1.Canvas.MoveTo(Treangl[1,1],Treangl[1,2]);

form1.Image1.Canvas.LineTo(Treangl[2,1],Treangl[2,2]);

form1.Image1.Canvas.LineTo(Treangl[3,1],Treangl[3,2]);

form1.Image1.Canvas.LineTo(Treangl[1,1],Treangl[1,2]);

form2.Edit1.Text:='';

form2.Edit2.Text:='';

form2.Edit3.Text:='';

form2.GroupBox1.Visible:=false;

form2.GroupBox2.Visible:=false;

form2.RadioGroup1.ItemIndex:=-1;

end;

if rec=true then

begin

for ii:=1 to 4 do

begin

RectanglA[ii,1]:=Rectangl[ii,1]-xx;

RectanglA[ii,2]:=yy-Rectangl[ii,2];

RectanglA[ii,3]:=1;

end;

for ii:=1 to 4 do

for kk:=1 to 4 do

begin

RectanglR[ii,kk]:=0;

for jj:=1 to 4 do

RectanglR[ii,kk]:= RectanglR[ii,kk]+RectanglA[ii,jj]*B[jj,kk];

end;

for ii:=1 to 4 do

begin

Rectangl[ii,1]:=round(xx+RectanglR[ii,1]);

Rectangl[ii,2]:=round(yy-RectanglR[ii,2]);

end;

form1.Image1.Canvas.MoveTo(Rectangl[1,1],Rectangl[1,2]);

form1.Image1.Canvas.LineTo(rectangl[2,1],rectangl[2,2]);

form1.Image1.Canvas.LineTo(rectangl[3,1],rectangl[3,2]);

form1.Image1.Canvas.LineTo(rectangl[4,1],rectangl[4,2]);

form1.Image1.Canvas.LineTo(rectangl[1,1],rectangl[1,2]);

form2.Edit1.Text:='';

form2.Edit2.Text:='';

form2.Edit3.Text:='';

form2.GroupBox1.Visible:=false;

form2.GroupBox2.Visible:=false;

form2.RadioGroup1.ItemIndex:=-1;

end;

end;

end.

unit Unit3;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]