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

 
Yury Kulikov:


Compruebe su algoritmo para el color 0,0,0 y 255,255,255.

Lo comprobaré ahora.

 
Yury Kulikov:


Compruebe su algoritmo para el color 0,0,0 y 255,255,255.

Comprobado. 0,0,0,0, - provoca un error. El asesor está descargando.

255,255,255 está bien.

Gracias por esta observación. Lo investigaré.

 
Реter Konow:

¿Qué piensas, Nikolai?

¿Admites que has hecho mucho ruido de la nada? Sí, el algoritmo puede ser más lento que el tuyo y tenía un par de fallos. Todavía no está depurado en MT5. Pero funciona.

¿Te das cuenta de que un 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 = Младшая_компонента;

es 100% igual a este:

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

Después de eso, no deberías preguntarte por qué tu código es mucho más lento.

 
Реter Konow:

255,255,255 está bien.

¿Esto es coherente con el 99% de las "persianas"?

 
Yury Kulikov:

Me sumo a las "acusaciones", no podría soportarlo :)

Un buen ejemplo de cómo no programar. Si así es como está escrita toda la interfaz gráfica de usuario, no la veremos durante un tiempo. :(

Cada línea es una "obra maestra": tal montón de errores y meteduras de pata, tanta esperanza de que mql4 funcione. Ahora entiendo por qué se utiliza mt4.

Creo que la publicación de dichos códigos y la posterior reacción a las críticas no es respetuosa con el público del foro. No quieren hacerte daño, quieren ayudarte.

En cuanto a la comparación de los algoritmos, se pueden comparar visualmente. No es que hayas ofrecido pruebas en números de que tu algoritmo da tonos 99% cercanos a los "tonos de las ventanas".

A la izquierda está tu enfoque, a la derechael de Nikolai Semko. (Se utilizó un guión modificado de NikolaiSemko)


Gracias, Yuri, por tu participación y comprensión del asunto, así como por el claro ejemplo. Después de tus cambios mi código se volvió más agradable de ver.

Pero aquí hay una pequeña aclaración:

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:

Gracias, Yuri, por tu participación y perspicacia, así como por el claro ejemplo. Después de tus cambios mi código se volvió más agradable de ver.

Pero aquí hay una pequeña aclaración:

Tal vez sea así :)

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:

¿Te das cuenta de que un código como ese

es 100% igual a este:

Después de eso no deberías preguntarte por qué tu código es mucho más lento.

Bueno, esa es la estupidez de no entender mi algoritmo.

 
Yury Kulikov:

Tal vez sea así :)

Sí.
Sólo que cometí un error al principio y ya lo he corregido en un post anterior

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

¿Está esto en línea con el 99% de los "tonos de Windows"?

Sí, hay un error. No lo noté. Llega al blanco por la mitad de la gama, aunque el color pertenece a la gama de grises. Así que debería pasar a blanco gradualmente.

 
Nikolai Semko:

...

Después de eso no deberías preguntarte por qué tu código es mucho más lento.

Por lo general, es conveniente tomar el código probado de otra persona y, amparado en su impecabilidad, decirle a los demás (que buscan una solución con la mente) lo mucho mejor que eres tú. ¿No es así, Nicolai?)