[docs]class Colormap:
"""This class is used to create a color map for visualization of points."""
[docs] class Point:
"""Initialize the class.
Args:
value: The scalar value index of the point.
color: The color associated with the value.
"""
[docs] def __init__(self, value, color):
assert (value >= 0.0)
assert (value <= 1.0)
self.value = value
self.color = color
[docs] def __repr__(self):
"""Represent the color and value in the colormap."""
return "Colormap.Point(" + str(self.value) + ", " + str(
self.color) + ")"
# The value of each Point must be greater than the previous
# (e.g. [0.0, 0.1, 0.4, 1.0], not [0.0, 0.4, 0.1, 1.0]
[docs] def __init__(self, points):
self.points = points
[docs] def calc_u_array(self, values, range_min, range_max):
"""Generate the basic array based on the minimum and maximum range passed."""
range_width = (range_max - range_min)
return [
min(1.0, max(0.0, (v - range_min) / range_width)) for v in values
]
# (This is done by the shader now)
[docs] def calc_color_array(self, values, range_min, range_max):
"""Generate the color array based on the minimum and maximum range passed.
Args:
values: The index of values.
range_min: The minimum value in the range.
range_max: The maximum value in the range.
Returns:
An array of color index based on the range passed.
"""
u_array = self.calc_u_array(values, range_min, range_max)
tex = [[1.0, 0.0, 1.0]] * 128
n = float(len(tex) - 1)
idx = 0
for tex_idx in range(0, len(tex)):
x = float(tex_idx) / n
while idx < len(self.points) and x > self.points[idx].value:
idx += 1
if idx == 0:
tex[tex_idx] = self.points[0].color
elif idx == len(self.points):
tex[tex_idx] = self.points[-1].color
else:
p0 = self.points[idx - 1]
p1 = self.points[idx]
dist = p1.value - p0.value
# Calc weights between 0 and 1
w0 = 1.0 - (x - p0.value) / dist
w1 = (x - p0.value) / dist
c = [
w0 * p0.color[0] + w1 * p1.color[0],
w0 * p0.color[1] + w1 * p1.color[1],
w0 * p0.color[2] + w1 * p1.color[2]
]
tex[tex_idx] = c
return [tex[int(u * n)] for u in u_array]
# These are factory methods rather than class objects because
# the user may modify the colormaps that are used.
[docs] @staticmethod
def make_greyscale():
"""Generate a greyscale colormap."""
return Colormap([
Colormap.Point(0.0, [0.0, 0.0, 0.0]),
Colormap.Point(1.0, [1.0, 1.0, 1.0])
])
[docs] @staticmethod
def make_rainbow():
"""Generate the rainbow color array."""
return Colormap([
Colormap.Point(0.000, [0.0, 0.0, 1.0]),
Colormap.Point(0.125, [0.0, 0.5, 1.0]),
Colormap.Point(0.250, [0.0, 1.0, 1.0]),
Colormap.Point(0.375, [0.0, 1.0, 0.5]),
Colormap.Point(0.500, [0.0, 1.0, 0.0]),
Colormap.Point(0.625, [0.5, 1.0, 0.0]),
Colormap.Point(0.750, [1.0, 1.0, 0.0]),
Colormap.Point(0.875, [1.0, 0.5, 0.0]),
Colormap.Point(1.000, [1.0, 0.0, 0.0])
])