【问题标题】:What is the best approach to plot graphs?绘制图表的最佳方法是什么?
【发布时间】:2012-04-10 14:59:11
【问题描述】:

我正在开发一个图形计算器应用程序,当然,该应用程序的主要功能是显示图形。

现在,这就是我的绘图算法的工作原理:我将绘图画布划分为N 间隔(其中N 定义了应用程序的设置,默认值约为700)。对于每个区间,我评估两端的函数,并在两点之间画一条线。

以下是我发现此方法的缺点:

  • 图形的精度不是很好(例如函数sin(tan(x))
  • 间隔数越多,渲染越慢(例如,N 大于 1000)。此外,缩放和导航控件也会受到影响。

那么有没有更好的方法来绘制图表?

我正在使用 C# (WPF) 进行编程,但我认为这无关紧要,因为我正在寻找一种算法。

【问题讨论】:

  • 慢的部分是什么?计算还是在屏幕上放一个像素?将像素放在屏幕上可能会非常慢,如果这是问题,请查看 C# 的 fastbitmap。

标签: c# algorithm math drawing


【解决方案1】:

更好的方法是使用自适应间隔大小。也就是说,从相对粗略的间隔开始,比如 20。对于每个间隔,计算间隔结束和中间的函数。如果中间点靠近连接两个端点的线,画一条线,你就完成了这个间隔。如果不是,则将区间一分为二,然后用两个较小的区间重复。

如果间隔变得太小而没有收敛到一条线,您可能已经发现了不连续性,不应连接间隔端点。

【讨论】:

  • 是的,这是个好主意。不过,我担心像正弦函数这样的情况,函数的形状可能会欺骗算法:我计算函数的点可能具有非常接近的值,但值之间会完全不同。
  • 好点,但任何采样算法,包括您的原始算法,都可能会因此而失败。
【解决方案2】:

如果您要绘制一些任意函数,则无需编写自己的算法。使用相关库中的图形控件,请参阅here 并提供必要的数据(x、y 坐标)。

【讨论】:

  • 如果我做的每一件事都使用库,那么编写代码的乐趣在哪里?
  • 乐趣来自数学而不是编码,此外,如果你不把时间浪费在这样的事情上,你会喜欢做比编写图表例程更强大的事情。
  • 这是一个研究项目,不是商业应用,所以我想提高我的编程技能。而且我怀疑图书馆是否会让我尽可能多地控制最终结果的外观。
  • 如果您有兴趣查看一些用于绘图等的源代码,请参阅here
  • 或c#一here
【解决方案3】:

我希望我可以帮助您使用几年前使用为 mingw 编译器移植的原始 graphics.h 制作的 C++ 程序的 sn-p。变量名非常清楚。

void func_gen(char expr[100],float precision,int color)
{
     float x=-(xres/2)/(float)zoom_factor;
     float max_range=-x;
     while(x<=max_range)
     {
        float y;
        y = evalu(expr,x);          //user defined function which i used to evaluate ann expression
        float xcord=xby2+zoom_factor*x+xshift;
        float ycord=yby2-zoom_factor*y+yshift;
        if(xcord<=xres && xcord>=0 && ycord>=0 && ycord<=yres)
            putpixel(xcord,ycord,color);
            x=x+precision;
     }
}

当我降低精度值时,这种方法会变得非常慢(这实际上会增加绘图的精度:p,抱歉新手)

【讨论】:

  • 好的,你正在逐个像素地绘制它。我明白了,这和我的想法很相似。问题是 C# 是一门高级语言,逐像素绘制非常慢,这就是我绘制段而不是像素的原因。
【解决方案4】:

我认为你应该使用DrawPath。该方法使用一个辅助结构(GraphicsPath),仅针对您正在编码的任务进行优化。 edit 一个小的优化可能是在段的左侧对函数进行评估,并在最后一段的关闭点进行评估。

【讨论】:

  • 这些是表单的一部分,而不是 WPF。问题是关于最佳算法,而不是使用的函数。
  • WPF 有一个Path shape。我认为应该作为表单对应的工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多