大地主题计算

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值