A função de decompor a cor em tons. - página 17

 

Bem, isso é o suficiente por enquanto. Muito obrigado a todos por sua participação e ajuda na busca de bugs e problemas com meu algoritmo. Um agradecimento especial a você Nikolay e também muitos agradecimentos a Yuri Kulikov por ter apontado erros.

Agradecimentos especiais ao meu Nikolay pelo algoritmo de visualização.

Vou melhorar o código e postar novas e melhores versões aqui. Espero que meu código seja útil a alguém.


ZS. Eu sei que estou tentado a jogar ovos podres no homem, mas vamos nos abster))))

 
Реter Konow:

Bem, me fale mais sobre o delta. Por que. Como. Então, saberei que você mesmo o inventou.

Não entendo. Você está brincando comigo ou não?

Escrevi-o:

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

Bem, posso lhe dizer em não-fórmulas:

Delta R equivale à diferença entre os componentes R das duas cores divididos pelo número de gradientes necessários.

Como estamos interessados em uma mudança linear de cor, ela tem a fórmula usual de linha reta:

y= a+b*x;

em nosso caso

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

Bem, isso é o suficiente por enquanto. Muito obrigado a todos por sua participação e ajuda na busca de bugs e problemas com meu algoritmo. Um agradecimento especial a você Nikolay e também muitos agradecimentos a Yuri Kulikov por ter apontado os erros.

Agradecimentos especiais ao meu Nikolay pelo algoritmo de visualização.

Vou melhorar o código e postar novas e melhores versões aqui. Espero que meu código seja útil a alguém.

ZS. Eu sei que estou tentado a jogar ovos podres no homem, mas vamos nos abster))))

Eu concordo! Só se de repente você precisar de código, vamos levar o código Nikolay com uma dúzia de linhas, não uma centena de linhas).

 
Nunca deixa de me surpreender o quanto as pessoas aparentemente sãs continuam a cair nas provocações do iniciador do tópico. Ele só quer conversar, pessoal!
 
Andrey Khatimlianskii:
Não deixo de me espantar com o quanto as pessoas aparentemente adequadas continuam a cair nas provocações do iniciante do tema. Ele só quer conversar, pessoal!
Você me provocou, Andrew. :)
De fato, é uma tarefa interessante obter uma paleta de cores sem grumos de cor e com o mínimo de distorção de cor. Obviamente, o delta entre os componentes de cor não deve ser uma constante e deve variar suavemente. Nos exemplos acima, tem dois valores: de preto e de branco. É por isso que ficou comigo.
 
Andrey Khatimlianskii:
Não deixo de me surpreender com o quanto as pessoas aparentemente adequadas continuam a cair nas provocações do iniciador do tópico. Ele só quer conversar, pessoal!

Você não se pergunta. Eu lhe explicarei e você entenderá.

  1. Um reflexo subconsciente é desencadeado - para atacar uma forma desconhecida. Se a forma visível for irregular e reivindicar seu lugar neste mundo - ela deve ser destruída. Por quê? - Dois motivos:

  • A forma não-standard é uma ameaça para o mundo padrão.
  • Forma não padronizada - pode ser um sinal de fraqueza, incompleta ou degeneração.

Aparentemente, este reflexo existe no subconsciente de cada indivíduo. Eu represento o epítome de todas as coisas não convencionais na programação. Uma abordagem pouco convencional, um estilo pouco convencional. Assim, alguns, subconscientemente, me percebem como uma ameaça à sua visão de mundo, enquanto outros me percebem como uma fraqueza. Em ambos os casos, há uma tentação de "atacar" e destruir minha posição. A motivação é reforçada pelo desejo de marcar mais "pontos" para mim mesmo.

Entretanto, - uma forma não convencional (que apresento), pode ser um sinal não só de fraqueza ou degradação, mas também um sinal de força e habilidade fenomenais. Neste caso, um Formulário não-padrão pode alegar ser o novo Padrão.


2. A conclusão inconsciente é acionada: "Forma = Essência". A maioria das pessoas julga a Essência pelo Formulário. Se a Forma parece ridícula ou ridícula, o mesmo acontece com a Essência. Todos sabemos que isto não é sinal de uma grande mente, mas estamos sujeitos a este estereótipo.

Na primeira página, expliquei em detalhes a essência do meu conceito. Mas, meus oponentes não apreciaram isso. Eles foram imediatamente fixados no Formulário. Em um algoritmo particular. Eles disseram que era ruim, ridículo, lento. Eles decidiram que derrubar meu algoritmo é suficiente para destruir minha posição. Mas eles não entenderam a idéia que coloquei no algoritmo. Portanto, ao criticar meu algoritmo, eles só me ajudam a melhorá-lo. Ao mesmo tempo, ela ainda tem a mesma essência - o mesmoprincípio de decomposição de cores.

Se meus oponentes tivessem destruído meu conceito, não o algoritmo, eles teriam tido sucesso. Mas eles mesmos não têm conceito. Por isso, minha posição é mais forte.

Tudo isso tem a ver com outras contradições com meus oponentes. Eles julgam minhas idéias pela forma de sua implementação, e não olham para a essência. Enquanto isso continuar assim, eu sempre ganharei. Você quer destruir minha posição? - Explodir meu conceito para estilhaçar no mesmo nível em que eu o crio. Mas isso é mais difícil do que lutar contra uma forma de implementação.

 
Реter Konow:

Você não se pergunta. Explicarei a você e você entenderá.

...

Peter, você está lutando contra moinhos de vento. Bem, há outra opção: você é o Elusive Joe com tudo o que isso implica :)

 
Реter Konow:



Onde está o código do mql5 em funcionamento?

 
Nikolai Semko :


Onde está o código mql5 de trabalho?

 //+------------------------------------------------------------------+
//|                                              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:


Onde está o código do mql5 em funcionamento?

Você está certo sobre "R = Source_R", mas eu o deixei assim porque faz mais sentido como o algoritmo funciona.

Ainda precisamos trabalhar no algoritmo. Não é perfeito. Talvez eu acabe por inventar o mesmo algoritmo que você tem. Mas, ao percorrer todo o caminho, eu vou conseguir incomparavelmente mais. Afinal, passarei por um caminho de conhecimento e compreensão e, portanto, o escopo criativo do algoritmo será muito mais amplo do que se eu apenas copiasse a solução de outra pessoa. Portanto, eu sempre escolho meu próprio caminho.