Лабораторная работа №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;