Č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 ... 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.
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.
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)