Áàçà çíàíèé ñòóäåíòà. Ðåôåðàò, êóðñîâàÿ, êîíòðîëüíàÿ, äèïëîì íà çàêàç

êóðñîâûå,êîíòðîëüíûå,äèïëîìû,ðåôåðàòû

Ïðîãðàììèðîâàíèå â ÑÈ — Èíôîðìàòèêà, ïðîãðàììèðîâàíèå

Êàôåäðà: Àâòîìàòèêà è Èíôîðìàöèîííûå Òåõíîëîãèè

ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈÅ Â ÑÈ ÐÀÁÎÒÀ  ÃÐÀÔÈ×ÅÑÊÎÌ ÐÅÆÈÌÅ


ÎÃËÀÂËÅÍÈÅ

1.        ÎÁÇÎÐ ÃÐÀÔÈ×ÅÑÊÈÕ ÔÓÍÊÖÈÉ3

1.1.     Îáùèå ñâåäåíèÿ

1.2.     Èíèöèàëèçàöèÿ ãðàôè÷åñêîãî äðàéâåðà è ðåæèìà

1.3.     Ðàáîòà ñ ðàñòðîì òî÷åê

1.4.     Óïðàâëåíèå öâåòîì

1.5.     Áàçîâûå ôóíêöèè äîñòóïà ê âèäåîïàìÿòè

1.6.     Ãðàôè÷åñêèå ïðèìèòèâû

1.7.     Âûâîä ãðàôè÷åñêîãî òåêñòà

2.        ÏÐÈÅÌÛ ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈß ÃÐÀÔÈ×ÅÑÊÎÃÎ ÐÅÆÈÌÀ

2.1.     Ïîäêëþ÷åíèå ãðàôè÷åñêîé áèáëèîòåêè

2.2.     Èíèöèàëèçàöèÿ ãðàôè÷åñêîãî ðåæèìà

2.3.     Âêëþ÷åíèå äðàéâåðà è øðèôòîâ â èñïîëíÿåìûé ôàéë

2.4.     Ðèñîâàíèå ãåîìåòðè÷åñêèõ ôèãóð

2.5.     Âûäåëåíèå ïàìÿòè ïîä áîëüøèå îäíîìåðíûå ìàññèâû

2.6.     Âûâîä ÷èñëîâîé èíôîðìàöèè

2.7.     Çàäåðæêà ýêðàíà

2.8.     Ðåàêöèÿ ïðîãðàììû íà íàæàòèå êîíêðåòíîé êëàâèøè

2.9.     Îðãàíèçàöèÿ ââîäà ÷èñëîâîé èíôîðìàöèè

2.10.Ïðîâåðêà âûõîäà àðãóìåíòà ôóíêöèè èç ÎÄÇ

2.11.Ãðàôè÷åñêàÿ è ìàòåìàòè÷åñêàÿ ñèñòåìû êîîðäèíàò

2.12.Èñïîëüçîâàíèå äâóõ âèäåîñòðàíèö

2.13.Ðèñîâàíèå èçîáðàæåíèé â bmp-ôîðìàòå

2.14.Ðàáîòà ñ ìûøüþ

3.        ÇÀÄÀÍÈß ÄËß ËÀÁÎÐÀÒÎÐÍÎÉ ÐÀÁÎÒÛ

3.1.     Çâåçäíîå íåáî

3.2.     Ñíåãîïàä

3.3.     Ðèñîâàíèå ãðàôèêà ôóíêöèè

3.4.     Âðàùåíèå çâåçäû

ÁÈÁËÈÎÃÐÀÔÈ×ÅÑÊÈÉ ÑÏÈÑÎÊ


1.         ÎÁÇÎÐ ÃÐÀÔÈ×ÅÑÊÈÕ ÔÓÍÊÖÈÉ

 

1.1.     Îáùèå ñâåäåíèÿ

 

Ãðàôè÷åñêèé ðåæèì ïåðñîíàëüíûõ êîìïüþòåðîâ ÿâëÿåòñÿ áîëåå ïðèâëåêàòåëüíûì, ÷åì òåêñòîâûé ðåæèì. Ñåðüåçíûå ïðîãðàììíûå ïðèëîæåíèÿ, íàïèñàííûå ïîä DOS, êàê ïðàâèëî, èìåþò ãðàôè÷åñêóþ îáîëî÷êó.

 ñàìûõ îáùèõ ÷åðòàõ ðàáîòà ñ äèñïëååì ÏÊ â ãðàôè÷åñêîì ðåæèìå ìîæåò áûòü ïðåäñòàâëåíà ñëåäóþùèì îáðàçîì. Ýêðàí äèñïëåéíîãî ìîíèòîðà ïðåäñòàâëÿåòñÿ êàê íàáîð îòäåëüíûõ òî÷åê – ïèêñåëåé (pixels, îò àíãëèéñêîãî picture elements), îáðàçóþùèé ïðÿìîóãîëüíûé ðàñòð. ×èñëî ïèêñåëåé îïðåäåëÿåò ðàçðåøàþùóþ ñïîñîáíîñòü (ðàçðåøåíèå) ãðàôè÷åñêîé ñèñòåìû è îáû÷íî îòðàæàåòñÿ ïàðîé ÷èñåë, ïåðâîå èç êîòîðûõ ïîêàçûâàåò êîëè÷åñòâî ïèêñåëåé â ñòðîêå, à âòîðîå – ÷èñëî ñòðîê. Êàæäîìó ïèêñåëþ ýêðàíà ñòàâèòñÿ â ñîîòâåòñòâèå ôèêñèðîâàííîå êîëè÷åñòâî áèòîâ (àòðèáóò ïèêñåëÿ) â íåêîòîðîé îáëàñòè àäðåñíîãî ïðîñòðàíñòâà öåíòðàëüíîãî ìèêðîïðîöåññîðà ÏÊ. Ýòà îáëàñòü, íàçûâàåìàÿ âèäåîïàìÿòüþ, êàê ïðàâèëî, ÿâëÿåòñÿ ÷àñòüþ äèñïëåéíîãî àäàïòåðà (âèäåîàäàïòåðà) – ñïåöèàëüíîãî óñòðîéñòâà, óïðàâëÿþùåãî ðàáîòîé ìîíèòîðà. Âèäåîàäàïòåð, â ÷àñòíîñòè, îñóùåñòâëÿåò öèêëè÷åñêîå âîñïðîèçâåäåíèå ñîäåðæèìîãî âèäåîïàìÿòè íà ýêðàíå ìîíèòîðà. Ïðè÷åì èçîáðàæåíèå êàæäîãî ïèêñåëÿ îïðåäåëÿåòñÿ òåêóùèì çíà÷åíèåì åãî àòðèáóòà. Òàêîé ïîäõîä ïîëó÷èë íàçâàíèå áèòîâîé êàðòû – bit-mapped graphics. Ïðîãðàììå, âûïîëíÿþùåéñÿ íà ÏÊ â ãðàôè÷åñêîì ðåæèìå, äîñòóïíû äëÿ ÷òåíèÿ è çàïèñè âñå ïèêñåëè âèäåîïàìÿòè.

 ðÿäå ñëó÷àåâ âîçìîæíî îäíîâðåìåííîå ñóùåñòâîâàíèå â âèäåîïàìÿòè äâóõ èëè áîëåå îáëàñòåé îäèíàêîâîé ñòðóêòóðû, êàæäàÿ èç êîòîðûõ ñîäåðæèò àòðèáóòû âñåõ ïèêñåëåé ýêðàíà. Òàêèå îáëàñòè íàçûâàþòñÿ ñòðàíèöàìè.  îïðåäåëåííûé ìîìåíò âðåìåíè ëþáàÿ èç ñòðàíèö ìîæåò îòîáðàæàòüñÿ âèäåîàäàïòåðîì íà äèñïëåå, çàíèìàÿ ïðè ýòîì âåñü ýêðàí. Íàëè÷èå ñòðàíèö ïîçâîëÿåò ïðîãðàììå áûñòðî ìåíÿòü èçîáðàæåíèå íà ýêðàíå, ïðîñòî ïåðåêëþ÷àÿñü ñ îäíîé ñòðàíèöû íà äðóãóþ.  ÷àñòíîñòè, ýòî äàåò âîçìîæíîñòü ïðîâîäèòü âñþ “÷åðíîâóþ ðàáîòó” ïî ïîäãîòîâêå ãðàôè÷åñêîãî èçîáðàæåíèÿ íà íåîòîáðàæàåìîé â íàñòîÿùèé ìîìåíò âðåìåíè ñòðàíèöå, èçáåãàÿ ïîÿâëåíèÿ íà ýêðàíå ïîáî÷íûõ ãðàôè÷åñêèõ ýôôåêòîâ.

Ãðàôè÷åñêîå îòîáðàæåíèå, âîçíèêàþùåå íà ýêðàíå ìîíèòîðà, ÿâëÿåòñÿ ðåçóëüòàòîì âûïîëíåíèÿ ñëåäóþùèõ äåéñòâèé:

·           àòðèáóòû ïèêñåëåé èçîáðàæåíèÿ äîëæíû áûòü çàãðóæåíû â ïàìÿòü. Îáû÷íî ýòó ðàáîòó îñóùåñòâëÿþò ñïåöèàëüíûå ôóíêöèè DOS èëè BIOS, îäíàêî âîçìîæíà è ïðÿìàÿ ðàáîòà ñ âèäåîïàìÿòüþ;

·           ñïåöèàëüíàÿ ñõåìà âèäåîàäàïòåðà îáåñïå÷èâàåò ïåðèîäè÷åñêîå ñ÷èòûâàíèå âèäåîïàìÿòè è ïðåîáðàçîâàíèå çíà÷åíèé àòðèáóòîâ ïèêñåëåé â ïîñëåäîâàòåëüíîñòü ñèãíàëîâ, óïðàâëÿþùèõ ìîíèòîðîì.

 ïåðñîíàëüíûõ êîìïüþòåðàõ èñïîëüçóþòñÿ ðàçëè÷íûå òèïû äèñïëåéíûõ àäàïòåðîâ (CGA, EGA, VGA è äð.), áîëüøèíñòâî èç êîòîðûõ ìîæåò ðàáîòàòü â ðàçëè÷íûõ ðåæèìàõ (òåêñòîâûõ è ãðàôè÷åñêèõ), íàçûâàåìûõ òàêæå âèäåîðåæèìàìè (video modes). Ãðàôè÷åñêèå ðåæèìû îäíîãî àäàïòåðà ðàçëè÷àþòñÿ ðàçðåøàþùåé ñïîñîáíîñòüþ, êîëè÷åñòâîì öâåòîâ, êîëè÷åñòâîì ñòðàíèö âèäåîïàìÿòè è ñïîñîáîì èõ àäðåñàöèè. Óñòàíîâêîé ãðàôè÷åñêîãî ðåæèìà óïðàâëÿåò ïðåðûâàíèå BIOS ñ íîìåðîì 10h.

Ïîñêîëüêó îáúåì ñòðàíèöû âèäåîïàìÿòè îãðàíè÷åí, òî êîëè÷åñòâî áèòîâ, ïðèõîäÿùèåñÿ íà îäèí ïèêñåëü, íàõîäèòñÿ â îáðàòíîé çàâèñèìîñòè îò îáùåãî êîëè÷åñòâà ïèêñåëåé íà ýêðàíå. Îáû÷íî àòðèáóò ïèêñåëÿ ñîñòîèò èç 1, 2, 4 èëè 8 áèò, â çàâèñèìîñòè îò ãðàôè÷åñêîãî ðåæèìà. Âñå ïèêñåëè, èìåþùèå îäèíàêîâîå çíà÷åíèå àòðèáóòà, îòîáðàæàþòñÿ íà ýêðàíå îäèíàêîâûì îáðàçîì.

Åñëè àòðèáóòó êàæäîãî ïèêñåëÿ â âèäåîïàìÿòè îòâîäèòñÿ òîëüêî îäèí áèò, òî ãðàôèêà áóäåò äâóõöâåòíîé, íàïðèìåð ÷åðíî-áåëîé (êîíêðåòíûå öâåòà çàâèñÿò îò òèïà ìîíèòîðà). Åñëè êàæäûé ïèêñåëü â ãðàôè÷åñêîì ðåæèìå ïðåäñòàâëÿåòñÿ n áèòàìè, òî â òàêîì ðåæèìå èìååòñÿ âîçìîæíîñòü îäíîâðåìåííî ïðåäñòàâèòü íà ýêðàíå N_pallette=2n îòòåíêîâ öâåòà (ïàëèòðà ðåæèìà).  íåêîòîðûõ ãðàôè÷åñêèõ ñèñòåìàõ ïðèíÿòî â ýòîì ñëó÷àå ãîâîðèòü î íàëè÷èè n ïëîñêîñòåé öâåòîâ (color planes).

 äèñïëåéíûõ àäàïòåðàõ ñ ìîíîõðîìíûì ìîíèòîðîì çíà÷åíèå àòðèáóòà óïðàâëÿåò èíòåíñèâíîñòüþ îäíîãî ýëåêòðîííîãî ëó÷à, ò. å. ÿðêîñòüþ òî÷êè íà ýêðàíå, à ñ öâåòíûì ìîíèòîðîì – èíòåíñèâíîñòüþ òðåõ ëó÷åé, ñîñòàâëÿþùèõ öâåòîâûå êîìïîíåíòû èçîáðàæåíèÿ ïèêñåëÿ. Êàê ïðàâèëî, èñïîëüçóåòñÿ ðàçäåëåíèå öâåòà íà RGB-êîìïîíåíòû – êðàñíóþ, çåëåíóþ è ñèíþþ. Åñëè êàæäàÿ êîìïîíåíòà èìååò N ãðàäàöèé, òî îáùåå ÷èñëî öâåòîâûõ îòòåíêîâ äëÿ òàêîãî àäàïòåðà ñîñòàâëÿåò N_colors=N3, ïðè ýòîì â ÷èñëî öâåòîâûõ îòòåíêîâ âêëþ÷àþòñÿ ÷åðíûé, áåëûé è ãðàäàöèè ñåðîãî.

Öâåòíîé âèäåîàäàïòåð èìååò ñõåìó, êîòîðàÿ îñóùåñòâëÿåò âî âðåìÿ ðàçâåðòêè êàäðà ïðåîáðàçîâàíèå çíà÷åíèÿ àòðèáóòà êàæäîãî ïèêñåëÿ â ñèãíàëû óïðàâëåíèÿ èíòåíñèâíîñòüþ ýëåêòðîííûõ ëó÷åé ìîíèòîðà, îòâå÷àþùèõ çà RGB-êîìïîíåíòû. Ðàáîòó ñõåìû ìîæíî ïðåäñòàâèòü òàáëèöåé, ïî êàæäîìó âõîäó êîòîðîé õðàíèòñÿ îïèñàíèå öâåòà, èñïîëüçóåìîãî àäàïòåðîì ïðè âûâîäå íà ýêðàí âñåõ ïèêñåëåé, çíà÷åíèÿ àòðèáóòîâ êîòîðûõ ðàâíû íîìåðó ýòîãî âõîäà. Òàêàÿ ñõåìà íàçûâàåòñÿ êàðòîé èëè òàáëèöåé öâåòîâ. Åñëè ìàêñèìàëüíûé ðàçìåð ïèêñåëÿ â ãðàôè÷åñêèõ ðåæèìàõ, ïîääåðæèâàåìûõ äàííûì àäàïòåðîì, ïðåäñòàâëÿåòñÿ m áèòàìè, òî òàáëèöà öâåòîâ òàêîãî àäàïòåðà ñîäåðæèò N_table=2m ñòðîê (âõîäîâ). Âñå òðè öâåòîâûå êîìïîíåíòû â êàðòå öâåòîâ ïðåäñòàâëåíû, êàê ïðàâèëî, äâîè÷íûìè ÷èñëàìè îäèíàêîâîé ðàçðÿäíîñòè. Ñïîñîá êîäèðîâàíèÿ öâåòà çàâèñèò îò òèïà âèäåîàäàïòåðà.

Ïðîãðàììíîå óïðàâëåíèå öâåòàìè ïèêñåëåé íà ýêðàíå äèñïëåÿ ìîæåò îñóùåñòâëÿòüñÿ áåç èçìåíåíèé çíà÷åíèé àòðèáóòîâ ïèêñåëåé â âèäåîïàìÿòè. Äëÿ ýòîãî íóæíî çàãðóçèòü ñîîòâåòñòâóþùèå çíà÷åíèÿ RGB-êîìïîíåíò â òàáëèöó öâåòîâ ïî âõîäó ñ íîìåðîì, ðàâíûì çíà÷åíèþ íóæíîãî àòðèáóòà. Èçìåíåíèÿ êàðòû öâåòîâ íåìåäëåííî îòîáðàæàþòñÿ íà ýêðàíå èçìåíåíèåì öâåòà ïèêñåëåé.

1.2.     Èíèöèàëèçàöèÿ ãðàôè÷åñêîãî äðàéâåðà è ðåæèìà

Ãðàôè÷åñêàÿ ñèñòåìà ñîñòîèò èç ÿäðà è îáøèðíîé áèáëèîòåêè ãðàôè÷åñêèõ ôóíêöèé graphics.lib (åå íóæíî ïîäêëþ÷àòü ïðè êîìïîíîâêå ïðîãðàììíîãî ìîäóëÿ). Ïðè ñîçäàíèè ïðîãðàììû, îáðàùàþùåéñÿ ê ãðàôè÷åñêèì ôóíêöèÿì, â òåêñò ïðîãðàììû íóæíî âêëþ÷èòü ôàéë, ñîäåðæàùèé ïðîòîòèïû ôóíêöèé, êîíñòàíòû, òèïû äàííûõ è ðàçëè÷íûå ïåðå÷èñëèìûå òèïû:

#include <graphics.h>

Ãðàôè÷åñêèé èíòåðôåéñ ôèðìû Borland International (BGI – Borland Graphics Interface) ñîñòîèò èç äâóõ êîìïîíåíò: ïîñòîÿííîãî ÿäðà ãðàôè÷åñêîé ñèñòåìû è íàáîðà ãðàôè÷åñêèõ äðàéâåðîâ. ßäðî ãðàôè÷åñêîé ñèñòåìû âîñïðèíèìàåò âñå çàïðîñû ïðèêëàäíîé ïðîãðàììû íà âûïîëíåíèå ãðàôè÷åñêèõ ôóíêöèé. Îíî íå çàâèñèò îò òèïà ïîäêëþ÷åííîãî äèñïëåéíîãî àäàïòåðà. Àïïàðàòíî-çàâèñèìîé ÷àñòüþ ÿâëÿþòñÿ ãðàôè÷åñêèå äðàéâåðû, îñóùåñòâëÿþùèå èíòåðôåéñ ìåæäó ÿäðîì ñèñòåìû è êîíêðåòíûì äèñïëåéíûì àäàïòåðîì.

Ãðàôè÷åñêèå äðàéâåðû ñîäåðæàòñÿ â îòäåëüíûõ ôàéëàõ ñ ðàñøèðåíèåì .bgi. Êàæäûé ôàéë ñîäåðæèò áèíàðíûé îáðàç (binary image) äðàéâåðà äëÿ îäíîãî èëè íåñêîëüêèõ áëèçêèõ ïî òèïó àäàïòåðîâ. Äëÿ èñïîëüçîâàíèÿ â ïðîãðàììå çà êàæäûì äðàéâåðîì çàêðåïëåí ïîñòîÿííûé íîìåð, êîòîðîìó ñîîòâåòñòâóåò ìàêðîïîäñòàíîâêà, íàïðèìåð, EGA èëè VGA.

Ãðàôè÷åñêèå äðàéâåðû ïîääåðæèâàþò ìíîãèå (íî íå âñå) ãðàôè÷åñêèå ðåæèìû äèñïëåéíûõ àäàïòåðîâ, ïðåäóñìîòðåííûå ñèñòåìîé BIOS. Äëÿ óêàçàíèÿ â ïðîãðàììàõ ãðàôè÷åñêèõ ðåæèìîâ, êàê è äëÿ äðàéâåðîâ, ïðåäóñìîòðåíû ìàêðîïîäñòàíîâêè (EGALO,EGAHI, VGAHI è äðóãèå).

Ïðåæäå ÷åì îáðàùàòüñÿ ê ãðàôè÷åñêèì ôóíêöèÿì, ïðîãðàììà äîëæíà âûáðàòü ãðàôè÷åñêèé äðàéâåð, ñîîòâåòñòâóþùèé äèñïëåéíîìó àäàïòåðó, è ïîäêëþ÷èòü åãî ê ÿäðó ãðàôè÷åñêîé ñèñòåìû. Ãðàôè÷åñêàÿ áèáëèîòåêà ñîäåðæèò ôóíêöèþ detectgraph, ïðåäíàçíà÷åííóþ äëÿ òåñòèðîâàíèÿ àïïàðàòóðû è àâòîìàòè÷åñêîãî âûáîðà ïîäõîäÿùåãî äðàéâåðà è ãðàôè÷åñêîãî ðåæèìà. Ïðîòîòèï ýòîé ôóíêöèè –

void far detectgraph(int far *graph_driver,int far *graph_mode);

Äàííàÿ ôóíêöèÿ ÷åðåç ñâîè àðãóìåíòû âîçâðàùàåò íîìåð ãðàôè÷åñêîãî äðàéâåðà è íîìåð ãðàôè÷åñêîãî ðåæèìà, îáåñïå÷èâàþùåãî ìàêñèìàëüíîå äëÿ àäàïòåðà ðàçðåøåíèå. Âîçâðàùåííûå ýòîé ôóíêöèåé çíà÷åíèÿ â äàëüíåéøåì ìîãóò ïåðåäàâàòüñÿ ôóíêöèè èíèöèàëèçàöèè ãðàôè÷åñêîé ñèñòåìû initgraph (íî ìîæíî äëÿ èíèöèàëèçàöèè âûáðàòü è äðóãîé ðåæèì, ïîääåðæèâàåìûé äàííûì äðàéâåðîì).

Åñëè ïðè òåñòèðîâàíèè àïïàðàòóðû äèñïëåéíîãî àäàïòåðà íå îáíàðóæåíî, òî ôóíêöèÿ graphresult âîçâðàùàåò çíà÷åíèå -2. Ôóíêöèÿ graphresult âîçâðàùàåò òåêóùåå çíà÷åíèå âíóòðåííåé ïåðåìåííîé, ñîäåðæàùåé êîä çàâåðøåíèÿ ðàáîòû ãðàôè÷åñêèõ ôóíêöèé. Åå ïðîòîòèï

int far graphresult(void);

Îòðèöàòåëüíîå çíà÷åíèå êîäà çàâåðøåíèÿ, óñòàíîâëåííîå êàêîé-ëèáî ãðàôè÷åñêîé ôóíêöèåé, õðàíèòñÿ âî âíóòðåííåé ïåðåìåííîé âïëîòü äî âûçîâà ôóíêöèè graphresult, ïîñëå ÷åãî îíî îáíóëÿåòñÿ.

Èìååòñÿ âîçìîæíîñòü ïîëó÷èòü ñòðîêó, ñîäåðæàùóþ îïèñàíèå ëþáîãî èç äîïóñòèìûõ êîäîâ çàâåðøåíèÿ ãðàôè÷åñêèõ ôóíêöèé. Äëÿ ÷åãî ñóùåñòâóåò ôóíêöèÿ grapherrormsg. Ïðîòîòèï ôóíêöèè –

char far *grapherrormsg(int error_code);

Åñëè ýòîé ôóíêöèè ïåðåäàòü çíà÷åíèå, âîçâðàùàåìîå ôóíêöèåé graphresult, òî ìîæíî ïîëó÷èòü ñîîáùåíèå î êîäå çàâåðøåíèÿ ïîñëåäíåé ãðàôè÷åñêîé ôóíêöèè.

Ãðàôè÷åñêèé äðàéâåð äîëæåí áûòü ïîìåùåí â îïåðàòèâíóþ ïàìÿòü äî òîãî, êàê ïðîèçîéäåò îáðàùåíèå ê êàêîé-íèáóäü ôóíêöèè ãðàôè÷åñêîé áèáëèîòåêè.

Ïðîñòåéøèì ñïîñîáîì âêëþ÷åíèÿ äðàéâåðà â ïðîãðàììó ÿâëÿåòñÿ åãî àâòîìàòè÷åñêàÿ çàãðóçêà ïðè ïîìîùè ôóíêöèè initgraph ñ ïðîòîòèïîì

void initgraph(int far *graph_driver,int far *graph_mode,char far *path_to_bgi);

Àðãóìåíòàìè äàííîé ôóíêöèè ÿâëÿþòñÿ óêàçàòåëè íà ïåðåìåííûå, ñîäåðæàùèå íîìåð ãðàôè÷åñêîãî äðàéâåðà, íîìåð ãðàôè÷åñêîãî ðåæèìà è ïóòü ê BGI-ôàéëó äðàéâåðà. Ôóíêöèÿ initgraph èùåò íà äèñêå BGI-ôàéë, ñîäåðæàùèé òðåáóåìûé äðàéâåð, çàãðóæàåò ôàéë öåëèêîì â äèíàìè÷åñêè âûäåëÿåìóþ ïàìÿòü è íàñòðàèâàåò ÿäðî ñèñòåìû íà ðàáîòó ñ ýòèì äðàéâåðîì. Åñëè èíèöèàëèçàöèÿ ïðîøëà óñïåøíî, ôóíêöèÿ graphresult âîçâðàòèò íóëåâîå çíà÷åíèå GR_Ok, â ïðîòèâíîì ñëó÷àå – îäíî èç îòðèöàòåëüíûõ çíà÷åíèé, îïðåäåëåííûõ â ôàéëå graphics.h.

Ôóíêöèÿ

void far closegraph(void)

ïðåêðàùàåò ðàáîòó ãðàôè÷åñêîé ñèñòåìû. Îíà îñâîáîæäàåò âñþ ïàìÿòü, âûäåëåííóþ ïî çàïðîñàì ãðàôè÷åñêèõ ôóíêöèé, î÷èùàåò áóôåð âèäåîàäàïòåðà è âîññòàíàâëèâàåò òåêñòîâûé ðåæèì, ñóùåñòâîâàâøèé ïåðåä èíèöèàëèçàöèåé ãðàôè÷åñêîé ñèñòåìû.

Ïðèìåð àâòîìàòè÷åñêîé çàãðóçêè äðàéâåðà è èíèöèàëèçàöèè
ñèñòåìû:

int main(void)

{

int gd,gm,err;

detectgraph(&gd,&gm); /* îïðåäåëåíèå íîìåðà äðàéâåðà è ðåæèìà */

err=graphresult(); /* ïîëó÷åíèå êîäà çàâåðøåíèÿ */

if(err) { printf(“\n%s”,grapherrormsg(err)); return 1; }

initgraph(&gd,&gm,”c:\\borlandc\\bgi”); /* èíèöèàëèçàöèÿ ñèñòåìû */

err=graphresult(); /* ïîëó÷åíèå êîäà çàâåðøåíèÿ */

if(err) { printf(“\n%s”,grapherrormsg(err)); return 2; }

/* ................ðàçëè÷íûå îïåðàòîðû..............*/

closegraph(); /* çàâåðøåíèå ðàáîòû ñèñòåìû */

return 0;

}

Ìîæíî íå îïðåäåëÿòü íîìåðà äðàéâåðà è ðåæèìà òåñòèðîâàíèåì àïïàðàòóðû, à çàäàâàòü èõ ïî æåëàíèþ, ãëàâíîå ïðè ýòîì ñîáëþäàòü ñîîòâåòñòâèå âûáèðàåìîãî äðàéâåðà è èìåþùåãîñÿ â ðàñïîðÿæåíèè âèäåîàäàïòåðà. Ïðèâåäåííûé âûøå ïðèìåð ìîæíî èçìåíèòü òîãäà ñëåäóþùèì ñïîñîáîì:

int main(void)

{

int gd=VGA,gm=VGAHI,err;

initgraph(&gd,&gm,”c:\\borlandc\\bgi”);

err=graphresult();

if(err)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

/* ................ðàçëè÷íûå îïåðàòîðû..............*/

closegraph();

return 0;

}

Ãëàâíûì íåäîñòàòêîì àâòîìàòè÷åñêîé çàãðóçêè äðàéâåðà ïðè ïîìîùè ôóíêöèè initgraph ÿâëÿåòñÿ òî, ÷òî îíà îáðàùàåòñÿ ê äèñêó äëÿ ÷òåíèÿ BGI-ôàéëà âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû. Àëüòåðíàòèâîé àâòîìàòè÷åñêîé çàãðóçêå ãðàôè÷åñêîãî äðàéâåðà ÿâëÿåòñÿ åãî ñòàòè÷åñêîå âêëþ÷åíèå íà ýòàïå ïîñòðîåíèÿ ïðîãðàììû. Ïðåäâàðèòåëüíî áèíàðíûé ôàéë äðàéâåðà .bgi äîëæåí áûòü ïðåâðàùåí â îáû÷íûé îáúåêòíûé ôàéë òèïà .obj ñïåöèàëüíîé óòèëèòîé bgiobj.exe. Êñòàòè, äàííàÿ óòèëèòà èñïîëüçóåòñÿ òàêæå äëÿ êîíâåðòèðîâàíèÿ chr-ôàéëîâ ñ ãðàôè÷åñêèìè øðèôòàìè â îáúåêòíûå ìîäóëè. Ïîëó÷åííûå îáúåêòíûå ìîäóëè ïîäêëþ÷àþòñÿ íà ýòàïå êîìïîíîâêè.

 ïðîãðàììå, ïðåæäå ÷åì èíèöèàëèçèðîâàòü ãðàôè÷åñêóþ ñèñòåìó, íåîáõîäèìî íóæíûå äðàéâåðû çàðåãèñòðèðîâàòü, ò. å. ñîîáùèòü ãðàôè÷åñêîé ñèñòåìå, ÷òî äàííûé äðàéâåð óæå íàõîäèòñÿ â îïåðàòèâíîé ïàìÿòè. Äëÿ ýòîãî ñóùåñòâóåò ôóíêöèÿ registerbgidriver, êîòîðîé íóæíî ñîîáùèòü ìåñòîïîëîæåíèå äðàéâåðà:

int registerbgidriver(void (*driver)(void));

Àðãóìåíò ôóíêöèè – èìÿ óêàçàòåëÿ íà ìåñòî â ïàìÿòè, ñîäåðæàùåå ðåãèñòðèðóåìûé äðàéâåð. Èìåíà ïîäîáíûõ óêàçàòåëåé óæå îïðåäåëåíû â îáúåêòíûõ ôàéëàõ, ñîçäàííûõ ïðè ïîìîùè óòèëèòû bgiobj.exe. Íèæå ïðèâåäåíû ïðîòîòèïû ôóíêöèé, èìåíà êîòîðûõ íóæíî óïîòðåáëÿòü äëÿ ñòàíäàðòíûõ äðàéâåðîâ:

void CGA_driver(void);

void EGAVGA_driver(void);

void IBM8514_driver(void);

void Herc_driver(void);

void ATT_driver(void);

void PC3270_driver(void).

Åñëè ðåãèñòðàöèÿ ïðîøëà óñïåøíî, ôóíêöèÿ graphresult âîçâðàòèò íóëåâîå çíà÷åíèå, â ïðîòèâíîì ñëó÷àå -4. Ïîñëå ðåãèñòðàöèè äðàéâåðà ìîæíî èíèöèàëèçèðîâàòü ãðàôè÷åñêóþ ñèñòåìó ïðè ïîìîùè ôóíêöèè initfgraph, ïðè ýòîì åå òðåòèé ïàðàìåòð íå èñïîëüçóåòñÿ (ïåðåäàåòñÿ íóëåâàÿ ñòðîêà “”).

Ïðèìåð ñòàòè÷åñêîé çàãðóçêè äðàéâåðà è èíèöèàëèçàöèè ñèñòåìû:

int main(void)

{

int gd,gm,err;

detectgraph(&gd,&gm);

err=graphresult();

if(err)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

registerbgidriver(EGAVGA_driver);

err=graphresult(); /* ïîëó÷åíèå êîäà çàâåðøåíèÿ */

if(err)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

initgraph(&gd,&gm,""); /* èíèöèàëèçàöèÿ ñèñòåìû */

if((err = graphresult()) != grOk)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

/* ................ðàçëè÷íûå îïåðàòîðû..............*/

closegraph(); /* çàâåðøåíèå ðàáîòû ñèñòåìû */

return 0;

}

Åñëè ãðàôè÷åñêàÿ ñèñòåìà àêòèâèçèðîâàíà è íåîáõîäèìî ïî õîäó âûïîëíåíèÿ ïðîãðàììû ïåðåêëþ÷èòüñÿ íà èñïîëüçîâàíèå äðóãîãî ãðàôè÷åñêîãî äðàéâåðà, òî äî ïîâòîðíîãî âûçîâà ôóíêöèè initgraph íåîáõîäèìî ñáðîñèòü ãðàôè÷åñêóþ ñèñòåìó ôóíêöèåé closegraph äëÿ îñâîáîæäåíèÿ âñåé ïàìÿòè, êîòîðóþ çàíèìàëà ñèñòåìà.

Èìÿ òåêóùåãî ãðàôè÷åñêîãî äðàéâåðà ìîæíî óçíàòü ñ ïîìîùüþ ôóíêöèè

char far *getdrivername(void);

Îíà âîçâðàùàåò óêàçàòåëü íà ñòðîêó, ñîäåðæàùóþ èìÿ àêòèâíîãî â äàííûé ìîìåíò äðàéâåðà.

Ìàêñèìàëüíîå çíà÷åíèå íîìåðà ãðàôè÷åñêîãî ðåæèìà, äîïóñòèìîå äëÿ òåêóùåãî ãðàôè÷åñêîãî äðàéâåðà, ìîæíî óçíàòü ñ ïîìîùüþ ôóíêöèè

int far getmaxmode(void);

Òåêóùåå çíà÷åíèå íîìåðà ãðàôè÷åñêîãî ðåæèìà äëÿ àêòèâèçèðîâàííîãî äðàéâåðà âîçâðàùàåò ôóíêöèÿ

int far getgraphmode(void);

Ïî íîìåðó ðåæèìà ìîæíî ïîëó÷èòü ñòðîêó ñ îïèñàíèåì äàííîãî ðåæèìà äëÿ òåêóùåãî äðàéâåðà. Ýòî äåëàåòñÿ ñ ïîìîùüþ ôóíêöèè

char far *getmodename(int mode_number);

 ãðàôè÷åñêîé áèáëèîòåêå åñòü ôóíêöèÿ îïðåäåëåíèÿ ìèíèìàëüíî è ìàêñèìàëüíî äîïóñòèìûõ çíà÷åíèé íîìåðà ãðàôè÷åñêîãî ðåæèìà äëÿ ãðàôè÷åñêîãî äðàéâåðà, íîìåð êîòîðîãî åé ïåðåäàåòñÿ (íåîáÿçàòåëüíî àêòèâèçèðîâàííîãî)

void far getmoderange(int graph_driver,int far *min_mode,int far *max_mode);

Åñòü äâå ôóíêöèè, ïîçâîëÿþùèå èçìåíÿòü óñòàíîâëåííûé ãðàôè÷åñêèé ðåæèì áåç ïîâòîðíîãî îáðàùåíèÿ ê ôóíêöèè initgraph è äàæå ïåðåõîäèòü âðåìåííî â òåêñòîâûé ðåæèì ðàáîòû âèäåîàäàïòåðà. Åñëè íóæíî ïåðåéòè â äðóãîé ãðàôè÷åñêèé ðåæèì àêòèâèçèðîâàííîãî â äàííûé ìîìåíò äðàéâåðà, òî ìîæíî âîñïîëüçîâàòüñÿ ôóíêöèåé

void far setgraphmode(int new_mode);

Àðãóìåíò new_mode ïåðåäàåò æåëàåìûé íîìåð ðåæèìà äëÿ òåêóùåãî äðàéâåðà è íå äîëæåí ïðåâîñõîäèòü ìàêñèìàëüíî äîïóñòèìîå äëÿ ýòîãî äðàéâåðà çíà÷åíèå.

Äëÿ âðåìåííîãî ïåðåõîäà â òåêñòîâûé ðåæèì ïðåäóñìîòðåíà
ôóíêöèÿ

void far restorecrtmode(void);

Ýòà ôóíêöèÿ ïåðåâîäèò âèäåîàäàïòåð â òîò òåêñòîâûé ðåæèì, â êîòîðîì îí íàõîäèëñÿ â ìîìåíò ïîñëåäíåé èíèöèàëèçàöèè ãðàôè÷åñêîé ñèñòåìû, ò. å. íåïîñðåäñòâåííî ïåðåä îáðàùåíèåì ê ôóíêöèè initgraph. Èç òåêñòîâîãî ðåæèìà ìîæíî âåðíóòüñÿ â ãðàôè÷åñêèé ïðè ïîìîùè ôóíêöèè setgraphmode.

Ïðè èíèöèàëèçàöèè ãðàôè÷åñêîé ñèñòåìû âñåâîçìîæíûå ïàðàìåòðû ñèñòåìû óñòàíàâëèâàþòñÿ ïî óìîë÷àíèþ. Ðàçëè÷íûå ôóíêöèè ìîãóò ìåíÿòü çíà÷åíèÿ ïàðàìåòðîâ. Äëÿ òîãî ÷òîáû â ëþáîé ìîìåíò âîññòàíîâèòü õàðàêòåðèñòèêè ñèñòåìû, óñòàíîâëåííûå ïðè åå èíèöèàëèçàöèè, ñóùåñòâóåò ôóíêöèÿ

void far graphdefaults(void);

Ïåðå÷èñëèì äåéñòâèÿ, âûïîëíÿåìûå äàííîé ôóíêöèåé:

·           äëÿ âûâîäà è îòîáðàæåíèÿ íà ýêðàíå âûáèðàåòñÿ íóëåâàÿ ñòðàíèöà âèäåîïàìÿòè;

·           ãðàôè÷åñêîå îêíî óñòàíàâëèâàåòñÿ ðàçìåðîì âî âñþ ñòðàíèöó;

·           òåêóùàÿ ãðàôè÷åñêàÿ ïîçèöèÿ ïåðåìåùàåòñÿ â òî÷êó (0,0);

·           óñòàíàâëèâàþòñÿ ïî óìîë÷àíèþ öâåòà ïàëèòðû, òåêóùèé ðèñóþùèé öâåò (15) è öâåò ôîíà (0);

·           óñòàíàâëèâàåòñÿ ñïëîøíîé øàáëîí äëÿ ðèñîâàíèÿ ëèíèé è çàïîëíåíèÿ îáëàñòåé;

·           èíèöèàëèçèðóåòñÿ âñòðîåííûé ìàòðè÷íûé øðèôò ñî ñòàíäàðòíûì ðàñïîëîæåíèåì è ïîçèöèîíèðîâàíèåì ñòðîêè.

1.3.     Ðàáîòà ñ ðàñòðîì òî÷åê

Ðàñòðîì òî÷åê íàçûâàåòñÿ äâóìåðíàÿ ñîâîêóïíîñòü òî÷åê, ïðåäñòàâëÿþùàÿ ýêðàí äèñïëåÿ.

×òîáû â ïðèêëàäíîé ïðîãðàììå èìåòü âîçìîæíîñòü îòîáðàçèòü íà ýêðàíå ëþáóþ èç èìåþùèõñÿ ñòðàíèö âèäåîïàìÿòè, â ãðàôè÷åñêîé áèáëèîòåêå ïðåäóñìîòðåíà ôóíêöèÿ

void far setvisualpage(int page);

Ôóíêöèÿ íåìåäëåííî îòîáðàæàåò íà ýêðàíå òó ñòðàíèöó âèäåîïàìÿòè, íîìåð êîòîðîé áûë åé ïåðåäàí â êà÷åñòâå àðãóìåíòà. Ñòðàíèöû íóìåðóþòñÿ ñ íóëÿ. Ôóíêöèÿ graphresult íå ðåàãèðóåò íà ïîïûòêó óñòàíîâèòü íåäîïóñòèìûé íîìåð ñòðàíèöû. Âñÿ îòâåòñòâåííîñòü çà ïðàâèëüíîñòü óêàçàííîãî íîìåðà ëåæèò íà ïðîãðàììèñòå. Ôóíêöèÿ

void far setactivepage(int page);

íå âûçûâàåò ïåðåðèñîâêè ñòðàíèöû íà ýêðàíå äèñïëåÿ, íî çàòî íàïðàâëÿåò âåñü ïîñëåäóþùèé ãðàôè÷åñêèé âûâîä íà òó ñòðàíèöó, êîòîðàÿ óêàçàíà åå àðãóìåíòîì. Êàê è ïðè âûçîâå ïðåäûäóùåé ôóíêöèè, îòâåòñòâåííîñòü çà äîïóñòèìîñòü íîìåðà ñòðàíèöû îñòàåòñÿ íà ïðîãðàììèñòå.

Ñòðàíèöó âèäåîïàìÿòè (è ýêðàí äèñïëåÿ) ìîæíî ïðåäñòàâèòü êàê äâóìåðíûé ïðÿìîóãîëüíûé ìàññèâ òî÷åê (ïèêñåëåé). Íà ýòîì ìàññèâå òî÷åê ââîäèòñÿ ñèñòåìà êîîðäèíàò X, Y. Íà÷àëî ñèñòåìû ëåæèò â ëåâîì âåðõíåì óãëó ñòðàíèöû (ýêðàíà). Îñü X ïðîõîäèò ïî âåðõíåìó êðàþ ñòðàíèöû ñëåâà íàïðàâî, à îñü Y – ïî ëåâîìó êðàþ ñâåðõó âíèç. Ëåâàÿ âåðõíÿÿ òî÷êà ñòðàíèöû èìååò êîîðäèíàòû (0, 0), ïðàâàÿ íèæíÿÿ – êîîðäèíàòû (M-1, N-1), ãäå M è N – ðàçìåðû ñòðàíèö ïî ãîðèçîíòàëè è âåðòèêàëè.

Îïðåäåëèòü ìàêñèìàëüíûå çíà÷åíèÿ êîîðäèíàò òî÷åê ìîæíî ñ ïîìîùüþ ôóíêöèé

int far getmaxx(void);

int far getmaxy(void);

Çíà÷åíèÿ, âîçâðàùàåìûå ýòèìè ôóíêöèÿìè, çàâèñÿò òîëüêî îò òåêóùåãî ðåæèìà, óñòàíîâëåííîãî ôóíêöèÿìè initgraph èëè setgraphmode.

 ðàñïîðÿæåíèè ïðîãðàììèñòà êðîìå ñòðàíèöû êàê öåëîãî èìååòñÿ åùå îäíà äâóìåðíàÿ ñòðóêòóðà. Âíóòðè îñíîâíîãî ìàññèâà òî÷åê ñòðàíèöû âñåãäà âûäåëåí íåêîòîðûé åãî ïîäìàññèâ, êîòîðûé íàçûâàåòñÿ ãðàôè÷åñêèì îêíîì (viewport). Ãðàôè÷åñêîå îêíî ÿâëÿåòñÿ ïðÿìîóãîëüíûì ìàññèâîì òî÷åê ñî ñâîåé ñèñòåìîé êîîðäèíàò. Íà÷àëî ýòîé ñèñòåìû êîîðäèíàò íàõîäèòñÿ â ëåâîì âåðõíåì óãëó ãðàôè÷åñêîãî îêíà, à îñè X è Y ïàðàëëåëüíû ñîîòâåòñòâóþùèì îñÿì êîîðäèíàò ñòðàíèöû. Ñàìî îêíî èìååò ïåðåìåííûå ðàçìåðû è ìîæåò ðàñïîëàãàòüñÿ â ëþáîì ìåñòå ýêðàíà. Çàìåíà ñòðàíèöû íèêàê íå âëèÿåò íà õàðàêòåðèñòèêè îêíà.

Ìíîãèå ôóíêöèè, èñïîëüçóþùèå êîîðäèíàòû òî÷åê, ïîäðàçóìåâàþò èìåííî ñèñòåìó êîîðäèíàò ãðàôè÷åñêîãî îêíà. Áëàãîäàðÿ ýòîìó ïîÿâëÿåòñÿ âîçìîæíîñòü èñïîëüçîâàòü îäíó è òó æå ïðîãðàììó äëÿ âûïîëíåíèÿ íåêîòîðîé ãðàôè÷åñêîé ðàáîòû â îêíå íåçàâèñèìî îò òîãî, â êàêîì ìåñòå ñòðàíèöû è äàæå íà êàêîé èìåííî ñòðàíèöå îêíî íàõîäèòñÿ â äàííûé ìîìåíò.  äàëüíåéøåì ïðè îïèñàíèè òàêèõ ôóíêöèé âñåãäà áóäåò óêàçûâàòüñÿ, êàêàÿ ñèñòåìà êîîðäèíàò (ñòðàíèöû èëè îêíà) èìååòñÿ â âèäó.

Ïðè óñòàíîâêå ãðàôè÷åñêîãî ðåæèìà ïðè ïîìîùè ôóíêöèé initgraph è setgraphmode ñðàçó æå ñîçäàåòñÿ è ãðàôè÷åñêîå îêíî, ñîâïàäàþùåå ïî ðàçìåðàì ñî âñåé ñòðàíèöåé. Îäíàêî åñòü âîçìîæíîñòü óïðàâëÿòü ðàçìåðàìè è ðàñïîëîæåíèåì ãðàôè÷åñêîãî îêíà äèíàìè÷åñêè. Äåëàåòñÿ ýòî ñ ïîìîùüþ ôóíêöèè

void far setviewport(int left.int top,int right,int bottom,int clip);

Ïåðâûå ÷åòûðå àðãóìåíòà – ýòî êîîðäèíàòû ëåâîé âåðõíåé è ïðàâîé íèæíåé ãðàíèö ãðàôè÷åñêîãî îêíà â ñèñòåìå êîîðäèíàò ñòðàíèöû. Íè îäíà èç ãðàíèö îêíà íå ìîæåò ëåæàòü çà ïðåäåëàìè ñòðàíèöû. Ïîñëåäíèé àðãóìåíò óñòàíàâëèâàåò ðåæèì îòñå÷åíèÿ: åñëè îí íå íóëåâîé, òî âñÿêèé ãðàôè÷åñêèé âûâîä áóäåò îáðåçàòüñÿ íà ãðàíèöàõ ãðàôè÷åñêîãî îêíà. Åñëè ïðè âûçîâå ôóíöèè setviewport áûëè íåâåðíî çàäàíû àðãóìåíòû, òî ôóíêöèÿ graphresult âîçâðàòèò -11 è ñîõðàíèòñÿ ïðåäûäóùàÿ óñòàíîâêà ãðàôè÷åñêîãî îêíà. Ôóíêöèÿ setviewport íå ìåíÿåò ñîäåðæèìîå ñòðàíèöû âèäåîïàìÿòè.

Äëÿ òîãî ÷òîáû ìîæíî áûëî â ëþáîé ìîìåíò óçíàòü òåêóùóþ óñòàíîâêó ãðàôè÷åñêîãî îêíà, ñóùåñòâóåò ôóíêöèÿ

void far getviewsettings(struct viewporttype far *viewport);

Äàííàÿ ôóíêöèÿ ïîìåùàåò ïàðàìåòðû òåêóùåãî îêíà â ñòðóêòóðó *viewport. Òèï ýòîé ñòðóêòóðû îïðåäåëåí â ôàéëå graphics.h:

struct viewporttype

{

int left,top,right,bottom;

int clip;

}

Âîçâðàùàåìûå êîîðäèíàòû ïðåäñòàâëåíû â ñèñòåìå êîîðäèíàò ñòðà­íèöû.

Ñ ãðàôè÷åñêèì îêíîì ñâÿçàíî ïîíÿòèå òåêóùåé ãðàôè÷åñêîé ïîçèöèè CP (current graphics position). Ýòî ãðàôè÷åñêèé ýêâèâàëåíò êóðñîðà â òåêñòîâîì ðåæèìå. Òåêóùàÿ ãðàôè÷åñêàÿ ïîçèöèÿ ñàìà ñîáîé íèêàê íå îòîáðàæàåòñÿ íà ýêðàíå è èäåíòèôèöèðóåò âûáðàííûé ïèêñåëü ãðàôè÷åñêîãî îêíà, ê êîòîðîìó ïðèâÿçûâàåòñÿ äåéñòâèå íåêîòîðûõ ôóíêöèé, òàêèõ êàê âû÷åð÷èâàíèå ïðÿìîëèíåéíûõ îòðåçêîâ èëè âûâîä ãðàôè÷åñêèõ òåêñòîâ.

Ïðè óñòàíîâêå íîâîãî ãðàôè÷åñêîãî îêíà òåêóùàÿ ïîçèöèÿ àâòîìàòè÷åñêè ïîìåùàåòñÿ â åãî íà÷àëî êîîðäèíàò. Äëÿ ÿâíîãî èçìåíåíèÿ ïîëîæåíèÿ òåêóùåé ïîçèöèè èñïîëüçóþòñÿ ôóíêöèè

void far moveto(int x, int y);

void far moverel(int dx, int dy);

Ïåðâàÿ ïîìåùàåò CP ïî óêàçàííûì êîîðäèíàòàì ãðàôè÷åñêîãî îêíà. Âòîðàÿ ïåðåìåùàåò CP íà âåêòîð (dx, dy).

Êîîðäèíàòû òåêóùåé ãðàôè÷åñêîé ïîçèöèè â ñèñòåìå êîîðäèíàò ãðàôè÷åñêîãî îêíà âîçâðàùàþò ôóíêöèè:

int far getx(void);

int far gety(void);

Ïðè ïåðåóñòàíîâêå ãðàôè÷åñêîãî îêíà ôóíêöèåé setviewport ñîäåðæèìîå ñòðàíèöû âèäåîïàìÿòè íå èçìåíÿåòñÿ. Äëÿ î÷èñòêè ãðàôè÷åñêîãî îêíà íà àêòèâíîé â äàííûé ìîìåíò ñòðàíèöå èñïîëüçóåòñÿ ôóíêöèÿ

void far clearviewport(void);

CP ïðè ýòîì ïåðåìåùàåòñÿ â íà÷àëî êîîðäèíàò ãðàôè÷åñêîãî îêíà.

Ïîõîæàÿ ôóíêöèÿ

void far cleardevice(void);

î÷èùàåò âñþ àêòèâíóþ ñòðàíèöó. Óñòàíîâêà ãðàôè÷åñêîãî îêíà ïðè ýòîì íå èçìåíÿåòñÿ, à CP ïåðåìåùàåòñÿ â åãî íà÷àëî êîîðäèíàò.

Íà ìíîãèõ ìîíèòîðàõ ïèêñåëü, êîòîðûé âûñâå÷èâàåòñÿ íà ýêðàíå, èìååò ôîðìó ïðÿìîóãîëüíèêà, âûòÿíóòîãî ïî âåðòèêàëè. Ýòî îáúÿñíÿåòñÿ òåì, ÷òî íà äèñïëåå ñòðàíèöà âèäåîáóôåðà îòîáðàæàåòñÿ íà âåñü ýêðàí, à ïðîïîðöèè ýêðàíà è ñòðàíèöû â ðåæèìå ìàêñèìàëüíîãî ðàçðåøåíèÿ, êàê ïðàâèëî, íå ñîâïàäàþò (èñêëþ÷åíèå – ìîíèòîðû ñ àäàïòåðàìè VGA, ãäå â ðåæèìå ñ ðàçðåøåíèåì 640 õ 480 òî÷åê âñå ïèêñåëè êâàäðàòíûå). Òàêîå íåñîîòâåòñòâèå ïðèâîäèò ê âîçíèêíîâåíèþ àíèçîòðîïíîñòè ðàñòðà ïèêñåëåé: ãîðèçîíòàëüíûé è âåðòèêàëüíûé îòðåçêè, ñîäåðæàùèå îäèíàêîâîå ÷èñëî ïèêñåëåé, íà ýêðàíå áóäóò âûãëÿäåòü, êàê îòðåçêè ðàçíîé äëèíû.

Òåì íå ìåíåå, îêðóæíîñòè è èõ äóãè ðèñóþòñÿ ôóíêöèÿìè áèáëèîòåêè ïðàâèëüíî, òàê êàê ýòè ôóíêöèè èñïîëüçóþò õðàíÿùèéñÿ â ãðàôè÷åñêîé ñèñòåìå êîððåêòèðóþùèé êîýôôèöèåíò ïðîïîðöèîíàëüíîñòè (aspect ratio), ó÷èòûâàþùèé “ñòåïåíü íåêâàäðàòíîñòè” ïèêñåëÿ. ×òîáû ïðàâèëüíî íàðèñîâàòü êâàäðàò, íåîáõîäèìî ïðîèçâåñòè êîððåêòèðîâêó êîëè÷åñòâà ïèêñåëåé ïî åãî ãîðèçîíòàëüíîé è âåðòèêàëüíîé ñòîðîíàì. Èñòèííûå ïðîïîðöèè ïèêñåëÿ íà äàííîì äèñïëåå ìîæíî óçíàòü ñ ïîìîùüþ ôóíêöèè

void far getaspectratio(int far *x_asp,int far *y_asp);

Äàííàÿ ôóíêöèÿ ÷åðåç ñâîè àðãóìåíòû âîçâðàùàåò èñêîìîå çíà÷åíèå, ïðè÷åì *y_asp âñåãäà óñòàíàâëèâàåòñÿ ðàâíûì 10 000, à âåëè÷èíà *x_asp ≤ *y_asp. Îòíîøåíèå *x_asp ê *y_asp êàê ðàç è åñòü îòíîøåíèå ãîðèçîíòàëüíîãî è âåðòèêàëüíîãî ðàçìåðîâ ïèêñåëÿ. Òåïåðü, åñëè ãîðèçîíòàëüíàÿ ñòîðîíà êâàäðàòà ïðåäñòàâëåíà îòðåçêîì äëèíîé X ïèêñåëåé, òî äëèíà âåðòèêàëüíîé ñòîðîíû äîëæíà áûòü ðàâíà çíà÷åíèþ âûðàæåíèÿ

Y = (int)(X ∙ (float)(*x_asp) / (*y_asp)).

Çàìåòèì, ÷òî êîýôôèöèåíò “íåêâàäðàòíîñòè” àâòîìàòè÷åñêè ó÷èòûâàåòñÿ òîëüêî ôóíêöèÿìè, êîòîðûå ðèñóþò îêðóæíîñòè è èõ äóãè, íî íèêàê íå âëèÿåò íà ôóíêöèè ðèñîâàíèÿ ýëëèïñîâ è èõ äóã.

1.4.     Óïðàâëåíèå öâåòîì

Öâåòîâûå âîçìîæíîñòè ôóíêöèé ãðàôè÷åñêîé áèáëèîòåêè Borland C îïèñûâàþòñÿ â òåðìèíàõ öâåòîâîé ïàëèòðû ðåæèìà – çàêîíà, ïî êîòîðîìó êàæäîìó äîïóñòèìîìó çíà÷åíèþ àòðèáóòà ïèêñåëÿ ñòàâèòñÿ â ñîîòâåòñòâèå öâåò, êîòîðûì ýòîò ïèêñåëü áóäåò îòîáðàæàòüñÿ íà ýêðàíå.

Ïàëèòðó ðåæèìà ìîæíî ïðåäñòàâèòü êàê òàáëèöó, ñîäåðæàùóþ ñòîëüêî ñòðîê (âõîäîâ), ñêîëüêî çíà÷åíèé äîïóñêàåòñÿ äëÿ àòðèáóòà ïèêñåëÿ â äàííîì ãðàôè÷åñêîì ðåæèìå. Ñòðîêè ïàëèòðû ðåæèìà íóìåðóþòñÿ îò íóëÿ äî N_palette-1.  ñòðîêå ñ íîìåðîì k ñîäåðæèòñÿ êîä öâåòà, êîòîðûì àïïàðàòóðà âèäåîàäàïòåðà îòîáðàæàåò íà ýêðàíå âñå ïèêñåëè ñòðàíèöû, àòðèáóòû êîòîðûõ ðàâíû k. Íóëåâîé âõîä ïàëèòðû ðåæèìà, êðîìå òîãî, îïðåäåëÿåò öâåò ôîíà ýêðàíà.

Âñå ãðàôè÷åñêèå ðåæèìû ìîæíî ðàçäåëèòü íà òðè ãðóïïû:

·           ìîíîõðîìíûå ðåæèìû, â êîòîðûõ âñå ïèêñåëè ìîãóò áûòü äâóõ öâåòîâ – îñíîâíîãî è ôîíîâîãî. Ïàëèòðó òàêèõ ðåæèìîâ èçìåíèòü íåâîçìîæíî;

·           öâåòíûå ðåæèìû ñ ôèêñèðîâàííîé ïàëèòðîé. Äëÿ èçìåíåíèÿ ïàëèòðû ðåæèìà íóæíî ìåíÿòü ãðàôè÷åñêèé ðåæèì, ÷òî ïðèâîäèò ê ïîòåðå ñîäåðæèìîãî âèäåîïàìÿòè;

·           ãðàôè÷åñêèå ðåæèìû, ïîçâîëÿþùèå äèíàìè÷åñêè (áåç ïîòåðè ñîäåðæèìîãî âèäåîïàìÿòè) èçìåíÿòü êîä öâåòà ïî ëþáîìó âõîäó ïàëèòðû ðåæèìà. Ê äàííûì ðåæèìàì îòíîñÿòñÿ ðåæèìû äðàéâåðîâ EGA, VGA, IBM8514.

Ìåõàíèçì óïðàâëåíèÿ öâåòîì â Borland C âêëþ÷àåò â ñåáÿ âàæíûé ýëåìåíò – ñòðóêòóðó äàííûõ, íàçûâàåìóþ âíóòðåííåé ïàëèòðîé. Ïðè ðàáîòå â ãðàôè÷åñêèõ ðåæèìàõ íà âñåõ äèñïëåéíûõ àäàïòåðàõ, êðîìå VGA è IBM8514, îíà ñîäåðæèò êîäû öâåòîâ èç òàáëèöû öâåòîâ àäàïòåðà. Ðîëü âíóòðåííåé ïàëèòðû ïðè ðàáîòå ñ àäàïòåðîì VGA íåñêîëüêî èíàÿ è áóäåò ðàññìîòðåíà íèæå. Äðàéâåð IMB8514 âîîáùå íå ïîëüçóåòñÿ âíóòðåííåé ïàëèòðîé, ïîýòîìó â äàëüíåéøåì âñå, ÷òî áóäåò ãîâîðèòüñÿ î ðàáîòå ñ âíóòðåííåé ïàëèòðîé, íå îòíîñèòñÿ ê ýòîìó äðàéâåðó. Íå ñëåäóåò ïóòàòü âíóòðåííþþ ïàëèòðó (îáû÷íóþ ïåðåìåííóþ ñòðóêòóðíîãî òèïà) ãðàôè÷åñêîé ñèñòåìû ñ ïàëèòðîé ðåæèìà ñ çàêîíîì ïðåîáðàçîâàíèÿ çíà÷åíèÿ ïèêñåëÿ â öâåò.

Îïðåäåëåíèå âíóòðåííåé ïàëèòðû êàê ñòðóêòóðû äàííûõ èìååò âèä:

#define MAXCOLOR 15

struct palettetype

{

unsigned char size;

signed char colors[MAX_COLORS+1];

};

ãäå size – ýòî ÷èñëî ñòðîê âíóòðåííåé ïàëèòðû, ðàçðåøåííîå äëÿ èñïîëüçîâàíèÿ â òåêóùåì ãðàôè÷åñêîì ðåæèìå, à colors – ìàññèâ çàêîäèðîâàííûõ îïèñàíèé öâåòà.

Äëÿ âñåõ ìîíîõðîìíûõ ðåæèìîâ è ðåæèìîâ ñ ôèêñèðîâàííûìè ïàëèòðàìè äîïóñêàåòñÿ èñïîëüçîâàíèå âî âíóòðåííåé ïàëèòðå 16 öâåòîâ, êîòîðûå â òî÷íîñòè ñîâïàäàþò ñî ñòàíäàðòíûìè öâåòàìè òåêñòîâîãî ðåæèìà. Êàæäûé öâåò ïàëèòðû êîäèðóåòñÿ ÷èñëîì îò 0 äî 15. Ïðè èíèöèàëèçàöèè òàêèõ ãðàôè÷åñêèõ ðåæèìîâ çíà÷åíèå êàæäîãî ýëåìåíòà ìàññèâà colors ñîâïàäàåò ñ åãî èíäåêñîì.

 ðåæèìàõ ñ äèíàìè÷åñêèì óïðàâëåíèåì âíóòðåííÿÿ ïàëèòðà ñîäåðæèò 16 öâåòîâ, êîäû êîòîðûõ ìîãóò ëåæàòü â äèàïàçîíå îò 0 äî 63
(ò. å. èìååòñÿ âîçìîæíîñòü ìåíÿòü ñîäåðæàíèå âíóòðåííåé ïàëèòðû). Äëÿ 16 êîäîâ öâåòîâ ñòàíäàðòíîãî íàáîðà, óñòàíàâëèâàåìûõ ïðè èíèöèàëèçàöèè ýòèõ ðåæèìîâ (êàê äëÿ äðàéâåðà EGA, òàê è VGA), îïðåäåëåí ïåðå÷èñëèìûé òèï EGA_COLORS, ò. å. ñòàíäàðòíûå êîäû öâåòîâ èìåþò ñèìâîëè÷åñêèå èìåíà:

enum EGA_COLORS

{

EGA_BLACK=0, EGA_BLUE=1, EGA_GREEN=2, EGA_CYAN=3, EGA_RED=4, EGA_MAGENTA=5, EGA_BROWN=20, EGA_LIGHTGRAY=7, EGA_DARKGRAY=56, EGA_LIGHTBLUE=57, EGA_LIGHTGREEN=58, ÅGA_LIGHTCYAN=59, EGA_LIGHTRED=60, EGA_LIGHTMAGENTA=61, EGA_YELLOW=62, EGA_WHITE=63

};

Êîëè÷åñòâî äèíàìè÷åñêè óïðàâëÿåìûõ ñòðîê òàáëèöû öâåòîâ äëÿ òåêóùåãî ãðàôè÷åñêîãî ðåæèìà ìîæíî îïðåäåëèòü ïðè ïîìîùè ôóíêöèè:

int far getpalettesize(void);

Ïðè îïðåäåëåíèè ðåàëüíîãî öâåòà ïèêñåëÿ íà ýêðàíå çíà÷åíèå åãî àòðèáóòà èñïîëüçóåòñÿ êàê èíäåêñ â òàáëèöå öâåòîâ äèñïëåéíîãî àäàïòåðà. Ìàêñèìàëüíîå çíà÷åíèå àòðèáóòà ïèêñåëÿ, êîòîðîå ðàçðåøàåòñÿ èñïîëüçîâàòü äëÿ çàïèñè â âèäåîïàìÿòü òàêèìè ôóíêöèÿìè, êàê ãðàôè÷åñêèå ïðèìèòèâû, âîçâðàùàåòñÿ ôóíêöèåé

int far getmaxcolor(void);

Íåïîñðåäñòâåííîå èçìåíåíèå âíóòðåííåé ïàëèòðû îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ôóíêöèé setpalette èëè setallpalette. Ïåðâàÿ èçìåíÿåò ñîäåðæàíèå òîëüêî îäíîãî âõîäà ïàëèòðû, à âòîðàÿ âñåõ ñðàçó. Ñèíòàêñèñ ïåðâîé ôóíêöèè:

void far setpalette(int num_color_pallete,int num_color);

Àðãóìåíò num_color_palette çàäàåò íîìåð èçìåíÿåìîãî âõîäà âíóòðåííåé ïàëèòðû è äîëæåí ëåæàòü â ïðåäåëàõ îò íóëÿ äî size-1 (size – ýëåìåíò ñòðóêòóðû äàííûõ palettetype). Àðãóìåíò color çàäàåò íîâîå çíà÷åíèå êîäà öâåòà äëÿ ýòîãî âõîäà â äèàïàçîíå îò 0 äî 63 (ðåàëüíî èñïîëüçóþòñÿ òîëüêî øåñòü ìëàäøèõ áèò àðãóìåíòà num_color).

Äðóãàÿ ôóíêöèÿ, èçìåíÿþùàÿ âíóòðåííþþ ïàëèòðó, èìååò ñèíòàêñèñ:

void far setallpalette(struct palettetype far *palette);

Àðãóìåíò åå ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó, ñîäåðæàùóþ âà­ðèàíò æåëàåìîé ïàëèòðû. Âñå èçìåíåíèÿ â òåêóùåé âíóòðåííåé ïàëèòðå, ïðîèçâåäåííûå ôóíêöèÿìè setpalette è setallpalette íåìåäëåííî îòîáðàæàþòñÿ íà ýêðàíå äèñïëåÿ.

Öâåòîì ôîíà ìîæíî óïðàâëÿòü ñ ïîìîùüþ ôóíêöèè

void far setbkcolor(int num_color_palette);

Äåéñòâèå ôóíêöèè çàêëþ÷àåòñÿ â òîì, ÷òî íóëåâîé âõîä âíóòðåííåé ïàëèòðû ñâÿçûâàåòñÿ ñî âõîäîì, èìåþùèì íîìåð num_color_palette. Ýòî îçíà÷àåò, ÷òî â íóëåâîé ýëåìåíò âíóòðåííåé ïàëèòðû çàïèñûâàåòñÿ çíà÷åíèå, êîòîðîå â äàííûé ìîìåíò ñîäåðæèòñÿ â ýëåìåíòå ñ íîìåðîì num_color_palette. Êðîìå òîãî, âñå ïîñëåäóþùèå èçìåíåíèÿ ñîäåðæèìîãî ýëåìåíòà ñ íîìåðîì num_color_palette áóäóò íåìåäëåííî äóáëèðîâàòüñÿ â íóëåâîé ýëåìåíò. Çàìåòèì, ÷òî ôóíêöèÿ setpalette(0, color) ïðîñòî èçìåíÿåò öâåò ôîíà, íî íå ñâÿçûâàåò íóëåâîé âõîä íè ñ êàêèì äðóãèì.

Îáðàòíîé äëÿ ôóíêöèè óñòàíîâêè öâåòà ôîíà ÿâëÿåòñÿ ôóíêöèÿ

int far getbkcolor(void);

êîòîðàÿ âîçâðàùàåò òåêóùåå íàçíà÷åíèå äëÿ ôîíîâîãî öâåòà, ò.å. íîìåð òîãî âõîäà âíóòðåííåé ïàëèòðû, ñ êîòîðûì ñâÿçàí â íàñòîÿùèé ìîìåíò íóëåâîé âõîä. Åñëè ðàíåå ïðè ïîìîùè ôóíêöèè setbkcolor íå ïðîèçîøëî ñâÿçûâàíèÿ íè ñ êàêèì âõîäîì, òî getbkcolor âîçâðàùàåò 0.

Äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òåêóùåé âíóòðåííåé ïàëèòðå ñóùåñòâóåò äâå ôóíêöèè:

void far getpalette(struct palettetype far *palette);

struct palettetype far *getdefaultpalette(void);

Ïåðâàÿ êîïèðóåò â îáëàñòü ïàìÿòè, íà êîòîðóþ óêàçûâàåò àðãóìåíò, òåêóùåå ñîñòîÿíèå âíóòðåííåé ïàëèòðû. Äðóãàÿ âîçâðàùàåò óêàçàòåëü íà õðàíÿùóþñÿ â ãðàôè÷åñêîé ñèñòåìå ñòðóêòóðó, ñîäåðæàùóþ ýòàëîí âíóòðåííåé ïàëèòðû. Ïîëó÷èâ óêàçàòåëü íà ýòó ñòðóêòóðó, ìîæíî èçìåíèòü ñàì ýòàëîí ïàëèòðû. Òàêèå èçìåíåíèÿ áóäóò ñîõðàíÿòüñÿ äî ñëåäóþùåé èíèöèàëèçàöèè êàêîãî-ëèáî ðåæèìà.

Âñå âûøåîïèñàííûå ñïîñîáû äèíàìè÷åñêîãî óïðàâëåíèÿ öâåòîì ðàññ÷èòàíû íà àäàïòåðû, â êîòîðûõ ïèêñåëü ìîæåò áûòü ïðåäñòàâëåí íå áîëåå ÷åì ÷åòûðüìÿ áèòàìè. Îäíàêî íåêîòîðûå àäàïòåðû äîïóñêàþò âîñüìèáèòîâóþ âåëè÷èíó àòðèáóòà ïèêñåëÿ (IBM8414 è VGA, èìåþùèå â òàáëèöå öâåòîâ 256 âõîäîâ). Äëÿ íèõ ñóùåñòâóåò ðàñøèðåííàÿ ïàëèòðà, êîòîðàÿ ñîäåðæèò 256 âõîäîâ. Êàæäûé âõîä ñîîòâåòñòâóåò êîäó öâåòà. Äëÿ òîãî ÷òîáû êàêîìó-ëèáî êîäó ñîîòâåòñòâîâàë äðóãîé îòòåíîê öâåòà, èñïîëüçóåòñÿ ôóíêöèÿ

void far setrgbpalette(int num_color,int red,int green,int blue);

Àðãóìåíò num_color – íîìåð âõîäà ðàñøèðåííîé ïàëèòðû (0–255), ïî êîòîðîìó õðàíÿòñÿ òðè öâåòîâûå êîìïîíåíòû – êðàñíàÿ, çåëåíàÿ è ñèíÿÿ – ñîñòàâëÿþùèå æåëàåìûé öâåò. Ôóíêöèÿ ïîçâîëÿåò çàïèñàòü ïî âõîäó ðàñøèðåííîé ïàëèòðû ñ íîìåðîì color öâåòîâûå êîìïîíåíòû red, green è blue. Ïðè ýòîì ðåàëüíî èñïîëüçóþòñÿ òîëüêî ìëàäøèå øåñòü áàéò êàæäîé êîìïîíåíòû. Òàêèì îáðàçîì, îáùåå êîëè÷åñòâî öâåòîâûõ îòòåíêîâ ðàâíî N_colors=64*64*64=256Ê.

Îòìåòèì íåêîòîðûå îñîáåííîñòè èñïîëüçîâàíèÿ äðàéâåðà VGA. Çíà÷åíèÿ ýëåìåíòîâ ìàññèâà colors (êîäîâ öâåòîâ) îáû÷íîé âíóòðåííåé ïàëèòðû ñëóæàò èíäåêñàìè äëÿ ïîèñêà íóæíîãî öâåòà â ðàñøèðåííîé òàáëèöå, îòêóäà ïðîèñõîäèò âûáîð íóæíîãî îòòåíêà öâåòà.

Çàìåòèì, ÷òî ôóíêöèÿ setrgbpalette ïðàâèëüíî ðàáîòàåò òîëüêî ñ äèñïëåéíûìè àäàïòåðàìè VGA è IBM8514. Íà äðóãèõ êîíôèãóðàöèÿõ ÏÊ îíà èãíîðèðóåòñÿ. Êñòàòè, èçìåíèòü ïàëèòðó ïðè ðàáîòå ñ àäàïòåðîì IBM8514 ìîæíî òîëüêî ïðè ïîìîùè ôóíêöèè setrgbpalette.

Ðàññìîòðèì òåïåðü ïîíÿòèå òåêóùåãî çíà÷åíèÿ ðèñóþùåãî öâåòà (current drawing color). Ðèñóþùèé öâåò – ýòî òî çíà÷åíèå, êîòîðîå èñïîëüçóåòñÿ ôóíêöèÿìè ðèñîâàíèÿ äëÿ çàïèñè â àòðèáóòû ïèêñåëåé. Çíà÷åíèå ðèñóþùåãî öâåòà íåîòðèöàòåëüíî è íå äîëæíî ïðåâûøàòü çíà÷åíèÿ, âîçâðàùàåìîãî ôóíêöèåé getmaxcolor.

Ñóùåñòâóåò ôóíêöèÿ, ïîçâîëÿþùàÿ ÿâíî èçìåíÿòü òåêóùåå çíà÷åíèå ðèñóþùåãî öâåòà:

void far setcolor(int num_color_palette);

Ïðè ðèñîâàíèè èñïîëüçóåòñÿ öâåò, ÷åé êîä çàïèñàí ïî âõîäó âíóòðåííåé ïàëèòðû ñ íîìåðîì num_color_palette. Óçíàòü òåêóùåå çíà÷åíèå ðèñóþùåãî öâåòà ìîæíî ïðè ïîìîùè ôóíêöèè

int far getcolor(void);

 

1.5.     Áàçîâûå ôóíêöèè äîñòóïà ê âèäåîïàìÿòè

Ïðàêòè÷åñêè âñÿ ðàáîòà ñ ãðàôèêîé ñâîäèòñÿ ê îáìåíó äàííûìè ìåæäó ïðîãðàììîé è âèäåîáóôåðîì äèñïëåéíîãî àäàïòåðà.

Äîñòóï ê îòäåëüíûì ïèêñåëÿì àêòèâíîé ñòðàíèöû îñóùåñòâëÿþò äâå ôóíêöèè:

unsigned far getpixel(int x,int y);

void far putpixel(int x,int y,int num_color_palette);

Ôóíêöèÿ getpixel âîçâðàùàåò àòðèáóò (âõîä âî âíóòðåííþþ ïàëèòðó) ïèêñåëÿ ñ êîîðäèíàòàìè (x, y). À ôóíêöèÿ putpixel ðèñóåò ïèêñåëü â òî÷êå ñ êîîðäèíàòàìè (x, y) öâåòîì, ÷åé êîä ñîäåðæèòñÿ ïî âõîäó âî âíóòðåííþþ ïàëèòðó ñ íîìåðîì num_color_palette.

Íåñìîòðÿ íà òî, ÷òî ôóíêöèÿì getpixel è pupixel êîîðäèíàòû ïèêñåëÿ çàäàþòñÿ â ñèñòåìå êîîðäèíàò ãðàôè÷åñêîãî îêíà, íè÷òî íå ìåøàåò óêàçàòü êîîðäèíàòû ëþáîãî ïèêñåëÿ ñòðàíèöû, ëåæàùåãî âíå îêíà. Ïðè ýòîì getpixel âîçâðàùàåò ïðàâèëüíîå çíà÷åíèå àòðèáóòà óêàçàííîãî ïèêñåëÿ. Ïîâåäåíèå ôóíêöèè putpixel çàâèñèò îò ðåæèìà îòñå÷åíèÿ, óñòàíîâëåííîãî ñ ïîìîùüþ ïîñëåäíåãî àðãóìåíòà ïðè âûçîâå ôóíêöèè setviewport. Ðåçóëüòàòû ðàáîòû ôóíêöèé getpixel è pupixel ñ âûõîäÿùèìè çà ïðåäåëû ñòðàíèöû êîîðäèíàòàìè òî÷åê íåïðåäñêàçóåìû.

Êðîìå îáìåíà ñ âèäåîïàìÿòüþ îòäåëüíûìè ïèêñåëÿìè ãðàôè÷åñêàÿ áèáëèîòåêà ïðåäîñòàâëÿåò âîçìîæíîñòè äëÿ îáìåíà öåëûìè ìàññèâàìè ïèêñåëåé. Ýòî áûâàåò ïîëåçíî, íàïðèìåð, êîãäà íóæíî âðåìåííî ñîõðàíèòü êàêîé-òî ôðàãìåíò ñòðàíèöû, ÷òîáû â äàëüíåéøåì âîññòàíîâèòü åãî íà ïðåæíåì èëè íîâîì ìåñòå. Îáìåí ïðîèçâîäèòñÿ ïðÿìîóãîëüíûìè ìàññèâàìè, êîòîðûå çàäàþòñÿ êîîðäèíàòàìè ñâîèõ óãëîâ â ñèñòåìå êîîðäèíàò òåêóùåãî ãðàôè÷åñêîãî îêíà.

Ïðåæäå ÷åì ñîõðàíèòü ôðàãìåíò ñòðàíèöû, íåîáõîäèìî îïðåäåëèòü òðåáóåìûé äëÿ ýòîãî îáúåì îïåðàòèâíîé ïàìÿòè. Âñå íåîáõîäèìûå âû÷èñëåíèÿ ïðîèçâîäèò ôóíêöèÿ

unsigned far imagesize(int left,int top,int right,int bottom);

Îíà ïîëó÷àåò â êà÷åñòâå àðãóìåíòîâ êîîðäèíàòû ëåâîãî âåðõíåãî è ïðàâîãî íèæíåãî óãëà ñîõðàíÿåìîé îáëàñòè. Âîçâðàùàåìîå çíà÷åíèå ìîæíî ïåðåäàâàòü îäíîé èç ôóíêöèé âûäåëåíèÿ ïàìÿòè äëÿ ðåçåðâèðîâàíèÿ íåîáõîäèìîãî ïðîñòðàíñòâà. Åñëè îáúåì ïàìÿòè, òðåáóåìûé äëÿ ñîõðàíåíèÿ èçîáðàæåíèÿ, ïðåâîñõîäèò 64Ê-1, òî ôóíêöèÿ âñå ðàâíî âîçâðàùàåò çíà÷åíèå 0xFFFF, íî ïðè ýòîì graphresult âûäàåò çíà÷åíèå -11.

Ïîñëå ðåçåðâèðîâàíèÿ òðåáóåìîãî îáúåìà îïåðàòèâíîé ïàìÿòè, îí ìîæåò ñîõðàíèòü ìàññèâ ïèêñåëåé ñ ïîìîùüþ ôóíêöèè

void far getimage(int left,int top,int right,int bottom,void far *bitmap);

Ïîñëåäíèé àðãóìåíò – óêàçàòåëü íà îáëàñòü ïàìÿòè, ãäå áóäåò ñîõðàíÿòüñÿ ìàññèâ.

Äëÿ òîãî ÷òîáû ìàññèâ ïèêñåëåé, ñîõðàíåííûé ñ ïîìîùüþ ôóíêöèè getimage, ñíîâà çàïèñàòü íà àêòèâíóþ ñòðàíèöó, èñïîëüçóåòñÿ ôóíêöèÿ

void far putimage(int left, int top, void far *bitmap, int op);

Ïðè ýòîì ìîæíî íå òîëüêî óêàçàòü íîâîå ìåñòîïîëîæåíèå ìàññèâà ïèêñåëåé (÷åðåç êîîðäèíàòû ëåâîãî âåðõíåãî óãëà), íî è âûâåñòè åãî íà äðóãóþ ñòðàíèöó âèäåîïàìÿòè, ïðåäâàðèòåëüíî ñäåëàâ åå àêòèâíîé ïðè ïîìîùè ôóíêöèè setactivepage. Ïîñëåäíèé àðãóìåíò ôóíêöèè putimage óêàçûâàåò ñïîñîá, êîòîðûì àòðèáóòû ïèêñåëåé ìàññèâà, âûâîäèìîãî èç îïåðàòèâíîé ïàìÿòè íà àêòèâíóþ ñòðàíèöó, áóäóò çàìåùàòü óæå íàõîäÿùèåñÿ â âèäåîáóôåðå çíà÷åíèÿ.  ïðîñòåéøåì ñëó÷àå, êîãäà op = 0, ïðîèñõîäèò ïðîñòîå êîïèðîâàíèå àòðèáóòîâ ïèêñåëåé èç ïàìÿòè â âèäåîïàìÿòü. Îäíàêî âîçìîæíî âûïîëíåíèå îäíîé èç ïîáèòîâûõ ëîãè÷åñêèõ îïåðàöèé íàä ñîäåðæèìûì îïåðàòèâíîé ïàìÿòè è âèäåîáóôåðà äëÿ êàæäîãî ïèêñåëÿ ìàññèâà. Ïîëíûé íàáîð òàêèõ îïåðàöèé çàäàåòñÿ ïåðå÷èñëèìûì òèïîì putimage_ops:

enum putimage_ops

{COPY_PUT, XOR_PUT, OR_PUT, AND_PUT, NOT_PUT};

Ïðè ðàáîòå ñ ôóíêöèÿìè getimage è putimage äåéñòâóþò ïðèìåðíî òå æå ïðàâèëà îòíîñèòåëüíî çàäàâàåìûõ êîîðäèíàò, ÷òî è äëÿ ôóíêöèé getpixel è putpixel: õîòÿ êîîðäèíàòû çàäàþòñÿ â ñèñòåìå ãðàôè÷åñêîãî îêíà, ìîæíî óêàçàòü ìàññèâ ïèêñåëåé, ðàñïîëîæåííûé â ëþáîì ìåñòå â ïðåäåëàõ àêòèâíîé ñòðàíèöû. Ðàçëè÷èå ìåæäó äâóìÿ ôóíêöèÿìè ñîñòîèò â òîì, ÷òî getimage “ñõâàòèò” ýòîò ìàññèâ, à ôóíêöèÿ putimage âûâåäåò ìàññèâ íà ñòðàíèöó òàê, êàê åñëè áû íèêàêîãî ãðàôè÷åñêîãî îêíà íå ñóùåñòâîâàëî (ò. å. èãíîðèðóåòñÿ ðåæèì îòñå÷åíèÿ).

Åñëè êîîðäèíàòû çàäàâàåìîãî ìàññèâà ïèêñåëåé (âåñü ìàññèâ èëè åãî ÷àñòü) âûõîäÿò çà ïðåäåëû ñòðàíèöû, òî ðåçóëüòàò ðàáîòû ôóíêöèé getimage è putimage íåïðåäñêàçóåì.

1.6.     Ãðàôè÷åñêèå ïðèìèòèâû

Îñíîâíîå çíà÷åíèå ãðàôè÷åñêèõ ïðèìèòèâîâ – îáåñïå÷èòü íàëè÷èå ïðîãðàììíûõ ñðåäñòâ äëÿ ðèñîâàíèÿ âñåâîçìîæíûõ ãåîìåòðè÷åñêèõ îáúåêòîâ. Óñëîâíî ìîæíî ðàçáèòü âñå ãðàôè÷åñêèå ïðèìèòèâû ïî òèïó ðèñóåìûõ èìè ãðàôè÷åñêèõ îáúåêòîâ íà äâå ãðóïïû: êîíòóðíûå è ïëîùàäíûå. Ôóíêöèè ïåðâîé ãðóïïû ðèñóþò âñåâîçìîæíûå êîíòóðíûå ëèíèè. Êî âòîðîé ãðóïïå îòíîñÿòñÿ ôóíêöèè, ïðåäíàçíà÷åííûå äëÿ ðèñîâàíèÿ ãåîìåòðè÷åñêèõ ôèãóð ñ çàêðàøèâàíèåì îãðàíè÷èâàåìûõ èìè îáëàñòåé.

Ê ãðóïïå êîíòóðíûõ ãðàôè÷åñêèõ ïðèìèòèâîâ îòíîñÿòñÿ ôóíêöèè:

void far line(int x1,int y1,int x2,int y2);

void far linerel(int dx,int dy);

void far lineto(int x,int y);

void far rectangle(int left,int top,int right,intbottom);

void far drawpoly(int num_points,int far *poly_points);

void far circle(int x,int y,int radius);

void far arc(int x,int y,int start_angle,int end_angle,int radius);

void far ellipse(int x,int y, int start_angle,int end_angle,int x_radius,int y_radius);

Ïåðâûå ïÿòü ðèñóþò êóñî÷íî-ëèíåéíûå îáúåêòû (â òîì ÷èñëå è ôèãóðû, ñîñòàâëåííûå èç îòðåçêîâ ïðÿìûõ), îñòàëüíûå – êðèâûå âòîðîãî ïîðÿäêà (äóãè îêðóæíîñòåé è ýëëèïñîâ).

Ôóíêöèè line, linerel è lineto ñîåäèíÿþò äâå òî÷êè ïëîñêîñòè îòðåçêîì ïðÿìîé. Äëÿ ïåðâîé îáå ñîåäèíÿåìûå òî÷êè óêàçûâàþòñÿ ÿâíî ñâîèìè êîîðäèíàòàìè. Ôóíêöèè linerel è lineto â êà÷åñòâå ïåðâîé òî÷êè èñïîëüçóþò òåêóùóþ ãðàôè÷åñêóþ ïîçèöèþ CP, à âòîðóþ âûáèðàþò àíàëîãè÷íî ôóíêöèÿì moverel è moveto, ò. å. ÷åðåç ïðèðàùåíèÿ êîîðäèíàò èëè ïî ÿâíîìó óêàçàíèþ. Âñå òðè ôóíêöèè ïîëüçóþòñÿ ñèñòåìîé êîîðäèíàò ãðàôè÷åñêîãî îêíà. Îäíàêî èì ìîæíî ïåðåäàòü êîîðäèíàòû ëþáûõ òî÷åê, äàæå ëåæàùèõ çà ïðåäåëàìè ñòðàíèöû. Ôóíêöèÿ graphresult íå ñîîáùàåò îá îøèáêå, à ñîåäèíÿþùàÿ ëèíèÿ ïðîâîäèòñÿ ïðàâèëüíî. Åñëè äëÿ îêíà óñòàíîâëåí ðåæèì îòñå÷åíèÿ, òî ÷àñòè ëèíèè, âûõîäÿùèå çà ïðåäåëû îêíà, íå çàíîñÿòñÿ â âèäåîïàìÿòü.

Ôóíêöèÿ rectangle ðèñóåò íà ñòðàíèöå âèäåîïàìÿòè êîíòóð ïðÿìîóãîëüíèêà ïî óêàçàííûì êîîðäèíàòàì ëåâîãî âåðõíåãî è ïðàâîãî íèæíåãî óãëà.

Ôóíêöèÿ drawpoly ðèñóåò ëîìàíóþ ëèíèþ, ñîåäèíÿÿ òî÷êè íà ïëîñêîñòè.  ïåðâîì àðãóìåíòå ïåðåäàåòñÿ êîëè÷åñòâî òàêèõ òî÷åê, à âòîðîé óêàçûâàåò íà ìàññèâ öåëûõ ÷èñåë. Êàæäàÿ ïàðà ÷èñåë èç ýòîãî ìàññèâà èíòåðïðåòèðóåòñÿ êàê ïàðà êîîðäèíàò (x, y) î÷åðåäíîé òî÷êè. Äëÿ òîãî ÷òîáû íàðèñîâàòü çàìêíóòóþ ëîìàíóþ ëèíèþ (ìíîãîóãîëüíèê), ïåðâàÿ è ïîñëåäíÿÿ ïàðû ýëåìåíòîâ ìàññèâà äîëæíû áûòü îäèíàêîâûìè.

Ôóíêöèÿ circle ðèñóåò îêðóæíîñòü ðàäèóñîì radius ñ öåíòðîì â òî÷êå ñ êîîðäèíàòàìè (x, y). Ôóíêöèÿ arc è ellipse âû÷åð÷èâàþò äóãè îêðóæíîñòè è ýëëèïñà ñ öåíòðîì â òî÷êå (x, y), ñîîòâåòñòâåííî îãðàíè÷åííûå óãëàìè start_angle è end_engle. Äëÿ äóãè îêðóæíîñòè çàäàåòñÿ åå ðàäèóñ radius, à äëÿ äóãè ýëëèïñà ðàäèóñû ïî îñÿì x_radius è y_radius. Îñè ýëëèïñà âñåãäà ïðåäïîëàãàþòñÿ ïàðàëëåëüíûìè îñÿì êîîðäèíàò ñòðàíèöû.

Óãëû, îãðàíè÷èâàþùèå äóãè, âûðàæàþòñÿ â ãðàäóñàõ è îòìåðÿþòñÿ ïðîòèâ ÷àñîâîé ñòðåëêè îò íàïðàâëåíèÿ, çàäàâàåìîãî îñüþ X ñòðàíèöû. Äóãà âñåãäà ïðîâîäèòñÿ îò óãëà start_angle ê óãëó end_angle òàêæå ïðîòèâ ÷àñîâîé ñòðåëêè.

Äëÿ ôóíêöèé rectangle, drawpoly, circle, arc è ellipse ñïðàâåäëèâû çàìå÷àíèÿ îòíîñèòåëüíî ñèñòåìû êîîðäèíàò è ðåæèìà îòñå÷åíèÿ, êîòîðûå áûëè ñäåëàíû îòíîñèòåëüíî ôóíêöèé ðèñîâàíèÿ ëèíèé.

Ñ äóãàìè îêðóæíîñòåé ñâÿçàíà ôóíêöèÿ

void far getarccoords(struct arccoordstype far *arccoords);

Ýòà ôóíêöèÿ âîçâðàùàåò õàðàêòåðèñòèêè äóãè îêðóæíîñòè, ïîñòðîåííîé ïðè ïîñëåäíåì âûçîâå ôóíêöèè arc. Õàðàêòåðèñòèêè äóãè çàïèñûâàþòñÿ â ïåðåìåííóþ *arccoords. Òèï ýòîé ïåðåìåííîé îïðåäåëåí ñëåäóþùèì ñïîñîáîì:

struct arccoordstype

{

int x, y;

int x_start, y_start, x_end, y_end;

};

Ïåðâàÿ ïàðà ÷èñåë – ýòî êîîðäèíàòû öåíòðà îêðóæíîñòè, âòîðàÿ è òðåòüÿ – êîîðäèíàòû íà÷àëà è êîíöà äóãè. Çíà÷åíèÿ êîîðäèíàò ïðèâÿçàíû ê ñèñòåìå êîîðäèíàò ãðàôè÷åñêîãî îêíà.

Ñóùåñòâóþò ôóíêöèè, êîòîðûå ïîçâîëÿþò âàðüèðîâàòü âíåøíèé âèä îáúåêòîâ, íàïðèìåð òîëùèíó è òèï ëèíèè, öâåò è äðóãèå.

Âñå êîíòóðíûå ãðàôè÷åñêèå ïðèìèòèâû ïðîïèñûâàþò ïèêñåëè â âèäåîïàìÿòè ðèñóþùèì öâåòîì, êîòîðûé ìîæíî èçìåíèòü ôóíêöèåé setcolor.

Äëÿ êóñî÷íî-ëèíåéíûõ ãðàôè÷åñêèõ ïðèìèòèâîâ, è òîëüêî äëÿ íèõ, èìååòñÿ âîçìîæíîñòü óêàçàòü ñïîñîá, êîòîðûì êîä ðèñóþùåãî öâåòà áóäåò âçàèìîäåéñòâîâàòü ñ àòðèáóòàìè ïèêñåëåé, óæå íàõîäÿùèìèñÿ â âèäåîïàìÿòè íà ìåñòå ðèñóåìîãî îáúåêòà. Çäåñü äåéñòâóåò ìåõàíèçì, îïèñàííûé äëÿ ôóíêöèè putimage. Âûáîð ñïîñîáà îñóùåñòâëÿåòñÿ ôóíêöèåé

void far setwritemode(int mode);

Àðãóìåíò ýòîé ôóíêöèè äîëæåí ïðèíèìàòü çíà÷åíèå 0 (ïðîñòîå êîïèðîâàíèå êîäà àòðèáóòà ïèêñåëÿ â âèäåîïàìÿòü) è 1 (îïåðàöèÿ “èñêëþ÷àþùåå èëè”).

Ôóíêöèÿ

void far setlinestyle(int line_style,unsigned user_pattern,int thickness);

óñòàíàâëèâàåò õàðàêòåð è òîëùèíó ëèíèé ãåîìåòðè÷åñêèõ îáúåêòîâ. Àðãóìåíò thickness âîçäåéñòâóåò íà êîíòóðíûå ãðàôè÷åñêèå ïðèìèòèâû, à àðãóìåíòû line_style è user_pattern – òîëüêî íà êóñî÷íî-ëèíåéíûå.

Àðãóìåíò thickness ïðèíèìàåò çíà÷åíèÿ NORM_WIDTH (òîëùèíà ðàâíà 1 ïèêñåëü) è THICK_WIDTH (òîëùèíà ðàâíà 3 ïèêñåëÿì). Àðãóìåíò linestyle çàäàåò õàðàêòåð ðèñóåìîé ëèíèè. Çíà÷åíèÿ àðãóìåíòà äîëæíû âûáèðàòüñÿ èç êîíñòàíò ïåðå÷èñëèìîãî òèïà line_styles (íàïðèìåð SOLID_LINE îçíà÷àåò ñïëîøíóþ ëèíèþ):

enum line_styles

{

SOLID_LINE=0,DOTTED_LINE,CENTER_LINE,

DASHED_LINE,USERBIT_LINE

};

Åñëè çíà÷åíèå àðãóìåíòà line_style ðàâíî USERBIT_LINE, òî ýòî çíà÷èò, ÷òî ïðè ïîñòðîåíèè êóñî÷íî-ëèíåéíûõ ïðèìèòèâîâ áóäåò èñïîëüçîâàòüñÿ øàáëîí, çàäàííûé ïðîãðàììèñòîì è ïåðåäàííûé ôóíêöèè setlinestyle ïðè ïîìîùè àðãóìåíòà user_pattern. Ñ ïîìîùüþ øàáëîíà ìîæíî çàäàòü ïåðèîäè÷åñêè ïîâòîðÿþùèéñÿ ðèñóíîê ëèíèè ñ ïåðèîäîì äî 16 ïèêñåëåé. Åñëè íåêîòîðûé áèò øàáëîíà user_pattern ðàâåí 1, òî ñîîòâåòñòâóþùèé ïèêñåëü ëèíèè ðèñóåòñÿ, â ïðîòèâíîì ñëó÷àå – íåò.

Óñòàíîâêè, ñäåëàííûå ïðè ïîìîùè ôóíêöèè setlinestyle, ñîõðàíÿþòñÿ äî íîâîãî åå âûçîâà. Äëÿ âûÿñíåíèÿ òåêóùåé óñòàíîâêè õàðàêòåðèñòèê ëèíèé ïðåäóñìîòðåíà ôóíêöèÿ

void far getlinesettingstype(struct linesettingstype far *line_info);

Äàííàÿ ôóíêöèÿ çàíîñèò èíôîðìàöèþ â ñòðóêòóðó, èìåþùóþ îïèñàíèå

struct linesettingstype

{

int linestyle;

unsigned upattern;

int thickness;

}

Ãðóïïà ïëîùàäíûõ ãðàôè÷åñêèõ ôóíêöèé èìååò ïðîòîòèïû:

void far bar(int left, int top, int right, int bottom);

void far bar3d(int left, int top, int right, int bottom, int depth, int top_flag);

void far fillpoly(int num_points, int far *poly_points);

void far fillellipse(int x, int y, int x_radius, int y_radius);

void far pieslice(int x, int y, int start_angle, int end_angle, int radius);

void far sector(int x, int y, int start_angle, int end_angle, int x_ radius, int y_radius);

void far floodfill(int x, int y, int num_color_palette);

Ôóíêöèè bar è bar3d ñòðîÿò ïðÿìîóãîëüíèêè, êîîðäèíàòû êîòîðûõ çàäàíû ïåðâûìè ÷åòûðüìÿ àðãóìåíòàìè ôóíêöèé è çàêðàøèâàþò åãî âíóòðåííþþ îáëàñòü. Ôóíêöèÿ bar íå âûâîäèò âíåøíèé êîíòóð ïðÿìîóãîëüíèêà, à ôóíêöèÿ bar3d äîïîëíèòåëüíî îáðàìëÿåò ïðÿìîóãîëüíèê êîíòóðà è òåì æå êîíòóðîì äîðèñîâûâàåò ïðîåêöèþ ïàðàëëåëåïèïåäà, ïîñòðîåííîãî íà áàçå ýòîãî ïðÿìîóãîëüíèêà. Ãëóáèíà ïðîåêöèè çàäàåòñÿ àðãóìåíòîì depth, àðãóìåíò top_flag óêàçûâàåò, ðèñîâàòü (åñëè íå íóëü) èëè íå ðèñîâàòü (åñëè íóëü) âåðõíèå ðåáðà ïàðàëëåëåïèïåäà.

Ôóíêöèÿ fillpoly ïîëó÷àåò àðãóìåíòû àíàëîãè÷íî ôóíêöèè drawpoly, ðèñóåò êîíòóð è çàïîëíÿåò åãî âíóòðåííîñòü. Îäíàêî åñëè ôóíêöèÿ drawpoly äîïóñêàåò íåçàìêíóòûå êîíòóðû, òî ôóíêöèÿ fillpoly âñåãäà ñîåäèíÿåò ïîñëåäíþþ òî÷êó â ïîëó÷åííîì ñïèñêå ñ ïåðâîé, àâòîìàòè÷åñêè çàìûêàÿ êîíòóð.

Ôóíêöèÿ fillellipse çàïîëíÿåò ýëëèïñ ñ öåíòðîì â òî÷êå (x, y) è ðàäèóñàìè x_radius è y_radius. Êðîìå òîãî, îíà ðèñóåò êîíòóð ýëëèïñà.

Ôóíêöèè pieslice è sector ïîõîæè òåì, ÷òî îáå çàêðàøèâàþò óêàçàííûå ñåêòîðà, òîëüêî pieslice äåëàåò ýòî äëÿ êðóãîâîãî ñåêòîðà, à sector äëÿ ýëëèïòè÷åñêîãî. Àðãóìåíòû, êîòîðûå èì ïåðåäàþòñÿ, òå æå, ÷òî è äëÿ ôóíêöèé arc è ellipse ñîîòâåòñòâåííî. Ïîñëå òîãî êàê ñåêòîð çàêðàøåí, ðèñóåòñÿ åãî êîíòóð.  îòëè÷èå îò ôóíêöèé arc è ellipse, ôóíêöèè pieslice è sector ñòðîÿò ñåêòîð îò ìåíüøåãî çíà÷åíèÿ óãëà ê áîëüøåìó (à íå îò start_angle ê end_angle). Èç-çà ýòîãî íåâîçìîæíî çàñòàâèòü ôóíêöèè pieslice è sector èçîáðàçèòü ñåêòîð, ïåðåñåêàþùèé ïîëîæèòåëüíîå íàïðàâëåíèå îñè X.

Ôóíêöèÿ floodfill èñïîëüçóåòñÿ äëÿ çàêðàøèâàíèÿ îáëàñòåé, óæå ñóùåñòâóþùèõ íà ñòðàíèöå. Äëÿ ïðàâèëüíîé ðàáîòû ôóíêöèè íåîáõîäèìî, ÷òîáû êîíòóð áûë çàìêíóò è ñîñòîÿë èç ïèêñåëåé, èìåþùèõ çíà÷åíèå àòðèáóòà, ñîâïàäàþùåå ñ àðãóìåíòîì num_color_palette (íîìåð âõîäà âíóòðåííåé ïàëèòðû). Êðîìå êîäà êîíòóðà, ôóíêöèÿ floodfill ïîëó÷àåò òî÷êó, îò êîòîðîé íà÷èíàåòñÿ çàïîëíåíèå îáëàñòè. Ýòà òî÷êà äîëæíà íàõîäèòüñÿ âíóòðè êîíòóðà.

Âñå êîíòóðû â âèäåîïàìÿòè ïðîïèñûâàþòñÿ ïèêñåëÿìè ðèñóþùåãî öâåòà, êîòîðûé ìîæíî èçìåíèòü ôóíêöèåé setcolor. Æåëàåìûé ðåæèì èçîáðàæåíèÿ êîíòóðà (íàïðèìåð òîëùèíà ëèíèè) óñòàíàâëèâàåòñÿ òàê, êàê ýòî äåëàåòñÿ äëÿ êîíòóðíûõ ïðèìèòèâîâ.

Äëÿ óïðàâëåíèÿ âèäîì çàïîëíåíèÿ âíóòðåííåé îáëàñòè ñëóæèò ôóíêöèÿ

void far setfillstyle(int pattern,int num_color_palette);

Äàííàÿ ôóíêöèÿ îäíîâðåìåííî óñòàíàâëèâàåò òèï äâóìåðíîãî øàáëîíà çàïîëíåíèÿ è êîä çàïîëíåíèÿ (íîìåð âõîäà âî âíóòðåííþþ ïàëèòðó). Íóæíî îòìåòèòü, ÷òî ïðè çàïîëíåíèè îáëàñòè íåò âîçìîæíîñòè âûïîëíÿòü ïîáèòîâûå ëîãè÷åñêèå îïåðàöèè ìåæäó êîäàìè øàáëîíà è àòðèáóòàìè ïèêñåëåé îáëàñòè, ò. å. âñåãäà ïðîèñõîäèò êîïèðîâàíèå â àòðèáóòû ïèêñåëåé îáëàñòè ñîîòâåòñòâóþùèõ êîäîâ øàáëîíà. Àðãóìåíò pattern óêàçûâàåò íà òèï óñòàíàâëèâàåìîãî øàáëîíà. Ñóùåñòâóåò íåñêîëüêî çàðàíåå îïðåäåëåííûõ òèïîâ, èõ ñèìâîëè÷åñêèå èìåíà îïðåäåëÿþòñÿ ïåðå÷èñëèìûì òèïîì fill_patterns:

enum fill_pattern

{

EMPTY_FILL=0,SOLID_FILL,LINE_FILL,LTSLASH_FILL,

SLASH_FILL,BKSLASH_FILL,LTBKSLASH_FILL,

HATCH_FILL,XHATCH_FILL,INTERLEAVE_FILL,

WIDE_DOT_FILL,         CLOSE_DOT_FILL,USER_FILL

};

Àðãóìåíò pattern ìîæåò ïðèíèìàòü ëþáûå çíà÷åíèÿ, êðîìå USER_FILL. Çíà÷åíèå ýòîé êîíñòàíòû èñïîëüçóåòñÿ òîëüêî ïðè îáðàáîòêå èíôîðìàöèè, ïîëó÷àåìîé ôóíêöèåé getfillsettings (ñì. äàëåå).

Øàáëîí óñëîâíî ìîæíî ïðåäñòàâèòü â âèäå ìàòðèöû ðàçìåðîì 8 õ 8 ýëåìåíòîâ. Ýëåìåíòû ìàòðèöû øàáëîíà èìåþò çíà÷åíèÿ 0 èëè 1. Åñëè ýëåìåíò ðàâåí 1, òî àòðèáóòó ñîîòâåòñòâóþùåãî ïèêñåëÿ îáëàñòè áóäåò ïðèñâîåíî çíà÷åíèå num_color_palette, â ïðîòèâíîì ñëó÷àå àòðèáóò ïèêñåëÿ ïîëó÷èò çíà÷åíèå êîäà ôîíà.

Âîçìîæíî ñîçäàíèå äîïîëíèòåëüíûõ øàáëîíîâ íåïîñðåäñòâåííî â ïðèêëàäíîé ïðîãðàììå. Äëÿ ýòîãî ñëåäóåò âîñïîëüçîâàòüñÿ ôóíêöèåé

void far setfillpattern(char far *user_pattern,int num_color_palette);

Ïàðàìåòð user_pattern óêàçûâàåò íà îáëàñòü, ñîäåðæàùóþ øàáëîí çàïîëíåíèÿ, îïèñàííûé â ïðîãðàììå. Âòîðîé ïàðàìåòð ýòîé ôóíêöèè àíàëîãè÷åí òàêîìó æå ïàðàìåòðó ôóíêöèè setfillstyle. Äàííàÿ îáëàñòü ñîñòîèò èç âîñüìè ïîñëåäîâàòåëüíûõ áàéòîâ, öåïî÷êà áèòîâ êàæäîãî áàéòà ÿâëÿåòñÿ ñîîòâåòñòâóþùåé ñòðîêîé ìàòðèöû øàáëîíà.

Ïëîùàäíûå ãðàôè÷åñêèå ïðèìèòèâû èñïîëüçóþò ïàðàìåòðû çàïîëíåíèÿ, óñòàíîâëåííûå ïðè ïîñëåäíåì âûçîâå ôóíêöèè ôóíêöèé setfillstyle èëè setfillpatern. Äëÿ òîãî ÷òîáû óçíàòü òåêóùèå íàçíà÷åíèÿ äëÿ ïàðàìåòðîâ çàïîëíåíèÿ îáëàñòåé, ïðåäóñìîòðåíû äâå ôóíêöèè

void far getfillsettings(struct fillsettingstype far *fill_info);

void far getfillpattern(char far *user_pattern);

Ïåðâàÿ âîçâðàùàåò â îáëàñòü ïàìÿòè ïî óêàçàòåëþ fill_info èíôîðìàöèþ î òåêóùåì çàïîëíåíèè. Èíôîðìàöèÿ çàíîñèòñÿ â ñòðóêòóðó ñëåäóþùåãî òèïà:

struct fillsettingstype

{

int pattern;

int color;

};

Ýëåìåíò ñòðóêòóðû pattern óêàçûâàåò òèï øàáëîíà (åñëè îí ðàâåí USER_FILL, òî ýòî çíà÷èò, ÷òî øàáëîí çàäàí ïîëüçîâàòåëåì), ýëåìåíò color ñîäåðæèò êîä çàïîëíåíèÿ (íîìåð âõîäà âî âíóòðåííþþ ïàëèòðó). Âòîðàÿ ôóíêöèÿ ïî ïåðåäàííîìó åé àäðåñó çàïèñûâàåò ìàòðèöó øàáëîíà, óñòàíîâëåííóþ ïîëüçîâàòåëåì.

1.7.     Âûâîä ãðàôè÷åñêîãî òåêñòà

Ñëåäóþùèé íàáîð ôóíêöèé ïðåäíàçíà÷åí äëÿ ôîðìèðîâàíèÿ íà ñòðàíèöàõ âèäåîïàìÿòè òåêñòîâûõ ñîîáùåíèé ñ èñïîëüçîâàíèåì ñïåöèàëüíûõ øðèôòîâ.

×òîáû âîñïîëüçîâàòüñÿ ïðåäîñòàâëÿåìûìè øðèôòàìè â ïðîãðàììå, ïðåæäå âñåãî íåîáõîäèìî èíèöèàëèçèðîâàòü çíàêîãåíåðàòîð ãðàôè÷åñêîé ñèñòåìû. Èíèöèàëèçàöèþ ãðàôè÷åñêîãî çíàêîãåíåðàòîðà âûïîëíÿåò ôóíêöèÿ settextstyle.

 Borland C ïðåäóñìîòðåíà ðàáîòà â ãðàôè÷åñêîì ðåæèìå ñ äâóìÿ ïðèíöèïèàëüíî ðàçëè÷íûìè òèïàìè ãðàôè÷åñêèõ øðèôòîâ: ìàòðè÷íûìè (bit-mapped) è âåêòîðíûìè (stroked). Ïåðâûé òèï ïðåäñòàâëÿåòñÿ òîëüêî îäíèì øðèôòîì, èçíà÷àëüíî âñòðîåííûì â BIOS êîìïüþòåðà. Øðèôòîâ âòîðîãî òèïà ìîæåò áûòü íåñêîëüêî.

Íàáîð ñèìâîëîâ ìàòðè÷íîãî øðèôòà âêëþ÷àåò âñå 256 äîïóñòèìûõ ASCII-êîäà. Êàæäûé ñèìâîë øðèôòà ïðåäñòàâëåí â âèäå ìàòðèöû (áèòîâîé êàðòû) ðàçìåðîì 8 õ 8 ïèêñåëåé. Òàê êàê ýòîò íàáîð ñèìâîëîâ âñòðîåí â BIOS, òî íå òðåáóåòñÿ çàãðóçêè íèêàêîé äîïîëíèòåëüíîé èíôîðìàöèè äëÿ åãî èíèöèàëèçàöèè.

Äðóãîé ïðèíöèïèàëüíî îòëè÷íûé òèï ãðàôè÷åñêèõ øðèôòîâ ïîäðàçóìåâàåò ðèñîâàíèå ñèìâîëîâ òîíêèìè ëèíèÿìè. Ïîýòîìó øðèôòû äàííîãî òèïà ìîæíî íàçâàòü âåêòîðíûìè. Êàæäûé ñèìâîë ïðåäñòàâëåí ïîñëåäîâàòåëüíîñòüþ óïðàâëÿþùèõ êîäîâ, êîòîðûå çàñòàâëÿþò ãåíåðàòîð ðèñîâàòü îòðåçêè ïðÿìûõ ëèíèé, ñîåäèíÿþùèõ õàðàêòåðèñòè÷åñêèå òî÷êè ñèìâîëà. Òàáëèöû ñèìâîëîâ âåêòîðíûõ øðèôòîâ ïîñòàâëÿþòñÿ â çàêîäèðîâàííîì âèäå â ñïåöèàëüíûõ ôàéëàõ øðèôòîâ, èìåþùèõ ðàñøèðåíèå .chr. Äàëåêî íå âñå âåêòîðíûå øðèôòû èìåþò ïîëíûé íàáîð 256-òè êîäîâ. Îáùèìè äëÿ âñåõ øðèôòîâ ÿâëÿþòñÿ ñèìâîëû ñ êîäàìè îò 32 äî 126. Ðàçíûå ñèìâîëû îäíîãî è òîãî æå øðèôòà ìîãóò èìåòü ðàçíûå ðàçìåðû â çàâèñèìîñòè îò øèðèíû êîíêðåòíîãî ñèìâîëà.

Ñóùåñòâóåò ïåðå÷èñëèìûé òèï font_names, çàäàþùèé ñèìâîëè÷åñêèå èìåíà äëÿ íîìåðîâ ïÿòè ãðàôè÷åñêèõ øðèôòîâ (îäèí ìàòðè÷íûé è ÷åòûðå âåêòîðíûõ èç ìèíèìàëüíîãî íàáîðà):

enum font_names

{

DEFAULT_FONT=0, TRIPLEX_FONT, SMALL_FONT, SANS_SERIF_FONT, GOTHIC_FONT

};

Íàèáîëåå ïðîñòûì ñïîñîáîì èíèöèàëèçàöèè çíàêîãåíåðàòîðà (çàãðóçêè îïðåäåëåííîé òàáëèöû ñèìâîëîâ) ÿâëÿåòñÿ àâòîìàòè÷åñêàÿ çàãðóçêà ñ èñïîëüçîâàíèåì ôóíêöèè

void far settextstyle(int font,int directon,int charsize);

Ôóíêöèÿ óñòàíàâëèâàåò îñíîâíûå ïàðàìåòðû âûâîäà ãðàôè÷åñêèõ òåêñòîâ (øðèôò, íàïðàâëåíèå ñòðîê è ðàçìåð ñèìâîëà). Ýòè ïàðàìåòðû îñòàþòñÿ íåèçìåííûìè äî ñëåäóþùåãî âûçîâà ôóíêöèè settextstyle.

Ïåðâûé ïàðàìåòð font çàäàåò íîìåð èíèöèàëèçèðóåìîãî øðèôòà. Åìó ìîæíî ïðèñâîèòü çíà÷åíèå îäíîé èç êîíñòàíò ïåðå÷èñëèìîãî òèïà font_names. Íàáîð ñèìâîëîâ ìàòðè÷íîãî øðèôòà âñòðîåí â BIOS, è îò ôóíêöèè íå òðåáóåòñÿ äîïîëíèòåëüíûõ äåéñòâèé ïðè åãî çàãðóçêå. Äëÿ âåêòîðíûõ øðèôòîâ ïðè àâòîìàòè÷åñêîé çàãðóçêå ïðîèçâîäèòñÿ ïîèñê ñîîòâåòñòâóþùåãî chr-ôàéëà. Ñíà÷àëà ïðîñìàòðèâàåòñÿ äèðåêòîðèÿ, óêàçàííàÿ àðãóìåíòîì path_to_bgi ôóíêöèè initgraph, çàòåì òåêóùàÿ äèðåêòîðèÿ. Åñëè ôàéë øðèôòà íå íàéäåí, óñòàíàâëèâàåòñÿ îòðèöàòåëüíûé êîä îøèáêè. Íàéäåííûé chr-ôàéë ñ÷èòûâàåòñÿ â àâòîìàòè÷åñêè âûäåëÿåìóþ îáëàñòü ïàìÿòè. Ïðè íåâîçìîæíîñòè âûäåëèòü íåîáõîäèìóþ ïàìÿòü òàêæå óñòàíàâëèâàåòñÿ ñîîòâåòñòâóþùèé êîä îøèáêè. Ïðè âîçíèêíîâåíèè ëþáîé îøèáî÷íîé ñèòóàöèè ôóíêöèÿ settextstyle âûïîëíÿåòñÿ äî êîíöà, íî èíèöèàëèçèðóåò ïðè ýòîì âñòðîåííûé ìàòðè÷íûé øðèôò âìåñòî çàäàííîãî âåêòîðíîãî øðèôòà.

Àðãóìåíò direction ìîæåò ïðèíèìàòü îäíî èç çíà÷åíèé, îïðåäåëåííîå êîíñòàíòàìè HORIZ_DIR è VERT_DIR. Îí çàäàåò íàïðàâëåíèå âûâîäèìîé ñòðîêè òåêñòà: HORIZ_DIR îïðåäåëÿåò îáû÷íîå íàïðàâëåíèå (ãîðèçîíòàëüíàÿ ñòðîêà, ñèìâîëû èäóò ñëåâà íàïðàâî), VERT_DIR ðàçâîðà÷èâàåò ñòðîêó íà 90 ãðàäóñîâ ïðîòèâ ÷àñîâîé ñòðåëêè. Èñïîëüçîâàíèå âåðòèêàëüíîãî ðàñïîëîæåíèÿ ñòðîêè ìîæåò ïðèâåñòè ê èçìåíåíèþ ïðîïîðöèé âûâîäèìûõ ñèìâîëîâ – îíè ñòàíîâÿòñÿ íèæå è øèðå, ÷åì â ãîðèçîíòàëüíîé ñòðîêå, ÷òî ñâÿçàíî ñ ýôôåêòîì “íåêâàäðàòíîñòè” ïèêñåëÿ â íåêîòîðûõ äèñïëåÿõ è íèêàê íåóñòðàíèìî.

Ïîñëåäíèé àðãóìåíò charsize óïðàâëÿåò ìàñøòàáîì âûâîäèìûõ ñèìâîëîâ. Äèàïàçîí äîïóñòèìûõ çíà÷åíèé: îò 1 äî 10 äëÿ âñåõ ãðàôè÷åñêèõ øðèôòîâ è äîïîëíèòåëüíîå çíà÷åíèå 0 òîëüêî äëÿ âåêòîðíûõ. Ïîëîæèòåëüíîå çíà÷åíèå charsize óêàçûâàåò íà îäèíàêîâîå óâåëè÷åíèå ñèìâîëîâ ïî îáåèì îñÿì. Åñëè äëÿ âåêòîðíûõ øðèôòîâ çàäàòü charsize, ðàâíûé USER_CHAR_SIZE (îïðåäåëåíà êàê 0), òî ïðè ýòîì îïðåäåëÿþòñÿ äâà íåçàâèñèìûõ êîýôôèöèåíòà ìàñøòàáèðîâàíèÿ – äëÿ øèðèíû è âûñîòû ñèìâîëà. Ïî óìîë÷àíèþ â ýòîì ðåæèìå çíàêîãåíåðàòîð ðèñóåò ñèìâîëû âåêòîðíîãî øðèôòà â áàçîâîì âàðèàíòå â ñîîòâåòñòâèè ñ îïèñàíèåì èç chr-ôàéëà. Îäíàêî åñòü âîçìîæíîñòü èçìåíèòü ìàñøòàá ñ ïîìîùüþ ôóíêöèè

void far setusercharsize(int mult_x,int div_x,int mult_y,int div_y);

Äàííàÿ ôóíêöèÿ óñòàíàâëèâàåò íîâûå ðàçìåðû ñèìâîëà, óìíîæàÿ øèðèíó è âûñîòó áàçîâîãî âàðèàíòà êàæäîãî ñèìâîëà íà çíà÷åíèÿ âûðàæåíèÿ ((double)mult_x / div_x) è ((double)mult_y / div_y) ñîîòâåòñòâåííî.

Ãëàâíûì íåäîñòàòêîì àâòîìàòè÷åñêîé èíèöèàëèçàöèè çíàêîãåíåðàòîðà ïðè ïîìîùè ôóíêöèè settextstyle ÿâëÿåòñÿ òî, ÷òî îíà îáðàùàåòñÿ ê äèñêó äëÿ ÷òåíèÿ chr-ôàéëà âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû. Àëüòåðíàòèâîé àâòîìàòè÷åñêîé èíèöèàëèçàöèè çíàêîãåíåðàòîðà ÿâëÿåòñÿ ñòàòè÷åñêîå âêëþ÷åíèå â ïðîãðàììó òàáëèöû ñèìâîëîâ âåêòîðíûõ øðèôòîâ. Äëÿ ýòîãî ñíà÷àëà íóæíî ïðè ïîìîùè óòèëèòû bgiobj.exe ïðåâðàòèòü chr-ôàéëû â îáúåêòíûå ôàéëû c ðàñøèðåíèåì .obj. Çàòåì èõ ìîæíî âêëþ÷èòü â ïðîãðàììó êàê îáû÷íûå îáúåêòíûå ôàéëû.

Ïåðåä ñòàòè÷åñêîé èíèöèàëèçàöèåé çíàêîãåíåðàòîðà íåîáõîäèìà ðåãèñòðàöèÿ íóæíîé òàáëèöû âåêòîðíûõ øðèôòîâ, äëÿ ÷åãî ïðåäóñìîòðåíà ôóíêöèÿ, êîòîðîé íóæíî ïåðåäàòü ìåñòîïîëîæåíèå â îïåðàòèâíîé ïàìÿòè òàáëèöû ñèìâîëîâ øðèôòà:

int registerbgifont(void (*font)(void));

 êà÷åñòâå óêàçàòåëåé èñïîëüçóþòñÿ èìåíà, óæå îïðåäåëåííûå â îáúåêòíûõ ôàéëàõ øðèôòîâ. Íèæå ïðèâåäåíû îïèñàíèÿ òåõ èìåí, êîòîðûå íóæíî óïîòðåáëÿòü äëÿ øðèôòîâ èç ìèíèìàëüíîãî íàáîðà:

void triplex_font(void);

void small_font(void);

void sansserif_font(void);

void gothic_font(void);

Ïðè óñïåøíîé ðåãèñòðàöèè øðèôòà âîçâðàùàåìîå çíà÷åíèå íåîòðèöàòåëüíî. Äàëåå äëÿ èíèöèàëèçàöèè çíàêîãåíåðàòîðà èñïîëüçóåòñÿ ôóíêöèÿ settextstyle ñ íåîáõîäèìûìè óñòàíîâêàìè äëÿ øðèôòà. Òîãäà â ïðèñóòñòâèè íà äèñêå chr-ôàéëà îòïàäàåò âñÿêàÿ íåîáõîäèìîñòü.

Ãðàôè÷åñêàÿ ñèñòåìà ïîçâîëÿåò ïîçèöèîíèðîâàòü íà ñòðàíèöå âèäåîïàìÿòè âûâîäèìûé òåêñò ñ òî÷íîñòüþ äî ïèêñåëÿ, äëÿ ýòîãî ôóíêöèÿì âûâîäà òåêñòà íóæíî íåêîòîðóþ îïîðíóþ òî÷êó. Ðàñïîëîæåíèåì âûâîäèìîé ñòðîêè îòíîñèòåëüíî îïîðíîé òî÷êè óïðàâëÿåò ôóíêöèÿ

void far settextjustify(int horiz,int vert);

Åå àðãóìåíòû ìîãóò ïðèíèìàòü çíà÷åíèÿ êîíñòàíò ïåðå÷èñëèìîãî òèïà text_just:

enum text_just

{

LEFT_TEXT=0, CENTER_TEXT, RIGHT_TEXT,

BOTTOM_TEXT, TOP_TEXT

};

 ñëó÷àå îøèáêè ôóíêöèÿ settextjustify óñòàíàâëèâàåò êîä îøèáêè, ðàâíûé -11, è ñîõðàíÿåò ïðåäûäóùèé ðåæèì ïîçèöèîíèðîâàíèÿ.

Ïîçèöèîíèðîâàíèå ãîðèçîíòàëüíûõ ñòðîê ïðîèñõîäèò ñëåäóþùèì îáðàçîì. Åñëè ïðåäñòàâèòü ïðÿìîóãîëüíèê, â êîòîðûé âïèñàíà âûâîäèìàÿ ñòðîêà, òî ïàðà àðãóìåíòîâ horiz è vert îïèñûâàþò ïîëîæåíèå îïîðíîé òî÷êè â ïðÿìîóãîëüíèêå.

Ïðè èíèöèàëèçàöèè ãðàôè÷åñêîãî ðåæèìà îïîðíàÿ òî÷êà âñåõ ñòðîê ðàñïîëàãàåòñÿ â ëåâîì âåðõíåì óãëó ïðÿìîóãîëüíèêà, â êîòîðûé âïèñûâàåòñÿ ãîðèçîíòàëüíàÿ ñòðîêà.

 ïîçèöèîíèðîâàíèè âåðòèêàëüíûõ ñòðîê èìåþòñÿ íåêîòîðûå îñîáåííîñòè. Íóæíî ïîìíèòü, ÷òî ôóíêöèÿ settextjustify óïðàâëÿåò ðàçìåùåíèåì îòíîñèòåëüíî îïîðíîé òî÷êè èìåííî ïðÿìîóãîëüíèêà, ñîäåðæàùåãî òåêñò. Èç ýòîãî ñëåäóåò, ÷òî ïî îòíîøåíèþ ê ñàìîìó òåêñòó (ïîñêîëüêó îí ïîâåðíóò íà 90 ãðàäóñîâ) ïîçèöèîíèðîâàíèå ñïðàâà è ñëåâà îò îïîðíîé òî÷êè îïðåäåëÿåòñÿ àðãóìåíòîì vert, à ñâåðõó èëè ñíèçó – àðãóìåíòîì horiz. Àðãóìåíò vert îáðàáàòûâàåòñÿ òàê æå, êàê è äëÿ ãîðèçîíòàëüíîé ñòðîêè. Àðãóìåíò horiz âåäåò ñåáÿ ïî-äðóãîìó. Ïðè çíà÷åíèÿõ LEFT_TEXT è RIGHT_TEXT îí äàåò îäèíàêîâûé ðåçóëüòàò – òåêñòîâûé ïðÿìîóãîëüíèê ðàñïîëàãàåòñÿ ñëåâà îò îïîðíîé òî÷êè.

 ãðàôè÷åñêîé áèáëèîòåêå ñóùåñòâóåò ôóíêöèÿ, ïîçâîëÿþùàÿ ïîëó÷èòü èíôîðìàöèþ î òåêóùåì ðåæèìå âûâîäà ãðàôè÷åñêèõ òåêñòîâûõ ñîîáùåíèé:

void far gettextsettings(struct textsettingstype far *texttypeinfo);

Èíôîðìàöèÿ çàíîñèòñÿ â îáëàñòü ïàìÿòè, âûäåëåííóþ â ïðîãðàììå è ñîäåðæàùóþ ñëåäóþùóþ ñòðóêòóðó:

struct textsettingstype

{

int font,direction,charsize;

int horiz,vert;

};

Äëÿ ïðàâèëüíîãî ðàçìåùåíèÿ òåêñòà íà ñòðàíèöå íåîáõîäèìî çíàòü ðàçìåðû çàíèìàåìîãî èì ïðîñòðàíñòâà, êîòîðîå çàâèñèò îò òèïà øðèôòà è åãî ìàñøòàáèðîâàíèÿ. Ýòó èíôîðìàöèþ âûäàþò ôóíêöèè:

   int far textheight(char far *text_string);

   int far textwidth(char far *text_string);

Îíè âîçâðàùàþò âûñîòó è øèðèíó (â ïèêñåëÿõ) ïðÿìîóãîëüíèêà, â êîòîðûé áûë áû âïèñàí òåêñò ïðè âûâîäå ñòðîêè text_string çíàêîãåíåðàòîðîì òåêóùåãî øðèôòà ñ ó÷åòîì óñòàíîâëåííîãî â äàííûé ìîìåíò ìàñøòàáà øðèôòà. Ñàì âûâîä òåêñòà ïðè ýòîì íå ïðîèçâîäèòñÿ.

Ïðè ñâîåé ðàáîòå ôóíêöèè âûâîäà òåêñòà ñîçäàþò â âèäåîïàìÿòè ðèñóíîê ñèìâîëîâ ñòðîêè, èñïîëüçóÿ òàáëèöó âûáðàííîãî øðèôòà. Êîä, êîòîðûé ïðè ýòîì çàíîñèòñÿ â àòðèáóòû ïèêñåëåé, åñòü òåêóùåå çíà÷åíèå ðèñóþùåãî öâåòà (íîìåð âõîäà âî âíóòðåííþþ ïàëèòðó), óñòàíàâëèâàåìîå ôóíêöèåé setcolor. Íèêàêèõ áèòîâûõ îïåðàöèé ñ àòðèáóòàìè ïèêñåëåé âèäåîïàìÿòè íå ïðåäóñìîòðåíî. Ëèíèè, êîòîðûìè ðèñóþòñÿ ñèìâîëû âåêòîðíûõ øðèôòîâ, âñåãäà ñïëîøíûå òîíêèå, îíè íå ìîãóò ìîäèôèöèðîâàòüñÿ ôóíêöèåé setlinestyle.

 îòëè÷èå îò òåêñòîâîãî ðåæèìà, ôîí âûâîäèìûõ ñèìâîëîâ (öâåò ïðÿìîóãîëüíèêà, â êîòîðûé âïèñàíà ñòðîêà) íå èçìåíÿåòñÿ. Åñëè íóæíî âûâåñòè ñòðîêó íà êàêîì-ëèáî ôîíå, òî ôîí íóæíî íàðèñîâàòü îòäåëüíî, íàïðèìåð ñ ïîìîùüþ ôóíêöèè bar. Äðóãèì âàæíûì îòëè÷èåì ãðàôè÷åñêîãî ðåæèìà îò òåêñòîâîãî ÿâëÿåòñÿ îòñóòñòâèå ðåæèìà ìèãàíèÿ ñèìâîëà. Ìîæíî èìèòèðîâàòü ïðîöåññ ìèãàíèÿ, óïðàâëÿÿ âíóòðåííåé ïàëèòðîé ñ ïîìîùüþ ôóíêöèè setpalette.

Ôóíêöèé âûâîäà òåêñòà äâå:

void far outtext(char far *text_string);

void far outtextxy(int x,int y,char far *text_string);

Îáå â êà÷åñòâå àðãóìåíòà ïîëó÷àþò óêàçàòåëü íà âûâîäèìóþ ñòðîêó ñèìâîëîâ. Îòëè÷èå ìåæäó ýòèìè ôóíêöèÿìè ñîñòîèò â âûáîðå îïîðíîé òî÷êè ïðè ïîçèöèîíèðîâàíèè ñîîáùåíèÿ íà ñòðàíèöå. Ôóíêöèÿ outtext èñïîëüçóåò äëÿ ýòîãî òåêóùóþ ãðàôè÷åñêóþ ïîçèöèþ. Ôóíêöèÿ outtextxy ïîëó÷àåò êîîðäèíàòû îïîðíîé òî÷êè ÷åðåç àðãóìåíòû x è y. Êîîðäèíàòû çàäàþòñÿ â ñèñòåìå êîîðäèíàò òåêóùåãî ãðàôè÷åñêîãî îêíà. Ïðè óñòàíîâêå ðåæèìà îòñå÷åíèÿ èçîáðàæåíèÿ çà ïðåäåëàìè îêíà îáå ôóíêöèè òàêæå îáåñïå÷èâàþò îòñå÷åíèå ôðàãìåíòîâ òåêñòà, âûõîäÿùåãî çà ïðåäåëû ãðàôè÷åñêîãî îêíà.


2.         ÏÐÈÅÌÛ ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈß ÃÐÀÔÈ×ÅÑÊÎÃÎ ÐÅÆÈÌÀ

 

2.1.     Ïîäêëþ÷åíèå ãðàôè÷åñêîé áèáëèîòåêè

Äëÿ ïîäêëþ÷åíèÿ ãðàôè÷åñêîé áèáëèîòåêè ìîæíî èñïîëüçîâàòü îäèí èç äâóõ ïðèåìîâ. Âî-ïåðâûõ, âêëþ÷èòü â ìåíþ îáîëî÷êè BC++3.1 îïöèþ Options-Linker-Libraries-Graphics library. Âî-âòîðûõ, ñîçäàòü ïðîåêò è âêëþ÷èòü â íåãî èñõîäíûå cpp-ôàéëû è áèáëèîòåêó LIB\graphics.lib.

Ãðàôè÷åñêèé ðåæèì ìîæåò íå ðàáîòàòü â îáîëî÷êå, åñëè íå õâàòàåò ìåñòà â äèíàìè÷åñêîé ïàìÿòè. Ñëåäóåò óâåëè÷èòü åå ðàçìåð â ïóíêòå Options-Debugger-Heap size.

2.2.     Èíèöèàëèçàöèÿ ãðàôè÷åñêîãî ðåæèìà

Ïðîñòåéøóþ èíèöèàëèçàöèþ îñóùåñòâëÿåò ñëåäóþùèé êîä

#include <graphics.h>

void main()

{

int gd = DETECT, gm;

initgraph( &gd, &gm, “c:\\bc31\\bgi” );

// ðàáîòàåì â ãðàôè÷åñêîì ðåæèìå

putpixel(100, 200, WHITE);

// ……….

If(!getch())

getch();

closegraph();

}


2.3.     Âêëþ÷åíèå äðàéâåðà è øðèôòîâ â èñïîëíÿåìûé ôàéë

Äëÿ âêëþ÷åíèÿ ãðàôè÷åñêîãî äðàéâåð egavga.bgi â èñïîëíÿåìûé ôàéë íåîáõîäèìî:

à) â êîìàíäíîé ñòðîêå âûïîëíèòü

C:\BC31\BGI\bgiobj.exe egavga

è ïîëó÷èòü ôàéë egavga.obj;

á) ñîçäàòü ïðîåêò â îáîëî÷êå ñ ïîìîùüþ êîìàíäû ìåíþ Project-Open è âêëþ÷èòü â íåãî ôàéë egavga.obj è èñõîäíûå cpp-ôàéëû;

â) çàòåì â òåêñòå ïðîãðàììû çàïèñàòü êîä

registerbgidriver(EGAVGA_driver);

initgraph(&gd, &gm, “”);

Äëÿ âêëþ÷åíèÿ ãðàôè÷åñêèõ øðèôòîâ (ôàéëîâ ñ ðàñøèðåíèåì chr) â èñïîëíÿåìûé ôàéë íåîáõîäèìî:

à) â êîìàíäíîé ñòðîêå âûïîëíèòü

C:\BC31\BGI\bgiobj.exe goth

è ïîëó÷èòü ôàéë goth.obj;

á) ñîçäàòü ïðîåêò â îáîëî÷êå ñ ïîìîùüþ êîìàíäû ìåíþ Project-Open è âêëþ÷èòü â íåãî ôàéë goth.obj è èñõîäíûå cpp-ôàéëû;

â) çàòåì â òåêñòå ïðîãðàììû çàïèñàòü êîä

registerbgifont(GOTHIC_font);

initgraph(&gd, &gm, “c:\\borlandc\\bgi”);

//…………………

settextstyle(GOTHIC_FONT, HORIZ_DIR, 10);

outtext(“Hello”);

//…………………


2.4.     Ðèñîâàíèå ãåîìåòðè÷åñêèõ ôèãóð

à) Íàðèñóåì êðàñíîå ñîëíöå

setcolor(RED);

circle(100, 100, 50); //êðàñíàÿ îêðóæíîñòü

setfillstyle(SOLID_FILL, RED);

floodfill(100, 100, RED); /* ðèñóåì êðàñíûé êðóã, óêàçûâàÿ âíóòðåííþþ òî÷êó îáëàñòè è öâåò êîíòóðà */

á) Íàðèñóåì â öåíòðå ýêðàíà êâàäðàò ñî ñòîðîíîé a, ïîâåðíóòûé îòíîñèòåëüíî öåíòðà C íà óãîë j ïðîòèâ ÷àñîâîé ñòðåëêè. Ïóñòü Ñ(x0, y0) – ìàòåìàòè÷åñêèå êîîðäèíàòû òî÷êè. Òîãäà âåðøèíû íåïîâåðíóòîãî êâàäðàòà èìåþò êîîðäèíàòû

(x0 + (sqrt(2) / 2) · a · cos( p/4 + p/2 · k),

y0 + (sqrt(2) / 2) · a · sin( p/4 + p/2 · k)), ãäå k = 0, 1, 2, 3.

Ïðè ïîâîðîòå íà óãîë j ïîëó÷àåì ìàòåìàòè÷åñêèå âåðøèíû

(fk, gk) = (x0 + (sqrt(2) / 2) · a · cos( p/4 + p/2 · k + j),

y0 + (sqrt(2) / 2) · a · sin( p/4 + p/2 · k + j)),

ãäå k = 0, 1, 2, 3.

 ñîîòâåòñòâèè ñ äàííûìè, ïðèâåäåííûìè ï.2.11, ïåðåâîäèì ìàòåìàòè÷åñêèå êîîðäèíàòû (fk, gk) â êîîðäèíàòû ïèêñåëåé (uk, vk). Çàòåì îïðåäåëÿåì öåëî÷èñëåííûé ìàññèâ A êîîðäèíàò âåðøèí çàìêíóòîãî ìíîãîóîëüíèêà

{u[0], v[0], u[1], v[1] , u[2], v[2], u[3], v[3], u[0], v[0] }.


Òåïåðü ðèñóåì êâàäðàò ñ ïîìîùüþ îäíîé ôóíêöèè

drawpoly(5, A);

2.5.     Âûäåëåíèå ïàìÿòè ïîä áîëüøèå îäíîìåðíûå ìàññèâû

Ýëåìåíòàìè ìàññèâîâ ìîãóò áûòü ñòðóêòóðû áîëüøîãî ðàçìåðà. Åñëè è ðàçìåð ìàññèâà çíà÷èòåëåí, òî âûäåëèòü äèíàìè÷åñêóþ ïàìÿòü ïîä òàêîé ìàññèâ îäíèì âûçîâîì ôóíêöèè malloc íåëüçÿ. Ïðîòîòèï ýòîé ôóíêöèè

void *malloc( unsigntd int T);

Ïîýòîìó ìàêñèìàëüíûé ðàçìåð áëîêà ïàìÿòè, êîòîðûé îíà âûäåëÿåò, íå ïðåâîñõîäèò 64Ê.

Ïðåäëàãàåòñÿ ýìóëèðîâàòü îäíîìåðíûé äèíàìè÷åñêèé ìàññèâ äâóìåðíûì äèíàìè÷åñêèì ìàññèâîì ñ èñïîëüçîâàíèåì ìàññèâà
óêàçàòåëåé.

Íàïðèìåð, âûäåëèì ïàìÿòü ïîä long T=50000l ñòðóêòóð

struct comp {

float re, im;

};

Îáùèé ðàçìåð òàêîãî ìàññèâà ðàâåí 50 000 * 8 = 400 000 áàéò. Âûáåðåì ðàçìåðû äâóìåðíîãî ìàññèâà

int m = 1000;       // êîëè÷åñòâî ñòîëáöîâ âûáèðàåì ïðîèçâîëüíî

int n = (int)((T – 1)/ m) +1; // êîëè÷åñòâî ñòðîê, íóìåðàöèÿ ñòðîê
ñ íóëÿ

 ïîñëåäíåé (m-1)-é ñòðîêå ïðÿìîóãîëüíîé äèíàìè÷åñêîé ìàòðèöû m ´ n ìîãóò ñîäåðæàòüñÿ ýëåìåíòû, íå ïðèíàäëåæàùèå èñõîäíîìó îäíîìåðíîìó ìàññèâó. Ïîýòîìó ïðè ïåðåáîðå ýëåìåíòîâ ìàññèâà íåîáõîäèìà ñîîòâåòñòâóþùàÿ ïðîâåðêà.

comp ** A = NULL;

A = (comp **) malloc( m * sizeof(comp *));

// ïðîâåðêà âûäåëåíèÿ ïàìÿòè

for(int i=0; i < m; i++)

A[i] = (comp *) malloc(k * sizeof(comp));

// ïðîâåðêà âûäåëåíèÿ ïàìÿòè

for( i =0; i < m; i++)

for( int j =0; j < n; j++)

if( (long) i*k+j < T)       // ðàáîòàåì òîëüêî ñ ýëåìåíòàìè

// èñõîäíîãî îäíîìåðíîãî ìàññèâà                           {

A[i][j].re = 0;

A[i][j].im = 0;

}

// ðàáîòà ïðîãðàììû

// îñâîáîæäåíèå ïàìÿòè

for( i =0; i < m; i++)

         free(A[i]);

free(A);

2.6.     Âûâîä ÷èñëîâîé èíôîðìàöèè

Äëÿ âûâîäà ôîðìàòèðîâàííûõ äàííûõ èñïîëüçóåòñÿ äâóõýòàïíûé àëãîðèòì. Âíà÷àëå äàííûå çàïèñûâàþòñÿ â ñòðîêó èëè, êàê èíîãäà ãîâîðÿò, â ïàìÿòü. Çàòåì ñòðîêà âûâîäèòñÿ íà ãðàôè÷åñêèé ýêðàí.

Íàïðèìåð âûâåäåì âåùåñòâåííîå ÷èñëî ñ äâóìÿ çíàêàìè ïîñëå çàïÿòîé.

char buf[5];

float x = 3.1415;

sprintf(buf, “%4.2”, x);

outtextxy(100, 100, buf);

Öèôðà 4 â ôîðìàòíîé ñòðîêå çàäàåò êîëè÷åñòâî áàéòîâ â ïàìÿòè, êîòîðûå áóäåò çàíèìàòü âûâîäèìàÿ ôîðìàòèðîâàííàÿ èíôîðìàöèÿ áåç ó÷åòà ïðèçíàêà êîíöà ñòðîêè. Ïðèåì èñïîëüçóåòñÿ äëÿ ïðåäîòâðàùåíèÿ âûõîäà çà äèàïàçîí ìàññèâà. Ïîäîáíàÿ îøèáêà âîçíèêëà áû â ñëó÷àå
x = 13.1415.

2.7.     Çàäåðæêà ýêðàíà

Îðãàíèçàöèÿ çàäåðæêè ýêðàíà íå çàâèñèò îò âûáîðà ãðàôè÷åñêîãî èëè òåêñòîâîãî ðåæèìà, è ðåàëèçóåòñÿ ñëåäóþùèì îáðàçîì

if (!getch())

getch();

Äàííûé êîä êîððåêòíî îáðàáàòûâàåò äâà âîçìîæíûõ ñëó÷àÿ. Âî-ïåðâûõ, ïðè íàæàòèè îáû÷íîé êëàâèøè. Ïðè ýòîì ñ êëàâèàòóðû â áóôåð ââîäà ïîìåùàåòñÿ íåíóëåâîé ascii-êîä ñèìâîëà, ñîîòâåòñòâóþùåãî íàæàòîé êëàâèøå. Òîãäà óñëîâèå !getch() ëîæíî è âòîðîé getch() íå âûçûâàåòñÿ.

Âî-âòîðûõ, ïðè íàæàòèè êëàâèøè ñ ðàñøèðåííûì êîäîì (íàïðèìåð, ôóíêöèîíàëüíûå êëàâèøè, ñòðåëêè) ñ êëàâèàòóðû â áóôåð ââîäà ïîñòóïàþò äâà ÷èñëà: íîëü è scan-êîä ýòîé êëàâèøè. Òîãäà óñëîâèå !getch() èñòèííî, âûçûâàåòñÿ âòîðîé getch(), êîòîðûé ñ÷èòûâàåò scan-êîä è òåì ñàìûì î÷èùàåò áóôåð.

Äðóãèì ñïîñîáîì çàäåðæêè ýêðàíà ÿâëÿåòñÿ êîä

while(!getch())

;

Îòìåòèì, ÷òî ñòàíäàðòíûì ñïîñîáîì çàäåðæêè (â ó÷åáíèêàõ è ïðèìåðàõ èç ñïðàâîê ïî ôóíêöèÿì) ÿâëÿåòñÿ âûçîâ ôóíêöèè

getch();

Îäíàêî ýòîò ñïîñîá íåêîððåêòíî îáðàáàòûâàåò íàæàòèå êëàâèøè ñ ðàñøèðåííûì êîäîì.  äàííîì ñëó÷àå â áóôåðå îñòàíåòñÿ îäèí íåïðî÷èòàííûé ñèìâîë, êîòîðûé áóäåò ñ÷èòûâàòüñÿ ïðè ñëåäóþùåì ââîäå èíôîðìàöèè.


2.8.     Ðåàêöèÿ ïðîãðàììû íà íàæàòèå êîíêðåòíîé êëàâèøè

 ñëåäóþùåì ôðàãìåíòå âûõîäèì èç öèêëà ïî íàæàòèþ êëàâèøè Escape

#define ESC 27

while(1){

         if(kbhit()){

                            char c=getch();

if(c == 0)

{

                  getch();

                  continue;

}       

else if( c == ESC)

                  break;

                  }

         //ðàáîòà öèêëà

}

2.9.     Îðãàíèçàöèÿ ââîäà ÷èñëîâîé èíôîðìàöèè

 ãðàôè÷åñêèõ ïðèëîæåíèÿõ ââîä òåêñòîâîé è ÷èñëîâîé èíôîðìàöèè ðåàëèçóåòñÿ òàêæå â ãðàôè÷åñêîì ðåæèìå. Äëÿ ýòîãî íåëüçÿ èñïîëüçîâàòü ôóíêöèþ scanf, òàê êàê îíà ïðåäïîëàãàåò òåêñòîâûé ðåæèì.

 Ïðåäëàãàåòñÿ ñëåäóþùèé àëãîðèòì äëÿ ââîäà öåëîãî ïîëîæèòåëüíîãî ÷èñëà. Äàííûå ñ÷èòûâàþòñÿ ñ êëàâèàòóðû ïîñèìâîëüíî, ñîõðàíÿþòñÿ â ïàìÿòè è çàòåì ðàñïîçíàþòñÿ ñ ïîìîùüþ ôóíêöèè sscanf ôîðìàòèðîâàííîãî ââîäà èç ñòðîêè. Ñòðîêà âûâîäèòñÿ â ãðàôè÷åñêîì ðåæèìå ïîñèìâîëüíî.

#define ENTER 13

main(){

//èíèöèàëèçàöèÿ ãðàôè÷åñêîãî ðåæèìà

char c, buf[2], *str=(char *)malloc(1);

int number;

str[0] = ’\0’;

buf[1] = ‘\0’;

while( (c = getch()) != ENTER){

 if( c < ’0’ || c> ’9’)

                   continue;

          buf[0] = c; // ââåäåííûé ñèìâîë îôîðìëÿåì â âèäå ñòðîêè

          outtext(buf); // è âûâîäèì íà ýêðàí â ãðàôè÷åñêîì ðåæèìå

 str = realloc(str, strlen(str) + 2);

          str[strlen(str) + 1] = ‘\0’;

          str[strlen(str)] = c; // çàïîìèíàåì ñèìâîë â ïàìÿòè

}

sscanf(str, “%d”, &number);

}

2.10.   Ïðîâåðêà âûõîäà àðãóìåíòà ôóíêöèè èç ÎÄÇ

Ïðîâåðêó âûõîäà ïåðåìåííîé x èç îáëàñòè äîïóñòèìûõ çíà÷åíèé ôóíêöèè f(x) ìîæíî ðåàëèçîâàòü â ñàìîì òåëå ôóíêöèè.  ñëó÷àå âûõîäà èç ÎÄÇ ôóíêöèÿ âçâîäèò ãëîáàëüíûé ôëàã, êîòîðûé ïðîâåðÿåòñÿ â âûçûâàþùåé ôóíêöèè.

Íàïðèìåð,

int flag=0;   //ãëîáàëüíûé ôëàã

// ðàáîòàåì ñ ôóíêöèåé y = x1/2

float f(float x){

if(x<0){

flag=1;

return 0;

}

 else{

flag=0;

return sqrt(x);

         }

}

void main(){

         float x, y;

         scanf(“%f”, &x);

         y=f(x);

         if(flag==1)

                   printf(“Âûõîä èç ÎÄÇ. ”);

         else

printf(“Íåò âûõîäà èç ÎÄÇ. Ïðîäîëæàåì âû÷èñëåíèÿ”);

}

2.11.   Ãðàôè÷åñêàÿ è ìàòåìàòè÷åñêàÿ ñèñòåìû êîîðäèíàò

Äëÿ ðèñîâàíèÿ ãðàôèêà ôóíêöèè ïðîãðàììèñòó óäîáíåå èñïîëüçîâàòü ìàòåìàòè÷åñêóþ ñèñòåìó êîîðäèíàò (ÌÑÊ), ðàñïîëîæåííóþ ïî öåíòðó ýêðàíà. Ãðàôè÷åñêèå ôóíêöèè ðàáîòàþò â ãðàôè÷åñêîé ñèñòåìå êîîðäèíàò (ÃÑÊ).


à                                             á

Ðèñ. 1. Ñèñòåìû êîîðäèíàò: à – ìàòåìàòè÷åñêàÿ; á – ãðàôè÷åñêàÿ

Èíèöèàëèçèðóåì ïåðåìåííûå.

int maxx = getmaxx(),

 maxy = getmaxy(),

px = 30, // êîëè÷åñòâî ïèêñåëåé â îäíîé ìàòåìàòè÷åñêîé åäèíèöå ïî îñè Îõ

py = px * ((float)maxx/maxy); // êîëè÷åñòâî ïèêñåëåé â îäíîé ìàòåìàòè÷åñêîé åäèíèöå ïî îñè Îy.

Ñîîòâåòñòâèå ìåæäó äâóìÿ ñèñòåìàìè êîîðäèíàò ïðåäñòàâëåíî
íèæå

Ñîîòâåòñòâèå ìåæäó ÌÑÊ è ÃÑÊ

ÌÑÊ ÃÑÊ
 (0, 0) ………………………………. (maxx / 2, maxy / 2)
(1, 0) ………………………………. (maxx / 2 + px, maxy / 2)
(0, 1) ………………………………. (maxx / 2, maxy / 2 – py)
(x, y) ….……………………………. (maxx / 2 + x px, maxy / 2 – y py)
(x, f(x)) ……………………………. (maxx / 2 + x px, maxy / 2 – f(x) py)

Ðåàëèçóåì ìàñøòàáèðîâàíèå ïî îñè êîîðäèíàò Îõ òàê, ÷òîáû ãðàôèê ôóíêöèè y = f(x) íà çàäàííîì îòðåçêå [a, b] ðàçìåùàëñÿ ïî âñåé øèðèíå ýêðàíà. Äëÿ ýòîãî íàéäåì êîýôôèöèåíòû u è v ëèíåéíîãî îòîáðàæåíèÿ g(x) = u x + v, ïðè êîòîðîì îòðåçîê [a, b] ïåðåõîäèò â îòðåçîê [0, maxx]. Èç ñèñòåìû ëèíåéíûõ óðàâíåíèé

u a + v = 0

u b + v = maxx

íàõîäèì u = maxx / (b-a), v = -a maxx / (b-a). Òîãäà òî÷êå (x, f(x)) áóäåò ñîîòâåòñòâîâàòü ïèêñåëü

( (maxx / (b-a)) * x - a * maxx / (b-a) , maxy / 2 - f(x) * py)),

ãäå px = maxx/(b-a). Çàòåì ãðàôèê ìîæíî íàðèñîâàòü ñ ïîìîùüþ öèêëà, â êîòîðîì ñ÷åò÷èê ÿâëÿåòñÿ âåùåñòâåííîé ìàòåìàòè÷åñêîé ïåðåìåííîé. Íàïðèìåð:

for(float x = a; x <= b; x += (b-a) / maxx)

putpixel((maxx / (b-a)) * x - a * maxx / (b-a), maxy / 2- f(x) * py));

Äàííûé öèêë ïðè áîëüøèõ a è b ìîæåò îêàçàòüñÿ áåñêîíå÷íûì. Ýòî âîçìîæíî â ñëó÷àå, åñëè øàã öèêëà (b-a) / maxx áóäåò ìåíüøå ðàññòîÿíèÿ ìåæäó ÷èñëîì a è åãî áëèæàéøèì ñîñåäîì ñïðàâà äëÿ òèïà float.

2.12.   Èñïîëüçîâàíèå äâóõ âèäåîñòðàíèö

Äëÿ ðèñîâàíèÿ âðàùàþùåéñÿ çâåçäû (ñì. çàäàíèå 3.4) ëó÷øå èñïîëüçîâàòü äâå âèäåîñòðàíèöû.

int page=0;

for(double f = 0; f < 2 × M_PI-M_PI / 100; f += M_PI / 50) {

otrisovka(X0, Y0, R1, r2, fi0 + f, COLOR); /* ðèñóåì íîâóþ çâåçäó íà àêòèâíîé ñòðàíèöå, êîòîðàÿ ïî óìîë÷àíèþ èìååò íóëåâîé íîìåð*/

 setvisualpage(page); /* ïîêàçûâàåì èçîáðàæåíèå íîâîé çâåçäû*/

 page=abs(page-1); /* ìåíÿåì íîìåð ñòðàíèöû ñ 0 íà 1 èëè íàîáîðîò*/

 setactivepage(page); /* ìåíÿåì àêòèâíóþ ñòðàíèöó*/

 otrisovka(X0, Y0, R1, r2, fi0 + f-M_PI / 50, getbkcolor()); /* ñòèðàåì ñòàðóþ çâåçäó íà àêòèâíîé ñòðàíèöå*/

 }

2.13.   Ðèñîâàíèå èçîáðàæåíèé â bmp-ôîðìàòå

Äëÿ ñîçäàíèÿ ôîíà â çàäà÷å î ñíåãîïàäå ìîæíî èñïîëüçîâàòü 16-òè öâåòíûé bmp-ôàéë, òàê êàê ýòî óñòðàíÿåò ïðîáëåìó ñàìîñòîÿòåëüíîãî ðèñîâàíèÿ ôîíîâîãî èçîáðàæåíèÿ ñðåäñòâàìè ÿçûêà C++. Äëÿ çàãðóçêè èçîáðàæåíèÿ èç ôàéëà íàäî âûïîëíèòü äåéñòâèÿ:

1)         ñ ïîçèöèè 22 â ôàéëå ïðî÷èòàòü âûñîòó ðèñóíêà;

2)         âû÷èñëèòü øèðèíó çàïèñàííîãî èçîáðàæåíèÿ

øèðèíà = (ðàçìåð_ôàéëà - 118) / âûñîòà;

3) çàãðóçèòü ñàì ðèñóíîê, íà÷èíàÿ ñ ïîçèöèè 118, ó÷èòûâàÿ, ÷òî â îäíîì áàéòå ñîäåðæèòñÿ 2 ïèêñåëÿ è òî, ÷òî èçîáðàæåíèå â ôàéëå çàïèñàíî ïîñòðî÷íî, ïðè÷åì ïåðâàÿ ñòðîêà çàïèñàíà â êîíåö ôàéëà, à ïîñëåäíÿÿ – ñ ïîçèöèè 118.

// êàðòà çàìåùåíèÿ öâåòîâ äëÿ ñîçäàíèÿ âèçóàëüíîãî ýôôåêòà

char map[] = {0,12,2,6,9,5,3,8,7,4,10,14,1,13,11,15};

int y0 = getmaxy();

// Îòêðûâàåì êàðòèíêó

 FILE *f = fopen(fon, "rb");

 if(f==NULL)

 return 2;

 // ÷èòàåì øèðèíó êàðòèíêè

 fseek(f, 0, 2);

 long l = ftell(f)-118;

 fseek(f, 22, 0);

 int w,h;

 fread(&h, 2, 1, f);

 w = int(l / h);

// ÷èòàåì è ðèñóåì êàðòèíêó

 fseek(f, 118, 0);

 int x=0;

 int y=0;

 while(1) {

 c = fgetc(f);

         if(feof(f))

 break;

         ch = map[c/16];

         cl = map[c%16];

         putpixel(2*x+0, y0-y, ch);

         putpixel(2*x+1, y0-y, cl);

         if(++x==w) {

 x=0;

 y++;

 }

 }

 fclose(f);

2.14.   Ðàáîòà ñ ìûøüþ

Âûçîâû BIOS èñïîëüçóþò ïðîãðàììíûå ïðåðûâàíèÿ. BIOS èìååò íåñêîëüêî ðàçëè÷íûõ ïðåðûâàíèé äëÿ ðàçíûõ öåëåé. Äëÿ ðàáîòû ñ ìûøüþ èñïîëüçóþò ïðåðûâàíèå 0x33. Äëÿ äîñòóïà ê ýòèì ïðåðûâàíèÿì èñïîëüçóåòñÿ ôóíêöèÿ Ñè ñ ïðîòîòèïîì â ôàéëå <dos.h>

int int86(int num, REGS *in, REGS *out);

ãäå num – íîìåð ïðåðûâàíèÿ. Îáúåäèíåíèå REGS èìååò âèä

union REGS{

         struct WORDREGS x;

         struct BYTEREGS y;

};

struct WORDREGS{

         unsigned int ax, bx, cx, dx, si, di, cflags, flags;

};

struct BYTEREGS{

         unsigned char al, ah, bl, bh, cl, ch, dl, dh;

};

//Îïðåäåëèì ãëîáàëüíóþ ïåðåìåííóþ

REGS regs;

//ïîêàçàòü êóðñîð

void showcursor(void){        

          regs.x.ax = 0x01;

          int86(0x33,&regs,&regs);

}

//ñïðÿòàòü êóðñîð

void hidecursor(void){ 

regs.x.ax = 0x02;

          int86(0x33,&regs,&regs);

}

//ïîëó÷åíèå ñòàòóñà ìûøè

void get_mouse_status(int& button,int& x,int& y){

          regs.x.ax = 0x03;

          int86(0x33,&regs,&regs);

          button = regs.h.bl;

          x = regs.x.cx;

          y = regs.x.dx;

}

//ïðèìåð èñïîëüçîâàíèÿ ìûøè

main(){

//èíèöèàëèçàöèÿ ãðàôè÷åñêîãî ðåæèìà

int button, x, y;

char str[20];

showcursor();

while(1){

get_mouse_status(button, x, y);

if(x == 0 || y == 0)

         break;

sprintf(str, “%d %d”,x, y);

                   outtext(30, 30, str);

}

hidecursor();

}


3.         ÇÀÄÀÍÈß ÄËß ËÀÁÎÐÀÒÎÐÍÎÉ ÐÀÁÎÒÛ

 

3.1.     Çâåçäíîå íåáî

Íà ýêðàíå â íåïðåðûâíîì ðåæèìå ðèñóþòñÿ çâåçäû (ïèêñåëè) â ñëó÷àéíîì ìåñòå è ñëó÷àéíûì öâåòîì. Ðàñïðåäåëåíèå ñëó÷àéíûõ âåëè÷èí ðàâíîìåðíîå. Ïðè íàëîæåíèè íîâîé çâåçäû íà äðóãóþ âèäèìóþ çâåçäó îáå ñòèðàþòñÿ. Ðèñîâàíèå ïðåêðàùàåòñÿ íàæàòèåì êëàâèøè Escape. Çàòåì ïðîèñõîäèò ïîäñ÷åò ÷èñëà âèäèìûõ çâåçä, è ïðîöåíò çàïîëíåíèÿ íåáà âûâîäèòñÿ ïî öåíòðó ãðàôè÷åñêîãî ýêðàíà ñ òî÷íîñòüþ äî ñîòûõ äîëåé ïðîöåíòà. Èñïîëüçîâàòü ãîòè÷åñêèé øðèôò ðàçìåðîì 1 ñì.

Ðèñîâàíèå çâåçä è èõ ïîäñ÷åò ðåàëèçîâàòü â âèäå îòäåëüíûõ ôóíêöèé. Ïîëó÷èòü îòâåò äëÿ äâóõ ðåæèìîâ VGAHI è VGALO.

3.2.     Ñíåãîïàä

Ñ âåðõíåé ÷àñòè è ñ áîêîâûõ ñòîðîí ýêðàíà â íåïðåðûâíîì ðåæèìå ïàäàþò áåëûå ñíåæèíêè â ôîðìå îäíîãî ïèêñåëÿ. Âûõîä èç ïðîãðàììû ïî íàæàòèþ êëàâèøè Escape. Ñíåæèíêè ïðîëåòàþò ýêðàí è ñíîâà ïîÿâëÿþòñÿ. Ñîçäàòü íà ýêðàíå ãðàôè÷åñêèé ôîí â âèäå ãîëóáîãî ïîëóìåñÿöà, êðàñèâîãî òåêñòà è ïð. Ôîí íå ñîäåðæèò áåëîãî öâåòà è íå äîëæåí ïåðåðèñîâûâàòüñÿ.

Ïëîòíîñòü ñíåãîïàäà ââîäèòñÿ â íà÷àëå ïðîãðàììû â òåêñòîâîì ðåæèìå. Ìàêñèìàëüíîå êîëè÷åñòâî ñíåæèíîê ðàâíî 50 000. Ïàðàìåòðû ñíåæèíêè íàõîäÿòñÿ â ïîëüçîâàòåëüñêîé ñòðóêòóðå äàííûõ. Äëÿ õðàíåíèÿ èíôîðìàöèè î ñíåæèíêàõ ñëåäóåò èñïîëüçîâàòü äâóìåðíûé äèíàìè÷åñêèé ìàññèâ ñòðóêòóð.

Ñìåùåíèÿ ñíåæèíîê ñîäåðæàò õàîòè÷åñêóþ ñîñòàâëÿþùóþ ïî ãîðèçîíòàëè è âåðòèêàëè. Îðãàíèçîâàòü óïðàâëåíèå âåòðîì ñ ïîìîùüþ êëàâèø-ñòðåëîê.

3.3.     Ðèñîâàíèå ãðàôèêà ôóíêöèè

Íàðèñîâàòü ãðàôèê ôóíêöèè y = f(x) íà îòðåçêå [a, b]. Âåùåñòâåííûå ãðàíèöû èíòåðâàëà ââîäÿòñÿ ñ êëàâèàòóðû â ãðàôè÷åñêîì ðåæèìå ñ âîçìîæíîñòüþ ðåäàêòèðîâàíèÿ. Ãðàôèê íåîáõîäèìî ìàñøòàáèðîâàòü ïî øèðèíå ýêðàíà òàê, ÷òîáû îòðåçîê [a, b] ïîëíîñòüþ âïèñàëñÿ â ýêðàí.

Ôóíêöèÿ f(x) çàäàåòñÿ èñõîäíûì êîäîì íà ÿçûêå Ñè. Îñóùåñòâèòü ïðîâåðêó âûõîäà ïåðåìåííîé x èç ÎÄÇ.

3.4.     Âðàùåíèå çâåçäû

Íàïèñàòü ôóíêöèþ, êîòîðàÿ ðèñóåò ïðàâèëüíóþ ïÿòèêîíå÷íóþ öâåòíóþ çâåçäó, ñî ñëåäóþùèìè ïàðàìåòðàìè:

·          x, y – ìàòåìàòè÷åñêèå êîîðäèíàòû öåíòðà;

·          R, r – ìàòåìàòè÷åñêèå ðàäèóñû âíóòðåííåé è âíåøíåé îêðóæíîñòåé;

·          fi – óãîë ìåæäó îñüþ x è îäíèì èç áîëüøèõ ëó÷åé çâåçäû, â ðàäèàíàõ;

·          col – öâåò êîíòóðà çâåçäû;

·          colfill – öâåò çàëèâêè.

Íàïèñàòü òàêæå ïðîãðàììó, â êîòîðîé âðàùàåòñÿ êðàñíàÿ çâåçäà â öåíòðå ýêðàíà.


ÁÈÁËÈÎÃÐÀÔÈ×ÅÑÊÈÉ ÑÏÈÑÎÊ

1.         Êåðíèãàí Á. ßçûê ïðîãðàììèðîâàíèÿ Ñè / Á. Êåðíèãàí, Ä. Ðèò÷è. Ì.: Ôèíàíñû è ñòàòèñòèêà, 1992. 272 ñ.

2.         Êåðíèãàí Á. ßçûê ïðîãðàììèðîâàíèÿ Ñè. Çàäà÷è ïî êóðñó Ñè / Á. Êåðíèãàí, Ä. Ðèò÷è. Ì.: Ôèíàíñû è ñòàòèñòèêà, 1985. 192 ñ.

3.         Þðêèí À.Ã. Çàäà÷íèê ïî ïðîãðàììèðîâàíèþ / À.Ã. Þðêèí. ÑÏá.: Ïèòåð, 2002. 192 ñ.

4.         Ïîäáåëüñêèé Â.Â. Ïðîãðàììèðîâàíèå íà ÿçûêå Ñè: ó÷åá. ïîñîáèå / Â.Â. Ïîäáåëüñêèé, Ñ.Ñ. Ôîìèí. Ì.: Ôèíàíñû è ñòàòèñòèêà, 2005. 600 ñ.

5.         Òðîôèìîâ Ñ.Ï. Ïðîãðàììèðîâàíèå â Ñè. Îðãàíèçàöèÿ ââîäà-âûâîäà: ìåòîä. óêàçàíèÿ / Ñ.Ï. Òðîôèìîâ. Åêàòåðèíáóðã: ÓÃÒÓ,1998. 20 ñ.

6.         Òðîôèìîâ Ñ.Ï. Ïðîãðàììèðîâàíèå â Ñè. Äèíàìè÷åñêè ðàñïðåäåëÿåìàÿ ïàìÿòü: ìåòîä. óêàçàíèÿ / Ñ.Ï. Òðîôèìîâ. Åêàòåðèíáóðã: ÌÈÄÎ, 1998. 14 ñ.

Êàôåäðà: Àâòîìàòèêà è Èíôîðìàöèîííûå Òåõíîëîãèè ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈÅ Â ÑÈ ÐÀÁÎÒÀ  ÃÐÀÔÈ×ÅÑÊÎÌ ÐÅÆÈÌÅ ÎÃËÀÂËÅÍÈÅ 1.        ÎÁÇÎÐ ÃÐÀÔÈ×ÅÑÊÈÕ ÔÓÍÊÖÈÉ3 1.1.     Îáùèå ñâåäåíèÿ 1.2.     Èíèöèà

 

 

 

Âíèìàíèå! Ïðåäñòàâëåííàÿ Ëàáîðàòîðíàÿ ðàáîòà íàõîäèòñÿ â îòêðûòîì äîñòóïå â ñåòè Èíòåðíåò, è óæå íåîäíîêðàòíî ñäàâàëàñü, âîçìîæíî, äàæå â òâîåì ó÷åáíîì çàâåäåíèè.
Ñîâåòóåì íå ðèñêîâàòü. Óçíàé, ñêîëüêî ñòîèò àáñîëþòíî óíèêàëüíàÿ Ëàáîðàòîðíàÿ ðàáîòà ïî òâîåé òåìå:

Íîâîñòè îáðàçîâàíèÿ è íàóêè

Çàêàçàòü óíèêàëüíóþ ðàáîòó

Ïîõîæèå ðàáîòû:

Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè
Ïðîãðàììèðîâàíèå íà ÿçûêå Ñè++
Ïðîãðàììèðîâàíèå öèêëè÷åñêèõ è òèïîâûõ ïðîãðàìì íà Àññåìáëåðå äëÿ ìèêðîïðîöåññîðà ÊÐ580ÈÊ80
Ïðîãðàììíûé êîäåð-äåêîäåð äëÿ öèêëè÷åñêèõ (n,k)-êîäîâ
Ïðîãðàìóâàííÿ
Ïðîãðàìóâàííÿ àëãîðèòì³÷íîþ ìîâîþ VBA
Ïðîåêòèðîâàíèå áàç äàííûõ MS Access
Ïðîåêòèðîâàíèå âýá-ñàéòîâ
Ïðîåêòèðîâàíèå è ðåàëèçàöèÿ èíôîðìàöèîííî-ïîèñêîâîé ñèñòåìû ñ ïîìîùüþ CASE-ñðåäñòâà DBDesigner
Ïðîåêòèðîâàíèå ëîêàëüíîé âû÷èñëèòåëüíîé ñåòè

Ñâîè ñäàííûå ñòóäåí÷åñêèå ðàáîòû

ïðèñûëàéòå íàì íà e-mail

Client@Stud-Baza.ru