原文地址:http://lybhu.blog.sohu.com/158286222.html
qwtplot3d 用 Qt 和 OpenGL 实现的 Qt 控件库,效果还不错,但是好像07年之后就没有更新了。可能是作者觉得已经很完善了,不需在更新了。
最近花了点时间仔细研读了 qwtplot3d 附带的例子程序,大体明白了 qwtplot3d 的设计思路。在这里做个记录,算是个备忘录。
Plot3D
|-<--GraphPlot
|-<--MultiPlot
|-<--SurfacePlot
|-<--VolumePlot
Plot3D 是qwtplot3d 中所有绘图控件的基类,实现了坐标系统,鼠标、键盘响应,标签,legend,等公共功能。是个纯虚类。
显示图形的各种设置差不多都在基类中设置,下面是一些例子。每个成员函数具体的功能见 API 手册。
void setRotation (double xVal, double yVal, double zVal)
void setShift (double xVal, double yVal, double zVal)
void setViewportShift (double xVal, double yVal)
void setScale (double xVal, double yVal, double zVal)
void setZoom (double)
void setOrtho (bool)
void enableMouse (bool val=true)
void disableMouse (bool val=true)
void enableKeyboard (bool val=true)
void disableKeyboard (bool val=true)
void enableLighting (bool val=true)
void disableLighting (bool val=true)
SurfacePlot 等类继承自Plot3D。这四个类中 SurfacePlot 最常用,这里只介绍它。
SurfacePlot 是绘制曲面图的类。类中提供了 loadFromData 方法,可以载入曲面数据。适合绘制那些只有采样点信息的曲面。
如果是绘制函数图形。则有更简便的方法。
Mapping
|-<--GridMapping
|-<--Function
|-<--ParametricSurface
GridMapping 等类提供了将函数映射到网格的功能。
GridMapping 实现了设置网格大小,显示范围。
void setMesh (unsigned int columns, unsigned int rows)
void setDomain (double minu, double maxu, double minv, double maxv)
具体的映射由 Function 和 ParametricSurface 来实现。
Function 适合绘制通常的函数图形,ParametricSurface 适合于绘制参数方程的图形。
我们需要继承 Function 类,实现 Function 类中的一个虚函数。
virtual double operator() (double x, double y)=0
这个虚函数的作用就是给出函数表达式。
ParametricSurface 类也类似,需要继承后实现如下函数:
virtual Qwt3D::Triple operator() (double u, double v)=0
这里的返回值的类型 Qwt3D::Triple 是一个三维的向量,分别存储 x,y,z 的值。
Function 类中还提供了两个函数:
void setMinZ (double val)
void setMaxZ (double val)
ParametricSurface类中还提供函数:
void setPeriodic (bool u, bool v)
用来设置 u v 的周期性。
最终还要将继承自 Function 或 ParametricSurface 的类与 SurfacePlot 类绑定。下面是一个简单的例子:
using namespace Qwt3D;
class Rosenbrock : public Function
{
public:
Rosenbrock(SurfacePlot* pw)
:Function(pw) { }
double operator()(double x, double y)
{ return log((1-x)*(1-x) + 100 * (y - x*x)*(y - x*x)) / 8; }
};
class Plot : public SurfacePlot
{
public:
Plot();
};
Plot::Plot()
{
Rosenbrock rosenbrock(this);
rosenbrock.setMesh(500,500);
rosenbrock.setDomain(-1.73,1.5,-1.5,1.5);
rosenbrock.setMinZ(-10);
rosenbrock.create();
setRotation(30,0,15);
setScale(1,1,1);
setShift(0.15,0,0);
setZoom(0.9);
updateData();
updateGL();
}
int main(int argc, char **argv)
{
QApplication a(argc, argv);
Plot plot;
plot.resize(800,600);
plot.show();
return a.exec();
}
如有疑问,请向原作者留言!
阅读(2027) | 评论(0) | 转发(1) |