La funzione di scomporre il colore in sfumature. - pagina 14

 
Yury Kulikov:


Controlla il tuo algoritmo per il colore 0,0,0 e 255,255,255.

Lo controllerò ora.

 
Yury Kulikov:


Controlla il tuo algoritmo per il colore 0,0,0 e 255,255,255.

Controllato. 0,0,0,0, - causa un errore. Il consigliere sta scaricando.

255,255,255 va bene.

Grazie per questa osservazione. Ci darò un'occhiata.

 
Реter Konow:

Cosa ne pensi, Nikolai?

Ammetterebbe di aver fatto molto rumore dal nulla? Sì, l'algoritmo può essere più lento del vostro e aveva un paio di bug. Non è ancora stato debuggato su MT5. Ma funziona.

Vi rendete conto che un codice come questo

//-----------------------------------------------
   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 = Младшая_компонента;

è al 100% uguale a questo:

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

Dopo di che, non dovreste chiedervi perché il vostro codice è molto più lento.

 
Реter Konow:

255,255,255 va bene.

Questo è coerente con il 99% di "finestre in ombra"?

 
Yury Kulikov:

Mi unirò alle "accuse", non potrei prenderlo :)

Un buon esempio di come non programmare. Se questo è il modo in cui l'intera GUI è scritta, non la vedremo per un po'. :(

Ogni riga è un "capolavoro": un tale mucchio di errori e bloopers, tanta speranza che mql4 funzioni. Ora capisco perché si usa mt4.

Penso che la pubblicazione di tali codici e la successiva reazione alle critiche non sia rispettosa del pubblico del forum. Non vogliono farvi del male, vogliono aiutarvi.

Per quanto riguarda il confronto degli algoritmi, è possibile confrontarli visivamente. Non è che tu abbia offerto la prova in numeri che il tuo algoritmo dà sfumature al 99% vicine alle "sfumature delle finestre".

A sinistra c'è più o meno il tuo approccio, a destraquello di Nikolai Semko. (È stato usato uno script di NikolaiSemko modificato)


Grazie, Yuri, per la tua partecipazione e comprensione della questione, così come per il chiaro esempio. Dopo le vostre modifiche il mio codice è diventato più piacevole da guardare.

Ma ecco un piccolo chiarimento:

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:

Grazie, Yuri, per la tua partecipazione e il tuo intuito, così come per il chiaro esempio. Dopo le vostre modifiche il mio codice è diventato più piacevole da guardare.

Ma ecco un piccolo chiarimento:

Forse è così :)

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:

Ti rendi conto che un codice del genere

è al 100% uguale a questo:

Dopo di che non dovreste chiedervi perché il vostro codice è molto più lento.

Beh, questa è la stupidità di non capire il mio algoritmo.

 
Yury Kulikov:

Forse è così :)

Sì...
Solo che ho fatto un errore all'inizio e l'ho già corretto in un post precedente

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

Questo è in linea con il 99% delle "sfumature di Windows"?

Sì, c'è un errore. Non l'ho notato. Raggiunge il bianco a metà della gamma, anche se il colore appartiene alla gamma dei grigi. Quindi dovrebbe passare al bianco gradualmente.

 
Nikolai Semko:

...

Dopo di che non dovreste chiedervi perché il vostro codice è molto più lento.

In generale, è conveniente prendere il codice collaudato di qualcun altro e, coperti dalla sua impeccabilità, dire agli altri (che stanno cercando una soluzione con la loro mente) quanto si è migliori. Non è così, Nicolai?)