Cvičenie 6

Príklad 1
Vyskášajte si program ShadedSphere.exe. Tento program demonštruje tieňovanie gule všetkými tromi spôsobmi. Skúste meniť hodnoty parametrov (v rozmedziach, ktoré sú dané v prednáške) a sledujte výsledný efekt.

Príklad 2
Napíšte program, ktorý načíta od užívateľa (pomocou TextBoxov) jednotlivé zložky farby v modeli RGB (teda hodnoty R,G,B) a vykreslí obdĺžnik vyplnený danou farbou. Ďalej nech prevedie dané hodnoty aj do modelov CMY a CMYK. 
Farba štetca sa nastavuje takto:
Stetec->set_Color(Color::FromArgb(R,G,B));

Príklad 3
Tento program bude pracovať s modelom ARGB, teda aj s priehľadnosťou. Vykreslite dva obdĺžniky, ktoré sa budú čiastočne prekrývať. Po stlačení tlačítka sa ten, ktorý je navrchu, začne postupne spriehľadňovať, až kým nezmizne.
Farba v moddeli ARGB sa nastavuje rovnako ako pri modeli RGB:
Stetec->set_Color(Color::FromArgb(A,R,G,B));
Ak je hodnota A=255, objekt je nepriehľadný, ak je A=0, objekt je úplne priehľadný.
Aby bolo vykresľovanie pomalšie, použite metódu Sleep(počet milisekúnd), ktorá je v knižnici <windows.h>.

Príklad 4
Napíšte program, ktorý prevedie obrázok na čiernobiely a sépiový (v odtieňoch hnedej).
Program bude mať tri tlačítka. Stlačením prvého sa vykreslí pôvodný obrázok, stlačením druhého čiernobiely a stlačením tretieho sépiový.
Ak je farba nejakého bodu daná hodnotami R,G,B, tak jej čiernobiela reprezentácia sa vypočíta ako:
X=0.3R+0.59G+0.11B
Výsledná farba bude odtieň šedej, teda farba, kde R=X, G=X, B=X.
Prevod na sépiové odtiene vychádza z čiernobielej reprezentácie. Aby sa dosiahli hnedé odtiene, musíme zvýšiť intenzitu červenej a zelenej, ktorých zmiešaním vznikne hnedá. Zvolíme si nejakú konštantu d, o ktorú sa intenzita bude zvyšovať. Potom bude:
R=X+2d
G=X+d
B=X
Môžete zvoliť napr. d=40. Nezabudnite testovať, či niektorá hodnota po takomto pripočítaní neprekročí hodnotu 255. Ak áno, znížte ju na 255.
Farba konkrétneho pixelu (x,y) obrázku sa zistí takto:
Color farba=obrazok->GetPixel(x,y);
Ak chceme nastaviť farbu pixelu, urobíme to takto:
obrazok->SetPixel(x,y,farba);
Jednotlivé zložky farby získame takto:
int R=farba.get_R(), int G=farba.get_(), int B=farba.get_B()

Príklad 5
Vo Visual C++ máte k dispozícii tzv. ColorDialog, ktoý umožňuje voliť farby. Napíšte program, ktorý dovolí užívateľovi zvoliť si farbu pomocou ColorDialogu a potom vykrelí vyplnenú elipsu danej farby. Program bude mať jedno tlačítko. Po jeho stlačení sa otvorí ColorDialog (nie je teda viditeľný stále, v dizajne ho nemusíte umiestňovať do okna) a vykreslí sa elipsa.
Metóda button1_Click bude teda obsahovať tieto príkazy:
private: System::Void button1_Click(...)
{
  ...
  Vytvorenie ColorDialogu:
  ColorDialog* MyDialog = new ColorDialog(); 
  Povolenie výberu vlastných farieb:
  MyDialog->AllowFullOpen = true ;
  Zobrazenie nápovedy:
  MyDialog->ShowHelp = true ;
  Nastavenie nejakej počiatočnej farby:
  MyDialog->Color = pictureBox1->BackColor ;
  Po stlačení tlačítka OK v ColorDialogu sa vykrelí elipsa štetcom Stetec:
  if (MyDialog->ShowDialog() == DialogResult::OK)
  {
     Stetec->set_Color(MyDialog->Color);
     ...
  }
}

Príklad 6
Napíšte program, ktorý vykreslí vyplnený obdĺžnik, ktorého výplň nebude jednofarbená, ale vypočíta sa bilineárnou interpoláciou. Nastavte farby v rohoch obdĺžnika a farby všetkých bodov obdĺžnika sa z nich vypočítajú interpolovaním. Môžete využiť príklad z prednášky, kde máte ukážku takéhoto obdĺžnika aj spôsob, akým sa bilineárna interpolácia robí.

Príklad 7
Napíšte program, ktorý vykreslí 5 obdĺžnikov náhodnej farby na náhodnej pozícii v okne. Pozadie PictureBoxu nastavte na čierne.
Potom urobte obmenu – nech sa obdĺžniky nevykreslia naraz, ale “vynoria sa” z čiernej plochy – farba bude najskôr čierna, potom bude postupne jasnejšia, až sa dosiahne výsledná farba.