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

 
Yury Kulikov:


Verifique seu algoritmo para cores 0,0,0 e 255,255,255.

Vou verificar isso agora.

 
Yury Kulikov:


Verifique seu algoritmo para cores 0,0,0 e 255,255,255.

Verificado. 0,0,0,0,0, - causa um erro. Descarga do conselheiro.

255.255.255 está bem.

Obrigado por esta observação. Vou investigar isso.

 
Реter Konow:

O que você acha, Nikolai?

Você admitiria que fez muito barulho a partir do nada? Sim, o algoritmo pode ser mais lento do que o seu e tinha um par de erros. Ainda não foi depurado no MT5. Mas funciona.

Você percebe mesmo que um código como este

//-----------------------------------------------
   if(Старшая_компонента == Исходный_R)R = Старшая_компонента;
   if(Старшая_компонента == Исходный_G)G = Старшая_компонента;
   if(Старшая_компонента == Исходный_B)B = Старшая_компонента;
//------------------------
   if(Средняя_компонента == Исходный_R)R = Средняя_компонента;
   if(Средняя_компонента == Исходный_G)G = Средняя_компонента;
   if(Средняя_компонента == Исходный_B)B = Средняя_компонента;
//------------------------
   if(Младшая_компонента == Исходный_R)R = Младшая_компонента;
   if(Младшая_компонента == Исходный_G)G = Младшая_компонента;
   if(Младшая_компонента == Исходный_B)B = Младшая_компонента;

é 100% o mesmo que este:

R = Исходный_R;
G = Исходный_G;
B = Исходный_B;

Depois disso, você não deve se perguntar por que seu código é tão mais lento.

 
Реter Konow:

255.255.255 está bem.

Isto é consistente com 99% de "sombras de janelas"?

 
Yury Kulikov:

Vou me juntar às "acusações", não poderia aceitar :)

Um bom exemplo de como não programar. Se é assim que sua GUI inteira está escrita, não a veremos por um tempo. :(

Cada linha é uma "obra-prima": tal pilha de erros e bloqueios, tanta esperança de que o mql4 funcione. Agora entendo porque o mt4 está sendo usado.

Penso que a publicação de tais códigos e a reação subseqüente às críticas não está respeitando a audiência do fórum. Eles não querem lhe fazer mal, eles querem ajudá-lo.

Quanto à comparação de algoritmos, você pode compará-los visualmente. Não é como se você oferecesse provas em números de que seu algoritmo dá sombras 99% próximas a "sombras de janelas".

À esquerda é mais ou menos a sua abordagem, à direita éNikolai Semko. (Um script NikolaiSemko modificado foi usado)


Obrigado, Yuri, por sua participação e compreensão do assunto, assim como pelo exemplo claro. Depois de suas mudanças, meu código ficou mais agradável de se ver.

Mas aqui está um pequeno esclarecimento:

int x;//индекс исходного цвета в массиве оттенков
if(_mode==0) x=(clr.x[ArrayMaximum(clr.x,0,3)]+clr.x[ArrayMinimum(clr.x,0,3)])/2; // Светлота= (MAX+MIN)/2  Вариант из https://ru.wikipedia.org/wiki/HSL. Тот вариант к которому изначально стремился Петр.
if(_mode==1) x=(int)round((clr.rgb.b+clr.rgb.g+clr.rgb.r)/3.0); // мой вариант, который мне кажется более логичным и правильным
if(_mode==2) x=127;                                             // То, что в результате получилась у Петра из-за его алгоритмической путаницы. У него цветовой "сгусток" не гуляет, а стоит ровно по центру.
 
Nikolai Semko:

Obrigado, Yuri, por sua participação e discernimento, assim como pelo exemplo claro. Depois de suas mudanças, meu código ficou mais agradável de se ver.

Mas aqui está um pequeno esclarecimento:

Talvez sim :)

int ColorShades(uint _clr,uint& _shades[],int _mode=0)
{
   SuintRGB clr;
   if(ArrayResize(_shades,256)!=256) return(-1);   //ошибка resize()
   clr.clr=_clr; 
   int x;//индекс исходного цвета в массиве оттенков
   if(_mode==0) x=(ArrayMaximum(clr.x,3)+ArrayMinimum(clr.x,3))/2; // Светлота= (MAX+MIN)/2  Вариант из https://ru.wikipedia.org/wiki/HSL. Тот вариант к которому изначально стремился Петр.
   else if(_mode==1) x=(int)round((clr.rgb.b+clr.rgb.g+clr.rgb.r)/3.0); // мой вариант, который мне кажется более логичным и правильным
   else x=127;                                             // То, что в результате получилась у Петра из-за его алгоритмической путаницы. У него цветовой "сгусток" не гуляет, а стоит ровно по центру.
   double d, kr, kg, kb;
   if(x>0)
   {
      //движение от черного
      d=double(x);
      kr=clr.rgb.r/d;          
      kg=clr.rgb.g/d;
      kb=clr.rgb.b/d;
      for(int i=0; i<=x; i++)
      {
         clr.rgb.r=(uchar)fmin(255,kr*i);
         clr.rgb.g=(uchar)fmin(255,kg*i);
         clr.rgb.b=(uchar)fmin(255,kb*i);
         _shades[i]=clr.clr;
      }
   }
   if(x<255)
   {
      //движение от белого
      d=double(255-x);
      kr=(255-clr.rgb.r)/d;
      kg=(255-clr.rgb.g)/d;
      kb=(255-clr.rgb.b)/d;
      for(int i=255, j=0; i>x; i--, j++)
      {
         clr.rgb.r=(uchar)fmax(0,255.0-kr*j);
         clr.rgb.g=(uchar)fmax(0,255.0-kg*j);
         clr.rgb.b=(uchar)fmax(0,255.0-kb*j);
         _shades[i]=clr.clr;
      }
      if(x==0) _shades[0]=0;
   }
   return(x);
}
 
Nikolai Semko:

Você percebe mesmo que um código como esse

é 100% o mesmo que este:

Depois disso, você não deve se perguntar por que seu código é muito mais lento.

Bem, essa é a estupidez de não entender meu algoritmo.

 
Yury Kulikov:

Talvez sim :)

Sim.
Apenas cometi um erro no início e já o corrigi em um post anterior

if(_mode==0) x=(clr.x[ArrayMaximum(clr.x,0,3)]+clr.x[ArrayMinimum(clr.x,0,3)])/2;
 
Yury Kulikov:

Isto está de acordo com 99% das "sombras do Windows"?

Sim, há um erro. Não notei isso. Atinge o branco no meio da faixa, embora a cor pertença à faixa cinza. Portanto, deve ir para o branco gradualmente.

 
Nikolai Semko:

...

Depois disso você não deve se perguntar por que seu código é tão mais lento.

Geralmente, é conveniente pegar o código comprovado de outra pessoa e, coberto por sua impecabilidade, dizer aos outros (que estão procurando uma solução com suas mentes) o quanto você é melhor. Não é assim, Nicolai?)