Obrót obiektu na płaszczyźnie o kąt alfa polega na takim odwzorowaniu obiektu pierwotnego, że każdy punkt obiektu wynikowego odpowiada każdemu punktowi obiektu pierwotnego, znajduje się w takiej samej odległości od osi obrotu oraz jest obrócony o kąt alfa
Najprostszy przypadek obrotu jest wtedy, gdy odwzorowywany jest punkt leżący na osi układu współrzędnych. W takiej sytuacji
x = r * cos (alfa);
y = r * sin (alfa);
gdzie r jest równe x0 lub y0 (współrzędne punktu przed obrotem). W innych przypadkach r = sqrt( x0^2 + y0^2); a podane powyżej wzory nie dają poprawnego wyniku.
Rozważmy poniższy rysunek:

Chcemy obrócić punkt, który przed obrotem znajduje się w jakiejś nieznanej nam bliżej odległości r (którą można ale nie trzeba wyliczyć na podstawie znanych współrzędnych tego punktu) oraz jest odchylony od osi układu współrzędnych o kąt beta. Obrót tego punktu o kąt alfa względem środka układu współrzędnych jest równoznaczny z umieszczeniem go w tej samej odległości r oraz odchyleniu o kąt alfa-beta względem osi, co wynika z sumowania kątów. Mamy wówczas:
x = r * cos (alfa - beta);
y = r * sin (alfa – beta);
nie są to jednak wartości którymi łatwo operować ze względu na złożoną postać r, można więc skorzystać z tożsamości trygonometrycznych:
x = r * cos(alfa) * cos (beta) – r * sin (alfa) * sin (beta);
y = r * sin(alfa) * cos (beta) – r * cos (alfa) * sin (beta);
wiemy także, że
sin(beta) = y0 / r;
cos (beta) = x0 / r;
zatem po podstawieniu otrzymujemy:
x = cos (alfa) * x0 – sin(alfa) * y0;
y = sin (alfa) * x0 + cos (alfa) * y0;
Wzór ten można przedstawić także w postaci wzoru na mnożenie macierzy:
|x| | cos(alfa) , -sin(alfa) | | x0 |
|y| = | sin(alfa) , cos(alfa) | x | y0 |
Praktycznym zastosowaniem tego wzoru może być np. obrót obrazka o dany kąt. Poniższa funkcja w Delphi obraca rysunek załadowany do obiektu image2 i rysuje go na formie programu
procedure rotateAndDraw(alfa:real)
var alfa,cosa, sina:real;
x0,y0,x,y:integer;
kolor:tcolor;
begin
cosa:=cos(alfa);
sina:=sin(alfa);
for x0:=0 to image1.picture.width-1 do
for y0:=0 to image1.picture.height-1 do begin
x:=round(cosa*(x0-image2.Picture.width/2)-sina*
(y0-image2.Picture.height/2));
y:=round(sina*(x0-image2.Picture.width/2)+cosa*
(y0-image2.Picture.height/2));
kolor:=image2.picture.bitmap.canvas.pixels[x0,y0];
canvas.pixels[x+160,y+160]:=kolor;
canvas.pixels[x+161,y+160]:=kolor;
canvas.pixels[x+160,y+161]:=kolor;
end;
end;
Od wartości x0 i y0 są odejmowane połowy odpowiednio szerokości i wysokości obrazka, dzięki czemu uzyskujemy obrót względem osi przechodzącej przez środek obrazka. Jak widać powyższy program zamalowuje aż 3 piksele wynikowe jednym pikselem źródłowym- ma to na celu uniknięcie efektu zaokrągleń- zamalowywanie jednego piksela owocowałoby powstawaniem siatki niezamalowanych pikseli na wynikowym obrazku, ze względu na zaokrąglenia rzeczywistych współrzędnych wyliczonych z funkcji trygonometrycznych do wartości całkowitych.