@【基础测绘计算】(坐标反算)
昨天用EXCEL算坐标方位角算了一个晚上,公式用的很复杂,结果还是一直有问题,想了想还是用代码吧,用的C++,供参考
坐标反算:已知两点坐标反算坐标方位角及两点之间距离
计算原理:
计算公式:
注意:此时的算得的α为象限角,需要再根据∆x,∆y的符号将象限角转化为方位角。转化原理:
yb-ya,xb-xa计算得到过以A点坐标纵轴为主轴,顺时针转至直线AB的方位角αAB,若计算αBA,则应该用A点横纵坐标减去B点横纵坐标
代码:(为了方便使用了永真循环)
#include<iostream>
#include<math.h>
#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");
}
测试: