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

 
Nikolai Semko:

Pedro, la cuestión es que has puesto una función en el foro para que todos la vean y apliquen la descomposición del color. Pero esta función no genera la matriz de colores necesaria, sino sólo una matriz de cadenas, que sólo es buena para la salida de impresión, en lugar de demostrar su gradiente en la pantalla. Es un cerdo en un charco y no respeta a los demás. Podéis traducirlo vosotros mismos si queréis.

Esto ya es una calumnia y una difamación. He elegido deliberadamente el tipo de cadena, para facilitar la visualización de los componentes y aislarlos. En la primera página expliqué detalladamente mi técnica de solución. No has explicado nada. No estoy seguro de que usted mismo entienda del todo cómo funciona su método de descomposición del color. Si no lo haces, explícalo con tanto detalle como yo.

Y no hagas acusaciones tan fuertes. Es posible que tú mismo te resbales con ellos.

 
Y no te pongas a discutir. Vamos a llegar al fondo de esto.
 
Реter Konow:

Esto es una calumnia y una difamación. Elegí el tipo de cuerda deliberadamente, para que fuera más fácil ver los componentes y aislarlos. En la primera página expliqué con detalle la técnica de mi solución. No has explicado nada. No estoy seguro de que tú mismo entiendas del todo cómo funciona tu método de descomposición del color. Si no lo haces, explícalo con tanto detalle como yo.

Y no hagas acusaciones tan fuertes. Puede que tú mismo te resbales con ellos.

Lo siento, acabo de leer su explicación:

  • En primer lugar, he descompuesto el color en tres componentes principales, definiendo senior, middle y junior.
  • Entonces, empecé a hacer gráficos y a dibujar líneas a través de los valores de los componentes.
  • Mientras observaba cómo cambiaban los números en la paleta a medida que arrastraba el deslizador, me di cuenta de que había una refracción en el ángulo de ascenso de las líneas, porque en algún momento cambió la velocidad de cambio de los números.
  • Coloqué el eje de refracción de las líneas en el centro del gráfico, y vi que cada línea, consta de dos segmentos, cada uno con su propio ángulo de ascensión.
  • Además, al experimentar con la paleta de colores, me di cuenta de que hay un ángulo máximo de ascenso para el componente más alto. Al principio pensé que eran 67,5 grados. Sin embargo, la práctica demostró que es de 63,5 grados.
  • Durante mucho tiempo, no pude averiguar cómo trazar correctamente los segmentos de línea de los componentes de color. Había muchas incógnitas. Pero lo más importante: ¿cómo encontrar la coordenada del color original en el gráfico?
  • Mientras seguía experimentando con la paleta, me di cuenta de que al cambiar el valor del color en un número determinado, el control deslizante se movía una cierta distancia. Poco a poco, me di cuenta de que la distancia a la que se mueve el deslizador es la mitad del valor del componente de orden inferior.
  • Supuse que si encontraba la coordenada de la componente más alta en la línea del ángulo máximo de ascenso y añadía la mitad de la componente más baja a ese punto, encontraría la coordenada del color original en el gráfico. La práctica ha demostrado que la suposición era correcta.
  • Teniendo una coordenada de color inicial y un eje de refracción, podría calcular los ángulos de cada una de las piezas y recibir los valores de cada componente a lo largo de su línea. Usé la trigonometría de la escuela secundaria para eso.

No puedo hacerlo. Es más prosaico y primitivo.
Es difícil de explicar con más amplitud que el propio código:

void Gradient(uint clr,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[2],G=c.c[1],B=c.c[0];
   uint i=0, tone=uint((size-1)*(((double)R+(double)G+(double)B)/765.0)+0.4999);
   double kR,kG,kB;
   if(tone!=0)
     {
      kR=(double)R/tone; 
      kG=(double)G/tone;
      kB=(double)B/tone;
      for(i=0;i<=tone;i++)
        {
         c.c[2]=uchar(i*kR+0.4999);
         c.c[1]=uchar(i*kG+0.4999);
         c.c[0]=uchar(i*kB+0.4999);
         arr[i]=c.clr;
        }
     }
   if(tone!=(size-1))
     {
      kR=(double)(255-R)/(size-i);
      kG=(double)(255-G)/(size-i);
      kB=(double)(255-B)/(size-i);
      for(uint j=1;i<size;i++,j++)
        {
         c.c[2]=uchar(R+j*kR+0.4999);
         c.c[1]=uchar(G+j*kG+0.4999);
         c.c[0]=uchar(B+j*kB+0.4999);
         arr[i]=c.clr;
        }
     }
  }
 
Nikolai Semko:


Una vez más:

  • Toma mi algoritmo como lo he creado. Sin sus correcciones.
  • Establece tu color. Ejecute el script en MT4.
  • Tendrás todos los colores a través de la alerta.
  • Introduzca el color original en la paleta de ventanas.
  • Comprueba la coincidencia.

Esta es la mejor forma de comprobar que el algoritmo funciona correctamente.

A continuación, puede pasar a un control de velocidad.

Tú, en cambio, tomaste mi algoritmo, cambiaste las líneas en él a tu antojo, luego lo ejecutaste en una plataforma diferente y lo mostraste según tu técnica de dibujo. Habiendo hecho tantos cambios independientes, juzgas mi algoritmo como si no te dieras cuenta de cómo tú mismo lo cambiaste y lo pusiste en diferentes condiciones. Condiciones en las que usted mismo podría tener un error. Así que vamos a averiguarlo con calma.

 
Реter Konow:

Una vez más:

  • Toma mi algoritmo como lo he creado. Sin sus correcciones.
  • Establece tu color. Ejecute el script en MT4.
  • Tendrás todos los colores a través de la alerta.
  • Introduzca el color original en la paleta de ventanas.
  • Comprueba la coincidencia.

Esta es la mejor forma de comprobar que el algoritmo funciona correctamente.

A continuación, puede pasar a un control de velocidad.

Tú, en cambio, tomaste mi algoritmo, cambiaste las líneas en él a tu antojo, luego lo ejecutaste en una plataforma diferente y lo mostraste según tu técnica de dibujo. Habiendo hecho tantos cambios independientes, juzgas mi algoritmo como si no te dieras cuenta de cómo tú mismo lo cambiaste y lo pusiste en diferentes condiciones. Condiciones en las que usted mismo podría tener un error. Así que, averigüémoslo con calma.

Peter, no necesito 256 combinaciones de tres dígitos en mi alerta. Necesito color. Lo único que hice en su función fue convertir el color a uint, como debe ser. No he entrado en su algoritmo, porque su lógica está más allá de mi comprensión.

 
Nikolai Semko:

Peter, no quiero 256 combinaciones de tres dígitos de color en una alerta. Necesito color. Lo único que hice en tu función fue convertir el color a uint en vez de a string, como debería ser. No he entrado en su algoritmo, ya que su lógica está más allá de mi comprensión.

Comprobar por números es lo mejor. No se pueden comparar los tonos de color a ojo. Los monitores son diferentes y la percepción puede ser diferente. Por eso las cifras son la mejor comprobación.

Y no hay una lógica desmesurada. Trigonometría escolar.

1. Calcula los ángulos de seis segmentos.

2. A continuación, calcula los valores en cada punto de estos segmentos y escríbelos en una matriz.

Eso es todo.

 
Реter Konow:

Comprobar por los números es lo mejor. No se pueden comparar exactamente los tonos de color a ojo. Los monitores son diferentes y la percepción puede ser diferente. Por eso los números son la mejor comprobación.

Y no hay una lógica desmesurada. Trigonometría escolar.

1. Calcula los ángulos de seis segmentos.

2. A continuación, calcula los valores en cada punto de estos segmentos y escríbelos en una matriz.

Eso es todo.

Pero, de hecho, mi función funciona sin fallos y es 4 veces más rápida. Estoy esperando su resultado cuando proporcione su algoritmo en el 5. Yo tardé un rato sólo copiando a través del portapapeles, y tú tardaste algo más.

 
Nikolai Semko:

Pero en realidad mi función funciona sin fallos y es 4 veces más rápida. Estoy esperando su resultado, cuando proporcione su algoritmo en 5. A mí me costó un rato copiar simplemente a través del portapapeles, y a ti te costó algo más.

Nikolai, eso suena a jardín de infancia. La afirmación "4 veces más rápido" no es válida porque no está probada.


  1. Comenta la línea en tu versión de mi solución en MT5 y verás la diferencia.

canvas.TextOut(300,10,"Время формирования градиентного массива из 256 элементов = "+string(t)+" микросекунд",ColorToARGB(clrWhite));

Esta línea afecta al dibujo de todo el rectángulo por alguna razón. Pero no es mi problema. Compruébalo.

Siguiendo con la búsqueda de esos fallos que tienes. Quiero ver si realmente se debe a mi algoritmo.


Y desactiva el parpadeo innecesario de los números. Quita todas las cosas innecesarias. Que se muestre una vez un simple rectángulo con un degradado de un color original. Sin trucos innecesarios.

 
En general, la función para obtener una matriz de degradados entre dos colores es más útil. Ya que es más simple y más útil en la práctica.
void Gradient(uint clr1,uint clr2,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c1,c2;
   c1.clr=clr1;
   c2.clr=clr2;
   double R1=c1.c[2],G1=c1.c[1],B1=c1.c[0];
   double R2=c2.c[2],G2=c2.c[1],B2=c2.c[0];
   double deltaR=(R2-R1)/(size-1);
   double deltaG=(G2-G1)/(size-1);
   double deltaB=(B2-B1)/(size-1);
   for(uint i=0;i<size;i++)
     {
      R1+=deltaR; c1.c[2]=uchar (R1+0.4999);
      G1+=deltaG; c1.c[1]=uchar (G1+0.4999);
      B1+=deltaB; c1.c[0]=uchar (B1+0.4999);
      arr[i]=c1.clr;
     }
  }

Si necesitas un degradado de un color a blanco o a negro, puedes conseguirlo con esta función.

   color clr=clrViolet;
   uint CLR[];
   Gradient(clrWhite, clr, CLR,100); // получаем массив из 100 элементов градиента от белого цвета до цвета clr 
   Gradient(clr, clrBlack, CLR,100); // получаем массив из 100 элементов градиента от цвета clr до черног цвета  


Archivos adjuntos:
 
Реter Konow:

Comprobar por los números es lo mejor. No se pueden comparar exactamente los tonos de color a ojo. Los monitores son diferentes y la percepción puede ser diferente. Por eso los números son la mejor comprobación.

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 mucho 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 una prueba 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 deNikolai Semko)


Archivos adjuntos: