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

 
Vladislav Andruschenko:


Bueno, los nombres ingleses se inventaron por una razón.

Puedo darte otro ejemplo en el que los nombres rusos acabarán con tu código:

Le das tu código a un cliente que no tiene cirílico. Eso es todo. .... todo se ha ido..... :-)

¿Y el cliente necesita el código o la solución?

 
Реter Konow:

¿El cliente quiere el código o la solución?

por eso hay que decidir el objetivo y los usuarios finales.

Ponte en la piel del usuario y olvida todo lo que has hecho: ¿cómo se sentirá el usuario?

¿Todo tendrá sentido para él o ella?

 
Vladislav Andruschenko:

por eso hay que decidir el objetivo y los usuarios finales.

Ponte en la piel del usuario y olvida todo lo que has hecho: ¿cómo se sentirá el usuario?

¿Lo entenderá todo?

Estoy de acuerdo. Escribo en dos idiomas. Puedo hacerlo puramente en inglés.

 
Реter Konow:

Usted, como angloparlante, es libre de ignorar mi decisión. Hay pocas palabras en inglés.

Por cierto, ya que eres tan bueno con el código en inglés, por favor ayúdame con el código propuesto por Nikolay Semko:

Sinceramente, no entiendo cómo funciona. Tiene muchas sílabas cortas en inglés. Justo lo que te gusta.

Esa es la cuestión, sé un 30% de inglés, y sólo técnico, no conversacional.

En programación, sólo hay un par de docenas de palabras, y se pueden memorizar después de escribir literalmente 1-2 programas.

P.D. El código que has colgado, sólo hay 5 variables, ¿cómo no van a entenderlo?

 
Vitaly Muzichenko:

Esa es la cuestión, sé un 30% de inglés, y sólo técnico, no conversacional.

En programación sólo hay un par de docenas de palabras, y se pueden memorizar escribiendo literalmente 1-2 programas.

P.D. El código que has colgado, sólo hay 5 variables, ¿cómo no van a entenderlo?

Bueno, he contado 30 variables en mi código (en la función principal). ¿Y a cuántos cuentas? (es una broma).

El 30% del inglés técnico es muy fuerte. ¿Sabes lo rico que es el inglés técnico?

¿Un par de docenas de palabras en programación? Ahora veo por qué no nos entendemos)).


zy. Si te refieres al código de Nikolai, aclara cómo funciona.

 
En definitiva, el tema se puede cerrar. Me alegro si alguien encuentra útil el código. Si no, entonces no...
 
Реter Konow:

Por cierto, a juzgar por la imagen, la descomposición del color aquí no es completa. Sólo la mitad. La gama debe abarcar desde el blanco total hasta el negro total, pasando por todas las tonalidades de un color determinado.

Sí, tienes razón.

He intentado implementarlo y analizar y visualizar su código.

Esto es lo que resultó:

#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

union rgb {uint clr; uchar c[4];};
void OnStart()
  {
   rgb c,cc;
   double d=5;
   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;
      uint CLR[];
      ulong t=GetMicrosecondCount();
      Gradient(c.clr,CLR,W.Height);
      t=GetMicrosecondCount()-t;
      for(int y=0; y<W.Height; y++)
        {
         Canvas.LineHorizontal(0,W.Width-1,y,ColorToARGB(CLR[y],240));
         c.clr=CLR[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(W.Width/2-80,W.Height/2-50,W.Width/2+80,W.Height/2+50,ColorToARGB(cc.clr,240));
      Canvas.CurentFont("Tahoma",20,22,ColorToARGB(~cc.clr)); // 20 -  размер шрифта, 22 - межстрочный интервал
      Canvas.TextPosition(W.Width/2-70,W.Height/2-40); // Стартовая позиция для шрифта в пикселях
      Canvas.Comm("Текущий цвет:");
      Canvas.Comm("R = "+string(cc.c[2]));
      Canvas.Comm("G = "+string(cc.c[1]));
      Canvas.Comm("B = "+string(cc.c[0]));
      Canvas.CurentFont("Times New Roman",30);
      Canvas.TextPosition(25.0,10.0);  // Стартовая позиция для шрифта в процентах от размеров экрана
      Canvas.Comm("Время формирования градиентного массива из "+string(W.Height)+" элементов = "+string(t)+" микросекунд");
      ChartChanged(); // на всякий случай контролируем изменение размеров окна, т.к. это скрипт (в индикаторах и экспертах это происходит автоматически)
      Canvas.Update();
      d+=0.01;
      Sleep(30);
     }
  }
//+------------------------------------------------------------------+

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;
        }
     }
  }

Su variante


mi variante:


Déjeme explicarle:

La línea blanca es la línea de tono (suma de colores R+B+G) - idealmente debería ser una línea diagonal recta. Yo lo tengo implementado, tú no.

Las líneas rojas, azules y verdes son líneas de relación de colores. Llamémosles armónicos del espectro. Lo ideal es que sean verticales. Pero es imposible realizarlo después de que el color máximo inicial sea 255. Pero es posible llegar a una situación en la que no habrá puntos de inflexión (marcados con flechas rojas) y hacer un arco suave. Entonces el gradiente se verá sin "grumos". Este problema existe tanto en tus algoritmos como en los míos. Se puede arreglar, pero aún no veo el motivo, así que es una pérdida de tiempo. En la práctica, necesito un gradiente de un color a otro. Esto se implementa fácilmente con los armónicos estrictamente verticales del espectro (el desenfoque del armónico en la parte superior es normal, ya que es una consecuencia del redondeo). En este problema, sin embargo, el gradiente pasa del negro al blanco a través de un tercer color, por lo que existen estas torceduras.

Qué raro, estaba seguro de que estabas escribiendo en MQL5. Pero además del programa del 4 en sí, también tienes el estilo de programación del 4. He intentado transferir tu algoritmo al 5 pero no ha funcionado, porque sólo muestra algunas franjas de color. Lo más probable es que esto ocurra por una confusión con el alcance de las variables, pero arreglarlo porque el código no es susceptible de ser depurado es extremadamente difícil, así que desistí. Entiendo que estás acostumbrado a tu estilo de programación y no entiendes mi estilo. Es mutuo porque estoy acostumbrado a ver la estructura de un programa en lugar de leerlo como un libro. Y en tu código es imposible depurar y entender en qué momento de la definición de las variables, los largos nombres de las variables ocupan el 90% del texto del programa, por lo que la estructura del programa se pierde, disolviéndose en estos largos nombres de variables color barbie. En definitiva, tu código me parece personalmente una especie de sadomasoquismo.

Además, su algoritmo resultó ser decenas de veces más lento, y la razón no es ni siquiera MQL4. No pude entenderlo. ¿Qué tangentes, qué triángulos cuando sólo hay RGB?

Y trata de dominar elsindicato - algo muy útil.

Para entender mejor lo que quiero decir, deberías intentar ejecutar los dos scripts que adjunté con tu algoritmo (MQL4) y el mío (MQL5).


Tú también tienes esos percances:

sólo que no entiendo todavía, es un problema de lentitud de MT4 o error de su algoritmo.

Archivos adjuntos:
 
Nikolai Semko:


1. Nikolai, incluso comparando las dos primeras imágenes que has citado, se puede ver inmediatamente que hay una neblina gris que se cierne sobre tu versión. Mira con atención. Y en mi versión el color es mucho más brillante. ¿Crees que tu versión transmite mejor el color?

2. He tomado como referencia la paleta de colores de Windows. Conseguí una coincidencia de color del 99%. Comprueba si los colores coinciden con los de Windows. Imprime una serie de tonos como hice yo. A continuación, abra las propiedades del gráfico y la paleta. Introduzca en las ventanas los valores de los componentes del color inicial y luego mueva el deslizador hacia arriba y hacia abajo. Los números cambiarán. Busque estos números en su impresión y vea si coinciden.

3. Entiendo que la aplicación específica puede variar. No he comprobado mi algoritmo específicamente para la velocidad, y no lo he optimizado para la velocidad. Su solución puede parecer que le da una mayor velocidad. No lo voy a negar.

4. Existe la noción de prisma en la óptica. Existe la noción de refracción de la luz. Yo partía de este mismo paradigma. He trazado 256*256 (de 0 a 255). Luego tracé líneas. Encontré el eje de refracción del color. Está en el centro del gráfico. Cada componente es una curva formada por dos segmentos. En total, el color tiene tres líneas curvas, cada una de las cuales se refracta en el centro del gráfico, dividiéndose en dos segmentos. Cada segmento tiene su propio ángulo. El color original tiene una coordenada en el gráfico. Se puede encontrar entre sus matices. Mi tarea era encontrar el color inicial, determinar los ángulos de los seis segmentos y obtener los valores de cada componente a lo largo de su línea.

5. Las tangentes son las relaciones entre los catetos contiguos y los opuestos. Es necesario para el cálculo de los ángulos de los segmentos y el cálculo de la altura de los catetos opuestos (que es el valor de un componente en un tono de color concreto).

6. En cuanto a los estilos de programación, sugiero que no lo discutamos. Para la esencia del tema no es relevante.

7. Sobre los percances - quizás lo sean. Pero todavía no me he encontrado con ellos. Por lo tanto, no lo sé.


Por cierto, dime cómo funciona la descomposición del color en tu versión. No lo entiendo del todo.

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Nikolai Semko:


No entiendo todavía, es un problema de lentitud de MT4 o un error en su algoritmo.

Sobre la diferencia de velocidad de los algoritmos:

1. Su algoritmo llena la matriz uint, mientras que el mío llena la matriz string. (Necesito exactamente la cuerda, para extraer fácilmente los componentes necesarios de la sombra y luego trabajar con ellos). Puedes ver la diferencia en la velocidad de llenado de ambos tipos de arrays en el script de abajo.

2. su algoritmo funciona en МТ5, y el mío en МТ4. La diferencia en la velocidad de llenado de las matrices en estas plataformas fue discutida por mí aquí -https://www.mql5.com/ru/forum/222333. En el guión que se muestra a continuación podrá comprobar usted mismo la diferencia. Póngalo en ambas plataformas y compare.

//+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int int_Array[30000];
string string_Array[30000];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < 30000; b1++)int_Array[b1] = 1;
   //--------------------------
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   int q = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print("//----------------------------------------------------------------------------------");
   Print(" Время заполнения массива      int:  ",t2-t1);
   
 
 
   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b2 = 0; b2 < 30000; b2++)string_Array[b2] = "1";
   //--------------------------
   ulong t4 = GetMicrosecondCount();
   //--------------------------
   int q2 = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print(" Время заполнения массива string:  ",t4-t3);   
   Print("//----------------------------------------------------------------------------------");
   
   Alert(q + q2);//Этот код нужен, иначе компилятор не заполняет массив.
  }
//+------------------------------------------------------------------+

He medido la velocidad de 30 000 celdas de matrices int y string en MT4 y MT5 (ms):

MT5
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива string:  464
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива    int:  14

MT4
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива string:  692
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива    int:  363

Como puedes ver, mi algoritmo es más lento por dos razones:

  1. Llena el array de cadenas y no el array de uint.
  2. Sólo lo has probado en MT4. La velocidad de llenado de las matrices entre plataformas puede variar decenas de veces.
P.D. Además, mi algoritmo puede devolver el número de celda del array donde se encuentra el color original. Ayuda a crear un gradiente. Al fin y al cabo, hay que saber a partir de qué celda hay que moverse a la izquierda o a la derecha.
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow:

Sobre la diferencia en la velocidad de los algoritmos:

1. tu algoritmo rellena un array de uint, mientras que el mío rellena un array de string. (Necesito una cadena para extraer fácilmente los componentes necesarios de la sombra y luego trabajar con ellos). Puedes ver la diferencia en la velocidad de llenado de ambos tipos de arrays en el script de abajo.

2. su algoritmo funciona en МТ5, y el mío en МТ4. La diferencia en la velocidad de llenado de las matrices en estas plataformas fue discutida por mí aquí -https://www.mql5.com/ru/forum/222333. En el guión que se muestra a continuación podrá comprobar usted mismo la diferencia. Póngalo en ambas plataformas y compare.

He medido la velocidad de 30 000 celdas de matrices int y string en MT4 y MT5 (ms):

Como puedes ver, mi algoritmo es más lento por dos razones:

  1. Llena el array de cadenas y no el array de uint.
  2. Sólo lo has probado en MT4. La velocidad de llenado de las matrices entre plataformas puede variar decenas de veces.
P.D. Además, mi algoritmo puede devolver el número de celda del array donde se encuentra el color original. Ayuda a crear un gradiente. Al fin y al cabo, hay que saber a partir de qué celda hay que moverse a la izquierda o a la derecha.
He sacado los tangas de tu algoritmo. Era un misterio para mí por qué los usaba. Mira en el código, como saldría el color real entonces. Tienes un montón de comprobaciones innecesarias, usas funciones como la tangente, la ordenación de arrays, yo solo +-*//. Mt4 es más lento, es comprensible, pero no 30 veces más lento.
Ok, luego pondré mi algoritmo en el 4 y veremos. ¿Por qué usas el 4? Para una interfaz gráfica de usuario, el 4 no es nada bueno. Ni siquiera lee los recursos. De 4 a 5, es mucho más difícil rehacer el código que al revés.
Razón de la queja: