Java 已知两点经纬度以及方向角,不知道距离,判断过两点的直线是否相交,若相交求交点经纬度
时间: 2023-10-02 11:04:19 浏览: 169
通过两点经纬度,计算他们之间的距离 - JAVA
4星 · 用户满意度95%
可以通过以下步骤实现:
1. 根据已知的两点经纬度和方向角,计算出两条直线的参数方程。
假设已知点A经纬度为(lat1, lng1),点B经纬度为(lat2, lng2),方向角为α,β,则两条直线的参数方程为:
直线1:lat = lat1 + t * cos(α),lng = lng1 + t * sin(α)
直线2:lat = lat2 + s * cos(β),lng = lng2 + s * sin(β)
2. 判断两条直线是否相交。
两条直线相交的条件是:直线1和直线2的参数方程联立求解,得到t和s的值,且0<=t<=1,0<=s<=1。
如果两条直线相交,则可以继续下一步计算交点经纬度。
3. 计算交点经纬度。
根据两条直线的参数方程和相交点的t或s值,可以求得交点的经纬度:
交点经度 lng = lng1 + t * sin(α) = lng2 + s * sin(β)
交点纬度 lat = lat1 + t * cos(α) = lat2 + s * cos(β)
下面是 Java 代码实现:
```
public class Intersection {
public static void main(String[] args) {
double lat1 = 39.9087;
double lng1 = 116.3974;
double lat2 = 31.2304;
double lng2 = 121.4737;
double alpha = Math.PI / 6; // 方向角,假设为30度
double beta = Math.PI / 4; // 方向角,假设为45度
// 计算直线1和直线2的参数方程
double[] line1 = getLineEquation(lat1, lng1, alpha);
double[] line2 = getLineEquation(lat2, lng2, beta);
// 判断两条直线是否相交
double[] result = intersection(line1, line2);
if (result == null) {
System.out.println("两条直线不相交");
} else {
System.out.printf("交点的经纬度为:(%f, %f)", result[0], result[1]);
}
}
/**
* 根据经纬度和方向角计算直线的参数方程
* @param lat 纬度
* @param lng 经度
* @param alpha 方向角
* @return 直线的参数方程数组 [a, b, c],其中直线方程为 a * lat + b * lng = c
*/
public static double[] getLineEquation(double lat, double lng, double alpha) {
double a = Math.cos(alpha);
double b = Math.sin(alpha);
double c = a * lat + b * lng;
return new double[]{a, b, c};
}
/**
* 判断两条直线是否相交,并返回相交点的经纬度
* @param line1 直线1的参数方程数组
* @param line2 直线2的参数方程数组
* @return 交点的经纬度数组 [lat, lng],如果两条直线不相交则返回null
*/
public static double[] intersection(double[] line1, double[] line2) {
double a1 = line1[0];
double b1 = line1[1];
double c1 = line1[2];
double a2 = line2[0];
double b2 = line2[1];
double c2 = line2[2];
double d = a1 * b2 - a2 * b1;
if (d == 0) { // 两条直线平行
return null;
} else {
double lat = (b2 * c1 - b1 * c2) / d;
double lng = (a1 * c2 - a2 * c1) / d;
// 判断交点是否在两个点之间
if (isBetween(lat, lng, line1) && isBetween(lat, lng, line2)) {
return new double[]{lat, lng};
} else {
return null;
}
}
}
/**
* 判断点是否在直线的两个端点之间
* @param lat 点的纬度
* @param lng 点的经度
* @param line 直线的参数方程数组
* @return 如果点在直线的两个端点之间则返回true,否则返回false
*/
public static boolean isBetween(double lat, double lng, double[] line) {
double a = line[0];
double b = line[1];
double c = line[2];
double x = a * lat + b * lng;
return Math.abs(x - c) < 1e-6 && (a == 0 || (0 <= lat && lat <= 90 / a)) && (b == 0 || (0 <= lng && lng <= 90 / b));
}
}
```
阅读全文