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

效果图:
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 }

猜你喜欢

转载自www.cnblogs.com/ybqjymy/p/13395533.html