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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM