【问题标题】:Algorithm for plotting 2d xy graph绘制二维 xy 图的算法
【发布时间】:2019-03-11 11:34:34
【问题描述】:

我正在尝试使用 Java 实时绘制 XY 图。只依赖 X 的函数很简单。只需遍历x0...xn,获取值并在点之间画线。上面有很多指南,而且很直观。

但实际上没有关于以x 和y 为变量绘制图形的指南。 考虑这个等式:sin(x^3 * y^2) = cos(x^2 * y^3)

使用在线图形绘图仪我得到这个:

虽然我绘制相同函数的最佳结果是:

我只是遍历屏幕上的每个像素并将像素位置作为参数传递给函数。如果函数的输出接近 0,我给像素上色。如您所见,这很糟糕。它还需要大量的处理能力。它每隔几秒钟只重绘一次。如果我尝试提高精度,所有线条都会变得更粗。尤其是在十字路口附近。

我的问题是如何让我的程序更快并生成更好看的图表。也许有一些算法可以达到这个目的?

【问题讨论】:

    标签: algorithm plot graph


    【解决方案1】:

    挑战在于选择正确的阈值。 abs(f(x,y)) 低于阈值的像素应着色。高于阈值的像素应该是白色的。

    问题在于,如果阈值太低,则会在没有像素正好在线的地方出现间隙。另一方面,如果阈值太高,在函数接近零的地方线条变宽,函数变化缓慢。

    那么正确的阈值是多少?答案是the gradient 的大小乘以一个像素的半径。换句话说,像素应该在什么时候被着色

    abs(f(x,y)) < |g(x,y)| * pixelRadius
    

    原因是梯度的大小等于表面的最大斜率(在给定点)。因此,如果斜率大到足以在像素内将函数减小为零,则会在像素内发生过零。

    这当然只是粗略的近似。它假设梯度在像素所包围的区域内没有显着变化。问题中的函数很好地符合该假设,除了右上角。请注意,在下图中,右上角有Moiré patterns。我相信这是因为我的抗锯齿计算失败:我没有补偿快速变化的渐变。

    在下图中,像素为白色

    abs(f(x,y)) > |g(x,y)| * pixelRadius
    

    否则像素强度为0到1之间的数字,0为黑色,1为白色:

    intensity = abs(f(x,y)) / (|g(x,y)| * pixelRadius)
    

    【讨论】:

      【解决方案2】:

      我不知道在线绘图仪的​​效果如何,但这里有一些建议。

      • 简化您的方程式,对于这个特定的方程式,您可以轻松地使用x^2 * y^2 * (x ± y) = (2 * n + 1 / 2) * pi 其中n 表示任何整数。比原来的清晰多了。
      • 画线而不是点。这里的每个n 代表4 条曲线,您现在可以循环x 并找出y 并在相邻点之间画一条线。

      希望对你有帮助!

      【讨论】:

      • 这肯定会有所帮助,但我正在制作一般用途的绘图仪。这样您就可以输入任何方程式并立即获得图像。这些优化是针对每个功能的,所以不会有太大帮助..
      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多