qwt的极坐标画天线方向图
请先看这位博主的专业文章,上面有权威讲解
方向图 曲线方程:matlab,引用博主的公式
f=3e10;
lamda=(3e8)/f;
beta=2.*pi/lamda;
n=2;
t=0:0.01:2*pi;
d=lamda/4;
W=beta.*d.*cos(t);
z1=((n/2).*W)-n/2*beta*d;
z2=((1/2).*W)-1/2*beta*d;
F1=sin(z1)./(n.*sin(z2));
K1=abs(F1);
polar(t,K1);
开始绘画
qwt的极坐标:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_polar_curve.h>
#include <qwt_polar_grid.h>
#include <qwt_polar_marker.h>
#include <qwt_polar_canvas.h>
#include <qwt_polar_renderer.h>
#include "PolarData.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//整个if(1)在设置坐标
if(1)
{
// 设置标题
ui->qwtPolarPlot->setTitle(QStringLiteral("qwtPolarPlot"));
// 设置背景颜色
ui->qwtPolarPlot->setPlotBackground (QBrush( Qt::yellow, Qt::SolidPattern ));
// 设置网格效果属性
QwtPolarGrid *grid = new QwtPolarGrid();
grid->setFont(QFont("Microsoft YaHei UI Light", 16, QFont::Bold));
grid->setPen(QPen(Qt::blue, 1, Qt::SolidLine));
// 设置坐标数值样式
grid->setAxisPen(QwtPolar::AxisTop,QPen(Qt::red));
grid->setAxisPen(QwtPolar::AxisRight,QPen(Qt::black));
grid->attach(ui->qwtPolarPlot);
// 添加数值(不设置网格,看不到效果)
//圆环的角度范围,0-360度,间隔30度
ui->qwtPolarPlot->setScale(QwtPolar::ScaleAzimuth, 0, 360, 30); // 圆环数值范围
//圆环半径0-100,间隔5
ui->qwtPolarPlot->setScale(QwtPolar::ScaleRadius, 0, 100, 5); // 半径范围
//显示网格
grid->showGrid(QwtPolar::AxisRight,false);
//显示坐标轴
grid->showAxis(QwtPolar::AxisLeft,true);
grid->showAxis(QwtPolar::AxisTop,true);
grid->showAxis(QwtPolar::AxisBottom,false);
}
//整个if(2)在绘制第一条方向图
if(2)
{
// 画第一条方向图
QwtPolarCurve *polarCurve = new QwtPolarCurve();
// polarCurve->setPen(QPen(Qt::darkGray,5));
polarCurve->setPen(QPen(Qt::red,4));
//PolarData存放第一条曲线
//这个类PolarData,存放第二条方向图的数据
这里这里这里就是下面那个类
PolarData *data = new PolarData();
polarCurve->setData(data);
polarCurve->attach(ui->qwtPolarPlot);
}
//整个if(3)在绘制第二条方向图
if(3)
{
// 画第二条方向图
QwtPolarCurve *polarCurve1 = new QwtPolarCurve();
polarCurve1->setPen(QPen(Qt::darkGray,5));
polarCurve1->setPen(QPen(Qt::green,4));
//这个类PolarData1,存放第二条方向图的数据
这里这里这里就是下面那个类
PolarData1 *data1 = new PolarData1();
polarCurve1->setData(data1);
polarCurve1->attach(ui->qwtPolarPlot);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
要新建一个类存放数据:重写3个虚函数
每画一条曲线,就新建一个类
#ifndef POLARDATA_H
#define POLARDATA_H
#include <qwt_plot.h>
#include <qwt_polar_curve.h>
#include <qwt_polar_grid.h>
#include <qwt_polar_marker.h>
#include <qwt_polar_canvas.h>
#include <qwt_polar_renderer.h>
#include <QVector>
#include <QMap>
#include<cmath>
#include<QtMath>
#include <QDebug>
//第一条方向图
class PolarData:public QwtSeriesData<QwtPointPolar>
{
public:
//这里的size是角度最大360
virtual size_t size() const
{
return 360;
}
//这里很重要,在这里填充数据
virtual QwtPointPolar sample(size_t size) const
{
//下面是曲线
double data;
data = (size)/180.0 *M_PI;
float t=data;
double lamda=0.01;
double beta=200*M_PI;
int n=10; //天线阵元数目
double d=lamda/4; //0.01/4 //假设阵元间距为波长的四分之一
double W=beta*d*cos(t);
double z1=5*(W-0.5*M_PI);
double z2=0.5*(W-0.5*M_PI);
double F1=sin(z1)/(10*sin(z2));
F1=abs(F1); //函数对数组元素进行绝对值处理的函数
int K3=F1*100; //我去掉了小数点取整
//极坐标坐标点
return QwtPointPolar(size,K3);
}
virtual QRectF boundingRect() const
{
return QRectF(5.0,5.0,10,10);
}
};
//第二条方向图
class PolarData1:public QwtSeriesData<QwtPointPolar>
{
public:
virtual size_t size() const
{
return 540;
}
virtual QwtPointPolar sample(size_t size) const
{
double data;
data = (size-180)/180.0 *M_PI;
float t=data;
double lamda=0.01;
double beta=200*M_PI;
int n=16; //天线阵元数目
double d=lamda/4; //0.01/4 //假设阵元间距为波长的四分之一
double W=beta*d*cos(t);
double z1=5*(W-0.5*M_PI);
double z2=0.5*(W-0.5*M_PI);
double F1=sin(z1)/(10*sin(z2));
F1=abs(F1); //函数对数组元素进行绝对值处理的函数
int K3=F1*100; //我去掉了小数点取整
return QwtPointPolar(size,K3);
}
virtual QRectF boundingRect() const
{
return QRectF(5.0,5.0,10,10);
}
};
#endif // POLARDATA_H