@【基础测绘计算】(坐标正反算)

@【基础测绘计算】(坐标反算)

昨天用EXCEL算坐标方位角算了一个晚上,公式用的很复杂,结果还是一直有问题,想了想还是用代码吧,用的C++,供参考

坐标反算:已知两点坐标反算坐标方位角及两点之间距离
计算原理:
@【基础测绘计算】(坐标正反算)_第1张图片
计算公式:
@【基础测绘计算】(坐标正反算)_第2张图片
注意:此时的算得的α为象限角,需要再根据∆x,∆y的符号将象限角转化为方位角。转化原理:
@【基础测绘计算】(坐标正反算)_第3张图片

yb-ya,xb-xa计算得到过以A点坐标纵轴为主轴,顺时针转至直线AB的方位角αAB,若计算αBA,则应该用A点横纵坐标减去B点横纵坐标

代码:(为了方便使用了永真循环)

#include
#include
#define PI acos(-1)
using namespace std;
double fangweijiao(double x1, double y1, double x2, double y2)
{
	double a;
	if (x1 == x2)
	{
		if ((y2 - y1) > 0)
			a = 0;
		else if ((y2 - y1) < 0)
			a = PI;
	}
	else
	{
		a = atan((y2 - y1) / (x2 - x1));
		if ((x2 - x1) > 0)
		{
			if ((y2 - y1) < 0)    //第四象限
				a = a + 2 * PI;
		}
		else if ((x2 - x1) < 0)
		{
			if ((y2 - y1) > 0)      //二象限
				a = a + PI;
			else if ((y2 - y1) < 0)    //三象限
				a = a + PI;

		}
	}

	return a;
}
void radianTOangle(double a)    //弧度转角度
{
	int d, f;
	double m;    //度,分,秒
	double A = a * 180 / PI;
	d = int(A);
	f = int((A - d) * 60);
	m = round(((A - d) * 60 - f) * 60);
	cout << "方位角(角度值):" << d << " " << f << " " << m << endl;
}
void main()
{
	double x1, x2, y1, y2;
	double a, s;
	while (1)
	{
		cout << "请输入A点(Xa,Ya):  ";
		cin >> x1 >> y1; 
		cout << "请输入B点(Xb,Yb):  ";
		cin >> x2 >> y2; 
		a = fangweijiao(x1, y1, x2, y2);
		cout << "方位角(弧度制): " << a << endl;
		radianTOangle(a);
		s = sqrt(pow((x2 - x1),2) +pow((y2 - y1),2));
		cout << "距离: " << s << endl;
		cout << "-------------------------------------" << endl;
	}
	system("pause");
}

测试:
@【基础测绘计算】(坐标正反算)_第4张图片

你可能感兴趣的:(测绘,算法)