Rengi gölgelere ayırma işlevi. - sayfa 14

 
Yury Kulikov :


Algoritmanızı 0,0,0 ve 255,255,255 renginde test edin.

Şimdi kontrol edeceğim.

 
Yury Kulikov :


Algoritmanızı 0,0,0 ve 255,255,255 renginde test edin.

Kontrol. 0,0,0, - bir hatayla sonuçlanır. EA boşaltılıyor.

255,255,255 tamam.

Bu gözlem için teşekkürler. Bunu halledeceğim.

 
Реter Konow :

Ne diyorsun Nikola?

Hiçbir şey hakkında çok fazla gürültü yaptığınızı kabul edebilir misiniz? Evet, algoritma sizinkinden daha yavaş olabilir ve birkaç hatası vardı. Henüz MT5'te hata ayıklanmadı. Ama o çalışıyor.

Bu kodun ne olduğunu anlıyor musun?

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

Buna %100 eşdeğer:

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

Bundan sonra, kodunuzun neden çok daha yavaş çalıştığına artık şaşırmamalısınız.

 
Реter Konow :

255,255,255 tamam.

Bu, "windows gölgelerinin" %99'u ile eşleşiyor mu?

 
Yury Kulikov :

"Suçlamalara" katılacağım, dayanamadım :)

Programlama yapılmamasına güzel bir örnek. GUI'nizin tamamı bu şekilde yazılmışsa, yakında görmeyeceğiz. :(

Her satır bir "şaheser"dir: öyle bir hata ve gaf yığını, mql4'ün onu ortadan kaldıracağını umarız. Şimdi neden MT4'ün kullanıldığı ortaya çıktı.

Bu tür kodların yayınlanması ve ardından gelen eleştirilere tepki, bunun forumun izleyicilerine saygı duymadığını düşünüyorum. Zarar istemiyorsun - sana yardım etmek istiyorlar.

Ve algoritmaların karşılaştırılması hakkında görsel olarak karşılaştırılabilir. Algoritmanızın "Windows gölgelerine" %99 yakın gölgeler verdiğine dair rakamlarla herhangi bir kanıt sunmadınız.

Solda - sanki yaklaşımınız, sağda - Nikolai Semko . (Değiştirilmiş bir Nikolai Semko komut dosyası kullanıldı)


Katılımınız ve konunun özüne ilişkin anlayışınız ve ayrıca iyi bir örnek için teşekkür ederiz Yuri. Değişikliklerinizden sonra koduma bakmak daha keyifli hale geldi.

sadece küçük bir açıklama:

 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 :

Katılımınız ve konunun özüne ilişkin anlayışınız ve ayrıca iyi bir örnek için teşekkür ederiz Yuri. Değişikliklerinizden sonra koduma bakmak daha keyifli hale geldi.

sadece küçük bir açıklama:

Belki bu yüzden :)

 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 :

Bu kodun ne olduğunu anlıyor musun?

Buna %100 eşdeğer:

Bundan sonra, kodunuzun neden çok daha yavaş çalıştığına artık şaşırmamalısınız.

Bu zaten algoritmamın yanlış anlaşılmasından kaynaklanan aptallık.

 
Yury Kulikov :

Belki bu yüzden :)

iyi evet.
Başlıkta bir hata yaptım ve bir önceki mesajımda düzelttim.

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

Bu, "windows gölgelerinin" %99'u ile eşleşiyor mu?

Evet, bir hata var. fark etmedim. Renk gri aralığa ait olmasına rağmen, aralığın ortasına doğru beyaza ulaşır. Yani, beyaza yavaş yavaş gitmeli.

 
Nikolai Semko :

...

Bundan sonra, kodunuzun neden çok daha yavaş çalıştığına artık şaşırmamalısınız.

Genel olarak, birinin kanıtlanmış kodunu almak ve kusursuzluğunun kapsadığı başkalarına (kendi akıllarıyla bir çözüm arayanlara) ne kadar iyi olduğunuzu göstermek uygundur. Bu doğru değil mi Nikola?