优化波列数据绘制方法

This commit is contained in:
jiayulong 2025-12-18 17:49:23 +08:00
parent 1485db1730
commit c7eb736a6e
3 changed files with 273 additions and 4 deletions

View File

@ -184,8 +184,10 @@ public:
// double x1 = mPlot->xAxis->coordToPixel(dbCenterX);
// double y1 = mPlot->yAxis->coordToPixel(dbCenterY);
// mPixmap->topLeft->setCoords(mPlot->xAxis->pixelToCoord(x1), mPlot->yAxis->pixelToCoord(y1));
mPixmap->topLeft->setCoords(right_Hight, lY2);
mPixmap->bottomRight->setCoords(left_Low, lY1);
// mPixmap->topLeft->setCoords(right_Hight, lY2);
// mPixmap->bottomRight->setCoords(left_Low, lY1);
mPixmap->topLeft->setCoords(right_Hight, lY1);
mPixmap->bottomRight->setCoords(left_Low, lY2);
drawResult(left_Low, right_Hight, lY1, lY2);
// mPixmap->topLeft->setCoords(right_Hight, lY1);

View File

@ -263,6 +263,7 @@ void FormDraw::s_addWave(QString strUuid, QString strSlfName, QString strWellNam
curv->show();
initWave(curv, strSlfName, strWaveName);
//initWave_3D(curv, strSlfName, strWaveName);
connect(curv, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(s_mouseWheel(QWheelEvent*)));
//
@ -1014,7 +1015,7 @@ double GetData(int RepCode,char *buffer)
void FormDraw::initWave(QMyCustomPlot *widget, QString strSlfName, QString strWaveName)
{
CLogIO *logio=new CLogIO();
logio->Open(strSlfName.toStdString().c_str(),CSlfIO::modeRead);
logio->Open(strSlfName.toStdString().c_str(), CSlfIO::modeRead);
//
int index=logio->OpenWave(strWaveName.toStdString().c_str());
if(index<0) {
@ -1118,6 +1119,270 @@ void FormDraw::initWave(QMyCustomPlot *widget, QString strSlfName, QString strWa
}
}
// 添加色标:
QCPColorScale *colorScale = new QCPColorScale(widget);
colorMap->setColorScale(colorScale); // 将颜色图与色标关联
// 将颜色贴图的“颜色渐变”设置为其中一个预设
//colorMap->setGradient(QCPColorGradient::gpPolar);//gpJet);
// 我们还可以创建一个QCPColorGradient实例并向其中添加自己的颜色
// 渐变请参阅QCPColorGradient的文档以获取可能的效果.
int nIndex=11;
QVector<MyColorItem> colorList;
bool inpolation = true;
int iColorNum = getSystemColor(nIndex, colorList, inpolation);
//
QCPColorGradient gradient;
for(int i=0; i<iColorNum; i++)
{
double dbTmpIndex=(double)(i+1)/iColorNum;
gradient.setColorStopAt(dbTmpIndex, colorList[i].color); // x% 位置的颜色
}
colorMap->setGradient(gradient);
// 重新缩放数据维度(颜色),以使所有数据点都位于颜色渐变显示的范围内:
colorMap->rescaleDataRange();
//----调色板--------
// widget->plotLayout()->addElement(0, 1, colorScale); // 将其添加到主轴矩形的右侧
// colorScale->setType(QCPAxis::atRight); // 刻度应为垂直条,刻度线/坐标轴标签右侧(实际上,右侧已经是默认值)
// colorScale->axis()->setLabel("Magnetic Field Strength");
// //确保轴rect和色标同步其底边距和顶边距以便它们对齐:
// QCPMarginGroup *marginGroup = new QCPMarginGroup(widget);
// widget->axisRect()->setMarginGroup(QCP::msBottom|QCP::msTop, marginGroup);
// colorScale->setMarginGroup(QCP::msBottom|QCP::msTop, marginGroup);
// 重新缩放键x和值y以便可以看到整个颜色图
//widget->rescaleAxes();
QString strAliasName = "";
QString strUnit = "";
QColor newlineColor=QColor(0,0,0);
double width=2;
QString strScaleType = "";
//道-对象
m_formTrack->Add(strSlfName, m_strWellName, m_strTrackName, strWaveName, strAliasName, strUnit, newlineColor, width, _nSamples, 0, strScaleType, "waveObject");
}
void FormDraw::initWave_3D(QMyCustomPlot *widget, QString strSlfName, QString strWaveName)
{
CLogIO *logio=new CLogIO();
logio->Open(strSlfName.toStdString().c_str(), CSlfIO::modeRead);
//
int index=logio->OpenWave(strWaveName.toStdString().c_str());
if(index<0) {
delete logio;
return;
}
Slf_WAVE _wave;
logio->GetWaveInfo(index, &_wave);
float _SDep,_EDep,_Rlev;
_SDep = _wave.StartDepth;
_EDep = _wave.EndDepth;
// _SDep = 0.0 - g_iY2;
// _EDep = 0.0 - g_iY1;
_Rlev = _wave.DepLevel;
int m_Record=(float)(fabs((_EDep-_SDep)/_Rlev+0.5));
int _nSamples = _wave.TimeSamples;
char *value=new char[(_nSamples+1)*m_Record*_wave.CodeLen+1];
logio->ReadWave(index,_SDep,m_Record,(void *)value);
logio->CloseWave(index);
delete logio;
bool bFistValue=false;
float vmax = -9999;//(float)_nSamples;
float vmin = -9999;
//
double** wavedata;
wavedata = new double*[_nSamples];
for(int kk = 0;kk<_nSamples;kk++){
wavedata[kk] = new double[m_Record];
}
for (int i=0; i<m_Record; i++)
{
for(int kk = 0;kk<_nSamples;kk++)
{
double val = GetData(_wave.RepCode,(char *)&value[(kk)*_wave.CodeLen+i*_nSamples*_wave.CodeLen]);
wavedata[kk][i] = val;
if(val==-9999)
{
continue;
}
if(bFistValue==false)
{
//最大值,最小值默认采用第一个有效值
bFistValue=true;
vmax = vmin = val;
}
//
if(vmax<val)vmax=val;
if(vmin>val)vmin=val;
}
}
delete[] value;
// vmax = (float)_nSamples;
// vmin = 0;
// g_iY1 = 0.0 -_EDep;
// g_iY2 = 0.0 -_SDep;
//------------------------
widget->m_iX1 = vmin;
widget->m_iX2 = vmax;
widget->m_iY1 = g_iY1;
widget->m_iY2 = g_iY2;
//
widget->xAxis->setRange(vmin, vmax);
widget->yAxis->setRange(g_iY1, g_iY2);
widget->axisRect()->setupFullAxesBox();
//
widget->xAxis->ticker()->setTickCount(10);//x个主刻度
widget->yAxis->ticker()->setTickCount(60);//y个主刻度
//对调XY轴在最前面设置
QCPAxis *yAxis = widget->yAxis;
QCPAxis *xAxis = widget->xAxis;
widget->xAxis = yAxis;
widget->yAxis = xAxis;
//
// 横向点数,全部绘制
int nPoint = _nSamples;
nPoint = nPoint / 2;
// 初始化
float *flSin,*flCos;
QPointF *pt;
flSin = new float[_nSamples+1];
flCos = new float[_nSamples+1];
pt = new QPointF[_nSamples+1];
//
float m_flWjMaxFactor=0.6; //外径最大位置占道的比例
// 最大外径宽度
float r = m_flWjMaxFactor*(_nSamples-0)/2;
//
float centerX = (_nSamples+0)/2.0;
float angle = 3.0*3.1415926/2.0;
float xspeed = (3.1415926/(nPoint-1)); // 半圆
float x=-r;
float m_flVFactor = 0.5;
float centerY = 0;
float y;
for (int j=0;j<nPoint; j++)
{
// 第一种方法:按角度平均分配,图像中间部分有些不真实
//x = sin(angle) * r;
//y = cos(angle) * r*m_flVFactor;
//方法2 :按横向等间距分配,图像边缘部分不太好
// flCos[j] = cos(angle);
// flSin[j] = sin(angle);
y = cos(angle)*r*m_flVFactor;
pt[j].setX(centerX + x);
pt[j].setY(centerY + y);
angle += xspeed;
x += (float)(r*2./(nPoint-1.));
}
//---------------------------------
//转换新值
double** wavedataNew;
wavedataNew = new double*[_nSamples];
for(int kk = 0;kk<_nSamples;kk++){
wavedataNew[kk] = new double[m_Record];
}
//初始化
for (int i=0; i<m_Record; i++)
{
for(int kk = 0;kk<_nSamples;kk++)
{
wavedataNew[kk][i] = vmin;
}
}
for (int i = 0; i < m_Record ; i++)
{
int d=1;
for (int j=0; j<nPoint-d; j+=d)
{
int kkPos = pt[j].x();
int iPos = i+pt[j].y();
if(kkPos>=_nSamples || kkPos<0 || iPos>=m_Record || iPos<0)
{
}
else
{
wavedataNew[kkPos][iPos] = wavedata[j][i];
}
// //----
// kkPos = pt[j].x()+0.5;
// iPos = i+pt[j].y();
// if(kkPos>=_nSamples || kkPos<0 || iPos>=m_Record || iPos<0)
// {
// }
// else
// {
// wavedataNew[kkPos][iPos] = wavedata[j][i];
// }
// //----
// kkPos = pt[j].x()-0.5;
// iPos = i+pt[j].y();
// if(kkPos>=_nSamples || kkPos<0 || iPos>=m_Record || iPos<0)
// {
// }
// else
// {
// wavedataNew[kkPos][iPos] = wavedata[j][i];
// }
// //----
// kkPos = pt[j].x();
// iPos = i+pt[j].y()+0.5;
// if(kkPos>=_nSamples || kkPos<0 || iPos>=m_Record || iPos<0)
// {
// }
// else
// {
// wavedataNew[kkPos][iPos] = wavedata[j][i];
// }
// //----
// kkPos = pt[j].x();
// iPos = i+pt[j].y()-0.5;
// if(kkPos>=_nSamples || kkPos<0 || iPos>=m_Record || iPos<0)
// {
// }
// else
// {
// wavedataNew[kkPos][iPos] = wavedata[j][i];
// }
}
}
//-------------------
// set up the QCPColorMap:
QCPColorMap *colorMap = new QCPColorMap(widget->xAxis, widget->yAxis);
int nx = m_Record;
int ny = _nSamples;
colorMap->data()->setSize(nx, ny); // 我们希望彩色地图有nx*ny的数据点
//colorMap->data()->setRange(QCPRange(g_iY1, g_iY2), QCPRange(vmin, vmax)); // 并在键x和值y维上跨越坐标范围-4..4
colorMap->data()->setRange(QCPRange(0-_EDep, 0-_SDep), QCPRange(vmin, vmax));
// 现在我们通过访问颜色贴图的QCPColorMapData实例来分配一些数据
//double x, y, z;
for (int xIndex=0; xIndex<nx; ++xIndex)
{
for (int yIndex=0; yIndex<ny; ++yIndex)
{
if(wavedataNew[yIndex][xIndex]==-9999)
{
colorMap->data()->setCell(nx-xIndex-1, yIndex, vmin);
continue;
}
//colorMap->data()->setCell(xIndex, yIndex, wavedata[yIndex][xIndex]);
colorMap->data()->setCell(nx-xIndex-1, yIndex, wavedataNew[yIndex][xIndex]);
}
}
// 添加色标:
QCPColorScale *colorScale = new QCPColorScale(widget);
@ -1160,9 +1425,10 @@ void FormDraw::initWave(QMyCustomPlot *widget, QString strSlfName, QString strWa
QString strScaleType = "";
//道-对象
m_formTrack->Add(strSlfName, m_strWellName, m_strTrackName, strWaveName, strAliasName, strUnit, newlineColor, width, _nSamples, 0, strScaleType, "waveObject");
}
void FormDraw::initWave2(QMyCustomPlot *widget, QString strSlfName, QString strWaveName)
{
CLogIO *logio=new CLogIO();

View File

@ -89,6 +89,7 @@ public:
//波列
void initWave(QMyCustomPlot *widget, QString strSlfName, QString strWaveName);
void initWave_3D(QMyCustomPlot *widget, QString strSlfName, QString strWaveName);
void initWave2(QMyCustomPlot *widget, QString strSlfName, QString strWaveName);
//表格曲线