Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Тілдің графикалық мүмкіндіктерін пайдалану
Компьютердің мониторы мә тіндік (горизонталь бойынша 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 аралық тағ ы нө мір арқ ылы беріледі:
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. Лекция
|