在雷达模拟器中,显示界面有好几种,论文里没有详细描述怎么实现,因此需要自己思考,以下为我在设计时的笔记,供需要的人使用:
2. 显示方式
2.1 PPI 显
采用极坐标系的显示形式,用雷达与检测目标的距离和方位绘点。
2.1.1 正常 PPI 显示
雷达位于极坐标系的原点。
使用 Qt QCharts 正常显示极坐标点即可。
实现效果如下:
2.1.2 偏心 P 显
将雷达显示界面的扫描中心移动至显示界面中任意的非几何中心位置,然后将显示信息扩大两倍 (如何扩大两倍?)。
视图放大一倍 ?
使用 QGraphicsView 里面的缩放,确定视口锚,然后进行缩放 先放大,再移动位置。Qt QCharts 本身提供极坐标系的放大缩小旋转都是基于中心点的,无法满足需求。
实现效果如下:
2.1.3 空心 P 显
将<u>回波的显示距离</u>向外围方向延伸50公里,显示界面的量程减少50公里
将雷达所在处的点扩大至 50 单位的圆,此时如何画目标点?
极坐标的值变换一下?
若延迟距离为 ,该方法可以实现,但较为复杂。 ,正常 PPI 显示下任一点
点坐标为
,则空心 P 显模式下
点坐标为
。
使用 scroll() ,向外滚动 50 个单位即可实现该效果,而且自动调整坐标系坐标。
空心P显代码如下:
/* is_show 为 true 时,进行空心P显,
is_show 为 false 时,空心P显还原
*/
const qreal multiple = 50/36.0; // 实测表明,scroll(0, 50) 只移动了36,因此需要乘以倍数,具体什么原因不知。
void PolarView::hollow_P_show(bool is_show)
{
if (is_show) {
this->chart()->scroll(0, -hollow_p_size_*multiple);
} else {
this->chart()->scroll(0, hollow_p_size_*multiple);
}
/* 以下为没有使用 scroll 时的实现方式 */
// QList<QAbstractSeries *>list = this->chart()->series();
// foreach(QAbstractSeries *series, list) {
// // 只对散点图进行操作
// if (series->type() == QAbstractSeries::SeriesTypeScatter) {
// QScatterSeries *scatter_series = qobject_cast<QScatterSeries *>(series);
// // 空心P显,增加 hollow_p_size_ 大小的空心圆
// QVector<QPointF> v;
// qreal size = this->hollow_p_size_ * (is_show ? 1 : -1);
// for(QPointF &p : scatter_series->pointsVector()) {
// v.append(QPointF(p.x(), p.y() + size));
// }
// scatter_series->replace(v);
// // 调整坐标轴的显示范围
// PolarChart *chart = static_cast<PolarChart *>(this->chart());
// chart->adjustAxesRange(size);
// } else {
// qDebug() << "this is not scatterseries type\n";
// }
// }
}
效果如下:
2.1.4 延迟 P 显
在 PPI 显示方式下设置<u>延迟距离</u>,回波显示界面的扫描中心将被设置为延迟距离。
- 小于延迟距离的回波信息将不再显示
- 大于延迟距离的回波信息将被显示
- 回波显示范围为:延迟距离 ~ 显示量程
使用 Qt QCharts 里的 scroll() ,向内滚动''延迟距离''个单位,然后重新绘制轴向坐标,QCharts 自动调整坐标系坐标。
/* 延迟P显 */
void PolarView::delay_P_show(bool is_show)
{
// 实测表面 scroll 进行缩放时,需要乘以 倍数 ,具体原因不知
if (is_show) {
this->chart()->scroll(0, delay_p_size_*multiple);
} else {
this->chart()->scroll(0, -delay_p_size_*multiple);
}
}
实现效果如下:
2.2 B 显
- 水平方向:回波的方位信息
- 垂直方向:回波的距离信息
- 亮度: 回波的强度
利用 Qt QCharts 里极坐标与笛卡尔坐标系互换。
采用 QChart 里 polarchart 例程里极坐标系与笛卡尔坐标系互换。
其实就是将 QPolarChart 里的各种数据转移到一个新的 QChart 里面,然后 ChartView 采用新的 chart 。
void PolarView::switchChartType()
{
QChart *newChart;
QChart *oldChart = chart();
if (oldChart->chartType() == QChart::ChartTypeCartesian)
newChart = new QPolarChart();
else
newChart = new QChart();
// Move series and axes from old chart to new one
const QList<QAbstractSeries *> seriesList = oldChart->series();
const QList<QAbstractAxis *> axisList = oldChart->axes();
QList<QPair<qreal, qreal> > axisRanges;
for (QAbstractAxis *axis : axisList) {
QValueAxis *valueAxis = static_cast<QValueAxis *>(axis);
axisRanges.append(QPair<qreal, qreal>(valueAxis->min(), valueAxis->max()));
}
for (QAbstractSeries *series : seriesList)
oldChart->removeSeries(series);
for (QAbstractAxis *axis : axisList) {
oldChart->removeAxis(axis);
newChart->addAxis(axis, axis->alignment());
}
for (QAbstractSeries *series : seriesList) {
newChart->addSeries(series);
for (QAbstractAxis *axis : axisList)
series->attachAxis(axis);
}
int count = 0;
for (QAbstractAxis *axis : axisList) {
axis->setRange(axisRanges[count].first, axisRanges[count].second);
count++;
}
newChart->setBackgroundBrush(oldChart->backgroundBrush());
newChart->setTitle(oldChart->title());
setChart(newChart);
delete oldChart;
}
实现效果如下:
2.3 A 显
- 水平方向:回波的距离信息
- 垂直方向:回波的强度信息
随着雷达天线在360°方位范围内扫描,信号的强度信息会同步发生刷新,实时显示当前扫描方位上的回波信息,刷新频率与雷达的天线的扫描频率相同。