Для завершения работы с графикой и выхода в текстовый режим используется процедура CloseGraph.
Система координат при работе с графикой имеет начало (точку (0,0)) в левом верхнем углу экрана. Ось x направлена вправо, ось y – вниз. Очевидно, что все точки экрана имеют целочисленные координаты.
При построении простейших элементов изображений используются следующие процедуры и функции:
Название
Назначение
PutPixel(x,y: integer; c: word);
Поставить точку (x,y), используя цвет c. Значение цвета обычно меняется от 0 до 15, вместо номера цвета можно употреблять цветовые константы модуля Graph.
SetColor(c: word);
Установить текущий цвет для рисования отрезков, окружностей и т. п. Все линии после употребления этого оператора будут рисоваться установленным цветом.
SetBkColor(c: word);
Установить текущий цвет для фона (то есть цвет всего экрана).
GetMaxX; GetMaxY;
Эти функции возвращают максимальные допустимые значения координат x и y, соответственно.
Line(x1,y1,x2,y2: integer);
Рисовать отрезок из (x1,y1) в (x2,y2) текущим цветом.
Rectangle(x1,y1,x2,y2: integer);
Рисует текущим цветом прямоугольник, левый угол которого – (x1,y1), а правый нижний – (x2,y2).
Circle(x,y: integer; r: word);
Рисует текущим цветом окружность с центром в точке (x,y) радиуса r.
Arc (x,y: integer; a1,a2,r: word);
Рисует дугу окружности. a1 и a2 – начальный и конечный углы (в градусах), соответственно. Угол отсчитывается традиционно, против часовой стрелки, угол величиной 0° соответствует лучу y=0, x>0.
Ellipse(x,y: integer; a1,a2,xr,yr: word);
Рисует дугу эллипса с полуосями xr и yr от угла a1 до a2.
DrawPoly(n: word; P);
Рисует многоугольник, количество сторон в котором – n, а информация о вершинах хранится в нетипизированном параметре P. В качестве P удобнее всего использовать массив из записей, каждая из которых содержит поля x,y: integer;
MoveTo(x,y: integer);
Эта процедура опирается на понятие текущей позиции. Она «запоминает» позицию (x,y) на экране, а в дальнейшем из этой позиции можно рисовать отрезки.
LineTo(x,y: integer);
Рисует отрезок из текущей позиции в точку (x,y). При этом текущая позиция перемещается в конец нарисованного отрезка.
MoveRel(dx,dy: integer);
Перемещает текущий указатель из прежнего положения (x,y) в точку (x+dx,y+dy).
LineRel(dx,dy: integer);
То же, что и предыдущая процедура, но при перемещении рисует отрезок от (x,y) до (x+dx,y+dy).
GetX; GetY;
Возвращают координаты текущего указателя (по отдельности).
ClearDevice;
Очищает экран.
Все приведённые выше процедуры для рисования выполняют только контурные рисунки (не закрашивая прямоугольник, окружность или эллипс внутри). По умолчанию рисование происходит с использованием тонкой сплошной линии, однако толщину и вид линии можно менять с помощью процедуры SetLineStyle(style,pattern,width: word). Рассмотрим назначение параметров этой процедуры.
1. style – вид линии. Здесь удобно задавать не конкретные числа, а константы: SolidLn, DottedLn, CenterLn, DashedLn, UserBitLn. Первая обозначает сплошную линию, следующие три – разные виды прерывистых линий, последняя – линию, вид которой определяется пользователем (см. ниже).
2. pattern – образец для вида линии, определяемого пользователем. Этот параметр вступает в действие лишь тогда, когда в предыдущем указано UserBitLn. Образец – это фрагмент линии, заданный в виде числа. Переход от конкретного фрагмента к числу выполняется, например, так:
Удобнее всего переводить полученное число в шестнадцатеричный вид, в нашем примере получится $999C. При изображении линии закодированный нами фрагмент будет повторяться столько раз, сколько нужно.
3. width – толщина линии. Можно использовать числа, однако определены 2 константы: NormWidth и ThickWidth (нормальная и толстая линии).
Перейдём теперь к рисованию закрашенных фигур. По умолчанию внутренняя область фигуры будет закрашиваться белым цветом, причём закраска будет сплошной. Для управления цветом и видом закраски используется процедура SetFillStyle(style, color: word); Также как и для стиля линии, для style предусмотрены константы: EmptyFill, SolidFill, LineFill, LtSlashFill, SlashFill, BkSlashFill, LtBkSlashFill, HatchFill, XHatchFill, InterleaveFill, WideDotFill, CloseDotFill, UserFill. Первая обозначает отсутствие закраски, вторая – сплошную, последующие – различные специфические виды закраски, самая последняя – закраску, задаваемую пользователем. Чтобы задать пользовательский образец закраски, нужно использовать процедуру SetFillPattern(Pattern: FillPatternType; Color: Word); FillPatternType определяется как array[1..8] of byte, каждый элемент массива кодирует одну строчку образца закраски (как и для линий), а всего таких строчек 8. В результате закраска выполняется с помощью одинаковых квадратиков 8x8.
Ниже приводятся процедуры рисования закрашенных фигур.
Название
Назначение
Bar(x1,y1,x2,y2: integer);
Рисует закрашенный прямоугольник.
FillEllipse(x,y: integer; xr,yr: word);
Закрашенный эллипс.
FillPoly(n: word; P);
Закрашенный многоугольник.
PieSlice(x,y: integer; a1,a2,r: word);
Закрашенный круговой сектор.
Sector (x,y: integer; a1,a2,xr,yr: word);
Закрашивает эллиптический сектор.
FloodFill(x,y: integer; Cborder: word);
Выливает краску в точку (x,y), откуда она растекается во все стороны, пока не достигнет границы цвета Cborder. Если такой границы нет или она незамкнута, то краска может залить весь экран.