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

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.

Не пропорциональное уменьшение:

Пропорциональное увеличение:

Отображение относительно прямой:

Отображение относительно прямой:

Сдвиг:

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