绘制图表的最佳方法是什么?

时间:2012-04-10 14:59:12

标签: c# algorithm math drawing

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

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

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

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

那么有更好的方法来绘制图形吗?

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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,对于noobness抱歉)

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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