Графические возможности TurboPascal 7.0 — страница 11

  • Просмотров 6220
  • Скачиваний 578
  • Размер файла 3666
    Кб

экране имитируется вид часового циферблата (рис. 14.3). Для наглядной демонстрации темп хода «часов» ускорен в 600 раз (см. оператор Delау (100)). При желании Вы сможете легко усложнить программу, связав ее пока­зания с системными часами и добавив секундную стрелку. Для выхода из программы нажмите на любую клавишу. Uses Graph, CRT; Var d, r, rl,r2,rr,k,Xl,yl,x2,y2,x01,y01: Integer, Xasp,Yasp : Word; begin {Инициируем графику} d:= detect; InitGraph(d, r, ''); k:= GraphResult; if k <> grOK then

WriteLn(GraphErrorMSG(к)) else begin {Определяем отношение сторон и размеры экрана} xl:= GetMaxX div 2; yl:= GetMaxY div 2; GetAspectRatio(Xasp, Yasp); {Вычисляем радиусы:} r:=round(3*GetMaxY*Yasp/8/Xasp); rl:=round(0.9*r);{Часовые деления} r2:=round(0.95*г); {Минутные деления} {Изображаем циферблат} Circle(xl,yl,г); {Первая внешняя окружность} Circle(xl,yl,round(1.02*г)); {Вторая окружность} for к := 0 to 59 do {Деления циферблата} begin if к mod 5=0 then rr:=rl {Часовые деления} else rr:=r2; {Минутные деления} {Определяем координаты концов делений} х01:=

xl+Round(rr*sin(2*pi*k/60)); у01:= yl-Round(rr*Xasp*cos(2*pi*k/60)/Yasp); x2 := xl+Round(r*sin(2*pi*k/60)) ; y2 := yl-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 к := 0 to 59 do {k = минуты} if not KeyPressed then begin {Координаты часовой стрелки} x2 := xl+Round(0.85*rl*sin(2*pi*r/60/12)); y2 := yl-Round(0.85*rl*Xasp*COs(2*pi*r/60/12)/Yasp); {Координаты минутной стрелки} х01 := xl+Round(r2*sin(2*pi*k/60)); yOl := yl-Round(r2*Xasp*cos(2*pi*k/60)/Yasp);

{Изображаем стрелки} Line(xl,yl,x2,y2); Line(xl,yl,x01,y01); Delay(100); {Для имитации реального темпа нужно установить задержку 60000} {Для удаления стрелок выводим их еще раз!} Line(xl,yl,х01,yOl); Line(xl,yl,x2,y2) ;{Наращиваем и корректируем счетчик минут в часе}; Inc(r); if r=12*60 then r := О end until KeyPressed; if ReadKey=#0 then k:=ord(ReadKey) ; CloseGraph end end. 5. Многоугольники Процедура Rectangle. Вычерчивает прямоугольник с указанными координатами углов. Заголовок: Procedure Rectangle(XI,Yl,Х2,Y2: Integer); Здесь X1...Y2 -

координаты левого верхнего (XI, Y1) и правого нижнего (Х2, Y2) углов прямоугольника. Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля линий. В следующем примере на экране вычерчиваются 10 вложенных друг в друга пря­моугольников. Uses Graph, CRT; Var d,r,e,xl,yl,x2,y2,dx,dy: Integer; begin {Инициируем графику} d := Detect; InitGraph(d, r, ''); e := GraphResult; if e <> grOK then WriteLn(GraphErrorMsg(e)) else begin {Определяем приращения сторон} dx := GetMaxX div 20; dy := GetMaxY div 20;

{Чертим вложенные прямоугольники} for d := 0 to 9 do Rectangle(d*dx,d*dy,GetMaxX-d*dx,GetMaxY-d*dy); if ReadKey=#0 then d:=ord(ReadKey); CloseGraph end j end. Процедура DrawPoly. Вычерчивает произвольную ломаную линию, заданную координатами точек излома. Procedure DrawPoly(N: Word; var Points) Здесь N - количество точек излома, включая обе крайние точки; Points - перемен­ная типа PointType, содержащая координаты точек излома. Координаты точек излома задаются парой значений типа Word: первое определяет