Подробный пример поворота
Пример.
Поворот
объекта – равностороннего треугольника со стороной 60 пикселей на заданный угол
α = 90° относительно точки с координатами (320,240)
(320, 240) (270, 210) (380, 240) (350, 190) (320, 180) (x1, y1) (x2, y2) (x3, y3)
Рис.20. Поворот объекта
{записываем
координаты нашего треугольника}
x1:=320;
y1:=240;
x2:=350;
y2:=190;
x3:=380;
y3:=240;
{выбираем
красный цвет рисования}
setcolor(12);
{рисуем
красный треугольник}
moveto(x1,y1);
lineto(x2,y2);
lineto(x3,y3);
lineto(x1,y1);
{треугольник
в этом примере не будем стирать}
setlinestyle(3,0,1); setcolor(14);
{повернутый треугольник будем рисовать желтым
цветом пунктирной линией}
alpha:=pi/2;
a:=320; b:=240;
{задаем
угол 90° (угол задается в радианах, поэтому пишем pi/2, чтобы задать другой
произвольный угол, например 54°, надо будет записать так: alpha:=pi/180*54);
задаем координаты точки, вокруг которой осуществляем поворот}
XX:=abs(a-x1)*cos(alpha)-abs(b-y1)*sin(alpha);
YY:=abs(a-x1)*sin(alpha)+abs(b-y1)*cos(alpha);
{XX
и YY – временные координаты каждой новой точки, |a-x1| и |b-y1| - координаты
точки (x1, y1) треугольника относительно точки поворота (a, b), т.е. если мы в
формулу вставим не |a-x1| и |b-y1|, а x1 и y1, то поворот получится
относительно нуля, т.е. левого верхнего угла экрана}
moveto(a+round(XX),b-round(YY));
{функция
round нужна для округления вещественного числа до целого, т.к. XX, YY:real}
XX:=abs(a-x2)*cos(alpha)-abs(b-y2)*sin(alpha);
YY:=abs(a-x2)*sin(alpha)+abs(b-y2)*cos(alpha);
lineto(a+round(XX),b-round(YY));
XX:=abs(a-x3)*cos(alpha)-abs(b-y3)*sin(alpha);
YY:=abs(a-x3)*sin(alpha)+abs(b-y3)*cos(alpha);
lineto(a+round(XX),b-round(YY));
XX:=abs(a-x1)*cos(alpha)-abs(b-y1)*sin(alpha);
YY:=abs(a-x1)*sin(alpha)+abs(b-y1)*cos(alpha);
lineto(a+round(XX),b-round(YY));
Рис.21. Результат поворота объекта
вокруг точки
Определение
новых координат точки, полученных в результате поворота на угол α, можно
оформить в виде функции пользователя. Тогда алгоритм построения треугольника,
полученного в результате поворота исходного изображения на угол α = 90°,
запишется в более компактном виде:
function x(f,g,h:integer):integer;
begin
x:=round(f*cos(pi/180*h)-g*sin(pi/180*h));
end;
function y(f,g,h:integer):integer;
begin
y:=round(f*sin(pi/180*h)+g*cos(pi/180*h));
end;
…
alpha:=90;
a:=320; b:=240;
{Здесь
угол можно задать в градусах}
{сразу
заменим координаты треугольника на новые, т.е. относительно точки поворота (a,
b)}
x1:=abs(a-x1); y1:=abs(b-y1);
x2:=abs(a-x2); y2:=abs(b-y2);
x3:=abs(a-x3); y3:=abs(b-y3);
setlinestyle(3,0,1);
setcolor(14);
{ниже
рисуем повернутый треугольник при помощи пользовательских функций}
moveto(a+x(x1,y1,alpha),b-y(x1,y1,alpha));
lineto(a+x(x2,y2,alpha),b-y(x2,y2,alpha));
lineto(a+x(x3,y3,alpha),b-y(x3,y3,alpha));
lineto(a+x(x1,y1,alpha),b-y(x1,y1,alpha));
В
этих примерах мы не стирали исходный треугольник, чтобы видеть результат до и
после.