深入浅出CChart 每日一课――第四课 等高线图,白富美之第一个高级功能

前几课介绍了CChart的第一个例程,画了一条简单的折线图。有的同学不免就要嘀咕了,原来CChart也就不过尔尔了呗,没什么特别之处,我用MoveToLineTo在屏幕上自己画也能完成。

这些同学低估了CChart的功能。

虽然CChart是笨笨自己捣鼓出来的,但笨笨十年磨一剑,目前CChart功能已经相当不错。笨笨自我感觉CChart在功能上不比MsChartTeeChartChartDirector等大公司的产品差多少。当然在调用接口方面、一些图像细节处理方面,和大公司产品的确还有差距。

这也是没有办法的。笨笨作为一个非专业的业余编程爱好者,独自开发这几十万行的代码,确实没法和公司的专业人员相比。

不闲扯了,今天给大家带来CChart的第一个高级功能――等高线图。等高线功能可是笨笨当初开发CChart库的缘由哟。

既然要画等高线图,首先得想好等高线图的函数。实际应用中,等高线图的函数可能是多种型式的,例如测量数据、程序模拟计算结果等。最终都将可以表示成z=f(x,y)的形式,其中xy就是平面坐标,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。

现在编译并运行程序,得到的效果如图。

SouthEast

哈哈,等高线图这么容易就出来了。从图可以看出,(1,0)位置的确是一个极值点。

上面的代码中,利用SetFieldFcn设置等高线函数,利用SetPlotRange设置绘图的X坐标和Y坐标的范围。

有的同学仔细瞧了瞧上面的图,发现图中的线不甚光滑,这个问题能解决吗?

请在WM_CREATE消息的响应例程中break;前面添加一句代码。

chartWnd.GetChart()->SetContourPrecision(8);
 


再运行试试看,曲线是不是光滑多了?

这里用SetContourPrecision设置等高线的精度,一般设置为5或者6就可以了。设置得越高,第一次绘制的时候延迟就越长。

还有的同学会觉得等高线是不是有点稀疏,那好,请在WM_CREATE消息的响应例程中break;前面再添加一句代码。

chartWnd.GetChart()->SetContourLineNum(50);
 


运行效果如图。

SouthEast

这下等高线够多了的吧,呵呵。

这里SetContourLineNum用来设置等高线高度的个数。

到现在为止,同学们已经会用CChart画等高线了,简单得出奇吧!

当然等高线图的色彩有点单调,后续课程中将介绍另一种类似的视图――云图,那就五颜六色、五彩缤纷了,嘿嘿。

下课了!

你可能感兴趣的:(教程,数据可视化,CChart,等高线图)