Формули, за якими обчислюються координати рухомого кінця стрілки, відомі учням з курсу математики (поворот точки на заданий кут відносно нерухомого центру з координатами(x0,y0):
x = x 0 +L*cosά
y = y o - L*sinά
де L - відстань, на якій знаходиться точка від центру повороту, а — кут, на який повертається точка.
Зверніть увагу тільки на те, що в програмі друга формула замість знаку «-» буде містити знак «+», тому що екранні координати мають направленість осей, зворотну до реальних декартових координат (на екрані значення координати Y збільшується в напрямку зверху вниз).
Малювання поділок на циферблаті виконується теж за допомогою вище наведених формул
Програма, що реалізує запропонований алгоритм, наведена нижче. Зверніть увагу, що в цій програмі L_min , L_time- довжини хвилинної та годинникової стрілок відповідно; Color_min , Color_time- кольори хвилинної та годинникової стрілок відповідно; R - радіус циферблату годинника; x_centr , y_centr- координати центра екрану (визначаються у відповідності до поточної роздільної здатності за допомогою функцій getmaxxта getmaxy ; x_min , y_min- координати рухомого кінця хвилинної стрілки; x_time , y_time- координати рухомого кінця годинникової стрілки; Ang_min , Ang_time- кути повороту хвилинної та годинникової стрілок. Рух стрілок по циферблату здійснюється за рахунок постійного їх перемальовування то активним кольором малювання стрілки, то кольором тла («затирання» зображення). Програма завершується після натискання будь-якої клавіші за рахунок використання циклу repeat until keypressed .
Program Example_629;
Uses crt,graph; {Підключення бібліотек}
const L_min=174;
L_time=145; Color_min=white; Color_time=white; R = 200;
var gd,gm:integer;
S:string[2];
x_centr, y_centr:integer;
і,x_min,y_min:integer;
x_time,y_time:integer;
Ang_min,Ang_time:real;
begin
{Ініціалізація графічного режиму}
gd:=VGA; gm:=VGAHi;
InitGraph (gd,gm,’’);
{Визначення центра екрану}
x_centr := getmaxx div 2;
y_centr := getmaxy div 2;
{Малювання статичної частини малюнку}
SetColor(brown);
SetFillStyle(l,brown);
{Малювання циферблату коричневого кольору}
FillEllipse(x_centr,y_centr,R,R);
Ang_time:=-90;
{Встановлення кольору малювання, стилю тексту}
SetColor(yellow);
SetTextJustify(CenterText, CenterText);
SetTextStyle(De£aultFont, HorizDir, 2);
{Малювання поділок жовтого кольору та цифр}
for i:=1 to 12 do
begin
Ang_time:=Ang_time+30;
x_time:=round(x_centr+185*cos(Ang_txme*pi/180));
y_time:=round(y_centr+185*sin(Ang_time*pi/180)) ;
str(i,S);
OutTextXy(x_time,y_time,S);
end;
{Малювання ходу годинника}
Ang_min:=-90; Ang_time:=-90;
repeat
x_time:=round(x_centr+L_time*cos(Ang_time*pi/180));
y_time:=round(y_centr+L_time*sin(Ang_time*pi/180)) ;
SetColor(Color_time);
Line(x_centr,y_centr,x_time,y_time);
x_min:=round(x_centr+L_min*cos(Ang_min*pi/180)) ;
y_min:=round(y_centr+L_min*sin(Ang_min*pi/180)) ;
SetColor(Color_min);
Line(x_centr,y_centr,x_min,y_min);
Delay(10000); {Затримка зображення на екрані)
SetColor(brown);
Line(x_centr,y_centr,x_time,y_time);
Line(x_centr,y_centr,x_min,y_min);
Ang_min:=Ang_min+6;
Ang_time:=Ang_time+0.5;
until keypressed;
readkey; CloseGraph;
end.
Запропонований метод побудови мультиплікаційних об’єктів являється найпростішим, але якщо об’єкт, що рухається, має більші лінійні розміри, ніж в запропонований задачі, він буде суттєво миготіти на екрані. Тому існує інший підхід до розв’язку цієї задачі. Пропонується алгоритм:
а) намалювати бажаний об’єкт;
б) запам’ятати область екрана, з виведеним малюнком;
в) відновити екран в місці, де був малюнок (тобто стерти малюнок);
г) вивести малюнок на нове місце і т.д.
Цей підхід дуже схожий на попередній варіант, але має суттєві переваги в тому, що не потребує багаторазового перемалювання малюнку. Об’єкт створюється один раз, зберігається його копія, а потім виводиться в потрібному місці. Для зберігання намальованого фрагмента необхідно використовувати оперативну пам’ять, причому так як ми не знаємо розміри об’єкта на початку програми, пам’ять необхідно запрошувати у системи безпосередньо під час роботи програми. Це можна зробити тільки використовуючи динамічну пам’ять за допомогою наступних процедур:
Читать дальше