Checkpoint.
parent
6d88d757d1
commit
a77d99e8ee
@ -0,0 +1,27 @@
|
||||
class Bounds:
|
||||
|
||||
def __init__(self, min, max=None):
|
||||
self.min = min
|
||||
self.max = max or min
|
||||
|
||||
def merge(self, value):
|
||||
if isinstance(value, Bounds):
|
||||
if value.min < self.min:
|
||||
self.min = value.min
|
||||
if value.max > self.max:
|
||||
self.max = value.max
|
||||
else:
|
||||
if value < self.min:
|
||||
self.min = value
|
||||
if value > self.max:
|
||||
self.max = value
|
||||
|
||||
|
||||
class BoundsSet:
|
||||
|
||||
def merge(self, other):
|
||||
for key, value in other.__dict__.items():
|
||||
if hasattr(self, key):
|
||||
getattr(self, key).merge(value)
|
||||
else:
|
||||
setattr(self, key, Bounds(value.min, value.max))
|
@ -0,0 +1,72 @@
|
||||
def rgb_to_kml(rgb):
|
||||
return 'ff%02x%02x%02x' % (255 * rgb[2], 255 * rgb[1], 255 * rgb[0])
|
||||
|
||||
def _h_to_value(p, q, t):
|
||||
if t < 0.0:
|
||||
t += 1.0
|
||||
elif 1.0 < t:
|
||||
t -= 1.0
|
||||
if t < 1.0 / 6.0:
|
||||
return p + 6.0 * (q - p) * t
|
||||
elif t < 0.5:
|
||||
return q
|
||||
elif t < 2.0 / 3.0:
|
||||
return p + 6.0 * (q - p) * (2.0 / 3.0 - t)
|
||||
else:
|
||||
return p
|
||||
|
||||
|
||||
def hsl_to_rgb(hsl):
|
||||
"Convert a HSL tuple into a RGB tuple."
|
||||
h, s, l = hsl
|
||||
if s == 0:
|
||||
return (l, l, l)
|
||||
q = l * (s + 1.0) if l < 0.5 else l + s - l * s
|
||||
p = 2.0 * l - q
|
||||
r = _h_to_value(p, q, h + 1.0 / 3.0)
|
||||
g = _h_to_value(p, q, h)
|
||||
b = _h_to_value(p, q, h - 1.0 / 3.0)
|
||||
return (r, g, b)
|
||||
|
||||
|
||||
def hsv_to_rgb(hsv):
|
||||
"Convert a HSV tuple into a ABGR tuple."
|
||||
h, s, v = hsv
|
||||
hi = int(h)
|
||||
f = h - hi
|
||||
p = v * (1.0 - f)
|
||||
q = v * (1.0 - f * s)
|
||||
t = v * (1.0 - (1.0 - f) * s)
|
||||
if hi == 0:
|
||||
return (v, t, p)
|
||||
elif hi == 1:
|
||||
return (q, v, p)
|
||||
elif hi == 2:
|
||||
return (p, v, t)
|
||||
elif hi == 3:
|
||||
return (p, q, v)
|
||||
elif hi == 4:
|
||||
return (t, p, v)
|
||||
else:
|
||||
return (v, p, q)
|
||||
|
||||
|
||||
def grayscale(value):
|
||||
"Return a gradient from black to white."
|
||||
if value < 0.0:
|
||||
return 'ff000000'
|
||||
elif 1.0 <= value:
|
||||
return 'ffffffff'
|
||||
else:
|
||||
return 'ff%02x%02x%02x' % (255 * value, 255 * value, 255 * value)
|
||||
|
||||
|
||||
def default(value):
|
||||
"Return a gradient from blue to green to red."
|
||||
if value < 0.0:
|
||||
return rgb_to_kml(hsl_to_rgb((2.0 / 3.0, 1.0, 0.5)))
|
||||
elif 1.0 <= value:
|
||||
return rgb_to_kml(hsl_to_rgb((0.0, 1.0, 0.5)))
|
||||
else:
|
||||
h = 2.0 * (1.0 - value) / 3.0
|
||||
return rgb_to_kml(hsl_to_rgb((h, 1.0, 0.5)))
|
@ -0,0 +1,56 @@
|
||||
class Scale:
|
||||
"A linear scale."
|
||||
|
||||
def __init__(self, title, range, gradient):
|
||||
self.title = title
|
||||
self.range = map(float, range)
|
||||
self.gradient = gradient
|
||||
|
||||
def normalize(self, value):
|
||||
"Normalize value."
|
||||
if value < self.range[0]:
|
||||
return 0.0
|
||||
elif self.range[1] <= value:
|
||||
return 1.0
|
||||
else:
|
||||
return (value - self.range[0]) / (self.range[1] - self.range[0])
|
||||
|
||||
def discretize(self, value, n=32):
|
||||
"Discretize value."
|
||||
if value < self.range[0]:
|
||||
return 0
|
||||
elif value > self.range[1]:
|
||||
return n - 1
|
||||
else:
|
||||
result = int(round(n * self.normalize(value)))
|
||||
if result > n - 1:
|
||||
return n - 1
|
||||
else:
|
||||
return result
|
||||
|
||||
def color(self, value):
|
||||
"Return the color for value."
|
||||
return self.gradient(self.normalize(value))
|
||||
|
||||
def colors(self, n=32):
|
||||
"Return the colors."
|
||||
return [self.gradient(float(i) / (n - 1)) for i in range(0, n)]
|
||||
|
||||
|
||||
class ZeroCenteredScale(Scale):
|
||||
"A bilinear scale centered on zero."
|
||||
|
||||
def normalize(self, value):
|
||||
"Normalize value."
|
||||
if value < 0.0:
|
||||
if value < self.range[0]:
|
||||
return 0.0
|
||||
else:
|
||||
return 0.5 - 0.5 * value / self.range[0]
|
||||
elif value == 0.0:
|
||||
return 0.5
|
||||
else:
|
||||
if self.range[1] <= value:
|
||||
return 1.0
|
||||
else:
|
||||
return 0.5 + 0.5 * value / self.range[1]
|
Loading…
Reference in New Issue