Матриця повороту. Обертання точки (об'єкта) на площині

Двовимірним поворотом об'єкта називається його переміщення по круговій траєкторії на прлощині. Параметрами даного переміщення є кут повороту Поворот точки на площині і деяка точка Поворот точки на площині — центр обертання, тобто точка навколо якої здійснюється поворот даного об'єкта.

Поворот об'єкта на заданий кут навколо цннтру обертання

Поворот об'єкта на заданий кут навколо цннтру обертання

Для простоти, розглянемо спочатку операцію обертання точки на деякий кут, коли центр обертання міститься в початку системи координат.

Поворот точки на заданий кут відносно початку системи координат

Поворот точки на заданий кут відносно початку системи координат

На даному малюнку Поворот точки на площині — постійна відстань від точки до початку системи координат; Поворот точки на площині — кут, який утворює радіус-вектор Поворот точки на площині з віссю Поворот точки на площині; Поворот точки на площині — кут обертання. Виходячи з того, що при обертанні відстань Поворот точки на площині не змінюється, то дану задачу прирівнюють до задачі на знаходження координатів будь-якої точки кола з радіусом Поворот точки на площині і з центром в початку системи координат, тобто координати точки Поворот відрізка на площині обчислюються  з допомогою наступних формул:

Поворот точки на площині

Далі, скориставшись правилом прямокутного трикутника (Поворот точки на площині), останні рівності перепишемо наступному вигляді:

Поворот точки на площині

У векторно-матричній формі, формула обертання точки Поворот точки на площині на кут Поворот точки на площині записується наступним чином:

Поворот точки на площині

Таким чином ми отримали формулу, яка описує обертання точки навколо центру системи координат. Для того, щоб здійснити поворот навколо центру обертання, координати якого відмінні від центру системи координат необхідно виконати наступні дії: перемістити точку обертання в центр сиситеми координат і від координатів точки Поворот точки на площині відняти кординати точки Поворот точки на площині; здійснити поворот точки на заданий кут; до координатів точки Поворот точки на площині (точка яку ми отримали після обертання) додати координати точки, яка являється центром обертання.

Поворот точки на площині

Поворот точки на заданий кут відносно центру обертання відмінного від початку системи координат

Поворот точки на заданий кут відносно центру обертання відмінного від початку системи координат

І на кінець давайте розглянемо, яким способом здійснюється обертання об'єкта. Для того, щоб виконати поворот об'єкта необхідно всі його точки повернути на одинаковий кут. Наприклад, для того, щоб виконати поворот багатокутника, необхідно виконати поворот всіх його вершин на заданий кут, після чого побудувати його заново по нових точках. Давайте створимо delphi-проект, який використовуючи вищерозглянуті формули, буде здійснювати поворот прямокутника на заданий кут (задається в градусах) відносно заданого центру обертання. Для цього відкриемо Delphi і розмістимо на формі компоненти, як зазначено на рисунку:

Обертання об'єкта на площині

Інтерфейс програми, яка здійснює обертання прямокутника на заданий кут

Далі, для початку, опишемо три масива, елементи яких являються дійсними і цілі числами, а також створимо константу типу RECTANGLE, яка зберігає координати прямокутника.

type
VECT = array [1..2] of real;
MAS = array [1..2,1..2] of real;
RECTANGLE = array[1..4, 1..2] of integer;
const Rect: RECTANGLE = ((200, 200),(400, 200),(400, 300),(200, 300));

Після цього, створимо процедуру rotate, яка буде здійснювати поворот кожної точки прямокутника Rect на кут angle відносно центру обертання point, процедуру paint — малює прямокутник на канві форми і функцію multiply — виконує множення вектора на матрицю.

procedure TForm1.rotate(angle: real; point: VECT);
var
A: MAS;
R: RECTANGLE;
P, P1: VECT;
i, j: integer;
begin
{ Задаєм елементи матриці обертання }
A[1, 1] := Cos(angle); A[1, 2] := Sin(angle);
A[2, 1] := -Sin(angle); A[2, 2] := Cos(angle);
{ Знаходимо координати, які описують прямокутник після обертання }
for i := 1 to 4 do
begin
for j := 1 to 2 do
P[j] := Rect[i, j] — point[j];
P1 := multiply(A, P);
for j := 1 to 2 do
R[i, j] := round(P1[j] + point[j]);
end;
{ Малюємо прямокутник на канві форми }
paint®;
end;
procedure TForm1.paint(A: RECTANGLE);
var
i: integer;
begin
for i := 1 to 4 do
begin
Canvas.MoveTo(A[i, 1], A[i, 2]);
if ((i+1) <= 4) then
Canvas.LineTo(A[i+1, 1], A[i+1, 2])
else
Canvas.LineTo(A[1, 1], A[1, 2])
end;
end;
function TForm1.multiply(A: MAS; b: VECT): VECT;
var
res: VECT;
i, j: integer;
S: real;
begin
for i := 1 to 2 do
begin
S := 0;
for j := 1 to 2 do
S := S + A[i, j] * b[j];
res[i] := S;
end;
multiply := res;
end;

На наступному кроці,  приступимо до програмування обробника події OnClick компонента Button1 та обробника події OnPaint головної форми проекту, яка буде малювати прямокутник Rect. Відмітимо, що саме з допомогою кнопки Button1 будемо здійснювати обертання даного прямокутника.

procedure TForm1.FormPaint(Sender: TObject);
begin
{ Малюємо на канві форми прямокутник Rect }
paint(Rect);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Point: VECT;
begin
{ Зберігаємо координати центру обертання в массив }
Point[1] := StrToFloat(Edit1.Text);
Point[2] := StrToFloat(Edit2.Text);
{ Малюємо центр обертання на канві форми }
Canvas.Ellipse(round(Point[1]-3), round(Point[2]-3), round(Point[1]+3), round(Point[2]+3));
{ Здійснюємо обертання кожної точки прямокутника і будуємо його заново }
rotate(StrToFloat(Edit3.Text)*Pi/180, Point);
end;

Далі, запустимо проект на виконання. Введемо у відповідні поля координати центру обертання та кут повороту і натиснемо кнопку Button1 («Здійснити поворот»). В результаті форма набуде наступного вигляді.

Інтерфейс програми, яка здійснює обертання прямокутника на заданий кут

Інтерфейс програми, яка здійснює обертання прямокутни

Скачати delphi-проект «Обертання обекта на площині».

Матеріал був корисним, поділись в соціальних мережах:

Якщо тобі сподобалась дана тема, залиш свій коментар