雷达模拟器

目录

  • 总论
  • 背景设计
  • 扫描区域
  • 模拟检测点
  • 后续

总论

雷达模拟对于一些做军用仿真的同学有一些作用,通过雷达模拟器展示雷达的扫描功能和目标检测功能。当然,雷达模拟器还有更改高级的功能,比如探测频率,目标轨迹检测等,对于这些较为专业的功能,目前作者还达不到那个水平,只能做一些雷达模拟器简单扫描功能。下面直接看效果图。

背景设计

雷达模拟器的背景设计,主要是使用渐变色填充,通过使用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);

下图是使用渐变色填充效果
雷达模拟器_第1张图片
渐变色填充完了后,再给背景加一些同心圆,看下面代码和效果图

   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);
   }

雷达模拟器_第2张图片
加了同心圆后的背景效果就好很多了,然后再加一些刻度:

    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));
    }

雷达模拟器_第3张图片
这里的背景颜色也好,刻度颜色也好,读者们都可以根据自己的喜好更换颜色。

扫描区域

扫描区域有很多中方法制作,可以通过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);

雷达模拟器_第4张图片

模拟检测点

模拟检测点可以直接使用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);

雷达模拟器_第5张图片
这样就初步的完成了雷达模拟器,不过看到网上有些大佬使用图片做背景,貌似效果更好。
雷达模拟器_第6张图片

后续

有兴趣的同学可以加我的微信
雷达模拟器_第7张图片

你可能感兴趣的:(Qt)