Nejjednodussí barevný model je zalozen na 3 základních barvách a nerozlisuje jejich intenzitu. Tyto barvy lze míchat dvema zpusoby - aditivne a subtraktivne.
Aditivní míchání je míchání barevných svetel; základní barvy jsou cervená (Red), zelená (Green) a modrá (Blue), smícháním vsech barev vznikne barva bílá (White).
Subtraktivní míchání je míchání barevných filtru; základní barvy jsou azurová (Cyan), fialová (Magenta) a zlutá (Yellow), smícháním vsech barev vznikne barva cerná (blacK). Filtry nepropustí barvu, která je v barevném kruhu proti nim, napr. zlutý filtr nepropustí modrou a z fialové odstraní modrou cást, takze zbyde cervená.
Oba zpusoby míchání znázornují obrázky:
| Aditivní míchání: | Subtraktivní míchání: |
![]() |
![]() |
Ve vnejsím mezikruzí je pozadí (tmavá scéna/bílý papír), dále do stredu základní barvy, barvy smíchané ze dvou sousedních (zbylé po aplikaci sousedních filtru) a uprostred smes vsech 3 základních barev/filtru.
V praxi se nesetkáváme pouze s cistými základními barvami, ale se smesí barev ci filtru, v nichz je kazdá barva zastoupena urcitým podílem. (Napríklad oranzové svetlo obsahuje vetsí podíl cervené a mensí podíl zelené. V tomto cvicení se tímto slozitejsím barevným modelem zabývat nebudeme.
Vytvorte trídu color, která implementuje výse popsané
jednoduché barevné
schéma a operace aditivního i subtraktivního míchání
barev. Pro odzkousení vytvorte hlavní program, který precte 2 barvy a vypíse
jejich aditivní i subtraktivní soucet.
color.h (hlavickový soubor),
color.C (implementace metod a operátoru trídy),
colormain.C (testovací program, který se odevzdává, ale nehodnotí.) char (jedno
z písmen RGBYMCKW oznacující barvu podle anglických názvu
v úvodu). + (aditivní míchání barev) * (subtraktivní míchání barev) RGBYMCKW (velké
nebo malé písmeno). inline, do hlavickového souboru nepatrí.
inline, do
color.C vlozte aspon komentár. Toto resení
vsak durazne nedoporucuji, protoze operátor vstupu odpovídající zadání
rozhodne není krátký. &color (podrobnosti najdete v 9. prednásce).
Nezapomente také na to, ze << a >> jsou operátory, takze
vracejí hodnotu (svuj levý operand).
#include <iostream>
using namespace std;
class color
{
private:
char kod;
public:
color():kod(0){};
color(char k):kod(k){};
color(const color& b):kod(b.kod){};
~color(){};
color operator+(color(b));
color operator*(color(b));
friend ostream& operator<<(ostream& outs, color b);
friend istream& operator>>(istream& ins, color& b);
};
#include "color.h"
color color::operator+(color b) // ' + '
{return color(kod|b.kod);
}
color color::operator*(color b) // ' * '
{return color(kod&b.kod);
}
ostream& operator<<(ostream& outs, color b)
{const char *jm[8]={"K(black)","B(blue)","G(green)","C(cyan)","R(red)",
"M(magenta)","Y(yellow)","W(white)"};
return outs << jm[(int) b.kod];
}
istream& operator>>(istream& ins, color& b)
{string farby="KBGCRMYW";
char a;
for(;;)
{cin>>a;
size_t index=farby.find(toupper(a));
if(index<8) // zadana spravna farba
{b.kod=index;
break;
}
else // zadanu farbu nepoznam
{cout << "Zadaj jednu farbu z \"KBGCRMYW\" \n";}
}
return ins;
}
#include "color.h"
int main(void)
{color b1,b2;
cout<<"Zadaj 1. farbu: ";
cin >> b1;
cout<<"Zadaj 2. farbu: ";
cin >> b2;
cout<<"Aditivnym zmiesanim farieb "<<b1<<" a "<<b2
<<" je "<<(b1+b2)<<endl;
cout<<"Subtraktivnym zmiesanim farieb "<<b1<<" a "<<b2
<<" je "<<(b1*b2)<<endl;
return 0;
}