Вы можете просто попробовать ограничить значения максимум 255 (0xff).
R = min((int)(f(x,y) * 10.0f), 0xff);
G = min((int)(f(x,y) * 20.0f), 0xff);
B = min((int)(f(x,y) * 30.0f), 0xff);
Редактировать: Существует множество различных способов автоматического преобразования в цвета, ноВы можете обнаружить, что ни один из них не генерирует ту прогрессию, которую вы ищете.Поскольку у вас уже есть изображение приемлемой палитры, одним из методов будет создание таблицы поиска из 256 цветов.
#define RGB(R,G,B) (B<<16|G<<8|R)
int palette[256] = { RGB(0,0,0), RGB(0,0,128), ... };
int greyscale = (int)(f(x,y) * 2.559999);
assert(greyscale >= 0 && greyscale <= 255);
int rgb = palette[greyscale];
Если в таблице поиска слишком много проблем, вы также можете разбить диапазон шкалы серого наразличные поддиапазоны и выполнять линейную интерполяцию между конечными точками каждого диапазона.
int interpolate(int from, int to, double ratio)
{
return from + (int)((to - from) * ratio);
}
if (greyscale <= 48)
{
R = 0;
G = 0;
B = interpolate(0, 255, greyscale/48.0);
}
else if (greyscale <= 96)
{
R = 0;
G = interpolate(0, 255, (greyscale-48)/48.0);
B = interpolate(255, 0, (greyscale-48)/48.0);
}
else if ...