скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыРеферат: Модуль Graph в программе Turbo Pascal

VAR

R, А, В: Word; {R - радиус кругового сектора}

BEGIN

GetAspectRatio (А, В);

Sector (100, 100, 0, 90, R, R * Longlnt (A) div В);

END.

Этого же эффекта можно достичь, используя процедуру

PieSlice(X, Y: Integer; StartAngle, EndAngle, Radius: Word)

которая рисует сектор окружности, площадь которого заливается по текущему шаблону заполнения.

процедура

FillEllipse(X, Y: Integer; XRadius, YRadius: Word)

рисует эллипс текущим цветом и заполняет его по установленному шаблону. Параметры этой процедуры имеют такой же смысл, как и параметры процедуры Ellipse.

Заполнение более сложных геометрических фигур, в том числе и неправильной формы, производится процедурой

FillPoly (NumPoints: Word; VAR PolyPoints)

Ее параметры имеют такое же назначение, как и в процедуре DrawPoly. Единственное отличие в том, что координаты первой и последней вершины многоугольника могут не совпадать. Однако все равно они будут соединены линией, и внутренность фигуры будет залита.

USES Graph; {подключен модуль Graph}
{$I initgraf.pas} {процедура инициализации}
CONST  
our_ figure : Array [1..4] of PointType =
( x: 319; y: 40), {Задание координат концов }
( x: 398; y: 146), {отрезков, являющихся сторонами}
( x: 240; у: 146), {геометрической}
( x:400; у: 40)); {фигуры}
BEGIN
Grlnit; { инициализация графики}
SetFiUStyle(InterleaveFill, Red); { задание шаблона }
{ рисование заданной фигуры}
FillPoly( SizeOf(our.figure) div SizeOf( PointType ), our_figure );
ReadLn;
CloseGraph
END.

Функция SizeOf (our_figure) возвращает размер константы our_figure в байтах, a SizeOf (PointType) — размер памяти, занимаемый одним элементом типа PointType. И, наконец, универсальная процедура

FloodFilt(X, Y: Integer; Border: Word)

Она заливает всю область вокруг точки (X,Y), ограниченную линиями цвета Border. Например, если точка (X,Y) находится внутри области, ограниченной окружностью, то вся область будет залита по шаблону и цветом, установленными процедурами SetFillPattern или SetFillStyle. Если же точка будет находиться вне этой области, то залитым будет весь экран за исключением этой области. Если область не замкнута сплошной линией или границами экрана, то по шаблону заполнится весь экран.

Опрос и установка цветов пера и фона

Различные адаптеры поддерживают разное количество цветов, выводимых одновременно на экран в графическом режиме. Но для всех BGI-драйверов оно ограничено диапазоном 0..15. Нумерация и названия цветов совпадают с теми, которые были приведены для текстовых цветов, а имена констант, обозначающих цвета (за исключением Blink), продублированы в модуле Graph.

Максимальный номер цвета, воспринимаемый данным адаптером в текущем графическом режиме, может быть получен при помощи функции

GetMaxColor: Word

На экране всегда различаются цвет фона и цвет пера. Все процедуры изображения фигур, если не содержат в себе явной установки цвета, рисуют эти фигуры цветом пера (как символы в текстовом режиме). Этот цвет устанавливается процедурой

SetColor (Color: Word)

Цвет фона — всегда един в поле экрана. Он может быть изменен процедурой

SetBkColor (Color: Word)

После использования этой процедуры цвет экрана сразу же меняется на заданный. Параметр Color не должен превышать текущее значение GetMaxColor. Цветом фона может быть любой из разрешенных цветов, в том числе и яркий. По умолчанию и при реинициализации графики цвет фона равен 0 (Black), а цвет пера равен значению функции GetMaxColor.

Всегда можно опросить текущие установки цвета.

Функция GetColor : Word возвращает значение текущего цвета пера, а функция GetBkColor: Word возвращает текущий цвет фона.

Управление палитрой

Палитра и ее анализ. Максимальный набор цветов, поддерживаемых одновременно BGI-драйвером, называется палитрой и может состоять из 16 цветов, пронумерованных от 0 до 15 (так будет, например, для графических адаптеров EGA, VGA).

Эти шестнадцать цветов используются по умолчанию в режимах 640x480 для VGA, 640x350, 640x200 и 320x200 для EGA как в текстовом, так и в графическом режимах.

Числа от 0 до 15, которые используются для обозначения цветов, определяют цветовые атрибуты или, как их еще называют, «программные» цвета. Каждому программному цвету присваивается «аппаратный» цвет из так называемой полной палитры. Например, для адаптера EGA, выводящего одновременно до 16 цветов, программные цвета выбираются из полной палитры в 64 цвета, имеющейся в этом адаптере. А в адаптере VGA аппаратная палитра содержит 256 цветов. Для управления соответствием между программными и аппаратными цветами в модуле Graph предусмотрен ряд процедур, охватывающих практически все возможные операции с палитрой.

Рассмотрим процедуры, с помощью которых можно получить системную информацию о ней. В модуле Graph определен тип для описания палитры:

CONST

MaxColors = 15; {максимальный программный номер цвета}

TYPE PaletteType=RECORD

Size  : Byte; {размер программной палитры}
Colors: Array [0..MaxColors] of Shortlnt;

END;

Поле Size содержит количество цветов в палитре, а поле Colors содержит действующие цвета в первых Size элементах массива. Процедуры GetPalette и GetDefaultPalette возвращают в фактических параметрах значение типа PaletteType:

GetDefaultPalette (VAR Palette: PaletteType);

GetPalette (VAR Palette: PaletteType);

Они отличаются друг от друга тем, что первая процедура возвращает набор цветов, который устанавливается при инициализации графического режима, т.е. по умолчанию, а вторая процедура возвращает текущий набор цветов.

Функция GetPaletteSize: Word

возвращает результат типа Word, который показывает, какое количество цветов входит в текущую программную палитру. В принципе, эта функция возвращает значение, равное GetMaxColor+1.

Установка палитры. Для установки палитры в модуле Graph представлены три процедуры разной сложности. Процедура

SetPalette (ColorNum: Word; Color: Shortlnt)

управляет только одним цветом в палитре. ColorNum - это номер программного цвета, Color - номер аппаратного цвета, который будет под ним пониматься.

Например, вызов SetPalette(0, Red) делает красный цвет первым цветом палитры. Параметр Color может превышать максимальный программный номер цвета, но только на адаптерах EGA (0..63) и VGA. При некорректном вызове процедуры функция GraphResult вернет значение grError.

Битовые графические операции

Опрос пикселов. Турбо Паскаль позволяет организовать прямой доступ к каждому пикселу экрана с помощью функции

GetPixel(X,Y: Integer).

Эта функция возвращает значение типа Word- номер цвета пиксела с координатами (X, Y). Поскольку обычно номер цвета лежит в диапазоне 0..15, значащим является только младший байт.

Управление пикселами заключается в возможности назначить цвет любому пикселу экрана. Процедура

PutPixel ( X, Y: integer; Color: Word ); зажигает на экране в точке с координатами X, Y пиксел цвета Color.

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

Память видеоадаптеров разделена на так называемые страницы, или видеостраницы. По умолчанию в графическом режиме действия производятся с нулевой страницей, поэтому практически во всех предыдущих примерах было видно, как рисуются на экране фигуры. Однако если направить вывод изображений на ненулевую страницу (при условии, что такая доступна в текущем режиме видеоадаптера, то на экране ничего не отобразится, поскольку по умолчанию видимой является нулевая страница. Если же после этого дать команду считать видимой «скрытую» страницу, то она появится на экране буквально мгновенно (конкретно: за один прямой проход луча в кинескопе). Проделать все это позволяют две процедуры:

SetVisualPage (Page: Word)

которая устанавливает «видимой» на экране видеостраницу номер Page, и процедура

SetActivePage (Page: Word)

устанавливающая перенаправление всех графических операций на страницу номер Page (т.е. делающая активной). Активность не тождественна видимости страницы на экране.

Рассмотрим пример использования этих процедур.

(* Пример только для адаптеров EGA и VGA!!! *)


USES Graph, CRT; {используется Graph и CRT}
{$I initgraf.pas} {процедура инициализации}
PROCEDURE Forms (kadr: Byte); {рисование кадров 0..3}
CONST
Radius: Array [0..3] of Integer = (20, 40, 60, 60);
VAR
r, rr : Integer; { радиусы эллипсов в кадрах }
BEGIN
r:= Radius[kadr]; {максимальный радиус}
rr := 0; { радиус вложенного эллипса }
repeat
Ellipse(GetMaxX div 2,GetMaxY div 2,0,360,r,rr);
Inc( rr, 5 ) ;
until rr>=r;
END;
PROCEDURE AnimEGAVGA; {процедура смены кадров}
CONST ms = 60; {задержка между кадрами, мс}
VAR i: Byte; {параметр циклов смены}
BEGIN
repeat { цикл до нажатия клавиши...}
for i:=0 to 3 do begin { Смена видеостраниц: прямо }
SetVisualPage (i);  
Delay( ms );
end;
for i:=3 downto 0 do begin { ... и обратно }
SetVisualPage( i );  
Delay( ms );
end;
until KeyPressed; { условие окончания показа }
END;
VAR  (* ОСНОВНАЯ ЧАСТЬ ПРИМЕРА *)
i: Byte; { параметр (номер кадра)}
BEGIN  
Grlnit; {инициализация графики }
SetGraphMode (EGALo); {режим EGA, 640x200, 4 стр.}
for i:=3 downto 0 do begin { Цикл заполнения страниц}
SetVisualPage (Succ (i) mod 4); {Видим "пустоту “}
SetActivePage(i); {и готовим кадр}
Forms( i ) {рисунок кадра}
end; {for}
AnimEGAVGA; {начало оживления кадров}
CloseGraph
END.

Здесь показано использование процедур SetActivePage и SetVisualPage для алгоритма «кадровой» мультипликации. Особенность ее заключается в том, что все кадры (здесь их четыре) сначала записываются на соответствующие страницы, а затем производится последовательное переключение отображения страниц на дисплей процедурой SetVisualPage.

Графические окна

В системе BGI-графики вводится термин «viewport». Специальный словарь дает следующее разъяснение: «вьюпорт - это область просмотра, окно экрана, в компьютерной графике - часть пространства отображения, в которой изображается и просматривается часть моделируемого объекта». Мы будем использовать термин «графическое окно». При образовании графического окна получается как бы «экран в экране» заданного размера. В модуле Graph для описания графического окна объявлен следующий тип и две константы:

TYPE ViewPortType = RECORD

X1, Y1, X2, Y2: Integer ; { границы окна}
Clip: Boolean; {режим отсечения)

END;

CONST

ClipOn = True; { отсечение по границе окна включено}
ClipOff = False; { отсечение по границе окна выключено}

Здесь первые элементы записи — это координаты прямоугольной области (графического окна), как их принято задавать, a Clip — это параметр, указывающий графической системе, что делать с изображением, попавшим за пределы этой области. Clip может принимать два значения. Значение ClipOn указывает на то, что все элементы изображения обрезаются по границам графического окна, a ClipOff указывает на то, что все рисуется без изменений.

Объявление графического окна производится процедурой

SetViewPort (Х1, Y1, Х2, Y2: Integer; ClipMode: Boolean)

входные параметры соответствуют полям записи типа ViewPortType. После выполнения этой процедуры все текущие установки станут относиться к окну. Текущий указатель (графический курсор) установится в его левый верхний угол, и туда же переносится начало системы координат дисплея. Другими словами, мы получим локальну систему координат устройства. Если параметры процедудуры заданы неправильно, то функция GraphResult возвратит ошибку grError (-11).

Назначение графического окна можно использовать для перемещения начала системы координат. Так, если задать окно вызовом

SetViewPort (GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY, ClipOff);

то получим систему координат с началом в центре экрана. При этом станет «видимой» адресация отрицательных координат. Графическое окно не меняет масштаба системы координат, а лишь выбирает систему отсчета адресуемых пикселов. Для опроса текущих параметров графического окна служит процедура

GetViewSettings {VAR ViewSettings: ViewPortType)

Если воспользоваться ею сразу же после инициализации графического режима, то обнаружится, что графическим окном является весь экран. Это говорит о том, что для системы безразлично, какое графическое устройство отображает результат, поскольку графическое окно представляет собой некоторый универсальный интерфейс между графической программной системой и графическим устройством вывода.

Для очистки рабочего пространства графического окна в модуле Graph существует специальная процедура

ClearViewPort

Она работает следующим образом:

1.         устанавливает цвет заполнения равный текущему цвету фона;

2.         вызывает процедуру Ваг с теми же значениями координат; что и у процедуры SetViewPort, вызванной перед этим;

3.         перемещает текущий указатель в точку (0,0) .

{ Иллюстрация дейсвия режима "отсечка" }

Program ClipOn_Off;

Uses Graph;

Var d,e,r:integer;

Const

x11=0; y11=40; x12=120; y12=85;

x21=200; y21=y11; x22=320; y22=y12;

Begin

d:=Detect; InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

writeln(GraphErrorMsg(e))

else

begin

writeln(' ClipOn: ClipOff');

Rectangle(x11,y11,x12,y12);

Rectangle(x21,y21,x22,y22);

SetViewPort(x11,y11,x12,y12,ClipOn);

Circle(20,20,60);

SetViewPort(x21,y21,x22,y22,ClipOff);

Circle(20,20,60);

readln;

CloseGraph;

end

End.

Вывод текста

Вывод текста в графическом режиме имеет ряд отличий от подобных действий в текстовом режиме. Основное отличие состоит в том, что все действия производятся только со строковыми константами и переменными. Вся числовая информация должна предварительно преобразовываться в строковую процедурой Str . Другое отличие - в том, что можно использовать различные шрифты.

Выбор шрифта и стиля

В комплектах поставки пакета Турбо Паскаль есть файлы с расширением .CHR. Это набор штриховых шрифтов, которые могут быть использованы для вывода информации. Поскольку они построены не матричным способом (как сделаны стандартные шрифты для текстового режима), а векторным, становятся возможными манипуляции размерами шрифтов без потери качества их изображения.

Всего с пакетом Турбо Паскаль поставляется четыре шрифта (хотя можно, используя отдельный специальный пакет, самостоятельно расширить их набор). Кроме того, доступен системный матричный шрифт 8x8 для графических режимов (всегда доступны символы с ASCII-кодами от 0 до 127 и символы с кодами от 128 до 255 при условии, что их матрицы загружены в память ПЭВМ). Для обозначения этих пяти шрифтов введены константы:

CONST


DefaultFont = 0; { матричный шрифт 8x8 (по умолчанию)}
TriplexFont = 1; { полужирный шрифт}
SmallFont = 2; { светлый шрифт (тонкое начертание)}
SansSerifFont = 3; { книжная гарнитура (рубленый шрифт)}
GothicFont = 4; { готический шрифт}

DefaultFont - это матричный шрифт 8x8. Если не принимать никаких действий по смене шрифта, то будет принят именно он.

Активизация любого из названных шрифтов осуществляется процедурой

SetTextStyle (Font, Direction: Word; CharSize: Word)

Здесь параметр Font - номер шрифта (например, одна из описанных выше констант), Direction - расположение текста (по умолчанию принимается горизонтальное). Возможны лишь две ориентации текста, обозначенные константами:

CONST

HorizDir = 0; { горизонтальная, слева направо}
VertDir =1; { вертикальная, снизу вверх}

При значении Direction, равном VertDir, все символы будут повернуты против часовой стрелки на 90° и выводятся снизу вверх. Если задать Direction=2, то буквы будут повернуты так же, как и при Direction=VertDir, но вывод строки будет производиться горизонтально, слева направо.

Размер каждого символа устанавливается параметром CharSize, диапазон изменения которого составляет от 1 до 10. Стандартное значение CharSize для матричного шрифта 8x8 равно единице, а для штриховых шрифтов - четырем.

При каждом вызове процедурой SetTextStyle какого-либо шрифта он читается с диска и загружается в память.

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

GraphResult Смысл значения
0 Успешное выполнение операции
-8 Файл CHR не найден
-9 Не хватает памяти для загрузки выбранногошрифта
-11 Ошибка графики
-12 Ошибка ввода-вывода графики
-13 Неправильное содержимое файла шрифта
-14 Неправильный номер шрифта

{Демонстрация шрифтов}

Program SetStDem;

Uses Graph;

const

text : array[1..4] of string[14]=

('TripLexFont','SmallFont','SansSerifFont','GothicFont');

s4=', size 4';

s5=' and 5';

Var

d,r,e,i:integer;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

writeln(GraphErrorMsg(e))

else

begin

SetTextStyle(DefaultFont,HorizDir,1);

OutText('DefaultFont, size 1');

SetTextStyle(0,0,2);

OutText(' and 2');

for i:=1 to 4 do begin

SetTextStyle(i,0,4);

Moveto(10,i*40);

OutText(text[i]+s4);

SetTextStyle(i,0,5);

Outtext(s5);

end;

for i:=1 to 4 do begin

SetTextStyle(i,1,4);

Moveto(GetMaxX div 2+i*40-20,0);

OutText(text[i]);

end;

readln;

CloseGraph;

end

End.

Непосредственный вывод строк

Для вывода текста есть две процедуры. Первая —OutText (TextString: String) выводит на графический экран строку TextString, ориентированную относительно позиции текущего указателя, а вторая OutTextXY (X, Y: Integer; TextString: String} выводит строку, ориентированную относительно координат (X,Y). Шрифт предварительно может быть установлен вызовом SetTextStyle (по умолчанию принимается DefaultFont). Рассмотрим ориентировку строки относительно стартовой точки. Существует несколько вариантов ориентировки. Они задаются процедурой SetTextJustify (Horizontal, Vertical: Word), параметры которой могут принимать одно из трех объявленных в модуле Graph значений:

CONST

{ — Для горизонтального ориентирования (Horizontal) —}
LeftText =0; {координата X задает левый край строки}
Center-Text = 1; {координата X задает середину строки}
RightText = 2; {координата X задает правый край строки}
{ — Для вертикального ориентирования (Vertical): —}
BottomText = 0; {координата Y задает нижний край строки}
CenterText = 1; {координата Y задает середину строки}
TopText = 2; {координата Y задает верхний край}

Эта процедура позволяет ориентировать выводимую строку относительно стартовой координаты по установленной схеме. По умолчанию параметры ориентировки соответствуют LeftText, TopText.


Страницы: 1, 2, 3, 4, 5


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.