Die Funktion, Farbe in Schattierungen zu zerlegen. - Seite 14

 
Yury Kulikov:


Überprüfen Sie Ihren Algorithmus für die Farben 0,0,0 und 255,255,255.

Ich werde es jetzt überprüfen.

 
Yury Kulikov:


Überprüfen Sie Ihren Algorithmus für die Farben 0,0,0 und 255,255,255.

Geprüft. 0,0,0,0, - verursacht einen Fehler. Der Berater entlädt sich.

255,255,255 ist in Ordnung.

Ich danke Ihnen für diese Feststellung. Ich werde es mir ansehen.

 
Реter Konow:

Was denkst du, Nikolai?

Würden Sie zugeben, dass Sie aus dem Nichts eine Menge Lärm gemacht haben? Ja, der Algorithmus ist vielleicht langsamer als der Ihre, und er hatte einige Bugs. Es ist noch nicht auf MT5 debuggt. Aber es funktioniert.

Ist Ihnen überhaupt klar, dass Code wie dieser

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

ist zu 100 % identisch mit diesem:

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

Danach sollten Sie sich nicht mehr wundern, dass Ihr Code so viel langsamer ist.

 
Реter Konow:

255,255,255 ist in Ordnung.

Entspricht dies 99 % der "Fenstertönungen"?

 
Yury Kulikov:

Ich schließe mich den "Anschuldigungen" an, ich konnte es nicht ertragen :)

Ein gutes Beispiel dafür, wie man nicht programmieren sollte. Wenn Ihre gesamte grafische Benutzeroberfläche so geschrieben ist, werden wir sie in nächster Zeit nicht mehr sehen. :(

Jede Zeile ist ein "Meisterwerk": ein solcher Haufen von Fehlern und Patzern, so viel Hoffnung, dass mql4 funktionieren wird. Ich verstehe jetzt, warum mt4 verwendet wird.

Ich bin der Meinung, dass die Veröffentlichung solcher Codes und die anschließende Reaktion auf die Kritik dem Publikum des Forums nicht gerecht wird. Sie wollen dir nicht schaden, sondern dir helfen.

Der Vergleich von Algorithmen kann visuell erfolgen. Sie haben ja nicht mit Zahlen bewiesen, dass Ihr Algorithmus Farbtöne liefert, die zu 99 % den "Fensterfarbtönen" entsprechen.

Auf der linken Seite ist Ihr Ansatz, auf der rechten Seite der vonNikolai Semko. (Es wurde ein modifiziertes Skript von NikolaiSemko verwendet)


Vielen Dank, Juri, für Ihre Teilnahme und Ihr Verständnis für die Angelegenheit sowie für das anschauliche Beispiel. Nach Ihren Änderungen wurde mein Code angenehmer zu betrachten.

Aber hier ist eine kleine Klarstellung:

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:

Vielen Dank, Juri, für Ihre Teilnahme und Ihre Einblicke sowie für das anschauliche Beispiel. Nach Ihren Änderungen wurde mein Code angenehmer zu betrachten.

Aber hier ist eine kleine Klarstellung:

Vielleicht ja :)

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:

Ist Ihnen überhaupt klar, dass ein solcher Code

ist zu 100 % identisch mit diesem:

Danach sollten Sie sich nicht mehr wundern, dass Ihr Code viel langsamer ist.

Nun, das ist die Dummheit, wenn man meinen Algorithmus nicht versteht.

 
Yury Kulikov:

Vielleicht ja :)

Ja, ja.
Nur ist mir am Anfang ein Fehler unterlaufen, den ich bereits in einem früheren Beitrag korrigiert habe

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

Entspricht dies den 99 % der "Windows-Schattierungen"?

Ja, hier liegt ein Fehler vor. Ich habe es nicht bemerkt. Erreicht in der Mitte des Spektrums Weiß, obwohl die Farbe in den Graubereich gehört. Es sollte also allmählich zu Weiß übergehen.

 
Nikolai Semko:

...

Danach sollten Sie sich nicht mehr wundern, dass Ihr Code so viel langsamer ist.

Im Allgemeinen ist es bequem, den bewährten Code eines anderen zu übernehmen und unter dem Deckmantel seiner Tadellosigkeit anderen (die mit ihrem Verstand nach einer Lösung suchen) zu erzählen, wie viel besser man selbst ist. Ist es nicht so, Nicolai?)