Смекни!
smekni.com

НН Трушин Информатика (стр. 27 из 37)

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

Таблица 6.15 Процедуры и функции рисования кистью

MoveTo(x,y) Перемещает кисть в точку с координатами(х,у), ничего не рисуя
MoveRel(dx,dy) Перемещает кисть в точку, отстоящую от текущей на dх и dу, ничего не рисуя
LineTo(x,y) Проводит линию из текущей точки в точку с координатами(х,у)
LineRel(dx,dy) Проводит линию из текущей точки в точку, отстоящую от текущей на dх и dу
GetX Возвращает текущую координату кисти по координате х
GetY Возвращает текущую координату кисти по координате y

Процедуры MoveRel и LineRel используют относительную систему координат, поэтому координаты в них могут указываться и со знаком "минус".

Рисование окружностей на экране монитора сопряжено со следующей трудностью. При любом разрешении экрана число точек по вертикали и по горизонтали не равно друг другу и подбирается таким образом, чтобы каждая точка выглядела квадратиком. Поэтому окружности и дуги будут искажаться и выглядеть эллипсами. То же самое справедливо и при рисовании любых объектов с равными размерами по осям X и Y, например, квадратов. Для разрешения данной проблемы предусмотрены процедура

GetAspectRatio(xa,ya), которая записывает текущее соотношение сторон экрана в переменные xa и ya типа Word, и процедура SetAspectRatio(xa,ya), которая для всех последующих процедур рисования окружностей и дуг учитывает соотношение сторон. Поэтому, если в программе рисуются окружности или дуги, в ее начале должны присутствовать следующие операторы:

VAR Xasp,Yasp: Word;

. . .

GetAspectRatio(Xasp,Yasp);

SetAspectRatio(Xasp,Yasp);

6.11.3.5. Процедуры заливки

Процедура SetColor(цвет) не определяет ни цвет, ни вид заливки (сплошная, штриховкой, точками). Характер заливки графического объекта задается с помощью процедуры SetFillStyle(p,c), где c – цвет закрашивания, p – константа вида заполнения. Возможные варианты заливки и соответствующие им константы представлены в табл. 6.16.

Таблица 6.16

Варианты заливки графических объектов

EmptyFill LtSlashFill LtBkSlashFill InterleaveFill
SolidFill SlashFill HatchFill WideDotFill
. . . . . . . . . . . . . . .

.

LineFill BkSlashFill XhatchFill CloseDotFill
. . . . . . . . . . . . . . . . . . . . .

. . .

У заливаемых объектов сохраняется цвет контура, который определяется процедурой SetColor. Очевидно, что процедуры SetFillStyle и SetColor должны выполняться до соответствующих процедур рисования.

С помощью процедуры FillEllipse легко нарисовать закрашенную окружность, если а=b. Процедура FloodFill предназначена для закраски произвольных замкнутых областей. Достаточно указать координаты любой точки внутри области и цвет границы области. Если область незамкнутая, то закраска распространится на весь экран. Отметим, что заливка произвольной области выполняется достаточно медленно, поэтому этой процедурой рекомендуется пользоваться в исключительных случаях. Перечень процедур заливки представлен в табл. 6.17.

В некоторых случаях при закраске областей со сложным контуром при помощи процедуры FloodFill возникает сообщение о нехватке памяти. В этом случае можно увеличить размер видеобуфера с помощью процедуры SetGraphBufSize(размер), причем эта процедура должна быть выполнена до вызова процедуры InitGraph. Например, выделить дополнительные 8

Кбайт памяти под видеобуфер можно таким образом: SetGraphBufSize(1024*8).

6.11.3.6. Вывод текста

В графическом режиме возможен вывод текстовых сообщений. В BGIграфике реализована достаточно сложная система работы с текстом, основанная на векторных шрифтах, образы которых хранятся в файлах с расширением *.chr. Проблема при этом состоит в том, что в системе программирования Turbo Pascal шрифты не содержат русских букв. Как выход из положения можно использовать растровый системный шрифт формата 88, являющийся копией текущего шрифта операционной системы. Если на компьютере работает программа поддержки русского алфавита в текстовых и графических режимах работы видеоадаптера, то выводимый текст будет содержать русские буквы.

Таблица 6.17 Процедуры заливки графических объектов

Bar(x1,y1,x2,y2) Рисует закрашенный прямоугольник с концами диагонали в точках с координатами(x1,y1) и (x2,y2).

Bar3D(x1,y1,x2,y2, depth,top)

Рисует закрашенный объемный прямоугольник с концами диагонали в точках с координатами(x1,y1) и

(x2,y2) и глубиной цвета depth. Если top=True, верхняя грань закрашивается, если top=False – нет.

FillEllipse(x,y,a,b) Рисует закрашенный эллипс с центром в точке с координатами(x,y) и полуосями длиной a и b.
PieSlice(x,y,a1,a2,r)

Рисует закрашенный круговой сектор с центром в точке (x,y), начальным углом a1, конечным углом a2 и

радиусом r

FloodFill(x,y,c) Закрашивает замкнутую область с цветом границы c, начиная с точки с координатами(x,y)

Тип шрифта задается процедурой SetTextStyle(f,d,s), где f – константа выбора шрифта; d – направление вывода шрифта (HorizDir – слева направо, VertDir – снизу вверх); s – размер шрифта (целое число от 0 до 4). Константа f может принимать значения, которые приведены в табл. 6.18.

Вывод текста в графическом режиме производится с помощью процедур OutText(s) и OutTextXY(x,y,s), где s – выводимая текстовая строка; x, y – координаты точки привязки. Процедура OutText выводит текст в точке нахождения кисти.

Точка привязки текстовой строки зависит от способа выравнивания текста, задаваемого процедурой SetTextJustify(j). Если представить текст, вписанным в прямоугольник, то возможные варианты привязки текста зависят от значения константы j (табл. 6.19).

Таблица 6.18 Константы шрифтов модуля Graph

Константа Тип шрифта Образец шрифта
DefaultFont Системный шрифт 88
TriplexFont

Шрифт

trip.chr

SmallFont

Шрифт

litt.chr

SansSerifFont

Шрифт

sans.chr

GothicFont

Шрифт

goth.chr

Таблица 6.19 Константы привязки текста

Горизонтальный текст Вертикальный текст
LeftText Левый верхний угол BottomText Правый нижний угол
CenterText Центр CenterText Центр
RightText Правый нижний угол TopText Левый верхний угол

6.11.3.7. Управление видеостраницами

Видеопамять адаптера типа VGA делится на видеостраницы. Видеостраница содержит двоичный образ изображения, выводимого на экран монитора. При этом видеостраница, которая содержит информацию, отображаемую на экране монитора в текущий момент времени, называется активной, или видимой. Остальные видеостраницы, информация из которых не видна на экране, являются пассивными, или скрытыми. В пассивных видеостраницах можно заранее подготовить изображение и вывести его при подстановке скрытой видеостраницы вместо видимой. Для направления всего вывода на какую-либо видеостраницу используется процедура SetActivePage(n), где n – номер видеостраницы (0 или 1). Процедура SetActivePage(1) направляет весь вывод на скрытую страницу. Для переключения видеостраниц есть процедура SetVisualPage(n), которая устанавливает номер видимой страницы. Вызов SetVisualPage(1) сделает изображение из скрытой видеостраницы видимым, причем все изображение появится сразу и практически мгновенно.

Процесс работы с видеостраницами в общем виде можно представить следующим образом:

SetVisualPage(0); {На экране видим видеостраницу 0}
SetActivePage(1); . . . {Рисуем на видеостранице 1}

{Рисуем картинку, на экране ничего не происходит} . . .

SetVisualPage(1); {На экране видим страницу 1}

6.11.3.8. Работа с палитрой цветов

Существующие в BGI-графике 15 экранных цветов можно изменять, присваивая каждому цвету конкретный оттенок. Можно сделать, например, цвет White не белым, а розовым или зеленоватым. При этом набор из 15 произвольных цветов называется палитрой. Эффект от смены палитры состоит в том, что результат немедленно будет виден на экране для уже нарисованных объектов, что позволяет даже с 15 цветами добиться эффекта плавного изменения цвета.

Оттенок каждого из 15 цветов палитры устанавливается процедурой SetRGBPalette(n,r,g,b), где n – номер изменяемого цвета (от 0 до 15); r, g, b – относительное количество красного, зеленого и синего цветов соответственно в получаемом оттенке (значения от 0 до 255). Равные значения r, g, b дают оттенки серого цвета.

В следующем примере красный прямоугольник на экране плавно "выцветает" за счет уменьшения доли красного цвета в палитре с 255 до 0.