1

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

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

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

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

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

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

4

4 回答 4

1

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

于 2012-04-10T15:16:30.487 回答
1

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

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,对不起菜鸟)

于 2012-04-10T15:22:02.853 回答
1

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

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

于 2012-04-10T17:45:39.027 回答
0

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

于 2012-04-10T15:39:42.223 回答