summaryrefslogtreecommitdiffstats
path: root/color.py
blob: 058abb44b79867918349ea44a33a355d54348bb5 (plain) (blame)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""Color vector library containing HSV and RGB."""
from __future__ import division, unicode_literals
import colorsys
import math

class Vector(object):
    __slots__ = ('x', 'y', 'z')

    """3-dimensional vector class."""
    def __init__(self, x, y, z):
        """Create a vector from its components."""
        self.x = x
        self.y = y
        self.z = z

    def __add__(self, other):
        """Add two vectors."""
        return self.__class__(self.x + other.x, self.y + other.y, self.z + other.z)

    def __sub__(self, other):
        """Subtract two vectors."""
        return self.__class__(self.x - other.x, self.y - other.y, self.z - other.z)

    def __mul__(self, scalar):
        """Multiply a vector by a constant."""
        return self.__class__(self.x * scalar, self.y * scalar, self.z * scalar)

    def __rmul__(self, scalar):
        """Multiply a constant by a vector."""
        return self * scalar

    def __abs__(self):
        """Return the 2-norm of the vector."""
        return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z)

    def __truediv__(self, scalar):
        """Return self * 1 / scalar."""
        return self * (1 / scalar)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y and self.z == other.z

    @property
    def components(self):
        return (self.x, self.y, self.z)


class HSV(Vector):
    """HSV 3-vector."""
    def __init__(self, hue, saturation, value):
        """Initialize with hue, saturation, and value."""
        super(HSV, self).__init__(hue, saturation, value)

    def to_RGB(self):
        """Convert to an RGB vector."""
        return RGB(*colorsys.hsv_to_rgb(self.x, self.y, self.z))

    def h(self):
        """Return hue."""
        return self.x

    def s(self):
        """Return saturation."""
        return self.y

    def v(self):
        """Return value."""
        return self.z


class RGB(Vector):
    """RGB 3-vector."""
    def __init__(self, r, g, b):
        """Initialize with red green and blue."""
        super(RGB, self).__init__(r, g, b)

    def to_HSV(self):
        """Convert to HSV vector."""
        return HSV(*colorsys.rgb_to_hsv(self.x, self.y, self.z))

    def r(self):
        """Return red value."""
        return self.x

    def g(self):
        """Return green value."""
        return self.y

    def b(self):
        """Return blue value."""
        return self.z

red = RGB(1, 0, 0)
green = RGB(0, 1, 0)
blue = RGB(0, 0, 1)
cyan = RGB(0, 1, 1)
magenta = RGB(1, 0, 1)
yellow = RGB(1, 1, 0)
white = RGB(1, 1, 1)
black = RGB(0, 0, 0)