Лабораторная работа №3
«Комплексные операции»
студентки 532 группы
Казак Юлии
Код программы:
Масштабирование:
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;
Treanglm:array[1..3,1..3] of real;
rectanglm:array[1..4,1..3] of real;
TreanglR:array[1..3,1..3] of real;
rectanglR:array[1..4,1..3] of real;
B:array[1..3,1..3] of real;
Z: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,mm,xo,yo: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;
//поиск середины треугольника
xo:=round((TreanglA[1,1]+TreanglA[2,1]+TreanglA[3,1])/3);
yo:=round((TreanglA[1,2]+TreanglA[2,2]+TreanglA[3,2])/3);
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=-xo;
Z[3,2]:=-yo;
//смещение в начало координат
for ii:=1 to 3 do
for mm:=1 to 3 do
begin
TreanglM[ii,mm]:=0;
for jj:=1 to 3 do
TreanglM[ii,mm]:=TreanglM[ii,mm]+TreanglA[ii,jj]*Z[jj,mm];
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]+TreanglM[ii,jj]*B[jj,kk];
end;
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=xo;
Z[3,2]:=yo;
//смещение обратно
for ii:=1 to 3 do
for mm:=1 to 3 do
begin
TreanglM[ii,mm]:=0;
for jj:=1 to 3 do
TreanglM[ii,mm]:=TreanglM[ii,mm]+TreanglR[ii,jj]*Z[jj,mm];
end;
//переход к относительной системе координат
for ii:=1 to 3 do
begin
Treangl[ii,1]:=round(xx+TreanglM[ii,1]);
Treangl[ii,2]:=round(yy-TreanglM[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;
//поиск середины четырехугольника
xo:=round((RectanglA[1,1]+RectanglA[2,1]+RectanglA[3,1]+RectanglA[4,1])/4);
yo:=round((RectanglA[1,2]+RectanglA[2,2]+RectanglA[3,2]+RectanglA[4,2])/4);
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=-xo;
Z[3,2]:=-yo;
//смещение в начало координат
for ii:=1 to 4 do
for mm:=1 to 3 do
begin
RectanglM[ii,mm]:=0;
for jj:=1 to 3 do
RectanglM[ii,mm]:=RectanglM[ii,mm]+RectanglA[ii,jj]*Z[jj,mm];
end;
// масштабирование
for ii:=1 to 4 do
for kk:=1 to 3 do
begin
RectanglR[ii,kk]:=0;
for jj:=1 to 3 do
RectanglR[ii,kk]:= RectanglR[ii,kk]+RectanglM[ii,jj]*B[jj,kk];
end;
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=xo;
Z[3,2]:=yo;
//смещение обратно
for ii:=1 to 4 do
for mm:=1 to 3 do
begin
RectanglM[ii,mm]:=0;
for jj:=1 to 3 do
RectanglM[ii,mm]:=RectanglM[ii,mm]+RectanglR[ii,jj]*Z[jj,mm];
end;
//переход к относительной системе координат
for ii:=1 to 4 do
begin
Rectangl[ii,1]:=round(xx+RectanglM[ii,1]);
Rectangl[ii,2]:=round(yy-RectanglM[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 Unit4;
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm4 = class(TForm)
Button1: TButton;
Edit1: TEdit;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
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;
Treanglm:array[1..3,1..3] of real;
rectanglm:array[1..4,1..3] of real;
B:array[1..3,1..3] of real;
Z:array[1..3,1..3] of real;
Implementation
{$R *.dfm}
uses Unit1;
procedure TForm4.Button1Click(Sender: TObject);
Var II,jj,kk,mm,xo,yo:integer;
begin
form4.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 form4.CheckBox1.Checked then
B[1,2]:=strtoint(form4.Edit1.Text);
if form4.CheckBox2.Checked then
B[2,1]:=strtoint(form4.Edit2.Text);
if form4.CheckBox1.Checked and form4.CheckBox2.Checked then
begin
B[1,2]:=strtoint(form4.Edit1.Text);
B[2,1]:=strtoint(form4.Edit2.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;
//поиск середины треугольника
xo:=round((TreanglA[1,1]+TreanglA[2,1]+TreanglA[3,1])/3);
yo:=round((TreanglA[1,2]+TreanglA[2,2]+TreanglA[3,2])/3);
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=-xo;
Z[3,2]:=-yo;
//смещение в начало координат
for ii:=1 to 3 do
for mm:=1 to 3 do
begin
TreanglM[ii,mm]:=0;
for jj:=1 to 3 do
TreanglM[ii,mm]:=TreanglM[ii,mm]+TreanglA[ii,jj]*Z[jj,mm];
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]+TreanglM[ii,jj]*B[jj,kk];
end;
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=xo;
Z[3,2]:=yo;
//смещение обратно
for ii:=1 to 3 do
for mm:=1 to 3 do
begin
TreanglM[ii,mm]:=0;
for jj:=1 to 3 do
TreanglM[ii,mm]:=TreanglM[ii,mm]+TreanglR[ii,jj]*Z[jj,mm];
end;
//переходим к относительной системе координат
for ii:=1 to 3 do
begin
Treangl[ii,1]:=round(xx+TreanglM[ii,1]);
Treangl[ii,2]:=round(yy-TreanglM[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]);
form4.Edit1.Text:='';
form4.Edit2.Text:='';
form4.CheckBox1.Checked:=false;
form4.CheckBox2.Checked:=false;
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;
//поиск середины четырехугольника
xo:=round((RectanglA[1,1]+RectanglA[2,1]+RectanglA[3,1]+RectanglA[4,1])/4);
yo:=round((RectanglA[1,2]+RectanglA[2,2]+RectanglA[3,2]+RectanglA[4,2])/4);
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=-xo;
Z[3,2]:=-yo;
//смещение в начало координат
for ii:=1 to 4 do
for mm:=1 to 3 do
begin
RectanglM[ii,mm]:=0;
for jj:=1 to 3 do
RectanglM[ii,mm]:=RectanglM[ii,mm]+RectanglA[ii,jj]*Z[jj,mm];
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]+RectanglM[ii,jj]*B[jj,kk];
end;
//заполнение матрицы преобразования
for ii:=1 to 3 do
for mm:=1 to 3 do
if ii=mm then
Z[ii,mm]:=1
else
Z[ii,mm]:=0;
Z[3,1]:=xo;
Z[3,2]:=yo;
//смещение обратно
for ii:=1 to 4 do
for mm:=1 to 3 do
begin
RectanglM[ii,mm]:=0;
for jj:=1 to 3 do
RectanglM[ii,mm]:=RectanglM[ii,mm]+RectanglR[ii,jj]*Z[jj,mm];
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]);
form4.Edit1.Text:='';
form4.Edit2.Text:='';
form4.CheckBox1.Checked:=false;
form4.CheckBox2.Checked:=false;
end;
end;
end.
Отображение относительно прямой:
unit Unit7;