Если вам нужно , чтобы использовать справочную таблицу и иметь дело с данными с плавающей запятой, вам придется разделить данные с плавающей запятой на отдельные диапазоны, а затем искать каждый диапазон в вашей таблице.
Однако использование таблицы поиска здесь неуместно;почему бы не определить функцию отображения, которая принимает ваше значение с плавающей точкой в качестве входных данных и возвращает значение RGB?Я использовал это для раскраски фракталов (см. Раздел «Раскраска» в http://jk.ozlabs.org/projects/lca2008-hackfest/).
). По сути, мой подход заключается в упрощенном преобразовании HSV в RSB с использованием постоянных значений для Насыщенности и Значения и плавающеготочечные входные данные для оттенка. Это даст вашим значениям следующие выходные данные RGB:
См. http://jk.ozlabs.org/blog/post/65/hackfest08-solution-2/ для некоторых фракталов, окрашенных с использованием этой функции отображения.
У меня есть некоторый код на C для этого, который можно легко преобразовать в python. Обратите внимание, что здесь предполагается, что 0 <= i <= 1, тогда как вы, вероятно, хотите -1 <= i <= 1: </p>
/* for a value x (which is between x_min and x_max), interpolate a y value
* (between y_min and y_max) of the same proportion.
*/
static float interpolate(float x, float x_min, float x_max,
float y_min, float y_max)
{
x = (x - x_min) / (x_max - x_min);
return x * (y_max - y_min) + y_min;
}
/*
* given a the i and i_max values from a point in our (x,y) coordinates,
* compute the colour of the pixel at that point.
*
* This function does a simplified Hue,Saturation,Value transformation to
* RGB. We take i/i_max as the Hue, and keep the saturation and value
* components fixed.
*/
void colour_map(struct pixel *pix, float i, float i_max)
{
const float saturation = 0.8;
const float value = 0.8;
float v_min, hue;
hue = i / (i_max + 1);
v_min = value * (1 - saturation);
/* create two linear curves, between value and v_min, of the
* proportion of a colour to include in the rgb output. One
* is ascending over the 60 degrees, the other descending
*/
if (hue < 0.25) {
pix->r = value * 255;
pix->g = interpolate(hue, 0.0, 0.25, v_min, value) * 255;
pix->b = v_min * 255;
} else if (hue < 0.5) {
pix->r = interpolate(hue, 0.25, 0.5, value, v_min) * 255;
pix->g = value * 255;
pix->b = v_min * 255;
} else if (hue < 0.75) {
pix->r = v_min * 255;
pix->g = value * 255;
pix->b = interpolate(hue, 0.5, 0.75, v_min, value) * 255;
} else {
pix->r = v_min * 255;
pix->g = interpolate(hue, 0.75, 1.0, value, v_min) * 255;
pix->b = value * 255;
}
pix->a = 255;
}