Templates -- Meow  1.1.4
A C++ template which is unable and also not allowed to compile to obj-file first.
HSV.hpp
Go to the documentation of this file.
1 #include "HSV.h"
2 
3 #include "RGB.h"
4 #include "YUV.h"
5 #include "HSL.h"
6 
7 #include "../utility.h"
8 
9 namespace meow{
10  template<class T> inline HSV<T>::HSV(){ }
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;
13  }
14  template<class T> inline HSV<T>::HSV(T const* hsv){
15  for(int i = 0; i < 3; i++) hsv_[i] = hsv[i];
16  }
17 
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]; }
21  template<class T> inline T HSV<T>::hsv(size_t i) const {
22  return hsv_[std::min((size_t)3 - 1, i)];
23  }
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);
30  }
31  template<class T> inline T HSV<T>::vsh(size_t i, T const& val){
32  return hsv(2 - i, val);
33  }
34 
35 
36 
37 
38 
39  inline HSVf:: HSVf(): HSV(){ }
40  inline HSVf::~HSVf(){ }
41  inline HSVf::HSVf(double const&h,double const&s,double const&v):HSV(h,s,v){}
42  inline HSVf::HSVf(double const* hsv):HSV(hsv){}
43  inline double HSVf::hMin() const { return 0.0; }
44  inline double HSVf::hMax() const { return 2.0 * PI; }
45  inline double HSVf::sMin() const { return 0.0; }
46  inline double HSVf::sMax() const { return 1.0; }
47  inline double HSVf::vMin() const { return 0.0; }
48  inline double HSVf::vMax() const { return 1.0; }
49 
50 
51 
52 
53  template<class RGB_T, class HSV_T> inline void RGB_to_HSV(
54  RGB<RGB_T> const& rgb,
55  HSV<HSV_T> * hsv){
56  double r = normalize(rgb.rMin(), rgb.rMax(), rgb.r());
57  double g = normalize(rgb.gMin(), rgb.gMax(), rgb.g());
58  double b = normalize(rgb.bMin(), rgb.bMax(), rgb.b());
59  double mx = std::max(std::max(r, g), b);
60  double mn = std::min(std::min(r, g), b);
61  double h, s, v;
62  if (mx == mn ) h = 0;
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;
67  if(mx == 0) s = 0;
68  else s = 1 - mn / mx;
69  v = mx;
70  hsv->h(h);
71  hsv->s(s);
72  hsv->v(v);
73  }
74  template<class HSV_T, class RGB_T> inline void HSV_to_RGB(
75  HSV<HSV_T> const& hsv,
76  RGB<RGB_T> * rgb){
77  double h = normalize(hsv.hMin(), hsv.hMax(), hsv.h()) * 360;
78  double s = normalize(hsv.sMin(), hsv.sMax(), hsv.s());
79  double v = normalize(hsv.vMin(), hsv.vMax(), hsv.v());
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);
85  double r, g, b;
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; }
92  rgb->r(denormalize(rgb->rMin(), rgb->rMax(), r));
93  rgb->g(denormalize(rgb->gMin(), rgb->gMax(), g));
94  rgb->b(denormalize(rgb->bMin(), rgb->bMax(), b));
95  }
96  template<class YUV_T, class HSV_T> inline void YUV_to_HSV(
97  YUV<YUV_T> const& yuv,
98  HSV<HSV_T> * hsv){
99  RGBf tmp;
100  YUV_to_RGB(yuv, &tmp);
101  RGB_to_HSV(tmp, hsv);
102  }
103  template<class HSV_T, class YUV_T> inline void HSV_to_YUV(
104  HSV<HSV_T> const& hsv,
105  YUV<YUV_T> * yuv){
106  RGBf tmp;
107  HSV_to_RGB(hsv, &tmp);
108  RGB_to_YUV(tmp, yuv);
109  }
110  template<class HSL_T, class HSV_T> inline void HSL_to_HSV(
111  HSL<HSL_T> const& hsl,
112  HSV<HSV_T> * hsv){
113  RGBf tmp;
114  HSL_to_RGB(hsl, &tmp);
115  RGB_to_HSV(tmp, hsv);
116  }
117  template<class HSV_T, class HSL_T> inline void HSV_to_HSL(
118  HSV<HSV_T> const& hsv,
119  HSL<HSL_T> * hsl){
120  RGBf tmp;
121  HSV_to_RGB(hsv, &tmp);
122  RGB_to_HSL(tmp, hsl);
123  }
124 }
virtual T rMax() const =0
T h() const
Definition: HSV.hpp:18
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
Definition: utility.h:27
void RGB_to_HSV(RGB< RGB_T > const &rgb, HSV< HSV_T > *hsv)
Definition: HSV.hpp:53
T s() const
Definition: HSV.hpp:19
virtual T hMax() const =0
void HSV_to_YUV(HSV< HSV_T > const &hsv, YUV< YUV_T > *yuv)
Definition: HSV.hpp:103
virtual T sMin() const =0
virtual T bMax() const =0
void HSL_to_RGB(HSL< HSL_T > const &hsl, RGB< RGB_T > *rgb)
Definition: HSL.hpp:74
virtual T vMax() const =0
Definition: RGB.h:5
Definition: HSV.h:9
T r() const
Definition: RGB.hpp:14
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
Definition: utility.h:35
virtual T bMin() const =0
Definition: RGB.h:34
~HSVf()
Definition: HSV.hpp:40
double sMax() const
Definition: HSV.hpp:46
T hsv(size_t i) const
Definition: HSV.hpp:21
Definition: YUV.h:7
void RGB_to_YUV(RGB< RGB_T > const &rgb, YUV< YUV_T > *yuv)
Definition: YUV.hpp:47
void HSV_to_RGB(HSV< HSV_T > const &hsv, RGB< RGB_T > *rgb)
Definition: HSV.hpp:74
double hMax() const
Definition: HSV.hpp:44
void HSL_to_HSV(HSL< HSL_T > const &hsl, HSV< HSV_T > *hsv)
Definition: HSV.hpp:110
Definition: HSL.h:8
void YUV_to_RGB(YUV< YUV_T > const &yuv, RGB< RGB_T > *rgb)
Definition: YUV.hpp:60
void YUV_to_HSV(YUV< YUV_T > const &yuv, HSV< HSV_T > *hsv)
Definition: HSV.hpp:96
virtual T hMin() const =0
virtual T sMax() const =0
HSV()
Definition: HSV.hpp:10
T v() const
Definition: HSV.hpp:20
virtual T gMax() const =0
double sMin() const
Definition: HSV.hpp:45
static const double PI
圓周率...
Definition: utility.h:12
virtual T rMin() const =0
virtual T vMin() const =0
T g() const
Definition: RGB.hpp:15
virtual T gMin() const =0
double hMin() const
Definition: HSV.hpp:43
T vsh(size_t i) const
Definition: HSV.hpp:24
void RGB_to_HSL(RGB< RGB_T > const &rgb, HSL< HSL_T > *hsl)
Definition: HSL.hpp:52
double vMin() const
Definition: HSV.hpp:47
T b() const
Definition: RGB.hpp:16
HSVf()
Definition: HSV.hpp:39
double vMax() const
Definition: HSV.hpp:48
void HSV_to_HSL(HSV< HSV_T > const &hsv, HSL< HSL_T > *hsl)
Definition: HSV.hpp:117