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

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

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<Qwt3D::Triple> 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<Qwt3D::Line3D *>(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 之 三维动态曲线的实现相关推荐

  1. matlab 三维动态,matlab三维动态绘图

    matlab 动态绘图,MATLAB R2017a下载 64位免费版,matlab三维动态绘图,matlabtimer动态绘图 matlab绘制动态三维心形代码(蛋疼的情人节奉献)_计算机软件及应用_ ...

  2. python实时绘制动态曲线_pyqt中使用matplotlib绘制动态曲线

    一.项目背景: 看了matplotlib for python developers这本书,基本掌握了在pyqt中显示曲线的做法,于是自己写一个. 二.需求描述: 1)X轴显示时间点,显示长度为1分钟 ...

  3. python画曲线-python绘制动态曲线教程

    从txt种获取数据 并且通过动态曲线显示 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation ...

  4. [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载的原文地址 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静态曲线,那 ...

  5. MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载自:ZHY_ongu的博客:MFC绘制动态曲线,用双缓冲绘图技术防闪烁 先上效果图    随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线. 所谓动画,都是一帧一帧 ...

  6. MFC中绘制动态曲线

    在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等.在前面4讲中介绍了MFC经常用的TeeChart控件和Hight-Speed Chart Ctrl,这两个都是MFC绘 ...

  7. MATLAB 动态曲线 视频

    最近做视频的时候,需要加上疫情数据变化曲线,动态的曲线变化更能体现抗击疫情的艰辛过程,所以利用 MATLAB做了个动态曲线. 数据因为较短,所以是自己手动录入的. 因为准备加到视频中使用,所以动态曲线 ...

  8. (一)QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)QCustomPlot常见属性设置.多曲线绘制.动态曲线绘制.生成游标.矩形放大等功能实现 第二章: (二)QCustomPlot ...

  9. Qt学习:QtCharts绘制动态曲线,实时更新数据与坐标轴

    前言:很久之前写了这篇文章后一直未进行修改更新,最近重新整理了代码和扩展了使用方式.代码路径见github: https://github.com/LYH-ux/Qt_Projects.git ,下文 ...

最新文章

  1. 说说浏览器的沙箱机制
  2. python颜色识别原理_电脑控制手机 Python实现颜色识别功能
  3. CSS清浮动处理(Clear与BFC)
  4. R开发(part6)--pryr包
  5. 【JavaWeb】数据库基础复习
  6. Logtail从入门到精通(四):正则表达式Java日志采集实战
  7. python wechatpay微信支付回调_【微信支付】JSAPI支付开发者文档
  8. Python3.7 Scrapy安装(Windows)
  9. jenkins+phantomjs环境搭建及使用
  10. 基于高德地图实现热力地图和标记点显示文字
  11. 2019腾讯算法广告大赛冠军方案复现遇到的问题 python
  12. 51单片机码表c语言编程,用AT89S51单片机制作的多功能自行车速度里程表
  13. godaddy安装nginx证书
  14. 掌阅科技让数字化阅读更便捷
  15. 炸弹模拟器 1.0版 彩色
  16. 从数据架构看生鲜电商的数据价值
  17. 临时链接转为永久链接的三种方法
  18. STM32之HAL库详解 及 手动移植
  19. linux前一个的输出作为后一个参数,将Linux命令的结果作为下一个命令的参数
  20. Python初体验:三句话写个刷微博、博客、空间等的小爬虫

热门文章

  1. 机器学习-集成学习(ensemble learning)
  2. 刻意练习的3种模式,很多“天才”不过是找对了方法
  3. 给研华, 控创, 西门子, 凌华, 研祥, 艾迅, 盛博, 诺达佳, 阿普奇 ,桦汉工控机外扩一路,二路CAN,四路等CAN通讯
  4. 【ASP.NET Web】项目实践—网上宠物店11:制作“搜索”页面
  5. 小程序 cpcl 打印图片
  6. ibaanalyzer使用教程_ibaAnalyzer软件在铝箔轧机控制系统中的分析和应用
  7. IOS、Android设计规范/商用字体总结——UI设计入门,你想要的都在这!
  8. ISM解释结构模型——研究系统结构关系情况
  9. Jetson TX2核心板系统烧录、烧写
  10. 油缸密封件所需要注意的事项有哪些