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 указывает на то, что все рисуется без изменений.

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

Дата: 2019-05-29, просмотров: 184.