Основы программирования (947332), страница 47
Текст из файла (страница 47)
Процедура Pieslice (х, у, stangle, endangle, radius:word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному). Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.19. Процедура Ellipse (х, у, stangle, endangle, radiusX, radiusY: word) рисует эллипс или его дугу.275Часть 1. Основы алгоритмизации и процедурное программирование20. Процедура Sector (х, у, stangle, endangle, radiusX, radiusY: word) рисует заштрихованный эллипс или его сектор.21. Процедура FillEllipse (х, у, radiusX, radiusY: word) - рисует заштрихованный эллипс.Процедуры и функции управления текстом. Текст в графическом режиме можЛ^ быть выведен процедурами Write и WriteLn, но при этом управление выполняется аналогично текстовому режиму.
Специально для работыс текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции.1. Процедура SetTextStyle(font,direction,charsize:word) - устанавливаеттекущий шрифт font, направление вывода строки direction и размер шрифтаcharsize.Для установки шрифта используют специальные константы:DefaultFont=^0;TriplexFont=l;SmallFont=2;SanserifFont=3;GothicFont=4;{обычный}{полужирн ы й}{м ел ки й}{п ря мой}{готический}Направление вывода может быть либо горизонтальным, либо вертикальным:HorizDir-0;VertDir=l;{горизонтальное направление}{вертикальное направление}Размер шрифта указывается значением, на которое необходимо умножить исходный размер шрифта (8x8 точек). Таким образом, шрифт можноувеличивать в целое число раз.2.
Процедура SetTextJustify(horiz, vert :word) - устанавливает способ выравнивания для горизонтального goriz и вертикального vert направлений вывода. Способ выравнивания определяется относительно некоторой точки спомощью специальных констант:LeftText=0;CenterText=l;{точка слева от текста}{точка по центру текста при горизонтальном направлении вывода}RightText=2;{точка справа от текста}BottomText=0; {точка под текстом}CenterText=l; {точка по центру текста при вертикальном направлении вывода}TopText=2;{точка над текстом}3. Функция TextHeight(st:string):word - возвращает высоту строки st вточках.2768. Управление техническими средствами и взаимодействие с MS DOS4.
Функция TextWidth(st:string):word - возвращает ширину строки st вточках.5. Процедура OutText (sUstring) - выводит строку, выравнивая ее заданным способом относительно текущей точки.6. Процедура OutTextXY(x,y:word; sUstring) - выводит строку st, выравнивая ее в соответствии с установленными режимами вертикального и горизонтального выравнивания относительно точки (х, у).Процедуры управления окнами, страницами.
Помимо управленияцветом, рисования примитивов и вывода текстов модуль Graph содержит специальные процедуры управления окнами и страницами.1. Процедура ClearDevice - очищает экран.2. Процедура SetVlewPort (х1, у1, х2, y2:word; clip:boolean) - устанавливает окно. Параметры xl, у1, х2, у2 определяют размеры окна, а параметрclip - будут ли видимы фрагменты рисунка, вышедшие за границы окна.3. Процедура GetViewSettings(Var mn:ViewPortType) - возвращает параметры последнего окна через параметр-переменную win типа ViewPortType:Туре ViewPortType^ recordxl,yl,x2,y2:word; {координаты}Clip:boolean; {отсечение}end;...4. Процедура ClearViewPort - очищает окно, связывая все точки этогоокна с О регистром палитры.5. Процедура SetActivePage(pageNumber:word) - переключает активнуюстраницу - делает активной страницу с указанным номером pageNumber.
Наактивной странице строится нужное изображение, в то время как высвечиваться продолжает прежняя страница. Когда изображение готово, осуществляют переключение видимости страниц и появляется новое изображение.6. Процедура SetVisualPage(pageNumber:word) - переключает видимость страниц.Например:SetVisualPage(O): {установили видимой О страницу}SetActivePage(l); {установили активной 1 страницу}Rectangle(10, 60, 30, 80); {вывели прямоугольник}Readln;{убедились, что он не видим}SetVisiialPage(l); {установили видимой 1 страницупрямоугольник стал видимым}Процедуры и функции создания движущихся изображений. МодульGraph предоставляет некоторые ресурсы для создания движущихся изображений.277Часть L Основы алгоритмизации и процедурное программирование1.
Процедура GetImage(xl,ylyx2yy2:word;varp:pointer) - сохраняет в памяти прямоугольный фрагмент изображения. Параметры х1,у1,х2,у2 определяют прямоугольник. Параметр р должен содержать адрес буфера в памяти,куда копируется изображение. Размер этого буфера определяется с помощьюспециальной функции ImageSize.2. Функция ImageSize(xl,yl,x2,y2:word):wordвозвращает размер буфера, необходимого для сохранения прямоугольного фрагмента изображения.3. Процедура PutImage(x,y:word; var p:pointer; bitblt:word) - выводитсохраненное изображение на экран в прямоугольную область с координатами верхнего левого угла (х, у). Параметр р должен содержать адрес буфера.Способ наложения bitbit определяется специальными константами:NormalPut=0;XorPut=l;OrPut=2;AndPut=3;NotPut=4';{наложение со стиранием}{побитное «исключающее или»}{побитное «или»}{побитное «и»}{побитное «не»}Так, если цвет точки был розовым (12 = 1IOO2) и на нее накладываетсяточка того же цвета (12 = 1IOO2), то при разных способах наложения и стандартной палитре мы получимNormalPut - 1100 - точка розового цвета;XorPut - 0000 - точка черного цвета (цвета фона);OrPut - 1100 - точка розового цвета;AndPut - 1100 - точка розового цвета;NotPut - 0011 - точка голубого цвета.Буфер под образ обычно размещается в динамической памяти.
Например:Size:= ImageSize(0A99,99);GetMem(p,Size); {выделяем память под буфер для сохранения изображения}х:=0;у:=0;Pieslice(50,50,0J60J7); {рисуем закрашенный круг}Getlmage(0,0,99,99,p^); {сохраняем изображение в памяти}repeatPutImage(x,y,p^yO); {выводим изображение на экран, стираниевыполняется чистым краем образа}delay (] 00);{задержка}х:=х+3;у:=у+1;2788, Управление техническими средствами и взаимодействие с MS Duntil x>getmaxx'50; {выход по достижении конца экрана}FreeMemfp, Size);{освобождаем динамический буфер}8.6. Практикум* Построение графиков и диаграммРезультаты решения многих задач целесообразно представлять в видеграфиков. Задачи построения графиков существенно различаются по исходной постановке.
Так, может потребоваться график одной функции или сразунескольких функций в одном или различных масштабах. Функции могутбыть заданы аналитически или таблично, причем при табличном задании может потребоваться интерполяция функции. График может строиться в обычном или логарифмическом масштабе, включать или нет координатную сетку,включать или нет оси координат и т.п. Однако основные принципы построения графиков при этом остаются неизменными.Для построения графика функции необходимо каждой точке графика поставить в соответствие точку на экране. Координаты точки на экране определяются относительно координат области графика с учетом масштаба и того,что ось Оу экрана направлена вниз (рис. 8.6).Масштабы по осям х н у рассчитывают исходя из интервалов возможных значений и размеров области графика на экране:кхк - кхпniy -•^к " ^1кУк - купУтах " Утшгде кХд, куп, kxj^, kyj^ - координаты области окна графика на экране; Ущах»ii Уmax/"^оminXп\i\Рис.
8.6. Определение координат точек графика:а - фафик; б - его отображение в окне на экране279Часть L Основы алгоритмизации и процедурное программированиеУт1п ~ максимальное и минимальное значения функции на заданном интергвале; Х], Xj^ - первое и последнее значения аргумента, входящие в заданныйинтервал.Координаты точек графика рассчитывают следующим образом:kxj = 1 (Xj - Х|) X т^^ Г + кХр ,^У\ = 1 (Утах - yj) X т у Г + ку^,,где 1 Г- означает взятие целой части числа.График строится как набор линий или ломаная линия, проходящая черезвсе рассчитанные точки.Расчет координат для построения координатной сетки выполняется аналогично.Рассмотрим построение графика на конкретном примере.Пример 8.5.
Разработать программу, которая строит график функцииy=cos(x+2)/2 в заданном окне с определенным количеством точек на указанном интервале и наносит на график координатную сетку, состоящую из заданного количества вертикальных и горизонтальных линий.Ниже представлен текст программы с подробными комментариями. Длясокращения размера программы все редко изменяемые значения параметровграфика заданы константами.Program Gr;Uses Crt, Graph;Constn=5;{количество позиций на число}т=2; {размер мантиссы при выводе значений}к=100;{количество точек просчета}пх=^5; пу=5;{количество линий сетки по х и у}Ьп=60; кхк=бОО;куп=45; кук^'ЗЗО; {параметры окна}Туре агг = array[1.
.100 ] of real;ari = array[L. 100] of integer;Vargd,gmj:integer; {тип и режим адаптера}X, y:arr;{массивы для значений функции и аргумента}кх, ky:ari;{массивы для координат точек по х и у}ymin, ymax:real; {экстремальные значения у}dx,dy:real;{шаг сетки по х и у на графике}dkx,dky:integer; {шаг сетки по х и у на экране}mx,my:real;{масштабные коэффициенты}st:string[5];{рабочая строка}h хп, хк: real;{шаг, интервал по оси х}2808. Управление техническими средствами и взаимодействие с MS DOSBeginClrScr;Write СВведите начало и конец интервала:');ReadLn(xn,xk);h:=(xk-xn)/(k-l);{определяем шаг по оси х}х[1]: =хп;ymin:=le30;ymax:=-lelO;for i:=] to к do {табулируем функцию и ищем экстремумы}beginyfiJ:=cos(x[iJ+2)/2;if y[i]>ymax then ymax:=y[ij;if y[i]<ymin then ymin:=y[ij;if iolOOthenx[i+]J:=x[iJ+h;end;mx:=(kxk-kxn)/(xfkj'xf]j);{определяем масштаб по оси х}my:=(kyk-kyn)/(ymax-yminj; {определяем масштаб по оси у}for i:=J to к do{определяем координаты точек}beginkxfij: =round{(xfiJ'X[lJ) *тх) +кхп;kyfij: =round((ymax-y[iJ) *ту) +куп;end;gd: =detect;InitGraph(gd,gm, "); {инициализируем графический режим}SetColor(4);{текущий цвет - красный}OutTextXY( 180,20, T=cos(x-^2J/2'); {выводим заголовок}SetColor(17);{цвет рисования - голубой}SetBKColor(7);{на сером фоне}Rectangle(кхп,куп,кхккук);{рисуем прямоугольник для выводаграфика}SetColor(4);{текущий цвет ~ красный}for i:=l to к-1 do{выводим график}Line (kx[i],ky[i],kx[i+l],ky[i^l]);dkx:='round((kxk'kxn)/nx);{определяем шаг сетки по х}dky:=round((kyk'kyn)/ny);{определяем шаг сетки по у}SetColorf] 7);{текущий цвет - светло-синий}for i:=J to пх do{рисуем сетку, параллельную оси х}Line(kxn+dkx*r,kyn,kxn-^dkx*i,kyk);for i:=] to ny do{рисуем сетку, параллельную оси у}Line(kxn,kyk-dky*i,kxk,kyk'dky*i);dx:=(x[kJ'X[]JJ/nx;{определяем шаг для сетки по х}dy:=(ymax-ymin)/ny; {определяем шаг для сетки по у}SetTextJustify(1,2);{выравнивание «по центру снизу»}281Часть 1.
Основы алгоритмизации и процедурное программированиеY = cos(x+2)/20.500.310.12-0.07-0.26-0.462.003.004.005.006.007.00Рис. 8.7. Результат работы программыfor i:=J to пх+1 do{выводим значения аргумента}beginStr((xflJ+dx*(i-])):n:m,st);{преобразуем число в строку}OutTextXY(kxn+dkx*(i'l), kyk+6,st); {вывод значений под линией сетки}end;SetTextJustijy(2J);{выравнивание «слева по центру»}for i:=l to ny+I do{выводим значения функции}beginStr((ymin+dy*(i'l)):n:m,stJ;{преобразуем число в строку}OutTextXY(kxn-6,kyk'dky*(i'l),st); {вывод слева от оси у}end;ReadLn; {ожидаем нажатия ENTER}Closegraph;End.Результатом работы программы является график функции на заданноминтервале изменения аргумента, представленный на рис. 8.7.Помимо графиков для представления результатов также могут использоваться диаграммы и гистограммы различных видов.