Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр.на_ЯВУ_уч.пос.DOC
Скачиваний:
24
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

§9.6. Графический режим монитора

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

В настоящее время используются самые разнообразные видеоадаптеры, поддерживающие несколько режимов работы монитора, стандартными из которых считаются:

VGA (Video Graphics Array) с максимальным разрешением 640х480 точек (пикселов);

SVGA (Super VGA) — 800x600;

1024x768:

1280x1024;

1600x1200 и другие.

Более того, в каждом режиме можно отображать разное количество цветов, что существенно зависит от объема видеопамяти. При работе с 16-ю цветами каждая точка занимает полбайта, с 256 — 1 байт, в режиме High Color (более 65 тыс. цветов) — 2 байта, в режиме True Color (более 16 млн. цветов) — 3 байта.

В модуле Graph поддерживается только режим VGA. Здесь можно задавать только 16 цветов, но три варианта точек по вертикали: 200, 350 и 480, которые задаются режимами: VGALo=0,VGAMed=1, VGAHi=2. Для управления режимом VGA необходимо подключать специальный драйвер, находящийся в файле EGAVGA.BGI (Borland Graphic Interface).

Если программа запускается из DOS, то графический режим надо инициализировать, задав драйвер и его режим в процедуре инициализации:

InitGraph (< драйвер >,< режим >,< путь к драйверу >);

например:

D:=VGA;

R:=VGAHi;

InitGraph (D,R,’’);

Аналогично для восстановления текстового режима используется процедура

CloseGraph;

Удобнее автоматически распознавать используемый адаптер процедурой

DetectGraph (<драйвер>,<режим>);

например

DetectGraph (D,R);

InitGraph (D,R,’’);

В графическом режиме курсор отсутствует. Его функции выполняет невидимый текущий указатель CP (Current Pointer), выполняющий аналогичные функции. Для его перемещения используется процедура

MoveTo (X,Y:Integer);

причем Х для режима Hi может изменяться в диапазоне от 1 до 640, а Y — от 1 до 480.

Для перемещения указателя относительно его последнего положения используется процедура

MoveRel (dX,dY:Integer);

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

SetColor (Color:Word);

SetBkColor (Color:Word);

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

SetFillStyle (Pattern:Word; Color:Word);

где Pattern определяет стиль заполнения.

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

Пример построения столбцовой диаграммы двух функций.

Program Diagram;

{ Демонстрационный пример на использование модуля Graph:

столбцовая диаграмма функций F1 и F2 }

Uses Crt,Graph;

Const

xmin:real=0.05; { Начальные значения аргумента }

xmax:real=1;

step:real=0.05;

Var x, { текущее значение аргумента }

Fmin,Fmax:real;

stdiag, { ширина большого прямоугольника }

xdiag, { текущая точка диаграммы }

rezim,razm:integer; { режим и разрешение монитора }

stng:string; { временная переменная для преобразования

числовых данных при выводе }

Function F1(x:real):real;

Begin

F1:=exp(-x)*sin(x)

end;

Function F2(x:real):real;

Begin

F2:=exp(-sqrt(x))*cos(x);

end;

Begin

{ Поиск экстремумов функции }

x:=xmin;

Fmin:=F1(x);

Fmax:=Fmin;

Repeat

if F1(x)>Fmax then Fmax:=F1(x);

if F2(x)>Fmax then Fmax:=F2(x);

if F1(x)<Fmin then Fmin:=F1(x);

if F2(x)<Fmin then Fmin:=F2(x);

x:=x+step;

until x>xmax;

{ Контроль за масштабом шкалы ординат }

Writeln('min=',Fmin:8:5,' max=',Fmax:8:5);

Read(Fmin,Fmax);

{ Установка графического режима и цветов }

DetectGraph(rezim,razm);

InitGraph(rezim,razm,'');

SetBkColor(Black);

SetColor(White);

{ Заголовок диаграммы }

OutTextXY(220,20,'Диаграмма двух функций');

{ Координатные линии }

Line(44,50,44,451);

Line(44,451,595,451);

{ Масштабы по X иY - числовые значения }

Str(xmin:4:2,stng);

OutTextXY(44,460,stng);

Str(xmax:4:2,stng);

OutTextXY(570,460,stng);

Str(Fmax:4:2,stng);

OutTextXY(1,50,stng);

Str(Fmin:4:2,stng);

OutTextXY(1,445,stng);

{ Определение расстояния между столбцами }

stdiag:=round(500/((xmax-xmin)/step));

x:=xmin;

xdiag:=45;

{ Вывод в цикле по два столбца }

Repeat

{ F1 - широкий и зеленый столбец }

SetFillStyle(SolidFill,Green);

Bar(xdiag,450,xdiag+stdiag-2,round(450-400*(F1(x)-Fmin)/(Fmax-Fmin)));

{ F2 - красный и узкий столбец }

SetFillStyle(SolidFill,Red);

Bar(xdiag+round(stdiag/4),450,

xdiag+round(stdiag/4*3)-2,round(450-400*(F2(x)-Fmin)/(Fmax-Fmin)));

x:=x+step;

xdiag:=xdiag+stdiag;

until x>xmax;

{ Индицируем результат, пока не будет нажата какая либо клавиша }

Repeat

until KeyPressed;

{ Выход из графического режима }

CloseGraph

end.