Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Тілдің графикалық мүмкіндіктерін пайдалану






Компьютердің мониторы мә тіндік (горизонталь бойынша 80 жә не вертикаль юойынша 25 символғ а дейін бейнеленеді) жә не графикалық (графикалық нү ктелер – пиксельдер бейнеленеді) режимдерді сү йемелдейді. Графикамен жұ мыс жасау монитор графикалық режимге ө ткеннен кейін орындалады. Пиксельдің ө лшемі бейненің кө рініс қ асиетін анық тайды. Графикалық режимде жұ мыс жасағ анда видеоадаптер бірнеше графикалық режимдерді сү йемелдей алады. Қ азіргі кезде шешу қ абілеті 640× 480, 1024× 268, 1152× 864, 1280× 1024 болатын мониторлар қ олданылады. Шешу қ абілетті rx× ry тү рде белгілейміз, мұ ндағ ы rx – экрандағ ы горизонталь бойынша пиксельдер саны, ry – вертикаль бойынша (rx пен ry тек бү тінсанды мә ндерді ғ ана қ абылдайды). Нү ктенің экран бетіндегі орнын графикалық координаттар береді. Олардың рұ қ сат етілген мә ндер аралығ ы Х rx-1 – гедейін жә не Yө сі бойынша 0 ден ry-1 -гедейін. Есептеу басталатын нү кте экранның сол жақ тағ ы жоғ арғ ы бұ рышы болып табылады, есептеу – сол жақ тан оң жақ қ а жә не жоғ арыдан тө мен қ арай жү ргізіледі.

Паскаль графикалық программаларды жетілдіруге арналғ ан арнайы қ ұ ралдарды қ амтиды. Ол мү мкіндіктердің бір бө лігі стандартты Graph модулі арқ ылы жү зеге асырылғ ан. Ол модуль дербес компьютерлердің ең кең тарағ ан графикалық адаптерлерімен жұ мыс жасауғ а арналғ ан ә мбебап тағ айындалғ ан графикалық ішкі программалардың библиотекасы болып табылады. Graph.tpu модулін программағ а қ осу программаның басында uses graph директивасы арқ ылы орындалады. Графикалық режимге ауысу Initgraph процедура арқ ылы жү зеге асырылады. Бұ л процедураның ү ш аргументі бар: Initgraph(драйвер, режим, 'драйверге жету жолы'), мұ ндағ ы драйвер – видеоадаптердің типі (мысалы egavga.bgi), режим – видеорежим, 'драйверге жету жолы' – драйвердің дискте орналасқ ан орны, жол кө рсетілмесе (бос болса - ''), онда драйвер программа орналасқ ан каталогта орналасуы тиіс. Видеоадаптердің типі gd: =Detect ө рнек арқ ылы автоматты тү рде анық талуы мү мкін. Graph модуліндегі detect =0 бү тін тұ рақ ты драйверді автоматты тү рде танып, берілген компьютер ү шін шешу қ абілетінің максималды режимін орнатады. Графикалық режимдегі жұ мысты аяқ тауды closegraph процедурасы қ амтамасыз етеді, ол драйверді жадыдан тү сіріп, графиканы инициализациялауғ а дейінгі экранның жұ мыс режимін орнатады. Программ фрагменті:

uses graph;

var gd, gm: integer; {gd жә не gm драйверді жә не режимді анық тайды}

begin

gd: =vga; gm: =vgahi; {немесе оның орнына gd: =detect }

initgraph(gd, gm, 'd: \tp55');

...

closegraph {жадыны драйверден босату}

Графикадағ ы қ ателерді байқ ау ү шін graphresult жә не grapherrormsg (қ атенің коды) функциялар пайдаланылады. Grapherrormsg кодқ а сә йкес қ атенің сипаты жө ненінде хабарламаны береді. Қ ателерді тексерумен бірге графикалық режимді инициализациялау программада келесі тү рдей орындалуы мү мкін:

uses graph; var gd, gm, errorcod: integer;

begin

gd: =detect; initgraph(gd, gm, '');

errorcod: =graphresult;

if errorcod < > grOk then

begin

writeln('графика қ атесі');

writeln(grapherrormsg(errorcod));

halt

end;

Halt процедурасы программаның орындалуын тоқ татып басқ аруды операциялық жү йеге қ айтарады. Палитраны қ алыптастыру ү шін қ ызыл, жасыл жә не кө к тү стерді арластыру жә не сә уленің жарық тылығ ын ө згерту жү йесі пайдаланылады. Тү с палитраның тү стер тізіміндегі 0.. 15 аралық тағ ы нө мір арқ ылы беріледі:

0 - қ ара 1 – кө к 2 -жасыл 3 - cyan (кө к)
4 - қ ызыл 5 - magenta(пурпурный) 6 - қ оң ыр 7 - ашық сұ р
8 - қ ара сұ р 9 - ашық кө к 10 - ашық жасыл 11- ашық cyan
12 - ашық қ ызыл 13 - ашық magenta 14 - сары 15 - ақ

setcolor( тү с ) жә не setbkcolor( тү с ) процедуралары суреттің жә не фонның ағ ымдағ ы тү сін орнатады. Ү нсіз бойынша қ ара фон жә не суреттің ақ тү сі орнатылады. Тө менде қ арапайым геометриялық примитивтерді қ ұ ру ү шін қ олданылатын Graph модульдің негізгі процедуралары келтірілген:

putpixel(x, y, c) координаталары(х, у) тү сі с нү ктені қ ұ ру

selinestyle(a, b, t) сызық тардың стилін, ү лгісін жә не қ алындығ ын орнату, а – сызық тың стилі; b - «ү лгі» - егер а=4 болса онда мә ні 4, басқ а жағ дайларда b=0; t - толщина сызық тың қ алындығ ы – мә ні 1 болса (қ алыпты қ алындық) немесе 3 (қ алын сызық).

line(xl, yl, х2, у2) екінү ктені кесіндімен қ осу

rectangle(xl, y1, x2, y2) диагоналінің шеттері берілген жә не қ абырғ алары координат ө стеріне параллель болатын тік бұ рышты қ ұ ру

circle(x, y, r) орталығ ы (х, у) жә не радиусы r болатын шең берді қ ұ ру

arc(x, y, a, b, r) шең бердің доғ асын қ ұ ру: а, b - бастапқ ы жә не соң ғ ы бұ рыш (градус)

ellipse(x, y, a, b, rx, ry) эллипстік доғ аны қ ұ ру: rx, rу – эллипстің жартылай ө сьтері

setfillstyle(t, c) бояу стилін жә не оның тү сін орнату; t – 0.. 12 аралық тағ ы мә ндерді қ абылдайды, ә детте t = 1 - фигураны ағ ымдағ ы тү спен толтыру

fillellipsc(x, y, rx, ry) суреттің тү сін пайдалана отырып, іші боялғ ан эллипс қ ұ ру

floodfill(x, y, cg) шекарасына дейін фигураны cg тү спен бояу; (x, y) - фигураның ішкі нү ктесі

pieslice(x, y, a, b, r) дө ң гелектің секторын қ ұ ру жә не бояу

sector(x, y, a, b, rx, ry) эллипстік секторын қ ұ ру жә не бояу

settextstyle(f, n, d) мә тін символының шрифтін, шығ ару бағ ытын жә не ө лшемін анық тайды, f – шрифт (f = 0 болғ анда стандартты нү ктелі шрифт), n - шығ ару бағ ыты (0- горизонталь; 1 - вертикаль), d – символ ө лшемі (1.. 10 аралығ ындағ ы мә ндер. Егер d = 1 жә не f = 0 болса, онда ә р символ 8*8 нү ктелерден тұ ратын квадратта орналасады, d > 1 болса квадрат қ абырғ асы d-ғ а кө бейтіледі)

outtextxy(x, y, st) (х, у) нү ктеден бастап, st жолды шығ ару

Outtext(st) нұ сқ ағ ыштың ағ ымдағ ы орнынан бастап жолды шығ ару.

Мә тінді графикалық экранғ а шығ ару ү шін алдымен settextslyle(f, n, d) процедурасы орындалады. Одан кейін outtextxy(x, y, st) процедура арқ ылы st жол (х, у) нү ктеден бастап экранғ а шығ арылады. Мысалы:

settextstyle(0, 0, 2); outtextxy(100, 200, 'горизонталь жол');

outtextxy(100, 230, 'ө лшемі екі есе ү лкейтілген');

Келесі мысалдарда:

· Р32 программаретімен жанатын 400 «жұ лдыз» жұ лдызды аспан жә не толық сары айды суреттейді;

· Р33 программа қ арапайым геометриялық образдарды пайдаланып, муарлы ө рнек бейнесін салады, ол айырыласатын кесінділердің екі топтарының қ иылысуы арқ ылы пайда болады. Ө рнектің сапасы мен бейнесі негізінде ү ш параметрлерге тә уелді: kl, k2 – кесінділер арасындағ ы сол жақ жә не оң жақ арақ ашық тық тары; h – бү кіл топтың тө мен (жоғ ары) жылжуы. Функциялардың графиктерін қ ұ ру – техникалық есептерді шешуге арналғ ан программалардың кө бісінің айырылмас бө лігі болып табылады.

· Р34 программада [а, b] кесіндіде y=x2sin(1/x) функцияның графигін қ ұ ру мысалы келтірілген. Графиктің нү ктелер саны (параметр m) еркін тү рде беріледі (х = 0 нү ктесі алынып тасталады, себебі ол нү ктеде функция анық талмағ ан). Сонымен қ атар, программада сә йкесінше X жә не Y ө стері бойынша масштабтарды білдіретін t1=(x1-x0)/(b-a) жә не t2=(y1-y0)/(2m) шамалар анық талады. Қ арастырылатын функцияның графигі [а, b] жә не [-0.1, 0.1] екі кесінділерде бейнеленген. Басқ а функцияның графигін қ ұ ру ү шін функцияның (function f) сипатталауныда оның аналитикалық тү рін беру жеткілікті.

Қ озғ алатын бейнелерді келесі жоспар бойынша қ ұ ру оң ай:

· экранның қ ажетті жерінде фрагментті салу;

· оны фонның тү сімен суреттеп немесе cleardevice процедураны пайдаланып фрагментті ө шіру;

· экранның басқ а жерінде фрагментті қ айта салу.

Мұ ндай тә сіл Р35 программада жү зеге асырылғ ан, радиустары 5 пиксель тү рлі тү сті екі шарик бірдей жылдамдық пен bar процедура арқ ылы қ ұ рылғ ан жазыл тікбұ рыштың ішінде қ озғ алады. blou процедурасы шарик орталығ ының ә р ө сь бойынша тікбұ рыштың қ абырғ аларынан жылжуын ө лшейді жә не егер ол жылжу циклдың келесі қ адамында радиустан кіші болып қ алса серпінді шардың дуалғ а соқ тығ ысуын модельдеп қ озғ алыс бағ ытын ө згертеді. Сонымен қ атар, программада олардың қ озғ алу барысында шариктердің бір біріне тиіп кету жағ дайы да қ арастырылғ ан. Ол мә селе оң ай шешіледі: ә р шарик ө з қ озғ алыс бағ ытын қ арама-қ арсы бағ ытқ а ауыстырады.

Сонымен, қ орындылайтын болсақ. Паскаль программасында графикамен жұ мыс жасау ү шін ол іске қ осылатын папкада egavga.bgi файлы болуы тиіс. Ол графикалық драйвер болып табылады.

Сонымен қ атар, графикалық шығ аруды қ амтығ ан программаны компиляциялау барысында graph.tpu модульге қ ол жетерлік болуы тиіс, ол графикалық объекттерді суреттеуге арналғ ан ішкі программаларды қ амтиды. graph.tpu библиотекасы программаның сипаттау бө лімінде uses директивасы арқ ылы стандартты тә сілмен қ осылады:

uses graph;

Кез келген пикселді кез келген тү спен жарық татуғ а болады. Ә р пикселдің координаталары бү тін сандар парасымен анық талады:

· x координата – жолдағ ы пикселдің нө мірі. Нө мірлеу 0-ден бастап, сол жақ тан оң жақ қ а қ арай орындалады;

· y координата – пикселдер жолының нө мірі. Нө мірлеу 0-ден бастап жоғ арыдан тө мен қ арай орындалады.

Сонымен, экранның сол жақ тағ ы жоғ арғ ы бұ рышының координаталары (0, 0). Экран бетінде жарық танатын кез келген объект жеке пикселдердің жиынтығ ы болып табылады.

Графикалық режимді initgraph процедурасына сілтеу арқ ылы жү зеге асырылады:

initgraph(var gd: integer, var gm: integer, pt: string);

Бү тінсанды gd жә не gm айнымалылар графикалық драйвердің типін жә не оның жұ мыс жасау режимін береді, жолдық айнымалы pt - *.bgi файлғ а жол кө рсетеді. Мысалы, шешу қ абілеті 6403480 пиксел жә не 16 тү сті сү йемелдейтін Паскаль ү шін негізгі VGA видеорежимін таң дағ ан кезде келесі кодты пайдалануғ а болады:

uses graph;

var gd, gm, error: integer;

begin

gd: =VGA; {адаптер VGA}

gm: =VGAHi; {режим 640*480 пикс.*16 тү с}

initgraph(gd, gm, '');

error: =graphresult;

if error < > grOk then begin

write ('Графика қ атесі: ',

grapherrormsg(error));

readln; halt;

end;

line (0, 0, getmaxx, getmaxy);

readln; closegraph;

end.

egavga.bgi файлғ а жол бос болып кө рсетілгендіктен, ол ағ ымдағ ы бумада орналасқ ан деп жорамалдаймыз. Графикалық режимге ө ткеннен кейін line процедурасы экранның сол жақ тағ ы жоғ арғ ы бұ рышынан бастап оң жақ тағ ы тө менгі бұ рышына дейін сызық ты салады, одан кейін Enter басылғ анда, графикалық режим жабылады да программадан шығ амыз.

Максималды мү мкін болатын режимді автоматты тү рде таң дау ү шін gd айнымалысына detect мә нін меншіктеу керек, бұ л кезде егер Турбо Паскаль орналасқ ан ағ ымдағ ы каталогта *.bgi файлы бар болса, онда gm жә не pt айнымалылары анық талмайды. мысалы:

uses graph; var gd, gm: integer;

begin

gd: =detect; initgraph(gd, gm, '');...

Келесі мысалда экранда " сызық ты" объектпен (терезелер мен қ абаттар саны ауыспалы болатын ү й) қ атар ол ү шін декарттық координаттардан полярлы координаттарғ а қ айта есептеу қ ажет болатын " радиалды" (сә улелі кү н) объектіні суреттейміз. Декарттық координаттардан полярлы координаттарғ а аудару принципін тү сіндіретін схема 14.1 суретте келтірілген.

Сурет 14.1 - Декарттық координаттардан полярлы координаттарғ а қ айта есептеу

program SunHouse;

uses graph, crt;

var Driver, Mode: integer;

i, j, u, N, K, x2, y2: integer;

rad: real; sunx, suny: integer;

begin

{Енгізу дұ рыстығ ын тексермейміз}

writeln ('Неше қ абат? '); read (N);

writeln ('Ә р қ абатта қ анша терезе? ');

read (K);

Driver: = VGA; Mode: =VGAHi;

initgraph(Driver, Mode, '');

{Домик}

setcolor (15);

rectangle (20, getmaxy-20-70*n,

20+k*50+(k+1)*20, getmaxy-20);

{Шатыр}

moveto (20, getmaxy-20-70*n);

lineto(10, getmaxy-20-70*n);

lineto (20, getmaxy-40-70*n);

lineto (20+k*50+(k+1)*20, getmaxy-40-70*n);

lineto (30+k*50+(k+1)*20, getmaxy-20-70*n);

lineto (20+k*50+(k+1)*20, getmaxy-20-70*n);

{Қ абаттар арасындағ ы сызық тар}

for i: =1 To N Do

line (20, getmaxy-20-70*i,

20+k*50+(k+1)*20, getmaxy-20-70*i);

setfillstyle (solidfill, YELLOW);

{Ә р қ абаттағ ы терезелер}

for i: =1 To N Do {Қ абаттар бойынша цикл}

for j: =1 To K Do begin {Терезелер бойынша цикл}

bar(20+(j-1)*70+20, getmaxy-20-(i-1)*70-

60, 20+(j-1)*70+70, getmaxy-20-(i-1)*70-10);

end;

sunx: =getmaxx-50; suny: =50;

{Кү ннің центрі – экран бетіндегі координаталар}

FillEllipse (sunx, suny, 30, 30);

{Кү ннің пішінін суреттейміз}

setcolor (YELLOW);

{Сә улелерді суреттейміз}

u: =0;

while u< =360 Do begin

{ u бұ рышын 0 ден 360 градусқ а дейін ауыстырамыз}

rad: =u*pi/180;

{ sin, cos функциялары ү шін радиандарғ а аудару}

x2: =round(sunx+50*cos(rad));

y2: =round(suny+50*sin(rad));

{ полярлы координаттардан декартты координаттарғ а аудару}

line (sunx, suny, x2, y2);

u: =u+12; {бұ рыш бойынша қ адам = 12 градус}

end;

repeat until keypressed;

closegraph;

end.

Лекция


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.024 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал