Изменение палитры цветов библиотеки QwtPlot3D
После первого знакомства с библиотекой QwtPlot3D, предоставляющей
средства для построения трехмерных объектов, бросилась в глаза невзрачность
получаемых графиков. Конечно это дело вкуса, но у меня сразу возникло
желание изменить цвета, используемые для раскрашивания поверхностей.
И вот, наконец, дошли руки и до этого.
Палитра стандартных цветов, используемая библиотекой QwtPlot3D,
формируется функцией void StandardColor::reset(unsigned
size). (Наименование классу StandardColor
автор библиотеки дал именно такое, как написано.) Ниже приведена
реализация этой функции в исходниках библиотеки.
из файла "qwt3d_color.cpp"
void StandardColor::reset(unsigned size)
{
colors_ = ColorVector(size);
RGBA elem;
double dsize = size;
for (unsigned int i=0; i!=size; ++i)
{
elem.r = i / dsize;
elem.g = i / dsize / 4;
elem.b = 1 - i/dsize;
elem.a = 1.0;
colors_[i] = elem;
}
}
На вход поступает требуемое количество градаций цветов.
Функция формирует некоторую зависимость интенсивности от номера
цвета для каждой из составляющих RGB. Приведенный ниже рисунок иллюстрирует,
что в итоге получается для случая 256 градаций. Именно такую палитру
цветов мы и наблюдаем при использовании библиотеки QwtPlot3D.
Таким образом, чтобы изменить цвета, надо выбрать иной характер
зависимости компонентов RGB от номера цвета и соответствующим образом
переписать вышеупомянутую функцию. Рассмотрим палитру цветов, которая
для аналогичных целей используется в Матлабе, она иллюстрируется
на следующем рисунке.
Согласитесь, выглядит посимпатичнее. Похоже, что
разработчики из MathWorks не стали заморачиваться и позамствовали
палитру из школьных атласов по географии, похожие цвета там используются
для прорисовки рельефа местности и глубины океанов на физических
картах. Если взять данное распределение цветов за основу, то реализация
функции reset() может выглядеть, например,
следующим образом.
из модифицированного файла "qwt3d_color.cpp"
double fslope(double x)
{
double y = x/16;
if (y < 0.) y = 0.;
if (y > 1.) y = 1.;
return y;
}
void StandardColor::reset(unsigned
size)
{
colors_ = ColorVector(size);
RGBA elem;
double dsz = size;
for (unsigned
int k=0; k < size;
k++)
{
double x = 64*k/dsz;
if (x < 39.)
elem.r = fslope(x-23.);
else elem.r
= fslope(71.-x);
if (x < 23.)
elem.r = fslope(x-7.);
else elem.r
= fslope(55.-x);
if (x < 7.)
elem.r = fslope(x+9.);
else elem.r
= fslope(39.-x);
elem.a = 1.;
colors_[k] = elem;
}
}
Обратите внимание на появившуюся вспомогательную
функцию fslope(). Чтобы не включать ее описание
в заголовочный файл qwt3d_color.h, необходимо,
чтобы ее реализация в файле qwt3d_color.cpp
предшествовала функции reset().
Чтобы все это заработало, следует заново установить библиотеку
QwtPlot3D, о том как это делается можно прочитать в соответствующей
статье. Перед вводом команд
сборки не забудьте внести изменения в реализацию функции reset().
В Windows можно скачать патч qwtplot3d_pal_patch.zip,
распаковать его в папку с исходиками библиотеки, например D:\TEMP\qwtplot3d,
запустить MinGW Shell и ввести команды
cd /d/TEMP/qwtplot3d
patch -Np1 -i qwtplot3d_pal.patch
Оценить достигнутый результат после переустановки
библиотеки можно на проектах из статьи
с примерами использования QwtPlot3D.
проект "demo_plot3d"
проект "demo_plot3d_a"
|