Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Лекции по Паскалю2 / Иллюстрации к Лекции 8 по информатике.doc
Скачиваний:
28
Добавлен:
02.05.2014
Размер:
1.4 Mб
Скачать

Атрибуты графических фигур Установка цвета и стиля.

Функция SetFillStyle (Pattern:word; Color:word) устанавливает маску Pattern (Таблица 9) и ее цвет Color, т.е. определяет стиль заполнения.

Получить информацию о задействованном стиле (о коде маски и цвета) можно с помощью процедуры GetFillSettings (var Inf: FillSettingsType).

Таблица 9

Стандартные стили заполнения

Константа

Значение

Маска

EmptyFill

0

Заполнение цветом фона

SohdFill

1

Заполнение текущим цветом

LineFill

2

Заполнение символами —, цвет — color

LtslashFill

3

Заполнение символами // нормальной толщины, цвет — color

SlashFill

4

Заполнение символами // удвоенной толщины, цвет — color

BkslashFill

5

Заполнение символами \\ удвоенной толщины, цвет — color

LtbkSlashFill

6

Заполнение символами \\ нормальной толщины, цвет — color

HatchFill

7

Заполнение вертикально-горизонтальной штриховкой тонкими линиями, цвет-color

XhatchFill

8

Заполнение штриховкой крест-накрест по диагонали "редкими" тонкими линиями, цвет-color

InterLeaveFill

9

Заполнение штриховкой крест-накрест по диагонали "частыми" тонкими линиями, цвет — color

WideDotFill

10

Заполнение "редкими" точками

CloseDotFill

11

Заполнение "частыми" точками

UserFill

12

Заполнение по определенной пользователем маске заполнения, цвет— color

Коэффициент сжатия.

aspect ratio

GetAspectRatio

SetAspectRatio.

8.6. Работа с фрагментами изображения

Для определения размера памяти, необходимой для сохранения образа фрагмента служит функция ImageSize (XI, Yl, X2, Y2: Integer):Word, байт.

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

GetImage (XI, Yl, x2, y2: Integer; var BitMap);

Параметры XI, Yl, X2, Y2 определяют прямоугольную область экрана.

Процедура PutImage (X, Y:integer; var bitmap; Oper :word) - выводит из буфера на экран двоичный образ заданной области экрана.

Фрагмент 7.

Точка с координатами (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;

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;

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.

Подробнее – в МУ «ГРАФИКА В PASCAL-ПРОГРАММАХ».

Рис. 2