Files
2018-10-23 23:49:00 +08:00

125 lines
3.7 KiB
C++

#include "radar.h"
#include <QtDebug>
Radar::Radar(QWidget *parent) : QWidget(parent)
{
setAutoFillBackground(true);
setPalette(QPalette(Qt::black));
lefttop = 50;
interval = 200;
scanAngle = 40;
soundSpeed = 340;
lastAngle = 0;
lastDistant = 0;
// test
currentAngle = 0;
isClock = false;
baseDiameter = 800;
setWindowTitle(tr("Radar"));
resize(baseDiameter+2*lefttop, baseDiameter/2+2*lefttop);
connect(&scanTimer,&QTimer::timeout, this, [this](){
// currentAngle++;
// this->update();
});
scanTimer.start(1);
}
void Radar::paintEvent(QPaintEvent *)
{
// radar background
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::darkGreen,1));
for(int i=0;i<5;++i){
painter.drawArc(lefttop+i*interval/2,lefttop+i*interval/2,baseDiameter-i*interval,baseDiameter-i*interval,0,180*16);
painter.drawText(lefttop + baseDiameter - i* interval/2, lefttop+ baseDiameter/2, QString::number(MAX_DIS - i*double(interval)/baseDiameter*MAX_DIS));
}
// scan area
QConicalGradient conicalGradient(lefttop+baseDiameter/2, lefttop+baseDiameter/2, currentAngle);
// conicalGradient.setStops(currentAngle+scanAngle);
conicalGradient.setAngle(currentAngle-scanAngle-1);
if(isClock){
conicalGradient.setAngle(currentAngle);
conicalGradient.setColorAt(0, QColor(0,230,0,120));
conicalGradient.setColorAt(scanAngle/360.0, QColor(0,0,0,120));
painter.setPen(QPen(QColor(0,0,0,0),1));
painter.setBrush(QBrush(conicalGradient));
painter.drawPie(lefttop,lefttop,baseDiameter,baseDiameter,(currentAngle)*16,scanAngle*16);
} else{
conicalGradient.setColorAt(0, QColor(0,0,0,120));
conicalGradient.setColorAt(scanAngle/360.0, QColor(0,230,0,120));
painter.setPen(QPen(QColor(0,0,0,0),1));
painter.setBrush(QBrush(conicalGradient));
painter.drawPie(lefttop,lefttop,baseDiameter,baseDiameter,(currentAngle-scanAngle)*16,scanAngle*16);
}
// painter.drawRect(250,250,20,20);
// draw target
painter.setPen(QPen(Qt::green));
painter.setBrush(QBrush(Qt::green));
for(int i = 0; i < 256; i++)
{
double angle = i;
double dis = distances[i];
// qDebug()<<dis;
double x = lefttop + baseDiameter / 2 + dis*qCos(qDegreesToRadians(angle));
double y = lefttop + baseDiameter / 2 - dis*qSin(qDegreesToRadians(angle));
// qDebug() << "draw point: " << x << " " << y;
painter.drawPoint(int(x), int(y));
painter.drawEllipse(int(x), int(y), 5, 5);
}
painter.setPen(QPen(Qt::black));
painter.setBrush(QBrush(Qt::black));
painter.drawPie(lefttop,lefttop,baseDiameter,baseDiameter,180*16,180*16);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::darkGreen,1));
painter.drawLine(lefttop, lefttop + baseDiameter/2,lefttop + baseDiameter,lefttop + baseDiameter/2);
painter.drawLine(lefttop + baseDiameter/2,lefttop, lefttop + baseDiameter/2,lefttop + baseDiameter/2);
}
double Radar::convertDis(int dis)
{
return dis*soundSpeed/20000.0;
}
void Radar::getPos(int ang, int dis)
{
mst=dis;
if(ang == 255){
memset(distances, 0,255*sizeof (int));
distances[90] = int(convertDis(dis)/MAX_DIS*baseDiameter/2);
}
else{
distances[ang] = int(convertDis(dis)/MAX_DIS*baseDiameter/2);
}
qDebug()<<convertDis(dis);
lastAngle = currentAngle;
currentAngle = ang;
isClock = currentAngle < lastAngle;
update();
}
void Radar::setSoundSpeed(double speed)
{
soundSpeed = speed*20000/mst;
}