Здрасьте. Моя софтина считает температурное поле во времени. Есть блоки, у каждого блока есть теплофизические параметры. И у каждого блока температура меняется во времени. Я визуализирую температуру через цвет.
Пока что сделал линейный градиент вот таким способом:
QColor Block::colorFromTemperature() const
{
/// Минимальная составляющая цвета
static const int min_color = 0;
/// Максимальная составляющая цвета
static const int max_color = 255;
/// Температура (по модулю), до которой "тянется" градиент
static const qreal max_absolute_temperature = 25;
/// Текущая температура блока
const qreal temperature = m_soil_block.temperature();
/// Составляющая цвета, отражающая температуру
int tmp = max_color - qRound((max_color - min_color)
* qAbs(temperature) / max_absolute_temperature);
tmp = qBound(min_color, tmp, max_color);
const bool temperature_is_positive = temperature > 0;
return QColor(temperature_is_positive ? max_color : tmp,
tmp,
temperature_is_positive ? tmp : max_color);
}
Не нравится. Самые важные изменения температуры идут от -4 до +4: тут нужно визуально отличать блоки с разницей в 0.2 — 0.3 градуса (что не получается с таким градиентом). Но также нужно иметь возможно визуально различать температуры от -25 до +25: после (+/-)4 нужно визуально отличать блоки с разницей 1-2 градуса.
Каким градиентом вы бы такое визуализировали? Думается мне, можно использовать десятичный логарифм для получения tmp, а прочее не менять. Но, может быть, можно ввести второй параметр или даже третий, чтобы цвет шёл от синего через голубой к белому и от белого через розовый к красному?
Вот так это сейчас выглядит: раз, два, три, четыре (зелёное — это количество незамёрзшей воды для блоков, в которых происходит фазовый переход).