将颜色分解为阴影的功能。 - 页 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:

你怎么看,尼古拉?

你会承认你无中生有地制造了很多噪音吗?是的,算法可能比你的慢,而且它有几个bug。它还没有在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%接近于 "窗帘 "的阴影。

左边是你的方法,右边是尼古拉-森科的 方法。(使用了修改过的尼古拉-森科 的剧本)


谢谢你,尤里,感谢你的参与和对此事的理解,以及明确的例子。经过你的修改,我的代码变得更加令人愉快。

但这里有一个小小的澄清。

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:

谢谢你,尤里,感谢你的参与和洞察力,以及明确的例子。经过你的修改,我的代码变得更加令人愉快。

但这里有一个小小的澄清。

也许如此 :)

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:

...

在这之后,你就不应该奇怪为什么你的代码会这么慢了。

一般来说,拿着别人经过验证的代码,在其无懈可击的掩护下,告诉别人(正在用头脑寻找解决方案的人)你有多好,这很方便。不是吗,尼古拉?)