La función de descomponer el color en matices. - página 17

 

Bueno, ya está bien de dar vueltas por ahora. Muchas gracias a todos por su participación y ayuda en la búsqueda de errores y problemas con mi algoritmo. Gracias especialmente a ti, Nikolay, y también muchas gracias a Yuri Kulikov por señalar los errores.

Un agradecimiento especial a mi Nikolay por el algoritmo de visualización.

Mejoraré el código y publicaré aquí nuevas y mejores versiones. Espero que alguien lo utilice.


ZS. Sé que tengo la tentación de tirarle huevos podridos al hombre, pero abstengámonos))

 
Реter Konow:

Bueno, cuéntame más sobre el delta. Por qué. Cómo. Entonces sabré que se te ocurrió a ti.

No lo entiendo. ¿Me estás tomando el pelo o qué?

Lo escribí:

deltaR=(R2-R1)/(size-1);

Bueno, puedo decírselo en forma de no fórmulas:

Delta R es igual a la diferencia entre los componentes R de los dos colores dividida por el número necesario de gradientes.

Como nos interesa un cambio lineal de color, tiene la fórmula habitual de la línea recta:

y= a+b*x;

en nuestro caso

текущая_составляющая_цветаR = составляющая_R_ цвета1 + дельта_R * номер_текущего_элемента_массива;
текущая_составляющая_цветаG = составляющая_G_ цвета1 + дельта_G * номер_текущего_элемента_массива;
текущая_составляющая_цветаB = составляющая_B_ цвета1 + дельта_B * номер_текущего_элемента_массива;
 
Реter Konow:

Bueno, ya está bien de dar vueltas por ahora. Muchas gracias a todos por su participación y ayuda en la búsqueda de errores y problemas con mi algoritmo. Gracias especialmente a ti, Nikolay, y también muchas gracias a Yuri Kulikov por señalar los errores.

Un agradecimiento especial a mi Nikolay por el algoritmo de visualización.

Mejoraré el código y publicaré aquí nuevas y mejores versiones. Espero que mi código sea útil para alguien.

ZS. Sé que tengo la tentación de tirarle huevos podridos al hombre, pero abstengámonos))

Estoy de acuerdo. Sólo si de repente necesitas código, tomemos el código de Nikolay con una docena de líneas, no una extensión de cien líneas).

 
Nunca deja de sorprenderme cómo personas aparentemente cuerdas siguen cayendo en las provocaciones del tópico. ¡Sólo quiere hablar, gente!
 
Andrey Khatimlianskii:
No deja de sorprenderme cómo personas aparentemente adecuadas siguen cayendo en las provocaciones del tópico. ¡Sólo quiere hablar, gente!
Me has tomado el pelo, Andrew. :)
En realidad, es una tarea interesante conseguir una paleta de colores sin aglomeraciones y con una mínima distorsión del color. Obviamente, el delta entre los componentes del color no debe ser una constante y debe variar suavemente. En los ejemplos anteriores tiene dos valores: de negro y de blanco. Por eso se me quedó grabada.
 
Andrey Khatimlianskii:
No deja de sorprenderme cómo personas aparentemente adecuadas siguen cayendo en las provocaciones del tópico. ¡Sólo quiere hablar, gente!

No se pregunta. Te lo explicaré y lo entenderás.

  1. Se desencadena un reflejo subconsciente: atacar una forma desconocida. Si la forma visible es inferior y reclama su lugar en este mundo, debe ser destruida. ¿Por qué? - Por dos razones:

  • La forma no estándar es una amenaza para el mundo estándar.
  • Forma no estándar: puede ser un signo de debilidad, de incompletud o de degeneración.

Al parecer, este reflejo existe en el subconsciente de cada individuo. Represento el epítome de todo lo no convencional en la programación. Un enfoque no convencional, un estilo no convencional. Así que algunos, inconscientemente, me ven como una amenaza para su imagen del mundo, mientras que otros me ven como una debilidad. En ambos casos, existe la tentación de "atacar" y destruir mi posición. La motivación aumenta por el deseo de conseguir más "puntos" para mí.

Sin embargo, - una forma no convencional (que yo presento), puede ser un signo no sólo de debilidad o degradación, sino también un signo de fuerza y habilidad fenomenales. En este caso, un formulario no estándar puede pretender ser la nueva norma.


2. La conclusión inconsciente se dispara: "Forma = Esencia". La mayoría de la gente juzga la Esencia por la Forma. Si la Forma parece ridícula o absurda, también lo es la Esencia. Todos sabemos que esto no es un signo de una gran mente, pero estamos sujetos a este estereotipo.

En la primera página, expliqué en detalle la esencia de mi concepto. Pero, mis oponentes no lo apreciaron. Inmediatamente se fijaron en la Forma. En un algoritmo concreto. Decían que era malo, ridículo, lento. Decidieron que derribar mi algoritmo es suficiente para destruir mi posición. Pero no entendieron la idea que puse en el algoritmo. Por lo tanto, al criticar mi algoritmo, sólo me ayudan a mejorarlo. Al mismo tiempo, sigue teniendo la misma esencia, el mismoprincipio de descomposición del color.

Si mis adversarios hubieran destruido mi concepto, y no el algoritmo, habrían triunfado. Pero ellos mismos no tienen ningún concepto. Por lo tanto, mi posición es más fuerte.

Todo lo anterior tiene que ver con otras contradicciones con mis oponentes. Juzgan mis ideas por la forma de su aplicación, y no se fijan en la esencia. Mientras siga siendo así, siempre ganaré. ¿Quieres destruir mi posición? - Haz que mi concepto se haga añicos en el mismo nivel en que lo creo. Pero eso es más difícil que luchar contra una forma de aplicación.

 
Реter Konow:

No se pregunta. Te lo explicaré y lo entenderás.

...

Peter, estás luchando contra molinos de viento. Bueno, hay otra opción: eres Elusive Joe con todo lo que eso conlleva :)

 
Реter Konow:



¿Dónde está el código mql5 que funciona?

 
Nikolai Semko :


¿Dónde está el código mql5 de trabajo?

 //+------------------------------------------------------------------+
//|                                              Gradient test 1.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
union rgb { uint clr; uchar c[ 4 ];};
rgb C,cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   CCanvas canvas;
   if (!canvas.CreateBitmapLabel( "Gradient" , 200 , 200 , 768 , 256 , COLOR_FORMAT_ARGB_NORMALIZE )) { Print ( "Error creating canvas: " , GetLastError ()); }
   double d= 5 ;
   uint Gradient[ 256 ];
   while (! IsStopped ())
     {
      C.c[ 2 ]= uchar ( 127.5 *( 1 + sin (d* 1.2 ))+ 0.4999 ); C.c[ 1 ]= uchar ( 127.5 *( 1 + sin (d* 1.9 ))+ 0.4999 ); C.c[ 0 ]= uchar ( 127.5 *( 1 + sin (d* 2.8 ))+ 0.4999 );   // генерируем новый цвет
      cc.clr=C.clr;
       ulong t= GetMicrosecondCount ();
      Диапазон_оттенков(C.clr,Gradient);
       //Gradient(C.clr,Gradient,256);
      t= GetMicrosecondCount ()-t;
       for ( int y= 0 ; y< 256 ; y++)
        {
         //Alert(__FUNCTION__,"  Gradient[",y,"]  ",Gradient[y]);
         //canvas.LineHorizontal(0,767,y,ColorToARGB(StringToColor(Gradient[y]),255));
         canvas.LineHorizontal( 0 , 767 ,y, ColorToARGB (Gradient[y], 255 ));
         C.clr=Gradient[y];
         canvas.PixelSet(( int )C.c[ 2 ]+( int )C.c[ 1 ]+( int )C.c[ 0 ],y, ColorToARGB ( clrWhite ));
         if (C.c[ 1 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 2 ]/( double )C.c[ 1 ]+ 50.0 *( int )C.c[ 0 ]/( double )C.c[ 1 ]),y, ColorToARGB ( clrGreen ));
         if (C.c[ 2 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 1 ]/( double )C.c[ 2 ]+ 50.0 *( int )C.c[ 0 ]/( double )C.c[ 2 ]),y, ColorToARGB ( clrRed ));
         if (C.c[ 0 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 2 ]/( double )C.c[ 0 ]+ 50.0 *( int )C.c[ 1 ]/( double )C.c[ 0 ]),y, ColorToARGB ( clrBlue ));
        }
      canvas.FillRectangle( 500 , 75 , 660 , 150 , ColorToARGB (cc.clr, 240 ));
      canvas.FontSet( "Tahoma" , 20 ); 
      canvas. TextOut ( 510 , 85 , "R = " + string (cc.c[ 2 ]), ColorToARGB (~cc.clr)); 
      canvas. TextOut ( 510 , 107 , "G = " + string (cc.c[ 1 ]), ColorToARGB (~cc.clr)); 
      canvas. TextOut ( 510 , 129 , "B = " + string (cc.c[ 0 ]), ColorToARGB (~cc.clr));
      canvas.FontSet( "Times New Roman" , 15 );
      canvas. TextOut ( 300 , 10 , "Время формирования градиентного массива из 256 элементов = " + string (t)+ " микросекунд" , ColorToARGB ( clrWhite ));
      canvas.Update();
      d+= 0.01 ;
       Sleep ( 30 );
     }
   canvas.Destroy();
//------------------------
  }
//+------------------------------------------------------------------+
//================================================================================================================================================================
void Диапазон_оттенков( color _Цвет, uint &Все_оттенки[])
{
 color R = 0 , G = 0 ,  B = 0 ;
 int    q = 0 , w1 = 0 , w2 = 0 ;
 //------------------------------------------------------
 uint Этот_цвет;
 double Тангенс_угла_старшего_треугольника_1,      
        Тангенс_угла_среднего_треугольника_1,                  
        Тангенс_угла_младшего_треугольника_1,                       
        Значение_в_точке_преломления_старшей_компоненты,  
        Значение_в_точке_преломления_средней_компоненты,
        Значение_в_точке_преломления_младшей_компоненты,    
        Тангенс_угла_старшего_треугольника_2,
        Тангенс_угла_среднего_треугольника_2,    
        Тангенс_угла_младшего_треугольника_2;
 //------------------------------------------------------
 double pi = 3.1415926536 ,
        Comp_1,Comp_2,Comp_3,
         //-----------------------------------------------
        Первая_компонента = 0.0 ,
        Вторая_компонента = 0.0 ,
        Третья_компонента = 0.0 ,
         //-----------------------------------------------
        Исходный_R = GetR(_Цвет), 
        Исходный_G = GetG(_Цвет),  
        Исходный_B = GetB(_Цвет),  
         //-----------------------------------------------
        Старшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 2 ), 
        Средняя_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 1 ), 
        Младшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 0 ), 
         //-----------------------------------------------
        Координата_исходного_цвета = Старшая_компонента/ tan (( 63.43989 *pi)/ 180 ) + Младшая_компонента/ 2 ; 
         //-----------------------------------------------
        
 //-----------------------------------------------
 if (Старшая_компонента == Исходный_R)R = ( color )Старшая_компонента;
 if (Старшая_компонента == Исходный_G)G = ( color )Старшая_компонента; 
 if (Старшая_компонента == Исходный_B)B = ( color )Старшая_компонента;     
 //------------------------
 if (Средняя_компонента == Исходный_R)R = ( color )Средняя_компонента;
 if (Средняя_компонента == Исходный_G)G = ( color )Средняя_компонента; 
 if (Средняя_компонента == Исходный_B)B = ( color )Средняя_компонента; 
 //------------------------
 if (Младшая_компонента == Исходный_R)R = ( color )Младшая_компонента;
 if (Младшая_компонента == Исходный_G)G = ( color )Младшая_компонента; 
 if (Младшая_компонента == Исходный_B)B = ( color )Младшая_компонента; 
 //------------------------------------------------
   
 //==========================================================================================
 if (Координата_исходного_цвета <= 127 )
   {
    Тангенс_угла_старшего_треугольника_1  = Старшая_компонента/Координата_исходного_цвета;
    Тангенс_угла_среднего_треугольника_1  = Средняя_компонента/Координата_исходного_цвета;     
    Тангенс_угла_младшего_треугольника_1  = Младшая_компонента/Координата_исходного_цвета;
     //-----------------------------------------------
    Значение_в_точке_преломления_старшей_компоненты  = Тангенс_угла_старшего_треугольника_1* 128 ;
    Значение_в_точке_преломления_средней_компоненты  = Тангенс_угла_среднего_треугольника_1* 128 ;
    Значение_в_точке_преломления_младшей_компоненты  = Тангенс_угла_младшего_треугольника_1* 128 ;    
     //-----------------------------------------------    
    Тангенс_угла_старшего_треугольника_2  = ( 255 - Значение_в_точке_преломления_старшей_компоненты)/ 128 ;
    Тангенс_угла_среднего_треугольника_2  = ( 255 - Значение_в_точке_преломления_средней_компоненты)/ 128 ;       
    Тангенс_угла_младшего_треугольника_2  = ( 255 - Значение_в_точке_преломления_младшей_компоненты)/ 128 ;
     //-----------------------------------------------    
     for ( int a1 = 0 ; a1 < 128 ; a1++)
      {
       Comp_1 = Тангенс_угла_старшего_треугольника_1*a1;
       Comp_2 = Тангенс_угла_среднего_треугольника_1*a1;
       Comp_3 = Тангенс_угла_младшего_треугольника_1*a1;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       if (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Все_оттенки[a1] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента));
       //---------------------------------------------------------------------------    
       w1++;
      }
     //------------------------------------------------------------------------------
     for ( int a2 = 255 ; a2 >= w1; a2--)
      {
       Comp_1 = 255 - Тангенс_угла_старшего_треугольника_2*q;
       Comp_2 = 255 - Тангенс_угла_среднего_треугольника_2*q;
       Comp_3 = 255 - Тангенс_угла_младшего_треугольника_2*q;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       if (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------       
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Все_оттенки[a2] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента)); 
       //---------------------------------------------------------------------------
       q++;
      }
  } 
 //------------------------------------------------------------------------------
 if (Координата_исходного_цвета > 127 )
   {
    Тангенс_угла_старшего_треугольника_1  = ( 255 - Старшая_компонента)/( 255 - Координата_исходного_цвета);
    Тангенс_угла_среднего_треугольника_1  = ( 255 - Средняя_компонента)/( 255 - Координата_исходного_цвета);       
    Тангенс_угла_младшего_треугольника_1  = ( 255 - Младшая_компонента)/( 255 - Координата_исходного_цвета);
     //-----------------------------------------------
    Значение_в_точке_преломления_старшей_компоненты  = 255 - (Тангенс_угла_старшего_треугольника_1* 128 );
    Значение_в_точке_преломления_средней_компоненты  = 255 - (Тангенс_угла_среднего_треугольника_1* 128 );
    Значение_в_точке_преломления_младшей_компоненты  = 255 - (Тангенс_угла_младшего_треугольника_1* 128 );    
     //-----------------------------------------------    
    Тангенс_угла_старшего_треугольника_2  = Значение_в_точке_преломления_старшей_компоненты/ 128 ;
    Тангенс_угла_среднего_треугольника_2  = Значение_в_точке_преломления_средней_компоненты/ 128 ;      
    Тангенс_угла_младшего_треугольника_2  = Значение_в_точке_преломления_младшей_компоненты/ 128 ;
     //-----------------------------------------------    
     for ( int b1 = 0 ; b1 < 128 ; b1++)
      {
       Comp_1 = Тангенс_угла_старшего_треугольника_2*b1;
       Comp_2 = Тангенс_угла_среднего_треугольника_2*b1;
       Comp_3 = Тангенс_угла_младшего_треугольника_2*b1;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       if (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Все_оттенки[b1] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента));
       //---------------------------------------------------------------------------    
       w2++;
      }
     //------------------------------------------------------------------------------
     for ( int b2 = 255 ; b2 >= w2; b2--)
      {
       Comp_1 = 255 - Тангенс_угла_старшего_треугольника_1*q;
       Comp_2 = 255 - Тангенс_угла_среднего_треугольника_1*q;
       Comp_3 = 255 - Тангенс_угла_младшего_треугольника_1*q;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       if (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------       
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Этот_цвет = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента));
       //---------------------------------------------------------------------------    
       Все_оттенки[b2] = Этот_цвет; 
       //---------------------------------------------------------------------------
       q++;
      }
   }   
 //------------------------------------------------------------------------------  
}
//+------------------------------------------------------------------+
//| Получение значения компонента R                                  |
//+------------------------------------------------------------------+
double GetR( const color aColor)
  {
   return (aColor& 0xff );
  }
//+------------------------------------------------------------------+
//| Получение значения компонента G                                  |
//+------------------------------------------------------------------+
double GetG( const color aColor)
  {
   return ((aColor>> 8 )& 0xff );
  }
//+------------------------------------------------------------------+
//| Получение значения компонента B                                  |
//+------------------------------------------------------------------+
double GetB( const color aColor)
  {
   return ((aColor>> 16 )& 0xff );
  }
//--------------------------------------------------------------------
double Нужная_компонента( double C1, double C2, double C3, int Index)
{
 double Components[ 3 ]; 
 //----------------------------------------------
 Components[ 0 ] = C1;
 Components[ 1 ] = C2;
 Components[ 2 ] = C3;
 //----------------------------------------------
 ArraySort (Components);
 //----------------------------------------------
 return (Components[Index]);
}
//=============================================================================
 
Nikolai Semko:


¿Dónde está el código mql5 que funciona?

Tienes razón en lo de "R = Source_R", pero lo dejé así porque tiene más sentido el funcionamiento del algoritmo.

Todavía tenemos que trabajar en el algoritmo. No es perfecto. Quizás al final dé con el mismo algoritmo que tú. Pero llegando hasta el final, obtendré incomparablemente más. Al fin y al cabo, pasaré por un camino de conocimiento y comprensión, y por tanto el alcance creativo del algoritmo será mucho más amplio que si me limitara a copiar la solución de otra persona. Por lo tanto, siempre elijo mi propio camino.
Razón de la queja: