Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397550
  • 博文数量: 158
  • 博客积分: 1227
  • 博客等级: 少尉
  • 技术积分: 946
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 16:19
文章分类
文章存档

2016年(1)

2015年(1)

2012年(107)

2011年(49)

分类: IT业界

2012-04-11 14:24:00

原文地址: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) |
0

上一篇:qwtplot3D 编译篇

下一篇:qwtplot3d 学习笔记 2

给主人留下些什么吧!~~