• Qt qwtplot3d根据时间采集多条曲线


    效果图:

    核心代码:

    qwt3d_rnrichment_std.h下:

     1 class QWT3D_EXPORT Line3D: public VertexEnrichment
     2 
     3 {
     4 public:
     5 Line3D();
     6 Line3D(double thick,bool smooth);
     7 Qwt3D::Enrichment * clone() const{ return new Line3D(*this);}
     8 void configure(double thick, bool smooth); //粗 , 光滑
     9 void drawBegin(int type);
    10 void drawBegin();
    11 void drawEnd();
    12 virtual void draw(Qwt3D::Triple const&);
    13 virtual void draw();
    14 virtual void drawLines();//一条线的长度
    15 virtual void add(Qwt3D::Triple const & t);
    16 // virtual void setLineColor(RGBA color);
    17 virtual void clear()
    18 {
    19 lineData.clear();
    20 myColorMap.clear();
    21 }
    22 void removeData()
    23 {
    24 lineData.clear();
    25 }
    26 virtual void setLineColor(int startIndex,RGBA color);
    27 virtual RGBA getColor(int pointIndex);
    28 virtual RGBA getColor(double dIntensity);
    29 virtual RGBA getRandomColor();
    30 virtual int getDataSize(){return lineData.size();}
    31 virtual void setLineSize(int nLineSize){m_nLineSize = nLineSize;}//数据的长度
    32 public:
    33 bool bShowData;
    34 virtual void setDataEnable(bool b){bShowData = b;} //不显示数据
    35 private:
    36 bool smooth_;
    37 double lineThick;
    38 GLboolean oldstate_;
    39 int m_nLineSize;
    40 std::vector<</SPAN>Qwt3D::Triple> lineData;
    41 // RGBA rgba;
    42 std::map<</SPAN>int,RGBA> myColorMap;
    43 };

    qwt3d_enrichment_std.cpp下:

      1 Qwt3D::Line3D::Line3D()
      2 
      3 {
      4 m_nLineSize = 0;
      5 bShowData = true;
      6 }
      7 Qwt3D::Line3D::Line3D(double thick,bool smooth)
      8 {
      9 bShowData = true;
     10 lineThick = thick;
     11 smooth_ = smooth;
     12 // rgba.a = 1;
     13 // rgba.b = 0.3;
     14 // rgba.r = 0.6;
     15 // rgba.g = 1;
     16 }
     17 void Qwt3D::Line3D::configure(double thick, bool smooth)
     18 {
     19 lineThick = thick;
     20 smooth_ = smooth;
     21 }
     22 void Qwt3D::Line3D::drawBegin()
     23 {
     24 setDeviceLineWidth(lineThick);
     25 oldstate_ = glIsEnabled(GL_LINE_SMOOTH);
     26 if (smooth_)
     27 glEnable(GL_LINE_SMOOTH);
     28 else
     29 glDisable(GL_LINE_SMOOTH);
     30 //glPointSize(10);
     31 glBegin( GL_LINE_STRIP);
     32 }
     33 //type: GL_LINE_STRIP GL_LINES GL_POINTS GL_LINE_LOOP
     34 void Qwt3D::Line3D::drawBegin(int type)
     35 {
     36 setDeviceLineWidth(lineThick);
     37 oldstate_ = glIsEnabled(GL_LINE_SMOOTH);
     38 if (smooth_)
     39 glEnable(GL_LINE_SMOOTH);
     40 else
     41 glDisable(GL_LINE_SMOOTH);
     42 //glPointSize(10);
     43 glBegin( type);
     44 }
     45 void Qwt3D::Line3D::drawEnd()
     46 {
     47 glEnd();
     48 if (oldstate_)
     49 glEnable(GL_LINE_SMOOTH);
     50 else
     51 glDisable(GL_LINE_SMOOTH);
     52 }
     53 void Qwt3D::Line3D::draw(Qwt3D::Triple const& pos)
     54 {
     55 glVertex3d(pos.x,pos.y,pos.z);
     56 }
     57 void Qwt3D::Line3D::draw()
     58 {
     59 for (int i = 0; i <</SPAN> lineData.size(); i ++)
     60 {
     61 RGBA rgba = getColor(i);
     62 glColor4d(rgba.r,rgba.g,rgba.b,rgba.a);
     63 draw(lineData[i]);
     64 }
     65 }
     66 void Qwt3D::Line3D::drawLines()//一条线的长度
     67 {
     68 if(!bShowData)return;
     69 drawEnd();//GL_LINES GL_POINTS GL_LINE_LOOP GL_LINE_STRIP
     70 drawBegin();
     71 long index = 0;//从哪里开始
     72 int nSize = lineData.size();
     73 while(index <</SPAN> nSize)
     74 {
     75 // Qwt3D::RGBA rgba(1,1,1,1);
     76 // RGBA rgba = getRandomColor();
     77 for(int i = 0 ;i <</SPAN> m_nLineSize; i++)
     78 {
     79 if(i == m_nLineSize-1)
     80 {
     81 drawEnd();
     82 drawBegin(GL_POINTS);//GL_POINTS
     83 }
     84 if(index <</SPAN> nSize){
     85 RGBA rgba = getColor(lineData[index].z);
     86 glColor4d(rgba.r,rgba.g,rgba.b,rgba.a);
     87 draw(lineData[index]);
     88 }
     89 index++;
     90 }
     91 drawEnd();
     92 drawBegin();
     93 }
     94 // qDebug() <<"drawLines end" ;
     95 }
     96 void Qwt3D::Line3D::add(Qwt3D::Triple const & t)
     97 {
     98 lineData.push_back(t);
     99 }
    100 void Qwt3D::Line3D::setLineColor(int startIndex,RGBA color)
    101 {
    102 myColorMap[startIndex] = color;
    103 }
    104 Qwt3D::RGBA Qwt3D::Line3D::getColor(int pointIndex)
    105 {
    106 Qwt3D::RGBA rgba(1,1,1,1);
    107 for (std::map<</SPAN>int,RGBA>::iterator it = myColorMap.begin(); it != myColorMap.end(); it ++)
    108 {
    109 if (it->first <</SPAN> pointIndex)
    110 {
    111 rgba = it->second;
    112 }
    113 }
    114 return rgba;
    115 }
    116 //by furui
    117 Qwt3D::RGBA Qwt3D::Line3D::getColor(double dIntensity)
    118 {
    119 double max = 65535 ;
    120 double r , g , b ;
    121 r = g = b = 0;
    122 double radio = dIntensity / max;
    123 double v = radio;
    124 double a0 = 1;
    125 double a1= 0.8;
    126 double a2 = 0.4;
    127 double a3 = 0.1;
    128 double a4 = 0.04;
    129 double a5 = 0.004;
    130 double a6 = 0;
    131 if(radio >= a1)//红-黄
    132 {
    133 r = 1 ;
    134 g = 1-( v - a1 ) * (1 / (a0 - a1)) ;//越来越大
    135 b = 0;
    136 }else if(radio >= a2)//黄-绿
    137 {
    138 r = ( v-a2 ) * ( 1 / (a1 - a2)) ;//越来越小
    139 g = 1;
    140 b = 0;
    141 }else if(radio >= a3)//绿-绿蓝
    142 {
    143 r = 0;
    144 g = 1 ;
    145 b = 1 -( v-a3 ) * (1 / (a2 - a3)) ;//越来越大
    146 }else if(radio >= a4)//绿蓝 - 蓝色
    147 {
    148 r = 0;
    149 g = ( v-a4 ) * (1 / (a3 - a4)) ;//越来越小
    150 b = 1;
    151 }else if(radio >= a5) //蓝 - 紫
    152 {
    153 r = 1 - (v - a5) * (1 / (a4 - a5));
    154 g = 0;
    155 b = 1;
    156 }else//紫红
    157 {
    158 r = 1;
    159 g = 0;
    160 b = (v - a6) * (1 / (a5 - a6));//越来越小
    161 b = b <</SPAN> 0.6 ? 0.6 : b ;
    162 }
    163 Qwt3D::RGBA rgba(r,g,b,1);
    164 return rgba;
    165 }
    166 //by furui
    167 Qwt3D::RGBA Qwt3D::Line3D::getRandomColor()
    168 {
    169 Qwt3D::RGBA rgba( (double)(qrand()%255) / 255.0f,
    170 (double)(qrand()%255) / 255.0f,
    171 (double)(qrand()%255) / 255.0f,1);
    172 return rgba;
    173 }
    174 //改变Y坐标轴的正负方向 qwt3d_movements.cpp 下
    175 void Plot3D::setScale( double xVal, double yVal, double zVal )
    176 {
    177 if (xScale_ == xVal && yScale_ == yVal && zScale_ == zVal)
    178 return;
    179 xScale_ = (xVal <<SPAN style="COLOR: #c0c0c0"> DBL_EPSILON ) ? DBL_EPSILON : xVal;
    180 // yScale_ = (yVal <</SPAN> DBL_EPSILON ) ? DBL_EPSILON : yVal;
    181 zScale_ = (zVal < DBL_EPSILON ) ? DBL_EPSILON : zVal;
    182 //20170206 by furui
    183 yScale_ = (yVal && yVal > DBL_EPSILON * -1) ? DBL_EPSILON:yVal;
    184 updateGL();
    185 emit scaleChanged(xVal, yVal, zVal);
    186 }
    187  
    188 //对数据进行赋值
    189 void QDockGraph3D::updateData()
    190 {
    191 if(m_fInterval_S <= 0)return;
    192 if(m_pMulti == NULL)return;
    193 double x=0 ;
    194 double y=0 ;
    195 double z=0 ;
    196 int nCount = m_pMulti->Size();
    197 if(nCount <= 0)return;
    198 m_pL3dVertexEnrichment->setLineSize(m_pMulti->First()->Size());
    199 for(int i = 0 ; i <</SPAN> nCount ; i++)//多少条线
    200 {
    201 x += (double)m_fInterval_S / 60.0000f;
    202 QSpectraSingle *pSingle = m_pMulti->GetAt(i);
    203 int nSize = pSingle->Size();
    204 if(nSize <= 0)return;
    205 for(int j = 0 ; j <</SPAN> nSize ; j++)
    206 {
    207 y = pSingle->GetDataX()[j];
    208 z = pSingle->GetDataY()[j];
    209 //QLine3D m_pL3dVertexEnrichment
    210 m_pL3dVertexEnrichment->add(Qwt3D::Triple(x,y,z));
    211 }
    212 //
    213 }
    214 m_pL3dSurfacePlot->fitX(x);
    215 m_pL3dSurfacePlot->tick();
    216 }
    217  
    218 //缩放比例的算法
    219 void QLinePlot3D::updateScale()
    220 {
    221 updateRosenbrock();
    222 double dDivX , dDivY , dDivZ , dMax;
    223 dMax = 0;
    224 dDivX = m_dMaxX - m_dMinX ;
    225 dDivY = m_dMaxY - m_dMinY ;
    226 dDivZ = m_dMaxZ - m_dMinZ ;
    227 if(dMax <<SPAN style="COLOR: #000000">dDivX)dMax = dDivX;
    228 if(dMax <<SPAN style="COLOR: #000000">dDivY)dMax = dDivY;
    229 if(dMax <<SPAN style="COLOR: #000000">dDivZ)dMax = dDivZ;
    230 if(dMax == dDivX && dDivY != 0 && dDivZ != 0)
    231 {
    232 //x最大
    233 m_dScaleX = 1;
    234 m_dScaleY = -dDivX / dDivY;
    235 m_dScaleZ = dDivX / dDivZ;
    236 }
    237 else if(dMax == dDivY && dDivX != 0 && dDivZ != 0)
    238 {
    239 m_dScaleX = dDivY / dDivX;
    240 m_dScaleY = -1;
    241 m_dScaleZ = dDivY / dDivZ;
    242 }
    243 else if(dMax == dDivZ&& dDivX != 0 && dDivY != 0)
    244 {
    245 m_dScaleX = dDivZ / dDivX;
    246 m_dScaleY = -dDivZ / dDivY;
    247 m_dScaleZ = 1;
    248 }
    249 else
    250 {
    251 }
    252 setScale(m_dScaleX , m_dScaleY, m_dScaleZ);
    253 setZoom(DEFAULT_ZOOM);
    254 UpdateLabel();
    255 // this->update();
    256 }
  • 相关阅读:
    对象,对象引用变量理解
    String 和 new String()的区别
    基本类型和对象类型的区别
    MySQL数据库设计总结
    CSS自定义字体的实现,前端实现字体压缩
    GitHub密钥生成
    ES3、ES5、ES6对象代理的写法差异
    Node.js+Navicat for MySQL实现的简单增删查改
    Vue项目部署到服务器
    Node.js+Navicat for MySQL实现的简单增删查改
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13395533.html
Copyright © 2020-2023  润新知