本文主要是介绍深入浅出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) 滚动滚轮键,可以实现视图缩放。
好了,本节课结束。
这篇关于深入浅出CChart 每日一课——快乐高四第六十一课 飞梯十二重,CChart三维曲线图绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!