Аналоговые часы 3

 Имитация часового циферблата. Для наглядности темп хода ускорен в 600 раз (см. оператор Delay 100)

Uses Graph, CRT;
   var
       d,r,r1,r2,rr,k,
       x1,y1,x2,y2,x01,y01: Integer;
       Xasp,Yasp : Word;

begin
  {Инициируем графику}
     d := detect;
     InitGraph(d, r, ' ') ;
     k:= GraphResult;
     if k <> grOK then  WriteLn(GraphErrorMSG(k))
  else
begin
{Определяем отношение сторон и размеры экрана}
x1 := GetMaxX div 2;
y1 := GetMaxY div 2;
GetAspectRatio(Xasp, Yasp);

{Вычисляем радиусы:}
 r:= round(3*GetMaxY*Yasp/8/Xasp);
 r1 := round(0.9*r); {Часовые деления}
 r2 := round(0.95*r); {Минутные деления}

{Изображаем циферблат}
 Circle(x1,y1,r); {Первая внешняя окружность}
 Circle(x1,y1,round(1.02*r)); {Вторая окружность}
 
 for k := 0 to 59 do {Деления циферблата}
    begin
       if k mod 5=0 then
           rr := r1 {Часовые деления}
      else
           rr:= r2 ; {Минутные деления}

{Определяем координаты концов делений}
 x01 := x1+Round(rr*sin(2*pi*k/60));
 y01 := y1-Round(rr*Xasp*cos(2*pi*k/60)/Yasp);
 x2 := x1+Round(r*sin(2*pi*k/60));
 y2 := y1-Round(r*Xasp*cos(2*pi*k/60)/Yasp);
 Line(x01,y01,x2,y2) {Выводим деление}
end;

{Готовим вывод стрелок}
 SetWriteMode(XORPut);
 SetLineStyle(SolidLn,0,ThickWidth);
 r := 0; {Счетчик минут в одном часе}

{Цикл вывода стрелок}
 repeat
   for k := 0 to 59 do {k = минуты}
      if not KeyPressed then
         begin
                {Координаты часовой стрелки}
                x2 := x1+Round(0.85*r1*sin(2*pi*r/60/12));
                y2 := y1-Round(0.85*r1*Xasp*cos(2*pi*r/60/12)/Yasp);

                {Координаты минутной стрелки}
                x01:= x1+Round(r2*sin(2*pi*k/60));
                y01:= y1-Round(r2*Xasp*cos(2*pi*k/60)/Yasp);

                {Изображаем стрелки}
                 Line(x1,y1,x2,y2);
                 Line(x1,y1,x01,y01);
                 Delay(100); {Для имитации реального темпа
                                      нужно установить задержку 60000}
                                     {Для удаления стрелок выводим их еще раз!}
                 Line(x1,y1,x01,y01);
                 Line (x1,y1,x01,y01 ) ;

{Наращиваем и корректируем счетчик минут в часе}
inc(r);
if r=12*60  then
 r := 0
end
until KeyPressed;
if ReadKey=#0 then k:=ord(ReadKey);
CloseGraph;
end
end.

автор В.В. Фаронов Turbo Pascal 7.0 Начальный курс Учебное пособие

Комментариев нет:

Отправить комментарий

Если у вас интересные исходники и вы не прочь поделиться, то присылайте daslex@yandex.ru с указанием Темы: Графика Паскаль
К вашей работе будет прикреплено ваше авторство и по желанию добавлена ссылка на ваш сайт.
На одну страницу - Одна работа. На одну работу - Одна ссылка + указание автора


Основное требование - это один файл .pas без сторонних модулей (только с родными. предпочтение Graph).
Можно использовать ассемблерные вставки.

Все что Запускается у меня и работает, я выкладываю. в этом блоге.
Яндекс.Метрика