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

 
Nikolai Semko:

Peter, a questão é que você postou uma função no fórum para que todos possam ver e aplicar a decomposição de cores. Mas esta função não gera a matriz de cores necessária, mas apenas uma matriz de cordas, que só é boa para a impressão, em vez de demonstrar seu gradiente na tela. É um porco em um poço e sem respeito pelos outros. Vocês mesmos podem traduzi-lo, se quiserem.

Isto já é uma calúnia e uma calúnia. Escolhi deliberadamente o tipo de fio, para facilitar a visualização dos componentes e para isolá-los. Expliquei minha técnica de solução em detalhes na primeira página. Você não explicou nada. Não tenho certeza se você mesmo entendeu totalmente como funciona seu método de decomposição de cores. Se não o fizer, explique com tanto detalhe quanto eu o fiz.

E não faça acusações tão barulhentas. Você mesmo pode escorregar neles.

 
E não entre em uma discussão. Vamos ao fundo da questão.
 
Реter Konow:

Isso é uma calúnia e uma calúnia. Escolhi o tipo de fio deliberadamente, a fim de facilitar a visualização dos componentes e a escolha dos mesmos. Expliquei em detalhes a técnica da minha solução na primeira página. Você não explicou nada. Não tenho certeza se você mesmo entendeu totalmente como funciona seu método de decomposição de cores. Se não o fizer, explique com tanto detalhe quanto eu o fiz.

E não faça acusações tão barulhentas. Você mesmo pode escorregar neles.

Desculpe - Acabei de ler sua explicação:

  • Primeiro, decompus a cor em três componentes principais, definindo senior, middle, junior.
  • Então, comecei a fazer gráficos e a desenhar linhas através dos valores dos componentes.
  • Ao ver os números mudarem na paleta enquanto arrastava o deslizador, percebi que havia uma refração no ângulo de subida das linhas, porque em algum momento a taxa de mudança dos números mudou.
  • Coloquei o eixo de refração das linhas no centro do gráfico, e vi que cada linha, consiste em dois segmentos, cada um com seu próprio ângulo de ascensão.
  • Também, ao experimentar a paleta de cores, percebi que existe um ângulo máximo de subida para o componente superior. No início eu pensava que estava a 67,5 graus. No entanto, a prática mostrou que está a 63,5 graus.
  • Durante muito tempo, não consegui descobrir como traçar corretamente os segmentos de linha dos componentes de cor. Havia muitas incógnitas. Mas o principal - como encontrar a coordenada da cor original no gráfico?
  • Enquanto eu continuava a experimentar a paleta, notei que ao mudar o valor da cor por um certo número, o deslizador se movia por uma certa distância. Gradualmente, percebi que a distância que o deslizador se desloca é metade do valor do componente de baixa ordem.
  • Presumi que se encontrasse a coordenada do componente superior na linha do ângulo máximo de subida e adicionasse metade do componente inferior a esse ponto, encontraria a coordenada da cor original na trama. A prática tem provado que a suposição estava correta.
  • Tendo uma coordenada de cor inicial e um eixo de refração, eu poderia calcular ângulos de cada peça e receber valores para cada componente ao longo de sua linha. Usei trigonometria no ensino médio para isso.

Eu não posso fazer isso. É mais prosaico e primitivo.
É difícil explicar de forma mais capacitiva do que o próprio 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:


Mais uma vez:

  • Pegue meu algoritmo como eu o criei. Sem suas correções.
  • Defina sua cor. Execute o roteiro no MT4.
  • Você terá todas as cores através do alerta.
  • Insira a cor original na paleta de janelas.
  • Verifique a partida.

Esta é a melhor verificação de que o algoritmo está funcionando corretamente.

Então, você pode passar a uma verificação de velocidade.

Você, por outro lado, pegou meu algoritmo, mudou as linhas nele como você achou conveniente, depois correu-o em uma plataforma diferente e o exibiu de acordo com sua técnica de desenho. Tendo feito tantas mudanças independentes, você julga meu algoritmo como se não percebesse como você mesmo o alterou e o colocou em condições diferentes. Condições em que você mesmo pode ter um erro. Então, vamos descobrir calmamente.

 
Реter Konow:

Mais uma vez:

  • Pegue meu algoritmo como eu o criei. Sem suas correções.
  • Defina sua cor. Execute o roteiro no MT4.
  • Você terá todas as cores através do alerta.
  • Insira a cor original na paleta do Windows.
  • Verifique a partida.

Esta é a melhor verificação de que o algoritmo está funcionando corretamente.

Então, você pode passar a uma verificação de velocidade.

Você, por outro lado, pegou meu algoritmo, mudou as linhas nele como você achou conveniente, depois correu-o em uma plataforma diferente e o exibiu de acordo com sua técnica de desenho. Tendo feito tantas mudanças independentes, você julga meu algoritmo como se não percebesse como você mesmo o alterou e o colocou em condições diferentes. Condições em que você mesmo pode ter um erro. Então, vamos descobrir calmamente.

Peter, eu não preciso de 256 combinações de três dígitos no meu alerta. Eu preciso de cor. Tudo o que fiz em sua função foi converter a cor em uint, como deveria ser. Eu não entrei em seu algoritmo, porque sua lógica está além de minha compreensão.

 
Nikolai Semko:

Peter, eu não quero 256 combinações de três dígitos de cor em alerta. Eu preciso de cor. Tudo o que fiz em sua função foi converter a cor em uint em vez de string, como deveria ser. Eu não entrei em seu algoritmo, pois sua lógica está além de minha compreensão.

A verificação por números é a melhor. Não é possível comparar as tonalidades de cor com os olhos. Os monitores são diferentes e a percepção pode ser diferente. É por isso que os números são o melhor controle.

E não há nenhuma lógica desordenada envolvida. Trigonometria escolar.

1. Calcular os ângulos de seis segmentos.

2. Em seguida, calcular os valores em cada ponto desses segmentos e escrevê-los em uma matriz.

É isso aí.

 
Реter Konow:

A verificação pelos números é a melhor. Não é possível comparar exatamente as tonalidades de cor com os olhos. Os monitores são diferentes e a percepção pode ser diferente. É por isso que os números são o melhor controle.

E não há nenhuma lógica desordenada envolvida. Trigonometria escolar.

1. Calcular os ângulos de seis segmentos.

2. Em seguida, calcular os valores em cada ponto desses segmentos e escrevê-los em uma matriz.

É isso aí.

Mas na verdade, minha função funciona sem falhas e é 4 vezes mais rápida. Estou esperando seu resultado quando você fornecer seu algoritmo no 5. Levei um tempo apenas copiando via prancheta, e você levou algo mais longo.

 
Nikolai Semko:

Mas na verdade, minha função funciona sem falhas e é 4 vezes mais rápida. Estou esperando seu resultado, quando você fornecer seu algoritmo no 5. Levei um tempo para simplesmente copiar através da prancheta, e você levou mais tempo.

Nikolai, isso soa como um jardim de infância. A afirmação "4 vezes mais rápido" não é válida porque não está comprovada.


  1. Comente a linha em sua versão de minha solução no MT5 e você verá a diferença.

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

Esta linha afeta o desenho de todo o retângulo por alguma razão. Mas não é a minha falha. Confira.

Continuando a analisar as falhas que você tem. Eu quero ver se é realmente por causa do meu algoritmo.


E desligue a cintilação desnecessária dos números. Retire todas as coisas desnecessárias. Deixe um simples retângulo com um gradiente de uma cor original ser exibido uma vez. Sem qualquer artifício desnecessário.

 
De modo geral, a função de obter uma matriz de gradientes entre duas cores é mais útil. Como é mais simples e mais útil na prática.
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;
     }
  }

Se você precisar de um gradiente de uma cor para o branco ou para o preto, você pode obtê-los desta forma com esta função.

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


Arquivos anexados:
 
Реter Konow:

A verificação pelos números é a melhor. Não é possível comparar exatamente as tonalidades de cor com os olhos. Os monitores são diferentes e a percepção pode ser diferente. É por isso que os números são o melhor controle.

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

Um bom exemplo de como não programar. Se é assim que sua GUI inteira é escrita, não a veremos por muito 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 scriptNikolai Semko modificado foi usado)


Arquivos anexados:
Razão: