色を色合いに分解する機能。 - ページ 14

 
Yury Kulikov:


色0,0,0と255,255,255のアルゴリズムを確認してください。

これから確認します。

 
Yury Kulikov:


色0,0,0と255,255,255のアルゴリズムを確認してください。

確認しました。0,0,0,0, - エラーが発生します。アドバイザーがアンロードする。

255,255,255で結構です。

この観察に感謝します。調べてみるよ。

 
Реter Konow:

どうだ、ニコライ?

無から有を生んだと認めるか?そうですね、アルゴリズムはあなたより遅いかもしれませんし、バグもいくつかありました。MT5ではまだデバッグされていません。 でも、うまくいくんです。

このようなコードがあることに気づいていますか?

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

は100%これと同じです。

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

その後、あなたのコードがなぜこんなに遅くなったのか、不思議に思うことはないはずです。

 
Реter Konow:

255,255,255で結構です。

99%の「ウィンドウズ・シェード」と矛盾しないか?

 
Yury Kulikov:

私は「告発」に参加します、我慢できませんでした :)

プログラミングをしてはいけないという良い例です。GUI全体がこのような書き方をしているのであれば、しばらく見ることはないでしょう。:(

どの行も「傑作」です。これだけエラーや失敗が積み重なれば、mql4はうまくいくだろうという期待も高まります。mt4が使われる理由がわかりました。

このようなコードの公開と、その後の批判に対する反応は、フォーラムの参加者を尊重していないと思います。彼らはあなたに危害を加えたいのではなく、あなたを助けたいのです。

アルゴリズムの比較については、視覚的に比較することができます。あなたのアルゴリズムが「ウィンドウズ・シェード」に99%近いシェードを出していることを数字で証明したわけではないのです。

左側があなたのアプローチ、右側がニコライ・セムコの アプローチという感じです。(ニコライ・セムコの スクリプトを改造したものを使用)。


Yuriさん、ご参加とご理解、そしてわかりやすいお手本をありがとうございました。あなたの変更後、私のコードはより快適になりました。

しかし、ここで少し説明しておきます。

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:

Yuriさん、参加と洞察、そしてわかりやすい例をありがとうございました。あなたの変更後、私のコードはより快適になりました。

しかし、ここで少し説明しておきます。

そうかもしれませんね :)

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:

そのようなコードがあることを理解していますか?

は100%これと同じです。

その後、あなたのコードがずっと遅くなることを不思議に思う必要はありません。

まあ、それは私のアルゴリズムを理解していない愚かさなのですが。

 
Yury Kulikov:

そうかもしれませんね :)

そうですね。
ただ、冒頭でミスがあり、すでに以前の記事で訂正しています

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

これは99%の「Windowsの色合い」と一致しているのでしょうか?

はい、間違いがあります。気がつかなかった。グレーレンジに属する色でありながら、中盤までに白に到達する。だから、徐々に白になるはずです。

 
Nikolai Semko:

...

その後、あなたのコードがなぜこんなに遅くなるのか不思議に思うことはないでしょう。

一般に、他人の実績あるコードをパクって、その非の打ちどころのなさに覆われて、(頭を使って解決策を探している)他人に自分の方がいかに優れているかを伝えるのは都合がいいものです。そうでしょう、ニコライさん(笑)