1 #ifndef colors_HSL_Space_H__
2 #define colors_HSL_Space_H__
8 #include "../geo/Vectors.h"
9 #include "../math/utility.h"
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); }
96 double mx = std::max(std::max(r, g), b);
97 double mn = std::min(std::min(r, g), b);
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;
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);
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;
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;
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);
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);
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);
195 #endif // colors_HSL_Space_H__
HSLf_Space(Vector3D< double > const &v)
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
double const & rMin() const
HSLf_Space & operator=(HSLf_Space const &b)
以浮點數Y(亮度), U(色度), V(濃度) 三個值所組成的色彩空間
HSLf_Space operator*(double const &c) const
以浮點數Red, Green, Blue 三個值所組成的色彩空間
HSLf_Space(HSL_Space const &b)
doubleconst & min(size_t id) const
Return the minimum of the i -th channel.
double & hslGet(size_t i)
double const & h(double c)
double & valGet(size_t id)
Get the non-constant reference of value of the i -th channel.
double const & hsl(size_t i) const
double const & hslMin(size_t i) const
double const & sMin() const
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
void colorTransformate(HSLf_Space const &in, HSLf_Space *out)
HSLf_Space to HSLf_Space
doubleconst & max(size_t id) const
Return the maximum of the i -th channel.
以浮點數Y(亮度), U(色度), V(濃度) 三個值所組成的色彩空間
Base class of color space with 3 channels.
double const & hMax() const
double const & gMin() const
HSLf_Space operator/(double const &c) const
double const & lMax() const
以整數 Red, Green, Blue 三個值所組成的色彩空間
double const & bMax() const
double const & rMax() const
double const & hslMax(size_t i) const
double const & lMin() const
double const & sMax() const
static const double PI
圓周率...
HSLf_Space operator+(HSLf_Space const &b) const
double const & gMax() const
double const & bMin() const
double const & l(double c)
Color3_Space< double > & copyFrom(Color3_Space< double > const &b)
Copy method.
double operator*(HSLf_Space const &b) const
HSLf_Space operator-(HSLf_Space const &b) const
double const & hMin() const
double const & hsl(size_t i, double c)
doubleconst & val(size_t id) const
Return the value of the i -th channel.
double const & s(double c)