1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
class Color
{
public:
union
{
struct
{
double x;
double y;
double z;
};
double c[3];
};
Color() : x(0.0), y(0.0), z(0.0) {}
Color(const double& t) : x(t), y(t), z(t) {}
Color(const double& _x, const double& _y, const double& _z = 0.0) : x(_x), y(_y), z(_z) {}
Color(const Color& _v) : x(_v.x), y(_v.y), z(_v.z) {}
Color(const double* comp) : x(comp[0]), y(comp[1]), z(comp[2]) {}
Color& operator = (const Color& v) { x = v.x; y = v.y; z = v.z; return *this; }
Color& operator += (const Color& v) { x += v.x; y += v.y; z += v.z; return *this; }
Color& operator -= (const Color& v) { x -= v.x; y -= v.y; z -= v.z; return *this; }
Color& operator *= (const Color& v) { x *= v.x; y *= v.y; z *= v.z; return *this; }
Color& operator *= (const double& f) { x *= f; y *= f; z *= f; return *this; }
Color& operator /= (const Color& v) { x /= v.x; y /= v.y; z /= v.z; return *this; }
Color& operator /= (const double& f) { x /= f; y /= f; z /= f; return *this; }
Color operator + (const Color& v) const { return Color(x + v.x, y + v.y, z + v.z); }
Color operator - (const Color& v) const { return Color(x - v.x, y - v.y, z - v.z); }
Color operator - () const { return Color(-x, -y, -z); }
Color operator * (const Color& v) const { return Color(x * v.x, y * v.y, z * v.z); }
Color operator * (const double& v) const { return Color(x * v, y * v, z * v); }
Color operator / (const Color& v) const { return Color(x / v.x, y / v.y, z / v.z); }
Color operator / (const double& v) const { return Color(x / v, y / v, z / v); }
double LengthSq() const { return x*x + y*y + z*z; }
void NormalizeEx() { this /= sqrt(LengthSq() + 0.0000001); }
Color Interpolate(const Color& v, const double& t) { return Color(this + t * (v - this)).NormalizeEx(); }
};
|