В поддержку Qt

статьи в помощь разработчику

   

Главная

Статьи:

Выбор инструментов разработки

Установка MinGW

Установка Qt 4

Установка Qt 5

Сборка Qt 5

Установка Qt Creator

Проблемы Qt 4.8.3

Распараллеливание компиляции

Распараллеливание для Qt 5.0.1

Сборка отладчика GDB

Установка библиотеки Qwt

Плагин Qwt

Установка QwtPolar

Установка QwtPplot3D

Изменение палитры цветов QwtPlot3D

Конфигурация сборки по умолчанию

Сборка Qt Creator из исходников

Пример использования QwtPlot

Масштабирование QwtPlot в стиле TChart

Синхронное масштабирование

Пример использования QwtPolar

Пример использования QwtPlot3D

Редактирование QSplitter

Сборка в Ubuntu для Windows

Установка пакетов без интернета

Установка драйвера NVIDIA

 

Главная > Изменение палитры цветов QwtPlot3D

 

Изменение палитры цветов библиотеки 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"