Waňov web

PB161 Jazyk C++ - 7. cvicení

Míchání barev

Úvod:

Kvalitativní pohled:

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.

Kvantitativní pohled:

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. 

Zadání:

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.

Pozadavky:

Poznámky:


Riešenie:


color.h
#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);
};



color.C
#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;
 }
 




colormain.C
#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;
 } 


Nahor