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

前几课介绍了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);
		chartWnd.GetChart()->SetPlotRange(-2.0, 2.0, -2.0, 2.0);
		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画等高线了,简单得出奇吧!

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

下课了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值