Pindelemendid

Pindelemendid joonistavad ekraanile eesplaani värviga mingi suletud graafilise kujundi ning täidavad tema sisemuse tagaplaani värviga. Täitmiseks võib kasutada ka mitmesuguseid mustreid.

Funktsioon setfillstyle() määrab pindelementide täitmiseks kasutatava värvi ja mustri.

void far setfillstyle(int pattern, int color);

Graafilise rezhiimi puhul määrab ohjurprogramm tavaliselt täitmisel kasutatavaks värviks valge värvuse ja mustriks ühtlase täite. Hetkeliste täitmise väärtuste teadasaamiseks kasutage funktsiooni getfillsettings().

void far getfillsettings( struct fillsettingstype far *fillinfo);

Funktsioon getfillsettings() täidab parameetri fillinfo poolt osutatud andmestruktuuri fillsettingstype vastavate andmetega.

struct fillsettingstype {
 int pattern;
 int color;
};

Parameeter pattern võib omada järgmisi väärtuseid:


Konstandi nimi Tähendus
EMPTY_FILL Täidab tagaplaani värviga
SOLID_FILL Täidab ühtlaselt määratud värviga
LINE_FILL -----
LTSLASH_FILL //////
SLASH_FILL \\\\\\, Jämedad jooned
BKSLASH_FILL //////, Jämedad jooned
LTBKSLASH_FILL \\\\\\
HATCH_FILL xxxxx
XHATCH_FILL xxxxx, Jämedad jooned
INTERLEAVE_FILL Joonistab vaid iga teise horisontaalse joone kujundi sees tagaplaani värviga
WIDE_DOT_FILL Hajutatud punktid, mis ei asu tihedalt ükstese kõrval
CLOSE_DOT_FILL Lähestikku asuvad hajutatud punktid
USER_FILL Kasutaja (programmeerija) poolt defineeritud täitemuster

Tabel 17: Täitemustritele vastavad sümboolsed konstandid

Nagu näete, sisaldab Borland C/C++ graafikateek juba hulgaliselt kasulikke täitemustreid. Kui neist ükski ei peaks sobima, siis võib ka defineerida oma isikliku mustri. Selleks ärge siiski kasutage funktsiooni setfillstyle() parameetriga USER_FILL, sest te peate kuidagi ka oma mustri defineerima. Kasutage oma mustri määramiseks funktsiooni setfillpattern() ja juba määratud mustri uurimiseks funktsiooni getfillpattern().

void far setfillpattern(char far *pattern, int color);
void far getfillpattern(char far *pattern);

Funktsioon setfillpattern() määrab kasutaja poolt defineeritud täitemustri. Tema parameeter pattern osutab 8-baidisele massiivile, millest iga üksik bait määrab 8 x 8-pikselise mustrielemendi ühe horisontaalse rea. Kui näiteks esimese baidi kolmas bitt omab väärtust 1 ja ülejäänud on nullid, siis täidetakse iga mustrielemendi esimese rea tagant viimane bitt parameetri color poolt määratud värviga ja ülejäänud selle rea pikselid täidetakse tagaplaani värviga.



Joonis 14: Mustrielemendi ehitus

Joonisel 14 näete mustrielemendi ehitust. Siin on loodud tähte - "C" kujutav mustrielement. Sellise mustrielemendi määramiseks defineerige vastav massiiv ja omistage tema elementidele siintoodud väärtused, näiteks:

...
char	pattern[8] = { 0x30, 0x48, 0x84, 0x80, 0x80, 0x84, 0x48, 0x30 };
...
setfillpattern((char far *)pattern, getmaxcolor());
...

Mingi kujundi täitmisel reastatakse sellised mustrielemendid kujundi ülemisest vasakust nurgast alustades üksteise järel nii kaua, kuni kogu kujundi sisu on täidetud. Sellised mustrielemendid on nagu kahhelkivid, millega mingit pinda kaetakse.

Täidetud hulknurga joonistamiseks kasutage funktsiooni fillpoly().

void far fillpoly(int numPoints, int far *points);

Selle funktsiooni parameeter numPoints määrab parameetri points poolt osutatud massiivi sissekannete arvu. Parameeter points osutab aga täisarvu paaride massiivile, millest igaüks määrab ühe hulknurga tipu koordinaadid. Hulknurga sisu täidetakse hetkelise täitemustri ja värviga. Kui massiivi points viimane koordinaatide paar (hulknurga tipp) ei lange kokku esimese paariga ja toodud koordinaadid määravad seega hoopis avatud kujundi, siis ühendab funktsioon fillpoly() automaatselt kujundi viimase tipu esimesega ja loob seega suletud kujundi. Funktsioon drawpoly() aga seda ei tee.

Täidetud ellipsi (ja ringjoone) joonistamiseks kasutage funktsiooni fillellipse().

void far fillellipse(int x, int y, int xradius, int yradius);

Funktsioon fillellipse() joonistab ellipsi keskunktiga (x, y) ja pooltelgedega xradius ning yradius. Ellipsi piirjoon joonistatakse hetkelise joone värvuse ja tüübiga, ning ellipsi sisu täidetakse hetkelise täitemustri ja -värviga.

Borland C/C++ graafiline teek sisaldab ka palju funktsioone graafikute ja diagrammide jaoks. Tulpdiagrammi loomiseks saab kasutada funktsioone bar() ja bar3d().

void far bar(int x1, int y1, int x2, int y2);
void far bar3d(int x1, int y1, int x2, int y2, int depth, int topflag);

Funktsioon bar() joonistab ekraanile täidetud ristküliku ülemise vasaku nurgaga punktis (x1, y1) ja alumise parema nurgaga punktis (x2, y2). Ristküliku sisu täidetakse hetkelise täitemustri ja -värviga, kuid ristküliku piirjoont ei joonistata. Piirjoone joonistamiseks kasutage funktsiooni bar3d() sügavusega (parameeter depth) 0.

Funktsioon bar3d() joonistab kolmedimensionaalse tulba sügavusega depth. Kui parameeter topflag on nullist erinev, siis on joonistatav risttahukas asetatud nii, et tema ülemine tahk on nähtav, nullise topflag puhul mitte. Viimasel juhul saab paremini esitada mitut tulpa üksteise otsas, mis on kasulik näiteks mitme erineva andmetejada võrdlemiseks.

Sektordiagrammi loomiseks kasutage funktsioone pieslice() ja sector().

void far pieslice(int x, int y, int stangle, int endangle, int radius);
void far sector(int x, int y, int stangle, int endangle, int xradius, int yradius);

Funktsioon pieslice() joonistab ringi keskpunktiga (x, y) ja raadiusega radius sektori alustades nurgast stangle ja lõpetades nurga endangle puhul. Sektor täidetakse hetkelise täitemustri ja -värvusega.

Funktsioon sector() joonistab samalaadse ellipsi sektori. Vastava ellipsi keskpunkt on (x, y) ja poolteljed xradius ning yradius.

Te võite täita ka suvalise suletud kujundi, kasutades funktsiooni floodfill().

void far floodfill(int x, int y, int border);

Funktsioon floodfill() täidab kujundi hetkelise täitevärvi ja -mustriga, alustades punktist (x, y). See punkt peab asuma suletud kujundi sees ja kogu kujund peab olema piiratud parameetriga border määratud värvi piiriga. Näiteks:

...
line(100, 100, 300, 100); /*joonistame hetkelise esiplaani*/
line(300, 100, 200, 300); /*värviga lihtsa kolmnurga*/
line(200, 300, 100, 100);
setfillstyle(LTSLACH_FILL, getmaxcolor());
/* täidame kolmnurga soovitud värvi ja mustriga */

floodfill(200, 200, getcolor()); ...