7 #include "../utility.h"
11 template<
class T>
inline HSV<T>::HSV(T
const& h, T
const& s, T
const& v){
12 hsv_[0] = h; hsv_[1] = s; hsv_[2] = v;
15 for(
int i = 0; i < 3; i++) hsv_[i] = hsv[i];
18 template<
class T>
inline T
HSV<T>::h()
const {
return hsv_[0]; }
19 template<
class T>
inline T
HSV<T>::s()
const {
return hsv_[1]; }
20 template<
class T>
inline T
HSV<T>::v()
const {
return hsv_[2]; }
22 return hsv_[std::min((
size_t)3 - 1, i)];
24 template<
class T>
inline T
HSV<T>::vsh(
size_t i)
const{
return hsv(2-i);}
25 template<
class T>
inline T
HSV<T>::h(T
const& val){
return (hsv_[0]=val);}
26 template<
class T>
inline T
HSV<T>::s(T
const& val){
return (hsv_[1]=val);}
27 template<
class T>
inline T
HSV<T>::v(T
const& val){
return (hsv_[2]=val);}
28 template<
class T>
inline T
HSV<T>::hsv(
size_t i, T
const& val){
29 return (hsv_[std::min((
size_t)3 - 1, i)] = val);
31 template<
class T>
inline T
HSV<T>::vsh(
size_t i, T
const& val){
32 return hsv(2 - i, val);
41 inline HSVf::HSVf(
double const&h,
double const&s,
double const&v):
HSV(h,s,v){}
53 template<
class RGB_T,
class HSV_T>
inline void RGB_to_HSV(
59 double mx = std::max(std::max(r, g), b);
60 double mn = std::min(std::min(r, g), b);
63 else if(mx == r && g >= b) h =
PI/3.0 * (g-b) / (mx-mn);
64 else if(mx == r && g < b) h =
PI/3.0 * (g-b) / (mx-mn) +
PI * 2.0;
65 else if(mx == g ) h =
PI/3.0 * (b-r) / (mx-mn) +
PI/3.0*2.0;
66 else h =
PI/3.0 * (r-g) / (mx-mn) +
PI/3.0*4.0;
74 template<
class HSV_T,
class RGB_T>
inline void HSV_to_RGB(
80 int hi = (
int)h / 60 % 6;
81 double f = h / 60.0 - hi;
82 double p = v * (1 - s);
83 double q = v * (1 - f * s);
84 double t = v * (1 - (1 - f) * s);
86 if (hi == 0){ r = v; g = t; b = p; }
87 else if(hi == 1){ r = q; g = v; b = p; }
88 else if(hi == 2){ r = p; g = v; b = t; }
89 else if(hi == 3){ r = p; g = q; b = v; }
90 else if(hi == 4){ r = t; g = p; b = v; }
91 else { r = v; g = p; b = q; }
96 template<
class YUV_T,
class HSV_T>
inline void YUV_to_HSV(
virtual T rMax() const =0
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
void RGB_to_HSV(RGB< RGB_T > const &rgb, HSV< HSV_T > *hsv)
virtual T hMax() const =0
void HSV_to_YUV(HSV< HSV_T > const &hsv, YUV< YUV_T > *yuv)
virtual T sMin() const =0
virtual T bMax() const =0
void HSL_to_RGB(HSL< HSL_T > const &hsl, RGB< RGB_T > *rgb)
virtual T vMax() const =0
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
virtual T bMin() const =0
void RGB_to_YUV(RGB< RGB_T > const &rgb, YUV< YUV_T > *yuv)
void HSV_to_RGB(HSV< HSV_T > const &hsv, RGB< RGB_T > *rgb)
void HSL_to_HSV(HSL< HSL_T > const &hsl, HSV< HSV_T > *hsv)
void YUV_to_RGB(YUV< YUV_T > const &yuv, RGB< RGB_T > *rgb)
void YUV_to_HSV(YUV< YUV_T > const &yuv, HSV< HSV_T > *hsv)
virtual T hMin() const =0
virtual T sMax() const =0
virtual T gMax() const =0
static const double PI
圓周率...
virtual T rMin() const =0
virtual T vMin() const =0
virtual T gMin() const =0
void RGB_to_HSL(RGB< RGB_T > const &rgb, HSL< HSL_T > *hsl)
void HSV_to_HSL(HSV< HSV_T > const &hsv, HSL< HSL_T > *hsl)