Templates -- Meow  1.2.11
A C++ template contains kinds of interesting classes and functions
HSL_Space.h
Go to the documentation of this file.
1 #ifndef colors_HSL_Space_H__
2 #define colors_HSL_Space_H__
3 
4 #include "Color3_Space.h"
5 #include "RGB_Space.h"
6 #include "YUV_Space.h"
7 
8 #include "../geo/Vectors.h"
9 #include "../math/utility.h"
10 
11 #include <cstdlib>
12 
13 namespace meow {
14 
22 class HSLf_Space: public Color3_Space<double> {
23 public:
25  Vector3D<double>(PI * 2.0, 1.0, 1.0),
26  Vector3D<double>( 0.0, 0.0, 0.0)) {
27  }
28  HSLf_Space(double c): Color3_Space<double>(Vector3D<double>( 0.0, 0.0, 0.0),
29  Vector3D<double>(PI*2.0, 1.0, 1.0),
30  Vector3D<double>( c, c, c))
31  { }
33  Color3_Space<double>(Vector3D<double>(0.0, 0.0, 0.0),
34  Vector3D<double>(1.0, 1.0, 1.0),
35  Vector3D<double>(v)) {
36  }
37  HSLf_Space(HSL_Space const& b): Color3_Space<double>(b) {
38  }
40  }
41  double const& hslMin(size_t i) const { return min(i); }
42  double const& hMin( ) const { return min(0); }
43  double const& sMin( ) const { return min(1); }
44  double const& lMin( ) const { return min(2); }
45  double const& hslMax(size_t i) const { return max(i); }
46  double const& hMax( ) const { return max(0); }
47  double const& sMax( ) const { return max(1); }
48  double const& lMax( ) const { return max(2); }
49  double const& hsl(size_t i) const { return val(i); }
50  double const& h( ) const { return hsl(0); }
51  double const& s( ) const { return hsl(1); }
52  double const& l( ) const { return hsl(2); }
53  double const& hsl(size_t i, double c) { return val(i, c); }
54  double const& h( double c) { return hsl(0, c); }
55  double const& s( double c) { return hsl(1, c); }
56  double const& l( double c) { return hsl(2, c); }
57  double& hslGet(size_t i) { return valGet(i); }
58  double& hGet( ) { return hslGet(0); }
59  double& sGet( ) { return hslGet(1); }
60  double& lGet( ) { return hslGet(2); }
62  copyFrom(b);
63  return *this;
64  }
65  HSLf_Space operator+(HSLf_Space const& b) const {
66  return HSLf_Space(val_ + b.val_);
67  }
68  HSLf_Space operator-(HSLf_Space const& b) const {
69  return HSLf_Space(val_ - b.val_);
70  }
71  HSLf_Space operator*(double const& c) const {
72  return HSLf_Space(val_ * c);
73  }
74  HSLf_Space operator/(double const& c) const {
75  return HSLf_Space(val_ / c);
76  }
77  double operator*(HSLf_Space const& b) const {
78  return val_ * b.val_;
79  }
80 };
81 
85 inline void colorTransformate(HSLf_Space const& in, HSLf_Space* out) {
86  *out = in;
87 }
88 
92 inline void colorTransformate(RGBf_Space const& rgb, HSLf_Space* hsl) {
93  double r = normalize(rgb.rMin(), rgb.rMax(), rgb.r());
94  double g = normalize(rgb.gMin(), rgb.gMax(), rgb.g());
95  double b = normalize(rgb.bMin(), rgb.bMax(), rgb.b());
96  double mx = std::max(std::max(r, g), b);
97  double mn = std::min(std::min(r, g), b);
98  double h, s, l;
99  if (mx == mn ) h = 0;
100  else if(mx == r && g >= b) h = PI/3.0 * (g-b) / (mx-mn);
101  else if(mx == r && g < b) h = PI/3.0 * (g-b) / (mx-mn) + PI * 2.0;
102  else if(mx == g ) h = PI/3.0 * (b-r) / (mx-mn) + PI/3.0*2.0;
103  else h = PI/3.0 * (r-g) / (mx-mn) + PI/3.0*4.0;
104  l = 0.5 * (mx + mn);
105  if (l == 0 || mx == mn) s = 0;
106  else if(l < 0.5 ) s = (mx - mn) / (2.0 * l);
107  else s = (mx - mn) / (2 - 2.0 * l);
108  hsl->h(h);
109  hsl->s(s);
110  hsl->l(l);
111 }
112 
116 inline void colorTransformate(YUVf_Space const& yuv, HSLf_Space* hsl) {
117  RGBf_Space tmp;
118  colorTransformate(yuv, &tmp);
119  colorTransformate(tmp, hsl);
120 }
121 
125 inline void colorTransformate(HSLf_Space const& hsl, RGBf_Space* rgb) {
126  double h = normalize(hsl.hMin(), hsl.hMax(), hsl.h());
127  double s = normalize(hsl.sMin(), hsl.sMax(), hsl.s());
128  double l = normalize(hsl.lMin(), hsl.lMax(), hsl.l());
129  if(s == 0){
130  rgb->r(denormalize(rgb->rMin(), rgb->rMax(), l));
131  rgb->g(denormalize(rgb->gMin(), rgb->gMax(), l));
132  rgb->b(denormalize(rgb->bMin(), rgb->bMax(), l));
133  return ;
134  }
135  double q = (l < 0.5 ? (l * (1 + s)) : (l + s - (l * s)));
136  double p = 2 * l - q;
137  double t_r = h + 1.0 / 3.0;
138  double t_g = h;
139  double t_b = h - 1.0 / 3.0;
140  if(t_r < 0) t_r = t_r + 1.0;
141  if(t_r > 1) t_r = t_r - 1.0;
142  if(t_g < 0) t_g = t_g + 1.0;
143  if(t_g > 1) t_g = t_g - 1.0;
144  if(t_b < 0) t_b = t_b + 1.0;
145  if(t_b > 1) t_b = t_b - 1.0;
146  double r, g, b;
147  if (t_r < 1.0 / 6.0) r = p + (q - p) * 6 * t_r;
148  else if(t_r < 0.5 ) r = q;
149  else if(t_r < 2.0 / 3.0) r = p + (q - p) * 6 * (2.0 / 3.0 - t_r);
150  else r = p;
151  if (t_g < 1.0 / 6.0) g = p + (q - p) * 6 * t_g;
152  else if(t_g < 0.5 ) g = q;
153  else if(t_g < 2.0 / 3.0) g = p + (q - p) * 6 * (2.0 / 3.0 - t_g);
154  else g = p;
155  if (t_b < 1.0 / 6.0) b = p + (q - p) * 6 * t_b;
156  else if(t_b < 0.5 ) b = q;
157  else if(t_b < 2.0 / 3.0) b = p + (q - p) * 6 * (2.0 / 3.0 - t_b);
158  else b = p;
159  rgb->r(denormalize(rgb->rMin(), rgb->rMax(), r));
160  rgb->g(denormalize(rgb->gMin(), rgb->gMax(), g));
161  rgb->b(denormalize(rgb->bMin(), rgb->bMax(), b));
162 }
163 
167 inline void colorTransformate(HSLf_Space const& hsl, YUVf_Space* yuv) {
168  RGBf_Space tmp;
169  colorTransformate(hsl, &tmp);
170  colorTransformate(tmp, yuv);
171 }
172 
176 inline void colorTransformate(HSLf_Space const& hsl, RGBi_Space* rgb) {
177  RGBf_Space tmp;
178  colorTransformate(hsl, &tmp);
179  rgb->copyFrom(tmp);
180 }
181 
182 
186 inline void colorTransformate(RGBi_Space const& rgb, HSLf_Space* hsl) {
187  RGBf_Space tmp;
188  tmp.copyFrom(rgb);
189  colorTransformate(rgb, hsl);
190 }
191 
192 } // meow
193 
194 
195 #endif // colors_HSL_Space_H__
HSLf_Space(Vector3D< double > const &v)
Definition: HSL_Space.h:32
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
Definition: utility.h:37
double const & rMin() const
Definition: RGB_Space.h:106
HSLf_Space & operator=(HSLf_Space const &b)
Definition: HSL_Space.h:61
以浮點數Y(亮度), U(色度), V(濃度) 三個值所組成的色彩空間
Definition: HSL_Space.h:22
double const & h() const
Definition: HSL_Space.h:50
double const & l() const
Definition: HSL_Space.h:52
HSLf_Space operator*(double const &c) const
Definition: HSL_Space.h:71
double & hGet()
Definition: HSL_Space.h:58
以浮點數Red, Green, Blue 三個值所組成的色彩空間
Definition: RGB_Space.h:86
HSLf_Space(HSL_Space const &b)
Definition: HSL_Space.h:37
doubleconst & min(size_t id) const
Return the minimum of the i -th channel.
Definition: Color3_Space.h:99
double & hslGet(size_t i)
Definition: HSL_Space.h:57
double const & h(double c)
Definition: HSL_Space.h:54
double & valGet(size_t id)
Get the non-constant reference of value of the i -th channel.
Definition: Color3_Space.h:139
double const & hsl(size_t i) const
Definition: HSL_Space.h:49
double & lGet()
Definition: HSL_Space.h:60
double const & hslMin(size_t i) const
Definition: HSL_Space.h:41
double const & sMin() const
Definition: HSL_Space.h:43
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
Definition: utility.h:45
void colorTransformate(HSLf_Space const &in, HSLf_Space *out)
HSLf_Space to HSLf_Space
Definition: HSL_Space.h:85
double const & r() const
Definition: RGB_Space.h:114
doubleconst & max(size_t id) const
Return the maximum of the i -th channel.
Definition: Color3_Space.h:107
以浮點數Y(亮度), U(色度), V(濃度) 三個值所組成的色彩空間
Definition: YUV_Space.h:21
Base class of color space with 3 channels.
Definition: Color3_Space.h:18
3D's vector
Definition: Vectors.h:258
double const & hMax() const
Definition: HSL_Space.h:46
double const & gMin() const
Definition: RGB_Space.h:107
HSLf_Space operator/(double const &c) const
Definition: HSL_Space.h:74
double const & lMax() const
Definition: HSL_Space.h:48
以整數 Red, Green, Blue 三個值所組成的色彩空間
Definition: RGB_Space.h:19
HSLf_Space(double c)
Definition: HSL_Space.h:28
double & sGet()
Definition: HSL_Space.h:59
double const & bMax() const
Definition: RGB_Space.h:112
double const & rMax() const
Definition: RGB_Space.h:110
double const & hslMax(size_t i) const
Definition: HSL_Space.h:45
double const & lMin() const
Definition: HSL_Space.h:44
double const & sMax() const
Definition: HSL_Space.h:47
static const double PI
圓周率...
Definition: utility.h:12
HSLf_Space operator+(HSLf_Space const &b) const
Definition: HSL_Space.h:65
double const & gMax() const
Definition: RGB_Space.h:111
double const & b() const
Definition: RGB_Space.h:116
double const & g() const
Definition: RGB_Space.h:115
double const & bMin() const
Definition: RGB_Space.h:108
double const & l(double c)
Definition: HSL_Space.h:56
Color3_Space< double > & copyFrom(Color3_Space< double > const &b)
Copy method.
Definition: Color3_Space.h:54
double operator*(HSLf_Space const &b) const
Definition: HSL_Space.h:77
HSLf_Space operator-(HSLf_Space const &b) const
Definition: HSL_Space.h:68
double const & hMin() const
Definition: HSL_Space.h:42
double const & hsl(size_t i, double c)
Definition: HSL_Space.h:53
doubleconst & val(size_t id) const
Return the value of the i -th channel.
Definition: Color3_Space.h:117
Vector3D< double > val_
Definition: Color3_Space.h:22
double const & s(double c)
Definition: HSL_Space.h:55
double const & s() const
Definition: HSL_Space.h:51