РАБОТА С ФРАГМЕНТАМИ ИЗОБРАЖЕНИЯ
SetAspectRatio.
GetAspectRatio
Коэффициент сжатия.
Установка цвета и стиля.
Атрибуты графических фигур
Функция SetFillStyle (Pattern:word; Color:word) устанавливает маску Pattern (Таблица 9) и ее цвет Color, т.е. определяет стиль заполнения.
Получить информацию о задействованном стиле (о коде маски и цвета) можно с помощью процедуры GetFillSettings (var Inf: FillSettingsType).
Таблица 9
Стандартные стили заполнения
Константа | Значение | Маска |
EmptyFill | Заполнение цветом фона | |
SohdFill | Заполнение текущим цветом | |
LineFill | Заполнение символами —, цвет — color | |
LtslashFill | Заполнение символами // нормальной толщины, цвет — color | |
SlashFill | Заполнение символами // удвоенной толщины, цвет — color | |
BkslashFill | Заполнение символами \\ удвоенной толщины, цвет — color | |
LtbkSlashFill | Заполнение символами \\ нормальной толщины, цвет — color | |
HatchFill | Заполнение вертикально-горизонтальной штриховкой тонкими линиями, цвет-color | |
XhatchFill | Заполнение штриховкой крест-накрест по диагонали "редкими" тонкими линиями, цвет-color | |
InterLeaveFill | Заполнение штриховкой крест-накрест по диагонали "частыми" тонкими линиями, цвет — color | |
WideDotFill | Заполнение "редкими" точками | |
CloseDotFill | Заполнение "частыми" точками | |
UserFill | Заполнение по определенной пользователем маске заполнения, цвет— color |
aspect ratio
Для определения размера памяти, необходимой для сохранения образа фрагмента служит функция 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
ПРИЛОЖЕНИЕ