简述
PPI扫描,即按一个仰角进行水平面上的扫描,得到二维图像的方式。它的特点是来自不同距离的回波是离地面不同的高度,扫描得到的数据在空间类似一个倒立圆锥的曲面表面。
Qt可以用OpenGL绘制复杂的图像,但为了简单和移植性,这里介绍的是用Qt自己的绘图工具QPainter绘制PPI二维图像。
实现描述
本例中使用两个类进行绘制,一个是绘制颜色标尺的paintTable类,另一个是绘制PPI扫描图主体的paintWindow类。
paintWindow类的思路就是重写paintEvent()、resizeEvent()、timerEvent()函数。每隔一段时间检查原始数据是否更新;如果数据刷新,通过repaint()函数调用paintEvent()进行重绘;当窗体大小变化时,调用resizeEvent()函数进行重绘;绘制图像的思路是绘制一个个去心的扇型片元,根据原始数据查阅调色盘,把片元绘制成不同的颜色。本例中一个方向上由300个片元组成。
paintTable类即通过几个颜色控制点,绘制一个渐变的色条。通过插值可以算得强度范围内的任意强度的RGB值。
下图即使用同一组模拟数据的扫描显示图:
代码之路
paintTable类
这里ppi数据强度的范围是-50到50,使用5个控制点。
//paintTable.h
#include <QWidget>
#include <QPainter>
#include <QFont>
class paintTable : public QWidget
{
Q_OBJECT
public:
explicit paintTable(QWidget *parent = 0);
protected:
void paintEvent(QPaintEvent *);
};
//paintTable.cpp
paintTable::paintTable(QWidget *parent) : QWidget(parent)
{
}
void paintTable::paintEvent(QPaintEvent *)
{
QPainter painter(this);
int h = height() - 200 -20;
int w = 20;
QRectF rect(w, h, 10, 200);
QLinearGradient linearGradient(w, h, w + 10, h + 200);
linearGradient.setColorAt(0, QColor(154, 0, 0));
linearGradient.setColorAt(0.25, QColor(255, 180, 0));
linearGradient.setColorAt(0.5, QColor(250, 255, 255));
linearGradient.setColorAt(0.75, QColor(0, 199, 255));
linearGradient.setColorAt(1, QColor(0, 0, 155));
painter.setBrush(linearGradient);
painter.drawRect(rect);
int det = 200/4;
painter.drawT