Графика в Турбо Паскале

В отличие от уже знакомого текстового режима, экран в графическом режиме разбит на большое количество точек, каждая из которых может иметь определённый цвет. Точки считаются одинаковыми и прямоугольными, все они плотно «уложены» на экране, то есть для любой точки можно указать, в какой строке и в каком столбце она находится. Номера строк и столбцов в графическом режиме используются как координаты точки, следовательно, координаты всегда целочисленные. В графическом режиме начало координат находится в левом верхнем углу экрана, ось x направлена вправо, ось y направлена вниз.

Заметим, что существуют разные графические режимы, они отличаются количеством точек по горизонтали и вертикали (разрешением), а также количеством возможных цветов, например: 320x200x16, 640x480x16, 640x200x16, 800x600x256 и т. п.

Все средства для работы с графикой содержаться в стандартном модуле Graph, поэтому его нужно будет упоминать после слова uses.

1. Включение и выключение графического режима.

Для включения графического режима используется процедура InitGraph(driver,mode,path) опишем назначение её параметров:

driver переменная типа integer, в котором задаётся тип видеоадаптера, установленного в компьютере. В модуле определены константы для различных адаптеров, которые избавляют нас от необходимости запоминать числа. Имеются такие константы:  CGA, EGA, EGA64, EGAMono, VGA, MCGA, IBM8514 и т. п. Для нас наиболее важной будет константа detect, при указании которой InitGraph сама подыщет наиболее мощный тип адаптера, совместимый с тем адаптером, который установлен на компьютере.

mode также переменная типа integer, задаёт режим, в котором работает выбранный видеоадаптер (здесь также определены константы). Почти каждый видеоадаптер может работать в нескольких режимах, например, у VGA есть 640x200x16 (VGALo), 640x350x16 (VGAMed), 640x480x16 (VGAHi). Если в первом параметре было указано значение detect, то InitGraph не обращает внимания на mode, а устанавливает наилучший, на её взгляд, режим.

path строковый параметр. Для каждого видеоадаптера (или для группы сходных видеоадаптеров) существует программа-драйвер, с помощью которой модуль Graph общается с видеоадаптером. Такие драйверы хранятся в файлах с расширением «bgi». В параметре path указывается каталог, в котором хранятся драйверы. Если они находятся в текущем каталоге, то этот параметр равен пустой строке.

Обычно для включения графики мы будем использовать InitGraph в таком виде:

 

const gpath = ‘Y:\WIN_APPS\BP\BGI’

var gd,gm: integer;

...

begin

  ...

  gd:=Detect;

  InitGraph(gd,gm,gpath);

  ...

 

Для завершения работы с графикой и выхода в текстовый режим используется процедура CloseGraph.

2. Построение элементарных изображений

Система координат при работе с графикой имеет начало (точку (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. Если такой границы нет или она незамкнута, то краска может залить весь экран.

 

3. Вывод текстовой информации.

Для вывода текста на экран используются две процедуры:

1.   OutText(s: string). Эта процедура выводит строку s начиная с текущей позиции, то есть левый верхний угол выводимой строки находится в текущей позиции (по умолчанию это так). Текущая позиция задаётся, например, с помощью MoveTo.

2.   OutTextXY(x,y: integer; s: string). Используется для вывода строки в конкретной позиции.

Если требуется вывести какие либо числа, то предварительно требуется преобразовать их в строку, например, с помощью процедуры Str.

Пример:

var r: integer;

    s: string;

...............

Str(r,s);

OutTextXY(100,200,’Результат=’+s);

 

Турбо Паскаль позволяет использовать несколько различных шрифтов для вывода текста. Кроме того, можно менять направление вывода текста, а также размер символов. В этих целях используется процедура SetTextStyle(Font, Direction, CharSize : word). Перечислим возможные константы и значения для параметров этой процедуры.

Font (шрифт):

DefaultFont шрифт 8x8 (по умолчанию)

TriplexFont полужирный шрифт

SmallFont тонкий шрифт

SansSerifFont шрифт без засечек

GothicFont готический шрифт.

 Direction (ориентация и направление вывода символов):

0 привычный вывод слева направо

1 снизу вверх (надпись «положена на бок»)

2 слева направо, но «лежачими» буквами.

Size размер шрифта (целые числа от 0 до 10).

 

Другая возможность при работе с текстом это выравнивание его относительно задаваемых координат вывода. Для этого используется процедура SetTextJustify(horiz,wert: word). Horiz указывет как текст расположен относительно заданной позиции по горизонтали, а vert по вертикали. Возможные константы:

для horiz:

LeftText указанная позиция является левым краем строки

CenterText позиция является серединой выводимой строки

RightText правым краем строки;

для vert:

BottomText позиция находится на нижнем крае изображения

CenterText по центру

TopText позиция является верхним краем изображения.