日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园

發布時間:2024/8/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、設計思想

雷達掃描圖,在影視作品中見到較多,比如飛機雷達、艦艇雷達,有一個掃描線轉圈代表雷達一周旋轉或一個批次的收發,發現目標就在表盤上標記位置。和汽車儀表盤類似,汽車儀表盤有底盤背景圖、同圓、刻度、刻度值、旋轉的指針。能在汽車儀表盤的基礎上略作修改,比如指針換成帶有余輝的掃描扇面,就能完成一個雷達掃描圖。

代碼實現原理:

上圖的掃描線和余輝效果,可以使用QConicalGradient 函數來實現,qconicalgradient()提供的是一種扇形漸變效果,圓錐式漸變或稱角度漸變。用這個漸變色來填充drawPie函數就可以實現扇形選擇的余輝。

QConicalGradient::QConicalGradient(qreal?cx,?qreal?cy,?qreal?angle)

void QPainter::drawPie(const?QRectF?&rectangle, int?startAngle, int?spanAngle)

Qt大神劉典武文章中有典型的講解,《Qt編寫自定義控件62-探探雷達》中實現的掃描效果就是雷達的效果。詳情移步https://zhuanlan.zhihu.com/p/85512788。

2、代碼實現

繪制同心圓,x和y軸實線,45度對角線虛線。

void Radar::drawCircle(QPainter *painter)

{

painter->save();

QColor color = QColor(0, 100, 0);

QPen pen = QPen(color, 2);

painter->setPen(pen);

for(int i=0; i<4; i++)

{

int r = this->radius / 4 * (i+1);

painter->drawEllipse(-r, -r, r * 2, r * 2);

}

for(int i=0; i<=4; i++) // x,y 軸線是實線

{

int r = this->radius;

if((i%2) == 0) {

pen.setStyle(Qt::SolidLine);

}

else{

pen.setStyle(Qt::DashDotLine);

//pen.setDashPattern(QVector() << 10 << 2 ); //實線:空線的比例

}

painter->setPen(pen);

painter->drawLine(-r, 0, r, 0);

painter->rotate(90/2);

}

painter->restore();

}

繪制掃描圖,依靠錐形漸變顏色,通過透明度控制形成掃描效果,然后繪制餅圖。

void Radar::drawScan(QPainter *painter)

{

painter->save();

//錐形漸變顏色,通過透明度控制形成掃描效果

QConicalGradient conicalGradient(0, 0, this->angle);

QColor color = QColor(0,150,0);

color.setAlpha(100);

conicalGradient.setColorAt(0, color);

color.setAlpha(20);

conicalGradient.setColorAt(0.1, color);

color.setAlpha(0);

conicalGradient.setColorAt(1, color);

//繪制餅圓

QPen pen;

pen.setWidth(5);

pen.setBrush(conicalGradient);

painter->setPen(pen);

painter->setBrush(conicalGradient);

int r = this->radius;

QRect rect(-r, -r, r * 2, r * 2);

painter->drawPie(rect, this->angle * 16, 360 * 16); // 1/16th of a degree

painter->restore();

}

給雷達加上模擬的掃描目標,實現起來很簡單,就是打點。

void Radar::drawPoints(QPainter *painter)

{

painter->save();

QColor color = QColor(200, 10, 0);

QPen pen = QPen(color, 1);

painter->setPen(pen);

painter->setBrush(color);

for(int i=0; ipoints.count(); i++)

{

int r = 6;

QRect rect(points[i].x() - r/2, points[i].y() - r/2, r * 2, r * 2);

painter->drawEllipse(rect);// 畫實心小點

}

painter->restore();

}

最終效果如下。

外層怎么 調用?使用信號和槽驅動Radar類對象。

RadarScan::RadarScan(QWidget *parent)

: QMainWindow(parent)

, ui(new Ui::RadarScan)

{

ui->setupUi(this);

// start and stop

connect(this, &RadarScan::radar_state_changed,

ui->radar, &Radar::radar_start_control);

connect(ui->startButton, &QPushButton::clicked, [=](){

emit radar_state_changed(true);

});

connect(ui->stopButton, &QPushButton::clicked, [=](){

emit radar_state_changed(false);

});

// speed control

connect(this, &RadarScan::radar_speed_changed,

ui->radar, &Radar::radar_speed_control);

connect(ui->fastButton, &QPushButton::clicked, [=](){

emit radar_speed_changed(true);

});

connect(ui->slowButton, &QPushButton::clicked, [=](){

emit radar_speed_changed(false);

});

connect(ui->randomButton, &QPushButton::clicked, ui->radar, &Radar::radar_random_point);

}

3、效果演示

總結

以上是生活随笔為你收集整理的java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。