c++qt窗口程序下的高斯平均引数大地主题解算
公式算法前往
https://blog.youkuaiyun.com/yitian_00/article/details/131115683
此项目基于VS2017IDE并配置Qt工具使用c++语言进行编程
项目头文件.h(包括主窗口,正算窗口,反算窗口类定义)
#pragma once
#include <QtWidgets/QWidget>
#include "ui_solution_of_geodetic_problem.h"
namespace Ui {
class Widget;
class Form;
class Form2;
}
//主窗口类
class solution_of_geodetic_problem : public QWidget
{
Q_OBJECT//信号,槽函数宏
public:
solution_of_geodetic_problem(QWidget *parent = nullptr);
~solution_of_geodetic_problem();
private:
Ui::solution_of_geodetic_problemClass ui;
};
class Form : public QWidget//正算窗口类
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
void compute();//定义计算函数
~Form();
private:
Ui::Form *ui_new;
};
class Form2 : public QWidget//反算窗口类
{
Q_OBJECT
public:
explicit Form2(QWidget *parent = nullptr);
void compute();//定义计算函数
~Form2();
private:
Ui::Form2 *ui_new1;
};
主函数main.cpp(调用主窗口)
#include "solution_of_geodetic_problem.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
solution_of_geodetic_problem w;
w.show();
return a.exec();
}
正算窗口与反算窗口代码实现均在这里solution_of_geodetic_problem.cpp
#include "solution_of_geodetic_problem.h"
#include "ui_solution_of_geodetic_problem.h"
#include "ui_Form.h"
#include "ui_Form2.h"
#include<qpushbutton.h>
#include<qmessagebox.h>
#include<qdebug.h>
#include<cmath>
#define PI acos(-1)
solution_of_geodetic_problem::solution_of_geodetic_problem(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//正算窗口信号-槽函数
connect(ui.pushButton, &QPushButton::clicked, this, [=]() {
static Form *f = new Form;
f->show();
});
//反算窗口信号-槽函数
connect(ui.pushButton_2, &QPushButton::clicked, this, [=]() {
static Form2 *n = new Form2;
n->show();
});
//退出功能
connect(ui.pushButton_3, &QPushButton::clicked, this, &QWidget::close);
}
solution_of_geodetic_problem::~solution_of_geodetic_problem()
{}
Form::Form(QWidget *parent) :// 正算窗口构造函数
QWidget(parent),
ui_new(new Ui::Form)
{
ui_new->setupUi(this);
//计算函数;lambda表达式调用compute函数
connect(ui_new->pushButton, &QPushButton::clicked, this, [=]() {
compute();
});
//清空功能
connect(ui_new->pushButton_2, &QPushButton::clicked, this, [=]() {
ui_new->lineEdit->clear();
ui_new->lineEdit_2->clear();
ui_new->lineEdit_3->clear();
ui_new->lineEdit_4->clear();
ui_new->lineEdit_5->clear();
ui_new->lineEdit_6->clear();
ui_new->lineEdit_7->clear();
ui_new->lineEdit_8->clear();
ui_new->lineEdit_9->clear();
ui_new->lineEdit_10->clear();
ui_new->lineEdit_11->clear();
ui_new->lineEdit_12->clear();
ui_new->lineEdit_13->clear();
ui_new->lineEdit_14->clear();
ui_new->lineEdit_15->clear();
ui_new->lineEdit_16->clear();
ui_new->lineEdit_17->clear();
ui_new->lineEdit_18->clear();
ui_new->lineEdit_19->clear();
});
//退出功能
connect(ui_new->pushButton_3, &QPushButton::clicked, this, &QWidget::close);
}
Form::~Form()
{
delete ui_new;
}
Form2::Form2(QWidget *parent) : // 反算窗口构造函数
QWidget(parent),
ui_new1(new Ui::Form2)
{
ui_new1->setupUi(this);
//计算函数;lambda表达式调用compute函数
connect(ui_new1->pushButton, &QPushButton::clicked, this, [=]() {
compute();
});
//清空功能
connect(ui_new1->pushButton_2, &QPushButton::clicked, this, [=]() {
ui_new1->lineEdit->clear();
ui_new1->lineEdit_2->clear();
ui_new1->lineEdit_3->clear();
ui_new1->lineEdit_4->clear();
ui_new1->lineEdit_5->clear();
ui_new1->lineEdit_6->clear();
ui_new1->lineEdit_7->clear();
ui_new1->lineEdit_8->clear();
ui_new1->lineEdit_9->clear();
ui_new1->lineEdit_10->clear();
ui_new1->lineEdit_11->clear();
ui_new1->lineEdit_12->clear();
ui_new1->lineEdit_13->clear();
ui_new1->lineEdit_14->clear();
ui_new1->lineEdit_15->clear();
ui_new1->lineEdit_16->clear();
ui_new1->lineEdit_17->clear();
ui_new1->lineEdit_18->clear();
ui_new1->lineEdit_19->clear();
});
//退出功能
connect(ui_new1->pushButton_3, &QPushButton::clicked, this, &QWidget::close);
}
Form2::~Form2()
{
delete ui_new1;
}
void Form::compute()//正算窗口计算函数
{
double a = 0, b = 0, e_2 = 0, e_dot_2 = 0, B2, L2, A21, rou = 206264.806247096355;
int pp = 0;
if (ui_new->radioButton->isChecked())
{
a = 6378245;//椭圆长半轴
b = 6356863.0187730473;//椭圆短半轴
e_2 = 0.006693421622966;//椭圆第一偏心率e^2
e_dot_2 = 0.006738525414683;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new->radioButton_2->isChecked())//
{
a = 6378140;//椭圆长半轴
b = 6356755.2881575287;//椭圆短半轴
e_2 = 0.006694384999588;//椭圆第一偏心率e^2
e_dot_2 = 0.006739501819473;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new->radioButton_3->isChecked())//
{
a = 6378137;//椭圆长半轴
b = 6356752.3142;//椭圆短半轴
e_2 = 0.00669437999013;//椭圆第一偏心率e^2
e_dot_2 = 0.00673949674227;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new->radioButton_4->isChecked())//
{
a = 6378137;//椭圆长半轴
b = 6356752.3141;//椭圆短半轴
e_2 = 0.00669438002290;//椭圆第一偏心率e^2
e_dot_2 = 0.00673949677548;//椭圆第二偏心率e'^2
pp = 1;
}
else if (pp == 0)
{
QMessageBox::critical(this, "warning", "Please select an ellipsoid");
}
double c = a * a / b;
if (ui_new->lineEdit->text().isEmpty() || ui_new->lineEdit_2->text().isEmpty() || ui_new->lineEdit_3->text().isEmpty() ||
ui_new->lineEdit_4->text().isEmpty() || ui_new->lineEdit_5->text().isEmpty() || ui_new->lineEdit_6->text().isEmpty() ||
ui_new->lineEdit_7->text().isEmpty() || ui_new->lineEdit_8->text().isEmpty() || ui_new->lineEdit_9->text().isEmpty() ||
ui_new->lineEdit_10->text().isEmpty())
{
QMessageBox::warning(this, "warning", "Please enter complete parameters");
}
else
{
//转化为弧度制
double B1 = (ui_new->lineEdit->text().toDouble() + ui_new->lineEdit_5->text().toDouble() / 60 + ui_new->lineEdit_6->text().toDouble() / 3600) / 180 * PI;
double L1 = (ui_new->lineEdit_2->text().toDouble() + ui_new->lineEdit_7->text().toDouble() / 60 + ui_new->lineEdit_9->text().toDouble() / 3600) / 180 * PI;
double A1 = (ui_new->lineEdit_3->text().toDouble() + ui_new->lineEdit_8->text().toDouble() / 60 + ui_new->lineEdit_10->text().toDouble() / 3600) / 180 * PI;
double S = ui_new->lineEdit_4->text().toDouble();
double W = sqrt(1 - e_2 * sin(B1) * sin(B1));
double V = sqrt(1 + e_dot_2 * cos(B1) * cos(B1));
double M1 = a * (1 - e_2) / (W * W * W);
double N1 = a / W;
double t1 = tan(B1);
//单位秒,循环迭代初始值
double delta_B = V * V / N1 * rou * S * cos(A1), delta_L = rou / N1 * S / cos(B1) * sin(A1), delta_A = rou / N1 * S * sin(A1) * t1;
double chB, chL, chA;
double Bm = B1 + delta_B / rou / 2, Am = A1 + delta_A / rou / 2;//单位为弧度制
double tm = tan(Bm), nm = e_dot_2 * cos(Bm) * cos(Bm);
double Wm = sqrt(1 - e_2 * sin(Bm) * sin(Bm));
double Vm = sqrt(1 + e_dot_2 * cos(Bm) * cos(Bm));
double Mm = a * (1 - e_2) / (Wm * Wm * Wm);
double Nm = a / Wm;
do//循环
{
chB = delta_B;
chL = delta_L;
chA = delta_A;
delta_B = Vm * Vm / Nm * rou * S * cos(Am) * (1 + S * S / 24 / Nm / Nm * (pow(sin(2 + 3 * tm * tm + 3 * pow(nm * tm, 2)), 2)) + 3 *
nm * nm * cos(Am) * (tm * tm - 1 - nm * nm - 4 * tm * tm * nm * nm));
delta_L = rou / Nm * S / cos(Bm) * sin(Am) * (1 + S * S / 24 / Nm / Nm * (sin(Am) * sin(Am) * tm * tm - cos(Am) * cos(Am) *
(1 + nm * nm - 9 * tm * tm * nm * nm + pow(nm, 4))));
delta_A = rou / Nm * S * sin(Am) * tm * (1 + S * S / 24 / Nm / Nm * (cos(Am) * cos(Am) * (2 + 7 * nm * nm + 9 * tm * tm * nm * nm + 5 * pow(nm, 4))
+ sin(Am) * sin(Am) * (2 + tm * tm + 2 * nm * nm)));
Bm = B1 + delta_B / rou / 2;
Am = A1 + delta_A / rou / 2;
Wm = sqrt(1 - e_2 * sin(Bm) * sin(Bm));
Vm = sqrt(1 + e_dot_2 * cos(Bm) *cos(Bm));
Mm = a * (1 - e_2) / (Wm * Wm * Wm);
Nm = a / Wm;
tm = tan(Bm);
nm = e_dot_2 * cos(Bm) * cos(Bm);
} while (abs(chB - delta_B) > 1e-4 || abs(chA - delta_A) > 1e-4 || abs(chL - delta_L) > 1e-4);
B2 = (B1 + delta_B / rou) * 180 / PI;
L2 = (L1 + delta_L / rou) * 180 / PI;
A21 = (A1 + delta_A / rou) * 180 / PI;
if (A1 > 180) A21 = A21 + 180;
else A21 = A21 - 180;
if (A21 < 0) A21 += 360;
//打印纬度
ui_new->lineEdit_11->setText(QString::number((int)(B2)));
ui_new->lineEdit_14->setText(QString::number((int)((B2 - (int)(B2)) * 60)));
ui_new->lineEdit_17->setText(QString::number(((B2 - (int)(B2)) * 60 - floor((B2 - (int)(B2)) * 60)) * 60));
//打印经度
ui_new->lineEdit_12->setText(QString::number((int)(L2)));
ui_new->lineEdit_15->setText(QString::number((int)((L2 - (int)(L2)) * 60)));
ui_new->lineEdit_18->setText(QString::number(((L2 - (int)(L2)) * 60 - (int)((L2 - (int)(L2)) * 60)) * 60));
//打印A21
ui_new->lineEdit_13->setText(QString::number((int)(A21)));
ui_new->lineEdit_16->setText(QString::number((int)((A21 - (int)(A21)) * 60)));
ui_new->lineEdit_19->setText(QString::number(((A21 - (int)(A21)) * 60 - (int)((A21 - (int)(A21)) * 60)) * 60));
}
}
void Form2::compute()
{
double a = 0, b = 0, e_2 = 0, e_dot_2 = 0, A1, S, A21, rou = 206264.806247096355;
int pp = 0;
if (ui_new1->radioButton->isChecked())
{
a = 6378245;//椭圆长半轴
b = 6356863.0187730473;//椭圆短半轴
e_2 = 0.006693421622966;//椭圆第一偏心率e^2
e_dot_2 = 0.006738525414683;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new1->radioButton_2->isChecked())//
{
a = 6378140;//椭圆长半轴
b = 6356755.2881575287;//椭圆短半轴
e_2 = 0.006694384999588;//椭圆第一偏心率e^2
e_dot_2 = 0.006739501819473;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new1->radioButton_3->isChecked())//
{
a = 6378137;//椭圆长半轴
b = 6356752.3142;//椭圆短半轴
e_2 = 0.00669437999013;//椭圆第一偏心率e^2
e_dot_2 = 0.00673949674227;//椭圆第二偏心率e'^2
pp = 1;
}
else if (ui_new1->radioButton_4->isChecked())//
{
a = 6378137;//椭圆长半轴
b = 6356752.3141;//椭圆短半轴
e_2 = 0.00669438002290;//椭圆第一偏心率e^2
e_dot_2 = 0.00673949677548;//椭圆第二偏心率e'^2
pp = 1;
}
else if (pp == 0)
{
QMessageBox::critical(this, "warning", "Please select an ellipsoid");
}
double c = a * a / b;
if (ui_new1->lineEdit->text().isEmpty() || ui_new1->lineEdit_2->text().isEmpty() || ui_new1->lineEdit_3->text().isEmpty() ||
ui_new1->lineEdit_4->text().isEmpty() || ui_new1->lineEdit_5->text().isEmpty() || ui_new1->lineEdit_6->text().isEmpty() ||
ui_new1->lineEdit_7->text().isEmpty() || ui_new1->lineEdit_8->text().isEmpty() || ui_new1->lineEdit_9->text().isEmpty() ||
ui_new1->lineEdit_10->text().isEmpty())
{
QMessageBox::warning(this, "warning", "Please enter complete parameters");
}
else
{
//转化为弧度制
double B1 = (ui_new1->lineEdit->text().toDouble() + ui_new1->lineEdit_2->text().toDouble() / 60 + ui_new1->lineEdit_3->text().toDouble() / 3600) / 180 * PI;
double L1 = (ui_new1->lineEdit_4->text().toDouble() + ui_new1->lineEdit_5->text().toDouble() / 60 + ui_new1->lineEdit_6->text().toDouble() / 3600) / 180 * PI;
double B2 = (ui_new1->lineEdit_7->text().toDouble() + ui_new1->lineEdit_8->text().toDouble() / 60 + ui_new1->lineEdit_9->text().toDouble() / 3600) / 180 * PI;
double L2 = (ui_new1->lineEdit_10->text().toDouble() + ui_new1->lineEdit_11->text().toDouble() / 60 + ui_new1->lineEdit_12->text().toDouble() / 3600) / 180 * PI;
double Bm = (B1 + B2) / 2, Lm = (L1 + L2) / 2;
double tm = tan(Bm), nm = e_dot_2 * cos(Bm) * cos(Bm);
double Wm = sqrt(1 - e_2 * sin(Bm) * sin(Bm));
double Vm = sqrt(1 + e_dot_2 * cos(Bm) * cos(Bm));
double Mm = a * (1 - e_2) / (Wm * Wm * Wm);
double Nm = a / Wm;
double r01 = Nm / rou * cos(Bm);
double r21 = Nm * cos(Bm) / 24 / pow(Vm, 4) / pow(rou, 3) * (1 + nm * nm - 9 *pow(nm * tm * nm * nm, 2));
double r03 = -Nm / 24 / pow(rou, 3) * pow(cos(Bm), 3) * tm * tm;
double S10 = Nm / rou / Vm / Vm;
double S12 = Nm * cos(Bm) * cos(Bm) / 24 / pow(Vm, 2) /pow(rou, 3) * (2 + 3 * tm * tm + 2 * nm * nm);
double S30 = Nm / 8 / pow(rou, 3) / pow(Vm, 6) * (nm * nm - tm * tm * nm * nm);
double delta_B = (B2 - B1) * rou, delta_L = (L2 - L1) * rou;
double SsinAm = r01 * delta_L + r21 * delta_B * delta_B * delta_L + r03 * pow(delta_L, 3);
double ScosAm = S10 * delta_B + S12 * delta_B * delta_L * delta_L + S30 * pow(delta_B, 3);
double t01 = tm * cos(Bm);
double t21 = cos(Bm) * tm * (2 + 7 * nm * nm + 9 * tm * tm * nm * nm + 5 * pow(nm, 4)) / 24 / rou / rou / pow(Vm, 4);
double t03 = pow(cos(Bm), 3) * tm * (2 + tm * tm + 2 * nm * nm) / 24 / rou / rou;
double delta_A = t01 * delta_L + t21 * delta_B * delta_B * delta_L + t03 *pow(delta_L, 3);//单位秒
double Am = atan(SsinAm / ScosAm);
if (Am < 0) Am = Am + 2 * PI;
A1 = Am - delta_A / 2 / rou;
A21 = Am + delta_A / 2 / rou;
if (A1 > PI) A21 = A21 - PI;
if (A1 <PI) A21 = A21 +PI;
S = ScosAm / cos(Am);
qDebug() << S;
//打印大地线
ui_new1->lineEdit_13->setText(QString::number(S,'f',3));
//打印A12
A1 = A1 * 180 / PI;
ui_new1->lineEdit_14->setText(QString::number((int)(A1)));
ui_new1->lineEdit_15->setText(QString::number((int)((A1 - (int)(A1)) * 60)));
ui_new1->lineEdit_16->setText(QString::number(((A1 - (int)(A1)) * 60 - (int)((A1 - (int)(A1)) * 60)) * 60));
// 打印A21
A21 = A21 * 180 / PI;
ui_new1->lineEdit_17->setText(QString::number((int)(A21)));
ui_new1->lineEdit_18->setText(QString::number((int)((A21 - (int)(A21)) * 60)));
ui_new1->lineEdit_19->setText(QString::number(((A21 - (int)(A21)) * 60 - (int)((A21 - (int)(A21)) * 60)) * 60));
}
}