我用 Qt Charts 绘制了雷达显示的界面,如下图所示:
在此记录一下我的绘制过程。
- 数据方法:我利用 python 生成了雷达回波信号 (方位,距离,强度) 的 100 组随机数,并将其存入 json 文件供 Qt 程序使用。
- 绘图颜色方面:颜色这方面我模仿的别人绘制好的图,采用 Windows 的画图工具来获取想要颜色对应的 (r, g, b) 数据,参考 利用windows 系统的画图工具获取图片上某一点的颜色RGB值。
- 极坐标系绘制:这方面有点头疼,需要一边读 Qt 帮助文档,一边调试看效果才能画出想要的效果,没有捷径可以走。
以下为绘图代码:
const QColor radar_color = QColor(45, 136, 51);
bool getSimulationData(QScatterSeries *series);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const qreal angularMin = 0;
const qreal angularMax = 360;
const qreal radialMin = 0;
const qreal radialMax = 300;
// 极坐标系实体
QPolarChart *chart = new QPolarChart();
chart->setBackgroundBrush(QBrush(Qt::black));
QScatterSeries *series = new QScatterSeries();
series->setName("scatter");
series->setBrush(QBrush(radar_color));
series->setPen(QPen(radar_color));
series->setMarkerSize(5);
// 从 json 文件中获取数据
getSimulationData(series);
chart->addSeries(series);
//设置刻度线
QValueAxis *angularAxis = new QValueAxis();
// 设置极坐标系边界相关
angularAxis->setLinePen(QPen(radar_color));
angularAxis->setLabelsColor(radar_color);
angularAxis->setLabelFormat("%d");
angularAxis->setRange(angularMin, angularMax);
// 设置 gridLine
angularAxis->setGridLinePen(QPen(QBrush(radar_color), 1, Qt::DotLine));
// 设置极坐标系角度显示范围
angularAxis->setTickCount(13);
angularAxis->setMinorTickCount(5);
angularAxis->setMinorGridLineVisible(false);
chart->addAxis(angularAxis, QPolarChart::PolarOrientationAngular);
series->attachAxis(angularAxis); // 该语句将会使坐标轴上的数据自适应变换,必须在 addAxis 后面。
QValueAxis *radialAxis = new QValueAxis();
// 设置 gridLine
radialAxis->setGridLinePen(QPen(QBrush(radar_color), 1, Qt::DotLine));
radialAxis->setLineVisible(false);
// 设置返回及显示值
radialAxis->setRange(radialMin, radialMax);
radialAxis->setTickCount(7);
radialAxis->setLabelFormat("%d");
chart->addAxis(radialAxis, QPolarChart::PolarOrientationRadial);
series->attachAxis(radialAxis);
// 设置视图
PolarView *view = new PolarView();
view->setChart(chart);
view->setRenderHint(QPainter::Antialiasing);
QMainWindow window;
window.setCentralWidget(view);
window.resize(1400, 1000);
window.show();
return a.exec();
}