QWT3D 之 三维动态曲线的实现

     QWT3D 和QWT 都是QT的同门师弟,QWT3D主要信赖于QT中的QGLWidget类,可以直接使用opengl 命令,QWT3D的编译比较简单,在此不再赘述,下面展示一下QWT3D自带的例子运行效果:

    QWT3D 之 三维动态曲线的实现_第1张图片QWT3D 之 三维动态曲线的实现_第2张图片

      下面是经典的,牛逼的MESH例子,生成经典的帽子曲面等 

QWT3D 之 三维动态曲线的实现_第3张图片QWT3D 之 三维动态曲线的实现_第4张图片

QWT3D例子展示就到此为至吧,不然童鞋又说我喧宾夺主了。下面进入正题。

   2、  上述几个类中都是绘制曲面的例子,都使用到SurfacePlot类,SurfacePlot类应该可以定位于一个曲面绘制功能类,使用该类可以方便绘制曲面。

           为了实现曲线的绘制,

       1)实现派生类Line3D

//////////////////////////////////////////////////////////////

       //  Line3D.h

          class QWT3D_EXPORT Line3D: public VertexEnrichment
{
public:
Line3D();
Line3D(double thick,bool smooth);
Qwt3D::Enrichment * clone() const{ return new Line3D(*this);}


void configure(double thick, bool smooth);
void drawBegin();
void drawEnd();
virtual void draw(Qwt3D::Triple const&);


virtual void draw();


virtual void add(Qwt3D::Triple const & t);
virtual void setLineColor(RGBA color);




private:
bool smooth_;
double lineThick;
GLboolean oldstate_;


std::vector lineData;


RGBA rgba;


};

//////////////////////////////////////////////////////

//Line3D.cpp

Qwt3D::Line3D::Line3D()
{


rgba.a = 1;
rgba.b = 0.3;
rgba.r = 0.6;
rgba.g = 1;
}
Qwt3D::Line3D::Line3D(double thick,bool smooth)
{
lineThick = thick;
smooth_  = smooth;
rgba.a = 1;
rgba.b = 0.3;
rgba.r = 0.6;
rgba.g = 1;
}




void Qwt3D::Line3D::configure(double thick, bool smooth)
{
lineThick = thick;
smooth_  = smooth;

}


void Qwt3D::Line3D::drawBegin()
{
setDeviceLineWidth(lineThick);


oldstate_ = glIsEnabled(GL_LINE_SMOOTH);
if (smooth_)
glEnable(GL_LINE_SMOOTH);
else
glDisable(GL_LINE_SMOOTH);


//glPointSize(10);
glBegin( GL_LINE_STRIP);






}


void Qwt3D::Line3D::drawEnd()
{
glEnd();


if (oldstate_)
glEnable(GL_LINE_SMOOTH);
else
glDisable(GL_LINE_SMOOTH);
}


void Qwt3D::Line3D::draw(Qwt3D::Triple const& pos)
{


glColor4d(rgba.r,rgba.g,rgba.b,rgba.a);


glVertex3d(pos.x,pos.y,pos.z);




}


void Qwt3D::Line3D::draw()
{
for (int i = 0; i < lineData.size(); i ++)
{
draw(lineData[i]);
}
}


void Qwt3D::Line3D::add(Qwt3D::Triple const & t)
{
lineData.push_back(t);
}


void Qwt3D::Line3D::setLineColor(RGBA color)
{
this->rgba = color;
}

 类成员变量  lineData 保存三维线的 点集

2)为了让Line3D 被 SurfacePlot 调用,需对SurfacePlot::createEnrichment(Enrichment& p) 扩展,为了兼容QWT3D原来的功能,将

SurfacePlot::createEnrichment(Enrichment& p) 函数实现片断

 VertexEnrichment* ve = (VertexEnrichment*)&p; 
  if (actualData_p->datatype == Qwt3D::POLYGON)
  {
    for (unsigned i = 0; i != actualDataC_->normals.size(); ++i) 
   ve->draw(actualDataC_->nodes[i]);
  }
  else if (actualData_p->datatype == Qwt3D::GRID)
  {
    int step = resolution();
    for (int i = 0; i <= actualDataG_->columns() - step; i += step) 
      for (int j = 0; j <= actualDataG_->rows() - step; j += step) 
  ve->draw(Triple(actualDataG_->vertices[i][j][0],
             actualDataG_->vertices[i][j][1],
                                  actualDataG_->vertices[i][j][2]));
  }

修改为:

 VertexEnrichment* ve = (VertexEnrichment*)&p; 
  if (actualData_p->datatype == Qwt3D::POLYGON)
  {
    for (unsigned i = 0; i != actualDataC_->normals.size(); ++i) 
   ve->draw(actualDataC_->nodes[i]);
  }
  else if (actualData_p->datatype == Qwt3D::GRID)
  {
    int step = resolution();
    for (int i = 0; i <= actualDataG_->columns() - step; i += step) 
      for (int j = 0; j <= actualDataG_->rows() - step; j += step) 
  ve->draw(Triple(actualDataG_->vertices[i][j][0],
             actualDataG_->vertices[i][j][1],
                                  actualDataG_->vertices[i][j][2]));
  }
  else if (actualData_p->datatype == Qwt3D::LINE3D_STYLE)  /// 新增片断,这样在不暴露Line3D 三维曲线类的点集的情况下,绘制三维曲线
  {
 p.draw();  
  }


3、使用方法  动态绘制三维曲线

       1)定义  

      Qwt3D::Line3D _l3d;

       SurfacePlot plot;

      myLine1 = dynamic_cast(plot.addEnrichment(_l3d));

        myLine1->configure(3,true);
myLine1->setLineColor(Qwt3D::RGBA(1,0,0,1));

       这里对SurfacePlot ::addEnrichment返回的指针说一下,该指针的内容来源于对 _l3d的拷贝,内存由SurfacePlo对象管理,所以千万不要使用

      delete myLine1 ;类似这样的语句对返回的指针释放内存,这样操作除了程序崩溃还是崩溃。   

   2) 定时调用 myLine1->add  接口添加了 点数据,然后调用 

      updateData();
     updateGL();  触发   QT  QGLWidget的 pl()  函数重绘显示内容

    使用此方法,不但可以绘制动态的三维曲线,还可以绘制静态的典线;同时可以绘制一条或者多条三维曲线,下面是我的实验结果:



      从事码农10余载,借鉴过朋友的不少知识,可一直以工作为借口没有分享多少自己的心得,希望本文能帮助到朋友。 百度一下,有不少朋友困惑于如何使用QWT3D绘制三维曲线。 时间仓促,Line3D类写的不够完美,仅仅实现了功能而已,抛砖引玉吧。

     作者:lary, 中文名: 曹强,毕业于南京师范大学 数学与计算机学院   QQ: 289098145,有需要代码或者想交流的朋友可以QQ ME

     

你可能感兴趣的:(QWT3D,三维曲线绘制,编程语言,QWT3D)