Воскресенье, 28.04.2024, 23:22
Приветствую Вас Гость | RSS
Главное меню
Наш опрос
Оцените мой сайт
Всего ответов: 47
Форма входа
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Графика в Паскале

Подробный пример поворота

Пример.

Поворот объекта – равностороннего треугольника со стороной 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));

В этих примерах мы не стирали исходный треугольник, чтобы видеть результат до и после.