Реферат: Модуль Graph в программе Turbo Pascal
End.
Окружности, эллипсы и дуги
Для изображения окружностей используется процедура
Circle(x, у: Integer; Radius: Word)
Здесь (X,Y) - координаты центра окружности, Radius - ее радиус. Результатом ее работы будет окружность, если коэффициент изображения соответствует принятому BGI-драйвером для текущего графического режима. В противном случае на экране появится эллипс, вытянутый по вертикали (коэффициент сжатия больше принятого по умолчанию) или по горизонтали (коэффициент меньше принятого).
В модуле Graph представлены процедуры рисования эллипсов, дуг, секторов и процедура, позволяющая рисовать сектор, залитый по заданному шаблону. Все они запрашивают параметры StartAngle и EndAngle, которые обозначают начальный и конечный угол дуги. На рисунке изображена система графических координат, в которой мы работаем.
Положительное направление оси X (слева направо) принято за 0°, отрицательное направление оси Y - за 90°, т.е. углы отмеряются от положительного направления оси X против часовой стрелки. Все значения этих параметров даются в градусах.
Ниже перечислены процедуры рассматриваемого класса:
Рисование дуги радиуса Radius из центра с координатами (X,Y) от угла StartAngle до EndAngle:
Arc(X, Y: Integer; StartAngle, EndAngle, Radius: Word)
При изменении коэффициента сжатия изображения вид выводимых дуг будет отличаться от правильных окружностей.
Рисование эллиптической дуги с аналогичными параметрами:
Ellipse (X, Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word)
где XRadius и YRadius - размеры горизонтальной и вертикальной полуосей соответственно. Оси эллипса могут быть только параллельны осям X и Y. Для изображения полного эллипса надо задавать углы 0° и 360°. Значение коэффициента сжатия изображение не влияет на его вид.
Угловые параметры очень неудобны для нашей системы координат - мы можем определить координаты начала и конца дуг окружности или эллипса не иначе, как только используя известные тригонометрические выражения. Но в подобных вычислениях нет необходимости, поскольку эти координаты все равно известны внутри процедур Arc, Ellips, Sector и PieSlice.
Извлечь концевые координаты дуг позволяет процедура
GetArcCoords (VAR ArcCoords: ArcCoordsType)
Тип ArcCoordsType объявлен в модуле Graph следующим образом:
TYPE
ArcCoordsType = RECORD
X, Y | :Integer; | {центр} |
XStart, YStart | :Integer; | {начало} |
XEnd, YEnd | :Integer; | {конец} |
END;
Рассматриваемая процедура возвращает результаты последнего вызова процедуры рисования дуги или сектора.
Построение прямоугольников и ломаных
Для построения прямоугольника достаточно вызвать процедуру Rectangle (Х1, Y1, Х2, Y2: Integer), которая изобразит на экране прямоугольник с диагональю (X1, Y1) - (X2, Y2). Для рисования квадрата надо выбрать высоту прямоугольника так, чтобы она равнялась произведению ширины на коэффициент сжатия изображения.
Чтобы построить фигуры с большим количеством вершин (в том числе и незамкнутые), можно воспользоваться процедурой
DrawPoly (NumPoints: Word; VAR PolyPoints)
Она позволяет рисовать на экране дисплея любую ломаную, заданную набором координат некоторого множества точек. Это может быть как сложная геометрическая фигура, так и табличная математическая функция. Параметр NumPoints - это количество точек ломаной (заметим, что если необходимо нарисовать замкнутый многоугольник с N вершинами, то значение NumPoints должно быть на единицу больше числа N, а координата (N+1) –й точки должна быть такой же, как координата первой). Под бестиповым параметром PolyPoints понимается какая-либо переменная, состоящая из наборов двухкомпонентных записей. Поля каждой записи должны содержать координаты X-и Y очередной точки. В модуле Graph введен такой тип:
TYPE
PointType=RECORD
X, Y: Integer; {координаты точки}
END;
Обычно набор точек организуется как массив из записей типа PointType (и именно к такой структуре приводится значений параметра PolyPoint при работе процедуры DrawPoly). Пример построения графика функции с помощью процедуры DrawPoly приведен далее.
USES Graph; | {подключен модуль Graph } |
{$I initgraf.pas} | {процедура инициализации} |
CONST | |
Pi * 3.14151828; | {константа Pi (замещает функцию)} |
Pi2 = 2 * Pi; | {различные производные от Pi...} |
Pi001 = 0.01* Pi; | |
VAR | |
angle: Real; | |
sine_func: Array [1.201] of PointType ; | { массив точек} |
maxy, i: Integer; | |
BEGIN | |
Grlnit; | {инициализация графики} |
maxy := GetMaxY div 2; | {середина экрана по оси Y} |
angle := 0.0; | {задание стартовых значений} |
i := 0; | { счетчик точек в sine_func} |
repeat | { цикл заполнения sine_func } |
Inc ( i ); | |
sine_func[i].x:= Round (100 * angle) + 10; | |
sine_func[i].y:= Round (100 * Sin (angle)) + maxy; | |
angle := angle + Pi001; | |
until angle > Pi2; | |
DrawPoly (i, sine_func) ; | { рисование графика синуса} |
ReadLn; | {пауза до нажатия ввода} |
CloseGraph | {закрытие графики} |
END. |
С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при передаваемом массиве номер n первого рассматриваемого элемента (т.е. точки), а в первом параметре — количество рассматриваемых точек, начиная с n-й, например
DrawPoly (20, sine_func [100]);
Такой вызов выведет ломаную линию по точкам с номерами 100, 101,..., 119.
При выводе количества точек, соизмеримого со значением GetMaxX, и при несплошном стиле линии может оказаться, что шаг между соседними точками соответствует ширине пробела между пунктиром. В итоге линия может вообще не проявиться на экране. Надо либо уменьшить число точек, либо избрать сплошной тип линии.
Управление цветами и шаблонами заливки (заполнения)
Рассмотрим процедуры, управляющие цветовой гаммой изображения на дисплее, что не только определяет степень разборчивости и привлекательности изображения, но и в конечном итоге может влиять на физиологическое состояние пользователя.
Задание типа заливки
В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным «узором» любую замкнутую область изображения. Вид «узора» задается так называемым шаблоном заливки. В Турбо Паскале предопределен ряд стандартных шаблонов, но кроме того, имеется возможность конструировать собственные.
Назначение шаблона заполнения (заливки) производится процедурой
SetFillStyle (Pattern: Word; Color: Word)
где параметр Pattern определяет вид шаблона заливки, a Color — его цвет. Все разрешенные значения параметра Pattern предопределены в модуле Graph в виде констант:
CONST
EmptyFill | =0 | { сплошная заливка цветом фона} |
SolidFill | =1 | { сплошная заливка текущим цветом} |
LineFill | =2 | { заливка типа ===} |
LtSlashFill | =3 | { заливка типа ///} |
SlashFill | =4 | { заливка жирными линиями типа ///} |
BkSlashFill | =5 | { заливка жирными линиями типа \\\} |
LtBkSlashFill | =6 | { заливка типа \\\} |
HatchFill | =7 | { заливка редкой штриховкой} |
XHatchFill | =8 | { заливка частой штриховкой} |
InterleaveFill | =9 | { заливка прерывистой линией} |
WideDotFill | =10 | { заливка редкими точками} |
CloseDotFill | =11 | { заливка частыми точками} |
UserFill | =12 | { заливка, определенная программистом} |
Константа UserFill используется для определения типа заливки, который предварительно был задан в программе. Для задания своего нового шаблона необходимо воспользоваться процедурой
SetFillPattern (PattMatrix: FillPatternType; Color: Word)
передав ей в параметре PattMatrix матрицу шаблона заливки и указав цвет параметром Color. Эта процедура по действию аналогична SetFillStyle, но устанавливает только «самодельные» шаблоны. Процедура SetFillStyle удобнее, особенно в приложениях деловой графики (гистограммы, круговые диаграммы и т.п.). Задавая хотя бы раз новый шаблон, мы автоматически связываем его со значением UserFill и далее можем манипулировать всеми тринадцатью шаблонами. Если же задать UserFill, не определив перед этим новый шаблон, то функция GraphResult возвратит значение -11 (grError) и все установки вида шаблона и цвета останутся прежними. По умолчанию устанавливается шаблон SolidFill и цвет с. номером, максимальным для текущего графического режима.
В обеих процедурах назначения шаблона переменная Color определяет цвет, которым исполняется шаблон. Цвет фона при этом остается неизменным.
{ Демонстрация стандартных типов штриховки }
Program FillStDem;
Uses CRT,Graph;
Var
d,r,e,i,j,x,y : integer;
Begin
d:=Detect;
InitGraph(d,r,'');
e:=GraphResult;
if e<>grOk then
writeln(GraphErrorMsg(e))
else
begin
SetGraphMode(0);
x:=GetMaxX div 9;
y:=GetMaxY div 7;
for j:=0 to 2 do
for i:=0 to 3 do
begin
Rectangle((2*i)*x,(2*j+1)*y,
(2*i+1)*x,(2*j+2)*y);
SetFillStyle(i+j*4,j+1);
Bar((2*i)*x+1,(2*j+1)*y+1,
(2*i+1)*x-1,(2*j+2)*y-1);
end;
readln;
CloseGraph;
end
End.
Заливка областей изображения
Рассмотрим процедуры, непосредственно реализующие заливку. Имеется целый ряд процедур, рисующих графические фигуры и сразу же заполняющих их по заданному шаблону. Первая них — процедура
Bar (X1, Y1, X2, Y2: Integer)
рисует прямоугольник, внутренняя область которого залита по текущему шаблону. Она обычно используется в деловой графике для строения столбчатых диаграмм. Параметры (X1,Y1) и (X2, Y2) - координаты верхнего левого и правого нижнего углов прямоугольника. Еще более наглядное представление информации при рисовании диаграмм позволяет получить процедура
Bar3D (X1, Y1, X2, Y2: Integer; D3: Word; Top: Boolean)
Она рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону, а глубина задается в пикселах параметром D3. Параметр Тор задает режим отображения верхней плоскости: True - отображать, False - не отображать. Этот параметр необходим для того, чтобы можно было рисовать столбцы, стоящие друг на друге. В модуле Graph определены две константы для нее:
CONST
TopOn = True; | {верхняя плоскость нужна} |
TopOff = False; | {верхняя плоскость не нужна} |
{ Построение параллелепипеда }
Program Bar3Dem;
Uses CRT,Graph;
Var
d,r,e : integer;
Begin
d:=Detect;
InitGraph(d,r,'');
e:=GraphResult;
if e<>grOk then
writeln(GraphErrorMsg(e))
else
begin
Bar3d( 80,100,120,180,15,TopOn);
Bar3d(150,150,190,180,15,TopOff);
Bar3d(230, 50,250,150,15,TopOn);
Bar3d(220,150,260,180,15,TopOn);
Bar3d(300,150,340,180,15,TopOff);
Bar3d(300, 50,340,150,15,TopOn);
readln;
CloseGraph;
end
End.
Следующие «заполняющие» процедуры работают с секторами окружностей и эллипсов. Рисование сектора эллипса, который будет залит цветом по текущему шаблону, осуществляется процедурой
Sector (X, Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word)
Параметры процедуры имеют тот же смысл, что и в процедурах Arc, Ellipse. для задания кругового сектора надо задавать YRadius с учетом коэффициента сжатия: