Файл: 3D RGB-профиль расходящегося градиента Smooth Cool Warm. Автор Kenneth Moreland.png


  • Файл
  • История файлов
  • Использование файла

3D_RGB_profile_of_the_Smooth_Cool_Warm_diverging_color_gradient_by_Kenneth_Moreland.png (640 × 480 пикселей, размер файла: 30 КБ, MIME - тип: изображение / PNG )

Резюме

Лицензирование

Я, владелец авторских прав на это произведение, публикую его под следующей лицензией:

c src код

#include   // strncat#include   // malloc#include   // log10// цвет = триплет RGB = (таким образом, три байта на пиксель) в порядке красный, зеленый, затем синий // цвет = 3 байта // компонент цвета (канал) = 1 байт = число от 0 до 255 = символ без знака// размер виртуального 2D-массива пикселей // каждый сектор имеет цвет RGB int  iWidth  =  600 ; int  iHeight  ;  //// размер динамического одномерного массива unsigned  char  *  data ; size_t  ColorSize  =  3 ;  // RGB = количество цветовых компонентов = каналы size_t  ArrayLength ;  // количество элементов массива 1D = ENumber = iWidth * iHeight * ColorSize size_t  ElementSize ;  // размер элемента массива в байтах size_t  ArraySize ;  // размер массива в байтах = ElementSize * ArrayLength// ppm файл P6 size_t  HeaderSize  ;  // размер заголовка файла P6 в байтах size_t  FileSize ;  // = Размер заголовка + Размер массива [байты]// выдает позицию 2D точки (ix, iy) в 1D массиве; использует также глобальные переменные: iWidth, ColorSize int  Give_i  (  int  iX ,  int  iY ) {  return  ( iX  +  iY  *  iWidth )  *  ColorSize ;  }/ *  на основе функции Delphi Витольда Яника  https://commons.wikimedia.org/wiki/File:HSV-RGB-comparison.svg ввод: позиция  вывод: массив c = цвет RGB * / void  GiveRainbowColor ( двойная  позиция ,  беззнаковый  символ  c []) {  беззнаковый  символ  nmax = 6 ;  / * количество цветовых сегментов * /  double  m = nmax *  position ;  int  n = ( int ) m ;  // целое число m  двойной  f = m - n ;  // доля m  без знака  char  t = ( int ) ( f * 255 );  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 ) { if  ( position - ( int ) position == 0.0 ) position = 1.0 ;  else  position = position - ( int ) позиция ;} // градиент с 6 сегментами  switch (  n ) {  case  0 :  {  c [ 0 ]  =  255 ;  c [ 1 ]  =  t ;  c [ 2 ]  =  0 ;  перерыв ;  };  случай  1 :  {  c [ 0 ]  =  255  - t ; c [ 1 ]  =  255 ; c [ 2 ]  =  0 ;  перерыв ;  };  случай  2 :  {  c [ 0 ]  =  0 ; c [ 1 ]  =  255 ; c [ 2 ]  =  t ;  перерыв ;  };  случай  3 :  {  c [ 0 ]  =  0 ; c [ 1 ]  =  255  - t ;  c [ 2 ]  =  255 ; перерыв ;  };  случай  4 :  {  c [ 0 ]  =  t ; c [ 1 ]  =  0 ; c [ 2 ]  =  255 ; перерыв ;  };  случай  5 :  {  c [ 0 ]  =  255 ; c [ 1 ]  =  0 ; c [ 2 ]  =  255  - t ; перерыв ;  };  по умолчанию : {  c [ 0 ]  =  255 ; c [ 1 ]  =  0 ; c [ 2 ]  =  0 ; перерыв ;  };  };  // case }/ *  Ваша новая палитра отличается и уродлива. Граница между красным и желтым намного хуже, чем раньше. красно-желтая прерывистость ... сбивает с толку, раздражает. .. для меня, по крайней мере.  https://gitlab.com/adammajewski/LinasArtGallery_MandelbrotSet  http://linas.org/art-gallery/index.html http://linas.org/art-gallery/src/fractal/image/flo2mtv.c struct rgb {  char r;  char g;  char b;  }; статическая структура rgb vlt [256]; void make_cmap (void) {  int я, j;  struct rgb черный;  черный. r = черный. g = черный. b = 0x0;  для (я = 0; я <256; я ++) vlt [я] = черный; // настраиваем  поисковую таблицу по умолчанию  // переход к синему цвету  для (i = 0; i <60; i ++) { vlt [i] .r = 0;  vlt [i] .g = 0;  vlt [i] .b = (char) i * 3;  }  // переход от синего к зеленому  для (i = 60; i <120; i ++) {  vlt [i] .r = 0;  vlt [i] .g = (char) (i-60) * 3;  vlt [я] .b = (символ) (120-я) * 3;  }  // переход от зеленого к желтому  для (i = 120; i <180; i ++) {  // vlt [i] .r = (char) (((i-120) * 7) / 2);  vlt [i] .r = (char) (210 - (7 * (180-i) * (180-i)) / 120);  vlt [i] .g = (символ) (210 -i / 4);  vlt [i] .b = 0;  }  // переход от желтого к красному (розовому)  for (i = 180; i <240; i ++) {  vlt [i] .r = (char) (210 + (3 * (i-180)) / 4);  vlt [i] .g = (char) (510 - 2 * i);  vlt [i] .b = (char) (i-180) / 3;  }  }* / void  GiveLinasColor ( double  position  ,  unsigned  char  c []) {  / * на основе кода Линаса Вепстаса 16 января 1994 г .: void make_cmap (void) * /  int  i ;  int  iMax  =  239 ;  i = ( int ) ( iMax -1 ) * позиция ;  c [ 0 ]  =  c [ 1 ]  =  c [ 2 ]  =  0 ;  / * настраиваем поисковую таблицу по умолчанию * /   // градиент с 4 сегментами  / * переход от черного к синему * /  if  ( i < 60 )  {  c [ 0 ]  =  0 ;  c [ 1 ]  =  0 ;  c [ 2 ]  =  ( символ без знака  ) я * 3 ; } / * переход от синего к зеленому * / if ( i > = 60 && i < 120 ) { c [ 0 ] = 0 ; c [ 1 ] = ( символ без знака ) ( i -60 ) * 3 ; c [ 2 ] = ( символ без знака ) ( 120 - i ) * 3 ; } / * переход от зеленого к желтому * / if ( i > = 120 && i < 180 ) { / * vlt [i] .r = (char) (((i-120) * 7) / 2); * / c [ 0 ] = ( символ без знака ) ( 210 - ( 7 * ( 180 - i ) * ( 180 - i )) / 120 ); c [ 1 ] = ( символ без знака ) ( 210 - i / 4 ); c [ 2 ] = 0 ; } / * переход от желтого к красному (розовому) * / if ( i > = 180 && i < iMax ) { c [ 0 ] = ( unsigned char ) ( 210 + ( 3 * ( i -180 )) / 4 ); c [ 1 ] = ( символ без знака ) ( 510 - 2 * i ); c [ 2 ] = ( символ без знака ) ( я -180 ) / 3 ; }                                                                            }// https://github.com/Gnuplotting/gnuplot-palettes/blob/master/magma.pal void  GiveMagmaColor ( двойная  позиция ,  символ без знака  c []) {  двойной  x ,  x2 ,  x3 ,  x4 , x5 , x6 ,  x7 ,  x8 ; двойной  R ,  G ,  B ; //  x  =  позиция ;  х2  =  х * х ;  х3  =  х * х2 ;  х4  =  х * х3 ;  х5  =  х * х4 ;  х6  =  х * х5 ;  х7  =  х * х6 ;  х8  =  х * х7 ; // найти с помощью https://arachnoid.com/polysolve/  R  =  -2.1104070317295411e-002  +  1.0825531148278227e + 000  *  х  -7.2556742716785472e-002  *  х2  +  6.1700693562312701e + 000  *  х3  -1.1408475082678258e + 001 * х4  +  5.2341915705822935e + 000 * x5 ;  если  ( R < 0,0 )  R  =  0,0 ;  // небольшая поправка G  =  ( -9.6293819919380796e-003  +  8.1951407027674095e-001  *  x  -2.9094991522336970e + 000  *  x2  +  5.4475501043849874e + 000  *  x3  -2.3446957347481536e + 000 * x4 );  если  ( G < 0,0 )  G  =  0,0 ; Б  =  3.4861713828180638e-002  -5.4531128070732215e-001 * х  +  4.9397985434515761e + 001 * х2  -3.4537272622690250e + 002 * х3  +  1.1644865375431577e + 003 * х4  -2.2241373781645634e + 003 * х5  +  2.4245808412415154e + 003 * х6  -1,3968425226952077 е + 003 * x7  + 3.2914755310075969e + 002 * x8 ; // изменить диапазон  c [ 0 ]  =  ( unsigned  char )  255 * R ;  // R  c [ 1 ]  =  ( символ без знака  ) 255 * G ; // G c [ 2 ] = ( символ без знака ) 255 * B ; // B        }void  GiveGrayColorL ( двойная  позиция ,  символ без знака  c []) {   символ  без знака X  =  255 -  255 * позиция ;  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorNL2 ( двойная  позиция ,  символ без знака  c []) {   символ  без знака X  =  255 -  255 * ( позиция * позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorNL3 ( двойная  позиция ,  символ без знака  c []) {   символ  без знака X  =  255 -  255 * ( позиция * позиция * позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorSqrt ( двойная  позиция ,  символ без знака  c []) {   символ  без знака X  =  255 * sqrt ( позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}// от зеленого к черному = void  GiveColorGreen ( двойная  позиция ,  unsigned  char  c []) {  символ  без знака X  =  255 -  255 * ( позиция * позиция * позиция );  // изменить диапазон  c [ 0 ]  =  0 ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  0 ;  // B}void  GiveLinas2Color ( double  position  ,  unsigned  char  c []) {  / * на основе кода Линаса Вепстаса 16 января 1994 г .: void make_cmap (void) * /     // градиент с 4 сегментами 0-0,25-0,5-0,75-1,0  / *  переход от черного к синему = (0,0; 0,25)) * / if  ( position < 0,25 )  {  c [ 0 ]  =  0 ;  c [ 1 ]  =  0 ;  c [ 2 ]  =  708 * позиция ;;  // B  return ;  }  / * переход от синего к зеленому = (0,25; 0,5) * /  if  ( position < 0,5 )  {  c [ 0 ]  =  0 ;  // R  c [ 1 ]  =  -177 + 708 * позиция ;  // G  c [ 2 ]  =  354  -  708 *  position ;;  // B  return ;  }  / * переход от зеленого к желтому = (0,5; 0,75) * /  if  ( position < 0,75 )  {  c [ 0 ]  =  -420 + 840 * позиция ;  // R  c [ 1 ]  =  219-84 * позиция ;  // G  c [ 2 ]  =  0 ;  возврат ;  }  / * позиция> 0,75: переход от желтого к красному (розовому) * /  c [ 0 ]  =  84 + 168 * позиция ;  // R  c [ 1 ]  =  516-480 * позиция ;  // G  c [ 2 ]  =  -57  +  76 * позиция ;  // B  }// http://www.kennethmoreland.com/color-maps/ void  GiveColorCoolWarm ( двойная  позиция ,  символ без знака  c []) {  двойной  R , G , B ;  двойной  x  =  позиция ;  двойной  x2  =  x * x ;  двойной  x3  =  x * x2 ;  двойной  x4  =  x * x3 ;  двойной  x5  =  x * x4 ;  двойной  x6  =  x * x5 ;  R  =  2.4070949725529692e-001  +  8.3340565013768031e-001 * x  +  2.6191922175556543e + 000 * x2  -  4.0994936709055061e + 000 * x3  +  1.1014553405733734e + 000 * x4 ;  G  =  2.8978300321243283e-001  +  2.2641158553110725e + 000 * х  -  6.8483016873914799e + 000 * х2  +  3.0238558676188145e + 001 * х3  -  7.0431595279051223e + 001 * х4  +  6.8583306445298092e + 001 * х5  -  2.4054295028042432e + 001 * x6 ;  B  =  7,4391703318514535e-001  +  1,8345430120497781e + 000 * x  -  3,1885763361607244e + 000 * x2  -  8,4015787106949880e-001 * x3  +  1,6162754134259683e + 000 * x4 ; // изменить диапазон  c [ 0 ]  =  ( unsigned  char )  255 * R ;  // R  c [ 1 ]  =  ( символ без знака  ) 255 * G ; // G c [ 2 ] = ( символ без знака ) 255 * B ; // B        }void  GiveGrayGammaColor ( double  position ,  unsigned  char  c []) {  / *  #from gnuplot  gamma = 2.2  цвет (серый) = серый ** (1./gamma)  установить модель палитры Функции RGB цвет (серый), цвет (серый), цвет (серый) # Черно-белая палитра с коррекцией гаммы  * / двойная гамма = 2.2 ; двойной p = pow ( положение , 1.0 / гамма ); символ без знака X = 255 * p ; // изменить диапазон c [ 0 ] = X ; // R c [ 1 ] = X ; // G c [ 2 ] = X ; // B                          }void  GiveGrayColorNL3Wave2 ( двойная  позиция ,  символ без знака  c []) {  int  сегменты = 2 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть  if  ( p  %  2 ) { position  =  1.0 - position ;}  // обратный градиент  }   символ  без знака X  =  255 -  255 * ( позиция * позиция * позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorNL3Wave10 ( двойная  позиция ,  символ без знака  c []) {  int  сегментов = 10 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть  if  ( p  %  2 ) { position  =  1.0 - position ;}  // обратный градиент  }   символ  без знака X  =  255 -  255 * ( позиция * позиция * позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorSqrtWave ( двойная  позиция ,  беззнаковый  символ  c []) {  int  сегменты = 10 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть  if  ( p  %  2 ) { position  =  1.0 - position ;}  // обратный градиент  }   символ  без знака X  =  255 * sqrt ( позиция );  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorLWave ( двойная  позиция ,  символ без знака  c []) {  int  сегментов = 10 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть  }   символ  без знака X  =  255 -  255 * позиция ;  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorLWaveInverted ( двойная  позиция ,  символ без знака  c []) {  int  сегментов = 10 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть  if  ( p  %  2 ) { position  =  1.0 - position ;}  // обратный градиент  }   символ  без знака X  =  255 -  255 * позиция ;  // изменить диапазон  c [ 0 ]  =  X ;  // R  c [ 1 ]  =  X ;  // G  c [ 2 ]  =  X ;  // B}void  GiveGrayColorNL3Wave5NonInv ( двойная  позиция ,  символ без знака  c []) {  int  сегменты = 5 ;  позиция =  сегменты * позиция ;  / * если позиция> 1, то у нас есть повторение цветов, это может быть полезно * /  if  ( position > 1.0 )  { int  p  =  ( int ) position ;  position = position - p ;  // дробная часть