Я пытаюсь написать программу, которая генерирует тепловую карту из источников силы. На данный момент, используя силу в каждом пикселе, я вычисляю составы цветов, используя гауссовские распределения (или просто exp(-(x*x))
). После нормирования, чтобы он всегда давал мне цвет, картина выглядит так:
Это показывает два источника, в центре синих пятен.
Это выглядит круто, но переход между цветами совсем не плавный, и, как вы можете видеть, он имеет черные линии. Я пытался перемещаться по экспоненциальным функциям, делая их менее крутыми и нормируя их так, чтобы они всегда были равны 255. Это лучший результат, который я получил, используя это.
Итак, мой вопрос: есть ли функция, которая лучше подходит, чем e ^ -x² для этой проблемы? Или я что-то могу добавить к функции, чтобы сделать ее более плавной?
В случае, если кто-то хочет пример кода, это функция, которую я использую для написания bmp:
void Field::toBmp(std::ofstream& fp)
{
BmpWriter::writeHeader(x_dim, y_dim, fp);
char buffer[x_dim*y_dim*3 + 54];
int myconst = 10;
int normalizer;
const int MAX = 1000;
unsigned int pow = 0;
for(unsigned int index = 0; index < y_dim; index++)
{
for(unsigned int counter = 0; counter < x_dim; counter++)
{
pow = calculateForce(counter, index) * myconst;
if(pow > MAX)
{
buffer[(index*x_dim + counter)*3 + 0] = 0X00;
buffer[(index*x_dim + counter)*3 + 1] = 0X00;
buffer[(index*x_dim + counter)*3 + 2] = 0XFF;
}
else
{
std::cout << pow << '\n';
buffer[(index*x_dim + counter)*3 + 0] = 255*exp((-std::pow((pow),2.0)/(256*256)));
buffer[(index*x_dim + counter)*3 + 1] = 255*exp((-std::pow((pow-(MAX/2),2.0))/(256*256));
buffer[(index*x_dim + counter)*3 + 2] = 255*exp((-std::pow((pow-MAX),2.0)/(256*256)));
normalizer = 255/(buffer[(index*x_dim + counter)*3 + 2]
+ buffer[(index*x_dim + counter)*3 + 1]
+ buffer[(index*x_dim + counter)*3 + 2] + 0.01);
buffer[(index*x_dim + counter)*3 + 2] *= normalizer;
buffer[(index*x_dim + counter)*3 + 1] *= normalizer;
buffer[(index*x_dim + counter)*3 + 0] *= normalizer;
}
}
}
fp.write(buffer, x_dim*y_dim*3);
}
Для выполнения цветовых интерполяций не оптимально делать это в RGB-пространстве. Я бы использовал HSV или HSL (https://en.wikipedia.org/wiki/HSL_and_HSV). Делая это, вы можете установить постоянное значение «Насыщенность и значение» или «Насыщенность и яркость», а затем сопоставить данные с различными оттенками. Вы делаете это попиксельно (генерируете цвет каждого пикселя на основе его оттенка), а затем применяете функцию преобразования HSL или HSV в RGB, чтобы найти RGB для этого пикселя для вашего BMP (это достаточно легко найти через Google ).