将颜色分解为阴影的功能。 - 页 9

 
Nikolai Semko:

彼得,问题是你在论坛上发布了一个功能,让所有人看到并应用颜色分解。但这个函数并没有生成必要的颜色数组,而只是一个字符串数组,这只适合打印输出,而不是在屏幕上演示你的梯度。它是一头猪,不尊重他人。如 果你们愿意,你们可以自己翻译。

这已经是赤裸裸的诽谤和污蔑了。 我特意选择了字符串类型,以使其更容易看到组件并将其隔离。 我在第一页详细解释了我的解决技巧。你还没有解释什么。我 不确定你自己是否完全理解你的颜色分解方法是如何运作的。如果你不知道,请像我一样详细地解释。

也不要做如此大声的指责。你可能会自己滑倒在他们身上。

 
而且不要陷入争论。让我们来看看这个问题的真相。
 
Реter Konow:

这是赤裸裸的诽谤和污蔑。 我特意选择了字符串的类型,以使其更容易看到组件并将其隔离。 我在第一页中详细解释了我的解决方案的技术。你没有解释任何事情。我 不确定你自己是否完全理解你的颜色分解方法是如何运作的。如果你不知道,请像我一样详细地解释。

而且不要做如此大声的指责。你可能会自己滑倒在他们身上。

对不起--我刚刚才看到你的解释。

  • 首先,我把颜色分解成三个主要部分,定义了高级、中级、初级。
  • 然后,我开始制作图表,并通过组件值画线。
  • 当我看着调色板中的数字随着我拖动滑块而变化时,我意识到线条的上升角度有了折射,因为在某些时候,数字的变化率发生了变化。
  • 我把这些线的折射轴放在图的中心,看到每条线,由两段组成,每段都有自己的升角。
  • 另外,通过对调色板的实验,我意识到,对于较高的部分,有一个最大的上升角度。起初我以为是67.5度。然而,实践表明,它是63.5度。
  • 很久以来,我一直搞不清楚如何正确绘制颜色成分的线段。有许多未知的因素。但最主要的是--如何在图上找到原始颜色的坐标?
  • 当我继续试验调色板时,我注意到,通过改变颜色的值 的某个数字,滑块会移动一定的距离。渐渐地,我意识到,滑块移动的距离是低阶分量的一半值。
  • 我假定,如果我找到最大上升角度线中较高分量的坐标,并将较低分量的一半加到该点上,我就能在图中找到原来颜色的坐标。实践证明,这个假设是正确的。
  • 有了初始颜色的坐标和折射轴,我可以计算每块的角度,并沿其线路接收每个组件的值。我为此使用了高中的三角学。

我不能这样做。这是更平凡和原始的。
很难比代码本身更有容量地解释。

void Gradient(uint clr,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[2],G=c.c[1],B=c.c[0];
   uint i=0, tone=uint((size-1)*(((double)R+(double)G+(double)B)/765.0)+0.4999);
   double kR,kG,kB;
   if(tone!=0)
     {
      kR=(double)R/tone; 
      kG=(double)G/tone;
      kB=(double)B/tone;
      for(i=0;i<=tone;i++)
        {
         c.c[2]=uchar(i*kR+0.4999);
         c.c[1]=uchar(i*kG+0.4999);
         c.c[0]=uchar(i*kB+0.4999);
         arr[i]=c.clr;
        }
     }
   if(tone!=(size-1))
     {
      kR=(double)(255-R)/(size-i);
      kG=(double)(255-G)/(size-i);
      kB=(double)(255-B)/(size-i);
      for(uint j=1;i<size;i++,j++)
        {
         c.c[2]=uchar(R+j*kR+0.4999);
         c.c[1]=uchar(G+j*kG+0.4999);
         c.c[0]=uchar(B+j*kB+0.4999);
         arr[i]=c.clr;
        }
     }
  }
 
Nikolai Semko:


再来一次。

  • 以我的算法为例,因为我创造了它。没有你的纠正。
  • 设置你的颜色。在MT4上运行该脚本。
  • 你会通过警报得到所有的颜色。
  • 在Windows调色板中输入原始颜色。
  • 检查匹配情况。

这是检查算法是否正常工作的最好方法。

然后,你可以继续进行速度检查。

另一方面,你拿着我的算法,按照你认为合适的方式改变其中的线条,然后在不同的平台上运行,并按照你的绘画技巧来显示它。在做了这么多独立的改变之后,你对我的算法进行评判,好像你没有注意到你自己是如何改变它并把它放在不同的条件下。你自己可能有错误的条件。因此,让我们冷静地找出答案。

 
Реter Konow:

再来一次。

  • 以我的算法为例,因为我创造了它。没有你的纠正。
  • 设置你的颜色。在MT4上运行该脚本。
  • 你会通过警报得到所有的颜色。
  • 在Windows调色板中输入原始颜色。
  • 检查匹配情况。

这是检查算法是否正常工作的最佳方法。

然后,你可以继续进行速度检查。

另一方面,你拿着我的算法,按照你认为合适的方式改变其中的线条,然后在不同的平台上运行,并按照你的绘画技巧来显示它。在做了这么多独立的改变之后,你对我的算法进行评判,好像你没有注意到你自己是如何改变它并把它放在不同的条件下。你自己可能有错误的条件。所以,让我们冷静地找出答案。

彼得,我的警报中不需要256个三位数的组合。我需要色彩。我在你的函数中所做的只是把颜色转换为uint,因为它应该是这样。我没有进入你的算法,因为它的逻辑超出我的理解范围。

 
Nikolai Semko:

彼得,我不希望警报中的三位数颜色有256种组合。我需要色彩。我在你的函数中所做的只是把颜色转换为uint而不是字符串,因为它应该是这样的。我还没有研究你的算法,因为它的逻辑超出了我的理解范围。

通过数字检查是最好的。你不能用眼睛来比较颜色的深浅。监视器是不同的,感知也会不同。这就是为什么数字是最好的检查。

而且也没有涉及到过多的逻辑。学校三角学。

1.计算六条线段的角度。

2.然后,计算这些段的每个点的数值,并将其写入一个数组。

就这样了。

 
Реter Konow:

通过数字进行检查是最好的。你不能完全用眼睛来比较颜色的深浅。监视器是不同的,感知也会不同。这就是为什么数字是最好的检查。

而且也没有涉及到过多的逻辑。学校三角学。

1.计算六条线段的角度。

2.然后,计算这些段的每个点的数值,并将其写入一个数组。

就这样了。

但事实上,我的功能工作起来没有故障,而且速度快了4倍。我在等待你的结果,当你在5日提供你的算法。我只是通过剪贴板复制花了一些时间,而你花的时间更长。

 
Nikolai Semko:

但事实上,我的功能工作起来没有故障,而且速度快了4倍。我在等待你的结果,当你提供你在5号的算法。我花了一段时间来简单地通过剪贴板复制,而你花了更长的时间。

尼古拉,这听起来像幼儿园。"快4倍 "的说法是不成立的,因为它没有被证实。


  1. 在你的MT5版本的我的解决方案中注释掉这一行,你会看到区别。

canvas.TextOut(300,10,"Время формирования градиентного массива из 256 элементов = "+string(t)+" микросекунд",ColorToARGB(clrWhite));

这条线由于某种原因会影响整个矩形的绘制。但这不是我的故障。看看吧。

继续研究你的那些小毛病。我想看看这是否真的是因为我的算法。


并关闭不必要的数字闪动。取出所有不必要的东西。让一个简单的矩形与一个原始颜色的梯度显示一次。没有任何不必要的噱头。

 
一般来说,获取两种颜色之间的梯度数组的函数更有用。因为它在实践中更简单、更有用。
void Gradient(uint clr1,uint clr2,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c1,c2;
   c1.clr=clr1;
   c2.clr=clr2;
   double R1=c1.c[2],G1=c1.c[1],B1=c1.c[0];
   double R2=c2.c[2],G2=c2.c[1],B2=c2.c[0];
   double deltaR=(R2-R1)/(size-1);
   double deltaG=(G2-G1)/(size-1);
   double deltaB=(B2-B1)/(size-1);
   for(uint i=0;i<size;i++)
     {
      R1+=deltaR; c1.c[2]=uchar (R1+0.4999);
      G1+=deltaG; c1.c[1]=uchar (G1+0.4999);
      B1+=deltaB; c1.c[0]=uchar (B1+0.4999);
      arr[i]=c1.clr;
     }
  }

如果你需要一种颜色到白色或到黑色的渐变,你可以通过这个函数得到它们。

   color clr=clrViolet;
   uint CLR[];
   Gradient(clrWhite, clr, CLR,100); // получаем массив из 100 элементов градиента от белого цвета до цвета clr 
   Gradient(clr, clrBlack, CLR,100); // получаем массив из 100 элементов градиента от цвета clr до черног цвета  


附加的文件:
 
Реter Konow:

通过数字进行检查是最好的。你不能完全用眼睛来比较颜色的深浅。监视器是不同的,感知也会不同。这就是为什么数字是最好的检查。

我也要加入 "指责 "的行列,不能接受 :)

这是一个很好的例子,说明如何不编程。如果你的整个GUI都是这样写的,那么我们将在很长一段时间内看不到它。:(

每一行都是 "杰作":这么多的错误和漏洞,这么多的希望,mql4会成功的。我现在明白为什么要使用mt4了。

我认为,发表这样的代码和随后对批评的反应是不尊重论坛的观众。他们不想伤害你,他们想帮助你。

至于比较算法,你可以从视觉上进行比较。这并不像你提供的数字证明你的算法给出了99%接近于 "窗帘 "的阴影。

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


附加的文件: