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

2016年(1)

2015年(1)

2012年(107)

2011年(49)

分类: IT业界

2012-04-11 14:30:16

原文地址:http://lybhu.blog.sohu.com/160901596.html

qwtplot3d中绘制三维图形时可以细致的设置图形的方方面面,这里对设置坐标系统(CoordinateSystem),包括坐标轴(Axis)、标签(Label)、颜色条(ColorLegend)的方法做一个简单的笔记。

从类的派生关系来看,几个类都是派生自同一个基类 Drawable 的:

Drawable
|-<--Axis
|-<--ColorLegend
|-<--CoordinateSystem
|-<--Label

但是从逻辑关系上考虑,应该是这样的。首先 Plot3D 及其派生类代表了一个实际的绘图对象,这个绘图对象中包含坐标系统、标签等,坐标系统又包括坐标轴。

因此,可以这样表示:

Plot3D <--CoordinateSystem <-- Axis
     |-<-- ColorLegend
     |-<-- Label

实际写程序时也是这样的。Plot3D 类中有个成员函数:

Qwt3D::CoordinateSystem *  coordinates ()

利用这个成员函数可以返回一个指向坐标系统的指针。然后就可以访问相应的坐标系统了。

Qwt3D::ColorLegend *  legend ()

这个成员函数则可以返回一个指向颜色条的指针。

CoordinateSystem 类中的成员函数很多,其中最主要的有:

void  setStyle ()
void  setPosition ()
void  setAxesColor ()
void  setNumberFont ()
void  setNumberColor ()
void  setStandardScale ()
void  adjustNumbers ()
void  adjustLabels ()
void  setGridLinesColor ()
void  setLabelFont ()
void  setLabelColor ()
void  setLineWidth ()
void  setTicLength ()
void  setAutoScale ()
void  setAutoDecoration ()
void  setLineSmooth ()
void  setGridLines ()

可以看出,利用这些函数已经可以对显示的图像很多方面进行控制了。但是如果需要更精细的控制。比如利用 setAxesColor 函数虽然可以设置坐标轴的颜色,但是无法单独设置某一个坐标轴。这时就需要 Axis 类了。

CoordinateSystem 类中有个公共成员变量:
std::vector< Axis >  axes

这个 vector 中包含 12 个 Axis 对象,分别对应 12 个坐标轴。这样就可以直接访问某一个坐标轴对其进行精确的控制了。

Axis 类包括的成员函数很多,这里只列举几个。

void  setTicLength ()
void  setTicOrientation ()
void  setLabelFont ()
void  setLabelString ()
void  setLabelColor ()
void  setScale ()
void  setNumberFont ()
void  setAutoScale ()
void  setMajors ()
void  setMinors ()


颜色条(ColorLegend) 在其他一些代码中通常称为 ColorBar。

主要的成员函数包括:
void  setRelPosition ()
void  setOrientation ()
void  setLimits ()
void  setMajors ()
void  setMinors ()
void  drawScale ()
void  drawNumbers ()
void  setAutoScale ()
void  setScale ()
void  setScale ()
void  setTitleString ()
void  setTitleFont ()

Label 类主要的成员函数包括(这个类如何使用还没想明白):

 
void  setFont ()
void  adjust ()
void  setPosition ()
void  setRelPosition ()
virtual void  setColor ()
virtual void  setColor ()
void  setString ()


下面是一个简单的例子:

  #include
  #include
  #include
  #include
 

  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()
  {
    setTitle("A Simple SurfacePlot Demonstration");
   
    Rosenbrock rosenbrock(*this);

    rosenbrock.setMesh(41,31);
    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);

    for (unsigned i=0; i!=coordinates()->axes.size(); ++i)
    {
      coordinates()->axes[i].setMajors(7);
      coordinates()->axes[i].setMinors(4);
    }


    coordinates()->axes[X1].setLabelString("x-axis");
    coordinates()->axes[Y1].setLabelString("y-axis");
    //coordinates()->axes[Z1].setLabelString(QChar(0x38f)); // Omega - see


    setCoordinateStyle(BOX);

    updateData();
    updateGL();
  }

  int main(int argc, char **argv)
  {
      QApplication a(argc, argv);
      Plot plot;
#if QT_VERSION < 0x040000
      a.setMainWidget(&plot);
#endif
      plot.resize(800,600);
      plot.show();
      return a.exec();
  }
阅读(2334) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~