Java 已知两点经纬度以及方向角,不知道距离,判断过两点的直线是否相交,若相交求交点经纬度
时间: 2023-10-02 14:05:14 浏览: 36
判断直线是否相交可以使用向量叉积的方法,具体步骤如下:
1. 将两点经纬度转换为地球坐标系中的三维坐标点,可以使用以下公式进行转换:
```java
public static double[] convertTo3D(double lat, double lng) {
double x = Math.cos(Math.toRadians(lat)) * Math.cos(Math.toRadians(lng));
double y = Math.cos(Math.toRadians(lat)) * Math.sin(Math.toRadians(lng));
double z = Math.sin(Math.toRadians(lat));
return new double[] {x, y, z};
}
```
2. 计算两点的方向向量,可以使用以下公式:
```java
public static double[] calculateDirectionVector(double lat1, double lng1, double lat2, double lng2) {
double[] p1 = convertTo3D(lat1, lng1);
double[] p2 = convertTo3D(lat2, lng2);
double dx = p2[0] - p1[0];
double dy = p2[1] - p1[1];
double dz = p2[2] - p1[2];
double length = Math.sqrt(dx*dx + dy*dy + dz*dz);
return new double[] {dx/length, dy/length, dz/length};
}
```
3. 根据方向角计算直线的方向向量,可以使用以下公式:
```java
public static double[] calculateAngleVector(double lat, double lng, double angle) {
double[] p = convertTo3D(lat, lng);
double x = -Math.sin(Math.toRadians(angle)) * p[1] + Math.cos(Math.toRadians(angle)) * p[0];
double y = Math.sin(Math.toRadians(angle)) * p[0] + Math.cos(Math.toRadians(angle)) * p[1];
double z = p[2];
double length = Math.sqrt(x*x + y*y + z*z);
return new double[] {x/length, y/length, z/length};
}
```
4. 判断两条直线是否相交,可以计算它们的法向量的叉积,如果叉积为零,则说明两条直线平行或共线,不相交;否则,可以通过计算交点来求出交点的经纬度。
```java
public static double[] calculateCrossPoint(double lat1, double lng1, double angle1, double lat2, double lng2, double angle2) {
double[] v1 = calculateDirectionVector(lat1, lng1, lat2, lng2);
double[] v2 = calculateAngleVector(lat1, lng1, angle1);
double[] v3 = calculateAngleVector(lat2, lng2, angle2);
double[] n1 = new double[] {v1[1]*v2[2] - v1[2]*v2[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1] - v1[1]*v2[0]};
double[] n2 = new double[] {v1[1]*v3[2] - v1[2]*v3[1], v1[2]*v3[0] - v1[0]*v3[2], v1[0]*v3[1] - v1[1]*v3[0]};
double d = n1[0]*n2[0] + n1[1]*n2[1] + n1[2]*n2[2];
if (Math.abs(d) < 1e-6) {
return null;
}
double[] p1 = convertTo3D(lat1, lng1);
double[] p2 = convertTo3D(lat2, lng2);
double t = (n1[0]*(p2[0]-p1[0]) + n1[1]*(p2[1]-p1[1]) + n1[2]*(p2[2]-p1[2])) / d;
double x = p1[0] + t*n2[0];
double y = p1[1] + t*n2[1];
double z = p1[2] + t*n2[2];
double lat = Math.toDegrees(Math.asin(z));
double lng = Math.toDegrees(Math.atan2(y, x));
return new double[] {lat, lng};
}
```
以上代码中的 `lat1`, `lng1` 表示第一个点的纬度和经度,`angle1` 表示从第一个点出发的方向角,`lat2`, `lng2` 和 `angle2` 同理。如果两条直线不相交,则返回 `null`。
阅读全文