已知目标船的两个不同时间位置点的真方位和距离,本船的航速和真航向,编写一程序,不输入本船位置和经纬度,不输入目标船位置和经纬度,计算两船间的DCPA和TCPA。要求:1、用c++编写2、上传程序源代码,代码中有解释。3、提供算法计算公式说明
时间: 2024-02-15 16:02:58 浏览: 198
main为主程序 通过两点的经纬度信息计算距离及相对方位角(正北角)
5星 · 资源好评率100%
以下是用C++编写的程序,用于计算两船间的DCPA和TCPA。程序中包含了详细注释,以便理解和使用。
```cpp
#include <iostream>
#include <cmath>
using namespace std;
// 计算两个点之间的距离
double distance(double x1, double y1, double x2, double y2) {
return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
}
// 计算两个点之间的方位角
double bearing(double x1, double y1, double x2, double y2) {
double dx = x2 - x1;
double dy = y2 - y1;
double angle = atan2(dy, dx) * 180 / M_PI;
return angle < 0 ? angle + 360 : angle;
}
// 计算两船间的DCPA和TCPA
void calcDCPATCPA(double b1, double s1, double b2_1, double r2_1, double b2_2, double r2_2, double& dcpa, double& tcpa) {
// 将方位角转换为弧度
double b1_rad = b1 * M_PI / 180;
double b2_1_rad = b2_1 * M_PI / 180;
double b2_2_rad = b2_2 * M_PI / 180;
// 计算两个目标点的坐标
double x2_1 = r2_1 * sin(b2_1_rad);
double y2_1 = r2_1 * cos(b2_1_rad);
double x2_2 = r2_2 * sin(b2_2_rad);
double y2_2 = r2_2 * cos(b2_2_rad);
// 计算两个时间点本船的位置坐标
double x1_1 = x2_1 + s1 * sin(b1_rad);
double y1_1 = y2_1 + s1 * cos(b1_rad);
double x1_2 = x2_2 + s1 * sin(b1_rad);
double y1_2 = y2_2 + s1 * cos(b1_rad);
// 计算两个时间点两船之间的距离和方位角
double dist_1 = distance(x1_1, y1_1, x2_1, y2_1);
double bearing_1 = bearing(x1_1, y1_1, x2_1, y2_1);
double dist_2 = distance(x1_2, y1_2, x2_2, y2_2);
double bearing_2 = bearing(x1_2, y1_2, x2_2, y2_2);
// 计算最短距离点的位置坐标
double x3 = (x2_1 + (dist_1 * sin(bearing_1 * M_PI / 180) + s1 * sin(b1_rad)) + x2_2 + (dist_2 * sin(bearing_2 * M_PI / 180) + s1 * sin(b1_rad))) / 2;
double y3 = (y2_1 + (dist_1 * cos(bearing_1 * M_PI / 180) + s1 * cos(b1_rad)) + y2_2 + (dist_2 * cos(bearing_2 * M_PI / 180) + s1 * cos(b1_rad))) / 2;
// 计算DCPA和TCPA
dcpa = distance(x1_1, y1_1, x3, y3);
tcpa = distance(x1_1, y1_1, x1_2, y1_2) / s1;
}
int main() {
double b1, s1, b2_1, r2_1, b2_2, r2_2;
double dcpa, tcpa;
// 读取输入数据,b1为本船的真方位角,s1为本船的航速,b2_1和r2_1为目标船第一个时间点的真方位角和距离,b2_2和r2_2为目标船第二个时间点的真方位角和距离
cout << "请输入本船的真方位角(度):";
cin >> b1;
cout << "请输入本船的航速(节):";
cin >> s1;
cout << "请输入目标船第一个时间点的真方位角(度)和距离(海里):";
cin >> b2_1 >> r2_1;
cout << "请输入目标船第二个时间点的真方位角(度)和距离(海里):";
cin >> b2_2 >> r2_2;
// 计算DCPA和TCPA
calcDCPATCPA(b1, s1, b2_1, r2_1, b2_2, r2_2, dcpa, tcpa);
// 输出结果
cout << "DCPA:" << dcpa << " 海里" << endl;
cout << "TCPA:" << tcpa << " 小时" << endl;
return 0;
}
```
该程序主要的算法计算公式如下:
1. 计算两个点之间的距离公式:
$$ distance(x_1, y_1, x_2, y_2) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} $$
2. 计算两个点之间的方位角公式:
$$ bearing(x_1, y_1, x_2, y_2) = atan2(y_2 - y_1, x_2 - x_1) * \frac{180}{\pi} $$
3. 计算两船间的DCPA和TCPA公式:
$$ DCPA = distance(x_{1,1}, y_{1,1}, x_3, y_3) $$
$$ TCPA = \frac{distance(x_{1,1}, y_{1,1}, x_{1,2}, y_{1,2})}{s_1} $$
其中,$ x_{1,1} $ 和 $ y_{1,1} $ 分别表示本船在第一个时间点的位置坐标,$ x_{1,2} $ 和 $ y_{1,2} $ 分别表示本船在第二个时间点的位置坐标,$ x_3 $ 和 $ y_3 $ 分别表示两个时间点两船之间的最短距离点的位置坐标,$ s_1 $ 表示本船的航速。
阅读全文