Kovács Emőd
Fejezetek a számítógépi grafikából
1.
ELŐSZÓ ......................................................................................................................... 4
2.
GRAFIKUS HARDVER ÉS SZOFTVER ................................................................... 6 2.1 BEVITELI ESZKÖZÖK ...................................................................................................... 6 2.2 KIVITELI ESZKÖZÖK ....................................................................................................... 7 2.2.1 Hardcopy perifériák................................................................................................ 7 2.2.1.1 Asztali és hengeres rajzgép ............................................................................. 7 2.2.1.2 Nyomtatók ....................................................................................................... 8 2.2.2 Megjelenítők, monitorok........................................................................................ 9 2.2.3 Vezérlő kártyák. ................................................................................................... 12 2.2.4 Különböző BGI driver-ek beillesztése Pascal programunkba ............................. 14 2.3 GRAFIKUS SZOFTVER ................................................................................................... 16
3.
A SZOFTVEREK HORDOZHATÓSÁGA ÉS A GRAFIKUS SZABVÁNYOK:. 20
4.
GRAFIKUS KÉPEK KÓDOLÁSA, TÁROLÁSA ÉS HASZNÁLATA ................. 23 4.1 BEVEZETÉS .................................................................................................................. 23 4.2 KÓDOLÁSI ELJÁRÁSOK ................................................................................................. 24 4.2.1 Huffman kód ........................................................................................................ 24 4.2.2 RLE algoritmus (Run-length encoding)............................................................... 25 4.2.3 LZW algoritmus (Lempel-Ziv-Welch)................................................................. 26 4.2.4 Hierarchikus megközelítés ................................................................................... 28 4.2.5 Aritmetikai tömörítés ........................................................................................... 29 4.2.6 Adatvesztéses tömörítés ....................................................................................... 29 4.3 GRAFIKUS KÉPFORMÁTUMOK....................................................................................... 30 4.3.1 Állóképek ............................................................................................................. 30 4.3.2 Mozgókép formátumok ........................................................................................ 32 4.4 VEKTOR- ÉS RASZTERGRAFIKA ÖSSZEHASONLÍTÁSA .................................................... 34 4.4.1 Raszteres grafika .................................................................................................. 34 4.4.2 Vektorgrafika ....................................................................................................... 35 4.5 GRAFIKUS KÉPEK A WINWORD SZÖVEGSZERKESZTŐBEN ÉS AZ OLE TECHNIKA....... 36 4.5.1 Képek beágyazása (Embedding) és csatolása (Linking) ...................................... 37 4.5.1.1 Meglevő állomány csatolása a dokumentumhoz:.......................................... 37 4.5.1.2 Meglevő állomány beágyazása a dokumentumba: ........................................ 38 4.5.1.3 Még nem létező objektum újként való beágyazása a dokumentumba: ......... 38 4.5.1.4 Beágyazott objektum kapcsolttá alakítása:.................................................... 38 4.5.1.5 Kapcsolt objektum beágyazottá alakítása:..................................................... 38 4.5.1.6 OLE technika hátrányai ................................................................................. 38
5.
NÉHÁNY ALAPVETŐ RASZTERES ALGORITMUS .......................................... 39 5.1 WINDOW-VIEWPORT TRANSZFORMÁCIÓK .................................................................... 41 5.2 UNIFORM ESZKÖZ TRANSZFORMÁCIÓ ........................................................................... 43 5.3 SZAKASZ RAJZOLÁSA ................................................................................................... 45 5.3.1 Egyszerű növekményes módszer ......................................................................... 45 5.3.2 Bresenham-algoritmus ......................................................................................... 46 5.4 KÖR ÉS ELLIPSZIS RAJZOLÁSA ...................................................................................... 51 5.4.1 Origó körüli forgatás: ........................................................................................... 54 2
5.4.2 6.
A midpoint (középonti) algoritmus ...................................................................... 56
REKURZÍV GÖRBÉK ÉS A TEKNŐC GRAFIKA................................................ 59 6.1 REKURZIÓ:................................................................................................................... 59 6.2 A REKURZÍV GÖRBÉK: .................................................................................................. 59 6.2.1 Fraktálok: ............................................................................................................. 60 6.2.2 Hilbert görbe: ....................................................................................................... 63
7.
IRODALOM ................................................................................................................. 65
3
Fejezetek a számítógépi grafikából
1. Előszó A Eszterházy Károly Tanárképző Főiskola Számítástechnika Tanszékén 1989-óta folyik “Számítástechnika tanár” (főiskolai végzettség) szakképzés. A tanszék a MKM engedélyével alapította meg a szakot. Később a többi főiskola is szakindítási kérelemmel élt a már létező szakra, így most már az országban a tanárképző főiskolák mindegyikén képeznek számítástechnika szakos általános iskolai tanárokat. A képzési célnak, és a képzési követelményrendszernek megfelelően alakítottuk ki a kredit rendszerben a tanegységlistánkat. A tanegységlista közlése nélkül a számítógépi grafika oktatásának ismertetésére szorítkozunk. Két tanegység tarozik a számítógépi grafika oktatási területéhez. Elemezzük ki részletesen ezen tantárgyak célját és tartalmát. Természetesen a tantárgyak tartalmának kialakításánál figyelembe vettük a képzési követelményrendszert, valamint a bel- és külföldi tapasztalatokat. Grafikus és képi információk kezelése A tantárgy célja: a komputergrafikának, ennek az igen fiatal diszciplínának a megismerése, a grafikus hardver és szoftver eszközök tanulmányozása és használata. A tantárgy tartalma: − A számítógépi grafika tárgya. Bevezetés a grafikus adatok feldolgozásába. − A számítógépi grafika hardvere (Be és kiviteli eszközök: monitorok, digitalizálók, rajzgépek fajtái és működési elvük, − Grafikus kártyák (Hercules, VGA, SVGA, VESA szabvány). − Turbo Pascal grafika (áttekintés). − Grafikus képek kódolása, tárolása, használata (Huffmann kód, LZW kód; BMP, PCX, GIF, JPEG, WMF, TIFF, AVI, MPEG stb. formátumok.). − Alapvető rajzoló eljárások. Szakasz rajzolása és lehatárolása . Kör és körív rajzolása. Gráf és ív rajzolása. − Anti-aliasing (szépséghibák kijavítása), elvesző információk, motion-blur. − Ábraszerkesztő használata, grafika a szövegszerkesztő programokban. − Rekurzív görbék megvalósítása Logo vagy Fractint programmal. Grafikus rendszerek A tantárgy célja: a komputer grafikának haladó szintű elsajátítása, és annak megismertetése, hogy a geometria hogyan tud ezen a tudományágon keresztül bekapcsolódni a termelésbe. A tantárgy tartalma: − Homogén koordináták, koordináta transzformációk, ponttranszformációk. − Transzformációk a síkban (2D) és térben (3D): egybevágósági, hasonlósági, affin és projektív transzformációk. − Tér leképezése síkra: ortogonális axonometria, klinogonális axonometria, perspektíva és centrális projekció. − Görbék interpolációja: Lagrange interpoláció és Hermit interpoláció. − Görbék approximációja: Bézier görbék, B-spline-ok. − Másodrendű görbék és felületek. − Az y=f(x) és a z=f(x,y) függvények ábrázolása. − Görbék és felületek ábrázolása paraméteres egyenleteikkel. − Felületek approximációja: Bézier felületek, B-spline foltok. − Testmodellezés, poliéderek. − Láthatósági kérdések, algoritmusok: poliéderek láthatósága, tömör területek pásztává alakítása, scan-line algoritmus, depth-sort algoritmus, z-puffer algoritmus, területfelosztó algoritmus, Ray-tracing. − A grafikus nyelvek és szabványok (GKS, PHIGS,SRGP) A fenti tematikák megvalósításához próbálunk minden hasznosnak ítélt programot használni az oktatásban. Sajnos a hardver feltételeink behatárolják lehetőségeinket. Egyenlőre szinte csak PC kategóriájú számítógé-
4
Beviteli eszközök
pekkel rendelkezünk, de ezek száma és minősége kielégítőnek mondható. Nemzetközi és hazai kapcsolataink, valamint az Internet segítségével tanulmányozzuk más egyetemek és főiskolák tematikáit. Természetesen a fentebb megadott tematikák változhatnak, és változniuk is kell tartalmukban, hiszen a számítástechnika talán egyik legdinamikusabban fejlődő területe a komputergrafika. Bizonyára ezzel a bevezetővel sikerült áttekintést adnunk a főiskolán folyó oktatási munkánkról. Kollégáim, ismerőseim véleménye szerint az itt tanított ismeretek nagy része igen jól használható a közoktatásban. Ezen vélemények ösztönöztek arra, hogy elkészítsük ezt az írásos anyagot megpróbálva összegyűjteni olyan fejezeteket a számítógépi grafika területéről, amelyek hasznosan forgathatóak a közoktatásban is. Munkánkat korántsem tekintjük befejezetnek. A közeljövőben szeretnénk még néhány fejezetet elkészíteni, hiszen javarészt csak a Grafikus és képi információk kezelése tanegység témaköreit tárgyaltuk. A Grafikus rendszerek témakörei közül is számtalan lehet érdekes a közoktatásban, amelyek indokolttá teszik munkánk folytatását. A szövegben nem hivatkoztunk a szakirodalomra, de a függelékben megtalálhatóak a kapcsolódó magyar és idegen nyelvű könyvek és folyóiratok címei. Megpróbáltuk az összes általunk ismert és hasznosnak tartott Magyarországon beszerezhető könyveket is felsorolni. Véleményünk szerint ez a gyűjtemény sok segítséget ad a szakterület iránt érdeklődő olvasók számára. Eger, 1997. március
a szerző Kovács Emőd
5
Fejezetek a számítógépi grafikából
2. Grafikus hardver és szoftver A számítógépi grafika egyik legismertebb területe a hardver és szoftver eszközök használata. A felhasználók, oktatók és diákok többsége rendelkezik ismeretekkel ezekről az eszközökről. Minden iskolában most már a NAT előírása szerint is tanítani kell hardver ismereteket. Ezeken az órákon elhangzott tananyag nagy része a témakörünkbe bele tartozik, ezért is tárgyaljuk a számunkra fontos eszközöket, de nem azonos alapossággal. Ezt azért tesszük így, mert egyrészt nem akarjuk untatni az olvasót, másrészt a már említett előismeretekre alapozunk. 2.1 Beviteli eszközök Két alapvető grafikus beviteli művelet van. Egy adott pozíció megkeresése és egy már meglevő grafikus objektum azonosítása, kiválasztása további feldolgozás céljából. A beviteli eszközöket nem ismertetjük részletesen, feltételezve a könnyen elsajátzítható előismerteket, mivel a téma kifejtése számtalan könyvben megtalálható. • Billentyűzet: A komputer grafikai alkalmazásokban is szerepet kaptak a funkcióbillentyűk és a különböző billentyűkombinációk. Sajnos a vágólap használatán kívül ezek nem szabványosak. • Digitalizáló tábla, grafikus tábla: Főleg vonalrajzok térképek digitalizálására használt eszközök. A két eszköz között különbség csak a méretekben van. A digitalizáló pl. 150x200 cm addig a grafikus tábla mérete 20x20 cm-től 1x1 m-ig terjed. Az elsőt mérete miatt állványra szerelik, a másik asztalon is elhelyezhető. Az elsőn egy kocsi a pozicionáló eszköz, a másikon lehet pálca, fényceruza, korong szálkereszttel vagy akár az egér is használható digitalizáló eszközként.
1. ábra. Digitalizálók • Joystick, egér és trackball: közös feladatuk a kurzor mozgatása a képernyőn. Az egerek típusai: ⎯ Mechanikus egerek ⎯ Optomechanikus ⎯ Optikai egerek ⎯ Rádiófrekvenciás egerek
2. ábra. A mechanikus egér szerkezete
6
Kiviteli eszközök
• Fényceruza és az emberi ujj: A fényceruza általában fotóoptikai cellát tartalmaz és a terminálhoz csatlakozva a képernyőn tudunk vele pozícionálni. Az emberi ujj szintén szolgálhat beviteli eszközként a speciális fóliával ellátott úgynevezett érintést érzékelő képernyőknél (touch-screen). • GlidePoint: a Cirque Corporation (USA) által kifejlesztett eszköz, amely az egéralátéthez hasonlít legjobban, azonban egér nélkül működik. Ha össze kellene hasonlítani valamivel, leginkább egy kisméretű (49x66 milliméter) az előbb említetett touch-screen monitor felületéhez lehetne viszonyítani. A billentyűzet mellé helyezve az eddigieknél jóval egyszerűbben kezelhető, elődeihez képest tartósabban és pontosabban pozícionálható vele a kurzor. Az alapjaiban új logikai felépítésű eszköznél ugyanis a kurzor mozgását ujjunkkal irányíthatjuk, mégpedig igen nagy (a beállításoktól függően maximum 1000 milliméter/secundum) sebességgel. Az érintkező "egéralátét" három rétegből áll : az alsó és középső rétegben helyezkedik el a vízszintes, illetve a függőleges elmozdulásokat érzékelő elektrofólia, amelyre egy védőfilm kerül, s ezen csúsztatjuk az ujjunkat. Az elektrofóliák jeleit a szerkezetbe épített processzor dolgozza fel, és küldi a számítógépbe. • Optikai olvasók (Image Scanners): Ezek az eszközök végig pásztáznak egy papírlapot és annak felületét képpontokra bontják. A képpontok értéke az alkalmazott bitek számától függően lehet 0-1, vagy egy szürkeskála (grey scale), vagy egy színskála értékei. A szkennerre jellemző a lapméret, a felbontás (dpi), valamint a színek ill. a szürkeárnyalatok számának fölismerése. Léteznek kézi- és lapszkennerek, valamint vonalkód olvasók. A bevitt kép részleteinek felismerése és azonosítása jelentős szoftver probléma. Ebbe a témakörbe tartozik, a karakterfelismerés, az aláírás felismerés, a számjegyek azonosítása, valamint a vonalkód (barcode) bevitele.
3. ábra. Szkennerek 2.2 Kiviteli eszközök 2.2.1 Hardcopy perifériák Ezek a berendezések a képeket automatikusan állítják elő tartós alakban papíron, filmen, mikrofilmen, fólián, pausz papíron vagy hasonló anyagon. A mechanikus rajzolócsúccsal rendelkező hardcopy perifériákat rajzgépeknek nevezzük. 2.2.1.1 Asztali és hengeres rajzgép Az asztali vagy síklapos rajzgépeknél a síkban fekvő papíron egy rajzoló csúccsal ellátott kocsi fut. A hengeres vagy dob rajzgépek elve ugyanaz, mint az asztali, csak az egyik irányban a papír tetszőlegesen hosszú lehet. A rajzgépek elsősorban mérnöki munkáknál (nagyméretű rajzok A/3, A/2, A/1, A/0) használhatóak ki előnyösen. Aki ilyen vásárlására szánja magát a következő paraméterek alapján fogalmazhatja meg a kívánalmait: ∗ Rajzterület mérete (Csupán síkplotternél. A dobplottereknél a rajzterület szélessége, és a tekercspapír hossza a mérvadó.)
7
Fejezetek a számítógépi grafikából
∗ Felbontóképesség (A tintasugaras nyomtatófejjel rendelkező korszerű típusoknál elérheti a 720 dpi-t is.) ∗ Vonalvastagság (Csupán a műszaki rajzeszközzel rajzoló – közismertebb nevén csőtoll – plottereknél. Általában 0.1 mm és 2 mm közé esik. Ma már a tollas rajzgépeket szinte teljesen kiszorítják a tintasugaras társaik.) ∗ Rajzolási sebesség (Ez határozza meg a rajz várható elkészülésének idejét. Mértékegysége a vonalak húzási sebességéből adódik : 300...1500 mm/s.) ∗ Ismétlési pontosság (Ugyanazon ábrán vagy annak részletén újból végighaladva mennyi eltérésre kell számítani. Hasonló tulajdonság a visszaállási pontosság is. Jobb típusoknál néhány századmilliméteres érték.)
• 4. ábra. Hengeres rajzgép A felbontóképesség fogalmát mindenképpen pontosítanunk kell. Két fogalom tartozik ide, a címezhetőség (addressability) és a pont méret (dot size). • Pont méret: az output eszköz egy pontjának a mérete, az átmérője. • Címezhetőség: Az egy inch-en elhelyezhető nem feltétlenül elkülönülő pontok száma. Mértékegysége: DPI= Dots per inch . A címezhetőség értéke pontosan a reciproka a két szomszédos kör alakú pont középpontjai közötti távolságának (Interdot distance). Általában akkor megfelelő a pont méret, ha valamivel nagyobb mint az interdot size. A fentiek értelmében a felbontás valójában összefüggésben van a pont mérettel és általában kisebb, mint a címezhetőség. Ezért úgy vizsgálhatjuk a felbontást, hogy függőleges vonalakat húzunk a lehető legközelebb egymáshoz, hogy még különbözőnek látszanak. Pl. ha 40 fekete vonalat elválaszt 40 fehér 1 inch-en, akkor azt mondjuk, hogy a felbontás 80 vonal per inch.
2.2.1.2 Nyomtatók Ezt a témakört csak felsorolás szintjén ismertetjük, feltételezve a könnyen megszerezhető előismereteket, mivel a téma kifejtése számtalan könyvben megtalálható. Pontmátrix nyomtatók:
Lapnyomtatók:
Tűs vagy mátrix nyomtatók
Lézernyomató (Lézerxerografikus nyomtató)
Tintasugaras nyomtatók
Ionsugaras nyomtató
Hőnyomtató
A nyomtatók kiválasztásának szempontjai:
8
Kiviteli eszközök
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
Nyomtatási minőség , felbontás (300x300, 600x300, 600x600, 720x720 dpi, stb.) Üzemelési költségek (tintapatron , festékszalag, stb.) Speciális igények (fólia, InkJet vagy LeserJet papír, stb.) Leporellóra képes-e nyomtatni (toló, húzó traktor) Maximális nyomtatható méret (A/4, A/3, A/2, >A/2, egyéb méretek) Egyszerre nyomtatható példányszám (egy példány, több példány) Színes vagy fekete-fehér Nyomtatási sebesség (karakter/secundum, lap/perc) Nyomtatási leterheltség adott időszakra (napi, havi, éves példányszám) Karbantartási költségek Garanciális feltételek (szervizellátottság) Támogatás különféle szoftverekhez (driverek)
Belátható, hogy csupán szövegnyomtatással nem derülnek ki a nyomtatók hibái. Aki komolyabb mustrát akar tartani, az mindenféleképpen grafikai feladatokkal teszteljen. Legnehezebb nagyméretű középszürke foltot előállítani, mert ekkor minden hiba –mechanikai, festékezési, szoftverfüggetlen− azonnal láthatóvá válik. Teljesen fekete foltot tintasugaras készülékkel −átázás, bántó meghullámosodás nélkül− szinte lehetetlen jó minőségben előállítani. Kivételek ez alól az olyan típusok amelyek melegítéssel szárítják a papírt. A sokféle árnyalat igényli a legtöbbet a nyomtató részéről. A különböző fedettségű és méretű rendezett ponthalmazok nyomtatása, ami nagyobb felületű, átmenetes kép, vagy rajzelemek esetén elkerülhetetlen sávozottságot okoz.
5. ábra. Lapnyomtató
2.2.2 Megjelenítők, monitorok A megjelenítők alapvetően két csoportba sorolhatók: vannak saját fényűek (emissziós) és vannak amelyek valamely külső fényforrás fényét hasznosítják (nem emissziósak). Az elsőre példa a TV-nél is használt katódsugárcső (Cathode Ray Tube, CRT), a másodikra példa a folyadékkristályos megjelenítő (Liquid Crystal Display, LCD).
6. ábra. CRT megjelenítő 9
Fejezetek a számítógépi grafikából
Működési elvük alapján: • CRT: a katódsugár ágyú elektronsugarat állít elő, amely különböző maszkokon és eltérítőkön áthaladva jut el a foszforral bevont üveglapra. A gerjesztés miatt a foszfor rövid ideig világít. A folyamatos világítás eléréséhez a képernyőt újra és újra frissíteni kell. • Képtárolós képernyő: Szintén CRT elvű, de a kép közvetlenül a képernyőn tárolódik. A képernyőt egy állandó elektronnyaláb éri, amely biztosítja a már aktív foszforpontok továbbvilágítását. Sajnos ha módosítani akarjuk a kép egy részletétet, akkor az egész képet újra kell rajzolni, ezért interaktív munkára kevésbé alkalmas. • LCD: A képernyő valójában több rétegből áll. Rétegek között található egy folyadékkristályos felület, amelynek kristályai megváltoztatják állapotukat (ugyanabba az irányba mutatnak) a hozzá kapcsolódó elektródák feszültségváltozásának hatására. A megváltozott állapotban másképpen verik vissza a fényt mint korábban. • Aktív mátrixos LCD panelek: Jelenleg költséges, de igen népszerű megoldás a hordozható számítógépeken. Méltán népszerű, mert továbbra is az LCD-hez hasonlóan hordozható lapos, de már saját fényű színes megjelenítő. A kijelző rácspontjaiban tranzisztorok találhatók, amelyek segítségével szabályozható a kristályok állapotváltozása. A tranzisztorok memóriaként is szolgálnak, megőrizve az állapotváltozást, így lehetővé téve a cellának az állandó működést, ami fényesebbé teszi, mintha állandóan frissíteni kellene. A színeket a kristályok befesthetősége biztosítja. • Plazma képernyő: A képernyő két üveglapja közötti teret nemesgázzal töltik ki. A két üveglap együttesen rácsszerkezetet alkot, s ha feszültség kerül egy rácspontra akkor ott a gáz világítani kezd. Úgy képzelhetjük el mintha kicsiny neon lámpák halmaza lenne a képernyő. A plazma képernyő előnyei: lapos, nagyméret és nagy felbontás lehetősége, masszív felépítés. Hátránya a magas előállítási költség és egyenlőre csak monochrom változata ismert. Előnyei miatt főleg a hadseregben használják. • Elektro-lumineszcens képernyő (EL): A plazma képernyőhöz hasonló felépítésű, a két üveglap között foszforeszkáló anyag található, pl. cinkszulfid magnéziummal elegyítve. Működésük hasonló az aktívmátrixos LCD panelekhez, csak nagyobb az energiaszükségletük, de sokkal fényesebbek, mint LCD társaik. Előnyös tulajdonságaik miatt elterjedtek a hordozható számítógépeknél. A megfelelő monitor kiválasztására már a grafikus kártya vásárlásakor figyelmet kell fordítani. Amíg a kártyán megtakaríthatunk néhány forintot, addig a monitor kiválasztásánál legyünk körültekintőek. Mindenekelőtt a kártya által biztosított felbontást tudja produkálni. Vigyázzunk tehát, mert az 1024x768 képpontos SVGA felbontást csak a nagyobb (legalább 15") monitorokkal lehet elfogadhatóan megjeleníteni. Könnyen kiszámolható, hogy hány pontot képes a monitor megjeleníteni fizikailag egymástól elkülönítve. Ha ismerjük a monitor képpontjainak távolságát (lyukmaszktávolság: rendszerint 0.26, 0.28 és 0.31 milliméter között változik).
10
Kiviteli eszközök
7. ábra. A Mitsubishi cég plazma monitorja
Megjelenítő eszközök
CRT elvű
Paneles megjelenítő
Monochrom
TV célú Pontméret≥0,6mm
Színes
Nem emissziós LCD
Professzionális célú Pontméret≤0,6mm
Delta lyukmaszk
Résmaszkkal
Emissziós
In-Line
Lyukmaszkkal
CRT1
Plazma
EL
Aktív LCD
Világító diódás (LED)
Rácsmaszkkal (Sony Trinitron)
8. ábra. A megjelenítők csoportosítása 1 Legalább ennyire fontos, hogy a monitor képes legyen a grafikus kártya képismétlési frekvenciájának leképezésére. A legjobbak az úgynevezett multiscan monitorok, amelyek felismerik a grafikus kártya frekvenciáját és automatikusan ehhez igazodnak. Ahhoz, hogy a szemünk számára villódzás mentes képet kapjunk, a monitornak másodpercenként legalább hatvanszor újra kell rajzolnia a képet. Tehát legalább 60 Hz a képismétlési frekvencia. A horizontális frekvencia vagy vízszintes sáv szélesség azon sorok száma amit a monitor 1 másodperc alatt meg tud jeleníteni. Ez közelítőleg a frissítési sebesség és a sorok számának a szorzata. Nézzük pl. a következő értékeket: • 640x480-as VGA felbontás: Frissítési frekvencia 60 Hz 72 Hz 75 Hz
Horizontális frekvencia 480∗60≈28,8 kHz 480∗72≈34,56 kHz 480∗75≈36 kHz
• 800x600-as SVGA felbontás: Frissítési frekvencia 56 Hz 60 Hz 75 Hz
1
Horizontális frekvencia 600∗56≈33,6 kHz 600∗60≈36 kHz 600∗75≈45 kHz
Természetesen ide azért soroltuk a CRT-t mert szintén emissziós, de nem lapos megjelenítő
11
Fejezetek a számítógépi grafikából
• 1024x768-as SVGA felbontás: Frissítési frekvencia 86 Hz (Interlaced2) 60 Hz 75 Hz
Horizontális frekvencia 768∗43≈33 kHz 768∗60≈46,1 kHz 768∗75≈57,6 kHz
A táblázatokból kitűnik, hogy ha egy 14” képátlójú monitor műszaki paraméterei között Non Interlaced jelzés szerepel, de ha a horizontális frekvencia tartománya csak 30-35 kHz, akkor bizony csak 800x600-as SVGA felbontásban 56 Hz képfrissítési frekvencián tudja produkálni a Non Interlaced módot. Az újabb 14”es monitorok horizontális frekvencia tartománya már legalább 30-50 kHz között van amely biztosítja a szemnek még elfogadható 75 Hz-es 800x600-as SVGA üzemmódot. A monitorok gyártói −szemben a televíziót gyártókkal− a monitor kávájába épített katódsugárcső (CRT) mérete szerint osztályozzák és sajnos forgalmazzák termékeiket. Ezt a képcsövet először be kell foglalni egy keretbe, és ez csökkenti a használható felületet. Ráadásul a képernyő sarokpontjaiban történő pontos megjelenítést −éppen a technikai nehézségek miatt− nem szavatolják, annak ellenére, hogy a szabályozó gombokkal a képernyő teljes szélességéig nagyíthatjuk a képet. Ezért van az, hogy a felhasználó számára ténylegesen hasznosnak tekinthető terület még a kereten belüli területnél is jóval kisebb. A hasznos képernyő felületet még pontosabban úgy állapíthatjuk meg, ha bekapcsoljuk a monitort és megmérjük a képernyő bal felső és jobb alsó sarka közötti távolságot. Ha lehetséges, akkor a monitoron található beállító gombokkal állítgassunk a képen, mert ilyenkor olyan problémák is előtérbe kerülhetnek mint például a monitor csücskeiben elhomályosodó képpontok, stb. Hogy mennyire létező ez a probléma, arra álljon itt egy hír: a Kaliforniai Állami Ügyészi Hivatal vizsgálatot indított egy bejelentés nyomán, amely szerint a monitorok katódsugárcsövük mérete szerinti árusítása kimeríti a félrevezető reklám fogalmát. A monitorgyártók és a Video Electronics Standard Association (VESA) nevű szabványügyi szervezettel együtt egy olyan általános módszer kidolgozásán munkálkodnak, amellyel a hasznos képernyőméretet lehet mérni. Egy ideje a nagyobb cégek (IBM, NEC, SONY, SAMSUNG, MAG, DAEWOO) a termékeik kísérő dokumentációjában a tényleges képernyőméretet is publikálják. Igaz ezt már csak akkor látja meg a vevő, ha a dobozt kinyitja., de ez is csak olyan üzlet, mint minden másik. 2.2.3 Vezérlő kártyák. Miután már esett szó a megjelenítőkről, most legyen szó azok vezérlőiről. Az együttes tárgyalást az indokolja, hogy egyik összetevő sem képes önálló működésre, hiszen vezérlő nélkül a monitoron nem jelenik meg információ, monitor vagy egyéb megjelenítő eszköz nélkül pedig a vezérlő olyan mintha nem is lenne, mert funkcióját képtelen betölteni. A grafikus kártyák feladata, hogy megjelenítsék a szöveget vagy képet a monitoron. Bőséges kínálatból választhatunk annak függvényében, hogy milyen alkalmazásra kívánjuk használni. A következőkben összefoglaljuk, hogy a közoktatásban leggyakoribb IBM PC kompatíbilis számítógépekhez milyen típusú grafikus kártyák vannak. Ahhoz, hogy ezek közül választani tudjunk, bizonyos alapfogalmakkal tisztáznunk kell Ezek a következők: a maximális felbontás, a megjeleníthető színek száma, a képismétlési frekvencia és a sebesség. A megjelenítéséhez szükséges kártyán levő minimális memória az előzőekből számítható. Felbontás: A komputergrafikában használatos grafikus felbontásokra szorítkozunk, eltekintünk a szöveges felbontások tárgyalásától. Felbontás alatt a grafikus képernyő oszlopainak és sorainak számát értjük pl: 800x600-as érték 600 sort jelent és egy sorban 800 pixelt. Színek: A grafikák hatását nemcsak az eltérő felbontás határozza meg. Legalább ilyen fontos szerepet játszik az egyidejűleg ábrázolható színek száma is. A színek számát általában a tárolásra fordított bitek száma határozza meg, s ebből lehet kiszámolni a grafikus kártyán szükséges memória mennyiségét. A megjelenítendő 2
Interlaced: Váltott sorú üzemmód, első menetben a páratlan, második menetben a páros sorszámú sorokat frissíti a sugárnyaláb. 12
Kiviteli eszközök
pontok számát a sorok és oszlopok szorzatából határozzuk meg, majd ezt az értéket szorozzuk a színek számához szükséges bitek számával. Pl. 640x480x16 azt jelenti, hogy 640x480 = 307 200 pont, 16 színű üzemmód esetén: 307 200∗4bit = 153 600 byte memóriára van szükség a megjelenítésre. Mivel a használt memóriaméret 2-nek hatványa, ezért ehhez az üzemmódhoz legalább 256 kbyte-os VGA kártya szükséges. Előfordul, hogy nem színeket, hanem a szürke árnyalatait jeleníti meg a monitor egy adott színhez valamilyen árnyalatot hozzárendelve. Ilyen megjelenítők pl. a MonoVGA monitorok. Az SVGA kártyán szükséges memória mennyiségek byte-ban: Felbontás 320x200 640x480 800x600 1024x768
16 szín (4 bit) 64 000∗0.5=32 000 153 600 240 000 393 216
256 szín (8 bit) 64 000 307 200 480 000 786 432
65 536 szín (16 bit) 128 000 614 400 960 000 1 572 864
1 6777 216 szín (true color 24 bit) 192 000 921 600 1 440 000 2 359 296
Képernyő lapok száma: A programozás szempontjából fontos, hogy egyidejűleg hány db. képernyő lapot lehet használni. Természetesen a lapok száma a grafikus kártyán kívül az adott programnyelv grafikus interfészén is múlik. Különösen fontos ez animációk készítésénél. A látható lapon (Visual Page) valamilyen ábra van, a felhasználó azt látja. Közben az aktív lapon (Active Page) rajzolunk láthatatlanul, és csak a végeredmény tesszük láthatóvá, a lapok funkciójának felcserélésével. Turbo Pascalban (4.0, 5.0, 5.5, 6.0 vagy 7.0ban) az EGA vagy VGAMed (640x350) felbontásban két lapot használhatunk, ezzel szemben VGAHi (640x480) felbontásban csak egyet. Sebesség : A szebbnél-szebb komputergrafikák és animációk (a mostanában egyre nagyobb divatnak örvendő intrókról nem is beszélve) csak akkor okoznak nézőjének osztatlan örömet, ha a növekvő felbontással és színárnyalatszámmal szorosan összefüggő sebességcsökkenés nem következik be, vagy legalábbis a normális tűrőképesség határain belül marad. Így fordulhat elő, hogy a nagyfelbontású, sokszínű kép adattömege "térdre kényszeríti" az olcsóbb grafikus kártyákat. Még érzékelhetőbb ez a probléma akkor, amikor grafikákat kell ide-oda mozgatni a képernyőn. Erre is van azonban már megoldás. Az "intelligensnek" nevezett típusokon már külön gyors grafikus processzor gondoskodik a képfelépítés gyorsításáról, olyan módon, hogy a munka zömét átvállalja a számítógép központi processzorától. Amíg ugyanis az egyszerűbb (és egyben olcsóbb) kártyák a képalkotáshoz szükséges információkat készen kapják a központi processzortól, addig az utóbbiak már csak utasításokat kapnak, és a felhasználó más feladatokat adhat a számítógépe processzorának, mert a grafikus lapka tehermentesíti. Üzemmódok: Az eredeti IBM PC szabvány szerint a 256 kbyte-os videó memória címe A0000–BFFFF terjed. Azok a VGA kártyák amelyek kompatibilisek akarnak maradni, azok A0000–AFFFF memória területet használják a grafikus üzemmódokban és a B8000–BFFFF területet a szöveges üzemmódokban. Természetesen az SVGA kártyákat gyártók kialakítottak saját üzemmódokat is a nagyobb felbontások biztosítása érdekében. Pl. a megadott memória területet belapozzák, A modern SVGA kártyák rendelkeznek úgynevezett "linear framebuffer"-rel amely azt jelenti, hogy az egész SVGA memória terület (1 MB, 2 MB, 4 MB, vagy több) egyetlen folytonos memória területre van leképezve. A gyártók az IBM szabványai mellett kialakították saját VESA szabványukat, hogy egységesítsék a grafikus kártyák üzemmódjait. A VESA szabvány definiál olyan módbeállító és egyéb funkciókat, amelyekkel a normál VGABIOS-hoz hasonlóan az INT 10h megszakítással lehet kezelni az SVGA kártyákat. Accelerátor : A Windows első megjelenése után a hardver-előállítók rögtön megjelentek a piacon az úgynevezett windows-accelerátor kártyákkal, ami a minél gyorsabb képváltások kiszolgálására volt hivatott. Ebből már adódik a feladata, a képpont-tömbök és a grafikus kurzor mozgatása. Léteznek olyan típusok is, amelyek már vonalrajzolásra és sokszögek előállítására is képesek. Bit BT : Bit Block Transfer. A képernyő egyes részleteinek másolásához vagy mozgatásához fejlesztett eszköz. Elég csupán a terület befoglaló csúcspontjait megadni a mozgatáshoz. Így az operációs rendszernek nem kell az összes képpontot mozgatnia, csak a csúcspontokat, a másolási munkát a grafikus processzor végzi el. A művelet sebessége a nagyban függ a chip belső memóriaszervezésétől.
13
Fejezetek a számítógépi grafikából
Hardver (grafikus) kurzor : érdekes megoldás arra, hogyan lehet úgy mozgatni, hogy magát a kurzort ne kelljen a képmemóriába beírni. Ez különösen olyankor érdekes, ha a kurzor alatt kép látható. Ilyenkor nem a megszokott mentés és visszatöltés folyamata hajtódik végre, hanem a hardver (a kártyán levő chip) rákeveri az aktuális képre a kurzor alakját. Ezáltal nagyon megnőhet a grafikus felület gyorsasága, arról nem is szólva, hogy maga az operációs rendszer, vagy az alkalmazás más feladatot kaphat. RAMDAC (DAC) : a képernyő memóriában található digitális formában tárolt információkat alakítja analóg jellé. VESA DDC (VESA Display Data Channel) : segítségével már a monitor is küldhet adatokat a vezérlőkártya irányába, így például ha az operációs rendszer is támogatja (Windows 95) azonosíthatóak a monitor adatai: típusa, felbontóképessége, stb. Ha a kártyák piacán széttekintünk, csupán PCI-buszos termékeket találunk, nem véletlenül, hiszen a helyi sínes technológiát egyik legjobban kihasználó területét a video megjelenítők jelentik. Rengeteg neves gyártó kínálja termékeit (Video Seven, Orchid technologie, SPEA, Genoa, Hercules, Sigma Design, Eizo, Trident, Miro Magic, Ati, S3 és a Cirrus Logic és még hosszasan sorolható) bár még a hétköznapi felhasználók általában pénztárcájuk alapján döntenek. 2.2.4 Különböző BGI driver-ek beillesztése Pascal programunkba Nagyon gyakran gondolunk arra, hogy túl kellene már lépnünk a Turbo Pascal adta grafikus lehetőségeken. Ha IBM kompatíbilis számítógéppel rendelkezünk, akkor Turbo Pascal programjainkban az EGAVGA.BGI grafikus interfészt tudjuk használni. Ez a driver a standard VGA üzemmódokat biztosítja 16 színnel. Maga a Turbo Pascal viszont lehetőséget ad arra, hogy saját felhasználói BGI driver-eket installáljunk programjainkba. Ezeket nem a Borlad cég forgalmazza, hanem általában programozóktól lehet beszerezni őket. Mivel az SVGA és VESA üzemmódok nem szabványosak, ezért bizonyos grafikus kártyán nem, vagy csak korlátozottan működik a driverek használata. A legtöbb probléma az egér kezelésével van. Ezek után nézzünk meg egy programrészletet:
14
Kiviteli eszközök
... Var AutoDetect : pointer; GraphDrv, GraphMod, GrafHiba : Integer ; {$F+} Function Always : integer; Begin Always := 3;{VidMode;} { (*Az adott SVGA.BGI által támogatott üzemmódok *) Const VGA320x200 = 0; (* Standard VGA *) SVGA640x400 = 1; (* 640x400x256 Svga *) SVGA640x480 = 2; (* 640x480x256 Svga *) SVGA800x600 = 3; (* 800x600x256 Svga *) SVGA1024x768 = 4; (* 1024x768x256 Svga *) } End; {$F-} Begin AutoDetect := @Always; GraphDrv := InstallUserDriver('SVGA256',AutoDetect); GraphDrv := Detect; InitGraph(GraphDrv,GraphMod,''); GrafHiba := GraphResult ; If GrafHiba <> GrOK Then Begin WriteLn(GraphErrorMsg(GrafHiba)) ; ReadLn ; Halt ; End; Setcolor(White); {Rajzoló szín beállítása} Line(
...
{Grafikus programrész}
CloseGraph ; End.
15
Fejezetek a számítógépi grafikából
2.3 Grafikus szoftver A számítógépi grafika (Computer Graphics) természetesen képekkel foglalkozik. Feladata a grafikus adatok feldolgozása amely négy, nem teljesen elkülönülő főterületet ölel fel: • Generatív grafikus adatfeldolgozás: képek és grafikus adatok bevitele, képek előállítása, manipulálása és rajzolása leírások alapján. Síkbeli és térbeli objektumok modellezése. • Grafikus képek tárolása a számítógépen és adathordozókon kódolt formában. • Képfeldolgozás: képek javítása átalakítása a későbbi feldolgozás érdekében. • Mintafelismerés: Képekből meghatározott információk kiolvasása, a képből valamilyen információt, leírást nyerünk.
Képtárolás
Leírás vagy Input kép
Generatív adatfeldolgozás Mintafeldolgozás
Számítógépen megjelenő kép
Képfeldolgozás
9. ábra. A számítógépi grafika feladatai A számítógépi grafika önmagában csak a képekkel foglalkozik, de számtalan alkalmazási területe van a grafikus adatok feldolgozásának. A következő felsorolásban kísérletet teszünk arra, hogy a számítógépi grafika témakörébe tartozó alkalmazásokat csoportosítsuk. A csoportosításnál az volt a szempontunk, hogy az alkalmazások milyen feladatcsoportot ölelnek fel és a használt módszerekben milyen összefüggések találhatók. 1. Művészet és animáció (Art and Animation) A számítógépes művészet kétségtelenül a XX. század végének egyik legellentmondásosabb vívmánya, amely önmagától alakult ki és ez idáig még nem igazán elismert művészeti ág. A számítógépet már eddig is használták mint segédeszközt művészeti alkotások megtervezésében és létrehozásában. Gondoljunk csak pl. két világhírű művészünkre Victor Vasarely-re és Szász Endrére. Náluk a végeredmény már nem a számítógépen keletkezett, hanem konkrét kézzel fogható formában. De fölmerül a kérdés, hogy művészet-e síkban (2D) karaktereket, fontokat és háttereket, térben (3D) pedig modelleket, felületeket testeket megalkotni a számítógép monitorján? Gondoljunk a videó klippekre, ahol animációkat sőt néhány perces filmeket is láthatunk. A filmiparban, egy magára valamit is adó film nem készülhet el számítógép által készített trükkök nélkül. Walt Disney elkészítette a Toy’s story-t, ami teljes egészében számítógéppel rajzolt egész estét betöltő rajzfilm. Ebbe a témakörbe tartozik a reklámfilmek készítése is. Az egyre jobb és gyorsabb harver eszközök lehetőséget teremtenek olyan animációk, klippek és egyéb számítógépes alkotások létrehozására, amelynek csak az emberi képzelet szab határt. De azt senki sem gondolhatja, hogy csak eszköz kérdése az ilyen jellegű alkotás. Vajon ezek az alkotók csak a szakma művészei vagy valójában művészek a szó hagyományos értelmében? Animáció esetén a grafika szokásos feladatain kívül időbeli változásokat is rögzíteni kell egy forgatókönyvben (script), amely a kameraállásnak, a tárgyak helyzetétnek és a megvilágítási időnek változásait határozza meg az idő függvényében. 2. Számítógéppel segített tervezés és gyártás Ebbe a témakörbe tartozik: • Computer Aided Design (CAD): Automatizált szerkesztés, tervezés és vázlatkészítés. Pl. autók, épületek, munkadarabok és áramkörök tervezése, gépészeti tervrajzok kapcsolási rajzok készítése. • Computer Aided Manufactoring (CAM):Számítógéppel segített gyártás termelés, NC megmunkálásra való előkészítés stb. 16
Grafikus szoftver
• Computer Aided Engineering (CAE): Számítógéppel segített mérnöki műszaki tervezés. Ez a témakör rokon a CAD-del, de ide inkább a gyártási rendszerek tervezését értjük. A rengeteg CAD program közül a legismertebb az AutoCAD. 3. Bemutató és üzleti grafika (Presentation and Business Graphics) Ebbe a témakörbe értjük különböző hisztogramokat, és diagramokat előállító táblázatkezelőket, a bemutató grafikát és slideshow-t készítő programokat (pl. Excel és PowerPoint). Egy jó grafikon önmagáért beszél, olyan összefüggéseket szemléltethet, amelyeknek az írásbeli magyarázata igen hosszadalmas lenne. Gondoljunk csak az üzleti kimutatásokra, statisztikai elemzésekre és a politikai választási csatározásokra. 4. Tudományos és műszaki szemléltetés és szimuláció (Scientific Visualization and Simulation) Ehhez a témakörhöz tartozik fogalmak, jelenségek, törvényszerűségek, folyamatok szemléltetése, vizuális megjelenítése és szimulációja: • költségesen vizsgálható dolgok szemléltetése: autók futása, katonai alkalmazások, környezet szimulációja, űrhajós és pilóta képzés. • közvetlenül nem vizsgálható dolgok szemléltetése: bolygók és galaxisok mozgása, mikroszkópikus dolgok vizsgálata. • műholdak pályája. • fraktálok és mandelbrot halmazok előállítása és felhasználásukkal mesterséges alakzatok teremtése. 5. Képelemzés és feldolgozás (Image analysis and processing) Raszteres képek feldolgozásával foglalkozik. Ide értjük a képek részleteinek felismerését, elemzését és módosítását is: • ujj- vagy tenyérlenyomat felismerő programok • orvosi képfeldolgozás: computer tomográf (CT), MRI, ultrahang, digitális radiológia, nukleáris medicina • karakter felismerő programok 6. Grafikus kezelő felületek (Graphics User Interfaces, GUI) Az ember és a számítógép közötti interakciót elősegítő programok rendszere. Pl. Microsoft Windows, OpenWin. Ezek a felületek a grafikát nem a program tárgyaként használják, hanem a minél egyszerűbb és hatásosabb interaktív kommunikáció érdekében. Manapság már ide értendő a hang mint eszköz bevetése is az előbbi cél érdekében. Ezen rendszerek közös jellemzője az ablakok, menük, ikonok, párbeszéd ablakok stb. Fontos követelmény a következetesség, vagyis egy újabb alkalmazás esetén a felhasználó a már megszokott felülettel találkozik. Nem kell keresgélnie a menük között, mindent a megszokott helyen talál és így a feladat megoldására koncentrálhat, s nem a felület kezelésének elsajátításával bajlódik. A 10. ábra egy ismert program ablakát tartalmazza a WIN95-ből, amelyen jól lehet tanulmányozni a szabványosítási törekvéseket.
17
Fejezetek a számítógépi grafikából
Menü
Ablak kezelő gombok
Eszközök Függőleges gördítő sáv
Paletta
10. ábra. A Microsoft Paint programablakja 7. Virtuális valóság (Virtual Reality) Mesterséges szimulált környezetek létrehozása számítógéppel, biztosíja az ember közvetlen beavatkozását a fejére helyezett virtuális sisak, a kezére és esetleg más testrészeire helyezett érzékelő eszközök segítségével. A szimuláció segítségével egy képzeletbeli valóságban merülünk el, amelynek minősége meghatározó jellegű az alkalmazások területén. Jelentős alkalmazásai: oktatás, távműködtetés, INTERNET, játék és szórakozás. 8. Multimédia alkalmazások Manapság egy átlagos személyi számítógép is lehetővé teszi multimédiás alkalmazások használatát. Az Intel kifejlesztette az MMX processzort, amelynek használatával valószinűleg új távlatok nyílnak meg ezen a területen. A böngészésre használt World Wide Web mint az Internet multimédiás felülete is egy új alkalmazási részterülete a számítógépi grafikának, és ezen ismeretek tanítása merőben új feladat a közoktatás számára. 9. Számítógépes játékok A grafikus adatfeldolgozás kétségtelenül legelterjedtebb felhasználási területe. Manapság már teljesen valósághű játékprogramok készülnek. Általános az SVGA üzemmódok, a 256 szín, sőt 65536 szín használata. A játékprogramok, más programokhoz hasonlóan azt sugallják a felhasználóknak, hogy minél drágább és nagyobb teljesítményű számítógépet vásároljunk, hogy ki tudják használni a programokban rejlő lehetőségeket. Az INTERNET előbb utóbb megteremtheti annak a lehetőségét, hogy az emberek a világhálózaton keresztül játszanak egymással. Erre a jövőképre mindenképpen lehetőséget biztosít a szoftver és főleg a hardver eszközök és erőforrások árának rohamos esése.
18
Grafikus szoftver
11. ábra. Játékra fel!
19
Fejezetek a számítógépi grafikából
3. Grafikus kártyák története! MonoChrom, Hercules, CGA, EGA, VGA, SVGA, XGA.
Egyéni feldolgozás!
4. A szoftverek hordozhatósága és a grafikus szabványok: 3D Core Graphics System (1977) ANSI-American National Standards Institute ISO-International Standards Organization GKS: Graphical Kernel System -2D az első hivatalos grafikai szabvány (1985) GKS 3D kiterjesztése (1988) PHIGS Programmer's Hierarchical Interactive Graphic System (ANSI sz. 1988) PHIGS PLUS (ANSI/ISO 1992) SRGP Simple Raster Graphic Primitívek: • egyenesek, • poligonok, • körök, • ellipszisek, • szöveg Konstansok és típusok Turbo Pascalban Konstansok
Típusok
• • • • • • • • • • •
• • • • • • • • •
Bar3D Constants BitBlt Operators Clipping Constants Color Constants Graphics Colors for the 8514 Fill Pattern Constants Graphics Drivers Graphics Modes for Each Driver Justification Constants Line-Style and Width Constants Text-Style Constants
ArcCoordsType FillPatternType FillSettingsType Memory Pointers LineSettingsType PaletteType PointType TextSettingsTyp ViewPortType
20
Grafikus szoftver
ATTRIBÚTUMOK Színek: procedure SetColor(Color: Word); Sötét színek: (Tinta & Papír) • • • • • • • •
Black Blue Green Cyan Red Magenta Brown LightGray
Világos színek: (Tinta) • • • • • • • •
0 1 2 3 4 5 6 7
DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow White
8 9 10 11 12 13 14 15
Kitöltések és minták: procedure SetFillStyle(Pattern: Word; Color: Word); Konstans
Érték
Jelentés
• EmptyFill • SolidFill • LineFill • LtSlashFill • SlashFill • BkSlashFill • LtBkSlashFill • HatchFill • XhatchFill • InterleaveFill • WideDotFill • CloseDotFill • UserFill minták:
0 1 2 3 4 5 6 7 8 9 10 11 12
Háttérszín Tintaszín ---- kitöltés /// kitöltés /// sűrű kitöltés \sűrű kitöltés \ kitöltés Négyzetrács kitöltés Négyzetrács kitöltés Interleaving line Widely spaced dot Closely spaced dot User-defined fill
Vonal fajták és vastagságok: 21
Fejezetek a számítógépi grafikából
procedure SetLineStyle(LineStyle: Word; Pattern: Word; Thickness: Word); Line Styles: • • • • •
SolidLn 0 DottedLn 1 CenterLn 2 DashedLn 3 UserBitLn 4 (User-defined line style)
Line Widths: • NormWidth 1 • ThickWidth 3
22
Bevezetés
5. Grafikus képek kódolása, tárolása és használata 5.1 Bevezetés A kiadványszerkesztés, számítógéppel segített tervezés, térinformatika és más nagymennyiségű grafikus adattal dolgozó programrendszerek elterjedésével felmerült az adatok minél kisebb helyen történő tárolhatóságának problematikája. Ebben a fejezetben ezzel a témakörrel kívánunk foglalkozni. Nézzük meg, hogyan lehet nagyméretű grafikus képeket tárolni és velük effektív munkát végezni! Miért van szükség pl. a bittérképes képek tömörítéses kódolására? Munkánk során gyakran kell scanner-t használnunk, könnyen belátható, hogy a scanner-rel beolvasott kép igen nagy méretű is lehet. Tekintsünk példaként egy levél (letter) méretű lapot, amelyet True color technikával olvasunk be 600 dpi felbontásban. Levél méret: 8.5x11 hüvelyk (inch) 600 dpi = 600 pont / hüvelyk Felbontás: Ebből adódik: 8.5 ⋅ 11 ⋅ 600 ⋅ 600 = 33 660 000 pont 1 pont ábrázolásához 24 bit szükséges:
( 33 660 000 ⋅ 24) / 8 = 100 980 000 byte ≈ 100 Mbyte Ez az adatmennyiség még a mai korszerű eszközökkel is nehezen kezelhető. Ezért a probléma megoldására különböző eljárásokat dolgoztak ki a számítógépes képek kódolására, tömörítésére és tárolására.
A grafikus képek kódolásának folyamatát három részre bontjuk:
c Szűrés(mapping): szükségtelen redundanciák kiszűrése, az így kapott kép kevesebb byte-ból fog állni mint az eredeti kép.
d Leszűkítés (quantization): az input kép méreteinek leszűkítése a lehetséges output méretre. Előfordulhat, hogy nincs szükségünk a teljes levél méretű képre mind a 5100x6600 pontjával együtt, csak bizonyos részleteit kívánjuk használni, amely elfér a képernyő 640x480-as felbontásán. Természetesen, ha az eredeti képre is szükség van akkor kihagyjuk ezt a lépést, mert a folyamat visszafordíthatatlan.
e Kódolás: a kódolt, tömörített adat és a megfelelő kódtábla előállítása.
23
Fejezetek a számítógépi grafikából
5.2 Kódolási eljárások A következőkben megemlítünk néhány algoritmust, melyek természetesen nemcsak képek, hanem bármilyen input szöveg kódolására alkalmasak. Ezek az algoritmusok viszonylag könnyen kezelhetőek, és igen népszerűek a grafikus képek kódolásánál. 5.2.1 Huffman kód Figyelembe véve, hogy az eredeti input kép pontjai azonos hosszúságú elemekből épülnek fel a használt színek számától függően (pl. 1 képpont 1 byte-on tárolódik). Igen hatékony tömörítést érhetünk el ha a leggyakrabban előforduló elemeket (kép esetén ez általában háttérszín) rövidebb kóddal helyettesítjük. Ezen az elven alapszik a Huffman kód is. Ennek a kódnak a lényege, hogy meghatározzuk az input kép elemeinek előfordulási valószínűségeit vagy az előfordulási gyakoriságait. Tehát, az input kép különböző elemeit tekintsük input ABC-nek, pl. ha a kép maximum 256 színt használ (1 byte-os tárolás) akkor értelemszerűen az input ABC elemszáma is maximum 256. Az input ABC elemeit növekvő sorrendbe állítjuk előfordulási valószínűségeik szerint és a sorrendnek megfelelően egyre rövidebb kódot rendelünk az elemekhez. Természetesen adatvesztés nélküli egyértelmű kódot kell előállítanunk. Ezek után tekintsük az algoritmust amelynek során egy bináris fát építünk fel: 1.
Legyen az OP halmaz az előfordulási gyakoriságok halmaza.
2.
Legyen Pi és Pj az OP halmaz két legkisebb eleme.
3.
2.1.
Hozzunk létre egy új csomópontot az N ij -t, amely a Pi és Pj apja a fában
2.2.
Az N ij → Pi él címkéje legyen 0, az N ij → Pj él címkéje pedig 1.
2.3.
Legyen P N ij = Pi + Pj , a Pi -t és a Pj -t töröljük az OP halmazból és P N ij -t fel-
( )
( )
vesszük az OP halmazba. Ha az OP halmaz 1 elemű akkor vége, egyébként folytassuk a 2.ponttól.
Az algoritmus vége után egy bináris fát kapunk, melynek levelei az input ABC elemei. A gyökérből az egyes levél elemhez vezető úton lévő címkéket egymásután írva kapjuk az inputelem kódját. Az algoritmusból adódik, hogy a gyökérhez nem rendelünk címkét. Az OP halmazt előállítása például történhet úgy, hogy megszámláljuk egy elem (pl. egy szín) előfordulását, majd a kapott értéket elosztjuk az input szöveg hosszával. 256 színű kép esetén minden képpont egy byte-on tárolódik, ezért ilyenkor a kép byte-okban mért hoszszával osztunk. A kódolás során figyelembe vesszük, hogy a kiszámított valószínűségek összege 1. Legyenek példánkban az input ABC elemeinek hossza 1 byte. Előforduló színek:
Előfordulási valószínűségek:
10001010 10100101 00010100 01101011 00111011 00101001
0,34 0,26 0,22 0,08 0,07 0,03
Kód 11 10 01 001 0001 0000
24
Kódolási eljárások
34 26
1 0
1
22 8 7 3
1
60
1 1 0
10
0
18
0
gyökér 40
0
12. ábra. A Huffman kód bináris fája A kódolás után a kódolt állományban le kell tárolni a kódtáblát is, amely tartalmazza, hogy az input ABC elemeihez milyen kód tartozik. Igen hatékony tömörítést tudunk elérni, pl. szövegek esetén a tömörítési arány az 50%-ot is meghaladhatja. 5.2.2 RLE algoritmus (Run-length encoding) Ismétlődésen alapuló tömörítés, amit legegyszerűbben a következő példával szemléltethetjük. Kódoljuk a következő input jel sorozatot: Input: 0000033000344 13 byte Output: 5023301324 10 byte azaz 5db. 0, 2db 3, 3db 0 1db 3, 2db 4. Tehát a kód szövegben az első byte tartalmazza, hogy hány db, a második byte pedig, hogy milyen jel következik. A példánkban 3 byte-ot takaríthatunk meg. True Color képeknél az RLE tömörítés gyakran hosszabb kódot eredményez, mint a forrás kép mérete. Természetesen csak akkor hatásos ez a tömörítés, ha az input kép igen sok azonos képpontot tartalmaz egy sorban. Az alacsonyabb hatékonyság mellett az algoritmus igen gyors, egyszerű és könnyen programozható. RLE rendkívül népszerű és elterjedt az olyan alkalmazásoknál, ahol a tömörítés mellet fontos a kép gyors visszakódolása (előállítása a kódolt file-ból). Az algoritmus javított változata a Background Block Skipping (BBS). Az algoritmus abban különbözik az RLE-től, hogy a háttér színt nem kódolja, tulajdonképpen a háttér blokkok kihagyásáról van szó. Tekintsünk egy példát: Input: Output:
00000330003442200000011111211 5 2 3 10 1 3 2 4 2 2 21 5 1 1 2 2 1
A kövéren szedett számok pozíciókat jelölnek megadva, hogy hol következik a háttértől különböző érték.
25
Fejezetek a számítógépi grafikából
5.2.3 LZW algoritmus (Lempel-Ziv-Welch) Az algoritmus kiszűri az ismétlődő karakterláncokat és ezeket azonosító kódra cseréli. Ebből következik, hogy az LZW kód csak akkor hatékony, ha a karakterláncok ismétlődése nagy. A kódtábla generálása dinamikus, dekódoláskor pedig egy alap kódtáblából építi fel a teljes kódtáblát. Pl. egy 8 bit/pixel színmélységű kép esetén az alaptábla 28 = 256 bejegyzést tartalmaz. A kódolás folyamán karakterláncként fogjuk fel a pixelsorozatokat és megvizsgáljuk, hogy az adott sorozat benne van-e a kódtáblában. Kódolás:
Table[i]
kezdetben az alapkódtáblát , vagyis az inputban előforduló különböző értékeket tartalmazza.
j: = n + 1; Prefix: = az input első eleme; While ( N : = az input következő eleme ) <> ' ' do Begin If ( Prefix + N ) in Table Then Prefix: = Prefix + N Else Begin Table[ j ]: = Prefix + N ;
{+ összefüzést jelent}
{felvesszük az új sztringet a kódtablába, természetesen kódot hozzárendelünk}
j: = j + 1; Write(Output, GetCode ( Prefix ));
{A GetCode függvény visszaadja a Prefix - hez rendelt kódot}
Prefix: = N ; End; End; Write(Output, GetCode ( Prefix ) );
26
Kódolási eljárások
Dekódolás: A kód kiegészítő anyag!
Table[i]
kezdetben az alapkódtáblát , vagyis az inputban előforduló különböző értékeket tartalmazza.
j: = n + 1; Code: = az első kód a kódolt szövegből ; Write(Output, Table[ Code]); Old_Code: = Code; While ( Code: = a kódolt szöveg következő eleme ) <>'' do Begin If Code in Table Then Begin Write(Output, Table[ Code]); S: = Table[ Old _ Code]);
K: = Első_Karakter (Table[ Code]); Table[ j ]: = S + K;
j: = j + 1; Old_Code: = Code; End Else Begin S: = Table[ Old _ Code]);
K: = Első_Karakter (Table[ Code]); Write(Output, Table[ Code]);
Table[ j ]: = S + K;
Old_Code: = Code; j: = j + 1; Old_Code: = Code; End; End; {While ciklus vége} Tegyük fel, hogy példánkban az input képpont négy különböző értéket vehet fel. Tehát az alap kódtábla legyen a következő 0 a 1 b 2 c 3 d Input jelsorozat: 01012101010000000 A kódolás során keletkező dinamikus táblában előállítunk menetközben felesleges kódokat is, de mivel csak az alap kódtáblát tároljuk, ezért ez nem okoz gondot.
27
Fejezetek a számítógépi grafikából
Dinamikus kódtábla: 01 e 10 f 012 g 21 h 101 i 1010 j 00 k 000 l 0000 m Ezek után adódik az output kódsorozat:
a b e c f ia k la
5.2.4 Hierarchikus megközelítés
00000000 00001100 11112110 11113300 13. ábra. Hierarchikus negyedelés A hierarchikus tömörítés a képet két dimenziós területnek tekinti és rekurzívan osztja fel négy részre. A13. ábra szemléltet egy ilyen felosztást. Az így kapott területek ha inhomogének, akkor továbbosztjuk, ha homogének, akkor megjegyezzük a színértéket. Az osztásnál mindig ugyanazt a körüljárási irányt követjük. A végeredményt legegyszerűbben fa adatszerkezettel ábrázoljuk.
28
Kódolási eljárások
0
0
1
0
0
1
2
0
1
1
3
0
14. ábra. A felosztás ábrázolása 5.2.5 Aritmetikai tömörítés Aránylag új módszer, ami hasonlít a Huffman kódra, de nagyobb hatásfokot érhetünk el vele, mint a Huffman kódolással. Lényege, hogy a [ 0 , 1 ] intervallumra leképezzük a különböző tömörítendő szekvenciákat, s így eredményül különböző hosszúságú tört számokat kapunk. A kevésbé gyakori sorozatokhoz pontosabb tört számot, hosszabb bitsorozatot rendelünk. Az aritmetikai tömörítés hatásfoka közel áll az elvi tömöríthetőség határához. 5.2.6 Adatvesztéses tömörítés Akkor használunk adatvesztéses tömörítő algoritmusokat, ha az eredeti adathalmaz tartalmaz fölösleges adatokat is, amelyek szükségtelenek a végső alkalmazás szempontjából. Ilyen technikákat természetesen nem használnak kritikus alkalmazásokban, mint például orvosi képfeldolgozás, de annál inkább a kereskedelmi televíziózásban. Szemünk tehetetlenségéből adódik, hogy a TV képernyőjén bizonyos változásokat nem veszünk észre. Pl. ha 50 pont színe megváltozik a képernyőn, akkor észre sem vesszük, ezért sok esetben szükségtelen a túlzott színmélység vagy az éles kontúrok használata. Kiválóan alkalmazzák ezeket a megoldásokat a JPEG és a MPEG formátumú állományoknál, ahol megválaszthatjuk a kép kódolása során, hogy tömörítés hatásfoka és a kép minősége közötti fordított arányosság mértékét.
29
Fejezetek a számítógépi grafikából
5.3 Grafikus képformátumok A grafikus állomány formátumok minden változatát áttekinteni szinte lehetetlen feladat. Írásunk adta kereteken belül, csak az általunk legfontosabbnak ítélt, főleg PC DOS környezetben gyakori formátumok kerülnek felsorolásra. A formátum típus név után zárójelben adjuk meg az állomány kiterjesztését. 5.3.1 Állóképek PCX (*.pcx) Raszteres típusú Zsoft Corporation fejlesztés. MS-DOS operációs rendszerkörnyezetben az egyik legelterjedtebb formátum. Eredetileg a Paintbrush programcsomaghoz fejlesztették ki. TIFF (tag image file format, *.tif) Raszteres típusú Aldus és Microsoft fejlesztés. Elsősorban a szkennerrel beolvasott képek belső tárolására használják főleg DTP rendszerekben. Igen elterjedt Aldus, Microsoft alkalmazásokban és szkennelő szoftvereknél. GIF (Graphics Interchange format, *.gif) Raszteres típusú Compuserve Incorporated fejlesztés. Nagyfelbontású, sokszínű képek tárolása, képernyőn történő megjelenítéséhez használatos. Mivel igen jól tömörítet állomány ezért kiválóan alkalmas az Interneten való használatra is. GEM IMG (*.img) Raszteres típusú Digital Research fejlesztés. Főleg a Ventura Publisher applikációhoz fejlesztették ki és jól támogatja a monokróm megjelenítőket. TGA (Truevision Targa, *.tga) Raszteres típusú Truevision Inc. fejlesztés. Elsősorban a Targa grafikus kártyasorozat támogatására készült. Manapság elterjedt szkennereknél és festőprogramoknál is. BMP/DIB (Microsoft Windows Device Independent Bitmap, *.bmp, *.dib) Raszteres típusú Microsoft fejlesztés. Alapvető formátum minden windows alatt futó alkalmazás esetén. Sajnos más területeken nem támogatott formátum. Windows alatt könnyen kezelhető bittérképes formátum, amely főleg kis méretű képek tárolására alkalmas, mivel RLE tömörítést tartalmaz.
30
Grafikus képformátumok
JPEG (Joint Photographic Expert Group, *.jpg) Főleg fotórealisztikus, valósághű képek tárolására és megjelenítésére használatos tömörített bittérképes formátum. A képeket 8x8 képpontos blokkokra bontja és a blokkok 64 pixelének a bal felső sarokban lévő képponthoz való viszonyuk alapján írja le. Ez a tárolás jóval kevesebb helyet igényel, mintha minden képpont jellemzőjét külön-külön írnánk le. Kihasználják a tömörítésnél azt is, hogy az emberi szem sokkal érzékenyebb a fényességek változására, mint a színek módosulására, így adatvesztéses tömörítés is alkalmazható. Nagy előnye, hogy ez idáig a legjobban tömörített képformátum, ezért az Interneten a GIF mellett JPEG formátumot használják leginkább. Akár negyedakkora méretű lehet a JPG file, mint egy vele egyenlő minőségű GIF file. DXF (Drawing Interchange Format, *.dxf) ASCII formátumú Autodesk Inc. fejlesztés CAD (Számítógéppel Segített Tervezés) programokhoz. Mivel az ASCII szöveg formátum rendkívül lassan dolgozható fel, ezért kifejlesztettek egy bináris változatot is. A bináris változat az AutoCAD Relase 10 változatával jelent meg, amely körülbelül 25%-kal rövidebb és kb. 5ször gyorsabb az ASCII változattól. A DXF formátum kiválóan alkalmas grafikus adatok közvetítésére alkalmazások között, mert a legtöbb számítógépes platformon igen népszerű formátum. Segítségével 3D objektumok, görbék, és fontok is leírhatók, ezért elég nehéz feladat DXF formátum kezelő programot készíteni. Ha ilyenre vállalkozunk, akkor valójában CAD programot készítünk. Gyakorlati tény, hogy a CAD programok közötti adatcsere szabványává vált ez a formátum. HP-GL (Hewlett Pakard Graphics Language, *.plt) Hewlett Pacard fejlesztés, vektorgrafikus formátum. Eredetileg rajzgépek vezérlésére szolgált, már a lézernyomtatók is vezérelhetők a segítségével. Minden CAD program, a szövegszerkesztők és grafikon készítő programok által is támogatott formátum. Valójában nem képformátum, ha nem egy vonalrajzoló nyelv, amellyel papírmérettől függetlenül tudunk rajzokat megadni. A PCL 5 (Printer Control Language) nyomtatónyelvet ismerő lézer és tintasugaras nyomtatók mind elfogadják a HP-GL/2 változatot. Tehát PCL 5 vezérlő parancsokat használva definiálhatunk a lapon egy olyan téglalap alakú területet, amelyen belül HP-GL/2 kép rajzolható. Másképpen fogalmazva, HP-GL/2 kép beágyazható PCL 5 szövegbe. PS (Basic PostScript Graphics, *.ps, *.eps) Vektor és bittérképes formátum, valójában egy lapleíró nyelv, amely hasonlatos a FORTH programnyelvhez. Adobe Systems, Inc. fejlesztés eredetileg nyomtatókhoz és egyéb output eszközökhöz tervezték. Az EPS (Encapsulated PostScript) változat megjelenésével különösen alkalmas színes képek és nyomdakész anyagok tárolására. Bár A DTP rendszerekben a PS szabvány, de a nyelv bonyolultsága miatt feldolgozó és PS file-t input-ként elfogadó alkalmazást készíteni meglehetősen nehéz feladat. Adobe’s Postcript Language Reference Manual több mint 700 oldal.
31
Fejezetek a számítógépi grafikából
WMF (Microsoft Windows Metafile, *.wmf) Eszköz független és jól strukturált file formátum főleg grafikus képek tárolására és Windows alatt futó alkalmazások közötti transzponálására. Mivel igen magaszintű struktúrák is leírhatók benne, ezért jóval tömörebb formátum mint a bittérkép. A WMF file Microsoft Windows grafikus függvények sorozatát tartalmazza, felfoghatjuk grafikus makróutasítások halmazaként is. A metafile tartalmaz egy fejlécet (header), melyet néhány rekord követ. A rekordok tartalmaznak egy GDI hívást (Windows graphics device interface), adatokat, függvény azonosítót és paramétereket. Jelenleg a WMF a legjobb eszközfüggetlen Windows formátum és minden Microsoft alkalmazás támogatja. Microsoft Windows Icon (*.ico) Az ikon file 32x32 képpontot ír le általában 4 bit színmélységben. A színleíró bitekkel együtt 776 byte hoszszú az állomány, amelyet a Windows használ ikonként. Kodak Photo CD (*.pcd) Kodak Precision Color Management System (KPCMS) rendszert használó speciális Kodak fejlesztés, amely igen nagy felbontású és színmélységű képek tárolására alkalmas. A Kodak fotó szervizek az általunk elkészített negatív filmekről előhívás után kb. 100 db képet írnak rá egy CD ROM lemezre Kodak CMS Photo CD file formátumban. A legtöbb CD ROM olvasó felismeri ezt a formátumot, így speciális Photo CD lejátszó nélkül is megtekinthetjük képeinket. A KPCMS lehetővé teszi, hogy különböző felbontásokban használjuk a képeket a rendelkezésünkre álló hardver erőforrások függvényében. A Kodak Photo CD formátumok: Típus
Felbontás
Base/16 Base/4
128 x 192 256 x 384
Base 4 Base 16 Base
512 x 768 1024 x 1536 2048 x 3072
64 Base
4096 x 6144
Szükséges Memória Felhasználási terület (Mbyte) 0.07 Ikon szerűen megjelenő index kép 0.28 Elforgatott kép a képernyőn, mivel a Base változat túl nagy méretű a forgatáshoz 1.13 Televízión vagy monitoron való megjelenítés 3 4.50 HDTV-n való megjelenítés 18.00 DTP alkalmazások. Legnagyobb felbontás 35 mm filmről a Photo CD Master Disc számára 72.00 Elméletileg a legnagyobb felbontás 35 mm-es vagy nagyobb filmről a Pro Photo CD Master Disc
A táblázatban található nagy felbontásokhoz feltétlen meg kell említenünk a Kodak cég speciális scannereit, melyek biztosítják ezeket a minőségeket. A 64 Base felbontáshoz pl. a Professional PCD Film Scanner 4045öt ajánlják amely körülbelül 4400 pixels/inch felbontásban képes dolgozni. 5.3.2 Mozgókép formátumok A mozgókép formátumok rendkívül dinamikusan fejlődnek. Ez a fejlődés egyrészt köszönhető a multimédiás alkalmazások előtérbe kerülésének, másrészt az INTERNET világméretű őrületének. Teljes képernyős lejátszást a legtöbb multimédiás program úgy használja, hogy egy kis ablakban jeleníti meg a videó képet és lehetőség van akár teljes képernyőre váltanunk. Ekkor a felbontás nagy mértékben lecsökken, mert a kis ablak pixelének színét a nagy ablak megfelelő számú pixele kapja meg. Olyan hatású, mintha nagyítón keresztül néznénk a képet. Teljes mozgású lejátszás (full motion) az emberi szemnek folyamatosnak tűnő mozgó képlejátszás, amelyben 30 képkocka jelenik meg másodpercenként. A gyakorlatban már azonban olyan videofelvételeket is teljes mozgásúnak neveznek, amelynek képváltási frekvenciája csupán 15 képkocka másodpercenként.
3
HDTV: High-definition television display 32
Grafikus képformátumok
Autodesk FLI Autodesk Animator alkalmazás által használt mozgókép formátum, amely valójában teljesen önálló képek sorozatát tartalmazza. Grasp GL animáció Grasp (Grafical System for Presentation) valójában egy slide show, amely a Microtex Industries Inc. fejlesztés. Eredetileg üzleti bemutatókhoz készült, mivel parancs nyelve számtalan vizuális hatást tesz lehetővé pl. áttünések, törlések, feliratozások stb. MPEG (Moving Pictures Experts Group) Egész képernyős, teljes mozgású videó lejátszást tesz lehetővé, olyan 386-486-os rendszereken, amelyekben még csak egyszeres sebességű CD-ROM olvasó található. Könnyen ez a formátum válhat a mozgóképek szabványává (bejegyzett ISO, International Organization for Standardization szabvány), amelyet a JPEG alapján fejlesztettek ki. MPEG file JPEG képeket tartalmaz, mint vázakat, kereteket (frames), és a két egymásután következő kép közötti különbségeket tárolja a file-ban. Ezzel a megoldással igen nagy mennyiségű képkocka elfér egy nem túl nagy méretű állományban. Mivel elég bonyolult formátumról van szó ezért komoly erőforrásra van szükségünk a zökkenő mentes mozi hatás elérésére. Speciális hardver eszközöket fejlesztenek ki az MPEG file-ok lejátszására. Ma már szinte minden grafikus kártyát ellátnak MPEG lejátszó chip-pel, és megjelentek az MPEG formátumban merev lemezre rögzítő kamerák is. Sőt a mozifilmek is kaphatók úgynevezett Videó CD ROM lemezen. Egyenlőre csak kb. 75 percnyi film fér rá egy CD lemezre, de hamarosan elfogadásra kerülnek új szabványú CD ROM formátumok, amik lehetővé teszik több órás filmek rögzítését videó CD-n, videó kazetta helyett. AVI (Audio Video Interleave) A Widows felületen igen elterjedt formátum, mivel Microsoft fejlesztés és a "Video for Windows (VfW)" alkalmazás részeként jelent meg. Hanggal ellátott mozgóképsorozatok lejátszására alkalmazható, kisméretű ablakban, kb. 15 képkocka/másodperc sebességgel. A WIN95 operációs rendszerhez már hozzáadják a VfWt, így az AVI állományok lejátszhatóak. Az AVI állomány hátránya viszonylag nagy méretében keresendő. MOV (QuickTime movies) Hasonlóan az MPEG formátumhoz ez a formátum is professzionális videó és hang vagy multimédia alkalmazásokhoz készült. Szintén bejegyzett ISO szabvány és bár a Apple Inc. elsősorban Macintosh számítógépekre fejlesztette ki, már létezik népszerű PC-s alkalmazása is. GIF (Graphics Interchange Format) Az állókép formátuma mellett mozgókép formátuma is van a GIF-nek. Ennek piaci okai vannak, mivel a CompuServe fejleszti, ezért a saját hálózatán ezt a formátumot támogatja. 1994-ben az UNISYS értesítette a CompuServe-t, hogy megváltoztatta a Lempel-Ziv-Welch (LZW) kódolást amelyre épül a GIF is. Az új változatot is megvásárolta a CompuServe és a mozgókép változatban is ezt használja. Ezek után ha olyan alkalmazást akarunk fejleszteni, ami az új GIF formátumot használja, akkor szerzői jogdíjat kell fizetnünk.
33
Fejezetek a számítógépi grafikából
5.4 Vektor- és rasztergrafika összehasonlítása A vektor és raszter (más néven pixel vagy bitmap) grafika két alapvető és lényegesen különböző metódusa a grafikus állományok megjelenítésére és tárolására. A grafikus állományok kezelésére valamelyik módszert vagy esetleg a kettőt együttesen alkalmazzák. 5.4.1 Raszteres grafika A raszteres alkalmazások igen népszerűek, mert könnyen alkalmazhatóak és használhatóak bármely típusú kép esetén. A raszteres grafika azt jelenti, hogy a kép sorokból (scanline) és azon belül oszlopokba rendezet képpontokból épül fel. Tehát úgy képzelhetjük el, hogy a képet egy rácsszerkezettel osztottuk fel apró elemi részekre. A 15. ábra egy bittérkép kinagyított részletét mutatja, ahol rácspontok egy-egy képpontnak felelnek meg. Végeredményként az adott képpont (pixel) pozícióját és színét kell tárolnunk. A raszteres grafika alapeleme a képpont. Alkalmazható még a képpontokból álló téglalap (pixmap), melyet főleg betűk, fontok ábrázolására használnak. Az előző fejezetben láthattuk, hogy nagyon sokféle raszteres állomány létezik. Ezeknek közös jellemzőjük, hogy általában a file elején, a header részben tárolják a színmélységet, színpalettát, tömörítési módot és egyéb a tárolással kapcsolatos információt. A bittérképes állományok egyszerű kezelhetőségük miatt főleg a már kész képek pl. a televíziós képfelvétel és továbbítás területén népszerűek. Meg kell említenünk a vektor grafikával való összehasonlítás miatt, hogy milyen hátrányai vannak a bittérképes grafikának: • Hatalmas képméret: Egy nagy felbontású true color kép több megabyte memóriát is felemészthet a tároláskor, sőt még többet a megjelenítéskor. • Komoly hardver erőforrásokat igényel: Az előzőekből is adódik, hogy pl. egy 16 bites és egy 32 bites buszrendszer közötti különbség ebben az esetben drámai különbözőségeket mutat. A megfelelő számítógép egy munkaállomás (workstation) vagy egy igen gyors PC szükséges, hogy elfogadható sebességgel tudjuk feldolgozni a grafikus képeket. • Alacsony rugalmasság: A képpontoknak nincs kapcsolatuk egymással. Pl. egy képen amely ábrázol egy mezőt és egy házat nem tudjuk beazonosítani, hogy mely pontok a mezőé és melyek a házé, vagyis nem léteznek poligonok és objektumok. Következésképpen, ha módosítani akarjuk a képet pl. megnagyítani vagy kicsit megdönteni a házat, akkor ez nem fog sikerülni, vagy igen fáradságos munka az adott terület pontonként való módosítása. • Felbontási probléma: A kép őrzi felbontását, bármely részét nagyítva szembetaláljuk magunkat a lépcsőhatás problémájával. Tehát ha például egy körnek látszó alakzatot kinagyítunk, akkor nem egy nagyobb sugarú kört kapunk, hanem egy nagyobb sugarú lépcsős szélű nagy pontokból álló valamit, ami egyre kevésbé emlékeztet minket körre. Természetesen számtalan kiváló program létezik amellyel a fent említett problémák megoldhatóak (Pl. Adobe PhotoShop, Corel Photo-Paint, stb). Ezeket az alkalmazásokat gyakran fotóretusáló programoknak is nevezik, mivel felhasználhatóságuk ehhez a szakmához áll legközelebb. A Corel Draw programcsomagban található, egy Corel Trace nevű alkalmazás, amely a raszteres képeket vektoros képekké alakítja át. Az eredeti képen megpróbál egyeneseket és görbéket beazonosítani, azaz vektorizálni a képet. A 15. ábra egy raszteres képet ábrázol kinagyítva. A kép eredetileg egy ikon melyet sokszoros nagyítás után a vágólap segítségével illesztettük be a szövegbe.
34
Vektor- és rasztergrafika összehasonlítása
15. ábra. Nagyító alatt egy ikon 5.4.2 Vektorgrafika A vektorgrafika azt jelenti, hogy a képet vonalak, alakzatok és görbék sorozataként írjuk le, figyelembe véve, hogy továbbra is lehetnek mintával vagy színnel kitöltött területek. A vektorgrafikát tartalmazó file úgy néz ki mintha egy program file-t vizsgálnánk. Angol parancsszavakat és adatokat tartalmaz ASCII formátumban, ebből következően szabadon szerkeszthető valamilyen editorral. Pl. 100 mm sugarú kör X = 22.5 mm és Y = 50 mm középponttal lehet a következő parancs: CIRCLE(100,2250,5000). A 16. ábrán egy HP-GL állomány tartalmát látjuk két hasábban szerkesztve ASCII formátumban, majd a 17. ábra az általa megadott rajzot tartalmazza. Felismerhető utasítások pl: • • • •
CI = kört rajzol adott sugárral (Circle), PU és PD vonalhúzó utasítások (PenUp és PenDown), PW = toll szélességét definiálaja (PenWith), SP = Tollat választ (Select Pen).
35
Fejezetek a számítógépi grafikából
IN VS32,1 VS32,2 VS32,3 VS32,4 VS32,5 VS32,6 VS32,7 VS32,8 WU0 PW0.350,1 PW0.350,2 PW0.350,3 PW0.350,4 PW0.350,5 PW0.350,6 PW0.350,7 PW0.350,8 SP1
LT; PU-400 PD 300 SP1; LT; PU-400 PD 300 SP1; LT; PU-400 PD -50 SP1; LT; CI 350 SP1; LT; PU -50 PD 300 SP0;
120; 120; 820; 820; 820; 470;
470; 120;
16. ábra. HP-GL forrás állomány
17. ábra. HP-GL/2 rajz 5.5
Grafikus képek a WINWORD szövegszerkesztőben és az OLE technika
Az alkalmazások legtöbbje fogadja mind a vektoros mind a raszteres képeket. Az olyan típusú szövegszerkesztő mint pl. Word for Windows képes arra, hogy a dokumentumba beágyazza vagy a dokumentumhoz hozzákapcsolja a raszteres ill. vektoros képeket. Mivel írásunkban főleg PC DOS alkalmazásokkal foglalkozunk, ezért ebben a fejezetben az objektumok beágyazása és kapcsolása alatt a Windows alatt elterjedt OLE 36
Grafikus képek a WINWORD szövegszerkesztőben és az OLE technika
technikát fogjuk tárgyalni (Objects Linking and Embedding, OLE). Szövegszerkesztőnek a Word for Windows-t választottuk, mert Magyarországon kétségkívül ez a legelterjedtebb szövegszerkesztő, és célunknak tökéletesen megfelel. 5.5.1 Képek beágyazása (Embedding) és csatolása (Linking) Ami a számítógépünkben található −program, adatállomány, kép, táblázat, hang, mozgó kép, grafikon− az mind lehet objektum, s ezek az objektumok más objektumokat is létrehozhatnak. Ezentúl csak a képekről fogunk beszélni, bár az elmondottak a többi objektum esetén is szinte teljesen hasonlóak. Amely programot úgy készítenek el, hogy képes legyen kezelni objektumot, az elvileg bármely objektummal tud dolgozni. Persze ez nem ilyen egyszerű, és az OLE technikának nagy ára van, mert ezek a programok nagyon nagy méretűek s meglehetősen nehézkesen és lassan kezelhetők. • Amikor hozzákapcsolunk (csatolunk) pl. egy PaintBrush (Rajzoló) képet egy Word szöveghez, akkor a Word-nek megadjuk a BMP állomány nevét és a szövegszerkesztő megjeleníti az állomány tartalmát. A Word használata közben időről időre ellenőrizhetjük a kapcsolatot és frissíthetjük azt a kép esteleges átszerkesztés után, ezzel a módosított kép jelenik már meg a szövegben is. • Ha beágyazzuk az előbbi képet, akkor a szövegszerkesztő dokumentumában létrejön valami, ami az eredeti BMP kép másolatának nevezhetünk. Nem beszélhetünk állományról mert az operációs rendszer nem tud róla, neve nincs, viszont ha módosítani akarjuk, akkor a Word behívja a Paintbrush-t, s már is szerkeszthetjük a képet. Lényeges különbség az, hogy kapcsolásnál fizikai kapcsolat létesül a két állomány között, míg beágyazásnál nem. Másképpen fogalmazva, ha a kapcsolt állományt letöröljük vagy megváltoztatjuk fizikai helyét, akkor a dokumentumban csak hibaüzenet jelenik meg a kép helyén. Beágyazásnál fizikailag is bekerül a képállomány másolata, későbbiek során az eredeti állomány le is törölhető, a kép akkor is benne lesz e szövegben, hiszen magában hordozza azt. Kapcsolásnál lényegesen kisebb lesz a dokumentum mérete viszont hordoznunk kell a kapcsolt állományokat is, míg beágyazásnál nagyon nagy méretű állományt kapunk, viszont egyetlen egy állomány tartalmaz mindent. Használhatóságról nehéz véleményt mondani, mert a Word for Windows tartalmaz olyan belső képszerkesztő programot, amely sok grafikus állomány formátumot kezel. Sokszor saját maga önkényesen megszünteti a kapcsolatokat, ha általa ismert állományról van szó. Pl. ha kapcsolunk a szöveghez egy a Word által szerkeszthető kép formátumú állományt, akkor a kép módosításánál nem az eredeti programot hívja be, hanem a saját képszerkesztőjét és megszünteti a kapcsolatot, vagyis beágyazza a képet. A továbbiakhoz tisztáznunk kell két fogalmat: • Kliens program: a fogadó objektumkezelő programját nevezzük így, a mi esetünkben a Word for Windows szövegszerkesztő. • Kiszolgáló vagy szerver program: az OLE objektumot létrehozó és kezelő programot nevezzük így, amely speciális objektumkezelő funkciókat tartalmaz. Pl.: PaintBrush. Amikor egy objektum bekerül egy kapcsolt dokumentumba, akkor a kliens program végzi az összerendelést azzal az alkalmazói, más néven kiszolgáló programmal, amelyik az objektumot létrehozta. Mint tudjuk az összerendelésnek két módja van, a kapcsolás vagy beszerkesztés (linking) és a beágyazás (embedding). Tudnunk kell még azt is, hogy a Windowsban a Regisztrációs adatbázis szerkesztése egy olyan speciális eszköz, amely lehetővé teszi a számítógép működésével kapcsolatos információt tartalmazó rendszer-nyilvántartási beállítások megváltoztatását. Tehát az OLE-val kapcsolatos bejegyzések is ide kerülnek, vagyis minden újabban telepített program módosíthatja a regisztrációs adatbázist, ezért ennek megsérülése komoly problémákhoz vezethet, pl. az OLE technika sem használható tovább azoknál az állományoknál, ahol eddig működött. Ezek után nézzük meg, hogyan lehet grafikus állományainkat beépíteni dokumentumainkba. 5.5.1.1 Meglevő állomány csatolása a dokumentumhoz: A művelet végrehajtásához általában a következő menüpontokat kell kiválasztanunk: BeszúrásObjektum (InsertObject). Objektum helyett speciálisan a Word for Windows-ban választhatjuk a Kép almenüt is. Ha nincs Beszúrás menü, akkor nézzük át a Szerkesztés (Edit) menüt. Ezután válasszuk ki a Létrehozás fájlból opciót, keressük meg azt az állományt, amelyet hozzá akarunk kapcsolni a jelenleg használthoz és jelöljük be a Csatolás (Link to file) lehetőséget.
37
Fejezetek a számítógépi grafikából
5.5.1.2 Meglevő állomány beágyazása a dokumentumba: Ugyanaz a teendő, mint előbb, azzal a különbséggel, hogy a Csatolás (Link to File) lehetőséget nem jelöljük ki. 5.5.1.3 Még nem létező objektum újként való beágyazása a dokumentumba: Hasonlóan járunk el: BeszúrásObjektum (InsertObject). Objektum helyett speciálisan a Word for Windows-ban választhatjuk a Kép almenüt is. Ha nincs Beszúrás menü, akkor nézzük át a Szerkesztés (Edit) menüt. Majd az Új létrehozása (Create New) lehetőséget válasszuk ki megadva a kiszolgáló alkalmazás objektumának típusát. 5.5.1.4 Beágyazott objektum kapcsolttá alakítása: Kattintsunk rá kétszer a beágyazott objektumra ezzel behozzuk a kívánt alkalmazást. A betöltött alkalmazásban jelöljük ki az objektumot (pl. képet), majd másoljuk a vágólapra. Ezt megtehetjük pl. a SzerkesztésMásolás (EditCopy) menüpontokkal. Ezután kattintsunk vissza a bárhová a szövegszerkesztőbe, ezzel visszatérünk és a behozott alkalmazás bezáródik. Ezek után önállóan futtassuk a kívánt alkalmazást pl. a Fájlkezelő segítségével, majd az önállóan működő programba illesszük be a vágólap tartalmát. Ezt megtehetjük pl. a SzerkesztésBeillesztés (EditPaste) menüpontokkal, mentsük ki az állományt és lépjünk ki a programból. A WinWordbe visszatérve töröljük a régi objektumot, ezt legegyszerűbben úgy tehetjük meg, hogy rákattintunk az objektumra és leütjük a
billentyűt. Ezután a frissen létrehozott állományt a Meglévő állomány csatolása a dokumentumhoz című bejegyzés szerint kapcsoljuk ugyanarra a helyre. 5.5.1.5 Kapcsolt objektum beágyazottá alakítása: Ez a művelet nagyon egyszerű, csak a kapcsolt állomány helyét kell meghatározni. A SzerkesztésCsatolás (EditLinks) menüpontok segítségével meghatározhatjuk a csatolt állomány helyét. Ezek után törüljük a kapcsolt objektumot, ezt legegyszerűbben úgy tehetjük meg, hogy rákattintunk az objektumra és leütjük a billentyűt, amivel megszüntetjük a csatolást. Ezután a kívánt helyre beágyazzuk az állományt a Meglevő állomány beágyazása a dokumentumba bejegyzés segítségével 5.5.1.6 OLE technika hátrányai Sajnos az OLE igen lassúnak mondható, s nem helytakarékos. Mind a kapcsolásnál, mind a beágyazásnál a forrásobjektum többszörösével nő a kliens állomány mérete. Az OLE használata közben a rendszer erőforrásait igen hamar kimeríti a számtalan szerver alkalmazás betöltése, ami könnyen a rendszer teljes összeomláshoz vezethet, különösen Windows 3.1 alatt. Megoldási javaslataink: • Kerüljük az automatikus frissítéseket. A SzerkesztésCsatolás (EditLinks) menüpontnál használjuk a Kézi (Manual) frissítést az automatikus helyett, így saját magunk tudjuk vezérelni ezt. • Hagyjuk nyitva a kiszolgáló alkalmazást. Ha rendszerünk erőforrásai lehetővé teszik az OLE használatát vagyis rendelkezünk elég gyors központi egységgel, legalább 16 Mbyte memóriával és természetesen gyors nagy kapacitású winchesterrel, akkor ne csukjuk be a szerver programokat, mert azok újból és újból való betöltése igen hosszú időt vehet igénybe. • A kliens program néhány esetben saját maga is tudja olvasni a szerver programok állományait. Ilyen esetekben ne használjuk az OLE-t. Pl. a Word for Windows estén a BeszúrásKép (InsertPicture) használatával a grafikus állományokat közvetlenül is olvashatjuk. Különösen jó eredményt érhetünk el bittérképek (pl. BMP) beszúrása esetén. Ez az eset akkor fordul elő, amikor a vágólap tartalma egy bittérkép, és ilyenkor a SzerkesztésIrányított beillesztés (EditPaste) menüpontokat választjuk. Ekkor lehetőségünk van a Winword számára kezelhetőbb Kép megoldást választani, ami kevesebb erőforrást igényel, kisebb lesz az állomány mérete és szebb nyomtatási képet is ad.
38
Grafikus képek a WINWORD szövegszerkesztőben és az OLE technika
6. Néhány alapvető raszteres algoritmus A célunk az, hogy megadjunk néhány alapvető raszteres algoritmust amelyeket építőkockaként tudunk felhasználni grafikus programjainkban. A raszter egyenlő távolságban lévő (ekvidisztáns) pontokból álló mező. Egy raszter terület pontjait kétdimenziós tömb elemeiként címezhetjük. Képernyő pont: Picture element =Pixel. A) Poligonvonal megadása két dimenziós tömbbel: Var Poly: Array [1..N,1..2] of Integer;
X
x1
x2
x3
Y
y1
y2
y3
...
xn-2
xn-1
xn
yn-2
yn-1
yn
B) Poligonvonal megadása rekord szerkezettel: Type PointType = Record x,y : Integer; End; Var Poly : Array [1..N] of PointType; A derékszögű koordináta-rendszert használjuk figyelembe véve az egyes output eszközök koordinátarendszereit. A raszteres monitorok grafikus képernyőinek címzése általában balról jobbra és fentről lefelé növekedően történik.
(0,0)
(Y m ax,0)
(0,X m ax)
(Y m ax,X m ax)
18. ábra. Képernyő koordináta-rendszer Speciális esetekben előfordul, hogy a koordináta-rendszer kiindulópontja a képernyő bal alsó sarkában van, vagy a teknőcgrafika esetén középen található. Az általunk megadott raszteres algoritmusok a bal alsó kezdőpontot használják, mintha a matematika füzetünkben dolgoznánk. Ez nem okoz nehézséget, mert egy egyszerű ponttranszformációval áttérhetünk a 18.ábrán bemutatott, egyébként a monitorok kezelésének szokásos rendszerére. A Transf eljárás pl. az origóban lévő alakzatot transzformálja a 18.ábra által használt koordináta-rendszer esetén a képernyő közepére. 39
Fejezetek a számítógépi grafikából
Procedure Transf (Var x,y : integer); Begin y := y − (GetMaxY div 2); y := −y; x := x + (GetMaxX div 2); End; Néhány újabb fogalmat is tisztáznunk kell. A ScanLine vagy letapogató vonal az összes azonos y koordinátájú pont halmaza, tehát a képernyő egy sorának felel meg. A raszterpontok fényerőssége az output eszközünk minőségétől függően változtatható. A legtöbb modern grafikus kártya beépített bonyolultabb algoritmusokat is tartalmaz, nem csak a pont színe állítható velük.
40
Window-viewport transzformációk
6.1 Window-viewport transzformációk A legtöbb grafikus problémát általában Descartes koordináta-rendszerben oldunk meg, tehát derékszögű úgynevezett világkoordináta-rendszerben adjuk meg az algoritmust. A világkoordináta-rendszer speciális, ezért gyakran transzformálni kell a periféria koordináta-rendszerbe. Általában a világ koordináta-rendszer derékszögű ablakát (Window) transzformáljuk az output rendszer képtartományába (Viewport). Gyors algoritmusra van szükségünk, mivel sok pont kezelésével nagy mennyiségű ismétlődő számítást kell elvégeznünk.
(wxmax,wymax) (wx,wy) (wxmin,wymin)
(vxmax,vymax) (vx,vy) (vxmin,vymin)
19. ábra. A geometriai input és output adatokat koordináta-rendszerek közötti leképezéseknek vetjük alá. A következő koordináta-rendszereket különböztetjük meg: • világkoordináta-rendszer (World Coordinates, WC) a felhasználó ebben adja meg illetve ebben kapja vissza a geometria információkat. • normalizált eszközkoordináta-rendszer (Normalized Device Coordinates, NDC), a különböző grafikus munkahelyek számára egységes koordináta-rendszer. • eszközkoordináta-rendszere (Device Coordinates, DC), a munkahely hardverének megfelelő specifikus koordináta-rendszer. A 19. ábra alapján könnyen előállíthatunk egy olyan függvényt, amely világkoordináta-rendszerben lévő pontot átviszi a NDC koordináta-rendszerbe. A függvénynek rendelkeznie kell a következő tulajdonságokkal: A) a világ koordináta-rendszer derékszögű ablakának (Window) határvonalpontjait az output rendszer képtartományának (Viewport) határvonalpontjaiba transzformálja. Tehát a következő megfeleltetés igaz:
( wx min, wy min, wx max, wy max) → ( vx min, vy min, vx max, vy max) B)
Egyenestartó leképezés, vagyis egyenes képe is egyenes lesz.
C)
Az x és y tengelyek a két rendszerben páronként párhuzamosak egymással.
Ebből következik, hogy a leképezés lineáris és a 19. ábra alapján a következő összefüggés vezethető le:
41
Fejezetek a számítógépi grafikából
(1)
wx = wx min + a ( wx max − wx min)
,ahol (0 ≤ a ≤ 1)
és igaz , hogy (2)
vx = vx min + a ( vx max − vx min)
(1)-ből adódik, hogy
a=
wx − wx min wx max − wx min
visszahelyettesítve (2)-be:
vx = vx min + = wx
wx − wx min ( vx max − vx min) = wx max − wx min
vx max − vx min vx max − vx min + vx min − wx min wx max − wx min wx max − wx min
Új jelöléseket bevezetve: dvx: = vx max − vx min , dwx: = wx max− wx min és hasonlóan számítható dvy és dwy.
vx =
⎛ dvx dvx ⎞ ⎟ ⋅ wx + ⎜⎜ vx min − wx min dwx dwx ⎟⎠ ⎝
ami lineáris leképezés. A másik koordinátára hasonló kifejezést kapunk.
vy =
⎛ dvy dvy ⎞⎟ ⋅ wy + ⎜⎜ vy min − wy min dwy dwy ⎟⎠ ⎝
Tehát végeredményként azt kaptuk, hogy
vx = A ⋅ wx + B vy = C ⋅ wy + D Mivel A,B,C,D a leképezés során függetlenek a ( wx , wy ) transzformálandó ponttól ezért ezeket az értékeket csak egyszer kell kiszámítani. Ha a < 0 vagy a > 1 akkor a transzformálandó pont kívül esik az ablakon ezért nem kell vele foglalkozni.
42
Uniform eszköz transzformáció
6.2 Uniform eszköz transzformáció
(a)
(Wxmax,Wymax)
(Wxmin,Wymin)
Világ koordináták (b) (Vxmax,Vymax)
(Vxmin,Vymin)
Normalizált eszköz koordináták 20. ábra. A 20. ábra egy Window-Viewport transzformációt illusztrál, ahol a torzítási tényezők (aspect ratio) nem egyeznek meg. Torzítási tényezőn a magasság és a szélesség arányát értjük. Ilyen estetekben a kör képe ellipszis lesz. A leképezési függvényben szereplő (dvx/dwx) és (dvy/dwy) nem egyenlő. Ez elfogadható, de a programozónak nagyon ügyelnie kell, hogy ne feledkezzen meg a torzulásról. Az uniform transzformációknál követelmény az előbbi hányadosok egyenlősége. is nevezhetjük Az uniform transzformáció valójában hasonlósági transzformáció is, mivel hasonló alakzatok keletkeznek.
43
Fejezetek a számítógépi grafikából
Tekintsünk egy példát erre a problémára Turbo Pascal programozási környezetben: Készítsük el a 21. ábrának megfelelő rajzot, amelyen egy kört érintő négyzetet láthatunk. A feladat megoldásánál vegyük figyelembe a torzítási tényezőt.
R O(x,y)
21. ábra Az algoritmust világ koordináta-rendszerben triviális, de DC-ben a különböző felbontású grafikus üzemmódok esetén figyelembe kell venni a torzítási tényezőt. Bemenő adatok : x , y, r Procedure Érintő_Négyzet(x,y,r:Integer); Var Xasp,Yasp: Word; Begin GetAspectRatio(Xasp,Yasp); Rectangle(x−r,y−Round(r∗(Xasp/Yasp)),x+r,y+Round(r∗(Xasp/Yasp))); Circle(x,y,r); End; Az eljárásban a Round függvény paramétereként megadott (Xasp/Yasp) hányadost érdemes zárójelbe tenni, mert így elkerülhetjük a egész típusok szorzása során fellépő túlcsordulást. A GetAspectRatio eljárás visszaadja a grafikus meghajtó adott üzemmódjához tartozó torzítási tényezőket, vagyis a téglalap alakú képpont vízszintes ill. függőleges oldalának arányát. Néhány példa ezen értékekre: Üzemmód
Felbontás
Xasp
Yasp
CgaC0 VgaLo VgaMed VgaHi
320x200 640x200 640x350 640x480
8333 4500 7750 10000
10000 10000 10000 10000
A táblázatból kiderül, hogy 640x480-as felbontásban nincs torzítás, ezért ebben a felbontásban nem kell figyelembe vennünk a torzítást. A hiba csak akkor következik be, ha más felbontású monitoron is szeretnénk használni a programot.
44
Szakasz rajzolása
6.3 Szakasz rajzolása Az egyenes szakasz rajzoló algoritmus megadásához elengedhetetlen néhány matematikai fogalom használata. Bresenham algoritmusának levezetése első ránézésre bonyolultnak tűnik, viszont a végső eredmény könynyen programozható. Néhány kritériumnak eleget kell tennie a számítógéppel húzott szakaszoknak: A)
B)
C)
D)
A szakasznak “egyenes vonalnak” kell látszania: Raszteres grafika esetén pontosan csak akkor lenne címezhető a szakasz egy pontja, ha 45°-os szögben vagy vízszintes vagy függőleges irányban halad. Egyéb esetben nekünk kell döntenünk, hogy az ideális egyenestől eltérően melyik raszterpontot választjuk. Pontosnak kell lennie: Ha nem pontosan a kezdőpontból indul és a végpontig tart a szakasz, akkor poligonvonal rajzolása esetén halmozódóan kicsiny hézagok láthatók az egyik szakasz végpontja és a másik szakasz kezdőpontja között. Fedettsége legyen állandó függetlenül a vonal hosszától és hajlásszögétől: Vonal fedettséget fényességként érzékeljük amikor sötét háttér mellett rajzoljuk a szakaszt. Ez a kritérium csak a már említett kedvező esetekben (45°, 0° és 90°) érhető el tökéletesen. Kis felbontású képernyőnél (pl. 320x200) egyik legismertebb szépséghiba a ferdevonalaknál fellépő lépcsőhatás. Ilyen esetekben a vonal fedettségének a megváltoztatása vezethet eredményhez. Tehát a vonal és a környező pontok világosságának változtatásával simán futó vonal hatása érhető el. Életlenebb képet kapunk, de a zavaró sarkosság eltüntethető. Gyors legyen: Mivel igen gyakran használják ezeket, ezért a gyorsaság alapvető elvárás az algoritmussal szemben.
6.3.1 Egyszerű növekményes módszer
y = mx + b alakú egyenletéből indulunk ki. Ekkor rögtön megkapjuk az egyenes y tengelypontját (0,b). Ezek után az m = dy / dx segítségével meghatározzuk, hogy
Legegyszerűbbnek tűnő megoldás, ha az egyenes
mennyit lépjünk balra és mennyit felfelé, hogy megkapjuk az egyenes következő pontját. Hasonlóan járunk el, mint ahogy azt általános iskolában tanultuk a matematika órán. Észrevétlenül egy növekményes algoritmust kaptunk. Az algoritmus nem ad szép képet, hiszen nekünk kell kerekítenünk a kapott (x,y) értékeket, mert az ideális egyenes helyett csak közelítő raszter pontokat kaphatunk. Ezen a hiányosságon próbál segíteni az egyszerű DDA (digitális differenciál-analizátor), mégpedig úgy, hogy a dx-et és dy-t kedvezőbben választja meg. A nagyobb elmozdulás irányában legyen a növekmény egy, tehát Max(dx,dy)=1. A 22. ábra egyszerű DDA-val rajzolt szakaszt mutat.
45
Fejezetek a számítógépi grafikából
22. ábra. Ha az egyik növekmény 1, akkor ez lehetővé teszi, hogy az egyik növekménynél közönséges számlálót használjunk. Procedure DDA (x1,y1,x2,y2,color:integer); Var h o s s z , i: i n t e g e r ; x , y , x n , y n :d o u b le ;{ 8 b yte - o s } B e g in h o s s z := a b s ( x 2 − x 1 ) ; I f a b s ( y 2 − y 1 ) > h o s s z T h e n h o s s z := a b s ( y 2 − y 1 ) ; If hossz<>0 then B e g in x n := ( x 2 − x 1 ) /h o s s z ; y n := ( y 2 − y 1 ) /h o s s z ; x := x 1 ; y := y 1 ; P u t P i x e l( T r u n c ( x + 0 . 5 ) , T r u n c ( y + 0 . 5 ) , c o l o r ) ; F o r i:= 1 to h o s s z d o B e g in x := x + x n ; y := y + y n ; P u t P i x e l( T r u n c ( x + 0 . 5 ) , T r u n c ( y + 0 . 5 ) , c o l o r ) ; End; End; End; 6.3.2 Bresenham-algoritmus, Midpoint-algoritmus Bresenham, J.E. kifejlesztett egy klasszikus algoritmust, amely kijavítja az egyszerű DDA hibáit és alkalmas hardver implementációra is. Később Midpoint (középpont) technikát fejlesztettek ki, amelyre épülő algoritmust először Pitteway, M.L.W. publikált. A középpont technika kimutathatóan ugyanazokat a pontokat produkálja egyenes szakaszok esetén, mint az eredeti Bresenham-algoritmus. Most nem az eredeti algoritmust ismertetjük, hanem áttérünk a Midpoint algoritmusra. Induljunk ki ismét az egyenes
y = mx + b alakú egyenletéből. A megrajzolandó szakasz kezdő és végpont-
jával adott. Tehát készítenünk kell egy Line(x1,y1,x2,y2) eljárást. Legyen dx:= x 2 − x 1 és dy:= y 2 − y 1 . Ekkor m = dy / dx . Tegyük fel, hogy az egyenes meredekségére a következő: 0 ≤ m ≤ 1 tehát az egye-
nesnek a vízszintes tengellyel bezárt α szöge 0° és 45° közé esik, ugyanis m = tg(α ) . Ebből az következik, hogy az x tengely irányú elmozdulás nagyobb mint az y tengelyű elmozdulás. A növekményes algoritmus az x érték eggyel való növelésekor kiszámolja, hogy mennyivel kell változtatni az y koordinátát. Az egyenes ideális nyomvonala valahol a két y koordináta között halad. Az a feladatunk, hogy a két lehetséges y koordináta közül azt válasszuk ki, amelyiknek az ideális egyenestől mért eltérése a kisebb.
46
Szakasz rajzolása
m=
∆y y2 − y1 = ∆x x2 − x1
y = m⋅ x +b ∆y ⋅x+b ∆x F ( x, y ) = A ⋅ x + B ⋅ y + C = ∆y ⋅ x − ∆x ⋅ y + b ⋅ ∆x = 0 y=
A = ∆y,
B = − ∆x,
C = b ⋅ ∆x
y F(x,y)=0 F(x,y)<0
x F(x,y)>0
Ha 0 ≤ m ≤ 1 , akkor ∆x = 1 -re ∆y < 1 lesz (azaz 1 lépés x-ben egynél kisebb lépést jelent y-ban).
NE Q P=(x p, y p )
M E
1⎞ ⎛ Ha d p +1 = F ⎜ x p + 1, y p + ⎟ > 0 , akkor a P után az NE (North East) pontot gyújtjuk ki. ⎝ 2⎠ 1⎞ ⎛ Ha d p +1 = F ⎜ x p + 1, y p + ⎟ < 0 , akkor a P után az E (East) pontot gyújtjuk ki. ⎝ 2⎠ 1⎞ ⎛ Ha d p +1 = F ⎜ x p + 1, y p + ⎟ = 0 , akkor a P után az E pontot gyújtjuk ki (megállapodás ⎝ 2⎠ szerint).
47
Fejezetek a számítógépi grafikából
Ha minden x szerinti lépésben az ( x p +1 , y p +1 ) pontot behelyettesítenénk az F-be, akkor a sok művelet miatt lassú lenne a számítás, ezért próbáljuk meg meghatározni a d p+2 értékét a d p+1 értékéből. Ennek meghatározásához két esetet kell figyelembe vennünk:
a) E-t választottuk az x p+1 pontban 1⎞ 1⎞ ⎛ ⎛ d p + 2 = F ⎜ x p + 2, y p + ⎟ = A ⋅ (x p + 2 ) + B ⋅ ⎜ y p + ⎟ + C 2⎠ 2⎠ ⎝ ⎝ 1⎞ 1⎞ ⎛ ⎛ d p +1 = F ⎜ x p + 1, y p + ⎟ = A ⋅ (x p + 1) + B ⋅ ⎜ y p + ⎟ + C 2⎠ 2⎠ ⎝ ⎝ ∆E = d p + 2 − d p +1 = A = ∆y
b) NE-t választottuk az x p+1 pontban 3⎞ 3⎞ ⎛ ⎛ d p + 2 = F ⎜ x p + 2, y p + ⎟ = A ⋅ (x p + 2 ) + B ⋅ ⎜ y p + ⎟ + C 2⎠ 2⎠ ⎝ ⎝ 1⎞ 1⎞ ⎛ ⎛ d p +1 = F ⎜ x p + 1, y p + ⎟ = A ⋅ (x p + 1) + B ⋅ ⎜ y p + ⎟ + C 2⎠ 2⎠ ⎝ ⎝ ∆NE = d p + 2 − d p +1 = A + B = ∆y − ∆x Meghatároztuk, hogy az x szerint lépkedve, hogyan változik a d az előző x d értékére alapozva. Mostmár csak a d kezdeti értékét kell meghatároznunk. Az első képpontunk a szakasz egyik végpontja, legyen ez ( x1 , y1 ) . 1⎞ ⎛ Az első középpont ⎜ x1 + 1, y1 + ⎟ -nél van, és így 2⎠ ⎝ B B 1⎞ ⎛ d 0 = F ⎜ x1 + 1, y1 + ⎟ = A ⋅ x1 + B ⋅ y1 + C + A + = F ( x1 , y1 ) + A + . 2⎠ 2 2 ⎝ Mivel ( x1 , y1 ) a vonalon van, az F ( x1 , y1 ) = 0, ∆x B = ∆y − . 2 2 A törtek elkerüléséhez szorozzuk meg az d kezdőérékét 2-vel. SHR SHL Így a d 0 = A +
d := 2 ∗d y − d x ; x := x 1 ;y := y 1 ; F o r i:= 1 to d x d o B e g in P u t P i x e l( x , y , c o l o r ) ; If d>0 Then B e g in y := y + 1 ; d := d + 2 ∗( d y − d x ) ; End E l s e d := d + 2 ∗d y ; x := x + 1 ; End; Az algoritmus erőssége abban rejlik, hogy el lehetet kerülni az osztást. Tehát egy olyan eljárást kaptunk, amely egész aritmetikát tartalmaz, nem használunk osztást sőt szorzást sem, mivel a 2-vel való szorzás helyettesíthető léptetéssel.
48
Szakasz rajzolása
Az algoritmust most már csak fel kell oldanunk a kezdeti megszorítások alól. Ugyanis az egyenesnek a vízszintes tengellyel bezárt szöge 0° és 45° közé esik. Ebből az is következik, hogy az x tengely irányú elmozdulás nagyobb mint az y tengely irányába eső. Egyszerű kiegészítéssel – ami az algoritmus elvét nem érinti – az algoritmus teljessé tehető. A kiindulási feladat alapján valójában nyolc eset különböztethető meg, (23. ábra) figyelembe véve a kezdő és végpontok viszonyát is.
y
x
23. ábra. Az eredeti egyenesből tükrözéssel előállítható a többi eset Az ábráról leolvasható, hogy esetenként a koordinátákat nem növelni kell eggyel, hanem csökkenteni, ehhez bevezetjük az sx és sy váltózókat, ezekben a növekményt tároljuk, értékük -1,0 és +1 lehet. Ha a meredekség nagyobb mint 1 akkor a dx és dy szerepe fölcserélődik.
49
Fejezetek a számítógépi grafikából
Ezek után tekintsük meg a teljes eljárást: Function sgn(x:integer):integer; Begin If x>0 Then sgn:=1 Else If x<0 Then sgn:=−1 Else sgn:=0; End; Procedure Midpoint(x1,y1,x2,y2,color:integer); Var dx,dy,sx,sy,s,d,i1,i2 : integer; t: byte; Begin dx:=abs(x2−x1); dy:=abs(y2−y1); sx:=sng(x2−x1); sy:=sng(y2−y1); If dx< dy Then Begin s:=dx; dx:=dy; dy:=s; t:=1; End Else t:=0; d:=2∗dy−dx; i1:=2∗dy; i2:=2∗dx; Putpixel(x1,y1,color); While (x1<>x2) or (y1<>y2) do Begin If d>0 Then Begin If t=1 Then x1:=x1+sx Else y1:=y1+sy ; d:=d-i2; End; If t=1 Then y1:=y1+sy ; Else x1:=x1+sx d:=d+i1; Putpixel(x1,y1,color); End; End; A sng függvény szokás szerint az előjelet adja vissza, a color pedig a vonal színét határozza meg.
50
Kör és ellipszis rajzolása
6.4 Kör és ellipszis rajzolása Bizonyos alkalmazásokban gyakran kell köröket és ellipsziseket rajzolni. Ezen alakzatok előállításának algoritmusát alapfeladatnak tekintjük. Matematikai ismereteink alapján könnyen tudunk algoritmust készíteni, de ha csak egész aritmetikát szeretnénk használni, akkor ez már nehezebb feladat. Tekintsük az origó középpontú R sugarú kör implicit egyenletét:
x 2 + y 2 = R2 . Ebből explicit függvény alakot nyerhetünk, ha két félkörívre bontjuk a kört:
y = ± ( R2 − x 2 ) Elég meghatároznunk az egyik félkörív pontjait, a másik a pontok x tengelyre való tükrözéssel nyerhetők. Ezt az elgondolást tovább fejlesztve – a kör szimmetriáját kihasználva – csak a negyedkör pontjait, sőt akár nyolcadkör pontjait számoljuk ki, a többi tükrözéssel nyerhető. Nem számít speciális esetnek, hogy a középpont az origóban van, hiszen ebből eltolással bármely kör előállítható.
(x,y)
(−x,y)
(y,x)
(−y,x) R 2
(−y,−x)
(−x,−y)
(y,−x)
(x,−y) 24. ábra.
A 24. ábrán látható, hogyan kell elkészítenünk a nyolcadkör alapján a többi körpontot. Könnyen kiszűrhetjük az x=y koordinátájú pontoknál fellépő fölösleges rajzolást, hiszen az egybeesések miatt elég csak 4 pontot fölrajzolnunk
51
Fejezetek a számítógépi grafikából
A következő algoritmusban ezt a sajátos szimmetriát használjuk ki: Procedure Körpont(x,y,color: integer); Begin PutPixel(x,y,color); PutPixel(y,x,color); PutPixel(y,−x,color); PutPixel(x,−y,color); PutPixel(−x,−y,color); PutPixel(−y,−x,color); PutPixel(−y,x,color); PutPixel(−x,y,color); End; Lehetőségünk van arra, hogy a kör paraméteres egyenletrendszeréből induljunk ki:
x ( t ) = R ⋅ cos( t ) t ∈[0,2π ]
y ( t ) = R ⋅ sin( t ),
Ebben az esetben a sin és cos függvény használata okozhat nehézséget, viszont nagyon egyszerű az áttérés az a nagytengelyű és b kistengelyű ellipszisre:
x ( t ) = a ⋅ cos( t ) t ∈[0,2π ]
y ( t ) = b ⋅ sin( t ), y
P(x,y) P’(x’,y’) b t a
x
25. ábra. Az ellipszis és a kör kapcsolata Nem szabad megfeledkeznünk arról, hogy az ellipszis a 25. ábra szerinti a sugarú körből származtatható tengelyes affinitással. Az affinitás tengelye az x tengely. Tehát a kört “összenyomtuk” az x tengelyre. Fontos tudni, hogy a P’ pont koordinátáinál fellépő t paraméter az affinitásnál hozzárendelt P körpont t paraméterével egyezik meg. Tehát a t szög a P körponthoz tartozik és nem a P’ ellipszis pont bezárt szöge az x tengellyel. Ezt a megjegyzést fontosnak tartottuk, mert nagyon gyakran megfeledkeznek erről a geometriai tényről és hibás applikációkat készítenek.
52
Kör és ellipszis rajzolása
affinítás
P( x , y ) ⎯⎯⎯→ P'( x ', y ' ) x = a ⋅ cos( t ) , y = a ⋅ sin( t ) Kör: Ellipszis: x ' = a ⋅ cos( t ) , y ' = b ⋅ sin( t ), Lehetőségünk van arra is, hogy a már jól ismert növekményes módszert alkalmazva készítsünk körrajzoló algoritmust. Felhasználjuk az origó körüli forgatás ponttranszformációját.
53
Fejezetek a számítógépi grafikából
6.4.1 Origó körüli forgatás: Valamely P(x,y) pontot elforgatunk az origó körül α szöggel pozitív (az óra mutató járásával ellentétes) irányba P’(x’,y’) pontot kapjuk, ahol forgatás
⎯→ P'( x ', y ' ) P( x , y ) ⎯⎯⎯ x ' = x ⋅ cos α − y ⋅ sin α , y ' = x ⋅ sin α + y ⋅ cos α . Ez az eredmény könnyen belátható a 26. ábra alapján:
x = d ⋅ cos ω y = d ⋅ sin ω x' = d ⋅ cos(ω + α ) y ' = d ⋅ sin(ω + α )
x' = d ⋅ cos(ω + α ) = d ⋅ (cos ω ⋅ cosα − sin ω ⋅ sin α ) = = d ⋅ cos ω ⋅ cosα − d ⋅ sin ω ⋅ sin α = = x ⋅ cosα − y ⋅ sin α
y P’(x’,y’)
d P(x,y)
α
d
ω x 26. ábra.
54
Kör és ellipszis rajzolása
Érvényesek az alábbiak:
x = d ⋅ cos ω y = d ⋅ sin ω x ' = d ⋅ cos(ω + α ) y ' = d ⋅ sin(ω + α ) x ' = d ⋅ cos(ω + α ) = d ⋅ (cos ω ⋅ cos α − sin ω ⋅ sin α ) = = d ⋅ cos ω ⋅ cos α − d ⋅ sin ω ⋅ sin α ) = = x ⋅ cos α − y ⋅ sin α
Hasonló számítással adódik: y ' = d ⋅ sin(ω + α ) = d ⋅ (sin ω ⋅ cos α + cos ω ⋅ sin α ) = = d ⋅ sin ω ⋅ cos α + d ⋅ cos ω ⋅ sin α = d ⋅ cos ω ⋅ sin α + d ⋅ sin ω ⋅ cos α = x ⋅ sin α + y ⋅ cos α Ezt az eredményt felhasználva tudunk körgenerátort készíteni. Ugyanis egy kicsiny θ szöggel forgatjuk el a P pontot majd az elforgatottat újból elforgatjuk és így tovább, amíg meg nem kapjuk a kívánt mennyiségű körpontot. Mivel θ általában kicsiny ezért sin θ és cos θ viszonylag könnyen előállítható, és ezek az értékek konstansként szerepelnek bármely adott körsugár mellett. Nézzük az algoritmus egyenlet párját:
x n +1 = x n ⋅ cos θ − y n ⋅ sin θ y n +1 = x n ⋅ sinθ + y n ⋅ cos θ A θ megválasztásánál ügyelni kell, hogy szimmetrikus alakzatot kapjunk. Ezt úgy tudjuk elérni, hogy 90 ° a θ egészszámszorosa legyen. Sajnos továbbra is probléma a valós számok használata ebből kifolyólag az algoritmus lassú, viszont a módszer kiterjeszthető a többi kúpszeletre is.
55
Fejezetek a számítógépi grafikából
6.4.2 A midpoint (középonti) algoritmus Bresenham nevéhez fűződik szintén egy olyan körgeneráló algoritmus, amely eleget tesz azoknak a kritériumoknak, hogy egész aritmetikát használ és alkalmas akár hardver implementációra is. Szintén növekményes algoritmust kapunk, tehát (xi+1,yi+1) kiszámítását az (xi,yi) meghatározása után nyerjük. Az algoritmus során a második nyolcadot tárgyaljuk, a többi pont meghatározható a már ismertetett tükrözésekkel.
⎡
Tekintsük azt az esetet amikor x ∈ ⎢ 0,
⎣
R⎤ ⎡ R⎤ ⎥. ⎥, y ∈ ⎢ R, 2⎦ 2⎦ ⎣
A stratégiánk az, hogy két pixel pont közül azt válasszuk ki, amelyik közelebb áll a kör ideális nyomvonalához. Kiszámítjuk a kör 0-ra rendezett implicit egyenletéből kapott függvény helyettesítési értékét, a két pixel pont által meghatározott szakaszközéppontnál (midpoint), s a kapott érték előjelétől függően választunk a határpontok közül. A jobb érthetőség kedvéért vizsgáljuk meg az 27. ábrát.
P(xp,yp)
E M
ME SE MSE
Előző pont
Aktuális pont Következő választás pont választás
27. ábra. Az előző pont a P(xp,yp) volt, a következő körpontot az E és SE közül kell kiválasztanunk. Tekintsük az említett függvényt:
F (x, y ) = x 2 + y 2 − R 2 Ez a függvény 0 ha a középpont illeszkedik az ideális nyomvonalra, pozitív ha a pont kívül van a körön és negatív ha belül. Pl. az M középpont belül van, tehát a helyettesítési értéke negatív, ezért az E pontot választjuk. Ahogy a szakaszrajzolónál tettük, legyen a döntési változók az i. lépésben d(i). Az előző P(xp,yp) pont alapján d(i) meghatározható az M pontban: (1)
(
)
2
2 1⎞ 1⎞ ⎛ ⎛ d ( i ) = F ⎜ x p + 1, y p − ⎟ = x p + 1 + ⎜ y p − ⎟ − R 2 . ⎝ ⎝ 2⎠ 2⎠
56
Kör és ellipszis rajzolása
Felhasználjuk, hogy d(i) -ből két eset vezethető le: I. Ha d(i) < 0 akkor az E pontot választjuk. A következő pont esetén az (i+1). lépésben legyen a döntési változók d(i+1).Az ME középpontot vizsgáljuk. Az előző P(xp,yp) pont alapján d(i+1) is meghatározható. A növekményt ∆E-vel jelöljük:
(2)
(
2
)
2 1⎞ 1⎞ ⎛ ⎛ d ( i + 1) = F ⎜ x p + 2, y p − ⎟ = x p + 2 + ⎜ y p − ⎟ − R 2 ⎝ ⎝ 2⎠ 2⎠ ∆E = ( 2 x p + 3) d ( i + 1) = d ( i ) + ( 2 x p + 3) ,
II. Ha d ( i ) ≥ 0 akkor az SE pontot választjuk, ekkor d(i+1) kiszámítása változik. Az MSE középpontot vizsgáljuk. A növekmény ebben az esetben ∆SE-vel jelöljük:
(3)
(
)
2
2 3⎞ 3⎞ ⎛ ⎛ d ( i + 1) = F ⎜ x p + 2, y p − ⎟ = x p + 2 + ⎜ y p − ⎟ − R 2 ⎝ ⎝ 2⎠ 2⎠ d ( i + 1) = d ( i ) + ( 2 x p − 2 y p + 5) , ∆SE = ( 2 x p − 2 y p + 5)
A képletek megadják az algoritmust, hogyan lehet egy közbülső d(i)-hez kiszámítani az utána következő d(i+1)-et. Hiányzik a kezdőérték meghatározása. Az (1) egyenletbe behelyettesítjük a kezdő körpont (0,R) koordinátáit az yp és xp koordináták helyébe. Ekkor a következő összefüggést kapjuk: 2
(4)
1⎞ 5 1⎞ 1⎞ ⎛ ⎛ ⎛ d (1) = F ⎜1, R − ⎟ = 1 + ⎜ R − ⎟ − R 2 = 1 + ⎜ R 2 − R + ⎟ − R 2 = − R ⎝ ⎝ ⎝ 4⎠ 4 2⎠ 2⎠
Ezek után megadjuk a körrajzoló eljárást: Procedure MidpointCircle(R,,color: integer); Var x,y : integer; d: real; Begin x:=0; y:=R; d:=5/4−R; KorPont(x,y,color); While y>x do Begin If d<0 Then Begin d:=d+2∗x+3; x:=x+1; End Else Begin d:=d+2∗(x−y)+5; x:=x+1; y:=y−1; End; KorPont(x,y,color); End; End; Az algoritmus hátránya, hogy a d változó valós típusú. Egy egyszerű program transzformációval megszüntet-
1 és ezzel d-t 4 1 1 h + -re cseréljük. Ekkor az inicializálás h:= 1 − R lesz, és a ciklusmagban a feltétel h < − -re válto4 4 zik. Mivel h egész értékről indul és egész értékkel növekszik, ezért ezt a feltételt megváltoztathatjuk h < 0 -
jük a d változó inicializálásánál fellépő osztást. Bevezetünk egy új döntési változót: h:= d −
ra. Ezek után nézzük, a már csak egész értékekkel dolgozó algoritmust:
57
Fejezetek a számítógépi grafikából
Procedure MidpointCircle(R,,color: integer); Var x,y,h : integer; Begin x:=0; y:=R; h:=1−R; KorPont(x,y,color); While y>x do Begin If h<0 Then Begin h:=h+2∗x+3; x:=x+1; End Else Begin h:=h+2∗(x−y)+5; x:=x+1; y:=y-1; End; KorPont(x,y,color); End; End;
Az algoritmus által generált második nyolcad
Tükrözéssel generált első nyolcad
28. ábra. A 28. ábra jól mutatja, hogy hogyan generálta a pixelpontokat a körpontokat generáló növekményes középponti algoritmus. Ahogy fentebb említettük az első nyolcad pontjait állítjuk elő, a többi körpont pedig a koordináta tengelyekre és a szögfelező egyenespárra történő tükrözéssel származtatható.
58
Rekurzió:
7. Rekurzív görbék és a teknőc grafika A téma kifejtéséhez hozzátartozik a LOGO nyelv ismertetése, melyre ezen írás keretein belül nem vállalkozunk. A LOGO programozási nyelv talán legismertebb és legnevezetesebb része a teknőc grafika, melyet szintén ismertnek feltételezünk. A Logo kifejezetten rajzorientált és megfelelően strukturált. Megtehetjük, hogy minden utasítás eredménye azonnal látható legyen interaktívan lépésenként vezérelve teknőcünket. Utasításainkat csomagolhatjuk is eljárások írásával és így tehetjük próbára ötleteinket. A strukturáltság a Logo egyik legfőbb jellemzője és pedagógiai értéke. Bemutatjuk, hogy milyen szoftver eszközök segítségével használjuk a Logo-t a rekurzió oktatásában.
7.1 Rekurzió: Akkor mondjuk valamiről, hogy rekurzív, ha saját magát is tartalmazza, önmagával van definiálva. Rekurzióval nem csak a matematikában, hanem a mindennapi életben is találkozhatunk. Ki ne próbálta volna ki, hogy egy tükörrel a kezében áll a tükör elé, vagy egy kamerával felvesszük a megjelenő kameraképét a televízión. A rekurzió különösen hasznos eszköze a matematikai definícióknak. A természetes számok, a binárisfa és n bizonyos függvények példája is ezt mutatja. Gondoljunk az ⎛⎜ ⎞⎟ -ra vagy a faktoriális definíciójára. ⎝k⎠ Rekurzió ereje nyilvánvalóan az, hogy véges sok állítással végtelen sok dolog definiálására nyílik lehetőség. Ugyanígy végtelen sok számítási lépést is ki lehet fejezni egyetlen, véges, rekurzív programmal anélkül, hogy benne explicit ciklust szerepeltetnénk. A rekurzív algoritmusok használata elsősorban ott indokolt, ahol a megoldandó probléma, a kiszámítandó függvény eleve rekurzív módon definiált. A rekurzió használatának természetes eszköze az eljárás, függvény vagy szubrutin. Ennek megfelelően egyrészt beszélhetünk közvetlen rekurzióról amikor a P rekurzív függvény önmagát hívja. Másrészt beszélhetünk közvetett rekurzióról amikor a P függvény egy Q függvényt hív és a Q függvény visszahivatkozik a P-re. Általánosan P rekurzív programot P-t nem tartalmazó Si alaputasításoknak és magának a P−nek valamilyen összetétele alkotja, gondolva a befejeződésre azaz nem rekurzív részre is: pl. legkézenfekvőbb a befejezés biztosítására egy n paraméter bevezetése és mindig n-1 paraméterérték megadása P rekurzív hívásaiban: P(n)≡ ha n>0
akkor P[Si, ,P(n-1)]
{ Rekurzív rész}
különben B
{ Nem rekurzív rész}
(N. Wirth: Algoritmusok + adatsruktúrák = programok) A gyakorlatban nemcsak a rekurzió végességét, hanem a mélységét is ellenőrizni kell. Ugyanis a rendelkezésünkre álló verem mérete hamar elégtelennek bizonyulhat. Ez a téma rögtön arra is figyelmeztet bennünket, hogy megvizsgáljuk mikor ne használjunk rekurziót. Erről bővebben Zsakó László, Szlávi Péter : Rekurzió munkájában olvashatunk, amely a jól ismert és méltán népszerű µlógia sorozat 4. tagja.
7.2 A rekurzív görbék: A rekurzív görbék tanulmányozása során egyrészt a rekurzió fogalmának megértését is elősegítjük, másrészt a Logo mélyebb elsajátításához is segítséget kapunk, harmadrészt egy speciális szabadszoftver használatának segítségével a fraktálok, Mandelbrot és Júlia halmazok készítésébe is betekintést nyernek az olvasók. A rekurzív görbék, ábrák megadása történhet egyszerűen úgy, hogy megadjuk az 1., majd a 2., 3. stb. elem görbéjét, és a rajz sugallja számunkra a képzés szabályát. Természetesen az így keletkezett rajzokból meg tudjuk adni a rekurzív definíciót is. Ez az a pont, ahol többféleképpen járhatunk el, mert figyelembe kell vennünk, hogy milyen rajzoló eszközzel akarjuk majd a görbét előállítani. Pontosabban fogalmazva használhatunk hagyományos grafikát pl. Turbo Pascal Graph Unit-ját vagy irányított grafikus kurzort. A tapasztalatok szerint sokkal egyszerűbben definiálhatók a rekurzív görbék a Logo-ban, ahol a Teknőc grafika rendel59
Fejezetek a számítógépi grafikából
kezésünkre áll. Saját magunk is készíthetünk olyan Unit-ot, amely a grafikus kurzor irányítását lehetővé teszi. Emellett választhatjuk a CGA grafikus kártya lehetőségeire támaszkodva a Turbo Pascal ősrégi Graph3 Unit-ját, amely a Pascal első grafikus kiterjesztése volt, és a teknőc grafikát támogatta. Egyszerűbb és jobb megoldás egy létező Logo implementációt használni vagy magunk készíteni. Ez utóbbit követték Egerben az Eszterházy Károly Tanárképző Főiskola Számítástechnika Tanszékén is. Hernyák Zoltán OTDK 1.díjas munkája Robot programot tartalmaz, amelyet valós tanítási körülmények között kipróbáltak és teszteltek. A program megvalósítja a teknőcgrafikát, amit interaktívan és programszerűen is használhatunk. Egy érdekes megoldás arra nézve, hogy alkalmas a Pascal programozási nyelv bevezetésére is, és megpróbálja hordozni mind a Pascal, mind a Logo előnyeit. Emellett még használhatjuk a Bert Tyler Fractint 19.5 verzióját, amely egy csodálatosan megírt fraktál rajzoló program. A szoftver szabadon felhasználható, sőt a C nyelvű forráskód is rendelkezésre áll. A programmal nagyon egyszerűen és gyorsan készíthető Mandelbrot és Júlia halmaz valamint még számtalan egyéb fraktál és rekurzív görbe. A rekurzív görbék a teknőcgrafikához hasonlóan relatív vonatkoztatási rendszerben definiálhatók. A Fractint program tekinthető egy speciális rajzoló eszköznek is, amellyel gyönyörű ábrák készíthetők. Az elmúlt évtizedben már hazánkban is számos kiállítást rendeztek a Mandelbrot halmazok ábráiból. Első ránézésre talán öncélú grafikák ezek, de a filmipar bebizonyította ennek ellenkezőjét. Többek között az Indastrial Light & Magic, Pixar és a George Lucas filmstúdió is használja ezen fraktálokat, hogy mesterségesen generáljanak különböző térbeli felületeket. Ilyen felület lehet például egy havas táj, egy fémbolygó vagy egy fenyőerdő.
7.2.1
Fraktálok:
A rekurzív módon megadott görbe n-ed rendű ábrái egy sorozatot alkotnak, és ha ez konvergens, akkor ennek a határértékét nevezzük határgörbének. Ezek a határgörbék lefedik a sík egy tartományát de mégis végtelen hosszúak. Mondhatjuk egy dimenziónál több de két dimenziónál kevesebb kiterjedésűek, vagyis úgynevezett tört dimenziójúak. Az ilyen alakzatokat nevezzük fraktáloknak. A fraktálok különösen akkor kerültek előtérbe, amikor Benoit B. Mandelbrotról (IBM Thomas J. Watson Kutatóközpont tudósa) elneveztek egy csodálatos fraktált. Ezzel a számítógép adta lehetőségekre támaszkodva kezdetét vette egy világ őrület, ami talán azóta is rendületlen erővel és lelkesedéssel tart és egyre több követőre talál. Tekintsünk két példát ezen fraktálokból.
60
A rekurzív görbék:
29. ábra. Egy bokor
61
Fejezetek a számítógépi grafikából
30. ábra. Egy érdekes csiga Nézzünk végezetül egy példát arra, hogyan lehet definiálni egy rekurzív görbét a Fractint-ben és a Hernyák Zoltán által megadott Robot nyelven Válasszunk egy nevezetes görbét, amelynek konkrét gyakorlati haszna is van.
62
A rekurzív görbék:
7.2.2
Hilbert görbe:
A Hilbert görbe segítségével be tudjuk járni a sík egy tetszőleges téglalap alakú területének minden pontját foltszerűen. Ezek után használva valamilyen egyszerű tömörítést (Pl.: Run-length encoding, RLE) nagyobb hatásfokkal tudunk egy képet tömöríteni, hiszen a képek többnyire foltszerűen tartalmaznak azonos színű pontokat és nem pedig sorfolytonosan. Tekintsük tehát a következő definíciót:
X : = − YF + X F X + F Y − Y : = + X F − YF Y − F X +
α : = 90 o Ahol α az elfordulás szöge, a + jelenti fordulás α szöggel balra, a − jelenti fordulás α szöggel jobbra, az F jelenti az egységnyi előrelépést. A kiindulási irány Kelet. Nézzük meg ugyanezt a definíciót a Robot programban. Az X(i,h) eljárást adjuk meg, az Y(i,h) értelemszerűen adódik. Eljárás x(i,h) Ekezdet Ha i>0 jobbra(90) y(i-1,h) előre(h) balra(90) x(i-1,h) előre(h) x(i-1,h) balra(90) előre(h) y(i-1,h) jobbra(90) Hvege Evege Ennek alapján, egyszerűen elkészíthető a görbe ábrája.
31. ábra. Az első- és másodrendű Hilbert-görbék
63
Fejezetek a számítógépi grafikából
Ehhez és az előzőekhez hasonló ábrákat készíthetünk rendkívül egyszerűen, csak a görbe megadására koncentrálva a Fractint segítségével. Pontosabban nem kell törődnünk a rajzolással, hogy kifér-e a képernyőre a kapott eredmény, hogy hova pozícionáljuk a teknőcöt, hogy mekkora legyen az egységnyi elmozdulás. Ezeket a feladatokat mind elvégzi helyettünk a Fractint hagyva minket pusztán a feladatra összpontosítani. Természetesen ha a rekurzív program előállítása és a teknőc grafika használata a cél, akkor használhatjuk a fentebb említett Robot programot, amely szabadon elérhető a főiskola Számítástechnika Tanszékén. A fraktálokkal kapcsolatban rengeteg érdekes információt találhatunk az alábbi WWW címen: http:// spanky.triumf.ca Ezen a címen a Fractint free szoftver is megtalálható és szabadon letölthető.
32. ábra. Munkában a Teknőc egy magasabbrendű Hilbert-görbén
64
Irodalom
8. Irodalom Magyarnyelvű könyvek: • NEWMAN,W.M., SPROULL,R.F.: Interaktív számítógépes grafika, Műszaki Kiadó, 1985, Budapest. ISNB 963 10 6421 2 • PURGATHOFER, Werner: Grafikus adatok számítógépes feldolgozása, Műszaki Kiadó, Budapest, 1988 ISBN 963 10 7661 X • WEBER, Markus: IBM-PC 3D-grafika, Elmélet és gyakorlat, IWT-Novotrade, Budapest, 1987 ISBN 963 02 4693 7 • SZÉKELY, Vladimír, POPPE, András: A számítógépes grafika alapjai IBM-PC-n. Computer Books, Budapest, 1993 • PIRKÓ, József: 3D perspektívikus grafika IBM-PC-n Turbo Pascalban, LSI Alkalmazástechnikai Szolgálat, Budapest, 1988 • SZÉKELY, Vladimír, BENKŐ, Tiborné: Karakterisztikák - diagramok - nomogramok, Műszaki Könyvkiadó, Budapest, 1975 • JUHÁSZ Imre :Számítógépi geometria és grafika Miskolci Egyetemi Kiadó, 1993 • KRAMMER Gergely: Turbo Pascal grafika - összefoglaló ELTE TTK, µlógia füzetek 13 • SZABÓ József : Számítógépi grafika KLTE Egyetemi jegyzet, 1986 • SZABÓ József : Feladatok a számítógépi grafikából KLTE Egyetemi jegyzet, 1992 • FÜZI János: 3D grafika és animáció IBM PC-n, ComputerBooks, 1995 • SZÉKELY, Vladimir: Képkorrekció, hanganalízis, térszámítás PC-n, ComputerBooks, 1994 • LÁSZLÓ József : A VGA-kártya porgramozása pascal és assembly nyelven, ComputerBooks, 1995
Angol nyelvű könyvek:
• NEWMAN,W.M., SPROULL,R.F.: Principles of Interactive Computer Graphics, Mc Graw-Hill, 1973 • FOLEY, J.,D., van DAM, A., FEINER, S.,K., HUGHES, J.,F. : Computer Graphics, Principles and Practice Addison-Wesley, Reading, Mass., 1990. • FOLEY, J.,D., van DAM, A., FEINER, S.,K., HUGHES, J.,F. : Computer Graphics, Principles and Practice, Second edition in C, Addison-Wesley, Reading, Mass., 1996.
• ROGERS,D.F., ADAMS,J.A.: Mathematical elements for Computer Graphics, Mc Graw-Hill, New York, 1976, 2.nd.ed. 1990 • SALMON,R., SLATER, M.: Computer Graphics Systems and Concepts, AddisonWesley, 1989. 65
Fejezetek a számítógépi grafikából
• WATT, Alan: 3D Computer Graphics, Addison-Wesley, Wokingham, England, 1993. • KAY, David C., LEVINE, John R. :Graphics File Formats, Windrest/McGraw-Hill, 1992.
66