Polytech Tours - Projet C++ embarqué sur cible mbed
Diff: ColorManager.cpp
- Revision:
- 0:21e183c9ef81
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ColorManager.cpp Sun Apr 24 15:43:51 2016 +0000 @@ -0,0 +1,117 @@ +#include "ColorManager.h" + +// Méthode permettant d'obtenir des valeurs de HSV avec des valeurs de RGB. Il faut donner en paramètre des structures RGB et HSV, par référence. +void ColorManager::RGBtoHSV(RGB &rgb, HSV &hsv) +{ + double min, max, delta; + + min = rgb.red < rgb.green ? rgb.red : rgb.green; + min = min < rgb.blue ? min : rgb.blue; + + max = rgb.red > rgb.green ? rgb.red : rgb.green; + max = max > rgb.blue ? max : rgb.blue; + + hsv.value = max; + delta = max - min; + + if (delta < 0.00001) + { + hsv.saturation = 0; + hsv.hue = 0; + return; + } + if( max > 0.0 ) { + hsv.saturation = (delta/max); + } else { + hsv.saturation = 0.0; + hsv.hue = NAN; + return; + } + if(rgb.red >= max) + hsv.hue = (rgb.green-rgb.blue)/delta; + else + if(rgb.green >= max) + hsv.hue = 2.0 + (rgb.blue - rgb.red)/delta; + else + hsv.hue = 4.0 + (rgb.red - rgb.green ) / delta; + + hsv.hue *= 60.0; + + if(hsv.hue < 0.0) + hsv.hue += 360.0; +} + +// Méthode permettant d'obtenir des valeurs de RGB avec des valeurs de HSV. Il faut donner en paramètre des structures RGB et HSV, par référence. +void ColorManager::HSVtoRGB(RGB &rgb, HSV &hsv) +{ + double hh, p, q, t, ff; + long i; + + if(hsv.saturation <= 0.0) { // < is bogus, just shuts up warnings + rgb.red = hsv.value; + rgb.green = hsv.value; + rgb.blue = hsv.value;; + return; + } + hh = hsv.hue; + if(hh >= 360.0) + hh = 0.0; + hh /= 60.0; + i = (long)hh; + ff = hh - i; + p = hsv.value * (1.0 - hsv.saturation); + q = hsv.value * (1.0 - (hsv.saturation * ff)); + t = hsv.value * (1.0 - (hsv.saturation * (1.0 - ff))); + + switch(i) { + case 0: + rgb.red = hsv.value; + rgb.green = t; + rgb.blue = p; + break; + case 1: + rgb.red = q; + rgb.green = hsv.value; + rgb.blue = p; + break; + case 2: + rgb.red = p; + rgb.green = hsv.value; + rgb.blue = t; + break; + + case 3: + rgb.red = p; + rgb.green = q; + rgb.blue = hsv.value; + break; + case 4: + rgb.red = t; + rgb.green = p; + rgb.blue = hsv.value; + break; + case 5: + default: + rgb.red = hsv.value; + rgb.green = p; + rgb.blue = q; + break; + } +} + +// Métode qui retourne une couleur (de type Colour_t) en fonction d'une valeur de teinte passée en paramètre +Colour_t ColorManager::getColorFromHue(double hue) +{ + if(hue>=50 && hue < 100) + return YELLOW; + else if(hue >= 100 && hue < 135) + return GREEN; + else if(hue >= 135 && hue < 165) + return CYAN; + else if(hue >= 165 && hue < 270) + return BLUE; + else if( (hue >=270 && hue <360) || (hue >=0 && hue <50) ) + return RED; + else + return NA; +}