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)