上一篇讲到用datavisualization绘制曲面图,发现绘制的效果没有达到自己的预期,于是打算换一个库试试看-qwtplot3d。
绘制曲面图整体流程:
1、首先使用qwtplot3d有两种方式、继承、直接实例化。在这里本人是直接实例化来操作的SurfacePlot* m_dataWidget;通过操作m_dataWidget控制绘制曲面图。
2、构造数据:将我们的数据构造成m_dataWidget需要的数据
3、加载数据:SurfacePlot库中有三种方式加载数据
1)loadFromData(Qwt3D::Triple** data, unsigned int columns, unsigned int rows
, bool uperiodic = false, bool vperiodic = false);
2)bool loadFromData(double** data, unsigned int columns, unsigned int rows,double minx, double maxx, double miny, double maxy);
3)bool loadFromData(Qwt3D::TripleField const& data, Qwt3D::CellField const& poly);
4、设置图例:根据个人需求设置图例。
5、设置曲面颜色:根据个人需求绘制想要的颜色以及渐变色。
接下来是介绍它们的详细操作以及原理。
qwtplot3d曲面图绘制原理
整个曲面图是由n个如下的矩形组成
它的连线原理就是上图中按照顺序去连接的,可以是ABCD,也可以是ADCB这种,顺时针、逆时针连接矩形。
本人采用上述加载数据的第三种方法
Data:存放所有的数据点集(x、y、z);
poly:2维的数组,外层的index代表一个矩形,内层存放绘制该矩形顶点索引,需要按照绘制矩形的顺序存放,该索引对应Data数据点集中的数据;
构造数据
按照上述中绘制原理分别构造出data和poly。
然后m_dataWidget->loadFromData(data, poly);进行加载数据。
绘制图例
// 刻度条设置
m_dataWidget->legend()->setMajors(maxScale);// 设置刻度数量最大数量
m_dataWidget->legend()->setMinors(minScale);
m_dataWidget->legend()->drawNumbers(true);
// 刻度值设置
m_dataWidget->legend()->setLimits(m_minColor, m_maxColor);// 设置最大、最小刻度值
存放色谱总体的颜色容器:Qwt3D::ColorVector colors;
通过修改colors数组的rgba修改整体颜色
设置曲面颜色
// 曲面图颜色
ColorVector cv;
RGBA elem;
int size = Data->size();
for (int i = 0; i < size; i++)
{
elem.a = 1.0;
elem.r = Data->at(i).cr;
elem.g = Data->at(i).cg;
elem.b = Data->at(i).cb;
cv.push_back(elem);
}
Qwt3D::StandardColor* col = new StandardColor(m_dataWidget, 400);
col->setColorVector(cv);
m_dataWidget->setDataColor(col);
由于个人需求,本人在构造数据的同时把每个点和一个颜色关联起来。这里conepos->at(i);cr、cg、cb就是关联的颜色rgb,这样就可以按照个人需求去实现控制曲面的颜色。
总结:qwtplot3d与datavisualization比起来,qwtplot3d绘制效果连接线更好一些,以及可以修改库中的代码实现自己想要的效果,不过qwtplot3d的类不是很丰富,比如它就没有像datavisualization提供选点的操作等,so,世间安得两全法,最终还是要在qwtplot3d基础上进行修改,根据个人需求去实现想要的效果。