È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.
Èrtni primitivi so:
- Polyline
- Polyline Set With Data
- B-spline Curve
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.
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;
Polyline ima sledeèe lastnosti:
- tip èrte
- skalarni faktor debeline èrte
- barva è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 ... pokae 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 splonem 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.
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 mnoenjem osnovne debeline èrte in ob upotevanju dostopne velikosti, èim bolj priblia 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 najblija izraèunani. Kadar je vrednost za skalarni faktor negativna ali enaka niè se uporabi najmanja mona 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 (splona) 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.
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 naem 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) napiemo:
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 napiemo:
SET_COLOR(1.0, 1.0, 0.0, yellow)