Interface
uses SysUtils, StdCtrls, Graphics;
Type
TOtobr=class
Procedure Otobragenie;
end;
Var a:integer;
TreanglA: array [1..3, 1..3] of integer;
RectanglA: array [1..4, 1..3] of integer;
LineA: array [1..2, 1..3] of integer;
LineS: array [1..2, 1..3] of integer;
TreanglR: array [1..3, 1..3] of real;
RectanglR: array [1..4, 1..3] of real;
LineR: array [1..2, 1..3] of real;
B: array [1..3, 1..3] of real;
Line_D:array[1..2,1..2] of integer;
x,y:integer;
tg_alpha:real; L:real;
Mat_Povorot: array [1..3,1..3] of real;
Implementation
uses Unit1;
Procedure TOtobr.Otobragenie;
Var ii, jj, kk:integer;
begin
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;
//переходим к абсолютной системе координат для линии (для обратного смещения)
for ii:=1 to 2 do
begin
LineS[ii,1]:=Line_Ot[ii,1]-XX;
LineS[ii,2]:=YY-Line_Ot[ii,2];
LineS[ii,3]:=1;
end;
// Т Р Е У Г О Л Ь Н И К
if nt=1 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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=1;
b[2,3]:=0;
b[3,1]:=-(LineA[2,1]);
b[3,2]:=-(LineA[2,2]);
b[3,3]:=1;
// преобразовуем изображения (Смещение)
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 2 do
for kk:= 1 to 3 do
begin
LineR[ii,kk]:=0;
for jj:= 1 to 3 do
LineR[ii,kk]:=LineR[ii,kk]+LineA[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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
//ПОВОРОТ
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
//угол поворота
if ((LineR[2,1]-LineR[1,1])=0) then
tg_alpha:=((LineR[2,2]-LineR[1,2])/1)
else
tg_alpha:=((LineR[2,2]-LineR[1,2])/(LineR[2,1]-LineR[1,1]));
L:= arctan(tg_alpha);
//матрица поворота
Mat_Povorot[1,1]:=cos(-L);
Mat_Povorot[1,2]:=sin(-L);
Mat_Povorot[1,3]:=0;
Mat_Povorot[2,1]:=-sin(-L);
Mat_Povorot[2,2]:=cos(-L);
Mat_Povorot[2,3]:=0;
Mat_Povorot[3,1]:=0;
Mat_Povorot[3,2]:=0;
Mat_Povorot[3,3]:=1;
// умножение на матрицу поворота
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]*Mat_Povorot[jj,kk];
end;
//для линии
for ii:= 1 to 2 do
for kk:= 1 to 3 do
begin
LineR[ii,kk]:=0;
for jj:= 1 to 3 do
LineR[ii,kk]:=LineR[ii,kk]+LineA[ii,jj]*Mat_Povorot[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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
//ОТОБРАЖЕНИЕ
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
// Отображение
//матрица отображения
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=-1;
b[2,3]:=0;
b[3,1]:=0;
b[3,2]:=0;
b[3,3]:=1;
// умножение на матрицу отображения
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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
// ПОВОРОТ ОБРАТНО
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
// Поворот обратно
//матрица поворота
Mat_Povorot[1,1]:=cos(L);
Mat_Povorot[1,2]:=sin(L);
Mat_Povorot[1,3]:=0;
Mat_Povorot[2,1]:=-sin(L);
Mat_Povorot[2,2]:=cos(L);
Mat_Povorot[2,3]:=0;
Mat_Povorot[3,1]:=0;
Mat_Povorot[3,2]:=0;
Mat_Povorot[3,3]:=1;
// умножение на матрицу поворота
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]*Mat_Povorot[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;
// ОБРАТНОЕ СМЕЩЕНИЕ
//переходим к абсолютной системе координат
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;
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=1;
b[2,3]:=0;
b[3,1]:=(LineS[2,1]);
b[3,2]:=(LineS[2,2]);
b[3,3]:=1;
// Смещение
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]);
end;
// Ч Е Т И Р Е Х У Г О Л Ь Н И К
if nt=2 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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=1;
b[2,3]:=0;
b[3,1]:=-(LineA[2,1]);
b[3,2]:=-(LineA[2,2]);
b[3,3]:=1;
// Смещение
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]+RectanglA[ii,jj]*b[jj,kk];
end;
//для линии
for ii:= 1 to 2 do
for kk:= 1 to 3 do
begin
LineR[ii,kk]:=0;
for jj:= 1 to 3 do
LineR[ii,kk]:=LineR[ii,kk]+LineA[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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
//ПОВОРОТ
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
//угол поворота
if ((LineR[2,1]-LineR[1,1])=0) then
tg_alpha:=((LineR[2,2]-LineR[1,2])/1)
else
tg_alpha:=((LineR[2,2]-LineR[1,2])/(LineR[2,1]-LineR[1,1]));
L:= arctan(tg_alpha);
//матрица поворота
Mat_Povorot[1,1]:=cos(-L);
Mat_Povorot[1,2]:=sin(-L);
Mat_Povorot[1,3]:=0;
Mat_Povorot[2,1]:=-sin(-L);
Mat_Povorot[2,2]:=cos(-L);
Mat_Povorot[2,3]:=0;
Mat_Povorot[3,1]:=0;
Mat_Povorot[3,2]:=0;
Mat_Povorot[3,3]:=1;
// умножение на матрицу поворота
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]+RectanglA[ii,jj]*Mat_Povorot[jj,kk];
end;
//для линии
for ii:= 1 to 2 do
for kk:= 1 to 3 do
begin
LineR[ii,kk]:=0;
for jj:= 1 to 3 do
LineR[ii,kk]:=LineR[ii,kk]+LineA[ii,jj]*Mat_Povorot[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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
// ОТОБРАЖЕНИЕ
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
// Отображение
//матрица отображения
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=-1;
b[2,3]:=0;
b[3,1]:=0;
b[3,2]:=0;
b[3,3]:=1;
// умножение на матрицу отображения
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]+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;
//для линии
for ii:= 1 to 2 do
begin
Line_Ot[ii,1]:=round(XX+LineR[ii,1]);
Line_Ot[ii,2]:=round(YY-LineR[ii,2]);
end;
// ПОВОРОТ ОБОРАТНО
//переходим к абсолютной системе координат
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 2 do
begin
LineA[ii,1]:=Line_Ot[ii,1]-XX;
LineA[ii,2]:=YY-Line_Ot[ii,2];
LineA[ii,3]:=1;
end;
// Поворот обратно
//матрица поворота
Mat_Povorot[1,1]:=cos(L);
Mat_Povorot[1,2]:=sin(L);
Mat_Povorot[1,3]:=0;
Mat_Povorot[2,1]:=-sin(L);
Mat_Povorot[2,2]:=cos(L);
Mat_Povorot[2,3]:=0;
Mat_Povorot[3,1]:=0;
Mat_Povorot[3,2]:=0;
Mat_Povorot[3,3]:=1;
// умножение на матрицу поворота
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]+RectanglA[ii,jj]*Mat_Povorot[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;
// СМЕЩЕНИЕ ОБРАТНО
//переходим к абсолютной системе координат
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;
b[1,1]:=1;
b[1,2]:=0;
b[1,3]:=0;
b[2,1]:=0;
b[2,2]:=1;
b[2,3]:=0;
b[3,1]:=(LineS[2,1]);
b[3,2]:=(LineS[2,2]);
b[3,3]:=1;
// Смещение
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]+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]);
end;
end;
end.
Не пропорциональное уменьшение:
Пропорциональное увеличение:
Отображение относительно прямой:
Отображение относительно прямой:
Сдвиг: