文章 "可视化!类似于 R 语言 "plot (绘图)" 的 MQL5 图形库" - 页 5

 
Artyom Trishkin #:

所有平滑方法都高度依赖于线条的不透明度。当不透明度达到 50%左右时,一切都会变成无锯齿,并产生人工痕迹。

现在,即使是完全不透明的线条也会出现伪影。

我们正在讨论如何在不损失平滑度的情况下绘制一个边缘平滑的不透明圆(使用 Wu 算法)。

这需要使用特殊的方法来填充平滑边缘。

 
Anatoli Kazharski #:

现在,即使是完全不透明的线条也会出现伪影。

这是在尝试绘制一个边缘平滑的完全不透明的圆(使用吴的算法),而不损失平滑度。

这需要使用特殊的方法来填充平滑边缘。

据我所知,你自己做不到吗?

 
Artyom Trishkin #:

我意识到我一个人做不到?

为什么不呢?试试吧!)

您甚至可以解决您提到的情况:

交易、自动交易系统和交易策略测试论坛

讨论文章 "Visualise it!MQL5中的图形库与R中的plot类似"

Artyom Trishkin, 2023.07.31 12:39 AM

所有平滑方法都在很大程度上取决于线条的不透明度。当不透明度达到 50%左右时,一切都会变得不平滑,并产生假象。

也就是说,在完全透明的画布(CCanvas)上绘图时可以考虑底层(图表和其他对象),而且不会出现伪影。

但这似乎相当麻烦。此外,目前还不清楚它对性能的影响有多大。我仍然希望终端开发人员能修复这个错误。

 
Anatoli Kazharski #:

为什么不呢?试试吧!)

你甚至可以解决你提到的案件:

也就是说,在完全透明的画布 (CCanvas) 上进行渲染时,可以将底层(图表和其他对象)考虑在内,而且不会产生伪影。

但这似乎比较麻烦。此外,还不清楚它对性能的影响有多大。我仍然希望终端开发人员能修复这个错误。

我会把这个任务(如果不是开发人员,而是论坛成员)交给 Nikolai@Nikolai Semko 来解决;)

 
Artyom Trishkin #:

我会将这样的任务(如果不是开发人员,而是论坛成员)交给 Nikolai@Nikolai Semko 解决;)

他只使用一个画布。

我还没准备好重写我的图形库,让所有东西都能在一张画布上运行。

虽然这很有趣,但我知道这可能要花费很多时间,所以目前还不能决定接受这样的挑战。我现在没有以前那么多时间了。

 
Anatoli Kazharski #:

它只适用于一块画布。

我还没准备好重写我的图形库,让所有东西都能在一个画布上工作。

虽然这很有趣,但我知道这可能要花费很多时间,所以现在还不能决定接受这样的挑战。我现在没有以前那么多时间了。

嗯,这是一种算法。在一张画布上还是在几张画布上有什么区别?

 
Artyom Trishkin #:

嗯,这是一种算法。在一块画布上还是在几块画布上有什么区别?

我们已经讨论过两个问题:

1.如果这就是我最初所说的问题,那么算法解决方案在某些情况下就足够了。

2.如果是你提到的那个问题,那么几个函数在这里是不够的。您需要一种将所有图层都存储在数组中的方案。每个图层的绘制都应考虑到其下层的绘制情况。此外,CCanvas 类中的所有方法都应进行修正。每个像素的颜色都应与下面的像素混合,同时考虑到透明度。这样就不会出现人工痕迹(缝隙、锯齿状边缘等)。如果处理得当,就可以通过模糊实现半透明效果。所有这些在单个画布上都很容易实现。但当使用多个画布时,实现起来就困难得多。

 
Anatoli Kazharski #:

它只适用于一块画布。

我还没准备好重写我的图形库,让所有东西都能在一个画布上工作。

虽然这很有趣,但我知道这可能要花费很多时间,现在还不能决定接受这样的挑战。现在没有以前那么多时间了。

实际上,我使用多个画布(通常不超过 4 个)。
总有一个黄金分割点。一个极端是将所有的静态和动态都画在一张画布上,另一个极端是将所有的物体都画在不同的画布上。
重要的是不要忘记,如果您有两个具有透明度的画布,并且相互重叠,那么 CPU(也许在 Win10-11 中是 GPU,但我认为仍然是 CPU)仍然会混合每个像素甚至是同质(透明度不为零)的背景。
在此,我们可以借鉴 JS 的做法,缓存画布或画布的一部分,以提高性能。
至于反锯齿圆,我已经发布过这样一个圆的变体,它是半径小于 ~5 像素的圆的理想选择(就性能而言)。我想这个函数叫做 iDot(),就在 3DStars 代码中。它非常简单(约 10 行代码)。对于半径较大的圆,它的性能远非最佳。对于较大半径的圆,高性能函数已经超过 100 行代码。
是的,经过多年在画布上建立新的大脑神经连接,我现在可以在画布上制作任何级别的库。会有时间和动力的。
吴算法被认为已经过时。
 
Anatoli Kazharski #:

我们讨论了两个挑战:

1.如果是我最初说的那个问题,那么在某些情况下,算法解决方案就足够了。

2.如果是你提到的情况,那么几个函数是不够的。您需要一种将所有图层都存储在数组中的方案。每个图层的绘制都应考虑到其下层的绘制情况。此外,CCanvas 类中的所有方法都应进行修正。每个像素的颜色都应与下面的像素混合,同时考虑到透明度。这样就不会出现人工痕迹(缝隙、锯齿状边缘等)。如果处理得当,就可以通过模糊实现半透明效果。所有这些在单个画布上都很容易实现。但当使用多个画布时,实现起来就困难得多。

我以为我说的只是平滑算法。而不考虑透明画布之间的重叠。虽然如果叠加,肯定会出现新的问题。这就是我提到尼古拉的原因--你看,他的神经连接已经有很长一段时间了,他的大脑可能已经在考虑画布可能出现的所有问题)。

 
Artyom Trishkin #:

我以为我说的只是平滑算法。并没有提到将透明画布叠加在一起。虽然...如果把它们叠加在一起,肯定会出现新的问题。这就是我提到尼古拉的原因--你看,他的神经连接已经有很长一段时间了,他的大脑可能已经在考虑画布可能出现的所有问题)。

Artem,这些都不是需要新神经连接的琐碎任务。例如,SVG 中就有 viewBox 这样一个概念。我已经看了很多关于它如何工作的视频,读了很多文档,写了很多代码,但有时还是会一筹莫展。我仍然没有建立起必要的神经联系,尽管有好几次我似乎已经把一切都弄明白了。