计算笛卡尔或极坐标系中两个位置之间的角度
Calculate angle(s) between 2 positions in cartesian or polar coordinate system
我正在尝试构建一个没有库的 ISS-Tracker...到目前为止一切顺利。但是我使用这个网站得到了 iss 的坐标:https://api.wheretheiss.at/v1/satellites/25544
从纬度和经度中现在需要计算两个角度:
对于舵机,角度一是地面以上 0-180° 的仰角。
角度二是步进电机相对于北极的旋转(0-360°)。
我已经有一些 Java 代码可以试用,但它不起作用。我得到了奇怪的结果。例如:国际空间站就在我的正上方(400公里;相同的经纬度),我得到的角度是:141.68°和135.28°
Ps:因此,这是一个使用图书馆的学校项目,不是一种选择...
public class Main {
public static void main(String[] args) {
//double issR = 6371 + 410.92521771305;
double issR = 6741;
double issLat = 58.190897;
double issLong = -30.585309;
//posR = height in km + earth radius
//posLat = position latitude in °(deg)
//posLong = position longitude in °(deg)
double posR = 6365.092;
double posLat = 58.190897;
double posLong = -30.585309;
//Convert to cartesian
double issX = issR * Math.sin(issLat) * Math.cos(issLong);
double issY = issR * Math.sin(issLat) * Math.sin(issLong);
double issZ = issR * Math.cos(issLat);
System.out.println("ISS\nx: " + issX);
System.out.println("y: " + issY);
System.out.println("z: " + issZ);
//Convert to cartesian
double posX = posR * Math.sin(posLat) * Math.cos(posLong);
double posY = posR * Math.sin(posLat) * Math.sin(posLong);
double posZ = posR * Math.cos(posLat);
System.out.println("\nPOS\nx: " + posX);
System.out.println("y: " + posY);
System.out.println("z: " + posZ);
//Calculate angle (I'm not sure which angle is which :D)
double angleYZ = Math.atan2(issY - posY, issZ - posZ)*180/Math.PI;
double angleYX = Math.atan2(issY - posY, issX - posX)*180/Math.PI;
//Another try to calculate the angle...
double angle = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issZ - posZ))+90d;
double angle2 = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issX - posX))+90d;
System.out.println();
System.out.println("Angle X: " + angleYZ);
System.out.println("Angle Z: " + angleYX);
System.out.println(angle);
System.out.println(angle2);
}
}
class Math {
final static double PI = java.lang.Math.PI;
public static double cos(double x) {
return java.lang.Math.cos(x * Math.PI/180.0);
}
public static double sin(double x) {
return java.lang.Math.sin(x * Math.PI/180.0);
}
public static double atan2(double x, double y) {
return java.lang.Math.atan2(x, y);
}
public static double toDegrees(double angrad) {
return java.lang.Math.toDegrees(angrad);
}
public static double pow(double a, double b) {
return java.lang.Math.pow(a, b);
}
public static double sqrt(double a) {
return java.lang.Math.sqrt(a);
}
}
根据 Ian Abbott 的建议,这对我有用:
double tilt = Math.toDegrees(Math.atan2(issR * Math.cos(issLat - posLat) - posR, issR * Math.sin(issLat - posLat)));
double pan = Math.toDegrees(Math.atan2(issR * Math.sin(issLong - posLong), issR * Math.cos(issLong - posLong) - posR));
我正在尝试构建一个没有库的 ISS-Tracker...到目前为止一切顺利。但是我使用这个网站得到了 iss 的坐标:https://api.wheretheiss.at/v1/satellites/25544
从纬度和经度中现在需要计算两个角度: 对于舵机,角度一是地面以上 0-180° 的仰角。 角度二是步进电机相对于北极的旋转(0-360°)。
我已经有一些 Java 代码可以试用,但它不起作用。我得到了奇怪的结果。例如:国际空间站就在我的正上方(400公里;相同的经纬度),我得到的角度是:141.68°和135.28°
Ps:因此,这是一个使用图书馆的学校项目,不是一种选择...
public class Main {
public static void main(String[] args) {
//double issR = 6371 + 410.92521771305;
double issR = 6741;
double issLat = 58.190897;
double issLong = -30.585309;
//posR = height in km + earth radius
//posLat = position latitude in °(deg)
//posLong = position longitude in °(deg)
double posR = 6365.092;
double posLat = 58.190897;
double posLong = -30.585309;
//Convert to cartesian
double issX = issR * Math.sin(issLat) * Math.cos(issLong);
double issY = issR * Math.sin(issLat) * Math.sin(issLong);
double issZ = issR * Math.cos(issLat);
System.out.println("ISS\nx: " + issX);
System.out.println("y: " + issY);
System.out.println("z: " + issZ);
//Convert to cartesian
double posX = posR * Math.sin(posLat) * Math.cos(posLong);
double posY = posR * Math.sin(posLat) * Math.sin(posLong);
double posZ = posR * Math.cos(posLat);
System.out.println("\nPOS\nx: " + posX);
System.out.println("y: " + posY);
System.out.println("z: " + posZ);
//Calculate angle (I'm not sure which angle is which :D)
double angleYZ = Math.atan2(issY - posY, issZ - posZ)*180/Math.PI;
double angleYX = Math.atan2(issY - posY, issX - posX)*180/Math.PI;
//Another try to calculate the angle...
double angle = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issZ - posZ))+90d;
double angle2 = Math.toDegrees(Math.atan2(Math.sqrt(Math.pow(issX - posX, 2) + Math.pow(issY - posY, 2)), issX - posX))+90d;
System.out.println();
System.out.println("Angle X: " + angleYZ);
System.out.println("Angle Z: " + angleYX);
System.out.println(angle);
System.out.println(angle2);
}
}
class Math {
final static double PI = java.lang.Math.PI;
public static double cos(double x) {
return java.lang.Math.cos(x * Math.PI/180.0);
}
public static double sin(double x) {
return java.lang.Math.sin(x * Math.PI/180.0);
}
public static double atan2(double x, double y) {
return java.lang.Math.atan2(x, y);
}
public static double toDegrees(double angrad) {
return java.lang.Math.toDegrees(angrad);
}
public static double pow(double a, double b) {
return java.lang.Math.pow(a, b);
}
public static double sqrt(double a) {
return java.lang.Math.sqrt(a);
}
}
根据 Ian Abbott 的建议,这对我有用:
double tilt = Math.toDegrees(Math.atan2(issR * Math.cos(issLat - posLat) - posR, issR * Math.sin(issLat - posLat)));
double pan = Math.toDegrees(Math.atan2(issR * Math.sin(issLong - posLong), issR * Math.cos(issLong - posLong) - posR));