Asymptote

A Wikipédiából, a szabad enciklopédiából

Az asymptote 2- vagy 3-dimenziós grafikus ábrák előállítására készült programozási nyelv. Az ábra koordinátarendszerben, matematikai eszközökkel készül.

A 2- vagy 3-dimenziós pont alap adattípus. A pontok összeköthetők egyenessel vagy harmadfokú spline-nal (Bézier-görbével). Az utóbbi a görbe törését minimalizálja a csatlakozási pontokban kör, ellipszis, parabola, stb. rajzolása esetén. A geometriai transzformációkat (eltolás, nagyítás, tükrözés, stb.) beépített függvények végzik, mint ahogyan magát a rajzolást is.

A rajz vektorgrafikus, a program kimenete .eps (encapsulated postscript).[1] Az asymptote be tud olvasni külső .eps file-okat, és a postscript-utility-khez hasonló műveletet végezni velük és a programmal készült ábrával (nagyítás, elforgatás, összeillesztés, keretezés, stb.).

A nyelv strukturált és objektumorientált, legjobban a C++-hoz ill. a Javához hasonlít. Az asymptote-fordító a Pascal p-kódjához hasonlóan belső kódra fordít, majd azt interpretálja.

A nyelv elérhető Linux-ban, MacOS-ben és Windows-ban egyaránt.

Az asymptote programnyelv[szerkesztés | forrásszöveg szerkesztése]

A nyelv mind szintaxisában, mind szemantikájában a C++ ill. Java nyelvre hasonlít egy fontos kivétellel: ez a paraméterátadás.

Paraméterátadás[szerkesztés | forrásszöveg szerkesztése]

Az asymptote-ban a hívó névvel is átadhatja a paramétert fv(paramnév=érték) alakban. A C-szerű és a névvel megadott paraméterek egy híváson belül is keverhetők.

A paraméter opcionális lehet; ilyenkor az alapértékét a hívott függvényben kell megadni. A függvényhíváskor típusillesztés van, így opcionális paraméterek lehetnek a kötelezők előtt/között is, ha különböző típusúak.

A beépített függvények kiterjedten használják a fenti lehetőségeket, és a default értékek megválasztása igen jó, így ritkán kell sok paramétert megadni (ami a grafikus programokat gyakran teszi áttekinthetetlenné).

Alap adattípusok[szerkesztés | forrásszöveg szerkesztése]

Típus Jelentés
void Azt adja meg, hogy a függvénynek nincs visszatérési értéke (azaz eljárás), ill. nincs paramétere. Változó nem lehet void típusú, mutató pedig nincs az asymptote-ban.
bool Értéke true vagy false lehet.
bool3 Értéke true, false vagy default lehet.
int
real
Aritmetikai típusok, melyek minden programnyelvben megtalálhatók. A C-ben megengedett műveletek végezhetők, kivéve a bit- és mutatóműveleteket, és int esetén a postfix ++ és -- műveletet (vagyis ++i helyes, i++ hibás). A ^ a hatványozás művelete. Az intreal konverzió automatikus (paraméterillesztéskor is!), a fordítottja viszont nem: az (int) konverziós műveletet ki kell írni.
pair Komplex szám vagy sík-koordináta (a használat helyétől függően). Két real típusú komponensből áll. Szintaxis: pair komplex = (5.0,-3.2); A szorzás ill. osztás komplex számként történik. Mindkét jelentésű használatot beépített függvények segítik (pl. a normál alakú és iránytényezős koordináta átszámítását).

A -- művelet két síkbeli pontot egyenessel, a .. Bézier-görbével köt össze. A művelet eredményének típusa path (lásd alább).

triple Térkoordináta három real komponensből. A -- és .. itt is alkalmazható.
string Szöveg. Az aposztrófok között (') megadott szöveg jelentése azonos a C-belivel (ott dupla idézőjelek (") között kell megadni). A dupla idézőjelek közötti szöveg LaTeX-formázást tartalmaz(hat).

Az összeadás (+) a konkatenáció (string összefűzés) művelete. A többi stringműveletet beépített függvények végzik.

A string típusúra konvertált érték alapformátumú (ez értelemszerűen típusonként változik). Más formátumot a beépített format függvénnyel lehet előállítani. A függvény formátum-paramétere a C-ben megszokott alakú.

Beépített objektumok[szerkesztés | forrásszöveg szerkesztése]

Típus Jelentés
path Egy összefüggő (a toll felemelése nélkül meghúzható) ábrarészlet. Három információt tárol:
  • az ábrát alkotó pontokat (vagyis egy pair[] típusú változót)
  • a pontok összekötésének módját pontpáronként (egyenes vagy Bézier-görbe)
  • zárt-e az objektum

A -- és .. művelet path-ra is definiált (operátor overload), így a pontok elé ill. után lehet újabb pontokat tenni. A zárt objektumot speciális utolsó „pont”-ként sajátpath--cycle alakban lehet megadni (az első és utolsó pontot nem szabad „kézzel” összekötni). A fill beépített függvény csak az így megadott zárt objektumot tudja kiszínezni.

path[] Egy teljes grafikus ábra, mely egy utasítással kirajzolható. Nagyobb ábrák esetén célszerű lehet részekre vágni a rajzot: ilyenkor a teljes ábra több path[]-ban van (természetesen lehet path[][]-ban), és több utasítás rajzolja ki.

A ^^ művelet path-okból hozza létre a path[]-t (nem összefüggő ábra). Ez csak a kényelmet szolgálja, ugyanez a művelet tömbelemenként is végrehajtható.

pen Az ábra grafikai paraméterei. Ilyen pl. a szín. A gyakran használt színekre beépített pen típusú változók vannak (pl. red, yellow, stb.). Az ábrához több toll is használható; pl. ilyenkor lehet célszerű több path[] típusú változót használni.

A vonal (path[]) legfontosabb grafikus tulajdonságai: a vonalvastagság és a vonal típusa (többféle beépített szaggatott vonal van).

A betűk tulajdonságai: fontméret, font típus, alapvonal-igazítás, átlátszóság, stb. Zárt ábra színezésekor: színezési minta, átlátszóság[2].

A toll tulajdonságai postscript-szinten kerülnek az ábrába.

picture RajzVászon. A legmagasabb szintű objektum, mely az ábra minden grafikus és szöveges elemét tartalmazza. Új ábrarészlet rajzolásakor a koordináta-határai automatikusan nőnek (akár negatív irányba is). Egyszerű ábráknál) megadható fix méret is; ez esetben a picture és a frame között nincs különbség. A picture és frame alak egyikből másikba transzformálható.
frame A rajzvászon postscript-koordinátás alakja. Új ábrarészlet rajzolásakor a régi objektumok koordinátái változnak, hogy a vászon mérete állandó maradjon. Ugyanazokkal a függvényekkel használható, mint a picture, bár általában kényelmesebb picture típusba rajzolni. Az elkészült ábrát viszont rendszerint egyszerűbb keretezni, elforgatni, stb. frame alakban.

Beépített görbék[szerkesztés | forrásszöveg szerkesztése]

A függvények a graph csomagban vannak, vagyis a használat előtt ki kell adni az

import graph;

utasítást.

  • path Circle(pair középpont, real sugár, int pontszám=400);
    A pontszám azt adja meg, hogy az asymptote hány pontból húzza meg a kört. A default érték 400.
  • path Arc(pair középpont, real sugár, real kezdőszög, real végszög, bool irány, int pontszám);
    Körívet húz a két megadott szög között.
  • path polygon(int élszám);
    Szabályos zárt sokszög. Ellipszist az X- vagy Y-irányban kicsinyített/nagyított körrel lehet húzni.

Geometriai transzformációk[szerkesztés | forrásszöveg szerkesztése]

  • shift (eltolás)
  • xscale, yscale, scale (nagyítás X-, Y- ill. mindkét irányban)
  • rotate (forgatás)
  • reflect (tükrözés)

A transzformációt a * művelet végzi (operátor overload), mely nem kommutatív: első paramétere transform típusú (a fenti függvények mind ilyenek), a második path vagy path[]. A transzformáció postscript szinten történik.

Rajzoló függvények[szerkesztés | forrásszöveg szerkesztése]

  • dot: kirajzol egy pontot (tesztelésre ill. geometriai ábrák rajzolásakor hasznos)
  • draw: kirajzol egy ábrát. Paraméterként megadható az ábra (path vagy path[]; egyedül ez a paraméter kötelező), feliratozás, toll, az ábra elejére és/vagy végére rajzolandó nyilak, magyarázó szöveg (legend: pl. egy ábrán különböző színnel rajzolt görbék esetén melyik szín mit jelent).
  • label: feliratozás. Ugyanazok a paraméterei, mint draw-nak, de csak a szövegeket írja ki, az ábrát nem rajzolja ki. Pl. olyankor lehet hasznos, ha a kettőt más tollal kell rajzolni. Az ábrát is meg kell adni, mert ehhez igazítja a szöveget.
  • fill ill. filldraw: kiszínez egy zárt ábrát (path-t). A második függvénynek két toll paramétere van: az egyik a határt rajzolja, a másik színez.
  • clip: kivág egy darabot az ábrából. A kivágandó területet zárt ábraként kell megadni.

Egyéb utasítások[szerkesztés | forrásszöveg szerkesztése]

Az asymptote többi utasítása hasonló a megszokott programnyelvekhez. Az if, for, while, break, continue azonos a C-vel, viszont nincs switch utasítás. A tömböt kezelő for indexváltozója javás alakban is írható.

Az import megfelel a C „kacsacsőrös”, az include a C idézőjeles include-jának. A from utasítással egy include-file egy részét is be lehet szúrni a programba.

A nyelv természetesen tartalmaz matematikai függvényeket, filekezelést, objektumok definiálását, stb. Ezek megszokottak, ezért itt nem ismertetjük.

Installálás, környezet[szerkesztés | forrásszöveg szerkesztése]

Az asymptote program más GPL-szoftvereket is használ:

  • LaTeX (az ábrafeliratok formázására)
  • Ghostscript (a postscript-műveletekhez)
  • ImageMagick (a .eps konverziójához)
  • pdf2svg vagy dvisvgm (SVG előállításához)
  • python (a grafikus user-interface használatához)

Az első kettő kötelező, a többi a teljes funkcionalitáshoz kell.

A Debian-alapú disztribúciókban megtalálható az asymptote, és a dvisvgm kivételével a többi szoftver is, így az installálás egyetlen utasítás:

apt-get install asymptote texlive-latex-extra

A Fedora 4-ben még benne volt az asymptote, a RedHat-5 és -6-ból azonban már kimaradt, így azt külön kell beszerezni. A többi programot a RedHat-disztribúció tartalmazza (a dvisvgm kivételével). Az asymptote honlapon megtalálhatók a letöltési helyek (Windows-ra és MacOS-re is).

Latin2-es karakterkészlet[szerkesztés | forrásszöveg szerkesztése]

Az asymptote csak a latin1-es karakterkészletet ismeri, de ezen könnyű segíteni. A latin1.asy mintájára (a Debian disztribúcióban ez a /usr/share/asymptote könyvtárban található) létre tudjuk hozni a latin2.asy-t az alábbi tartalommal:

usepackage("fontenc","T1");
usepackage("inputenc","latin2");

Az asy-program elejére írt

import latin2;

utasítás után a programunk érteni fogja a latin2-es karakterkészletet. (UTF-8-hoz az unicode.asy-t kell a fenti módon importálni; ez megvan az asy-ban.)

Futtatás[szerkesztés | forrásszöveg szerkesztése]

A sajat.asy-t az

asy sajat

utasítással fordíthatjuk le. Az eredményt imagemagick-kel a

 display +matte sajat.eps

utasítással nézhetjük meg.

Az eredményfile formátuma[szerkesztés | forrásszöveg szerkesztése]

Az eredmény default formátuma a tex/latex program használt változatától függ:

  • latex és tex esetén eps
  • pdflatex, xelatex és context esetén pdf.

A default formátum felhasználónként változtatható a $HOME/.asy/config.asy file-ban. A file asymptote-utasításokat tartalmaz. Pl.: import settings; outformat="pdf"; a PDF-et állítja be alapformátumnak.

Az alapformátum az asymptote hívásakor parancssorban, vagy akár magában a programban is megváltoztatható. asy -f svg abra.asy eredménye az abra.svg file lesz.

A formátum megváltoztatásához az asymptote külső konvertert használ, melyet külön kell installálni:

  • az ImageMagick convert programját
  • a dvisvgm programot[3] SVG formátumhoz.

Az ImageMagick/convert nagyon sok formátumot ismer.[4] A gyakoribbak:

  • eps, ps, pdf
  • png, jpg, gif, bmp, ico, tiff.

Példa teljes asymptote programra[szerkesztés | forrásszöveg szerkesztése]

Asymptote programpélda Benzol.jpg
import graph;

size(75,75);                    // abrameret
defaultpen(1.0);                // vonalvastagsag

path hatszog = rotate(-30)*polygon(6);
draw(hatszog^^Circle((0,0),0.5));
label(shift((0,-5))*'Benzol',point(hatszog,0));

Példa függvény kirajzolására[szerkesztés | forrásszöveg szerkesztése]

Asymptote programpélda Szív.svg
import graph;
picture pic;

real f1(real x) {return ( (x^2+abs(x)-6) / (x^2+abs(x)+2) );}
real f2(real x) {return ( sqrt(36-x^2) );}

real felso(real x) {return ( f1(x)+f2(x) );}
real also(real x) {return ( f1(x)-f2(x) );}

path sziv1=graph(also,-6,6),
     sziv2=graph(felso,-6,6);
draw(pic,sziv1,red);
draw(pic,sziv2,red);

xaxis(pic,"$x$",-6.8,6.8,Ticks(1.0,OmitTick(0)),Arrows);
yaxis(pic,-9.8,6.8,Ticks(1.0,OmitTick(0)),Arrows);

label(pic,"$y=\frac{x^2+|x|-6}{x^2+|x|+2} \pm \sqrt{36-x^2}$", (0,6.5),E);
add(pic.fit(0,14cm),(-0.1,0.0));

A program fordítása: asy -f svg sziv

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. Az asy-programban beállítható PDF-kimenet is, ez esetben az asymptote automatikusan behívja az imagemagick-et a konvertálásra. Egyéb formátum parancssori paraméterben adható meg, vagy a .eps elkészülte után kézzel konvertálható.
  2. PDF-ben nem lehet átlátszó objektumot rajzolni, mert a PDF fileformátum erre nem ad lehetőséget.
  3. dvisvgm (sourceforget.net)
  4. ImageMagick v6 Examples -- Common Image Formats

Források[szerkesztés | forrásszöveg szerkesztése]