4. Èrtni primitivi in njihove lastnosti

Èrtni primitivi so zelo uporabni. Uporabljajo se tako za risanje preprostih èrt, kot za prikaz zahtevnih oblik z žiènim modelom. Morda so najbolj uporabna skupina primitivov v PEX-u.

4.1. Èrtni primitivi

Èrtni primitivi so:

- Polyline
- Polyline Set With Data
- B-spline Curve

4.2. Polyline

Polyline je zaporedje povezanih èrt. Èrte so narisane med toèkami, ki jih doloèimo. Vse èrte so narisane z isto barvo, stilom in debelino.

Polyline kreiramo s funkcijo PEXPolyline, ki jo doloèimo s 3D toèkami ali s PEXPolyline2D, ki jo doloèimo z 2D toèkami, èrta pa je prikazana v 3D prostoru s koordinato z = 0.

4.2.1. Toèke

Ob doloèanju geometrije primitivov v PEX vedno doloèimo toèke oz. polje toèk. Toèke so v PEXlib doloèene s strukturo PEXCoord za 3D toèke ali s PEXCoord2D za 2D toèke.

Definiciji za PEXCoord in PEXCoord2D sta:

typedef struct{
        float   x;
        float   y;
        float   z;
}PEXCoord;

typedef struct{
        float   x;
        float   y;
}PEXCoord2D;


4.3. Lastnosti polyline-a

Polyline ima sledeèe lastnosti:

- tip èrte
- skalarni faktor debeline èrte
- barva èrte

4.3.1. Tip èrte

Tip èrte oznaèuje stil èrte za èrtni primitiv. Tipi èrte doloèeni s PEX-om so:

PEXLineTypeSolid
PEXLineTypeDashed
PEXLineTypeDotted
PEXLineTypeDashDot

Nekatere izvedbe predvidevajo dodatne tipe èrt. Tip èrte lahko nastavimo s funkcijo PEXSetLineType, ki je opisana sledeèe:

void PEXSetLineType(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     line_type)


Pri èemer so argumenti:

dpy ... kazalec na zaslon

resource_id ... pokazatelj (identifier) na prikazovalnik (renderer) ali strukturo

request_type ... pokaže ali naj bo izhodni ukaz poslan direktno prikazovalniku (renderer-ju) (PEXOCRenderer) ali naj bo shranjen v strukturi (PEXOCStore)

line_type ... eden od zgoraj navedenih tipov (PEXLineTypeSolid, ...)

Tip èrte je tipa integer. Konstante za tipe èrt so shranjene v PEX.h. Tip èrte je v splošnem zaporedje presledkov in polnih delov. Velikost teh presledkov in polnih delov pa je karakteristika posameznega zaslona in izvedbe PEX-a in se je ne da nastavljati. Reèemo, da je karakteristika odvisna od izvedbe (implementation-dependent).

Osnovni tip èrte je PEXLineTypeSolid in se uporabi, èe tip èrte ni nastavljen ali ni podprt s strani zaslona.

4.3.2. Skalarni faktor debeline èrte

Vsi deli enega polyline-a so prikazani z enako debelino èrte. To lahko kontroliramo s skalarnim faktorjem debeline èrte (linewidth scale factor). Ta skalira debelino èrte od osnovne debeline imenovane številèna velikost (nominal size). Skalarni faktor je tipa float.

Nekateri zasloni podpirajo kontinuirano poveèevanje debeline èrte, drugi pa doloèijo fiksno število. PEX se prilagaja obema primeroma s tem, da doda skalarni faktor debeline èrte in se z množenjem osnovne debeline èrte in ob upoštevanju dostopne velikosti, èim bolj približa željenemu rezultatu. Èe je podprto kontinuirano poveèevanje, potem je izraèunana debelina uporabljena direktno, èe pa so dostopne samo doloèene debeline, se uporabi tista, ki je najbližja izraèunani. Kadar je vrednost za skalarni faktor negativna ali enaka niè se uporabi najmanjša možna debelina.

Debelina èrte je podana v enotah koordinatnega sistema naèrta DC. Skalarni faktor tako skalira debelino èrte ponavadi v pikslih. Zato se debelina èrte doloèi, ko so toèke polyline-a že transformirane (modeliranje, pogledi in NPC - to - viewport), tako da te transformacije ne vplivajo nanjo. Debelona èrte je prikazna neodvisno od pogleda in orientacije v prostoru.

Skalarni faktor debeline èrte lahko nastavimo s funkcijo PEXSetLineWidth. Osnovna (splošna) debelina èrte je 1.0.

void PEXSetLineWidth(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        double                  linewidth)


Argumenti dpy, resource_id in request_type so enaki kot pri PEXSetLineType. Argument linewidth pa je skalarni faktor tipa double.

4.3.3. Barva èrte

Lastnost barva èrte kontrolira barvo èrtnega primitiva. Nastavlja se s funkcijo PEXSetLineColor.

void PEXSetLineColor(
        Display                 *dpy,
        XID                     resource_id,
        PEXOCRequestType        request_type,
        int                     color_type,
        PEXColor                *line_color)


Argument color_type je lahko:

color_type vrednost pomen

PEXColorTypeIndexed 0 indeksirane barve

PEXColorTypeRGB 1 Red - Green - Blue barvni model

PEXColorTypeCIE 2 CIE - LUV color model

itd.

V našem primeru izberemo PEXColorTypeRGB.

Argument *line_color je kazalec na unijo:

typedef union{
        PEXColorIndexed         indexed;
        PEXColorRGB             rgb;
        PEXColorHSV             hsv;
        itd.
}PEXColor;





Element PEXColorRGB je struktura:

typedef struct{
        float   red;
        float   green;
        float   blue;
}PEXColorRGB;


Za doloèitev doloèene barve (npr. rumene) napišemo:

PEXColor        yellow;

yellow.rgb.red = 1.0;
yellow.rgb.green = 1.0;
yellow.rgb.blue = 0.0;


Lahko pa uporabimo makro SET_COLOR:

#define SET_COLOR(r, g, b, c){\
        (c).rgb.red = (r);\
        (c).rgb.green = (g);\
        (c).rgb.blue = (b);}


in za doloèitev napišemo:

SET_COLOR(1.0, 1.0, 0.0, yellow)