帆布很酷! - 页 47

 
Maxim Kuznetsov:

不是平面上的圆,而是3D的圆柱体 :-)该课程将以螺旋形式出现。如果你成功地标出了圆柱坐标,这是一个相当合理的事情

有可能。
 
Maxim Kuznetsov:

那么就不是平面上的圆,而是三维的圆柱体 :-)该课程将以螺旋形式出现。如果你成功地标出了圆柱坐标,这是一个相当合理的事情

实际上,这并不难实现。另外还有2-5行的代码。如果没有人在我之前做,当我有空闲的时候,我就会去做。

但最好能有一个4K屏幕

 
Maxim Kuznetsov:

那么就不是平面上的圆,而是三维的圆柱体 :-)该课程将以螺旋形式出现。如果你成功地标出了圆柱坐标,这是一个相当合理的事情

https://www.mql5.com/en/code/27662

注意代码的速度和大小。
而这一切都离不开Direct X

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

注意代码的速度和大小。
而这一切都离不开Direct X

神奇的!

半径取决于什么?

把戒指做成多色的有难度吗?

也许这种可视化对评估优化中的最佳50个通道或压实中的整个优化很有用。

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

注意速度和代码的大小。
而这一切都离不开Direct X

简单地说,就是魔法。!!!

而如果你在轴上加上一个极地网格,以及改变比例的能力,直到几乎直的 "平行线" (和平行的 "经线"), 你就会得到一个向传统图形的平稳过渡。

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

注意代码的速度和大小。
而这一切都离不开Direct X

+++
 

谢谢大家!


Aleksey Vyazmikin:

它是神奇的!

半径取决于什么?

把戒指做成多色的有难度吗?

也许这种可视化对于评估优化过程中的50个最佳通道,或者压实过程中的整个优化过程都很有用。

这个3D图形和旋转控制的代码都适合在这个函数中。

void Draw(double &c[]) {
   double _r=_Height/2-7;
   int Per=int(2*M_PI*_r);
   int X=_Width/2;
   int Y=_Height/2-5;
   double K=10*_Height;
   Canvas.Erase(0xFF000000);
   int Size =ArraySize(c);
   double max = c[ArrayMaximum(c,0)];
   double min = c[ArrayMinimum(c,0)];
   if (max-min<=0) return;
   double _a=2*M_PI/per*(_Width/2  - _MouseX + 5*per); // угол камеры по горизонтали (_MouseX  - текущая координата X указателя мышки)
   double _b=2*M_PI/per*(_Height/2 - _MouseY + 5*per); // угол камеры по вертикали   (_MouseY  - текущая координата Y указателя мышки)
   for (int i=0; i<Size; i++) {
      double r = _r*(0.3+0.7*(c[i]-min)/(max-min));
      double a = 2*M_PI/per*i;
      double z =r -r*2*double(i)/Size;
      double x = cos(a)*r;
      double y = sin(a)*r;
      double R=sqrt(x*x+y*y+z*z);
      double x1=x*cos(_a)+z*sin(_a);
      double z1=-x*sin(_a)+z*cos(_a);
      double y1=y*cos(_b)+z1*sin(_b);
      double z2=-y*sin(_b)+z1*cos(_b);
      z2=z2+_r;
      x=X+K*x1/(z2+K);
      y=Y+K*y1/(z2+K);
      _PixelSet((int)x,(int)y,Grad(double(i)/Size));
   }
   Canvas.Update();
}

这个函数的输入只是一个价格数组。即使是一个小学生也能理解这些代码。一个一维的价格数组被转换为一个3维的点数组。在XY平面内,价格用极坐标系统表示,其中到中心(0,0)的距离r=sqrt(x2+y2)就是价格值。

颜色选择是这个功能的责任。

uint Grad(double p) {
   static uint Col[6]= {0xFF0000FF,0xFFFF00FF,0xFFFF0000,0xFFFFFF00,0xFF00FF00,0xFF00FFFF};
   if(p>0.9999) return Col[5];
   if(p<0.0001) return Col[0];
   p=p*5;
   int n=(int)p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c1.c[2]+uchar(k*(c2.c[2]-c1.c[2])+0.5),
               c1.c[1]+uchar(k*(c2.c[1]-c1.c[1])+0.5),
               c1.c[0]+uchar(k*(c2.c[0]-c1.c[0])+0.5));
}

其输入p是一个从0到1的数字,其输出是选定的梯度颜色。在这种情况下,颜色图案本身的骨架由6种颜色组成(阵列Col)。

你可以自由地以任何方式、任何方式进行着色

 
Aleksey Panfilov:

简单地说,就是魔法。!!!

而如果我们在轴上添加一个极地网格,并能够改变比例,直到几乎是直线的 "平行线" (和平行的 "经线"), 我们就可以顺利过渡到传统图形。

当然可以,但我不想用不同的尺度把代码弄得很乱。在这种情况下,对我来说,展示不包含任何多余内容的代码很重要。这样就会更容易理解它。

 
Nikolai Semko:

当然可以,但我不想用不同的尺度把代码弄得很乱。在这种情况下,对我来说,重要的是展示代码,没有任何多余的东西。这将更容易理解它。

尼古拉,关于你的库的一个问题,如何将数据带入专家顾问?

 
Martingeil:

尼古拉,关于你的库的一个问题,如何将数据带入专家顾问?

我不明白这个问题,iCanvas是一个图形库。
你可能在问,如果你通过iCanvas创建了一个具有线条可视化的指标,并让它没有缓冲,那么如何将数据读入EA?那么请你更清楚地表达自己。

首先,没有人禁止你创建缓冲指标数组,就像在标准指标中一样,只需将其做成INDICATOR_CALCULATIONS,然后通过iCustom以常规方式访问数据。

第二,有这样一个强大的工具,作为资源。指示器缓冲区 本质上是相同的资源。无论如何,它们使用相同的机制来存储和访问数据。

处理资源问题。这不是很直接,但它是传输数据的一个重要工具。你可以创建你自己的库,这比经典的缓冲区阵列更有效率。

就个人而言,我使用我自己的设计,我不发表这些设计。它们比iCustom访问更方便、更有效。一切都完全通过资源来实现。