winform双缓冲绘制坐标轴图像
作者:admin 来源: 2022/7/15 17:20:34

  本文实现在winform中使用双缓冲技术绘制坐标轴,并实现根据文本公式绘制对应的曲线图。

一、Panel控件承载图像

  绘制的图形首先得有个东西来承载方能显示,在winform中一般是使用Panel控件。创建一个winform工程,打开工具箱,拖动一个Panel控件到主界面,调节合适的大小。


二、Graphics类

  在.net中一般使用Graphics类进行绘制图像,简单摘取将要用到的主要函数。

//画直线
public void DrawLine(Pen pen, int x1, int y1, int x2, int y2)
//写文字
public void DrawString(string s, Font font, Brush brush, PointF point)
//填充椭圆
public void FillEllipse(Brush brush, RectangleF rect)
//将一张图贴到承载控件上
public void DrawImage(Image image, int x, int y)
其中的参数含义也很好理解,不免发现一些约定成俗的规矩,如x1和y1对应的是起始坐标,x2和y2指的是结束坐标。

坐标x和坐标y组成一个坐标点PointF。RectangleF指的是矩形。Pen指的是画笔,在其中定义线条颜色和粗细。


三、绘制思路

  类似于画家画画,其实图像也是根据自己的需求是一笔一划慢慢绘制出来的。比如我先从左到右画一根直线,再从上到下画一根竖线,接着再绘制一些文字等。

  所以如果我们每画一笔都直接显示在控件上,这种绘制效率是比较低的,特别是在进行大量数据的绘制和显示时,程序会有闪烁现象。

  改善的方法是,首先把图像一笔一划地画在内存中,等到画画完毕了,再一次性放出来也就是贴到承载地控件上显示,这种技术也就叫做双缓冲技术。

  百科:双缓冲绘图即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。

 双缓冲实现过程如下:
      1、在内存中创建与画布一致的缓冲区
      2、在缓冲区画图
      3、将缓冲区位图拷贝到当前画布上
      4、释放内存缓冲区
  具体就是首先创建一个Bitmap,然后在上面画啊画,画完再贴到Panel上面显示。

四、实现根据文本公式计算坐标值

  绘制坐标轴的功能实现后,坐标轴中空空如也啊。所以我想在坐标中绘制一些曲线。比如绘制函数公式:y=2*x*x*x+3*x*x-24*x+1

  我当然可以把这条函数公式直接写到代码中,但是我想换条公式呢?再次改代码吗,No!这并不是我的style。我希望界面上可以提供一个输入框,输入任意公式后界面上直接输出对应的曲线。

  从输入框我们只能得到这条公式的文本格式,并不能知道其中是加减乘除,这就涉及到如何在代码中根据文本公式进行计算。

  答案之一是DataTable可以实现。

以下是一个小例子:


float x=1.2f;
DataTable cal_dt = new DataTable();
string expression="2*x*x*x+3*x*x-24*x+1";
expression = formula.Replace("x", x.ToString());
string result = cal_dt.Compute(expression, "false").ToString();
  定义1个DataTable对象,使用replace函数把公式中的x替换成具体的数值,最后使用Compute函数进行运算,字符串类型result就是结果!


  最后效果图如下:


下载码:B4A4FBA6A5

下载码是啥?如何下载=》点击查看

称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1