Fonction de décomposition de la couleur en nuances. - page 14

 
Yury Kulikov:


Vérifiez votre algorithme pour les couleurs 0,0,0 et 255,255,255.

Je vais le vérifier maintenant.

 
Yury Kulikov:


Vérifiez votre algorithme pour les couleurs 0,0,0 et 255,255,255.

Vérifié. 0,0,0,0, - provoque une erreur. Le conseiller décharge.

255,255,255 c'est bien.

Merci pour cette observation. Je vais m'en occuper.

 
Реter Konow:

Qu'en penses-tu, Nikolaï ?

Admettriez-vous que vous avez fait beaucoup de bruit à partir de rien ? Oui, l'algorithme est peut-être plus lent que le vôtre et il y avait quelques bogues. Il n'est pas encore débogué sur MT5. Mais ça marche.

Est-ce que tu te rends compte que ce genre de code

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

est 100% identique à celui-là :

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

Après cela, vous ne devriez pas vous demander pourquoi votre code est tellement plus lent.

 
Реter Konow:

255,255,255 c'est bien.

Est-ce que cela correspond à 99% de "windows shades" ?

 
Yury Kulikov:

Je vais me joindre aux "accusations", je n'en pouvais plus :)

Un bon exemple de comment ne pas programmer. Si c'est la façon dont votre interface graphique entière est écrite, nous ne la verrons pas avant un certain temps. :(

Chaque ligne est un "chef-d'œuvre" : un tel amoncellement d'erreurs et de ratés, tant d'espoir que mql4 s'en sorte. Je comprends maintenant pourquoi mt4 est utilisé.

Je pense que la publication de tels codes et la réaction subséquente aux critiques ne respectent pas l'audience du forum. Ils ne veulent pas vous faire de mal, ils veulent vous aider.

Quant à la comparaison des algorithmes, vous pouvez les comparer visuellement. Ce n'est pas comme si vous aviez apporté la preuve par les chiffres que votre algorithme donne des teintes proches à 99% des "teintes de fenêtres".

À gauche, c'est un peu votre approche, à droite,celle de Nikolai Semko. (Un script modifié de NikolaiSemko a été utilisé)


Merci, Yuri, pour votre participation et votre compréhension de la question, ainsi que pour cet exemple clair. Après vos modifications, mon code est devenu plus agréable à regarder.

Mais voici une petite précision :

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:

Merci, Yuri, pour votre participation et votre perspicacité, ainsi que pour l'exemple clair. Après vos modifications, mon code est devenu plus agréable à regarder.

Mais voici une petite clarification :

Peut-être bien :)

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:

Est-ce que tu te rends compte que ce genre de code

est 100% identique à celui-là :

Après cela, vous ne devriez pas vous demander pourquoi votre code est beaucoup plus lent.

Eh bien, c'est la stupidité de ne pas comprendre mon algorithme.

 
Yury Kulikov:

Peut-être bien :)

Ouais.
Seulement, j'ai fait une erreur au début et je l'ai déjà corrigée dans un message précédent.

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

Est-ce que cela correspond à 99% des "nuances de Windows" ?

Oui, il y a une erreur. Je ne l'ai pas remarqué. Atteint le blanc au milieu de la gamme, bien que la couleur appartienne à la gamme des gris. Il devrait donc passer au blanc progressivement.

 
Nikolai Semko:

...

Après cela, vous ne devriez pas vous demander pourquoi votre code est tellement plus lent.

En général, il est pratique de prendre le code éprouvé de quelqu'un d'autre et, couvert par son impeccabilité, de dire aux autres (qui cherchent une solution avec leur esprit) à quel point vous êtes meilleur. N'est-ce pas, Nicolai ?)

Raison: