前几课介绍了CChart的第一个例程,画了一条简单的折线图。有的同学不免就要嘀咕了,原来CChart也就不过尔尔了呗,没什么特别之处,我用MoveTo、LineTo在屏幕上自己画也能完成。
这些同学低估了CChart的功能。
虽然CChart是笨笨自己捣鼓出来的,但笨笨十年磨一剑,目前CChart功能已经相当不错。笨笨自我感觉CChart在功能上不比MsChart、TeeChart、ChartDirector等大公司的产品差多少。当然在调用接口方面、一些图像细节处理方面,和大公司产品的确还有差距。
这也是没有办法的。笨笨作为一个非专业的业余编程爱好者,独自开发这几十万行的代码,确实没法和公司的专业人员相比。
不闲扯了,今天给大家带来CChart的第一个高级功能――等高线图。等高线功能可是笨笨当初开发CChart库的缘由哟。
既然要画等高线图,首先得想好等高线图的函数。实际应用中,等高线图的函数可能是多种型式的,例如测量数据、程序模拟计算结果等。最终都将可以表示成z=f(x,y)的形式,其中x、y就是平面坐标,z就是等高线的高度。
作为例子,这里我们对一个比较简单的函数绘制等高线。其中f(x,y)=1.0/((x-1.0)*(x-1.0)+y*y+1.0)。可以想象,这个函数在坐标点(1.0,0.0)位置有极大值。让我们把等高线画出来,看结果对不对。
首先仍然按照第一课的方法,建立一个VC6项目,名称为Lesson04。
按照第一课的流程,完成第一步到第九步,其中第七步WM_CREATE消息的响应例程暂时不填,如下。
case WM_CREATE: break;
然后按照第三课的方法,让我们的程序能响应鼠标双击。
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
建立等高线函数。在WndProc函数的前面某个位置,输入如下代码。
double f(double x, double y) { return 1.0/((x-1.0)*(x-1.0)+y*y+1.0); }
修改WM_CREATE消息的响应例程
case WM_CREATE: chartWnd.Attach(hWnd, kTypeContourLine); chartWnd.GetChart()->SetFieldFcn(f); { double xRange[2], yRange[2]; xRange[0] = -2.0; xRange[1] = 2.0; yRange[0] = -2.0; yRange[1] = 2.0; chartWnd.GetChart()->SetPlotRange(xRange, yRange); } break;
注意等高线图的类型标识为kTypeContourLine。
现在编译并运行程序,得到的效果如图。
哈哈,等高线图这么容易就出来了。从图可以看出,(1,0)位置的确是一个极值点。
上面的代码中,利用SetFieldFcn设置等高线函数,利用SetPlotRange设置绘图的X坐标和Y坐标的范围。
有的同学仔细瞧了瞧上面的图,发现图中的线不甚光滑,这个问题能解决吗?
请在WM_CREATE消息的响应例程中break;前面添加一句代码。
chartWnd.GetChart()->SetContourPrecision(8);
再运行试试看,曲线是不是光滑多了?
这里用SetContourPrecision设置等高线的精度,一般设置为5或者6就可以了。设置得越高,第一次绘制的时候延迟就越长。
还有的同学会觉得等高线是不是有点稀疏,那好,请在WM_CREATE消息的响应例程中break;前面再添加一句代码。
chartWnd.GetChart()->SetContourLineNum(50);
运行效果如图。
这下等高线够多了的吧,呵呵。
这里SetContourLineNum用来设置等高线高度的个数。
到现在为止,同学们已经会用CChart画等高线了,简单得出奇吧!
当然等高线图的色彩有点单调,后续课程中将介绍另一种类似的视图――云图,那就五颜六色、五彩缤纷了,嘿嘿。
下课了!