Скачиваний:
52
Добавлен:
02.05.2014
Размер:
601.05 Кб
Скачать

24

угольника, имеющего равные (в пикселях) горизонтальную и вертикальную стороны, не приводит к получению на экране квадрата.

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

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

SetAspectRatio (xAsp, yAsp: word)

Она устанавливает новое значение коэффициента сжатия, которое будет использоваться при выводе геометрических примитивов — прямоугольников, дуг, окружностей, эллипсов. Аргумент xAsp отображает в условных единицах ширину пикселя на экране, yAsp — высоту пикселя.

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

7 РАБОТА С ФРАГМЕНТАМИ ИЗОБРАЖЕНИЯ

Специальные процедуры модуля Graph позволяют сохранять и восстанавливать отдельные фрагменты изображения на экране. При работе с буфером всегда важно знать размер памяти, необходимой для сохранения образа фраг-

мента. Для этого служит функция ImageSize (XI, Yl, X2, Y2: Integer):Word;

Параметры XI, Yl, X2 и Y2 определяют прямоугольную область экрана. Функция ImageSize определяет число байт, необходимых функции GetImage для сохранения заданной области экрана. Размер двоичного образа области экрана включает в себя память размером в несколько слов. В первом слове хранится ширина области, а во втором — высота.

Так как для хранения фрагмента удобнее всего использовать динамическую область памяти, то результат работы ImageSize целесообразно применять в качестве входной информации для процедуры GetMem, которая выделяет указанный объем памяти в динамической области.

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

GetImage (XI, Yl, X2, Y2: Integer; var BitMap);

Параметры XI, Yl, X2, Y2 определяют прямоугольную область экрана. Параметр BitMap является нетипизированным параметром, который должен быть больше или равен 6, плюс размер памяти, отведенный для области экрана. Первые два слова параметра BitMap используются для хранения ширины и высоты

25

области экрана, третье слово свободное. Оставшаяся часть параметра BitMap используется для сохранения самого двоичного образа. Для определения размера памяти, необходимой для параметра BitMap, следует использовать функцию ImageSize. Размер сохраняемого изображения не должен превышать 64 Кбайта.

Процедура PutImage (X, Y:integer; var bitmap; Oper :word) - выводит из буфера на экран двоичный образ заданной области экрана. Точка с координатами (X,Y) определяет верхний левый угол прямоугольной области экрана. Параметр BitMap является нетипизированным параметром, который определяет ширину и высоту области экрана. Параметр Ореr определяет способ взаимодействия вновь размещаемой копии с уже имеющимся на экране изображением. Взаимодействие осуществляется путем применения кодируемых этим параметром логических операций к каждому биту копии и изображения. Для указания применяемой логической операции можно использовать одну из следующих предварительно определенных констант.

CONST

CopyPut = 0; { замена существующего изображения на копию } XORPut = 1; { исключительное ИЛИ }

ORPut = 2; { объединительное ИЛИ } ANDPut = 3; { логическое И }

NOTPut = 4; { инверсия изображения }

Наиболее часто используются операции CopyPut, XORPut, NOTPut. Первая из них просто стирает часть экрана и на это место помещает копию из памяти в том виде, как она там сохраняется. Операция NOTPut делает то же самое, но копия выводится в инверсном виде. Операция XORPut, примененная к тому же месту экрана, откуда была получена копия, сотрет эту часть экрана. Если операцию применить дважды к одному и тому же участку, вид изображения на экране не изменится. Таким способом можно перемещать изображения по экрану, создавая иллюзию движения.

В примере демонстрируется использование операций сохранения и отображения области экрана с различными режимами вывода.

Пример : работа с фрагментами изображения

USES Graph; VAR

Driver, Mode : INTEGER;

Size: WORD;

{ размер области }

X1, Y1 : WORD;

{ координаты начальной точки }

p: POINTER;

{ указатель на область }

BEGIN

 

Driver:=Detect; InitGraph(Driver, Mode, '');

IF GraphResult<>0 THEN HALT(1); { построение исходной фигуры } SetFillStyle(SolidFill, LightRed);

PieSlice(GetMaxX div 2, GetMaxY div 2, 0, 360, 100); ReadLn;

26

X1:= GetMaxX DIV 2 - 100;

Y1:= GetMaxY DIV 2- 100; Size:=ImageSize(X1,Y1,X1+200,Y1+200);

{выделение памяти для области } GetMem(p,Size);

{сохранение указанной области в памяти } GetImage(X1,Y1,X1+200,Y1+200,p^); ClearDevice;

SetBkColor(Blue);

{отображение области в режиме копирования } PutImage(X1,Y1,p^,CopyPut);

ReadLn;

{отображение области в режиме XOR }

{изображение удаляется с экрана } PutImage(X1,Y1,p^,XORPut); ReadLn;

CloseGraph;

END.

8 ПРИМЕР ИСПОЛЬЗОВАНИЯ ГРАФИКИ

Пример программы, которая в текстовом режиме запрашивает значения десяти параметров и строит по ним столбиковую диаграмму (гистограмму) в

графическом режиме.

 

program Dem_Gra;

{Построение столбиковой диаграммы}

uses Crt, Graph;

 

const Count=10;

 

Width =40;

{Ширина столбца диаграммы}

var

 

I,X1,X2,Y1,Y2 : integer; M : array[1..Count] of byte;

DriverVar, ModeVar: integer; S_M : string;

begin

Writeln('Ввод данных (целые числа) для построения диаграммы'); for I:=l to Count do

begin

repeat {Ввод с контролем, входит ли введенное значение в [1..10]} Write('Введите значение' , I, '-го параметра (от 1 до 10) :'); Readln(M[I]) ;

if not M[I] in [1..10] {Если введенное значение не входит в ин-

тервал [1..10]}

then Writeln('Значение параметра должно быть от 1 до 10'); until M[I] in [1..10];

end;

27

 

 

DriverVar:=Detect;

{Инициализация графического режима}

InitGraph(DriverVar,ModeVar,'');

 

SetViewPort(10,10,630,400,True);

{Создать окно}

SetTextStyle(DefaultFont,HorizDir,1);

 

Yl:=325;

{Построение гистограммы}

for I:=l to Count do

{Повторять, пока не построим все столбики}

begin

 

 

XI:=I*50;

 

 

Str(M[I],S_M) ;

{Преобразовать значение М[1] в строку для вы-

 

вода в графическом режиме на экран}

SetFillStyle(I,I);

{Задать стиль и цвет заполнения}

Bar3D(Xl,Yl,Xl+Width,Yl-M[I]*30,10,TopOn); {Построить столбико-

вую диаграмму}

 

 

OutTextXY (X1+15,Y1-M[I]*3O-15,S_M);

{Напечатать над столбиком

значение отображаемой величины}

 

end;

{Конец цикла}

{Вывод пояснительных надписей} SetTextStyle(DefaultFont,HorizDir,2); OutTextXY(150,20,'Пример гистограммы'); SetTextStyle(DefaultFont,VertDir,1); OutTextXY(40,175,'Величина параметра'); SetTextStyle(DefaultFont,HorizDir,1); OutTextXY(250,GetMaxY-140,'Параметры'); OutTextXY(150,GetMaxY-100,'Для завершения нажмите Enter'); Readln;

CloseGraph;

end.

В результате работы программы получаем гистограмму, изображенной на рис.2.

Соседние файлы в папке Методичка - Borland Pascal 7.0