Увод в компютърната графика



страница1/2
Дата25.08.2016
Размер395.67 Kb.
#7251
  1   2

Стр.


28.09.98 Увод в компютърната графика
1.Определение за компютърна графика – възниква за подобряване на интерфейса между компютъра и човека.

ДЕФ: Съвкупност от методи и средства за преобразуване на данни от графична форма на представяне с помощта на компютър.

2. Области на приложение:

А) Синтез на графични обекти (генерираща КГ) – въз основа на описания и данни се създава графичен образ. Данните могат да постъпват от входно устройство, да бъдат резултат от изчисление или от действие на програма. Графичния образ се създава от елементарни графични елементи (точки, отсечки и др.).

Б) Анализ на графичния образ (разпознаване на образи). От графичното изображение може да се получи формално описание. Графичното изображение може да постъпва като фото-копие, образ от видеокамера или вече растеризирано изображение. Трябва да намерим елементарни обекти, от които да създадем изображението. Пр.: Разпознаване на букви от ръкописен текст.

В) Обработка на графични образи (обработка на изображения) – при зададено графично изображение трябва да се получи ново с променени характеристики. Целта е да се подобри възприятието на образа от човека. Използват се методи за филтриране на образа, за увеличаване на контраста, за премахване на шума.

3. Технологии на КГ

3.1. Модели на изображението – начин за съхраняване на информация за изображението. За графични модели информация се съхранява за точки от модела, а не за целия модел.

3.1.1 Текст

ASCII (8-битов) код: основен и горен (разширен) регистри; 28 кодови комбинации Unicode (16-битов): включва ASCII като подмножество от всичките 216 кодови комбинации (... японска и корейска азбуки).

3.1.2. Графика

Пиксел - точка върху отпечатана страница или екрана.Атрибути на пиксела (описание за яркостта и цвета на всеки пиксел - RGB).

3.1.3. Режими за дисплейване и отпечатване


  • Текстов - с вариране на широчини и броя на редовете.

  • Графичен - точкова графика (bitmap), на всеки пиксел отговаря код

3.1.4. Растерни и векторни модели

3.1.4.1. Битмап - Изображението се описва като масив от пиксели (bitmap) Разделителна способност (определя се от размерите и броя на пикселите) - VGA екран от 640х480 пиксели (307200) изисква 38,4 KB данни в ч/б режим. При 256 цвята (8 бита за пиксел) се изискват 8х38,4 KB.Приложни програми - PaintBrush, Aldus PhotoStyler.

3.1.4.2. Обектно-ориентирана графика

Изображението се описва векторно, още т.нар. обектно-ориентираната графика (отсе

чки, окръжности, многоъгълници и криви).Вектор 320,240 задава пиксел в центъра на VGA екран (640х480).Приложни програми - програми за чертане (CorelDRAW, Micrografx Designer, Aldus Freehand), CAD програми (AutoCAD), текстообработващи редактори и програми за електронни таблици (Microsoft Word, Exel, Lotus 1-2-3).Предимства на векторната графика - малки размери на файловете, хардуерна независимост и описание с помощта на процедурни езици за програмиране.

3.1.5. Хардуерна независимост на моделите на изображенията

Описание на файл, позволяващо изход при максимална разрешаваща способност на устройството (векторната графика е хардуерно независима, а растерната - не).

3. Графични файлови формати - Формати, използващи различни методи за описание (за битмап или векторна графика, с възможност за компресиране)

3.2.1. Битмап файлови формати - TIFF (Tagged Image File Format) на Aldus и Microsoft. TIFF версия 5.0 има 8-битов код на сивото (256 степени), 24-битови цветни изображения и черно-бяло изображение. TIFF файловете обикновено са твърде големи - едно изображение с размери 8,5х11 инча и 24 бита за цвят може да заеме до 6 MB. PCX, създаден за програми PC Paintbrush и Publisher's Paintbrush, поддържа 8-битови степени на сивото и цветове.

3.2.2. Обектно-ориентирани формати - PostScript на Adobe за PageMaker на Aldus, за Macintosh, LazerWriter CGM (Computer Graphics Metafile), използван в програми за чертане (Harvard Graphics, CorelDRAW, Lotus Freelance, Arts & Letters и Micrografx Designer), програми за планиране на страници (Ventura Publisher и Aldus PageMaker), текстообработва

щи програми (WordPerfect и Word).

3.2.3. Комбинирани битмап и обектно-ориентирани формати - EPSF (Encapsulated PostScript - капсулиран PostScript) е PostScript текстово описание на графично изображение, придружен от представяне с ниска разделителна способност за извеждане на изображението.

PICT (Macintosh векторен формат), кодиран като команди на QuickDraw (графичен език на Macintosh). Оригиналната спецификация съдържа само черно-бял формат, но могат да бъдат присвоени и 8 стандартни цвята.
Разпространени графични файлови формати

Име Тип Платформа Описание/Приложение

.BIT R PC Bitmap/Собствен формат на Lotus Manuscript

.BMP R Win Bitmap/MS Windows формат

.CGM V PC Computer Graphics Metafile/Използван от програмите Lotus Freelance,

Hardware Graphics, Zenographix's Pixie и Aldus PageMaker

.CLP R Win Clipboard/MS Windows формат

.DCA T All Document Interchange Format/Преносим текстов формат за Lotus 1-2-3,

използван за електронни таблици, бази данни и други програмни продукти

.DOC T PC,Mac Document/Собствен формат на програмата Word на Microsoft,

използван и от други текстообработващи програми

.DRW V Win Draw/Собствен формат на Micrografx

.DXB V PC Двоичен вид на файла .DXF

.DXF R Mac,PC,Sun Data Exchange Format/Разработен от AutoDesk за AutoCAD,

стандартно файлово описание за CAD, повечето Mac пакети се доставят с

транслатори за .DXF формат

.EPS R/V Mac,NeXT,PC,WIN Encapsulated PostScript (Използван от Aldus, Adobe и др.)

Стандартен формат за обектна и растерна графика

.GEM V PC Graphics Environment Manager/Използван от продуктите на Digital

Research иVentura Publisher за обектна графика

.GIF R PC Graphics Interchange Format/Използван от CompuServe за цветна графика

.HPGL V PC Hewlett-Packard Graphics Language (Използван в HP плотери)

.IFF R Amiga Image File Format - Стандартен файлов формат на Commodore Amiga

.IMG R PC Image/Използван от програмите GEM и Ventura Publisher за битмапова

графика

.MAC


.PNT R Mac,PC MacPaint/Използван от PC програми и всички Mac програми за

чертане; някои PC програми използват файлове с разширение .PNT

.PCC R PC ZSoft's Paintbrush Cliboard/Собствен формат на Paintbrush Cliboard

.PCL R/V PC Printer Control Language/Използван от принтери на Hewlett-Packard

LazerJet

.PCX BM PC ZSoft's Paintbrush/Собствен формат на ZSoft's Paintbrush, широко

използван

.PIX R PC Picture/Използват се версии за Inset, при средства за захващане на екрани

и други PC видео средства

.PLT R Mac,PC Plot/Файлов формат за плот на AutoCAD

.PUB R/V/T Mac,PC Publication/Използван от Aldus PageMaker

.RTF T Mac,PC Rich Text Format/Преносим текстов формат на Microsoft

.SLD V Mac,PC Slide/Използван от AutoCAD като собствен формат

.SYLK T Mac,PC Symbolic Link/Преносим текстов формат на Microsoft за електронни

таблици и бази данни

.TGA R Mac,PC Targa/Използван от програмите за екранно захващане Targa

.TIF

.TIFF R Mac,PC,NeXT Tagged Image File Format/Разработен от Aldus и Microsoft,



популярен битмапов формат

.TXT


.TEXT A All Text/ASCII текстов файл, универсален стандарт

.WP T Mac,PC WordPerfect/Използван като собствен формат за WordPerfect (понякога

.WPF)
Използвани означения

R - битмапова или растерна графика;

V - обектно-ориентирана или векторна графика;

T - текст;

A - ASCII;

Mac - Macintosh;

PC - IBM PC и съвместими;

NeXT - Компютри NeXT;

Amiga - Компютри Commodore Amiga;

Sun - Компютри Sun;

WIN - Microsoft Windows;

All - Всички видове микрокомпютри;


4. Компресиране на изображенията

4.1. Компресиране без загуби - RLE (Run Length Encoding) преглежда изображението по редове от началото до края. Ако открие повтарящи се стойности - например много сини пиксели - той записва стойността и след това броя на повторенията. Ако следващият ред съдържа същата стойност, за него също се използва по-кратък код.

4.2. Компресиране със загуба на данни - Загубите на част от данните обикновено засяга броя на поддържаните цветове и общата разделителна способност. DCM (Diffential Code Modulation) измерва разликите в стойностите на цветовете на съседните пиксели и кодира тези числа. BPR (Block Pixel Replication) редуцира броя на цветовете. Тъй като кодирането на цвят с 24 бита дава възможност да се представят 16,8 милиона цвята, а окото може да възприеме само до 10000 цвята, това обикновено е допустимо.Международен стандарт JPEG (Joint Photographic Experts Group). Този стандарт използва три алгоритъма, два от които са със загуби.

5. Изобразяване на текст

5.1. Растерни шрифтове (bitmap fonts) – съхраняват се като карта за всеки символ (пр.:8х8)

5.2. Щрихови шрифтове (stroke fonts) – всеки символ се изгражда от движението на една абстрактна писалка. За всеки символ се съхранява векторно описание за движението на писалката.

5.3. Контурни шрифтове (outline fonts) – пази се векторно описание за контура на шрифта. Преди да може да се използва трябва да се растеризира. Контура се поставя върху мрежа от пиксели, за да се види кои трябва да се осветят.

6. Графични адаптери

ДЕФ: Адаптера е устройство, което управлява работата на дисплея. Една част от видеопространството е отделена за съхраняване на информация за пиксела. Тази част се нарича видеопамет.

6.1. Видеопамет – в нея се съхраняват стойности за атрибутите на пикселите. Адаптера непрекъснато сканира тази памет и преобразува стойностите на атрибутите на пикселите в сигнали за управление интензивността на електронните лъчи във видеомонитора.

6.2. Графични страници – една графична страница е част от видеопаметта, съдържаща стойности за атрибутите на всички пиксели от екрана. В един момент може да се покаже само една от страниците. За да се покаже друга, адаптера трябва да започне да я сканира. Това е един от начините за правене на анимация.

6.3. Карта на цветовете – съдържа 2n елемента, където n е дълбочината на цветовата гама за описване на атрибутите на един пиксел. Векторите на цветовете могат да се сменят. Картата на цветовете определя какъв е действителния цвят. Без да сменяме атрибутите, променяме цвета на средата.

6.4. Режими на графичните адаптери


  • текстови – обикновенно 2 или 3. Различават се по разделителната способност, броя на поддържаните цветове, броя на страниците.

  • Графични

  • CGA (Color Graphics Adapter)

320x100 2 bits.pixel 1 page

640x200 1 bit/pixel 1 page



  • EGA (Enhanced Graphics Adapter)

640x200 4bits/pixel 16 colors 1 page

640x350 4bits/pixel 16 colors 2 pages

videomemory: 64 KB, A0000H

colormap : 16



  • VGA (Video Graphics Adapter)

640x480 4bits/pixel 16 colors 1 page

320x200 8bits/pixel 256 colors 1 page

640x200 4bits.pixel 16 colors 4 pages

videomemory: 256k/512k, A0000H

colormap: 256


  • MCGA (Memory Control Graphics Adapter)

320x200 & 640x200 on CGA mode

320x200 & 640x480 on VGA mode



  • IBM 8514

640x480

1024x768


7. Графични драйвери

ДЕФ: Драйвер : програма, която управлява работата на дисплея, с помощта на графичния адаптер. За един графичен адаптер могат да се използват няколко драйвера, които имитират работата на различни адаптери.



  • CGA.BGI (CGA, MCGA)

  • EGAVGA.BGI (EGA, VGA)

  • HERC.BGI (Herculess)

  • ATT.BGI (AT&T)

  • PC3270.BGI (IBM 3270PC)

  • IBM8514.BGI (IBM8514)

      1. Graph Interface Unit

1. Координатна система и текущ указател (CP - Current Pointer) Координатите на пиксела в горния ляв ъгъл на екрана са (0,0), а на долния десен - (GetMaxX,GetMaxY). Текущият указател CP определя положението на електронния лъч, позицията му се означава с (x,y).

2. Инициализация на графичната система. Преди работа в графичен режим, той трябва да се инициализира. Инициализацията се прави чрез графични драйвери. За всеки драквер системата използва номера.



2.1. Символични имена на графичните драйвери

const

CurrentDriver = -128; { Параметър на GetModeRange }

Detect = 0; { Автоматично тестване на апаратурата за }

{ определяне на типа на графичния драйвер}

CGA = 1;

MCGA = 2;

EGA = 3;

EGA64 = 4;

EGAMono = 5;

IBM8514 = 6;

HercMono = 7;

ATT400 = 8;

VGA = 9;

PC3270 = 10;
2.2. Символични имена на графичните режими

const

CGAC0= 0; {320x200 палитра 0: LightGreen, LightRed, Yellow; 1 страница}

CGAC1= 1; {320x200 палитра 1: LightCyan, LightMagenta, White; 1 страница }

CGAC2= 2; {320x200 палитра 2: Green, Red, Brown; 1 страница }

CGAC3= 3; {320x200 палитра 3: Cyan, Magenta, LightGray; 1 страница }

CGAHi= 4; {640x200 2 цвята 1 страница }

MCGAC0= 0; {320x200 палитра 0: LightGreen, LightRed, Yellow; 1 страница}

MCGAC1= 1; {320x200 палитра 1: LightCyan, LightMagenta, White; 1 страница }

MCGAC2= 2; {320x200 палитра 2: Green, Red, Brown; 1 страница }

MCGAC3= 3; {320x200 палитра 3: Cyan, Magenta, LightGray; 1 страница }

EGALo= 0; {640x200 16 цвята 4 страници}

EGAHi= 1; {640x350 16 цвята 2 страници}

EGA64Lo= 0; {640x200 16 цвята 1 страница}

EGA64Hi= 1; {640x350 4 цвята 1 страница}

EGAMonoHi= 3; {640x350 64K on card, 1 страница; при памет 256K - 2 страници}

HercMonoHi = 0; {720x348 2 страници}

ATT400C0= 0; {320x200 палитра 0: LightGreen, LightRed, Yellow; 1 страница}

ATT400C1= 1; {320x200 палитра 1: LightCyan, LightMagenta, White; 1 страни ца}

ATT400C2= 2; {320x200 палитра 2: Green, Red, Brown; 1 страница}

ATT400C3= 3; {320x200 палитра 3: Cyan, Magenta, LightGray; 1 страница}

ATT400Med= 4; {640x200 1 страница}

ATT400Hi= 5; {640x400 1 страница}

VGALo= 0; {640x200 16 цвята 4 страници}

VGAMed= 1; {640x350 16 цвята 2 страници}

VGAHi= 2; {640x480 16 цвята 1 страница}

PC3270Hi= 0; {720x350 1 страница}

IBM8514LO= 0; {640x480 256 цвята}

IBM8514HI= 1; {1024x768 256 цвята}
2.3. Процедура за инициализация на графичната система. - Първия параметър е номера на драйвера или нула (за автоматично тестване на системата и избор на най-подходящия драйвер). Втория параметър е номер на графичен режим. Третия параметър е низ, показващ къде се намира графичната библиотека. При празен низ библиотеката се търси в текущата директория.


procedure InitGraph(

var GraphDriver : integer; { Номер на графичния драйвер }

var GraphMode : integer; { Номер на графичния режим }

var PathToDriver : String; { Път до директорията на драйвера }



GraphDriver := Detect {неявно се повиква DetectGraph, която тества апаратурата и определя графичния драйвер}



PathToDriver := ''; {драйверът се търси в текущата директория}


Пример:


procedure Initialize;

var GraphDriver, GraphMode, ErrorCode:integer;

begin

GraphDriver:=Detect;

InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');

ErrorCode := GraphResult; { Съхранява кода на грешката }

if ErrorCode <> grOK then { Има ли грешка? }

begin

Writeln('Графична грешка: ', GraphErrorMsg(ErrorCode));

Halt(1);

end;

end;
Graphresult – връща код на грешката. Стойността се записва в променлива, от която се чете кода на грешката. Ако стойността на променливата е нула – няма грешка.

Detectgraph може да се извика неявно, ако първия параметър на инитграпх е нула. Може да се извика и явно – за автоматично тестване на системата.


2.4. Тестване на апаратурата на видеоадаптера и автоматично избиране на подходящ драйвер и графичен режим
procedure DetectGraph(var GraphDriver, GraphMode : integer);
- в GraphDriver се връща номерът на графичния драйвер

- в GraphMode се връща номерът на графичния режим с максимална разрешаваща способност


Пример:
var GraphDriver, GraphMode:integer;

begin

DetectGraph( GraphDriver, GraphMode);

InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');

...
Пример:
var GraphDriver, GraphMode:integer;

begin

DetectGraph( GraphDriver, GraphMode);

if (GraphDriver = EGA) or (GraphDriver = VGA) then

begin

GraphDriver := CGA;

GraphMode := CGAHi;

end;

InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');

...
2.5. Получаване на името на активния драйвер
function GetDriverName : string;
Пример:



OutText('Активен драйвер: ' + GetDriverName);


2.6. Затваряне на графичната система

procedure CloseGraph;

Освобождава паметта, отделена за графичната система и възстановява текстовия режим, съществуващ преди графичния.


3. Работа с графични режими
procedure GetModeRange(GraphDriver : integer; var LoMode, HiMode : integer);
Връща минималната и максималната стойност за номера на режима за посочения графичен драйвер (може да работи и в текстов режим).
Пример:

var Lowest, Highest : integer;

begin

GetModeRange(EGA64, Lowest, Highest);

writeln('Минимален графичен режим: ', Lowest); { Извежда 0}

writeln('Максимален графичен режим: ', Highest);{ Извежда 1}

...

  • function GetMaxMode : integer; Връща максималния номер на графичен режим за текущия зареден драйвер.




  • function GetModeName(GraphMode : integer) : string; Връща низ с името на зададения графичен режим.

Пример:

var I : integer;

begin

Initialize;

for I := 0 to GetMaxMode do

OutTextXY(10, 10 * (I+1), GetModeName(I)); { Извежда имената }

{ на всички режими за текущия зареден драйвер}


procedure SetGraphMode(Mode : integer);

Привежда системата в посочения графичен режим и почиства екрана. Всички параметри (палитра, стил на линията, запълване и т.н.) получават стойностите по подразбиране. Използва се за задаване на графичен режим, различен от установения с InitGraph и за връщане в определен графичен режим след RestoreCrtMode.
Пример:

var GraphDriver, GraphMode, ErrorCode:integer;

Lowest, Highest : integer;

begin


GraphDriver:=Detect;

InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');

ErrorCode := GraphResult;

if ErrorCode <> grOK then Halt(1);

GetModeRange(GraphDriver, Lowest, Highest);

SetGraphMode(Lowest); { Установява режима с минимална }

{ разрешаваща способност }
function GetMaxX : integer;

function GetMaxY : integer;

Връщат максималната X и Y стойности на CP за текущите графичен драйвер и режим, например при CGA в режим 320х200 GetMaxX връща стойност 319, а GetMaxY - 199.


function GetGraphMode : integer;

Връща номера на текущия графичен режим, установен с InitGraph или SetGraphMode.


procedure RestoreCrtMode;

Връща текстовия режим преди инициализацията с InitGraph, без да затваря графична та система. Използва се заедно със SetGraphMode за превключване между графичен и текстов режим.


Пример:

var GraphDriver, GraphMode:integer;

begin

GraphDriver:=Detect;

InitGraph(GraphDriver, GraphMode, 'c:\bp\bgi');

OutText ('Натиснете за излизане от графичен режим');

readln;

RestoreCrtMode;

writeln('Сега сме в текстов режим.');

writeln('Натиснете за връщане в графичен режим');

readln;

SetGraphMode(GetGraphMode);

OutText ('Отново сме в графичен режим.');

...
procedure GraphDefaults;

Присвоява на всички параметри на графичната система стойностите по подразбиране (рамка за наблюдение, палитра, цветове за рисуване и фон, стил и шаблон на линията, стил, цвят и шаблон на запълване, шрифт, стил и изравняване на текста, размер на символите). CP := (0,0).


4. Обработка на грешки

Дефинирани са следните символични константи за кодовете на грешките при изпълнение на графични операции:


const

grOk = 0; { Няма грешка }

grNoInitGraph = -1; { Неинициализирана графична система }

grNotDetected = -2; { Не е установен графичен хардуер }

grFileNotFound = -3; { Не е открит файл с графичен драйвер}

grInvalidDriver = -4; { Невалиден файл с графичен драйвер }

grNoLoadMem = -5; { Недостатъчна памет за драйвера }

grNoScanMem = -6; { Недостатъчна памет при сканиращо }

{ запълване }

grNoFloodMem = -7; { Недостатъчна памет при }

{ "наводняващо" запълване }

grFontNotFound = -8; { Не е открит файл с графичен шрифт }

grNoFontMem = -9; { Недостатъчна памет за шрифта }

grInvalidMode = -10; { Невалиден графичен режим за }

{ избрания драйвер }

grError = -11; { Недостатъчна памет в таблицата на }

{ шрифтовете за регистриране на нов шрифт }

grIOerror = -12; { Графична грешка при вход/изход }

grInvalidFont = -13; { Невалиден файл с шрифт }

grInvalidFontNum = -14; { Невалиден номер на шрифта }
function GraphResult : integer;

Връща код на грешката за последната графична операция. След повикване GraphResult се нулира, затова връщаната от нея стойност трябва да се запази в помощна променлива.


function GraphErrorMsg(ErrorCode : integer) : String;

Връща низ със съобщение за грешката, отговаряща на посочения код на грешката.

5. Работа с екрана, графични страници и графични прозорци

5.1. Управление на графични страници


procedure SetActivePage(Page : word);

Пренасочва графичния изход към графична страница с номер Page.


procedure SetVisualPage(Page : word);

На екрана се извежда съдържанието на графичната страница с номер Page.


Пример:

var GD, GM:integer;

begin

GD:=Detect;

InitGraph(GD, GM, 'c:\bp\bgi');

if (GD=HercMono) or (GD=EGA) or (GD=EGA64) or (GD=VGA) then

begin

SetVisualPage(0);

Circle(GetMaxX div 2, GetMaxY div 2, 100);

SetActivePage(1);

Rectangle(0,0, GetMaxX, GetMaxY);

readln;

SetVisualPage(1);

end;
procedure ClearDevice;

Почиства цялата активна страница (целия екран) - всички пиксели приемат цвета на фона, зададен със SetBkColor; CP:=(0,0).


5.2. Работа с графични прозорци

Използват се предварително дефинирани константи и типове:


const

ClipOn = true;

ClipOff = false;

type

ViewPortType = record

x1, y1, x2, y2 : integer;

Clip : boolean;

end;
procedure SetViewPort(x1, y1, x2, y2 : integer; Clip : boolean);

Задава графичен прозорец с координати на горния ляв ъгъл (x1, y1) и на долния десен ъгъл (x2, y2). CP :=(0,0) в горния ляв ъгъл на прозореца. Clip определя дали ще се прави изрязване при изчертаването по границите на прозореца. При грешно задаване на параметрите GraphResult връща стойност grError и графичният прозорец остава непроменен. SetViewPort(0,0,GetMaxX, GetMaxY,True) винаги задава като прозорец целия екран.


Пример:

SetViewPort(10,10,20,20,ClipOn);

Line(0,5,15,5); { Отсечката започва от абсолютни екранни }

{ координати (10,15) и завършва в (20,15)}

procedure ClearViewPort;

Почиства текущия графичен прозорец - всички пиксели приемат цвета на фона (Palette[0]), CP:=(0,0).


Пример:

var GD, GM:integer;

begin

InitGraph(GD, GM, 'c:\bp\bgi');

Rectangle(19,19,GetMaxX-19,GetMaxY-19);

SetViewPort(20,20,GetMaxX-20,GetMaxY-20,ClipOn);

OutTextXY(0,0,' clears the viewport');

readln;

ClearViewPort;
procedure GetViewSettings(var ViewPort : ViewPortType);

Връща в променлива от тип ViewPortType параметрите на текущия прозорец.


Пример:

var Old : ViewPortType;

GD, GM:integer;

begin

InitGraph(GD, GM, 'c:\bp\bgi');

SetViewPort(20,20,GetMaxX-20,GetMaxY-20,ClipOn);

{ Графичен изход в първи прозорец }

GetViewSettings(Old);

SetViewPort(10,10,120,120,ClipOff);

{ Графичен изход във втори прозорец }

with Old do SetViewPort(x1, y1, x2, y2, Clip);

{ Връщане към прозорец с параметрите на първия прозорец }

...
6. Работа с текущия указател (CP) и с отделни пиксели

function GetX : integer;

function GetY : integer;
Връщат X и Y координатата на CP. Стойностите са спрямо активния графичен прозорец.
procedure MoveTo(X, Y : integer);

Премества CP в позиция (X,Y) спрямо началото на текущия графичен прозорец. Ако SetViewPort е активна, X,Y се добавят към координатите на горния ляв ъгъл на текущия графичен прозорец. Стойността на CP се променя още от изпълнението на следните подпрограми:


ClearDevice LineRel OutText

ClearViewPort LineTo SetGraphMode

GraphDefaults MoveRel SetViewPort

InitGraph


Пример:

MoveTo(0,0); { Горен ляв ъгъл на графичния прозорец }

LineTo(10,10);

{ CP в абсолютни координати (10,10), GetX връща стойност 10 }

SetViewPort(0,0,GetMaxX,GetMaxY, ClipOn);

{ CP в абсолютни координати (0,0), GetX връща стойност 0 }

MoveTo(5,5);

{ CP в абсолютни координати (5,5), GetX връща стойност 5 }

SetViewPort(10,10,100,100, ClipOn);

{ CP в абсолютни координати (10,10), GetX връща стойност 0 }

MoveTo(5,5);

{ CP в абсолютни координати (15,15), GetX връща стойност 5 }
procedure MoveRel(Dx, Dy : integer);

Премества CP в позиция (GetX+Dx, GetY+Dy).


procedure PutPixel(X, Y : integer; Color : word);

Оцветява пиксел с координати (X,Y) с посочения цвят Color (атрибутът на пиксела във видеопаметта приема стойност Color).


Пример:

var Color : word;

begin

Initialize;

Color := GetMaxColor;

repeat

PutPixel(Random(100), Random(100), Color);

Delay(10);

until KeyPressed;

function GetPixel(X, Y : integer) : word;

Връща стойността на атрибута на пиксела с координати (X,Y).

Пример:

var PixelColor : word;

begin

Initialize;

PixelColor := GetPixel(10,10);

if PixelColor = 0 then PutPixel(10,10,GetMaxColor);
7. Управление на цветовете - Използват се предварително дефинирани константи и типове:

const

{ Цветове за SetPalette и SetAllPalette: }

Black = 0;

Blue = 1;

Green = 2;

Cyan = 3;

Red = 4;

Magenta = 5;

Brown = 6;

LightGray = 7;

DarkGray = 8;

LightBlue = 9;

LightGreen = 10;

LightCyan = 11;

LightRed = 12;

LightMagenta = 13;

Yellow = 14;

White = 15;

{ Цветове за 8514 за задаване на стандартните EGA цветове }

EGABlack = 0; { Тъмни цветове }

EGABlue = 1;

EGAGreen = 2;

EGACyan = 3;

EGARed = 4;

EGAMagenta = 5;

EGABrown = 20;

EGALightgray = 7;

EGADarkgray = 56; { Светли цветове }

EGALightblue = 57;

EGALightgreen = 58;

EGALightcyan = 59;

EGALightred = 60;

EGALightmagenta = 61;

EGAYellow = 62;

EGAWhite = 63;

MaxColors = 15;

type

PaletteType = record

Size : byte;

Colors : array[0..MaxColors] of shortint;

end;
7.1. Управление на палитрата
procedure SetAllPalette(var Palette : PaletteType);

Сменя текущите цветове на палитрата само за EGA, EGA64 и VGA (без режима с 256 цвята). Стойностите за цветовете могат да бъдат само от 0 до 15 (в зависимост от графичния драйвер и режим).


Пример:

var Pal : PaletteType; I : integer;

begin

Initialize;

for I := 1 to GetMaxColor do

begin

SetColor(I);

Line(0, 10*I, 100, 10*I);

end;

readln;

with Pal do

begin

Size := 4;

Colors[0] := Red; { Условен цвят 0 - цвят на фона }

Colors[1] := Cyan; { Условен цвят 1 }

Colors[2] := Blue; { Условен цвят 2 }

Colors[3] := Green; { Условен цвят 3 }

end;

SetAllPalette(Pal); { На екрана се сменят цветовете }

{ с номера от 0 до 3 }
procedure SetPalette(ColorNum : word; Color : shortint);

Сменя цвят от палитрата с номер ColorNum с цвят Color. Стойността на ColorNum може да бъде само от 0 до 15 (в зависимост от графичния драйвер и режим).


Пример:

var I : integer; MaxColor : word;

begin

Initialize;

for I := 1 to GetMaxColor do

begin

SetColor(I);

Line(0, 10*I, 100, 10*I);

end;

readln;

MaxColor := GetMaxColor + 1;

repeat

SetPalette(Random(MaxColor),Random(MaxColor));

until KeyPressed;
function GetPaletteSize : integer;

Връща максималния брой на възможните цветове в палитрата за текущия графичен режим, например за EGA в цветен режим връща стойност 16.


procedure GetPalette(var Palette : PaletteType);

Връща текущата палитра в променлива от тип PaletteType (размер на палитрата и цветове в нея).


Пример:

var Pal : PaletteType; I : integer; S : string;

begin

Initialize;

GetPalette(Pal);

if Pal.Size <> 1 then

for I := 0 to Pal.Size-1 do

begin

SetColor(I); Str(I, S);

OutTextXY(0, 10*I, 'Color '+ S);

end;

procedure GetDefaultPalette(var Palette : PaletteType);

Връща стойностите за палитрата, установена от InitGraph, в променлива от тип Pal

etteType.

Пример:

var OldPal : PaletteType; I : integer;

begin

Initialize;

GetDefaultPalette(OldPal);

if OldPal.Size <> 1 then

for I := 0 to OldPal.Size-1 do

begin

SetColor(OldPal.Colors[I]);

OutTextXY(0, 10*I, 'Color '+ chr(I));

end;
procedure SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue : integer);

Променя стойности в палитрата за драйвери IBM8514 и VGA. ColorNum определя номер на цвят в палитрата (от 0 до 255 за IBM8514 и от 0 до 15 за VGA в режим с 256К цвята), а RedValue, GreenValue и BlueValue задават стойности за червената, зелената и синята съставка на цвета с номер ColorNum. От RedValue, GreenValue и BlueValue се използва само младшият байт и то само шестте старши разряда.


Пример:

var Driver, Mode, I: integer;

begin

Driver := IBM8514;

Mode := IBM8514Hi; { IBM8514 не се открива с DETECT }

InitGraph(Driver, Mode, '');

SetRGBPalette(7, $00, $00, $FC); { Условен цвят 7 - син }
7.2. Управление на цветовете
procedure SetColor(Color : word);

Задава текущ цвят на извеждане - цвят с номер Color (от 0 до 15 в зависимост от текущия драйвер и режим) от текущата палитра става текущ цвят на рисуване.


procedure SetBkColor(ColorNum : word);

Задава цвят на фона - цвят с номер Color (от 0 до 15 в зависимост от текущия драйвер и режим) от текущата палитра става текущ цвят на фона.


Пример:

SetBkColor(3); { Цвят с номер 3 става текущ цвят на фона }

SetBkColor(0); { Винаги ЧЕРЕН цвят на фона, независимо от това }

{ какъв е цвят с номер 0 от текущата палитра }
function GetColor : word;

Връща текущия цвят на рисуване (номер на цвят в текущата палитра).


function GetBkColor : word;

Връща цвета на фона (стойност от 0 до GetMaxColor).


function GetMaxColor : word;

Връща максималния номер на цвят, който може да се предаде към процедурата SetColor (максималната стойност на атрибута на пиксела).


8. Изчертаване на отсечки - използват се предварително дефинирани константи и тип:

const

{ За стил на линията }

SolidLn = 0; { Плътна линия }

DottedLn = 1; { Линия, изградена от точки }

CenterLn = 2; { Централна линия }

DashedLn = 3; { Линия, изградена от тирета }

UserBitLn = 4; { Дефиниран от потребителя стил на линия }

{ За широчина на линията }

NormWidth = 1; { Нормална широчина на линията }

ThickWidth = 3; { Тройна широчина на линията }

{ За процедурата SetWriteMode }

CopyPut = 0; { MOV }

XORPut = 1; { XOR }

type

LineSettingsType = record

LineStyle : word;

Pattern : word;

Thickness : word;

end;

8.1. Определяне на начина на изчертаване на отсечки



procedure SetLineStyle(LineStyle : word; { Стил на линията }

Pattern : word; { Шаблон }

Thickness : word { Широчина });

Задава текущите стил или широчина на линията, с които се изчертават отсечки и геометрични фигури. LineStyle може да приема стойност от SolidLn до UserBitLn, а Thickness - NormWidth или ThickWidth. Pattern се игнорира, ако LineStyle не е UserBitLn. Ако LineStyle е равно на UserBitLn, стилът на линията се определя от 16-разреден шаблон, зададен за параметър Pattern.


Пример:

SetLineStyle(DottedLn, 0, NormWidth);

Line(10, 10, 100, 100);

SetLineStyle(SolidLn, 0, ThickWidth);

Rectangle(10, 10, 100, 100);

SetLineStyle(UserBitLn, $C3, ThickWidth);

{ Шаблон 0000 0000 1100 0011 }

Rectangle(15, 15, 95, 95);
procedure GetLineSettings(var LineInfo : LineSettingsType);

Връща в променлива от тип LineSettingsType текущите стил, шаблон и широчина на линията на изчертаване на графичните примитиви, зададени от SetLineStyle.


Пример:

var OldStyle : LineSettingsType;

begin

Initialize;

Line(0, 0, 100, 0);

{ Стойности по подразбиране : SolidLn и NormalWidth }

GetLineSettings(OldStyle);

{ Съхраняване на параметрите на линията в OldStyle }

SetLineStyle(DottedLn, 0, ThickWidth);

{ Смяна на стила на линията }

Line(0, 10, 100, 10);

with OldStyle do

SetLineStyle(LineStyle, Pattern, Thickness);

{ Възстановяване на стила на линията преди смяната }

Line(0, 20, 100, 20);
procedure SetWriteMode(WriteMode : integer);

Определя начина на записване на стойностите за атрибутите на пикселите във видеопаметта при подпрограмите: Line, LineTo, LineRel, Rectangle и DrawPoly. WriteMode може да приема само една от стойностите CopyPut или XORPut. При CopyPut стойностите за атрибутите на пикселите се записват с команда MOV и заместват предишните стойности. При XORPut това става с команда XOR, така че две последователни изпълнения на XOR изтриват линията и възстановяват предишното състояние на екрана.


Пример:

var x, y, dx, dy : integer;

begin

Initialize;

dx := GetMaxX div 4; dy := GetMaxY div 4;

SetWriteMode(XORPut);

repeat

x := Random(GetMaxX - dx);

y := Random(GetMaxY - dY);

Rectangle(x, y, x+dx, y+dy); { Изчертаване на правоъгълника }

Delay(50);

Rectangle(x, y, x+dx, y+dy); { Изтриване на правоъгълника }

until KeyPressed;
8.2. Изчертаване на отсечки - при изчертаването стилът и широчината на линията се определят от SetLineStyle, а цветът - от SetColor.
procedure Line(x1, y1, x2, y2 : integer);

Изчертава отсечка от пиксел с координати (x1,y1) до пиксел с координати (x2,y2).


procedure LineTo(X, Y : integer);

Изчертава отсечка от CP до пиксел с координати (X,Y).


Пример:

MoveTo(100, 100);

LineTo(200, 200); { Отсечка от (100, 100) до (200, 200) }
procedure LineRel(Dx, Dy : integer);

Изчертава отсечка от CP до пиксел с координати (GetX+Dx, GetY+Dy).


Пример:

MoveTo(1, 2);

LineRel(200, 200); { Отсечка от (1, 2) до (201, 202) }
9. Изчертаване на контури на геометрични фигури - използват се предварително дефинирани типове:

type

PointType = record { Тип за координати на пиксел }

X, Y : integer;

end;
ArcCoordsType = record { Тип за параметри на дъга }

X, Y : integer;

Xstart, Ystart : integer;

Xend, Yend : integer;

end;
procedure Rectangle(x1, y1, x2, y2 : integer);

Изчертава правоъгълник със страни, успоредни ръбовете на графичния прозорец, с координати на горния ляв ъгъл (x1,y1) и на долния десен (x2,y2). При изчертаването стилът и широчината на линията се определят от SetLineStyle, а цветът - от SetColor.


procedure DrawPoly(NumPoints : word; var PolyPoints);

Изчертава многоъгълник с NumPoints-1 върха, чиито координати се съхраняват в масив с тип на елементите PointType. За да се изчертае затворен многоъгълник с N върха, към DrawPoly трябва да се предадат координатите на N+1 точки, като PolyPoints[N+1] = PolyPoints[1]


Пример:

const

Triangle : array[1..4] of PointType = ((X:50; Y:100),

(X:100; Y:100), (X:150; Y:150), (X:50; Y:100));

begin

...

DrawPoly(4, Triangle); { Изчертава триъгълник }
procedure Circle(X, Y : integer; Radius : word);

Изчертава окръжност с център (X,Y) и радиус Radius (брой пиксели по хоризонтала) с цвят, зададен от SetColor.


Пример:

var Radius : integer;

begin

Initialize;

for Radius := 1 to 5 do

Circle(GetMaxX div 2, GetMaxY div 2, Radius*10);

{ Пет концентрични окръжнодсти в центъра на екрана }
procedure Arc(X, Y : integer; StAngle, EndAngle, Radius : word);

Изчертава дъга от окръжност с център (X,Y) с радиус Radius от начален ъгъл StAngle до краен ъгъл EndAngle (в градуси; 3ч. е 0 градуса,12ч. е 90 градуса и т.н.) с цвят, зададен от SetColor. При StAngle = 0 и EndAngle = 360 се изчертава пълна окръжност.


Пример:

Arc(100, 100, 45, 135, 100); { Дъга от окръжност }

Arc(110, 110, 0, 360, 100); { Пълна окръжност }
procedure Ellipse(X, Y : integer;

StAngle, EndAngle : word;

XRadius, YRadius : word);

Изчертава дъга от елипса с център (X,Y), радиус по хоризонтала XRadius и радиус по вертикала YRadius от начален ъгъл StAngle до краен ъгъл EndAngle с цвят, зададен от SetColor. При StAngle = 0 и EndAngle = 360 се изчертава пълна елипса.


Ellipse(100, 100, 0, 360, 30, 50); { Пълна елипса }

Ellipse(110, 110, 0, 180, 30, 50); { Половина от елипса }
procedure GetArcCoords(var ArcCoords : ArcCoordsType);

Връща координатите на последната процедура за изчертаване на дъга от окръжност или елипса, така че могат да се свържат с права крайните точки и/или центъра.


Пример:

var ArcCoords : ArcCoordsType;

begin

Initialize;

Arc(100, 100, 0, 270, 30); { Дъга от окръжност }

GetArcCoords(ArcCoords);

with ArcCoords do

Line(Xstart, Ystart, Xend, Yend);

{ Линия от началната до крайната точка на дъгата }
Ellipse(150, 150, 90, 0, 100, 80); { Дъга от елипса }

GetArcCoords(ArcCoords);

with ArcCoords do

begin

Line(Xstart, Ystart, X, Y);

{ Линия от началната точка до центъра на дъгата }

Line(X, Y, Xend, Yend);

{ Линия от центъра до крайната точка на дъгата }

end;
10. Изчертаване на запълнени фигури

10.1. Определяне на стила на запълване на фигурите - използват се предварително дефинирани константи и тип:


const

{ Константи за Bar3D }

TopOn = true;

TopOff = false;

{ Шаблони за запълване за Get/SetFillStyle: }

EmptyFill = 0; { Запълване с цвета на фона }

SolidFill = 1; { Плътно запълване с посочения цвят }

LineFill = 2; { --- }

LtSlashFill = 3; { /// с тънки линии }

SlashFill = 4; { /// с плътни линии }

BkSlashFill = 5; { \\\ с плътни линии }

LtBkSlashFill = 6; { \\\ с тънки линии }

HatchFill = 7; { С квадратчета }

XHatchFill = 8; { С Х квадратчета }

InterleaveFill = 9; { С прекъсната линия }

WideDotFill = 10; { С големи и раздалечени точки }

CloseDotFill = 11; { С малки и близки точки }

UserFill = 12; { С потребителски шаблон }

type

FillSettingsType = record { Тип за параметри на запълването }

Pattern : word;

Color : word;

end;
FillPatternType = array[1..8] of byte;

{ Шаблон на запълване, определен от потребителя }
procedure SetFillStyle(Pattern : word; Color : word);

Задава стила на запълване - шаблон и цвят. Pattern може да приема стойности от EmptyFill до UserFill, а Color - от 0 до GetMaxColor. Стойностите по подразбиране са SolidFill, GetMaxColor. Ако Pattern = UserFill, използва се шаблонът, установен със SetFillPattern.


Пример:

SetFillStyle(SolidFill, 0); { Плътно запълване с цвета на фона }

Bar(0, 0, 50, 50);

SetFillStyle(XHatchFill, 1); { Запълване с цвят с номер 1 }

Bar(60, 0, 110, 50);
procedure SetFillPattern(Pattern : FillPatternType; Color : word);

Установява потребителски шаблон на запълване с посочения цвят. Шаблонът се задава със стойности на масива Pattern (8 байта, всеки отговарящ на 8 пиксела; при стойност на бита 1 съответният пиксел се оцветява с цвят Color).


Пример:

const

Patt : FillPatternType = ($AA, $00, $AA, $00, $AA, $55, $AA, $55);

begin

Initialize;

SetFillPattern(Patt, White);

Bar(0, 0, 100, 100); { Запълване с Patt, цвят с номер 15 }

SetFillStyle(SolidFill, Blue);

Bar(100, 100, 150, 150); { Плътно запълване, цвят с номер 1 }

SetFillPattern(Patt, White);{ Отново трябва да се зададе! }

SetFillStyle(UserFill, Red);

Bar(150, 150, 200, 200); { Запълване с Patt, цвят с номер 4 }

...
procedure GetFillSettings(var FillInfo : FillSettingsType);

Връща последните шаблон и цвят на запълване, зададени със SetFillStyle или SetFillPattern в променлива от тип FillSettingsType. Ако в полето Pattern на променливата FillInfo се върне стойност UserFill, шаблонът може да се получи с GetFillPattern.


procedure GetFillPattern(var FillPattern : FillPatternType);

Връща последния шаблон на запълване, зададен със SetFillPattern.

10.2. Запълнени геометрични фигури
procedure Bar(x1, y1, x2, y2 : integer);

Запълва правоъгълен участък от екрана (без контурна линия) със страни, успоредни на ръбовете на графичния прозорец, с координати на горния ляв ъгъл (x1,y1) и на долния десен (x2,y2). Стилът на запълване се определя от SetFillStyle или SetFillPattern.


Пример:

SetFillStyle(EmptyFill, 0);

Bar(10, 10, 100, 100); { Изтрива правоъгълна част от екрана }

SetFillStyle(SolidFill, Magenta);

Bar(100, 100, 150, 150); { Оцветява правоъгълна част от екрана }
При изчертаването на всички останали запълнени фигури контурът на фигурата се изчертава с цвят и стил, определени от SetLineStyle и SetColor, а вътрешността й се запълва по начин, определен от SetFillStyle или SetFillPattern.
procedure FillPoly(NumPoints : word; var PolyPoints);

Подобна на DrawPoly, но за да се изчертае затворен многоъгълник с N върха, към FillPoly трябва да се предадат координатите на N точки.


Пример:

const

FillTriangle : array[1..3] of PointType = ((X:50; Y:100),

(X:100; Y:100), (X:150; Y:150));

begin

Initialize;

SetLineStyle(DashedLn, 0, ThickWidth);

SetColor(Green);

SetFillStyle(CloseDotFill, Yellow);

FillPoly(3, FillTriangle); { Изчертава запълнен триъгълник }
procedure Bar3D(x1, y1, x2, y2 : integer; Depth : word; Top : boolean);

Изчертава тримерен паралелепипед с координати на горния ляв ъгъл (x1,y1) и на долния десен ъгъл на предната стена (x2,y2). Предната стена се запълва с текущия шаблон и цвят. Depth определя дълбочината в пиксели на 3-мерния контур. Ако Top и ма стойност TopOn, изчертава се горната част на 3-мерния контур, а ако е TopOff - не се изчетава, така че могат да се разположат 2 или повече Bar3D една върху друга.


Пример:

SetColor(Green);

SetFillStyle(LtSlashFill, Red);

Bar3D(10, 60, 50, 110, 10, TopOff); { Долен паралелепипед }

SetFillStyle(LtBkSlashFill, Yellow);

Bar3D(10, 10, 50, 60, 10, TopOn); { Горен паралелепипед }

SetFillStyle(EmptyFill, 0);

Bar3D(100, 100, 150, 150, 0, TopOff); { Изтрива правоъгълна част }

{ от екрана и я огражда с рамка с цвят Green }
procedure FillEllipse(X, Y : integer;

XRadius, YRadius : word);

Изчертава запълнена елипса с център (X,Y) и радиуси по хоризонтала и вертикала X Radius и YRadius.


procedure PieSlice(X, Y : integer; StAngle, EndAngle, Radius : word);

Изчертава и запълва сектор от кръг с център (X,Y) и радиус XRadius, от ъгъл StAngle до ъгъл EndAngle. Използва се за чертане на кръгови диаграми.


Пример:

SetColor(Blue);

SetFillStyle(LineFill, Magenta);

PieSlice(100, 100, 0, 270, 80);
procedure Sector(X, Y : Integer;

StAngle, EndAngle,

XRadius, YRadius : word);

Изчертава и запълва сектор от елипса с център (X,Y) и радиуси по хоризонтала и вертикала XRadius и YRadius, от ъгъл StAngle до ъгъл EndAngle.


Пример:

Sector(GetMaxX div 2, GetMaxY div 2, 0, 45, 50, 50);
procedure FloodFill(X, Y : integer; Border : word);

Запълва оградена област от екрана с текущия стил на запълване (шаблон и цвят). (X,Y) определят пиксел вътре в запълваната област. Ако (X,Y) е вън от затворената област, "наводнява" се всичко извън контура. Border е цветът на контура на областта.


Пример:

SetFillStyle(LtSlashFill, GetMaxColor);

Rectangle(0, 0, 180, 100);

FloodFill(1, 1, GetColor);
10.3. Управление на коефициента на "неквадратност" на пикселите
procedure GetAspectRatio(var Xasp, Yasp : word);

Всеки драйвер и графичен режим имат т.н. коефициент на пропорционалност или на "неквадратност" на пикселите (отношението на широчината на пиксела към височината му) - да го наречем AspectRatio. Той се отчита при изчертаване на окръжности и дъги от тях. AspectRatio може да се получи с помощта на процедурата GetAspectRatio и следващо изчисляване на Xasp/Yasp.


Пример:

var Xside, Yside : integer; Radius : integer;

Xasp, Yasp : word;

AspectRatio : real;

begin

Initialize;

Xside := 100; Yside := 100;

Rectangle (0, 0, Xside, Yside); { В много режими това е }

{правоъгълник с основа < височината }

GetAspectRatio(Xasp, Yasp);

AspectRatio := Xasp / Yasp;

Yside := round(Xside * AspectRatio);

Rectangle (0, 0, Xside, Yside); { Винаги квадрат }
{ Изчертаване на окръжност с радиус по Y = GetMaxY div 2 }

Radius := round((GetMaxY div 2) / AspectRatio);

Circle(GetMaxX div 2, GetMaxY div 2, Radius);
procedure SetAspectRatio(Xasp, Yasp : word);

Сменя стойността по подразбиране на коефициента на "неквадратност" на пикселите, за да се коригира евентуално изкривяване при изчертаването на окръжности и дъги от тях.


11. Работа с масиви от пиксели

Правоъгълни масиви от пиксели, зададени с координатите на горния си ляв и долнияси десен ъгъл в текущия графичен прозорец могат да се съхранят в паметта и после да се възстановят на същото или друго място. За определяне на начина на записване на атрибутите на пикселите в паметта се използват предварително дефинирани константи:


const

CopyPut = 0; { MOV }

XORPut = 1; { XOR }

OrPut = 2; { OR }

AndPut = 3; { AND }

NotPut = 4; { NOT }
function ImageSize(x1, y1, x2, y2 : integer) : word;

Определя размера на паметта, необходима за съхраняване на стойностите на атрибутите на пикселите в частта от графичния прозорец, зададена с координатите (x1,y1) и (x2,y2).


procedure GetImage(x1, y1, x2, y2 : integer; var BitMap);

Съхранява стойностите на атрибутите на пикселите за частта от графичния прозорец, зададена с координатите (x1,y1) и (x2,y2), в променлива BitMap.procedure PutImage(X, Y : integer; var BitMap; BitBlt : word); Извежда частта от изображението, съхранено в променливата BitMap, на екрана в правоъгълен участък, зададен с координатите на горния ляв ъгъл (X,Y). Изрязване на извеждания образ не се прави; ако част от него не може да се събере в графичния прозорец, образът изобщо не се извежда. BitBlt определя операцията, с която стойностите на атрибутите на пикселите се записват във видеопаметта и може да приема стойности от CopyPut до NotPut.


Пример:

var P : Pointer;

begin

Initialize;

GetMem(P, ImageSize(0, 0, 99, 49));{ Заделя необходимата памет }

PieSlice(50, 25, 0, 360, 45);

GetImage(0, 0, 99, 49, P^); { Съхранява образа в P^ }

Readln;

ClearDevice;

PutImage(GetMaxX div 2, GetMaxY div 2, P^, CopyPut);
12. Извеждане на текст в графичен режим

12.1. Шрифтове - BGI използва два вида шрифтове: матричен (bitmap) и векторни. Всеки шрифт се съхранява в отделен файл с разширение .CHR. В графичната програма всеки шрифт се представя с постоянен номер, за който има предваритерно дефинирани константи:


const DefaultFont = 0; { Матричен шрифт 8x8 бита - по подразбиране }

TriplexFont = 1; { Векторни щрифтове }

SmallFont = 2;

SansSerifFont = 3;

GothicFont = 4;
12.2. Задаване на конкретен графичен шрифт и изравняване на текста - използват се предварително дефинирани константи и тип:
const

{ Посока на извеждане на текста - хоризонтална или вертикална }

HorizDir = 0; { Отляво надясно }

VertDir = 1; { Отдолу нагоре }

UserCharSize = 0; { Зададен от потребителя размер на текста }

{ Хоризонтално и вертикално изравняване за SetTextJustify: }

LeftText = 0;

CenterText = 1;

RightText = 2;

BottomText = 0;

{ CenterText = 1; вече е дефиниран по-горе }

TopText = 2;
type

TextSettingsType = record

Font : word; { Шрифт }

Direction : word; { Посока на извеждане }

CharSize : word; { Размер на символите }

Horiz : word; { Хоризонтално изравняване }

Vert : word; { Вертикално изравняване }

end;
procedure SetTextStyle(Font, Direction : word; CharSize : word);

Задава графичен шрифт, посока на извеждане и размер на символите. При матричен шрифт CharSize може да приема стойност 1 (по подразбиране; един символ се извежда в матрица от 8х8 бита), 2 (16х16),..., 10. Стойността по подразбиране за CharSize при векторните шрифтове е 4.


Пример:

var Y, Size : integer;

begin

Initialize;

Y := 0;

for Size := 1 to 9 do

begin

SetTextStyle(DefaultFont, HorizDir, Size);

OutTextXY(0, Y, 'Size = ' + Chr(Size+48));

Inc(Y, TextHeight('H') + 1);

end;
procedure SetTextJustify(Horiz, Vert : word);

Задава изравняване на текста при извеждане с OutTextXY и OutText. Извежданият текст се разполага спрямо CP по посочения начин. Стойностите по позразбиране са (LeftText, TopText).


Пример:

SetTextJustify(CenterText, CenterText);

OutTextXY(100, 100, 'ABC'); { (100,100) е в центъра на буквата B }
procedure SetUserCharSize(MultX, DivX, MultY, DivY : word);

Регулира широчината и височината на символите при векторните щрифтове по желание на програмиста. MultX/DivX е отношението, с което се умножава нормалната широчина на текущия шрифт, а MultY/DivY - съответно височина, например за двойно по-високи символи MultY=2, DivY=1.


Пример:

SetTextStyle(TriplexFont, HorizDir, 4);

OutText('Normal');

SetUserCharSize(1, 1, 1, 2);

OutText('Short');

SetUserCharSize(3, 1, 1, 1);

OutText('Wide');

SetUserCharSize(1, 1, 2, 1);

OutText('High');
procedure GetTextSettings(var TextInfo : TextSettingsType);

Връща текущите шрифт, посока на извеждане, размер и изравняване спрямо CP, зададени от SetTextStyle и SetTextJustify, в променлива от тип TextSettingsType.


12.3. Подпрограми за извеждане на текст

function TextHeight(TextString : string) : word;

function TextWidth(TextString : string) : word;

Връщат съответно височината (TextHeight) и широчината (TextWidth) на символен низ в брой пиксели. Използват текущия размер на шрифта, коефициент на мащабиране, зададен от SetTextStyle и посоката на извеждане на текста. Използват се за определяне на разстоянието между редове, определяне на размерите на графични прозорци и рамки за разполагане на текст.


procedure OutText(TextString : string);

Извежда низа TextString в текущата позиция на CP, като използва изравняването на текста, зададено от SetTextJustify. Ако низът е твърде дълъг, изрязва се по границите на графичния прозорец. При работа с цял екран по него се изрязват по-дългите низове само при векторните шрифтове, при стандартния матричен шрифт низът изобщо не се извежда. Влияе върху стойността на CP само при хоризонтален текст с ляво изравняване.


Пример:

MoveTo(0, 0);

SetTextStyle(DefaultFont, HorizDir, 1);

SetTextJustify(LeftText, TopText);

OutText('ABC'); { CP се обновява }

OutText('DEF'); { CP се обновява }

MoveTo(100, 100);

SetTextStyle(DefaultFont, VertDir, 1);

SetTextJustify(LeftText, TopText);

OutText('ABC'); { CP не се обновява }

OutText('DEF'); { CP не се обновява }
procedure OutTextXY(X, Y : integer; TextString : string);

Както OutText, но в посочената с (X,Y) позиция. CP не се обновява.


Пример:

SetTextJustify(CenterText, CenterText);

OutTextXY(GetMaxX div 2, GetMaxY div 2, 'Bye!');
program AutoScale;

uses Graph,Crt,Trans;

const Str:string='Auto Scale';

procedure ScaleText(Left,Top,Right,Bottom:integer;

Font:integer; Str:string);

begin

SetUserCharSize(1,1,1,1);

SetTextStyle(Font,HorizDir,UserCharSize);

SetUserCharSize(Right-Left,TextWidth(Str),

Bottom-Top,TextHeight(Str)*3 div 2);

SetTextJustify(CenterText,CenterText);

SetFillStyle(SolidFill,GetBkColor);

Bar3d(Left,Top,Right,Bottom,0,TopOff);

OutTextXY((Right+Left) div 2,(Bottom+Top) div 2, Str);

end;
procedure ScaleVertText(Left,Top,Right,Bottom:integer;

Font:integer; Str:string);

begin

SetUserCharSize(1,1,1,1);

SetTextStyle(Font,VertDir,UserCharSize);

SetUserCharSize(Bottom-Top,TextWidth(Str),

Right-Left,TextHeight(Str)*3 div 2);

SetTextJustify(CenterText,CenterText);

SetFillStyle(SolidFill,GetBkColor);

Bar3d(Left,Top,Right,Bottom,0,TopOff);

OutTextXY((Right+Left) div 2,(Bottom+Top) div 2, Str);

end;
begin

Initialize;

ScaleText(0,0,GetMaxX div 2, GetMaxY div 2, GothicFont,Str);

ScaleText(GetMaxX*2 div 3,0,GetMaxX, GetMaxY div 10,

GothicFont,Str);

ScaleVertText(GetMaxX*2 div 3, GetMaxY div 9, GetMaxX*4 div 5,

GetMaxY div 2,GothicFont,Str);

readln;

CloseGraph;

end.



      1. Каталог: files -> tu files
        tu files -> Xii. Защита и безопасност на ос
        tu files -> Електрически апарати
        tu files -> Средства за описание на синтаксиса
        tu files -> Stratofortress
        tu files -> Начало Решаване на проблеми
        tu files -> Писане на скриптове за bash шел : версия 2
        tu files -> 6Технологии на компютърната графика 1Модели на изображението
        tu files -> Z=f(x), където x- входни данни; z
        tu files -> Body name библиотека global Matrix imports (достъп по име) … var m[N, N] := … end decl., proc … resource f final code imports node, Matrix end name var x: node node; if x … Matrix m[3,4] :=: … end


        Сподели с приятели:
  1   2




©obuch.info 2024
отнасят до администрацията

    Начална страница