文章 "利用 CCanvas 的自定义指标和信息图"

 

新文章 利用 CCanvas 的自定义指标和信息图已发布:

本文研究结构更加复杂实现的新型指标。它还描述了如何开发伪 3D 指标类型和动态信息图。

我们已研究了使用基元构造复杂形状的类和原理。在描述构造直方图类型指标的类时, 我曾提到通过颜色选择绘制伪 3D 对象 (图例. 13)。然而, 金字塔不是一个平直的数字。因此, 我们必须在给定的二维坐标系中使用其等轴投影。基本结构不包含太多元素 (图例. 14), 但是金字塔投影方法和可视化是这个类需要实现的主要部分。


图例. 14. CPyramid 类的基本结构

作者:Alexander Fedosov

 

它很酷,但完全没有抗锯齿功能。用像素方块绘图已经落后于时代了。

下面的例子可以证明自然界中存在抗锯齿:


 
Nikolai Semko:

它很酷,但完全没有抗锯齿功能。用像素方块绘图已经落后于时代了。

下面这个例子可以证明自然界中存在抗锯齿:


代码呢?

 
Rashid Umarov:

代码呢?


不客气:

#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Demonstrating Canvas features"
#property script_show_inputs 
//---
#include <Canvas\CanvasPro.mqh>
//+------------------------------------------------------------------+
//| 输入|
//+------------------------------------------------------------------+
input int pause = 20;   // 以毫秒为单位向屏幕输出的延迟时间
input bool top = false; // 在图形下画图?
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //颜色处理方法
input int Ncirl =30;    // 圈数
input int MaxSizeCircle = 200; // 圆的最大尺寸
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
int OnStart(void)
  {

   double r1[],r2[],k1[],k2[];
   int x[],y[];
   uint col[];
   int j=0;
   ArrayResize(r1,Ncirl);
   ArrayResize(r2,Ncirl);
   ArrayResize(k1,Ncirl);
   ArrayResize(k2,Ncirl);
   ArrayResize(x,Ncirl);
   ArrayResize(y,Ncirl);
   ArrayResize(col,Ncirl);
   
   ChartSetInteger(0,CHART_FOREGROUND,top);
   int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // 获取窗口宽度
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // 获取窗口高度
   uint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);// 获取窗口背景颜色

   CCanvasPro canvas;
   if(!canvas.CreateBitmapLabel("SampleCanvas",0,0,Width,Height,format))
     {
      Print("Error creating canvas: ",GetLastError());
      return(-1);
     }
   canvas.SetBack(false);
   canvas.Erase(ColorScreen);
   canvas.Update();
   srand(GetTickCount());
   for(int i=0;i<Ncirl;i++)
     {
      x[i]=rand()%Width;
      y[i]=rand()%Height;
      r1[i]=rand()%MaxSizeCircle;
      r2[i]=rand()%MaxSizeCircle;
      k1[i]=(double)(rand()%10)/1000;
      k2[i]=(double)(rand()%10)/1000;
      col[i]=XRGB(rand()%255,rand()%255,rand()%255);
     }
   while(!IsStopped())
     {
      canvas.Erase(ColorScreen);
      for(int i=0;i<Ncirl;i++) canvas.CircleSS(x[i],y[i],r1[i]*fabs(sin(j*k1[i])),r2[i]*fabs(sin(j*k2[i])),col[i]);
      Sleep(pause);
      canvas.Update();
      j++;
     }

   ObjectDelete(0,"SampleCanvas");
   canvas.Destroy();
   return(0);
  }
附加的文件:
 
Rashid Umarov:

代码呢?


标准 cCanvas 已经为所有形状提供了多种平滑方法,不是吗?

 
Andrey Barinov:

标准 cCanvas 已经为所有形状提供了多种平滑方法

唉。即使是基于吴氏方法的最后一个圆函数也存在错误,并且由于该方法的原始性,在圆的对角线位置会产生明显的平滑误差,在速度方面也非常不理想。此外,平滑后的填充形状根本不存在。
 
Nikolai Semko:
唉。即使是基于吴氏方法的最后一个圆函数也存在错误,而且由于这种方法的原始性,在圆的对角线位置进行平滑处理时会产生明显的误差,在速度上也非常不理想。尤其是平滑填充形状根本不存在。
好吧,那我只能提出这个问题了。

代码呢?
 
Rashid Umarov:

代码呢?

Andrey Barinov:
好吧,那我只能加入提问。

代码呢?

很奇怪您为什么会问我这个问题。我不在 Metaquotes 工作,虽然我梦想在那里工作。如果我在这家公司工作,那么我就能很好地解决这个问题,而且不仅能解决 CCanvas 库中的平滑问题,还能解决例如画布中的完整 3D 功能问题。
但现在我只有跪在地上做的实验,我不敢发表这些实验,因为我知道我可以做得更好,但这需要时间。

我真的不明白,为什么所有借助画布实现的效果(本文或此处)都没有经过平滑处理。毕竟,你必须同意,由于像素锯的缘故,这种锯齿会让人眼前一亮,而如果使用了抗锯齿技术,它看起来会酷得多。好吧,去任何一个网站,看看你的 iPhone 或 Android,那里有实心的圆形或圆形按钮。你能找到没有抗锯齿的圆形吗?但是,为什么在 MQL5 中仍然没有全面实现平滑呢?我说错了吗?这就是我发起这个话题并发布这个示例的原因,以证明它并没有什么超自然之处:
附加的文件:
 
Nikolai Semko:

很奇怪你为什么会问我这个问题。我不在 Metaquotes 工作,虽然我梦想在那里工作。如果我在这家公司工作,那么我就能很好地解决这个问题,不仅能解决 CCanvas 库中的抗锯齿问题,还能解决例如画布中的全 3D 功能问题。
但现在我只能做一些实验,这些实验是我跪着组装的,我不敢发表,因为我知道我可以做得更好,但这需要时间。

做工作,写文章。你会得到报酬,而且会很有用。
 

这已经是第 10 次了,虽然没有帖子编辑或新帖,但该主题被标记为未读。

是有人在捣乱,还是论坛出了问题?

 
Andrey Khatimlianskii:

这已经是第 10 次了,虽然没有帖子编辑或新帖,但该主题被标记为未读。

是有人在捣乱,还是论坛出了问题?


我怀疑作者正在编辑他的帖子。

另一种可能是:有人开始写帖子后退出了,现在这个帖子挂在编辑模式下,论坛每隔一分钟(5 分钟、10 分钟?