深入浅出CChart 每日一课——快乐高四第六十一课 飞梯十二重,CChart三维曲线图绘制

同学们好,今天继续介绍CChart本身的功能。接下来这几节课呢,笨笨老师准备对CChart的三维视图和场图功能进行详细一些的介绍。本节课首先介绍三维曲线图。

CChart软件库的开发,首先是从二维曲线图开始的,这一部分经过长时间的打磨,显示效果已经非常不错,功能也非常丰富。

对于三维曲线图,其实功能早就有了,本系列教程比较早期的课程,第十四课 三维视图,数学老师之从平面到空间,就已经展示了三维曲线的功能。但说实话,当时的三维曲线功能差强人意,只能说具备,但远远比不上CChart二维曲线那么好用。

经过这些年不断的改进,目前,三维图功能其实也已经相当不错了,这也是笨笨老师作为一个业余程序员,不断学习进步的成果。

CChart提供了3种三维视图:模拟三维视图、三维折线图、三维曲面图,CChart内部代号分别为:kTypeXY3D、kType3DLine、kType3DSurface。

本节课只介绍前面两种视图,这两种视图都是画曲线的。

虽然这两种视图都可以画三维曲线,但其内部实现是完全不同的。模拟三维视图并不是真正的三维视图,它只是二维折线图的魔改版,实际上渲染引擎是Windows GDI。而三维折线图则是真正的三维视图,内部采用OpenGL实现。

下面这两个图分别是模拟三维视图和三维折线图。

模拟三维视图。

三维折线图。

可见两者差别还是蛮大的。

下面还是用一个实例来展示一下CChart的三维曲线绘制功能。

A61.1 三维曲线图主要API

对于三维曲线图,最主要有以下两个添加数据的接口。

        // 添加三维曲线的一个数据点
		int			AddPoint3D(double x, double y, double z, int nDataIndex=0);
		// 添加一条三维曲线
		int			AddCurve3D(double *pX, double *pY, double *pZ, int nLen);	

和二维曲线的接口名和参数略有区别,很好理解。

A61.2 编程Demo

这里我们在一个对话框界面上,放置两个控件,分别用模拟三维视图和三维折线图显示相同的数据。

1. 框架程序编写

首先利用Visual Studio的向导,建立一个基于对话框的MFC应用程序,名为LessonA61。

具体过程不详述了。

2. 初始化

在LessonA61Dlg.h文件的头部,加入下列代码。

#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;

在资源编辑器里面,把主对话框拉大一点,然后放置两个Custom Control,ID分别是IDC_CUSTOM1和IDC_CUSTOM2,class都设置为ChartCtrl。

在LessonA61Dlg.cpp文件里面,函数OnInitDialog里面,// TODO: Add extra initialization here这一行下面,添加如下代码。

    CChart *chart;
	chart = GetChart(GetDlgItem(IDC_CUSTOM1)->m_hWnd);
	chart->SetType(kTypeXY3D);
	chart = GetChart(GetDlgItem(IDC_CUSTOM2)->m_hWnd);
	chart->SetType(kType3DLine);

得到如下图像。

图中左边准备绘制模拟三维曲线,由于这实际是二维曲线图,默认界面大家都很熟悉,右边准备绘制真三维曲线,默认界面为空。

3. 添加曲线数据

在LessonA61Dlg.cpp文件里面,把刚才的代码扩充一下,如下。

    int len = 1080;
	double pi = 4.0*atan(1.0);
	double *pX = new double[len];
	double *pY = new double[len];
	double *pZ = new double[len];

	for(int i=0; i<len; ++i)
	{
		pX[i] = 2.0*cos(i*2.0*pi/360.0);
		pY[i] = 2.0*sin(i*2.0*pi/360.0);
		pZ[i] = 2.0*i/(double)len;
	}

	CChart *chart;
	chart = GetChart(GetDlgItem(IDC_CUSTOM1)->m_hWnd);
	chart->SetType(kTypeXY3D);
	chart->AddCurve3D(pX, pY, pZ, len);
	chart->SetTitle(_T("模拟三维视图"));
	chart = GetChart(GetDlgItem(IDC_CUSTOM2)->m_hWnd);
	chart->SetType(kType3DLine);
	chart->AddCurve3D(pX, pY, pZ, len);
	chart->SetTitle(_T("三维曲线视图"));

	delete []pZ;
	delete []pY;
	delete []pX;

补充数学库头文件。

#include <math.h>

最终效果如图。

两者采用的坐标系有一点区别。模拟三维视图的Z轴垂直于屏幕向里,而三维曲线视图的Z轴开始是向上的。

应该说两者各有特色吧。模拟三维视图继承了CChart二维视图的优点,效果很不错。三维曲线视图可以得到更好的立体感。

三维曲线视图是可以用鼠标操作的。主要有三个操作,以便更好地查看图像。

1) 按住鼠标左键,在视图里面移动,视图整体绕原点旋转。

2) 按住鼠标左键,同时按住Ctrl键,在视图里面移动,视图整体平移。

3) 滚动滚轮键,可以实现视图缩放。

好了,本节课结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值