雷达模拟对于一些做军用仿真的同学有一些作用,通过雷达模拟器展示雷达的扫描功能和目标检测功能。当然,雷达模拟器还有更改高级的功能,比如探测频率,目标轨迹检测等,对于这些较为专业的功能,目前作者还达不到那个水平,只能做一些雷达模拟器简单扫描功能。下面直接看效果图。
雷达模拟器的背景设计,主要是使用渐变色填充,通过使用Qt的QRadialGradient类:
QRadialGradient radialGradient(QPoint(0, 0), m_radius, QPoint(0, 0));
radialGradient.setColorAt(0, QColor("#1B47EA"));
radialGradient.setColorAt(1, QColor("#2DE3E9"));
painter.setBrush(radialGradient);
painter.drawEllipse(m_radarAreaRect);
下图是使用渐变色填充效果
渐变色填充完了后,再给背景加一些同心圆,看下面代码和效果图
painter.setBrush(Qt::NoBrush);
painter.setPen(QPen(QColor("#29EE47"), 0));
painter.setCompositionMode(QPainter::CompositionMode_Multiply);
for (int i = 0; i < m_radius; i = i + 10)
{
painter.drawEllipse(QPoint(0, 0), i, i);
}
painter.setPen(QPen(QColor("#2252E1"), 0));
painter.setFont(m_scaleFont);
qreal radius = m_radius - 10;
int value = 15;
for(int i = 0; i < 24; i++)
{
painter.rotate(360 / 24);
painter.drawText(QPoint(0, -radius - 4), value == 360 ? "0" : QString::number(value));
value += 15;
}
for(int i = 0; i < 120; i++)
{
painter.rotate(3);
if(i % 5 == 0)
painter.drawLine(QPoint(0, radius - 5), QPoint(0, radius));
else
painter.drawLine(QPoint(0, radius - 2), QPoint(0, radius));
}
这里的背景颜色也好,刻度颜色也好,读者们都可以根据自己的喜好更换颜色。
扫描区域有很多中方法制作,可以通过QPainter::drawPie函数画扇形,然后使用定时器更新扇形的角度。也可以保持扇形不变,使用定时器旋转坐标。作者这里采用后者方法。看下面代码和效果图:
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.rotate(m_rotateAngle);
QColor c0("#47D72D"); c0.setAlpha(200);
QColor c2("#47D72D"); c2.setAlpha(0);
painter.setPen(QPen(c0, 0));
painter.drawLine(QPoint(0, 0), QPoint(m_radius - 10, 0));
QConicalGradient scanAreaGradient(QPoint(0, 0), 0);
scanAreaGradient.setColorAt(0.0, c0);
scanAreaGradient.setColorAt(1. / 360, c0);
scanAreaGradient.setColorAt(40. / 360, c2);
painter.setPen(Qt::NoPen);
painter.setBrush(scanAreaGradient);
painter.drawPie(m_radarAreaRect, 0, 40 * 16);
模拟检测点可以直接使用QPainter::drawPoint函数,但是这样就描绘出来的点,显得有点单一,可以画一些同心圆代替检测目标点。
painter.drawArc(QRect(QPoint(point.pos.x() - r, point.pos.y() - r),
QSize(r * 2, r * 2)), (arc + 90 * 0) * 16, 70 * 16);
painter.drawArc(QRect(QPoint(point.pos.x() - r, point.pos.y() - r),
QSize(r * 2, r * 2)), (arc + 90 * 1) * 16, 70 * 16);
painter.drawArc(QRect(QPoint(point.pos.x() - r, point.pos.y() - r),
QSize(r * 2, r * 2)), (arc + 90 * 2) * 16, 70 * 16);
painter.drawArc(QRect(QPoint(point.pos.x() - r, point.pos.y() - r),
QSize(r * 2, r * 2)), (arc + 90 * 3) * 16, 70 * 16);
这样就初步的完成了雷达模拟器,不过看到网上有些大佬使用图片做背景,貌似效果更好。