PostScript

Alakzatok rajzolása

Alapelvek

A PosrScript célja elsõsorban grafika rajzolása a lapra. A PostScript egyik elegáns megközelítése az, hogy még a szöveg is a grafika egy fajtája. A fõ feladat, amit el kell sajátítani, útvonalak szerkesztése, amelyeket a kép létrehozásához használhatunk.

Elemi sorrend alakzatok rajzolásához, kitöltéséhez:

Amint késõbb látni fogjuk, ez az elemi sorrend módosítható bonyolultabb képek szerkesztésére.

Egy doboz rajzolása

Az elsõ példában egy négyzet alakú dobozt rajzolunk a lap bal alsó sarkához. Egy függvény definíciójával indítunk, hogy át tudjunk váltani hüvelykrõl a Postscript egységére, a pontra - egy pont egy hüvelyk hetvenketted része). Az átváltás egyszerû, csupán hetvenkétszeresére szorozzuk a hüvelykek számát. Így a következõ függvényt kapjuk:

/inch {72 mul} def

Hogy valóban megrajzoljuk a négyzetet, egy új utat kezdünk és a pozíciót egy hüvelyknyire mozgatjuk mindkét margótól. Ezt a következõ kódrészlettel érhetjük el:

newpath 1 inch 1 inch moveto

Ebben a pillanatban az út csak a (72,72) pontból áll. A lineto operátor segítségével innen elvezetõ szakaszokat adunk hozzá - ez a mûvelet a pozícióból a megadott ponthoz húz egy szakaszt, és a pozíciót is a megadott helyre állítja. Így húzzuk meg a négyzet három oldalát:

2 inch 1 inch lineto 2 inch 2 inch lineto 1 inch 2 inch lineto

Az utolsó oldalt hozzáadhatjuk úgy, hogy a Postscripttel bezáratjuk az utat egy szakasszal, a closepath operátor ezt teszi. Ez a mûvelet kimondottan hasznos, ha zárt alakzatra van szükségünk vagy ki akarunk tölteni egy alakzatot. Ahogy lezártuk az útvonalat megrajzolhatjuk a stroke mûvelettel. Végül, lapdobással zárjuk a példát (pl. egy nyomtatón). A PostScript mûvelete a lapdobásra a showpage:

closepath stroke showpage

Megtekintheted a teljes példát egyben is, ha úgy tetszik.

Finomítások

A lineto mûvelet abszolút kordinátákkal dolgozik. Vagyis a 72 72 lineto kód egy szakaszt jelöl az aktuális pontból a (72, 72) pontba ***user space***. Egy négyzet rajzolásakor megfelelõbb eltekinteni a csúcsok abszolút koordinátáitól és az oldalak hosszát megadni. A PostScript szerencsére rendelkezik a mkûvelet másik változatával, amelyik relatív koordinátákat használ. Ez a rlineto operátor, amely a megadott koordinátákat az aktuális pozíció koordinátáihoz adja. Például 10 20 rlineto egy szakaszt húz az aktuális ponttól 10 pontra jobbra és 20 pontnyira fölfelé. Ezzel ellentétben 10 20 lineto olyan szakaszt húz, ami mindig a (10, 20) pontban végzõdik.

Íme, az elõzõ példa, csak a lineto helyett következetesen rlineto mûveletet használtunk:

1 inch 0 inch rlineto 0 inch 1 inch rlineto -1 inch 0 inch rlineto

Ez az új példa ugyanazt az ábrát rajzolja. Az, hogy a koordináták változását írtuk le, könnyebben elképzelhetõvé tette hogy mit is csinálunk, és azzal az elõnnyel is jár, hogy ugyanaz a kód ugyanolyan három vonalat tud húzni eltérõ helyre. Vegyük észre, hogy a negatív x relatív koordináta balra mozgat, y koordináta esetében pedig lefelé.

Alakzatok kitöltése

Egy alakzatot kitölteni ugyanolyan könnyû, mint megrajzolni. Megszerkeszted az útvonalat a szokásos módon, majd a végén nem a stroke mûveletet hívod meg, hanem a fill operátort, amely kitölti az útvonal által határolt területet az aktuális beállításokkal. Ha mintázattal kívánod kitölteni az alakzatot, kcisit több trükközésre lesz szükséged, amit késõbb tárgyalunk. A fenti négyzet a példa a kitöltésre, csupán a stroke mûvelet helyett a fill mûveletet hívjuk meg.

A kitöltés egy egyszerû szabály szerint dönti el, az oldal mely részei esnek az útvonalon belül illetve kívül (az elõbbiek kerülnek kifestésre) - a szabályt a Programming Language Reference Manualban találod. Vedd figyelembe, hogy tetszõlegesen bonyolult alakzatok kitölthetõek, amennyiben a PostScript értelmezõd elegendõ memóriával rendelkezik. Konnyeden kitolthetsz arnyakat, sõt, bizonyos mintákat is, de egy területet egy bonyolult képpel borítása néhány sajátos trükköt igényel, amelyekrõl késõbb lesz szó.

Vastagság és árnyékolás

A Postscriptben a vonalakat tekintheted úgy, hogy egy adott vastagságú és árnyalatú toll húzza õket. Nem csupán egészen fekete és egy pont vastag tollakat használhatsz, a PostScript két könnyen kezelhetõ mûveletet biztosít ezen jellemzõk megváltoztatására.

A setgray mûvelet a vonalak rajozlásához, alakzatok kitöltéséhez használt tinta intenzitását állítja be - valójában mindenre késõbbi jelre hat, ami a papírra kerül. sets the intensity of the ink used in drawing lines and filling shapes (actually, setgray affects all subsequent markings made on the page). Egy numerikus argumentuma vam, amelynek értéke 0 és 1 között lehet. '0' feketét jelöl, az '1' pedig fehéret, a köztes értékek pedig a szürke különféle árnyalatait.

A setlinewidth mûvelet épp azt teszi amire a neve alapján gondolunk: beállítja a vonalak vastagságát. Ennek is egy szá, a paramétere, ami a vonalvastagság pontokban mérve. A mûvelet kihat minden a késõbbiekben meghúzott (stroked) vonalra.

Mindkét mûvelet a késõbb papírra kerülõ jelekre hat, azonban nem fejtik ki hatásukat az útvonalra amíg kirajzolásra nem kerülnek (stroke vagy fill segítségével). Így nem állíthatod egy útvonal két részét különbözõ vastagságúra vagy árnyalatúra - ugyanolyan lesz az egész, mivel egyszerre kerülnek a papírra. Mindkét mûvelet változtatja a grafikus állapotot, amit el lehet menteni a gsave mûvelettel, és vissza lehet állítani a grestore mûvelettel.

Kidolgoztam egy példát mindkét mûveletet használva, sõt, a gsave és grestore mûveletek használatát is bemutatom.