Создание анимации в среде Turbo Pascal на примере анимированной модели стрелочных часов Исследовательская работа Ученицы 10 « Б » класса Андрук Алены Научный руководитель: Баскакова Н.В. Санкт - Петербург 2009 г.
Целью данной работы является моделирование объекта «часы» в среде программирования Turbo Pascal. Для реализации главной цели было необходимо освоить вне учебной программы графические операторы и технологии создания движущихся изображений в среде Turbo Pascal, поэтому при выполнении этой работы рассмат- ривались и такие цели, как расширение знаний по курсу программирования на Паскале и совершенствования навыков написания и отладки программ. Цель работы
ЭТАПЫ МОДЕЛИРОВАНИЯ III этап: Компьютерный эксперимент 1. Описание задачи 2. Цель моделирования 3. Описание объекта или процесса 4. Анализ объекта II этап: Разработка модели 5. Разработка информационной модели 6. Разработка математической модели 7. Разработка компьютерной модели IV этап: Анализ результатов моделирования
Постановка задачи Задача: Программа «Часы» должна выводить изображение циферблата с движущимися стрелками (часовой, минутной, секундной).
Выбор входных и выходных данных Входные данные: R радиус циферблата; X0, Y0 координаты центра циферблата; d размер временной задержки для демонстрации модели в реальном времени d=1000 ms = 1 сек., для демонстрации модели в ускоренном режиме d=10000 ms; t время показа анимации; hour, min, sec углы определяющие положение часовой, минутной, секундной стрелок. h, m, s значения, характеризующие текущий момент времени (количество часов, минут, секунд). Выходные данные: Анимированное изображение.
Математическая модель 1.Определение положения стрелок Положение стрелок на циферблате определяется следующими формулами: Шаг минутной и секундной стрелок равен 6 0, поэтому: Угол положения минутной и секундной стрелок определяется по формулам: Min:=90 - m*6; Sec:=90 - s*6; Угол положения часовой стрелки определяется количеством часов и минут: Hour:=90 - h*30 - (mdiv12)*6, где (h*30)-угол определяемый кол-вом часов. (mdiv12)*6 – угол между соседними значениями часов
2. Рисование циферблата. Для создания изображения циферблата необходимо нарисовать: 1.Белую закрашенную окружность радиусом R+40; 2.Синюю окружность радиусом R, вдоль которой будет размещаться шкала делений; 3.Маленькую синюю закрашенную окружность радиусом R=5 в центре циферблата; 4.Линии шкалы делений – 60 делений для отсчета минут (секунд), причем каждый пятый отрезок имеет большую длину и толщину, чем основные деления; 5.Вывести цифры часов напротив каждого пятого деления шкалы. Математическая модель
Координаты начала и конца каждого отрезка линии шкалы делений определяются по формулам: x1:=x0+0.96*r*cos(sec); y1:=y0-0.96*r*sin(sec); x:=x0+r*cos(sec); y:=y0-r*sin(sec); Для каждого пятого деления координаты начала отрезка линии определяются по формулам: x1:= x0+0.93*r*cos(sec); y1:= y0-0.93*r*sin(sec); Координаты начала поля вывода цифр часов определяются по формулам: x2:= x0+1.1*r*cos(sec)-11; y2:= y0-1.1*r*sin(sec)-14; Математическая модель
3. Рисование стрелок Длина часовой стрелки: Lh:=0,6*R Длина минутной стрелки: Lm:=0,8*R Длина секундной стрелки: Ls:=0,8*R Координаты концов линий-стрелок X и Y определяются координатами центра циферблата X0,Y0, длиной стрелки и углом ее наклона: : X:=Round(X0+L*cos (UGOL*2*Pi/360)); Y:=Round(Y0-L*sin (UGOL*2*Pi/360)); Где: L – длина стрелки UGOL - угол положения стрелки (подставляются значения углов часовой, минутной или секундной стрелки - hour, min, sec) Математическая модель
4. Реализация анимированного изображения. 1.Сначала рисуется циферблат, который в дальнейшем остается неизменным. 2.Создание эффекта движения в Паскале реализуется следующим образом: В каждый текущий момент(шаг = 1 сек) рисуются черным цветом секундная, минутная и часовая стрелки. После временной задержки, 1000 миллисекунд =1секунде, стрелки рисуются еще раз, но цвет линии белый. Тем самым исходное изображение стирается. Рисуется новое положение стрелок. Математическая модель
Компьютерный эксперимент Программа «Стрелочные часы» program chasy; uses graph, crt; {ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ} var r,s,ss,m,h,x0,y0,x,y,x1,y1,x2,y2,n,t,tmax,d,driver,mode:integer; k: string[2]; ls, lm, lh, sec, ssec, min, hour : real; {r - радиус, x0, y0 – координаты центра, x, y, x1, y1 – координаты отрезков делений шкалы циферблата, x2, y2 – координаты цифр циферблата, s – количество секунд, sec – угол секундной стрелки, m – количество минут, min – угол минутной стрелки, h – количество часов, hour – угол часовой стрелки, ls, lm, lh – длины секундной, минутной и часовой стрелок, n – счетчик цифры циферблата, k - текст цифры циферблата, d – временная задержка, tmax время показа анимации;
{ПРОЦЕДУРА РИСОВАНИЯ СТРЕЛОК} Procedure strelka (ugol,dlina:real); Var x,y:integer; begin x:=Round(x0+dlina*cos(ugol*pi/180)); y:=Round(y0-dlina*sin(ugol*pi/180)); Line(x,y,x0,y0); end; {НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ} begin writeln('vvedite chas: h='); readln(h); writeln('vvedite minuty: m='); readln(m); writeln('vvedite secundy: ss='); readln(ss); writeln('vvedite vremya zaderzhki (1000) d='); readln(d); writeln('vvedite vremya pokaza (1800,3600 ili 7200) tmax='); readln(tmax); r:=180; x0:=320; y0:=240; driver:=0; mode:=0; initgraph(driver,mode,'c:/bp/bgi'); cleardevice;
{РИСОВАНИЕ ЦИФЕРБЛАТА} setbkcolor(blue); setcolor(white); {циферблат – белая закрашенная окружность} setfillstyle(solidfill, white); fillellipse(x0,y0,r+40,r+40); {синяя окружность внутри белой закрашенной окружности} setcolor(blue); ellipse(x0,y0,0,360,r,r); {маленькая синяя закрашенная окружность в центре циферблата} setfillstyle(solidfill,blue); fillellipse(x0,y0,5,5); sec:=0;n:=0; {рисование делений шкалы циферблата} for s:=0 to 59 do BEGIN sec:=(90-s*6)*pi/180; x:=Round(x0+r*cos(sec)); y:=Round(y0-r*sin(sec)); x1:=Round(x0+0.96*r*cos(sec)); y1:=Round(y0-0.96*r*sin(sec)); setlinestyle(SolidLn,0,1);
{рисование каждого пятого деления шкалы циферблата более длинным и с большей толщиной линии} if s mod 5 = 0 then begin x1:=Round(x0+0.93*r*cos(sec)); y1:=Round(y0-0.93*r*sin(sec)); setlinestyle(SolidLn,0,3); {вывод текста цифр циферблата} x2:=Round(x0+1.1*r*cos(sec)-11); y2:=Round(y0-1.1*r*sin(sec)-14); if s=0 then k:='12' else begin n:=n+1; Str(n:2,k); end; end; Settextstyle(1,horizdir,1); OuttextXY(x2,y2,k); Line(x,y,x1,y1); end; {ДВИЖЕНИЕ СТРЕЛОК} ls:=0.85*r; lm:=0.8*r; lh:=0.6*r; for t:=0 to tmax do begin ssec:=90-ss*6; min:=90-m*6; hour:=90-h*30-(m div 12)*6; {рисование стрелок} setcolor(blue); setlinestyle(0,0,3); strelka(min,lm); strelka(hour,lh); setlinestyle(0,0,1); strelka(ssec,ls);
{временная задержка} delay(d); setcolor(white); setlinestyle(0,0,3); strelka(min,lm); strelka(hour,lh); setlinestyle(0,0,1); strelka(ssec,ls); setfillstyle(solidfill,blue); fillellipse(x0,y0,5,5); {задание нового значения секунд (минут, часов)} ss:=ss+1; if (ss div 60)=1 then begin ss:=0; m:=m+1;end; if (m div 60)=1 then begin m:=0; h:=h+1;end; end; {рисование стрелок по завершении показа анимации – чтобы изображение часов на экране не пропадало} setcolor(blue); setlinestyle(0,0,3); strelka(min,lm); strelka(hour,lh); setlinestyle(0,0,1); strelka(ssec,ls); readln; end.
Анализ результатов моделирования Написанная мной программа выводит на экран компьютера стрелочные часы. Но, чтобы данные часы шли точно, показывали реальное время, необходимо произвести их калибровку. На практике временные интервалы при демонстрации анимации зависят от тактовой частоты работы компьютера, поэтому калибровку данной модели на каждом компьютере приходится осуществлять в ручную. В Delphi существует специальная функция «Timer», считывающая текущее значение времени с таймера компьютера, что дает возможность создания модели часов с точным соответствием времени реальному.
1.Культин Н.Б Turbo Pascal в задачах и примерах. СПб.: BHV, Культин Н.Б Delphi в задачах и примерах. СПб.: BHV, Макарова Н.В. Информатика. Учебник для 7-9 кл. СПб.: Питер, Меженный О.А. Turbo Pascal. M., СПб., Киев: Диалектика, все, что связано с компьютерной графикой, обработкой изображений и мультимедиа Список литературы